@nocobase/app-template-default 1.0.0-beta.59 → 1.0.0-beta.60
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/AGENTS.md +2 -2
- package/client/locales/en-US.ts +8 -178
- package/client/locales/system/en-US.ts +344 -0
- package/client/locales/system/zh-CN.ts +320 -0
- package/client/locales/zh-CN.ts +3 -165
- package/client/pages/home/capabilities.ts +52 -0
- package/client/pages/home/index.tsx +190 -0
- package/client/pages/home/prompt-dialog.tsx +122 -0
- package/client/pages/home/use-copy.ts +38 -0
- package/client/routes.ts +1 -1
- package/package.json +6 -6
- package/tests/components/home.test.tsx +174 -0
- package/client/pages/home.tsx +0 -89
package/AGENTS.md
CHANGED
|
@@ -46,7 +46,7 @@ client/pages/ The page component; a folder when a page has children
|
|
|
46
46
|
client/components/ Your components
|
|
47
47
|
client/components/ui/ shadcn/ui primitives; add with the CLI, never hand-write or edit
|
|
48
48
|
client/hooks/ Hooks shared across features
|
|
49
|
-
client/locales/ Every user-visible string
|
|
49
|
+
client/locales/ Every user-visible string; system/ holds the template's copy
|
|
50
50
|
client/service-provider.ts Client startup: services that boot with the application
|
|
51
51
|
server/routes/ HTTP endpoints
|
|
52
52
|
server/providers/ Services and their lifecycle
|
|
@@ -231,7 +231,7 @@ At runtime, resolve `databaseManagerToken` from the container and use `database.
|
|
|
231
231
|
|
|
232
232
|
### User-facing text
|
|
233
233
|
|
|
234
|
-
Every string a user reads goes through a translation key. `client/locales/en-US.ts` states the wording and derives the shape that other locales are checked against, so a missing key in `zh-CN.ts` is a compile error.
|
|
234
|
+
Every string a user reads goes through a translation key. `client/locales/en-US.ts` states the wording and derives the shape that other locales are checked against, so a missing key in `zh-CN.ts` is a compile error. Each application locale file first spreads the template's own copy from `client/locales/system/` — the shell, shared components, and the sign-in pages under `auth.*`, whose components take their text as props that the pages in `client/pages/auth/` translate — and then adds the application's groups. Write the application's copy in `client/locales/en-US.ts` and `zh-CN.ts`, never in `system/`, which a template upgrade replaces. A group written there replaces the system group of the same name, so extend a shared one by spreading it first: `navigation: { ...systemEnUS.navigation, orders: 'Orders' }`.
|
|
235
235
|
|
|
236
236
|
```tsx
|
|
237
237
|
const { t } = useTranslation();
|
package/client/locales/en-US.ts
CHANGED
|
@@ -1,184 +1,14 @@
|
|
|
1
1
|
import type { LocaleResource } from '@nocobase/i18n';
|
|
2
|
-
import deviceApprovalEnUS from '#extensions/nocobase-device-approval/locales/en-US';
|
|
3
|
-
import inboxEnUS from '#extensions/nocobase-inbox/locales/en-US';
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
// The UI Library block of the `/device` page; the keys below may reword it.
|
|
7
|
-
...deviceApprovalEnUS,
|
|
8
|
-
// The UI Library block of the `/inbox` page; the keys below may reword it.
|
|
9
|
-
...inboxEnUS,
|
|
10
|
-
// The UI Library component of the header's inbox button.
|
|
11
|
-
'inboxButton.title': 'Inbox',
|
|
12
|
-
'inboxButton.pending': 'Inbox, {{count}} waiting',
|
|
13
|
-
'inboxButton.unread': 'Inbox, {{count}} unread',
|
|
14
|
-
'inboxButton.pendingHint':
|
|
15
|
-
'{{count}} waiting for you; it goes down once they are handled.',
|
|
16
|
-
'inboxButton.unreadHint': '{{count}} unread; it goes down as you read them.',
|
|
17
|
-
'auth.welcome': 'Welcome back',
|
|
18
|
-
'auth.loginDescription': 'Sign in with your username or email and password.',
|
|
19
|
-
'auth.registerTitle': 'Create an account',
|
|
20
|
-
'auth.registerDescription': 'Create an account to get started.',
|
|
21
|
-
'auth.forgotTitle': 'Forgot password',
|
|
22
|
-
'auth.forgotDescription':
|
|
23
|
-
'Enter your email and we will send a reset link if the account exists.',
|
|
24
|
-
'auth.resetDescription': 'Choose a new password for your account.',
|
|
25
|
-
'auth.resetTitle': 'Reset password',
|
|
26
|
-
'auth.identifier': 'Username or email',
|
|
27
|
-
'auth.password': 'Password',
|
|
28
|
-
'auth.signIn': 'Sign in',
|
|
29
|
-
'auth.signingIn': 'Signing in…',
|
|
30
|
-
'auth.hidePassword': 'Hide password',
|
|
31
|
-
'auth.showPassword': 'Show password',
|
|
32
|
-
'auth.forgotLink': 'Forgot password?',
|
|
33
|
-
'auth.noAccount': "Don't have an account?",
|
|
34
|
-
'auth.signUp': 'Sign up',
|
|
35
|
-
'auth.createAccount': 'Create account',
|
|
36
|
-
'auth.creatingAccount': 'Creating account…',
|
|
37
|
-
'auth.name': 'Name',
|
|
38
|
-
'auth.username': 'Username',
|
|
39
|
-
'auth.email': 'Email',
|
|
40
|
-
'auth.confirmPassword': 'Confirm password',
|
|
41
|
-
'auth.existingAccount': 'Already have an account?',
|
|
42
|
-
'auth.passwordMismatch': "Passwords don't match.",
|
|
43
|
-
'auth.resetting': 'Resetting…',
|
|
44
|
-
'auth.newPassword': 'New password',
|
|
45
|
-
'auth.confirmNewPassword': 'Confirm new password',
|
|
46
|
-
'auth.invalidResetLink':
|
|
47
|
-
'This password reset link is invalid or has expired.',
|
|
48
|
-
'auth.backToSignIn': 'Back to sign in',
|
|
49
|
-
'auth.sendResetLink': 'Send reset link',
|
|
50
|
-
'auth.sending': 'Sending…',
|
|
51
|
-
'auth.resetSent': 'If the account exists, a reset link has been sent.',
|
|
52
|
-
'auth.rememberPassword': 'Remember your password?',
|
|
53
|
-
'auth.methods': 'Sign-in methods',
|
|
54
|
-
'auth.or': 'Or continue with',
|
|
55
|
-
'auth.continueWith': 'Continue with {provider}',
|
|
56
|
-
'auth.about': 'About this application',
|
|
57
|
-
'auth.platform': 'AI-native application platform',
|
|
58
|
-
'auth.marketingTitleFirst': 'Let AI build freely.',
|
|
59
|
-
'auth.marketingTitleSecond': 'NocoBase keeps it',
|
|
60
|
-
'auth.marketingTitleThird': 'reliable.',
|
|
61
|
-
'auth.marketingDescription':
|
|
62
|
-
'Give AI a flexible frontend framework to shape each experience, while NocoBase secures the data, permissions and governance underneath.',
|
|
63
|
-
'auth.frontend': 'AI-native frontend',
|
|
64
|
-
'auth.frontendDescription':
|
|
65
|
-
'Compose interfaces freely on a flexible framework.',
|
|
66
|
-
'auth.foundation': 'NocoBase foundation',
|
|
67
|
-
'auth.foundationDescription': 'Reliable data, access control and governance.',
|
|
68
|
-
'auth.marketingFooter': 'Freedom above. Confidence below.',
|
|
69
|
-
'status.loading': 'Loading',
|
|
70
|
-
'status.loadingPage': 'Loading page',
|
|
71
|
-
'status.denied': 'Access denied',
|
|
72
|
-
'status.pageFailed': 'Unable to load page',
|
|
73
|
-
'status.retry': 'Retry',
|
|
74
|
-
'navigation.brandHome': 'NocoBase home',
|
|
75
|
-
'navigation.brandApps': 'NocoBase applications',
|
|
76
|
-
'routeOverlay.close': 'Close',
|
|
77
|
-
'status.deniedDescription': 'You do not have permission to access {{label}}.',
|
|
78
|
-
'status.routeFailedDescription':
|
|
79
|
-
'Route {{label}} from {{packageName}} could not be loaded.',
|
|
80
|
-
shell: {
|
|
81
|
-
buildFreely: 'AI builds freely.',
|
|
82
|
-
reliability: '<brand>NocoBase</brand> keeps it reliable.',
|
|
83
|
-
},
|
|
84
|
-
home: {
|
|
85
|
-
platform: 'NocoBase · AI-native application platform',
|
|
86
|
-
pages: {
|
|
87
|
-
title: 'Build your pages',
|
|
88
|
-
description: 'Turn your ideas into interfaces that fit your work.',
|
|
89
|
-
examples:
|
|
90
|
-
'From tables and forms to dashboards, shape each page around your business.',
|
|
91
|
-
},
|
|
92
|
-
data: {
|
|
93
|
-
title: 'Organize your data',
|
|
94
|
-
description: 'Give your business a clear, connected data model.',
|
|
95
|
-
examples:
|
|
96
|
-
'Define records, fields and relationships so your information works together.',
|
|
97
|
-
},
|
|
98
|
-
workflows: {
|
|
99
|
-
title: 'Connect your workflows',
|
|
100
|
-
description: 'Keep work moving with consistent business processes.',
|
|
101
|
-
examples:
|
|
102
|
-
'Connect approvals, notifications and automated actions to everyday work.',
|
|
103
|
-
},
|
|
104
|
-
startTitle: 'Start with one requirement',
|
|
105
|
-
startDescription:
|
|
106
|
-
'Tell your AI Agent what you want to achieve and who will use it.',
|
|
107
|
-
examplePrompt:
|
|
108
|
-
'“Build a customer management app for our sales team. We need a customer list, contact details and follow-up records, with a clear overview of each opportunity.”',
|
|
109
|
-
startHint:
|
|
110
|
-
'Begin with a small, useful flow. Refine the pages, data and rules as your needs become clearer.',
|
|
111
|
-
foundation:
|
|
112
|
-
'AI builds freely. NocoBase keeps data, permissions and workflows reliable.',
|
|
113
|
-
title: 'Start building your application',
|
|
114
|
-
description:
|
|
115
|
-
'Describe what you need to your AI Agent, then build pages, data models, and business processes.',
|
|
116
|
-
},
|
|
3
|
+
import systemEnUS from './system/en-US.js';
|
|
117
4
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
themes: { default: 'Spacious', compact: 'Compact' },
|
|
126
|
-
},
|
|
127
|
-
app: {
|
|
128
|
-
title: 'NocoBase',
|
|
129
|
-
},
|
|
130
|
-
actions: {
|
|
131
|
-
close: 'Close',
|
|
132
|
-
save: 'Save',
|
|
133
|
-
cancel: 'Cancel',
|
|
134
|
-
confirm: 'Confirm',
|
|
135
|
-
language: 'Language',
|
|
136
|
-
},
|
|
137
|
-
notices: {
|
|
138
|
-
serverLocaleFallback:
|
|
139
|
-
'The server does not support this language, so server messages will use English.',
|
|
140
|
-
languageChangeFailed:
|
|
141
|
-
'Unable to complete the language change. Please try again.',
|
|
142
|
-
},
|
|
143
|
-
account: {
|
|
144
|
-
signOutFailed: 'Unable to sign out. Please try again.',
|
|
145
|
-
openMenu: 'Open account menu',
|
|
146
|
-
fallback: 'Account',
|
|
147
|
-
signOut: 'Sign out',
|
|
148
|
-
signingOut: 'Signing out…',
|
|
149
|
-
},
|
|
150
|
-
navigation: {
|
|
151
|
-
home: 'Home',
|
|
152
|
-
open: 'Open navigation',
|
|
153
|
-
close: 'Close navigation',
|
|
154
|
-
expand: 'Expand navigation',
|
|
155
|
-
collapse: 'Collapse navigation',
|
|
156
|
-
toggle: 'Expand or collapse navigation',
|
|
157
|
-
label: 'Application navigation',
|
|
158
|
-
description: 'Go to a page of this application.',
|
|
159
|
-
breadcrumb: 'Breadcrumb',
|
|
160
|
-
breadcrumbMore: 'Show the levels in between',
|
|
161
|
-
back: 'Back',
|
|
162
|
-
},
|
|
163
|
-
dataTable: {
|
|
164
|
-
noResults: 'No results.',
|
|
165
|
-
sortAscending: 'Asc',
|
|
166
|
-
sortDescending: 'Desc',
|
|
167
|
-
hideColumn: 'Hide',
|
|
168
|
-
view: 'View',
|
|
169
|
-
toggleColumns: 'Toggle columns',
|
|
170
|
-
selectedCount: '{{selected}} of {{total}} row(s) selected.',
|
|
171
|
-
rowsPerPage: 'Rows per page',
|
|
172
|
-
pageOf: 'Page {{page}} of {{pageCount}}',
|
|
173
|
-
firstPage: 'Go to first page',
|
|
174
|
-
previousPage: 'Go to previous page',
|
|
175
|
-
nextPage: 'Go to next page',
|
|
176
|
-
lastPage: 'Go to last page',
|
|
177
|
-
},
|
|
178
|
-
datePicker: {
|
|
179
|
-
placeholder: 'Pick a date',
|
|
180
|
-
rangePlaceholder: 'Pick a date range',
|
|
181
|
-
},
|
|
5
|
+
const enUS = {
|
|
6
|
+
// The template's own copy: the shell, the sign-in pages, shared components and the homepage. Keep it in
|
|
7
|
+
// `./system/` so a template upgrade can replace it without touching the application's copy below.
|
|
8
|
+
...systemEnUS,
|
|
9
|
+
// The application's copy goes here, one group per feature. A shared group such as `navigation` is extended by
|
|
10
|
+
// spreading the system one first, `navigation: { ...systemEnUS.navigation, orders: 'Orders' }`, since a group
|
|
11
|
+
// written here replaces the system group of the same name rather than merging with it.
|
|
182
12
|
};
|
|
183
13
|
|
|
184
14
|
/**
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import type { LocaleResource } from '@nocobase/i18n';
|
|
2
|
+
import deviceApprovalEnUS from '#extensions/nocobase-device-approval/locales/en-US';
|
|
3
|
+
import inboxEnUS from '#extensions/nocobase-inbox/locales/en-US';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The copy of what the template ships: the shell, the sign-in pages, shared components and the homepage. A template
|
|
7
|
+
* upgrade replaces this file, so put the application's own copy in `../en-US.ts` rather than here.
|
|
8
|
+
*/
|
|
9
|
+
const systemEnUS = {
|
|
10
|
+
// The UI Library block of the `/device` page; the keys below may reword it.
|
|
11
|
+
...deviceApprovalEnUS,
|
|
12
|
+
// The UI Library block of the `/inbox` page; the keys below may reword it.
|
|
13
|
+
...inboxEnUS,
|
|
14
|
+
// The UI Library component of the header's inbox button.
|
|
15
|
+
'inboxButton.title': 'Inbox',
|
|
16
|
+
'inboxButton.pending': 'Inbox, {{count}} waiting',
|
|
17
|
+
'inboxButton.unread': 'Inbox, {{count}} unread',
|
|
18
|
+
'inboxButton.pendingHint':
|
|
19
|
+
'{{count}} waiting for you; it goes down once they are handled.',
|
|
20
|
+
'inboxButton.unreadHint': '{{count}} unread; it goes down as you read them.',
|
|
21
|
+
'auth.welcome': 'Welcome back',
|
|
22
|
+
'auth.loginDescription': 'Sign in with your username or email and password.',
|
|
23
|
+
'auth.registerTitle': 'Create an account',
|
|
24
|
+
'auth.registerDescription': 'Create an account to get started.',
|
|
25
|
+
'auth.forgotTitle': 'Forgot password',
|
|
26
|
+
'auth.forgotDescription':
|
|
27
|
+
'Enter your email and we will send a reset link if the account exists.',
|
|
28
|
+
'auth.resetDescription': 'Choose a new password for your account.',
|
|
29
|
+
'auth.resetTitle': 'Reset password',
|
|
30
|
+
'auth.identifier': 'Username or email',
|
|
31
|
+
'auth.password': 'Password',
|
|
32
|
+
'auth.signIn': 'Sign in',
|
|
33
|
+
'auth.signingIn': 'Signing in…',
|
|
34
|
+
'auth.hidePassword': 'Hide password',
|
|
35
|
+
'auth.showPassword': 'Show password',
|
|
36
|
+
'auth.forgotLink': 'Forgot password?',
|
|
37
|
+
'auth.noAccount': "Don't have an account?",
|
|
38
|
+
'auth.signUp': 'Sign up',
|
|
39
|
+
'auth.createAccount': 'Create account',
|
|
40
|
+
'auth.creatingAccount': 'Creating account…',
|
|
41
|
+
'auth.name': 'Name',
|
|
42
|
+
'auth.username': 'Username',
|
|
43
|
+
'auth.email': 'Email',
|
|
44
|
+
'auth.confirmPassword': 'Confirm password',
|
|
45
|
+
'auth.existingAccount': 'Already have an account?',
|
|
46
|
+
'auth.passwordMismatch': "Passwords don't match.",
|
|
47
|
+
'auth.resetting': 'Resetting…',
|
|
48
|
+
'auth.newPassword': 'New password',
|
|
49
|
+
'auth.confirmNewPassword': 'Confirm new password',
|
|
50
|
+
'auth.invalidResetLink':
|
|
51
|
+
'This password reset link is invalid or has expired.',
|
|
52
|
+
'auth.backToSignIn': 'Back to sign in',
|
|
53
|
+
'auth.sendResetLink': 'Send reset link',
|
|
54
|
+
'auth.sending': 'Sending…',
|
|
55
|
+
'auth.resetSent': 'If the account exists, a reset link has been sent.',
|
|
56
|
+
'auth.rememberPassword': 'Remember your password?',
|
|
57
|
+
'auth.methods': 'Sign-in methods',
|
|
58
|
+
'auth.or': 'Or continue with',
|
|
59
|
+
'auth.continueWith': 'Continue with {provider}',
|
|
60
|
+
'auth.about': 'About this application',
|
|
61
|
+
'auth.platform': 'AI-native application platform',
|
|
62
|
+
'auth.marketingTitleFirst': 'Let AI build freely.',
|
|
63
|
+
'auth.marketingTitleSecond': 'NocoBase keeps it',
|
|
64
|
+
'auth.marketingTitleThird': 'reliable.',
|
|
65
|
+
'auth.marketingDescription':
|
|
66
|
+
'Give AI a flexible frontend framework to shape each experience, while NocoBase secures the data, permissions and governance underneath.',
|
|
67
|
+
'auth.frontend': 'AI-native frontend',
|
|
68
|
+
'auth.frontendDescription':
|
|
69
|
+
'Compose interfaces freely on a flexible framework.',
|
|
70
|
+
'auth.foundation': 'NocoBase foundation',
|
|
71
|
+
'auth.foundationDescription': 'Reliable data, access control and governance.',
|
|
72
|
+
'auth.marketingFooter': 'Freedom above. Confidence below.',
|
|
73
|
+
'status.loading': 'Loading',
|
|
74
|
+
'status.loadingPage': 'Loading page',
|
|
75
|
+
'status.denied': 'Access denied',
|
|
76
|
+
'status.pageFailed': 'Unable to load page',
|
|
77
|
+
'status.retry': 'Retry',
|
|
78
|
+
'navigation.brandHome': 'NocoBase home',
|
|
79
|
+
'navigation.brandApps': 'NocoBase applications',
|
|
80
|
+
'routeOverlay.close': 'Close',
|
|
81
|
+
'status.deniedDescription': 'You do not have permission to access {{label}}.',
|
|
82
|
+
'status.routeFailedDescription':
|
|
83
|
+
'Route {{label}} from {{packageName}} could not be loaded.',
|
|
84
|
+
shell: {
|
|
85
|
+
buildFreely: 'AI builds freely.',
|
|
86
|
+
reliability: '<brand>NocoBase</brand> keeps it reliable.',
|
|
87
|
+
},
|
|
88
|
+
home: {
|
|
89
|
+
platform: 'NocoBase · AI-native application platform',
|
|
90
|
+
title: 'Describe it, and your agent builds it',
|
|
91
|
+
description:
|
|
92
|
+
'This application is developed by talking to your coding agent. Tell it what the business needs in plain words, and it writes the pages, data models, APIs, and business processes in this project.',
|
|
93
|
+
steps: {
|
|
94
|
+
describe: {
|
|
95
|
+
title: 'Describe the need',
|
|
96
|
+
description:
|
|
97
|
+
'Say who uses it, what data it keeps, and what should happen.',
|
|
98
|
+
},
|
|
99
|
+
build: {
|
|
100
|
+
title: 'Let the agent build',
|
|
101
|
+
description:
|
|
102
|
+
'It reads this project and its built-in capabilities, then writes the code.',
|
|
103
|
+
},
|
|
104
|
+
review: {
|
|
105
|
+
title: 'Check and refine',
|
|
106
|
+
description:
|
|
107
|
+
'Refresh the page to try it, then ask for changes in the same way.',
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
example: {
|
|
111
|
+
title: 'Try a request like this',
|
|
112
|
+
text: 'Build a purchase order application.\n\nAn order has a number, item, applicant, amount, and approval status. Applicants create orders and see only their own; reviewers see all pending orders and approve or reject them.\nAfter a decision, notify the applicant in the inbox with a link to the order.',
|
|
113
|
+
hint: 'Paste it into Claude Code, Codex, Cursor, or any coding agent opened in this project.',
|
|
114
|
+
},
|
|
115
|
+
capabilitiesTitle: 'Built-in capabilities',
|
|
116
|
+
capabilitiesDescription:
|
|
117
|
+
'Your agent uses these directly instead of building them from scratch. Open one to get a prompt you can edit and copy.',
|
|
118
|
+
viewPrompts: 'View prompts ({{count}})',
|
|
119
|
+
prompt: {
|
|
120
|
+
label: 'Prompt',
|
|
121
|
+
hint: 'Edit the prompt to fit your business before copying. Changes are not saved after the dialog closes.',
|
|
122
|
+
copy: 'Copy',
|
|
123
|
+
copiedShort: 'Copied',
|
|
124
|
+
copied: 'Prompt copied',
|
|
125
|
+
copyFailed: 'Unable to copy. Select the text and copy it manually.',
|
|
126
|
+
reset: 'Restore default',
|
|
127
|
+
},
|
|
128
|
+
capabilities: {
|
|
129
|
+
auth: {
|
|
130
|
+
title: 'Authentication',
|
|
131
|
+
description:
|
|
132
|
+
'Sign-in, registration, password reset, and company single sign-on.',
|
|
133
|
+
prompts: {
|
|
134
|
+
disableSignUp: {
|
|
135
|
+
label: 'Close sign-up',
|
|
136
|
+
text: 'This application is for company employees only. Administrators create all accounts.\nDisable self-registration and remove the registration link from the sign-in page.\nExisting employees must still be able to sign in with their accounts and passwords.\nKeep the forgot-password link.',
|
|
137
|
+
},
|
|
138
|
+
passwordRules: {
|
|
139
|
+
label: 'Password rules',
|
|
140
|
+
text: 'Require at least 12 characters when registering or resetting a password.\nShow this requirement in both forms and use consistent validation messages.\nKeep existing accounts able to sign in without requiring an immediate password change.',
|
|
141
|
+
},
|
|
142
|
+
companySso: {
|
|
143
|
+
label: 'Company SSO',
|
|
144
|
+
text: "Let employees sign in with our company identity platform using OIDC.\n\nKeep account-password sign-in and add a Company account button.\nThe button opens the company identity platform. After successful sign-in, return to the application's home page.\n\nAllow first sign-in to create an application account, identified by the platform's stable user identifier.\nDo not automatically link accounts by matching names or emails. New accounts use the application's default permissions.\n\nList the information the identity platform administrator must provide and the callback URL they need to register.",
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
authorization: {
|
|
149
|
+
title: 'Permissions',
|
|
150
|
+
description:
|
|
151
|
+
'Control who can open which pages, run which actions, and see which records.',
|
|
152
|
+
prompts: {
|
|
153
|
+
jobs: {
|
|
154
|
+
label: 'Jobs',
|
|
155
|
+
text: "Create Purchase requester and Order reviewer jobs for the application.\nPurchase requesters can enter the orders page and view orders they requested.\nOrder reviewers can enter the orders page, view orders, and approve or reject pending orders.\nOnly application administrators can change permissions and assignments.\nUse the application's existing authorization capability so administrators can adjust permissions and assign people later.",
|
|
156
|
+
},
|
|
157
|
+
dataScopes: {
|
|
158
|
+
label: 'Data scopes',
|
|
159
|
+
text: "Let purchase requesters view only their own orders, using the order's requester field to determine ownership.\nOrder reviewers can view all orders and process pending approvals.\nAdministrators can adjust each job's order-viewing scope in its permission set.",
|
|
160
|
+
},
|
|
161
|
+
sharing: {
|
|
162
|
+
label: 'Sharing',
|
|
163
|
+
text: "Share Bob's order PO-2026-004 with Alice so she can review it.\nAlice already has permission to view orders; add viewing access to this order.\nKeep her existing responsibilities. Order reviewers still process approvals.\nLet administrators manage this sharing rule.",
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
scheduler: {
|
|
168
|
+
title: 'Scheduled tasks',
|
|
169
|
+
description:
|
|
170
|
+
'Run business work at set times, and see the next run and its results.',
|
|
171
|
+
prompts: {
|
|
172
|
+
reminder: {
|
|
173
|
+
label: 'Daily reminder',
|
|
174
|
+
text: 'Add a Pending order reminder to the existing order application.\n\nAt 09:00 Beijing time every weekday, find orders awaiting approval, group them by reviewer, and send each reviewer one in-app notification.\nInclude the pending order count and link to the pending order list. Send nothing when there are no pending orders.\nAdministrators can view the schedule and execution records, and pause or resume reminders.',
|
|
175
|
+
},
|
|
176
|
+
weeklyReport: {
|
|
177
|
+
label: 'Weekly report',
|
|
178
|
+
text: "At 08:00 Beijing time every Monday, generate last week's sales summary and notify the sales manager.\nInclude sales revenue, order count, and regional totals. Administrators can view the task and execution records.",
|
|
179
|
+
},
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
notification: {
|
|
183
|
+
title: 'Notifications',
|
|
184
|
+
description:
|
|
185
|
+
'Send in-app messages, email, or group bot messages when something happens.',
|
|
186
|
+
prompts: {
|
|
187
|
+
inApp: {
|
|
188
|
+
label: 'In-app message',
|
|
189
|
+
text: "Add order approval to the current application and notify applicants of the results through in-app messages.\n\nOrders include a number, name, applicant, amount, and approval status.\nApplicants can view their own orders. Reviewers can view pending orders and approve or reject them. Reuse existing order and approval features if available.\n\nAfter approval or rejection, send one in-app message only to the order's applicant.\nThe title indicates whether the order was approved or rejected. The body includes the order number, name, and approval result.\nClicking the message opens the corresponding order details.\nDo not send while approval is pending. Notify only once for the same approval result.\nA notification failure does not affect the saved approval result.",
|
|
190
|
+
},
|
|
191
|
+
email: {
|
|
192
|
+
label: 'Email',
|
|
193
|
+
text: "Add email to the existing order approval notifications, using the application's configured email channel.\n\nAfter an order is approved or rejected, send the result to the applicant's account email.\nInclude the order number in the subject and the order name and result in the body.\nKeep the existing in-app messages. If the applicant has no email address, send only the in-app message.\nAn email failure must not affect the approval result or in-app message.",
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
},
|
|
197
|
+
mail: {
|
|
198
|
+
title: 'Mail',
|
|
199
|
+
description:
|
|
200
|
+
'Connect personal mailboxes, then read, reply to, and send business email.',
|
|
201
|
+
prompts: {
|
|
202
|
+
mailCenter: {
|
|
203
|
+
label: 'Mail center',
|
|
204
|
+
text: 'Add a mail center and a mailbox account management entry to the application. Users can connect their own mailboxes, select a mailbox, synchronize incoming messages, read messages and attachments, and reply.\n\nWhen a sales representative receives a quotation request, they can reply from the mail center. Keep the original subject and conversation context, and address the reply to the original sender. Each user works with their own connected mailboxes.',
|
|
205
|
+
},
|
|
206
|
+
correspondence: {
|
|
207
|
+
label: 'Customer emails',
|
|
208
|
+
text: "Add a correspondence section to customer details. Show messages whose sender or recipient matches the current customer's contact email addresses. Sales representatives can read messages, view attachments, and reply using their own connected mailboxes.",
|
|
209
|
+
},
|
|
210
|
+
},
|
|
211
|
+
},
|
|
212
|
+
file: {
|
|
213
|
+
title: 'Files',
|
|
214
|
+
description:
|
|
215
|
+
'Upload files, attach them to records, and preview or download them.',
|
|
216
|
+
prompts: {
|
|
217
|
+
attachments: {
|
|
218
|
+
label: 'Attachments',
|
|
219
|
+
text: 'Add purchase attachments to my existing order management application.\n\nAdd an attachment area to order details. Each order can have multiple files, including PDF, images, and DOCX.\nShow filenames and sizes, with actions to preview, download, and remove attachments.\nAfter uploading, let users save the attachments to the current order. Keep them available when the order is reopened.\nAnyone with access to an order can view and download its attachments. Applicants and reviewers can add or remove attachments.\nRemoving an attachment only unlinks it from the current order; retain the file.',
|
|
220
|
+
},
|
|
221
|
+
avatar: {
|
|
222
|
+
label: 'Avatar',
|
|
223
|
+
text: 'Add an avatar to each employee, with one image per employee.\nSupport uploading and replacing the avatar, and show it in employee lists and details.\nUse the new avatar after replacement and keep it visible after refreshing the page.',
|
|
224
|
+
},
|
|
225
|
+
},
|
|
226
|
+
},
|
|
227
|
+
templatePrint: {
|
|
228
|
+
title: 'Template printing',
|
|
229
|
+
description:
|
|
230
|
+
'Fill business data into Word or Excel templates and generate files.',
|
|
231
|
+
prompts: {
|
|
232
|
+
approvalForm: {
|
|
233
|
+
label: 'Approval form',
|
|
234
|
+
text: "Add a “Generate approval form” action to order details.\n\nUse the Word template I provided to fill in the current order's number, purchase request, applicant, amount, approval result, and processing time.\nKeep the template's heading, table layout, and sign-off area. Name the output “Purchase-approval-order-number” and provide a Word download.\nAnyone with access to the order can generate its approval form. Use the current order data when generating the file.",
|
|
235
|
+
},
|
|
236
|
+
pdf: {
|
|
237
|
+
label: 'PDF output',
|
|
238
|
+
text: "Add PDF download for the purchase approval form, preserving the Word template's fonts, tables, and sign-off area.",
|
|
239
|
+
},
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
i18n: {
|
|
243
|
+
title: 'Languages',
|
|
244
|
+
description:
|
|
245
|
+
'Switch the interface language, add languages, and set the default one.',
|
|
246
|
+
prompts: {
|
|
247
|
+
addLanguage: {
|
|
248
|
+
label: 'Add a language',
|
|
249
|
+
text: 'Add Spanish to my application. Translate the interface and server messages, and add Spanish to the language menu.',
|
|
250
|
+
},
|
|
251
|
+
defaultLanguage: {
|
|
252
|
+
label: 'Default language',
|
|
253
|
+
text: "Make Simplified Chinese the application's default language for people who have not chosen one. Keep English available in the language menu.",
|
|
254
|
+
},
|
|
255
|
+
},
|
|
256
|
+
},
|
|
257
|
+
theme: {
|
|
258
|
+
title: 'Themes',
|
|
259
|
+
description:
|
|
260
|
+
'Adjust colors, fonts, and density, and switch between light and dark.',
|
|
261
|
+
prompts: {
|
|
262
|
+
changeTheme: {
|
|
263
|
+
label: 'Change a theme',
|
|
264
|
+
text: 'Update the Compact theme: use blue as the primary color and slightly increase the corner radius. Keep the current fonts, text sizes, and compact spacing.',
|
|
265
|
+
},
|
|
266
|
+
newTheme: {
|
|
267
|
+
label: 'New theme',
|
|
268
|
+
text: 'Create a Forest theme with green as the primary color, soft backgrounds, moderately rounded corners, and subtle shadows.',
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
},
|
|
274
|
+
|
|
275
|
+
appearance: {
|
|
276
|
+
title: 'Appearance',
|
|
277
|
+
mode: 'Color mode',
|
|
278
|
+
preset: 'Theme',
|
|
279
|
+
light: 'Light',
|
|
280
|
+
dark: 'Dark',
|
|
281
|
+
system: 'System',
|
|
282
|
+
themes: { default: 'Spacious', compact: 'Compact' },
|
|
283
|
+
},
|
|
284
|
+
app: {
|
|
285
|
+
title: 'NocoBase',
|
|
286
|
+
},
|
|
287
|
+
actions: {
|
|
288
|
+
close: 'Close',
|
|
289
|
+
save: 'Save',
|
|
290
|
+
cancel: 'Cancel',
|
|
291
|
+
confirm: 'Confirm',
|
|
292
|
+
language: 'Language',
|
|
293
|
+
},
|
|
294
|
+
notices: {
|
|
295
|
+
serverLocaleFallback:
|
|
296
|
+
'The server does not support this language, so server messages will use English.',
|
|
297
|
+
languageChangeFailed:
|
|
298
|
+
'Unable to complete the language change. Please try again.',
|
|
299
|
+
},
|
|
300
|
+
account: {
|
|
301
|
+
signOutFailed: 'Unable to sign out. Please try again.',
|
|
302
|
+
openMenu: 'Open account menu',
|
|
303
|
+
fallback: 'Account',
|
|
304
|
+
signOut: 'Sign out',
|
|
305
|
+
signingOut: 'Signing out…',
|
|
306
|
+
},
|
|
307
|
+
navigation: {
|
|
308
|
+
home: 'Home',
|
|
309
|
+
open: 'Open navigation',
|
|
310
|
+
close: 'Close navigation',
|
|
311
|
+
expand: 'Expand navigation',
|
|
312
|
+
collapse: 'Collapse navigation',
|
|
313
|
+
toggle: 'Expand or collapse navigation',
|
|
314
|
+
label: 'Application navigation',
|
|
315
|
+
description: 'Go to a page of this application.',
|
|
316
|
+
breadcrumb: 'Breadcrumb',
|
|
317
|
+
breadcrumbMore: 'Show the levels in between',
|
|
318
|
+
back: 'Back',
|
|
319
|
+
},
|
|
320
|
+
dataTable: {
|
|
321
|
+
noResults: 'No results.',
|
|
322
|
+
sortAscending: 'Asc',
|
|
323
|
+
sortDescending: 'Desc',
|
|
324
|
+
hideColumn: 'Hide',
|
|
325
|
+
view: 'View',
|
|
326
|
+
toggleColumns: 'Toggle columns',
|
|
327
|
+
selectedCount: '{{selected}} of {{total}} row(s) selected.',
|
|
328
|
+
rowsPerPage: 'Rows per page',
|
|
329
|
+
pageOf: 'Page {{page}} of {{pageCount}}',
|
|
330
|
+
firstPage: 'Go to first page',
|
|
331
|
+
previousPage: 'Go to previous page',
|
|
332
|
+
nextPage: 'Go to next page',
|
|
333
|
+
lastPage: 'Go to last page',
|
|
334
|
+
},
|
|
335
|
+
datePicker: {
|
|
336
|
+
placeholder: 'Pick a date',
|
|
337
|
+
rangePlaceholder: 'Pick a date range',
|
|
338
|
+
},
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
/** The shape every locale's system copy follows, derived from the English wording above. */
|
|
342
|
+
export type SystemResource = LocaleResource<typeof systemEnUS>;
|
|
343
|
+
|
|
344
|
+
export default systemEnUS;
|