@mdguggenbichler/slugbase-core 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/frontend/index.tsx +3 -3
- package/frontend/public/favicon.svg +1 -0
- package/frontend/public/slugbase_icon_blue.svg +1 -0
- package/frontend/public/slugbase_icon_white.png +0 -0
- package/frontend/public/slugbase_icon_white.svg +1 -0
- package/frontend/src/App.tsx +179 -0
- package/frontend/src/api/client.ts +134 -0
- package/frontend/src/components/AppSidebar.tsx +214 -0
- package/frontend/src/components/EmptyState.tsx +33 -0
- package/frontend/src/components/Favicon.tsx +76 -0
- package/frontend/src/components/FilterChips.tsx +60 -0
- package/frontend/src/components/FolderIcon.tsx +207 -0
- package/frontend/src/components/GlobalSearch.tsx +275 -0
- package/frontend/src/components/Layout.tsx +60 -0
- package/frontend/src/components/PageHeader.tsx +31 -0
- package/frontend/src/components/ScopeSegmentedControl.tsx +42 -0
- package/frontend/src/components/SentryDebug.tsx +32 -0
- package/frontend/src/components/StatCard.tsx +66 -0
- package/frontend/src/components/TopBar.tsx +63 -0
- package/frontend/src/components/UserDropdown.tsx +86 -0
- package/frontend/src/components/admin/AdminAI.tsx +207 -0
- package/frontend/src/components/admin/AdminOIDCProviders.tsx +183 -0
- package/frontend/src/components/admin/AdminSettings.tsx +413 -0
- package/frontend/src/components/admin/AdminTeams.tsx +177 -0
- package/frontend/src/components/admin/AdminUsers.tsx +225 -0
- package/frontend/src/components/bookmarks/BookmarkCard.tsx +312 -0
- package/frontend/src/components/bookmarks/BookmarkListItem.tsx +159 -0
- package/frontend/src/components/bookmarks/BookmarkTableView.tsx +419 -0
- package/frontend/src/components/bookmarks/BulkActionModals.tsx +162 -0
- package/frontend/src/components/bookmarks/FilterChips.tsx +5 -0
- package/frontend/src/components/modals/BookmarkModal.tsx +493 -0
- package/frontend/src/components/modals/FolderModal.tsx +306 -0
- package/frontend/src/components/modals/ImportModal.tsx +232 -0
- package/frontend/src/components/modals/OIDCProviderModal.tsx +284 -0
- package/frontend/src/components/modals/SharingModal.tsx +96 -0
- package/frontend/src/components/modals/TagModal.tsx +101 -0
- package/frontend/src/components/modals/TeamAssignmentModal.tsx +354 -0
- package/frontend/src/components/modals/TeamModal.tsx +117 -0
- package/frontend/src/components/modals/UserModal.tsx +225 -0
- package/frontend/src/components/profile/CreateTokenModal.tsx +172 -0
- package/frontend/src/components/sharing/ShareResourceDialog.tsx +422 -0
- package/frontend/src/components/ui/Autocomplete.tsx +155 -0
- package/frontend/src/components/ui/Button.tsx +68 -0
- package/frontend/src/components/ui/ConfirmDialog.tsx +79 -0
- package/frontend/src/components/ui/FormFieldWrapper.tsx +36 -0
- package/frontend/src/components/ui/ModalFooterActions.tsx +49 -0
- package/frontend/src/components/ui/ModalSection.tsx +34 -0
- package/frontend/src/components/ui/PageLoadingSkeleton.tsx +24 -0
- package/frontend/src/components/ui/Select.tsx +61 -0
- package/frontend/src/components/ui/SharingField.tsx +298 -0
- package/frontend/src/components/ui/Toast.tsx +47 -0
- package/frontend/src/components/ui/Tooltip.tsx +21 -0
- package/frontend/src/components/ui/alert-dialog.tsx +139 -0
- package/frontend/src/components/ui/badge.tsx +36 -0
- package/frontend/src/components/ui/button-base.tsx +57 -0
- package/frontend/src/components/ui/card.tsx +76 -0
- package/frontend/src/components/ui/command.tsx +161 -0
- package/frontend/src/components/ui/dialog.tsx +120 -0
- package/frontend/src/components/ui/dropdown-menu.tsx +199 -0
- package/frontend/src/components/ui/input.tsx +22 -0
- package/frontend/src/components/ui/label.tsx +24 -0
- package/frontend/src/components/ui/popover.tsx +33 -0
- package/frontend/src/components/ui/progress.tsx +26 -0
- package/frontend/src/components/ui/scroll-area.tsx +48 -0
- package/frontend/src/components/ui/select-base.tsx +159 -0
- package/frontend/src/components/ui/separator.tsx +29 -0
- package/frontend/src/components/ui/sheet.tsx +140 -0
- package/frontend/src/components/ui/sidebar.tsx +783 -0
- package/frontend/src/components/ui/skeleton.tsx +15 -0
- package/frontend/src/components/ui/sonner.tsx +46 -0
- package/frontend/src/components/ui/switch.tsx +28 -0
- package/frontend/src/components/ui/table.tsx +120 -0
- package/frontend/src/components/ui/tooltip-base.tsx +30 -0
- package/frontend/src/config/api.ts +16 -0
- package/frontend/src/config/mode.ts +6 -0
- package/frontend/src/contexts/AppConfigContext.tsx +39 -0
- package/frontend/src/contexts/AuthContext.tsx +137 -0
- package/frontend/src/contexts/SearchCommandContext.tsx +28 -0
- package/frontend/src/hooks/use-mobile.tsx +19 -0
- package/frontend/src/hooks/useConfirmDialog.ts +63 -0
- package/frontend/src/hooks/useMarketingTheme.ts +47 -0
- package/frontend/src/i18n.ts +39 -0
- package/frontend/src/index.css +117 -0
- package/frontend/src/instrument.ts +20 -0
- package/frontend/src/lib/utils.ts +6 -0
- package/frontend/src/locales/de.json +899 -0
- package/frontend/src/locales/en.json +937 -0
- package/frontend/src/locales/es.json +884 -0
- package/frontend/src/locales/fr.json +550 -0
- package/frontend/src/locales/it.json +535 -0
- package/frontend/src/locales/ja.json +535 -0
- package/frontend/src/locales/nl.json +550 -0
- package/frontend/src/locales/pl.json +535 -0
- package/frontend/src/locales/pt.json +535 -0
- package/frontend/src/locales/ru.json +535 -0
- package/frontend/src/locales/zh.json +535 -0
- package/frontend/src/main.tsx +44 -0
- package/frontend/src/pages/Bookmarks.tsx +1004 -0
- package/frontend/src/pages/Dashboard.tsx +427 -0
- package/frontend/src/pages/Folders.tsx +578 -0
- package/frontend/src/pages/GoPreferences.tsx +134 -0
- package/frontend/src/pages/Login.tsx +196 -0
- package/frontend/src/pages/PasswordReset.tsx +242 -0
- package/frontend/src/pages/Profile.tsx +593 -0
- package/frontend/src/pages/SearchEngineGuide.tsx +135 -0
- package/frontend/src/pages/Setup.tsx +210 -0
- package/frontend/src/pages/Signup.tsx +199 -0
- package/frontend/src/pages/Tags.tsx +421 -0
- package/frontend/src/pages/VerifyEmail.tsx +254 -0
- package/frontend/src/pages/admin/AdminAIPage.tsx +5 -0
- package/frontend/src/pages/admin/AdminLayout.tsx +40 -0
- package/frontend/src/pages/admin/AdminMembersPage.tsx +5 -0
- package/frontend/src/pages/admin/AdminOIDCPage.tsx +5 -0
- package/frontend/src/pages/admin/AdminSettingsPage.tsx +5 -0
- package/frontend/src/pages/admin/AdminTeamsPage.tsx +5 -0
- package/frontend/src/utils/favicon.ts +36 -0
- package/frontend/src/utils/formatRelativeTime.ts +37 -0
- package/frontend/src/utils/safeHref.ts +31 -0
- package/frontend/src/vite-env.d.ts +10 -0
- package/package.json +9 -1
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
{
|
|
2
|
+
"app": {
|
|
3
|
+
"name": "SlugBase",
|
|
4
|
+
"tagline": "您的链接。您的结构。您的语言。您的规则。"
|
|
5
|
+
},
|
|
6
|
+
"auth": {
|
|
7
|
+
"login": "登录",
|
|
8
|
+
"logout": "退出",
|
|
9
|
+
"loginWith": "使用{{provider}}登录",
|
|
10
|
+
"notAuthenticated": "未认证",
|
|
11
|
+
"authFailed": "认证失败",
|
|
12
|
+
"loginFailed": "登录失败",
|
|
13
|
+
"oidcAuthFailed": "OIDC认证失败。请重试。",
|
|
14
|
+
"oidcAutoCreateDisabled": "此OIDC提供商的用户自动创建已禁用。请联系管理员。",
|
|
15
|
+
"noProviders": "未配置OIDC提供商",
|
|
16
|
+
"noProvidersDescription": "请在管理设置中配置OIDC提供商以启用OIDC登录。",
|
|
17
|
+
"email": "电子邮件",
|
|
18
|
+
"emailPlaceholder": "your@email.com",
|
|
19
|
+
"password": "密码",
|
|
20
|
+
"passwordPlaceholder": "请输入密码",
|
|
21
|
+
"forgotPassword": "忘记密码?",
|
|
22
|
+
"or": "或继续使用"
|
|
23
|
+
},
|
|
24
|
+
"setup": {
|
|
25
|
+
"title": "初始设置",
|
|
26
|
+
"description": "欢迎使用SlugBase!创建您的第一个管理员用户以开始。",
|
|
27
|
+
"email": "电子邮件",
|
|
28
|
+
"emailPlaceholder": "admin@example.com",
|
|
29
|
+
"name": "姓名",
|
|
30
|
+
"namePlaceholder": "管理员用户",
|
|
31
|
+
"password": "密码",
|
|
32
|
+
"passwordPlaceholder": "至少8个字符",
|
|
33
|
+
"confirmPassword": "确认密码",
|
|
34
|
+
"confirmPasswordPlaceholder": "请再次输入密码",
|
|
35
|
+
"passwordMismatch": "密码不匹配",
|
|
36
|
+
"passwordTooShort": "密码必须至少8个字符",
|
|
37
|
+
"adminNote": "此用户将被创建为管理员。您稍后可以在管理设置中配置OIDC提供商。",
|
|
38
|
+
"submit": "创建管理员用户",
|
|
39
|
+
"alreadyInitialized": "系统已初始化",
|
|
40
|
+
"success": "设置成功完成!",
|
|
41
|
+
"redirecting": "正在重定向到登录页面...",
|
|
42
|
+
"redirectingToDashboard": "正在重定向到仪表板..."
|
|
43
|
+
},
|
|
44
|
+
"bookmarks": {
|
|
45
|
+
"title": "书签",
|
|
46
|
+
"create": "创建书签",
|
|
47
|
+
"edit": "编辑书签",
|
|
48
|
+
"delete": "删除书签",
|
|
49
|
+
"deleteBookmark": "删除书签",
|
|
50
|
+
"sharingSummary": "{{teamCount}} {{teams}},{{userCount}} {{users}}",
|
|
51
|
+
"name": "标题",
|
|
52
|
+
"url": "URL",
|
|
53
|
+
"slug": "别名",
|
|
54
|
+
"slugOptionalHint": "如果不需要自定义别名,请留空",
|
|
55
|
+
"forwardingEnabled": "启用转发",
|
|
56
|
+
"forwardingUrl": "转发URL",
|
|
57
|
+
"copyUrl": "复制URL",
|
|
58
|
+
"copied": "已复制!",
|
|
59
|
+
"folder": "文件夹",
|
|
60
|
+
"folders": "文件夹",
|
|
61
|
+
"tags": "标签",
|
|
62
|
+
"noFolder": "无文件夹",
|
|
63
|
+
"noFoldersAvailable": "没有可用的文件夹。创建文件夹以组织您的书签。",
|
|
64
|
+
"foldersDescription": "选择一个或多个文件夹来组织此书签",
|
|
65
|
+
"noTags": "无标签",
|
|
66
|
+
"save": "保存",
|
|
67
|
+
"cancel": "取消",
|
|
68
|
+
"deleteConfirm": "您确定要删除此书签吗?",
|
|
69
|
+
"deleteConfirmWithName": "您确定要删除\"{{name}}\"吗?",
|
|
70
|
+
"empty": "还没有书签。创建您的第一个书签!",
|
|
71
|
+
"emptyDescription": "通过创建您的第一个书签或导入现有书签开始。",
|
|
72
|
+
"emptyCreateFirst": "创建您的第一个书签",
|
|
73
|
+
"emptyImport": "导入书签",
|
|
74
|
+
"emptyLearnForwarding": "了解转发的工作原理",
|
|
75
|
+
"filterByFolder": "按文件夹筛选",
|
|
76
|
+
"filterByTag": "按标签筛选",
|
|
77
|
+
"allFolders": "所有文件夹",
|
|
78
|
+
"allTags": "所有标签",
|
|
79
|
+
"open": "打开",
|
|
80
|
+
"shareWithTeams": "与团队共享",
|
|
81
|
+
"shareWithTeamsDescription": "选择要共享此书签的团队。所选团队的所有成员都可以查看此书签。",
|
|
82
|
+
"shareAllTeams": "与我所有的团队共享",
|
|
83
|
+
"shareAllTeamsDescription": "与您所属的所有团队共享",
|
|
84
|
+
"shareWithUsers": "与用户共享",
|
|
85
|
+
"shareWithUsersDescription": "选择要共享的特定用户",
|
|
86
|
+
"sharedWith": "共享给:",
|
|
87
|
+
"users": "用户",
|
|
88
|
+
"shared": "已共享",
|
|
89
|
+
"sharedWithTeam": "与团队共享",
|
|
90
|
+
"sharedWithTeams": "已共享 · {{count}} {{teams}}",
|
|
91
|
+
"teams": "团队",
|
|
92
|
+
"optional": "可选",
|
|
93
|
+
"slugRequired": "启用转发时别名是必需的",
|
|
94
|
+
"slugAlreadyExists": "别名已存在。别名在所有书签中必须是唯一的。",
|
|
95
|
+
"searchEngineNote": "想从浏览器地址栏快速访问您的书签吗?",
|
|
96
|
+
"searchEngineGuideLink": "了解如何设置自定义搜索引擎",
|
|
97
|
+
"viewMode": "查看模式",
|
|
98
|
+
"viewCard": "卡片视图",
|
|
99
|
+
"viewList": "列表视图",
|
|
100
|
+
"compactMode": "紧凑模式",
|
|
101
|
+
"sortBy": "排序方式",
|
|
102
|
+
"sortRecentlyAdded": "最近添加",
|
|
103
|
+
"sortAlphabetical": "按字母顺序",
|
|
104
|
+
"sortMostUsed": "最常用",
|
|
105
|
+
"sortRecentlyAccessed": "最近访问",
|
|
106
|
+
"resetFilters": "重置筛选",
|
|
107
|
+
"forwardingPreview": "转发URL",
|
|
108
|
+
"forwardingPreviewDescription": "这是将转发到您的书签的URL",
|
|
109
|
+
"bulkSelect": "选择多个",
|
|
110
|
+
"bulkActions": "批量操作",
|
|
111
|
+
"bulkMoveToFolder": "移动到文件夹",
|
|
112
|
+
"bulkAddTags": "添加标签",
|
|
113
|
+
"bulkShare": "与团队共享",
|
|
114
|
+
"bulkDelete": "删除所选",
|
|
115
|
+
"selectedCount": "已选择{{count}}个",
|
|
116
|
+
"selectAll": "全选",
|
|
117
|
+
"deselectAll": "取消全选",
|
|
118
|
+
"paginationShowing": "显示 {{from}}-{{to}},共 {{total}} 条",
|
|
119
|
+
"paginationPrevious": "上一页",
|
|
120
|
+
"paginationNext": "下一页",
|
|
121
|
+
"pinned": "已固定",
|
|
122
|
+
"favorites": "收藏",
|
|
123
|
+
"import": "导入",
|
|
124
|
+
"export": "导出",
|
|
125
|
+
"importBrowser": "导入浏览器书签",
|
|
126
|
+
"importJson": "导入JSON",
|
|
127
|
+
"importHtml": "导入HTML",
|
|
128
|
+
"exportJson": "导出为JSON",
|
|
129
|
+
"exportHtml": "导出为HTML",
|
|
130
|
+
"importDescription": "从JSON或HTML文件导入书签。JSON文件应包含具有title和url字段的书签对象数组。",
|
|
131
|
+
"selectFile": "选择文件",
|
|
132
|
+
"supportedFormats": "支持的格式:JSON、HTML(Netscape书签格式)",
|
|
133
|
+
"importSuccess": "已导入{{success}}个书签,{{failed}}个失败"
|
|
134
|
+
},
|
|
135
|
+
"folders": {
|
|
136
|
+
"title": "文件夹",
|
|
137
|
+
"create": "创建文件夹",
|
|
138
|
+
"edit": "编辑文件夹",
|
|
139
|
+
"delete": "删除文件夹",
|
|
140
|
+
"deleteFolder": "删除文件夹",
|
|
141
|
+
"name": "文件夹名称",
|
|
142
|
+
"icon": "图标",
|
|
143
|
+
"searchIcons": "按名称搜索图标...",
|
|
144
|
+
"noIcon": "无图标",
|
|
145
|
+
"selectedIcon": "已选图标",
|
|
146
|
+
"clearIcon": "清除图标",
|
|
147
|
+
"showingPopular": "显示{{count}}个热门图标",
|
|
148
|
+
"showingAllIcons": "显示所有{{count}}个图标",
|
|
149
|
+
"showAllIcons": "显示所有图标",
|
|
150
|
+
"showPopularOnly": "仅显示热门",
|
|
151
|
+
"noIconsFound": "未找到匹配您搜索的图标",
|
|
152
|
+
"useIcon": "使用图标",
|
|
153
|
+
"typeIconName": "输入图标名称以使用任何Lucide图标",
|
|
154
|
+
"empty": "还没有文件夹",
|
|
155
|
+
"deleteConfirm": "您确定要删除此文件夹吗?",
|
|
156
|
+
"deleteConfirmWithName": "您确定要删除\"{{name}}\"吗?",
|
|
157
|
+
"sharedWith": "共享给:",
|
|
158
|
+
"shareWithTeams": "与团队共享",
|
|
159
|
+
"shareWithTeamsDescription": "选择要共享此文件夹的团队。此文件夹中的所有书签将与所选团队共享。",
|
|
160
|
+
"shared": "已共享"
|
|
161
|
+
},
|
|
162
|
+
"tags": {
|
|
163
|
+
"title": "标签",
|
|
164
|
+
"create": "创建标签",
|
|
165
|
+
"edit": "编辑标签",
|
|
166
|
+
"delete": "删除标签",
|
|
167
|
+
"deleteTag": "删除标签",
|
|
168
|
+
"name": "标签名称",
|
|
169
|
+
"empty": "还没有标签",
|
|
170
|
+
"deleteConfirm": "您确定要删除此标签吗?",
|
|
171
|
+
"deleteConfirmWithName": "您确定要删除\"{{name}}\"吗?"
|
|
172
|
+
},
|
|
173
|
+
"profile": {
|
|
174
|
+
"title": "个人资料",
|
|
175
|
+
"description": "管理您的账户设置和偏好",
|
|
176
|
+
"accountInformation": "账户信息",
|
|
177
|
+
"preferences": "偏好设置",
|
|
178
|
+
"userKey": "用户密钥",
|
|
179
|
+
"userKeyDescription": "用于书签转发的唯一标识符。与他人共享此密钥,以允许他们访问您共享的书签。",
|
|
180
|
+
"email": "电子邮件",
|
|
181
|
+
"emailPlaceholder": "your@email.com",
|
|
182
|
+
"name": "姓名",
|
|
183
|
+
"namePlaceholder": "您的姓名",
|
|
184
|
+
"language": "语言",
|
|
185
|
+
"theme": "主题",
|
|
186
|
+
"themeAuto": "自动",
|
|
187
|
+
"themeLight": "浅色",
|
|
188
|
+
"themeDark": "深色",
|
|
189
|
+
"save": "保存设置",
|
|
190
|
+
"languageEnglish": "英语",
|
|
191
|
+
"languageGerman": "德语",
|
|
192
|
+
"languageFrench": "法语",
|
|
193
|
+
"languageSpanish": "西班牙语",
|
|
194
|
+
"languageItalian": "意大利语",
|
|
195
|
+
"languagePortuguese": "葡萄牙语",
|
|
196
|
+
"languageDutch": "荷兰语",
|
|
197
|
+
"languageRussian": "俄语",
|
|
198
|
+
"languageJapanese": "日语",
|
|
199
|
+
"languageChinese": "中文",
|
|
200
|
+
"languagePolish": "波兰语",
|
|
201
|
+
"emailManagedByOIDC": "电子邮件由您的身份提供商管理,无法在此处更改。",
|
|
202
|
+
"apiAccess": "API 访问",
|
|
203
|
+
"apiAccessDescription": "创建和管理用于 REST API 身份验证的个人 API 令牌。",
|
|
204
|
+
"apiTokenWarning": "API 令牌授予您账户的完全访问权限。请妥善保管,切勿分享。",
|
|
205
|
+
"createToken": "创建令牌",
|
|
206
|
+
"tokenName": "令牌名称",
|
|
207
|
+
"tokenNamePlaceholder": "例如:CLI、CI/CD",
|
|
208
|
+
"tokenCreated": "令牌已创建",
|
|
209
|
+
"tokenRevealWarning": "此令牌将不再显示。请立即复制。",
|
|
210
|
+
"copyToken": "复制令牌",
|
|
211
|
+
"revokeToken": "撤销",
|
|
212
|
+
"revokeTokenConfirm": "确定要撤销此令牌吗?它将立即失效。",
|
|
213
|
+
"lastUsed": "最后使用",
|
|
214
|
+
"neverUsed": "从未使用",
|
|
215
|
+
"createdAt": "创建时间",
|
|
216
|
+
"viewApiDocs": "查看 API 文档",
|
|
217
|
+
"noTokens": "暂无 API 令牌",
|
|
218
|
+
"noTokensDescription": "创建令牌以通过脚本、CLI 或 CI/CD 进行 REST API 身份验证。",
|
|
219
|
+
"yourTokens": "您的令牌"
|
|
220
|
+
},
|
|
221
|
+
"common": {
|
|
222
|
+
"loading": "加载中...",
|
|
223
|
+
"error": "发生错误",
|
|
224
|
+
"success": "成功",
|
|
225
|
+
"close": "关闭",
|
|
226
|
+
"delete": "删除",
|
|
227
|
+
"edit": "编辑",
|
|
228
|
+
"create": "创建",
|
|
229
|
+
"save": "保存",
|
|
230
|
+
"cancel": "取消",
|
|
231
|
+
"clearFilter": "清除筛选",
|
|
232
|
+
"yes": "是",
|
|
233
|
+
"no": "否",
|
|
234
|
+
"view": "查看",
|
|
235
|
+
"confirm": "确认",
|
|
236
|
+
"back": "返回",
|
|
237
|
+
"bookmark": "书签",
|
|
238
|
+
"bookmarks": "书签",
|
|
239
|
+
"tag": "标签",
|
|
240
|
+
"tags": "标签",
|
|
241
|
+
"folder": "文件夹",
|
|
242
|
+
"folders": "文件夹",
|
|
243
|
+
"user": "用户",
|
|
244
|
+
"users": "用户",
|
|
245
|
+
"team": "团队",
|
|
246
|
+
"teams": "团队",
|
|
247
|
+
"setting": "设置",
|
|
248
|
+
"settings": "设置",
|
|
249
|
+
"provider": "提供商",
|
|
250
|
+
"providers": "提供商",
|
|
251
|
+
"search": "搜索",
|
|
252
|
+
"searchPlaceholder": "搜索书签、文件夹、标签...",
|
|
253
|
+
"searchShortcut": "Ctrl+K",
|
|
254
|
+
"searchShortcutHint": "搜索 (Ctrl+K)",
|
|
255
|
+
"noResults": "未找到结果",
|
|
256
|
+
"copy": "复制",
|
|
257
|
+
"copied": "已复制!",
|
|
258
|
+
"goTo": "转到",
|
|
259
|
+
"actions": "操作",
|
|
260
|
+
"navigation": "导航",
|
|
261
|
+
"quickActions": "快速操作",
|
|
262
|
+
"collapseSidebar": "收起侧边栏",
|
|
263
|
+
"expandSidebar": "展开侧边栏"
|
|
264
|
+
},
|
|
265
|
+
"dashboard": {
|
|
266
|
+
"bookmarksDescription": "管理您的书签",
|
|
267
|
+
"foldersDescription": "使用文件夹组织",
|
|
268
|
+
"tagsDescription": "为书签添加标签",
|
|
269
|
+
"overview": "概览",
|
|
270
|
+
"totalBookmarks": "书签总数",
|
|
271
|
+
"totalFolders": "文件夹总数",
|
|
272
|
+
"totalTags": "标签总数",
|
|
273
|
+
"sharedBookmarks": "共享书签",
|
|
274
|
+
"sharedFolders": "共享文件夹",
|
|
275
|
+
"recentBookmarks": "最近的书签",
|
|
276
|
+
"topTags": "最常用的标签",
|
|
277
|
+
"noRecentBookmarks": "还没有书签",
|
|
278
|
+
"noTags": "还没有标签",
|
|
279
|
+
"searchPlaceholder": "搜索书签或在 SlugBase 中导航",
|
|
280
|
+
"quickAccess": "快速访问",
|
|
281
|
+
"viewAll": "查看全部",
|
|
282
|
+
"noQuickAccessBookmarks": "暂无带快捷方式的书签",
|
|
283
|
+
"noQuickAccessBookmarksHint": "为书签添加 slug 即可在此显示,并在浏览器中使用 go/slug。",
|
|
284
|
+
"statsBookmarks": "个书签",
|
|
285
|
+
"statsFolders": "个文件夹",
|
|
286
|
+
"statsTags": "个标签",
|
|
287
|
+
"proTipBody": "提示:在浏览器中将 SlugBase 设为自定义搜索引擎,然后在地址栏输入 go github 即可打开书签。",
|
|
288
|
+
"proTipLink": "设置搜索引擎",
|
|
289
|
+
"dismiss": "关闭",
|
|
290
|
+
"onboardingTitle": "入门",
|
|
291
|
+
"onboardingImport": "导入浏览器书签",
|
|
292
|
+
"onboardingSearchEngine": "设置浏览器搜索引擎快捷方式",
|
|
293
|
+
"onboardingFolder": "创建您的第一个文件夹",
|
|
294
|
+
"onboardingTag": "为书签添加标签",
|
|
295
|
+
"onboardingDismiss": "关闭清单"
|
|
296
|
+
},
|
|
297
|
+
"apiDocs": {
|
|
298
|
+
"title": "API文档",
|
|
299
|
+
"description": "SlugBase的完整API参考。除非另有说明,否则所有端点都需要通过JWT令牌进行身份验证。"
|
|
300
|
+
},
|
|
301
|
+
"admin": {
|
|
302
|
+
"title": "管理",
|
|
303
|
+
"description": "管理用户、组、OIDC提供商和系统设置",
|
|
304
|
+
"users": "用户",
|
|
305
|
+
"teams": "团队",
|
|
306
|
+
"userGroups": "团队",
|
|
307
|
+
"oidcProviders": "OIDC提供商",
|
|
308
|
+
"settings": "设置",
|
|
309
|
+
"addUser": "添加用户",
|
|
310
|
+
"editUser": "编辑用户",
|
|
311
|
+
"addTeam": "添加团队",
|
|
312
|
+
"editTeam": "编辑团队",
|
|
313
|
+
"addGroup": "添加团队",
|
|
314
|
+
"editGroup": "编辑团队",
|
|
315
|
+
"addProvider": "添加提供商",
|
|
316
|
+
"editProvider": "编辑提供商",
|
|
317
|
+
"addSetting": "添加设置",
|
|
318
|
+
"admin": "管理员",
|
|
319
|
+
"user": "用户",
|
|
320
|
+
"oidcUser": "OIDC用户",
|
|
321
|
+
"teamName": "团队名称",
|
|
322
|
+
"groupName": "团队名称",
|
|
323
|
+
"description": "描述",
|
|
324
|
+
"providerKey": "提供商密钥",
|
|
325
|
+
"issuerUrl": "颁发者URL",
|
|
326
|
+
"clientId": "客户端ID",
|
|
327
|
+
"clientIdRequired": "创建新提供商时客户端ID是必需的",
|
|
328
|
+
"clientSecret": "客户端密钥",
|
|
329
|
+
"scopes": "范围",
|
|
330
|
+
"callbackUrl": "回调URL",
|
|
331
|
+
"customEndpoints": "自定义OIDC端点",
|
|
332
|
+
"customEndpointsDescription": "覆盖默认的OIDC端点路径。留空以使用基于颁发者URL的标准路径。",
|
|
333
|
+
"authorizationUrl": "授权URL",
|
|
334
|
+
"tokenUrl": "令牌URL",
|
|
335
|
+
"userinfoUrl": "用户信息URL",
|
|
336
|
+
"autoCreate": "自动创建用户",
|
|
337
|
+
"defaultRole": "默认角色",
|
|
338
|
+
"settingKey": "键",
|
|
339
|
+
"settingValue": "值",
|
|
340
|
+
"leaveBlank": "留空以保持当前值",
|
|
341
|
+
"leaveBlankToKeep": "留空以保持当前值",
|
|
342
|
+
"confirmDeleteUser": "您确定要删除此用户吗?",
|
|
343
|
+
"confirmDeleteTeam": "您确定要删除此团队吗?",
|
|
344
|
+
"confirmDeleteGroup": "您确定要删除此团队吗?",
|
|
345
|
+
"confirmDeleteProvider": "您确定要删除此提供商吗?",
|
|
346
|
+
"confirmDeleteSetting": "您确定要删除此设置吗?",
|
|
347
|
+
"manageMembers": "管理成员",
|
|
348
|
+
"currentMembers": "当前成员",
|
|
349
|
+
"currentTeams": "当前团队",
|
|
350
|
+
"addMembers": "添加成员",
|
|
351
|
+
"addTeams": "添加团队",
|
|
352
|
+
"noMembers": "此团队中没有成员",
|
|
353
|
+
"noTeams": "此用户没有分配的团队",
|
|
354
|
+
"noTeamsYet": "还没有团队",
|
|
355
|
+
"add": "添加",
|
|
356
|
+
"members": "成员",
|
|
357
|
+
"manageTeams": "管理团队",
|
|
358
|
+
"searchTeams": "按名称或描述搜索团队...",
|
|
359
|
+
"createUserWith": "创建用户方式",
|
|
360
|
+
"sendInviteEmail": "发送邀请邮件",
|
|
361
|
+
"setPassword": "设置密码",
|
|
362
|
+
"inviteSent": "已发送邀请",
|
|
363
|
+
"userCreatedInviteSent": "用户已创建;已发送邀请。",
|
|
364
|
+
"userCreatedInviteNotSent": "用户已创建;无法发送邀请(请检查 SMTP)。",
|
|
365
|
+
"searchUsers": "按姓名或电子邮件搜索用户...",
|
|
366
|
+
"noTeamsAvailable": "所有团队已分配",
|
|
367
|
+
"noUsersAvailable": "所有用户已是成员",
|
|
368
|
+
"noSearchResults": "没有匹配您搜索的结果",
|
|
369
|
+
"apiDocsNote": "API文档可作为独立页面使用",
|
|
370
|
+
"viewApiDocs": "查看API文档",
|
|
371
|
+
"noUserEmailAvailable": "用户电子邮件不可用",
|
|
372
|
+
"manageTeamsTitle": "管理团队 - {{userName}}",
|
|
373
|
+
"manageMembersTitle": "管理成员 - {{teamName}}"
|
|
374
|
+
},
|
|
375
|
+
"passwordReset": {
|
|
376
|
+
"title": "重置密码",
|
|
377
|
+
"description": "输入您的电子邮件地址以接收密码重置链接",
|
|
378
|
+
"email": "电子邮件",
|
|
379
|
+
"emailPlaceholder": "your@email.com",
|
|
380
|
+
"requestReset": "发送重置链接",
|
|
381
|
+
"resetToken": "重置令牌",
|
|
382
|
+
"newPassword": "新密码",
|
|
383
|
+
"confirmPassword": "确认密码",
|
|
384
|
+
"resetPassword": "重置密码",
|
|
385
|
+
"requestSent": "如果存在使用此电子邮件的账户,已发送密码重置链接。",
|
|
386
|
+
"resetSuccess": "密码重置成功!您现在可以使用新密码登录。",
|
|
387
|
+
"invalidToken": "无效或过期的重置令牌",
|
|
388
|
+
"passwordMismatch": "密码不匹配",
|
|
389
|
+
"backToLogin": "返回登录"
|
|
390
|
+
},
|
|
391
|
+
"emailVerification": {
|
|
392
|
+
"verifying": "正在验证电子邮件",
|
|
393
|
+
"verifyingDescription": "请稍候,我们正在验证您的电子邮件地址...",
|
|
394
|
+
"success": "电子邮件已验证",
|
|
395
|
+
"successDescription": "您的电子邮件地址已成功更改为{{email}}。",
|
|
396
|
+
"error": "验证失败",
|
|
397
|
+
"errorDescription": "验证链接无效或已过期。",
|
|
398
|
+
"tokenRequired": "需要验证令牌",
|
|
399
|
+
"invalidToken": "无效或过期的验证令牌",
|
|
400
|
+
"verifyFailed": "验证令牌失败",
|
|
401
|
+
"confirmFailed": "确认电子邮件验证失败",
|
|
402
|
+
"redirecting": "正在重定向到个人资料...",
|
|
403
|
+
"backToProfile": "返回个人资料",
|
|
404
|
+
"emailSent": "验证电子邮件已发送!请检查您的新电子邮件地址。",
|
|
405
|
+
"pendingTitle": "电子邮件验证待处理",
|
|
406
|
+
"pendingDescription": "验证电子邮件已发送到{{email}}。请检查您的收件箱并单击验证链接以完成更改。"
|
|
407
|
+
},
|
|
408
|
+
"smtp": {
|
|
409
|
+
"title": "SMTP电子邮件配置",
|
|
410
|
+
"description": "配置SMTP设置以发送电子邮件(例如,密码重置电子邮件)",
|
|
411
|
+
"enabled": "启用SMTP",
|
|
412
|
+
"host": "SMTP服务器",
|
|
413
|
+
"hostPlaceholder": "smtp.gmail.com",
|
|
414
|
+
"port": "端口",
|
|
415
|
+
"portPlaceholder": "587",
|
|
416
|
+
"secure": "使用TLS/SSL",
|
|
417
|
+
"user": "用户名/电子邮件",
|
|
418
|
+
"userPlaceholder": "your-email@gmail.com",
|
|
419
|
+
"password": "密码",
|
|
420
|
+
"passwordPlaceholder": "输入密码以设置或更改",
|
|
421
|
+
"passwordChangeHint": "输入新密码进行更改,或留空以保持当前密码",
|
|
422
|
+
"from": "发件人电子邮件",
|
|
423
|
+
"fromPlaceholder": "noreply@example.com",
|
|
424
|
+
"fromName": "发件人姓名",
|
|
425
|
+
"fromNamePlaceholder": "SlugBase",
|
|
426
|
+
"testEmail": "测试电子邮件",
|
|
427
|
+
"testEmailPlaceholder": "test@example.com",
|
|
428
|
+
"sendTest": "发送测试电子邮件",
|
|
429
|
+
"testSent": "测试电子邮件发送成功!",
|
|
430
|
+
"testFailed": "发送测试电子邮件失败",
|
|
431
|
+
"save": "保存SMTP设置"
|
|
432
|
+
},
|
|
433
|
+
"shared": {
|
|
434
|
+
"title": "共享",
|
|
435
|
+
"description": "与您共享的书签和文件夹",
|
|
436
|
+
"bookmarks": "书签",
|
|
437
|
+
"folders": "文件夹",
|
|
438
|
+
"noBookmarks": "还没有共享的书签",
|
|
439
|
+
"noFolders": "还没有共享的文件夹",
|
|
440
|
+
"unknownUser": "未知用户"
|
|
441
|
+
},
|
|
442
|
+
"searchEngineGuide": {
|
|
443
|
+
"title": "自定义搜索引擎设置指南",
|
|
444
|
+
"description": "了解如何在浏览器中设置自定义搜索引擎以快速访问您的书签",
|
|
445
|
+
"howItWorks": "工作原理",
|
|
446
|
+
"howItWorksDescription": "通过设置自定义搜索引擎,您可以在浏览器的地址栏中输入关键字(如'go'),后跟书签别名,即可立即导航到该书签。",
|
|
447
|
+
"yourSearchUrl": "您的搜索URL",
|
|
448
|
+
"urlNote": "设置自定义搜索引擎时使用此URL模板。%s将被替换为您的书签别名。",
|
|
449
|
+
"chromiumTitle": "基于Chromium的浏览器(Chrome、Edge、Brave等)",
|
|
450
|
+
"chromiumDescription": "按照以下步骤将SlugBase添加为自定义搜索引擎:",
|
|
451
|
+
"chromiumStep1": "打开浏览器设置",
|
|
452
|
+
"chromiumStep2": "导航到'搜索引擎'或'搜索'设置",
|
|
453
|
+
"chromiumStep3": "点击'管理搜索引擎'或'添加'",
|
|
454
|
+
"chromiumStep4": "填写表单:",
|
|
455
|
+
"chromiumStep4a": "名称:SlugBase(或您喜欢的任何名称)",
|
|
456
|
+
"chromiumStep4b": "关键字:go(或您喜欢的任何关键字)",
|
|
457
|
+
"chromiumStep4c": "URL:使用上面显示的搜索URL",
|
|
458
|
+
"chromiumStep5": "点击'添加'或'保存'以完成设置",
|
|
459
|
+
"firefoxTitle": "Firefox",
|
|
460
|
+
"firefoxDescription": "按照以下步骤将SlugBase添加为自定义搜索引擎:",
|
|
461
|
+
"firefoxStep1": "打开Firefox设置",
|
|
462
|
+
"firefoxStep2": "在设置菜单中导航到'搜索'",
|
|
463
|
+
"firefoxStep3": "向下滚动并点击'一键搜索引擎'下的'添加'",
|
|
464
|
+
"firefoxStep4": "填写表单:",
|
|
465
|
+
"firefoxStep4a": "名称:SlugBase(或您喜欢的任何名称)",
|
|
466
|
+
"firefoxStep4b": "关键字:go(或您喜欢的任何关键字)",
|
|
467
|
+
"firefoxStep4c": "URL:使用上面显示的搜索URL",
|
|
468
|
+
"firefoxStep5": "点击'添加'以完成设置",
|
|
469
|
+
"usageExample": "使用示例",
|
|
470
|
+
"usageStep1": "设置后,只需在浏览器地址栏中输入:",
|
|
471
|
+
"usageStep2": "按Enter,您将被重定向到别名为'test'的书签",
|
|
472
|
+
"usageNote": "将'test'替换为您在SlugBase中创建的任何书签别名!"
|
|
473
|
+
},
|
|
474
|
+
"legal": {
|
|
475
|
+
"imprintTitle": "版权说明",
|
|
476
|
+
"imprintProviderTitle": "服务提供者(ECG §5)",
|
|
477
|
+
"imprintChamber": "{{chamber}} 成员",
|
|
478
|
+
"imprintCourtTitle": "管辖法院",
|
|
479
|
+
"imprintCourtBody": "争议管辖法院:奥地利 Landesgericht Linz。适用奥地利法律。",
|
|
480
|
+
"imprintOdrTitle": "欧盟在线争议解决",
|
|
481
|
+
"imprintOdrBody": "欧盟委员会提供在线争议解决平台。消费者可访问",
|
|
482
|
+
"uid": "UID",
|
|
483
|
+
"backToHome": "返回首页",
|
|
484
|
+
"termsTitle": "条款与条件",
|
|
485
|
+
"termsScopeTitle": "适用范围",
|
|
486
|
+
"termsScopeBody": "本条款适用于您对 slugbase.app 上的 SlugBase Cloud(「服务」)的使用。注册或使用服务即表示您同意本条款。若您为消费者,法定权利不受影响。",
|
|
487
|
+
"termsServiceTitle": "服务描述",
|
|
488
|
+
"termsServiceBody": "SlugBase Cloud 是书签管理与链接跳转服务。您可保存、整理和分享书签;创建文件夹和标签;并可选将书签作为短链接提供。服务以 SaaS 形式在 https://slugbase.app 提供。",
|
|
489
|
+
"termsPlansTitle": "套餐",
|
|
490
|
+
"termsPlansBody": "SlugBase Cloud 提供 Free、Personal、Team 和 Early Supporter Lifetime 套餐。当前详情见定价页。",
|
|
491
|
+
"termsAccountTitle": "账户与资格",
|
|
492
|
+
"termsAccountBody": "创建账户时须提供准确信息。您有责任保管好登录凭证。本服务供个人和团队合法使用。",
|
|
493
|
+
"termsUseTitle": "服务使用",
|
|
494
|
+
"termsUseBody": "您可使用 SlugBase 保存、整理和分享书签,并使用短链接(跳转)。不得将服务用于非法目的、传播恶意软件或骚扰他人。",
|
|
495
|
+
"termsShortLinksTitle": "短链接与跳转",
|
|
496
|
+
"termsShortLinksBody": "短链接(如 /go/您的别名)会跳转到您设置的 URL。不得用于钓鱼、垃圾信息或其他滥用。我们可暂停或移除违反本条款的链接。",
|
|
497
|
+
"termsBillingTitle": "计费与支付",
|
|
498
|
+
"termsBillingBody": "付费套餐提前计费。发票开出时需付款。Early Supporter Lifetime 为一次性支付。",
|
|
499
|
+
"termsCancellationTitle": "取消与续订",
|
|
500
|
+
"termsCancellationBody": "您可随时取消订阅。取消于当前计费周期结束时生效。无最低承诺期。自动续订的订阅,您可在每次续订日前取消以避免下一周期扣费。",
|
|
501
|
+
"termsWithdrawalTitle": "撤销权(消费者)",
|
|
502
|
+
"termsWithdrawalBody": "若您为奥地利法律意义上的消费者,您享有 14 天无理由撤销权。期限自合同订立之日起算。请通过 hello@slugbase.app 联系我们行使权利。",
|
|
503
|
+
"termsLiabilityTitle": "责任限制",
|
|
504
|
+
"termsLiabilityBody": "服务按“现状”提供。除故意或重大过失外,我们不对间接或后果性损害负责。责任有限。",
|
|
505
|
+
"termsTerminationTitle": "我方暂停与终止",
|
|
506
|
+
"termsTerminationBody": "若您严重违反本条款或未付款,我们可暂停或终止您的账户。终止后您的使用权结束。",
|
|
507
|
+
"termsLawTitle": "适用法律",
|
|
508
|
+
"termsLawBody": "本条款受奥地利法律管辖。任何争议须提交奥地利有管辖权的法院。",
|
|
509
|
+
"termsContactTitle": "联系",
|
|
510
|
+
"termsContactBody": "有关本条款的问题,请通过 hello@slugbase.app 或版权说明中的地址联系我们。",
|
|
511
|
+
"privacyTitle": "隐私政策",
|
|
512
|
+
"privacyScopeTitle": "适用范围",
|
|
513
|
+
"privacyScopeBody": "本政策适用于 https://slugbase.app 上的 SlugBase Cloud。描述我们如何处理您的个人数据。不适用于自托管 SlugBase 的情况。依据 GDPR 与奥地利 DSG。",
|
|
514
|
+
"privacyControllerTitle": "控制者",
|
|
515
|
+
"privacyControllerBody": "数据处理控制者为 Guggernbichler Michael David,Linzer Str. 17,4100 Ottensheim,奥地利(见版权说明)。",
|
|
516
|
+
"privacyDataTitle": "我们处理的数据",
|
|
517
|
+
"privacyDataBody": "我们处理:账户数据;内容(书签、文件夹、标签);使用数据(会话、IP、日志);使用联系表单时的联系数据。我们不出售数据,也不用于广告。",
|
|
518
|
+
"privacyRecipientsTitle": "接收方",
|
|
519
|
+
"privacyRecipientsBody": "数据在我们自有基础设施及符合 GDPR 的处理器上处理。我们不会为第三方自有目的分享您的数据。",
|
|
520
|
+
"privacyBasisTitle": "法律依据",
|
|
521
|
+
"privacyBasisBody": "我们基于合同履行(提供服务)、您适用的同意及合法利益(安全、防止滥用)处理数据。",
|
|
522
|
+
"privacyRetentionTitle": "保留",
|
|
523
|
+
"privacyRetentionBody": "在账户存续期间我们保留账户与书签数据。删除后会在合理期限内删除或匿名化。法律要求时日志可保留更长时间。",
|
|
524
|
+
"privacyRightsTitle": "您的权利",
|
|
525
|
+
"privacyRightsBody": "您有权访问、更正、删除、限制、可携并提出异议。您可随时撤回同意。联系:hello@slugbase.app。您可向奥地利监管机构投诉(见下)。",
|
|
526
|
+
"privacyCookiesTitle": "Cookie 与认证",
|
|
527
|
+
"privacyCookiesBody": "我们使用会话 Cookie 及类似方式用于认证与安全。我们不使用第三方广告 Cookie。",
|
|
528
|
+
"privacyHostingTitle": "托管(CLOUD 与自托管)",
|
|
529
|
+
"privacyHostingBody": "在 slugbase.app(CLOUD)上我们在欧盟/欧洲经济区内的自有基础设施托管您的数据。若您自托管 SlugBase,您为控制者并控制存储。",
|
|
530
|
+
"privacySupervisoryTitle": "监管机构",
|
|
531
|
+
"privacySupervisoryBody": "您可向 Österreichische Datenschutzbehörde(奥地利数据保护局)投诉:Barichgasse 40-42, 1030 Vienna, Austria(dsb@dsb.gv.at)。根据奥地利 DSG,投诉一般须在知悉后一年内提出。",
|
|
532
|
+
"privacyChangesTitle": "变更",
|
|
533
|
+
"privacyChangesBody": "我们可能会更新本政策。重大变更将通过服务或邮件通知。当前版本见本页。变更后继续使用即表示接受。"
|
|
534
|
+
}
|
|
535
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import './instrument'
|
|
2
|
+
import React from 'react'
|
|
3
|
+
import ReactDOM from 'react-dom/client'
|
|
4
|
+
import App from './App.tsx'
|
|
5
|
+
import './index.css'
|
|
6
|
+
import './i18n'
|
|
7
|
+
|
|
8
|
+
// Apply initial dark mode: localStorage (anonymous users) > browser preference
|
|
9
|
+
const root = document.documentElement;
|
|
10
|
+
const storedTheme = localStorage.getItem('slugbase_theme');
|
|
11
|
+
if (storedTheme === 'dark') {
|
|
12
|
+
root.classList.add('dark');
|
|
13
|
+
root.dataset.userTheme = 'true';
|
|
14
|
+
} else if (storedTheme === 'light') {
|
|
15
|
+
root.classList.remove('dark');
|
|
16
|
+
root.dataset.userTheme = 'true';
|
|
17
|
+
} else {
|
|
18
|
+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
19
|
+
if (prefersDark) {
|
|
20
|
+
root.classList.add('dark');
|
|
21
|
+
} else {
|
|
22
|
+
root.classList.remove('dark');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// Listen for changes to browser preference
|
|
27
|
+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
|
|
28
|
+
// Only apply if user hasn't set a preference (i.e., no user logged in or theme is 'auto')
|
|
29
|
+
const root = document.documentElement;
|
|
30
|
+
const hasUserTheme = root.dataset.userTheme === 'true';
|
|
31
|
+
if (!hasUserTheme) {
|
|
32
|
+
if (e.matches) {
|
|
33
|
+
root.classList.add('dark');
|
|
34
|
+
} else {
|
|
35
|
+
root.classList.remove('dark');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
ReactDOM.createRoot(document.getElementById('root')!).render(
|
|
41
|
+
<React.StrictMode>
|
|
42
|
+
<App />
|
|
43
|
+
</React.StrictMode>,
|
|
44
|
+
)
|