@stapel/workspaces-react 0.17.0 → 0.19.1
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/CHANGELOG.md +218 -0
- package/README.md +39 -8
- package/dist/api/generated/schema.d.ts +187 -60
- package/dist/api/generated/schema.d.ts.map +1 -1
- package/dist/default/ActiveWorkspace.d.ts +43 -0
- package/dist/default/ActiveWorkspace.d.ts.map +1 -0
- package/dist/default/ActiveWorkspace.js +33 -0
- package/dist/default/ActiveWorkspace.js.map +1 -0
- package/dist/default/AuditTrailPane.d.ts +12 -0
- package/dist/default/AuditTrailPane.d.ts.map +1 -0
- package/dist/default/AuditTrailPane.js +154 -0
- package/dist/default/AuditTrailPane.js.map +1 -0
- package/dist/default/InvitationsPane.d.ts +19 -0
- package/dist/default/InvitationsPane.d.ts.map +1 -0
- package/dist/default/InvitationsPane.js +217 -0
- package/dist/default/InvitationsPane.js.map +1 -0
- package/dist/default/InviteAcceptPage.d.ts +7 -0
- package/dist/default/InviteAcceptPage.d.ts.map +1 -1
- package/dist/default/InviteAcceptPage.js +74 -38
- package/dist/default/InviteAcceptPage.js.map +1 -1
- package/dist/default/MembersManager.d.ts +12 -4
- package/dist/default/MembersManager.d.ts.map +1 -1
- package/dist/default/MembersManager.js +320 -84
- package/dist/default/MembersManager.js.map +1 -1
- package/dist/default/RoleSelectField.d.ts +64 -0
- package/dist/default/RoleSelectField.d.ts.map +1 -0
- package/dist/default/RoleSelectField.js +78 -0
- package/dist/default/RoleSelectField.js.map +1 -0
- package/dist/default/WorkspaceSettings.d.ts +7 -1
- package/dist/default/WorkspaceSettings.d.ts.map +1 -1
- package/dist/default/WorkspaceSettings.js +203 -45
- package/dist/default/WorkspaceSettings.js.map +1 -1
- package/dist/default/WorkspacesPage.d.ts +13 -0
- package/dist/default/WorkspacesPage.d.ts.map +1 -0
- package/dist/default/WorkspacesPage.js +109 -0
- package/dist/default/WorkspacesPage.js.map +1 -0
- package/dist/default/index.d.ts +28 -7
- package/dist/default/index.d.ts.map +1 -1
- package/dist/default/index.js +24 -7
- package/dist/default/index.js.map +1 -1
- package/dist/default/parts.d.ts +104 -0
- package/dist/default/parts.d.ts.map +1 -0
- package/dist/default/parts.js +143 -0
- package/dist/default/parts.js.map +1 -0
- package/dist/headless/Members.d.ts +59 -14
- package/dist/headless/Members.d.ts.map +1 -1
- package/dist/headless/Members.js +35 -10
- package/dist/headless/Members.js.map +1 -1
- package/dist/headless/RoleSelect.d.ts +9 -3
- package/dist/headless/RoleSelect.d.ts.map +1 -1
- package/dist/headless/RoleSelect.js +3 -2
- package/dist/headless/RoleSelect.js.map +1 -1
- package/dist/i18n/es.d.ts +11 -12
- package/dist/i18n/es.d.ts.map +1 -1
- package/dist/i18n/es.js +267 -14
- package/dist/i18n/es.js.map +1 -1
- package/dist/i18n/generated/errors.es.gen.d.ts.map +1 -1
- package/dist/i18n/generated/errors.es.gen.js +5 -0
- package/dist/i18n/generated/errors.es.gen.js.map +1 -1
- package/dist/i18n/generated/errors.gen.d.ts +30 -0
- package/dist/i18n/generated/errors.gen.d.ts.map +1 -1
- package/dist/i18n/generated/errors.gen.js +15 -0
- package/dist/i18n/generated/errors.gen.js.map +1 -1
- package/dist/i18n/generated/errors.ru.gen.d.ts.map +1 -1
- package/dist/i18n/generated/errors.ru.gen.js +5 -0
- package/dist/i18n/generated/errors.ru.gen.js.map +1 -1
- package/dist/i18n/keys.d.ts +209 -1
- package/dist/i18n/keys.d.ts.map +1 -1
- package/dist/i18n/keys.js +410 -4
- package/dist/i18n/keys.js.map +1 -1
- package/dist/i18n/ru.d.ts +7 -2
- package/dist/i18n/ru.d.ts.map +1 -1
- package/dist/i18n/ru.js +209 -4
- package/dist/i18n/ru.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/model/format.d.ts +56 -0
- package/dist/model/format.d.ts.map +1 -0
- package/dist/model/format.js +125 -0
- package/dist/model/format.js.map +1 -0
- package/dist/model/selection.d.ts +15 -0
- package/dist/model/selection.d.ts.map +1 -1
- package/dist/model/selection.js +18 -1
- package/dist/model/selection.js.map +1 -1
- package/dist/nav/manifest.d.ts +45 -0
- package/dist/nav/manifest.d.ts.map +1 -0
- package/dist/nav/manifest.js +77 -0
- package/dist/nav/manifest.js.map +1 -0
- package/llms.txt +11 -10
- package/manifest.json +281 -69
- package/package.json +18 -12
- package/src/analytics/generated/events.json +1 -1
- package/src/api/generated/schema.ts +187 -60
- package/src/default/ActiveWorkspace.tsx +97 -0
- package/src/default/AuditTrailPane.tsx +309 -0
- package/src/default/InvitationsPane.tsx +501 -0
- package/src/default/InviteAcceptPage.tsx +187 -90
- package/src/default/MembersManager.tsx +832 -222
- package/src/default/RoleSelectField.tsx +187 -0
- package/src/default/WorkspaceSettings.tsx +540 -125
- package/src/default/WorkspacesPage.tsx +394 -0
- package/src/default/index.ts +28 -7
- package/src/default/parts.tsx +315 -0
- package/src/headless/Members.tsx +84 -16
- package/src/headless/RoleSelect.tsx +12 -5
- package/src/i18n/es.ts +326 -14
- package/src/i18n/generated/errors.es.gen.ts +5 -0
- package/src/i18n/generated/errors.gen.ts +15 -0
- package/src/i18n/generated/errors.json +37 -0
- package/src/i18n/generated/errors.ru.gen.ts +5 -0
- package/src/i18n/keys.ts +462 -5
- package/src/i18n/ru.ts +259 -5
- package/src/index.ts +1 -0
- package/src/model/format.ts +158 -0
- package/src/model/selection.tsx +19 -1
- package/src/nav/manifest.ts +120 -0
- package/dist/default/ErrorAlert.d.ts +0 -8
- package/dist/default/ErrorAlert.d.ts.map +0 -1
- package/dist/default/ErrorAlert.js +0 -30
- package/dist/default/ErrorAlert.js.map +0 -1
- package/src/default/ErrorAlert.tsx +0 -47
package/src/i18n/keys.ts
CHANGED
|
@@ -9,13 +9,32 @@ import { workspacesErrorBundleEn } from "./generated/errors.gen.js";
|
|
|
9
9
|
* English fallbacks for both the backend error codes (generated) and the
|
|
10
10
|
* pair's own UI keys. Point core's `loadLocale` at stapel-translate to override
|
|
11
11
|
* per locale. Add UI keys under the `workspaces.` namespace as you build flows.
|
|
12
|
+
*
|
|
13
|
+
* COUNTS ARE PLURAL FAMILIES. A key named `*.count` is rendered with core's
|
|
14
|
+
* `useTPlural()`, which looks up `<key>.<CLDR category>` for the reader's
|
|
15
|
+
* language and falls back to the flat key. Every family therefore ships three
|
|
16
|
+
* spellings here — the flat fallback, `.one` and `.other` — and a language with
|
|
17
|
+
* more categories (Russian's `few`/`many`) adds them in its own bundle. This is
|
|
18
|
+
* what "1 workspace(s)" was standing in for.
|
|
12
19
|
*/
|
|
13
20
|
export const WORKSPACES_I18N_KEYS = {
|
|
14
21
|
unknownError: "workspaces.error.unknown",
|
|
15
22
|
// Retry affordance beside a stated failure — an error a person cannot act
|
|
16
23
|
// on is only half the message.
|
|
17
24
|
retry: "workspaces.retry",
|
|
18
|
-
|
|
25
|
+
/**
|
|
26
|
+
* The accessible name of a dialog's dismissal — the modal's close button and
|
|
27
|
+
* the bottom sheet's grab handle (`SkinDialog`'s required `dismissLabel`).
|
|
28
|
+
* Surface-neutral on purpose: the same dialog is a sheet on a phone and a
|
|
29
|
+
* modal on a tablet, and the word for "get me out of here" is the same one.
|
|
30
|
+
*/
|
|
31
|
+
dialogClose: "workspaces.dialog.close",
|
|
32
|
+
cancel: "workspaces.cancel",
|
|
33
|
+
// Anchor pagination (members / invitations / audit share one pager).
|
|
34
|
+
pagerPrev: "workspaces.pager.prev",
|
|
35
|
+
pagerNext: "workspaces.pager.next",
|
|
36
|
+
pagerPosition: "workspaces.pager.position",
|
|
37
|
+
// Workspace list (WorkspaceList headless + WorkspacesPage skin)
|
|
19
38
|
listLoading: "workspaces.list.loading",
|
|
20
39
|
listEmpty: "workspaces.list.empty",
|
|
21
40
|
/**
|
|
@@ -32,6 +51,7 @@ export const WORKSPACES_I18N_KEYS = {
|
|
|
32
51
|
membersEmpty: "workspaces.members.empty",
|
|
33
52
|
membersLoadFailed: "workspaces.members.load_failed",
|
|
34
53
|
rolesLoadFailed: "workspaces.roles.load_failed",
|
|
54
|
+
rolesEmpty: "workspaces.roles.empty",
|
|
35
55
|
membersInvite: "workspaces.members.invite",
|
|
36
56
|
membersInviting: "workspaces.members.inviting",
|
|
37
57
|
membersUpdateRole: "workspaces.members.update_role",
|
|
@@ -46,22 +66,126 @@ export const WORKSPACES_I18N_KEYS = {
|
|
|
46
66
|
fieldName: "workspaces.settings.field.name",
|
|
47
67
|
fieldSlug: "workspaces.settings.field.slug",
|
|
48
68
|
fieldType: "workspaces.settings.field.type",
|
|
69
|
+
typePersonal: "workspaces.settings.type.personal",
|
|
70
|
+
typeWork: "workspaces.settings.type.work",
|
|
49
71
|
save: "workspaces.settings.save",
|
|
50
72
|
// Why a settings control is switched off (core's `useActionGate`).
|
|
51
|
-
|
|
73
|
+
/** The caller's ROLE does not carry `workspace.update`. Not "you are not
|
|
74
|
+
* the owner": a deployment role can hold the capability without being one,
|
|
75
|
+
* and the server answers on the capability, so the screen says the same. */
|
|
76
|
+
blockedCannotManage: "workspaces.settings.blocked.cannot_manage",
|
|
52
77
|
blockedNameRequired: "workspaces.settings.blocked.name_required",
|
|
78
|
+
blockedUnchanged: "workspaces.settings.blocked.unchanged",
|
|
53
79
|
saving: "workspaces.settings.saving",
|
|
54
80
|
dangerZoneTitle: "workspaces.settings.danger_zone.title",
|
|
55
81
|
deleteWorkspace: "workspaces.settings.danger_zone.delete",
|
|
56
82
|
deleteWorkspaceConfirm: "workspaces.settings.danger_zone.delete_confirm",
|
|
83
|
+
deleteWorkspaceConfirmBody: "workspaces.settings.danger_zone.delete_confirm_body",
|
|
84
|
+
/** The refusal a workspace carries no CODE for — the belt under
|
|
85
|
+
* `delete_blocked_reason`, which is normally an `error.409.*` key the
|
|
86
|
+
* generated bundle already translates. */
|
|
87
|
+
deleteBlockedFallback: "workspaces.settings.danger_zone.blocked",
|
|
88
|
+
// Security card (WorkspaceSettings — the require_mfa policy, org-program §C3)
|
|
89
|
+
securityTitle: "workspaces.settings.security.title",
|
|
90
|
+
securitySubtitle: "workspaces.settings.security.subtitle",
|
|
91
|
+
securityRequireMfa: "workspaces.settings.security.require_mfa",
|
|
92
|
+
securityRequireMfaHint: "workspaces.settings.security.require_mfa_hint",
|
|
93
|
+
securityPoliciesLabel: "workspaces.settings.security.policies_label",
|
|
94
|
+
securityPoliciesHint: "workspaces.settings.security.policies_hint",
|
|
95
|
+
securityPolicyPasswordChange: "workspaces.settings.security.policy.password_change",
|
|
96
|
+
securityPolicyMfaEnroll: "workspaces.settings.security.policy.mfa_enroll",
|
|
97
|
+
securitySave: "workspaces.settings.security.save",
|
|
98
|
+
securitySaving: "workspaces.settings.security.saving",
|
|
99
|
+
securityBlockedCapability: "workspaces.settings.security.blocked.capability",
|
|
100
|
+
securityStepUpNotice: "workspaces.settings.security.step_up_notice",
|
|
101
|
+
// What the policy has actually ACHIEVED (MFAEnforcementStatus) — the
|
|
102
|
+
// difference between "somebody asked for MFA" and "MFA holds".
|
|
103
|
+
mfaStatusTitle: "workspaces.settings.security.mfa.status_title",
|
|
104
|
+
mfaStateLabel: "workspaces.settings.security.mfa.state_label",
|
|
105
|
+
mfaStatePending: "workspaces.settings.security.mfa.state.pending",
|
|
106
|
+
mfaStateEnforcing: "workspaces.settings.security.mfa.state.enforcing",
|
|
107
|
+
mfaStateEnforced: "workspaces.settings.security.mfa.state.enforced",
|
|
108
|
+
mfaStateFailed: "workspaces.settings.security.mfa.state.failed",
|
|
109
|
+
mfaStateOther: "workspaces.settings.security.mfa.state.other",
|
|
110
|
+
mfaCheckedCount: "workspaces.settings.security.mfa.checked_count",
|
|
111
|
+
mfaNoncompliantCount: "workspaces.settings.security.mfa.noncompliant_count",
|
|
112
|
+
mfaUnverifiedCount: "workspaces.settings.security.mfa.unverified_count",
|
|
113
|
+
mfaAttemptsCount: "workspaces.settings.security.mfa.attempts_count",
|
|
114
|
+
mfaLastAttempt: "workspaces.settings.security.mfa.last_attempt",
|
|
115
|
+
mfaCompletedAt: "workspaces.settings.security.mfa.completed_at",
|
|
116
|
+
mfaLastError: "workspaces.settings.security.mfa.last_error",
|
|
117
|
+
mfaUnverifiedHint: "workspaces.settings.security.mfa.unverified_hint",
|
|
118
|
+
mfaOffNotice: "workspaces.settings.security.mfa.off",
|
|
119
|
+
/** The policy IS on and the sweep has not reported yet — a different
|
|
120
|
+
* fact from "not required here", and the one the screen used to get
|
|
121
|
+
* wrong by deriving the sentence from the absence of a status. */
|
|
122
|
+
mfaNoStatusYet: "workspaces.settings.security.mfa.no_status_yet",
|
|
57
123
|
// Members manager (default skin — MembersManager)
|
|
58
124
|
membersTitle: "workspaces.members.title",
|
|
59
125
|
membersSubtitle: "workspaces.members.subtitle",
|
|
126
|
+
membersCount: "workspaces.members.count",
|
|
127
|
+
membersJoined: "workspaces.members.joined",
|
|
128
|
+
membersLastSeen: "workspaces.members.last_seen",
|
|
129
|
+
membersLastSeenNever: "workspaces.members.last_seen_never",
|
|
130
|
+
membersSearchPlaceholder: "workspaces.members.search_placeholder",
|
|
131
|
+
membersRolePickerLabel: "workspaces.members.role_picker_label",
|
|
132
|
+
membersBlockedReadOnly: "workspaces.members.blocked.read_only",
|
|
133
|
+
// The MFA evidence per member (`MemberResponse.mfa_compliant`): true /
|
|
134
|
+
// false / null, and null is a state of its own — nobody has asked yet.
|
|
135
|
+
membersMfaLabel: "workspaces.members.mfa_label",
|
|
136
|
+
membersMfaCompliant: "workspaces.members.mfa.compliant",
|
|
137
|
+
membersMfaNoncompliant: "workspaces.members.mfa.noncompliant",
|
|
138
|
+
membersMfaUnknown: "workspaces.members.mfa.unknown",
|
|
139
|
+
membersSuspended: "workspaces.members.suspended",
|
|
140
|
+
membersSuspendedNoMfa: "workspaces.members.suspended.no_mfa",
|
|
141
|
+
membersProvisioned: "workspaces.members.provisioned",
|
|
60
142
|
membersInviteDialogTitle: "workspaces.members.invite_dialog.title",
|
|
61
143
|
membersInviteEmailsLabel: "workspaces.members.invite_dialog.emails_label",
|
|
62
144
|
membersInviteEmailsPlaceholder: "workspaces.members.invite_dialog.emails_placeholder",
|
|
63
145
|
membersInviteRoleLabel: "workspaces.members.invite_dialog.role_label",
|
|
146
|
+
membersInviteNameLabel: "workspaces.members.invite_dialog.name_label",
|
|
147
|
+
membersInviteNamePlaceholder: "workspaces.members.invite_dialog.name_placeholder",
|
|
148
|
+
membersInviteSubmit: "workspaces.members.invite_dialog.submit",
|
|
149
|
+
// Why the invite dialog's submit is switched off (core's `useActionGate`).
|
|
150
|
+
membersInviteBlockedNoEmails: "workspaces.members.invite_dialog.blocked.no_emails",
|
|
151
|
+
membersInviteBlockedBadEmail: "workspaces.members.invite_dialog.blocked.bad_email",
|
|
64
152
|
membersRemoveConfirm: "workspaces.members.remove_confirm",
|
|
153
|
+
membersRemoveConfirmBody: "workspaces.members.remove_confirm_body",
|
|
154
|
+
/** Why a row's "Remove" is switched off: the backend's last-owner
|
|
155
|
+
* protection would refuse it, so the control never offers it. */
|
|
156
|
+
membersRemoveBlockedLastOwner: "workspaces.members.remove.blocked.last_owner",
|
|
157
|
+
/** Why a row's "Remove" is switched off on the READER's own row. Answered
|
|
158
|
+
* by the server (`MemberResponse.is_self`), never by comparing a session id
|
|
159
|
+
* this pair does not have. */
|
|
160
|
+
membersRemoveBlockedSelf: "workspaces.members.remove.blocked.self",
|
|
161
|
+
/**
|
|
162
|
+
* Reset a member's password on the organization's order. The endpoint is
|
|
163
|
+
* declared `high`, so the confirm says a step-up is coming BEFORE the
|
|
164
|
+
* click, and the one-shot credential is labelled as one — it is shown
|
|
165
|
+
* exactly once and can never be fetched again.
|
|
166
|
+
*/
|
|
167
|
+
membersResetPassword: "workspaces.members.reset_password",
|
|
168
|
+
/** Why "Reset password" is switched off on the READER's own row: the server
|
|
169
|
+
* answers a self-target with the same 404 it gives for a stranger, so an
|
|
170
|
+
* ungated button here reads its own refusal as "this member is gone". */
|
|
171
|
+
membersResetBlockedSelf: "workspaces.members.reset_password.blocked.self",
|
|
172
|
+
membersResetDialogTitle: "workspaces.members.reset_password_dialog.title",
|
|
173
|
+
membersResetDialogBody: "workspaces.members.reset_password_dialog.body",
|
|
174
|
+
membersResetStepUp: "workspaces.members.reset_password_dialog.step_up",
|
|
175
|
+
membersResetSubmit: "workspaces.members.reset_password_dialog.submit",
|
|
176
|
+
membersResetDone: "workspaces.members.reset_password_dialog.done",
|
|
177
|
+
membersResetGenerated: "workspaces.members.reset_password_dialog.generated",
|
|
178
|
+
membersResetGeneratedHint:
|
|
179
|
+
"workspaces.members.reset_password_dialog.generated_hint",
|
|
180
|
+
membersResetNotNotified:
|
|
181
|
+
"workspaces.members.reset_password_dialog.not_notified",
|
|
182
|
+
membersRename: "workspaces.members.rename",
|
|
183
|
+
membersRenameDialogTitle: "workspaces.members.rename_dialog.title",
|
|
184
|
+
membersRenameLabel: "workspaces.members.rename_dialog.label",
|
|
185
|
+
membersRenamePlaceholder: "workspaces.members.rename_dialog.placeholder",
|
|
186
|
+
membersRenameHint: "workspaces.members.rename_dialog.hint",
|
|
187
|
+
membersRenameSubmit: "workspaces.members.rename_dialog.submit",
|
|
188
|
+
membersRenameBlockedUnchanged: "workspaces.members.rename_dialog.blocked.unchanged",
|
|
65
189
|
roleOwner: "workspaces.members.role.owner",
|
|
66
190
|
roleAdmin: "workspaces.members.role.admin",
|
|
67
191
|
roleMember: "workspaces.members.role.member",
|
|
@@ -74,6 +198,83 @@ export const WORKSPACES_I18N_KEYS = {
|
|
|
74
198
|
roleLabelAdmin: "workspaces.role.admin",
|
|
75
199
|
roleLabelMember: "workspaces.role.member",
|
|
76
200
|
roleLabelViewer: "workspaces.role.viewer",
|
|
201
|
+
roleRankCaption: "workspaces.role.rank_caption",
|
|
202
|
+
// Workspaces page (default skin — WorkspacesPage over the WorkspaceList bag)
|
|
203
|
+
pageTitle: "workspaces.page.title",
|
|
204
|
+
pageSubtitle: "workspaces.page.subtitle",
|
|
205
|
+
listCount: "workspaces.list.count",
|
|
206
|
+
listMemberCount: "workspaces.list.member_count",
|
|
207
|
+
listOwnerLine: "workspaces.list.owner_line",
|
|
208
|
+
listYourRole: "workspaces.list.your_role",
|
|
209
|
+
listOpen: "workspaces.list.open",
|
|
210
|
+
listPreferredTag: "workspaces.list.preferred",
|
|
211
|
+
listSetPreferred: "workspaces.list.set_preferred",
|
|
212
|
+
listClearPreferred: "workspaces.list.clear_preferred",
|
|
213
|
+
listEmptyHint: "workspaces.list.empty_hint",
|
|
214
|
+
listGuestNotice: "workspaces.list.guest_notice",
|
|
215
|
+
listInstanceClosed: "workspaces.list.instance_closed",
|
|
216
|
+
listCreateDialogTitle: "workspaces.list.create_dialog.title",
|
|
217
|
+
listCreateNameLabel: "workspaces.list.create_dialog.name_label",
|
|
218
|
+
listCreateNamePlaceholder: "workspaces.list.create_dialog.name_placeholder",
|
|
219
|
+
listCreateSubmit: "workspaces.list.create_dialog.submit",
|
|
220
|
+
listCreateBlockedNoName: "workspaces.list.create_dialog.blocked.no_name",
|
|
221
|
+
listCreateBlockedPolicy: "workspaces.list.blocked.create_policy",
|
|
222
|
+
// Invitation administration (default skin — InvitationsPane, #109)
|
|
223
|
+
invitationsTitle: "workspaces.invitations.title",
|
|
224
|
+
invitationsSubtitle: "workspaces.invitations.subtitle",
|
|
225
|
+
invitationsCount: "workspaces.invitations.count",
|
|
226
|
+
invitationsEmpty: "workspaces.invitations.empty",
|
|
227
|
+
invitationsExpiresLabel: "workspaces.invitations.expires_label",
|
|
228
|
+
invitationsSentLabel: "workspaces.invitations.sent_label",
|
|
229
|
+
invitationsSentNever: "workspaces.invitations.sent_never",
|
|
230
|
+
invitationsSearchPlaceholder: "workspaces.invitations.search_placeholder",
|
|
231
|
+
invitationsFilterLabel: "workspaces.invitations.filter_label",
|
|
232
|
+
invitationsFilterPending: "workspaces.invitations.filter.pending",
|
|
233
|
+
invitationsFilterNeverAccepted: "workspaces.invitations.filter.never_accepted",
|
|
234
|
+
invitationsFilterAll: "workspaces.invitations.filter.all",
|
|
235
|
+
invitationsStatusPending: "workspaces.invitations.status.pending",
|
|
236
|
+
invitationsStatusAccepted: "workspaces.invitations.status.accepted",
|
|
237
|
+
invitationsStatusDeclined: "workspaces.invitations.status.declined",
|
|
238
|
+
invitationsStatusRevoked: "workspaces.invitations.status.revoked",
|
|
239
|
+
invitationsStatusExpired: "workspaces.invitations.status.expired",
|
|
240
|
+
invitationsResend: "workspaces.invitations.resend",
|
|
241
|
+
invitationsResendConfirm: "workspaces.invitations.resend_confirm",
|
|
242
|
+
invitationsResendConfirmBody: "workspaces.invitations.resend_confirm_body",
|
|
243
|
+
invitationsRevoke: "workspaces.invitations.revoke",
|
|
244
|
+
invitationsRevokeConfirm: "workspaces.invitations.revoke_confirm",
|
|
245
|
+
invitationsRevokeConfirmBody: "workspaces.invitations.revoke_confirm_body",
|
|
246
|
+
invitationsRename: "workspaces.invitations.rename",
|
|
247
|
+
invitationsRenameDialogTitle: "workspaces.invitations.rename_dialog.title",
|
|
248
|
+
invitationsBlockedTerminal: "workspaces.invitations.blocked.terminal",
|
|
249
|
+
invitationsBlockedResendTerminal: "workspaces.invitations.blocked.resend_terminal",
|
|
250
|
+
/** One sentence for the whole ROW — see `rowReasonKey` in InvitationsPane. */
|
|
251
|
+
invitationsBlockedRowClosed: "workspaces.invitations.blocked.row_closed",
|
|
252
|
+
invitationsBlockedRowResendOnly: "workspaces.invitations.blocked.row_resend_only",
|
|
253
|
+
// Membership history (default skin — AuditTrailPane, GET /{ws}/audit)
|
|
254
|
+
auditTitle: "workspaces.audit.title",
|
|
255
|
+
auditSubtitle: "workspaces.audit.subtitle",
|
|
256
|
+
auditEmpty: "workspaces.audit.empty",
|
|
257
|
+
auditFilterLabel: "workspaces.audit.filter_label",
|
|
258
|
+
auditFilterAll: "workspaces.audit.filter.all",
|
|
259
|
+
auditActorUnknown: "workspaces.audit.actor_unknown",
|
|
260
|
+
auditBy: "workspaces.audit.by",
|
|
261
|
+
auditRoleLine: "workspaces.audit.role_line",
|
|
262
|
+
// The CLOSED action vocabulary (`models.AuditAction`). A deployment on a
|
|
263
|
+
// newer backend can send one this bundle has no label for — the pane falls
|
|
264
|
+
// back to the raw action key, exactly as RoleSelect does for roles.
|
|
265
|
+
auditActionInvitationCreated: "workspaces.audit.action.invitation_created",
|
|
266
|
+
auditActionInvitationAccepted: "workspaces.audit.action.invitation_accepted",
|
|
267
|
+
auditActionInvitationRevoked: "workspaces.audit.action.invitation_revoked",
|
|
268
|
+
auditActionInvitationDeclined: "workspaces.audit.action.invitation_declined",
|
|
269
|
+
auditActionAccountCreatedByInvitation:
|
|
270
|
+
"workspaces.audit.action.account_created_by_invitation",
|
|
271
|
+
auditActionMemberJoined: "workspaces.audit.action.member_joined",
|
|
272
|
+
auditActionMemberProvisioned: "workspaces.audit.action.member_provisioned",
|
|
273
|
+
auditActionMemberRemoved: "workspaces.audit.action.member_removed",
|
|
274
|
+
auditActionMemberRoleChanged: "workspaces.audit.action.member_role_changed",
|
|
275
|
+
auditActionMemberSuspended: "workspaces.audit.action.member_suspended",
|
|
276
|
+
auditActionMemberUnsuspended: "workspaces.audit.action.member_unsuspended",
|
|
277
|
+
auditActionDeleted: "workspaces.audit.action.deleted",
|
|
77
278
|
// Invite accept flow (org-program §B4 — InviteAcceptFlow headless +
|
|
78
279
|
// InviteAcceptPage default skin), one key per flow screen.
|
|
79
280
|
inviteLoading: "workspaces.invite.loading",
|
|
@@ -82,12 +283,16 @@ export const WORKSPACES_I18N_KEYS = {
|
|
|
82
283
|
inviteEmailLine: "workspaces.invite.emailLine",
|
|
83
284
|
inviteJoinCta: "workspaces.invite.joinCta",
|
|
84
285
|
inviteDeclineCta: "workspaces.invite.declineCta",
|
|
286
|
+
inviteDeclineConfirm: "workspaces.invite.declineConfirm",
|
|
287
|
+
inviteDeclineConfirmBody: "workspaces.invite.declineConfirmBody",
|
|
85
288
|
inviteAccepted: "workspaces.invite.accepted",
|
|
86
289
|
inviteDeclined: "workspaces.invite.declined",
|
|
87
290
|
inviteUnavailableExpired: "workspaces.invite.unavailable.expired",
|
|
88
291
|
inviteUnavailableRevoked: "workspaces.invite.unavailable.revoked",
|
|
89
292
|
inviteUnavailableAccepted: "workspaces.invite.unavailable.accepted",
|
|
90
293
|
inviteUnavailableDeclined: "workspaces.invite.unavailable.declined",
|
|
294
|
+
inviteUnavailableNextStep: "workspaces.invite.unavailable.next_step",
|
|
295
|
+
inviteExitCta: "workspaces.invite.exitCta",
|
|
91
296
|
inviteWrongAccount: "workspaces.invite.wrongAccount",
|
|
92
297
|
inviteWrongAccountHint: "workspaces.invite.wrongAccountHint",
|
|
93
298
|
inviteSwitchAccountCta: "workspaces.invite.switchAccountCta",
|
|
@@ -100,6 +305,26 @@ export const WORKSPACES_I18N_KEYS = {
|
|
|
100
305
|
inviteRetryCta: "workspaces.invite.retryCta",
|
|
101
306
|
inviteBasicDataTitle: "workspaces.invite.basicDataTitle",
|
|
102
307
|
inviteBasicDataContinueCta: "workspaces.invite.basicDataContinueCta",
|
|
308
|
+
inviteBlockedBusy: "workspaces.invite.blocked.busy",
|
|
309
|
+
/**
|
|
310
|
+
* A workspace-scoped screen mounted from the nav manifest, with no active
|
|
311
|
+
* workspace to be about. The active workspace is runtime state (the
|
|
312
|
+
* selection the container writes), not a route param, so "there is none
|
|
313
|
+
* yet" is a state every such screen can reach — and it is drawn, never
|
|
314
|
+
* blank. Two different sentences, because they are two different
|
|
315
|
+
* situations: nothing is SELECTED vs the person belongs to nothing.
|
|
316
|
+
*/
|
|
317
|
+
activeChooseTitle: "workspaces.active.choose.title",
|
|
318
|
+
activeChooseHint: "workspaces.active.choose.hint",
|
|
319
|
+
activeNoneTitle: "workspaces.active.none.title",
|
|
320
|
+
activeNoneHint: "workspaces.active.none.hint",
|
|
321
|
+
// Nav manifest labels (the scripted-fullstack nav contract)
|
|
322
|
+
navWorkspaces: "workspaces.nav.workspaces",
|
|
323
|
+
navSettings: "workspaces.nav.settings",
|
|
324
|
+
navMembers: "workspaces.nav.members",
|
|
325
|
+
navInvitations: "workspaces.nav.invitations",
|
|
326
|
+
navAudit: "workspaces.nav.audit",
|
|
327
|
+
navInvite: "workspaces.nav.invite",
|
|
103
328
|
} as const;
|
|
104
329
|
|
|
105
330
|
export type WorkspacesI18nKey =
|
|
@@ -119,6 +344,11 @@ export const workspacesI18nBundleEn: I18nDictionary = {
|
|
|
119
344
|
// workspaces-react UI
|
|
120
345
|
"workspaces.error.unknown": "Something went wrong. Please try again.",
|
|
121
346
|
"workspaces.retry": "Try again",
|
|
347
|
+
"workspaces.dialog.close": "Close",
|
|
348
|
+
"workspaces.cancel": "Cancel",
|
|
349
|
+
"workspaces.pager.prev": "Previous",
|
|
350
|
+
"workspaces.pager.next": "Next",
|
|
351
|
+
"workspaces.pager.position": "Page {page}",
|
|
122
352
|
"workspaces.list.loading": "Loading workspaces…",
|
|
123
353
|
"workspaces.list.empty": "No workspaces yet.",
|
|
124
354
|
"workspaces.list.load_failed":
|
|
@@ -129,7 +359,9 @@ export const workspacesI18nBundleEn: I18nDictionary = {
|
|
|
129
359
|
"workspaces.members.empty": "No members yet.",
|
|
130
360
|
"workspaces.members.load_failed": "We could not load the member list.",
|
|
131
361
|
"workspaces.roles.load_failed":
|
|
132
|
-
"We could not load the role list, so
|
|
362
|
+
"We could not load the role list, so roles cannot be changed right now. This does not mean the workspace has no roles.",
|
|
363
|
+
"workspaces.roles.empty":
|
|
364
|
+
"This installation defines no roles, so there is nothing to choose from.",
|
|
133
365
|
"workspaces.members.invite": "Invite",
|
|
134
366
|
"workspaces.members.inviting": "Inviting…",
|
|
135
367
|
"workspaces.members.update_role": "Change role",
|
|
@@ -142,21 +374,130 @@ export const workspacesI18nBundleEn: I18nDictionary = {
|
|
|
142
374
|
"workspaces.settings.field.name": "Workspace name",
|
|
143
375
|
"workspaces.settings.field.slug": "URL slug",
|
|
144
376
|
"workspaces.settings.field.type": "Type",
|
|
377
|
+
"workspaces.settings.type.personal": "Personal",
|
|
378
|
+
"workspaces.settings.type.work": "Work",
|
|
145
379
|
"workspaces.settings.save": "Save changes",
|
|
146
|
-
"workspaces.settings.blocked.
|
|
147
|
-
"
|
|
380
|
+
"workspaces.settings.blocked.cannot_manage":
|
|
381
|
+
"Your role cannot change this workspace's settings.",
|
|
148
382
|
"workspaces.settings.blocked.name_required": "Enter a workspace name.",
|
|
383
|
+
"workspaces.settings.blocked.unchanged": "Nothing has changed yet.",
|
|
149
384
|
"workspaces.settings.saving": "Saving…",
|
|
150
385
|
"workspaces.settings.danger_zone.title": "Danger zone",
|
|
151
386
|
"workspaces.settings.danger_zone.delete": "Delete workspace",
|
|
152
387
|
"workspaces.settings.danger_zone.delete_confirm": "Delete this workspace? This can't be undone.",
|
|
388
|
+
"workspaces.settings.danger_zone.delete_confirm_body":
|
|
389
|
+
"Everyone loses access immediately. Other services keep what they hold for this workspace under their own retention rules.",
|
|
390
|
+
"workspaces.settings.danger_zone.blocked": "This workspace cannot be deleted.",
|
|
391
|
+
"workspaces.settings.security.title": "Security",
|
|
392
|
+
"workspaces.settings.security.subtitle":
|
|
393
|
+
"Rules everyone in this workspace has to meet.",
|
|
394
|
+
"workspaces.settings.security.require_mfa": "Require two-factor authentication",
|
|
395
|
+
"workspaces.settings.security.require_mfa_hint":
|
|
396
|
+
"Members without a confirmed second factor are not admitted until they add one.",
|
|
397
|
+
"workspaces.settings.security.policies_label":
|
|
398
|
+
"First-login steps for accounts this workspace creates",
|
|
399
|
+
"workspaces.settings.security.policies_hint":
|
|
400
|
+
"Independent demands, not alternatives — an organization may ask for both.",
|
|
401
|
+
"workspaces.settings.security.policy.password_change": "Change the password",
|
|
402
|
+
"workspaces.settings.security.policy.mfa_enroll": "Set up two-factor authentication",
|
|
403
|
+
"workspaces.settings.security.save": "Save security settings",
|
|
404
|
+
"workspaces.settings.security.saving": "Saving…",
|
|
405
|
+
"workspaces.settings.security.blocked.capability":
|
|
406
|
+
"Your role cannot change security settings.",
|
|
407
|
+
"workspaces.settings.security.step_up_notice":
|
|
408
|
+
"You will be asked to confirm your identity before this is saved.",
|
|
409
|
+
"workspaces.settings.security.mfa.status_title": "Enforcement",
|
|
410
|
+
"workspaces.settings.security.mfa.state_label": "State",
|
|
411
|
+
"workspaces.settings.security.mfa.state.pending": "Waiting for the first check",
|
|
412
|
+
"workspaces.settings.security.mfa.state.enforcing": "Checking members",
|
|
413
|
+
"workspaces.settings.security.mfa.state.enforced": "In force",
|
|
414
|
+
"workspaces.settings.security.mfa.state.failed": "The last check failed",
|
|
415
|
+
"workspaces.settings.security.mfa.state.other": "Unrecognized state ({state})",
|
|
416
|
+
"workspaces.settings.security.mfa.checked_count": "{count} members checked",
|
|
417
|
+
"workspaces.settings.security.mfa.checked_count.one": "{count} member checked",
|
|
418
|
+
"workspaces.settings.security.mfa.checked_count.other": "{count} members checked",
|
|
419
|
+
"workspaces.settings.security.mfa.noncompliant_count":
|
|
420
|
+
"{count} suspended for having no second factor",
|
|
421
|
+
"workspaces.settings.security.mfa.noncompliant_count.one":
|
|
422
|
+
"{count} member suspended for having no second factor",
|
|
423
|
+
"workspaces.settings.security.mfa.noncompliant_count.other":
|
|
424
|
+
"{count} members suspended for having no second factor",
|
|
425
|
+
"workspaces.settings.security.mfa.unverified_count": "{count} still unverified",
|
|
426
|
+
"workspaces.settings.security.mfa.unverified_count.one": "{count} member still unverified",
|
|
427
|
+
"workspaces.settings.security.mfa.unverified_count.other": "{count} members still unverified",
|
|
428
|
+
"workspaces.settings.security.mfa.attempts_count": "{count} checks so far",
|
|
429
|
+
"workspaces.settings.security.mfa.attempts_count.one": "{count} check so far",
|
|
430
|
+
"workspaces.settings.security.mfa.attempts_count.other": "{count} checks so far",
|
|
431
|
+
"workspaces.settings.security.mfa.last_attempt": "Last check {date}",
|
|
432
|
+
"workspaces.settings.security.mfa.completed_at": "Fully covered since {date}",
|
|
433
|
+
"workspaces.settings.security.mfa.last_error": "Last error: {error}",
|
|
434
|
+
"workspaces.settings.security.mfa.unverified_hint":
|
|
435
|
+
"Unverified members are not admitted while the policy is on. Ask them to add a second factor — the number to get to zero is above.",
|
|
436
|
+
"workspaces.settings.security.mfa.off":
|
|
437
|
+
"Two-factor authentication is not required in this workspace.",
|
|
438
|
+
"workspaces.settings.security.mfa.no_status_yet":
|
|
439
|
+
"Two-factor authentication is required here. No check has run yet, so nobody has been confirmed.",
|
|
153
440
|
"workspaces.members.title": "Members",
|
|
154
441
|
"workspaces.members.subtitle": "Manage who has access to this workspace.",
|
|
442
|
+
"workspaces.members.count": "{count} members",
|
|
443
|
+
"workspaces.members.count.one": "{count} member",
|
|
444
|
+
"workspaces.members.count.other": "{count} members",
|
|
445
|
+
"workspaces.members.joined": "Joined {date}",
|
|
446
|
+
"workspaces.members.last_seen": "Last seen {date}",
|
|
447
|
+
"workspaces.members.last_seen_never": "Has not opened this workspace yet",
|
|
448
|
+
"workspaces.members.search_placeholder": "Search by name or email",
|
|
449
|
+
"workspaces.members.role_picker_label": "Role of {member}",
|
|
450
|
+
"workspaces.members.blocked.read_only":
|
|
451
|
+
"You can see who is here, but not change it.",
|
|
452
|
+
"workspaces.members.mfa_label": "Two-factor",
|
|
453
|
+
"workspaces.members.mfa.compliant": "Confirmed",
|
|
454
|
+
"workspaces.members.mfa.noncompliant": "Missing",
|
|
455
|
+
"workspaces.members.mfa.unknown": "Not checked yet",
|
|
456
|
+
"workspaces.members.suspended": "Suspended",
|
|
457
|
+
"workspaces.members.suspended.no_mfa":
|
|
458
|
+
"Suspended until a second factor is confirmed.",
|
|
459
|
+
"workspaces.members.provisioned": "Created by an admin",
|
|
155
460
|
"workspaces.members.invite_dialog.title": "Invite members",
|
|
156
461
|
"workspaces.members.invite_dialog.emails_label": "Emails",
|
|
157
462
|
"workspaces.members.invite_dialog.emails_placeholder": "Type an email and press Enter",
|
|
158
463
|
"workspaces.members.invite_dialog.role_label": "Role",
|
|
464
|
+
"workspaces.members.invite_dialog.name_label": "Name (optional)",
|
|
465
|
+
"workspaces.members.invite_dialog.name_placeholder": "Shown until they set their own",
|
|
466
|
+
"workspaces.members.invite_dialog.submit": "Send invitations",
|
|
467
|
+
"workspaces.members.invite_dialog.blocked.no_emails":
|
|
468
|
+
"Enter at least one email address.",
|
|
469
|
+
"workspaces.members.invite_dialog.blocked.bad_email":
|
|
470
|
+
"{email} is not an email address.",
|
|
159
471
|
"workspaces.members.remove_confirm": "Remove this member?",
|
|
472
|
+
"workspaces.members.remove_confirm_body":
|
|
473
|
+
"{member} loses access to this workspace right away. You can invite them again later.",
|
|
474
|
+
"workspaces.members.remove.blocked.last_owner":
|
|
475
|
+
"This is the workspace's only owner. Give someone else the owner role first.",
|
|
476
|
+
"workspaces.members.remove.blocked.self":
|
|
477
|
+
"This is you. Ask another owner or admin to remove you from the workspace.",
|
|
478
|
+
"workspaces.members.reset_password": "Reset password",
|
|
479
|
+
"workspaces.members.reset_password.blocked.self":
|
|
480
|
+
"This is you. Change your own password in your account settings — this acts on somebody else's account.",
|
|
481
|
+
"workspaces.members.reset_password_dialog.title": "Reset the password of {member}?",
|
|
482
|
+
"workspaces.members.reset_password_dialog.body":
|
|
483
|
+
"Their current password stops working straight away, and they are told you did it. The letter never carries the new password.",
|
|
484
|
+
"workspaces.members.reset_password_dialog.step_up":
|
|
485
|
+
"You will be asked to confirm it is you before this goes through.",
|
|
486
|
+
"workspaces.members.reset_password_dialog.submit": "Reset password",
|
|
487
|
+
"workspaces.members.reset_password_dialog.done": "{member} has a new password.",
|
|
488
|
+
"workspaces.members.reset_password_dialog.generated": "One-time password",
|
|
489
|
+
"workspaces.members.reset_password_dialog.generated_hint":
|
|
490
|
+
"Shown once and never again. Hand it over through a channel you trust; they set their own the first time they sign in.",
|
|
491
|
+
"workspaces.members.reset_password_dialog.not_notified":
|
|
492
|
+
"There was no channel to tell them on, so tell them yourself.",
|
|
493
|
+
"workspaces.members.rename": "Rename",
|
|
494
|
+
"workspaces.members.rename_dialog.title": "Correct the name",
|
|
495
|
+
"workspaces.members.rename_dialog.label": "Display name",
|
|
496
|
+
"workspaces.members.rename_dialog.placeholder": "Leave empty to clear the name",
|
|
497
|
+
"workspaces.members.rename_dialog.hint":
|
|
498
|
+
"This is the person's name across the product, not a note kept in this workspace.",
|
|
499
|
+
"workspaces.members.rename_dialog.submit": "Save name",
|
|
500
|
+
"workspaces.members.rename_dialog.blocked.unchanged": "Change the name first.",
|
|
160
501
|
"workspaces.members.role.owner": "Owner",
|
|
161
502
|
"workspaces.members.role.admin": "Admin",
|
|
162
503
|
"workspaces.members.role.member": "Member",
|
|
@@ -167,6 +508,99 @@ export const workspacesI18nBundleEn: I18nDictionary = {
|
|
|
167
508
|
"workspaces.role.admin": "Admin",
|
|
168
509
|
"workspaces.role.member": "Member",
|
|
169
510
|
"workspaces.role.viewer": "Viewer",
|
|
511
|
+
"workspaces.role.rank_caption": "Rank {rank}",
|
|
512
|
+
|
|
513
|
+
// Workspaces page
|
|
514
|
+
"workspaces.page.title": "Workspaces",
|
|
515
|
+
"workspaces.page.subtitle": "Every workspace you belong to.",
|
|
516
|
+
"workspaces.list.count": "{count} workspaces",
|
|
517
|
+
"workspaces.list.count.one": "{count} workspace",
|
|
518
|
+
"workspaces.list.count.other": "{count} workspaces",
|
|
519
|
+
"workspaces.list.member_count": "{count} members",
|
|
520
|
+
"workspaces.list.member_count.one": "{count} member",
|
|
521
|
+
"workspaces.list.member_count.other": "{count} members",
|
|
522
|
+
"workspaces.list.owner_line": "Owned by {owner}",
|
|
523
|
+
"workspaces.list.your_role": "Your role",
|
|
524
|
+
"workspaces.list.open": "Open",
|
|
525
|
+
"workspaces.list.preferred": "Home",
|
|
526
|
+
"workspaces.list.set_preferred": "Make home",
|
|
527
|
+
"workspaces.list.clear_preferred": "Clear home",
|
|
528
|
+
"workspaces.list.empty_hint":
|
|
529
|
+
"Create one to invite people and keep your work together.",
|
|
530
|
+
"workspaces.list.guest_notice":
|
|
531
|
+
"You are here as a guest. Guests can open what they were sent, but do not belong to a workspace.",
|
|
532
|
+
"workspaces.list.instance_closed":
|
|
533
|
+
"Ask whoever runs this installation for an invitation.",
|
|
534
|
+
"workspaces.list.create_dialog.title": "New workspace",
|
|
535
|
+
"workspaces.list.create_dialog.name_label": "Name",
|
|
536
|
+
"workspaces.list.create_dialog.name_placeholder": "e.g. Acme Engineering",
|
|
537
|
+
"workspaces.list.create_dialog.submit": "Create workspace",
|
|
538
|
+
"workspaces.list.create_dialog.blocked.no_name": "Enter a name.",
|
|
539
|
+
"workspaces.list.blocked.create_policy":
|
|
540
|
+
"This installation only lets its owner create workspaces.",
|
|
541
|
+
|
|
542
|
+
// Invitation administration
|
|
543
|
+
"workspaces.invitations.title": "Invitations",
|
|
544
|
+
"workspaces.invitations.subtitle": "Who has been invited and has not joined yet.",
|
|
545
|
+
"workspaces.invitations.count": "{count} invitations",
|
|
546
|
+
"workspaces.invitations.count.one": "{count} invitation",
|
|
547
|
+
"workspaces.invitations.count.other": "{count} invitations",
|
|
548
|
+
"workspaces.invitations.empty": "Nobody is waiting on an invitation.",
|
|
549
|
+
"workspaces.invitations.expires_label": "Expires",
|
|
550
|
+
"workspaces.invitations.sent_label": "Last sent",
|
|
551
|
+
"workspaces.invitations.sent_never": "No letter sent yet",
|
|
552
|
+
"workspaces.invitations.search_placeholder": "Search by email",
|
|
553
|
+
"workspaces.invitations.filter_label": "Show",
|
|
554
|
+
"workspaces.invitations.filter.pending": "Waiting",
|
|
555
|
+
"workspaces.invitations.filter.never_accepted": "Never accepted",
|
|
556
|
+
"workspaces.invitations.filter.all": "All",
|
|
557
|
+
"workspaces.invitations.status.pending": "Waiting",
|
|
558
|
+
"workspaces.invitations.status.accepted": "Accepted",
|
|
559
|
+
"workspaces.invitations.status.declined": "Declined",
|
|
560
|
+
"workspaces.invitations.status.revoked": "Revoked",
|
|
561
|
+
"workspaces.invitations.status.expired": "Expired",
|
|
562
|
+
"workspaces.invitations.resend": "Resend",
|
|
563
|
+
"workspaces.invitations.resend_confirm": "Send the invitation again?",
|
|
564
|
+
"workspaces.invitations.resend_confirm_body":
|
|
565
|
+
"A fresh link goes out to {email} and the earlier one stops working.",
|
|
566
|
+
"workspaces.invitations.revoke": "Revoke",
|
|
567
|
+
"workspaces.invitations.revoke_confirm": "Withdraw this invitation?",
|
|
568
|
+
"workspaces.invitations.revoke_confirm_body":
|
|
569
|
+
"The link to {email} stops working. Nobody is told; you can invite them again later.",
|
|
570
|
+
"workspaces.invitations.rename": "Rename",
|
|
571
|
+
"workspaces.invitations.rename_dialog.title": "Correct the invitee's name",
|
|
572
|
+
"workspaces.invitations.blocked.terminal":
|
|
573
|
+
"This invitation was already accepted, declined, revoked or expired.",
|
|
574
|
+
"workspaces.invitations.blocked.resend_terminal":
|
|
575
|
+
"Only a waiting or expired invitation can be sent again.",
|
|
576
|
+
"workspaces.invitations.blocked.row_closed":
|
|
577
|
+
"This invitation is closed — there is nothing left to do with it.",
|
|
578
|
+
"workspaces.invitations.blocked.row_resend_only":
|
|
579
|
+
"This invitation has run out. Sending it again is the only thing left to do.",
|
|
580
|
+
|
|
581
|
+
// Membership history
|
|
582
|
+
"workspaces.audit.title": "Membership history",
|
|
583
|
+
"workspaces.audit.subtitle":
|
|
584
|
+
"Who let this person in, who took them out, and when.",
|
|
585
|
+
"workspaces.audit.empty": "Nothing has happened here yet.",
|
|
586
|
+
"workspaces.audit.filter_label": "Event",
|
|
587
|
+
"workspaces.audit.filter.all": "All events",
|
|
588
|
+
"workspaces.audit.actor_unknown": "The system",
|
|
589
|
+
"workspaces.audit.by": "by {actor}",
|
|
590
|
+
"workspaces.audit.role_line": "Role: {role}",
|
|
591
|
+
"workspaces.audit.action.invitation_created": "Invitation sent",
|
|
592
|
+
"workspaces.audit.action.invitation_accepted": "Invitation accepted",
|
|
593
|
+
"workspaces.audit.action.invitation_revoked": "Invitation revoked",
|
|
594
|
+
"workspaces.audit.action.invitation_declined": "Invitation declined",
|
|
595
|
+
"workspaces.audit.action.account_created_by_invitation":
|
|
596
|
+
"Account created from an invitation",
|
|
597
|
+
"workspaces.audit.action.member_joined": "Joined the workspace",
|
|
598
|
+
"workspaces.audit.action.member_provisioned": "Added by an admin",
|
|
599
|
+
"workspaces.audit.action.member_removed": "Removed from the workspace",
|
|
600
|
+
"workspaces.audit.action.member_role_changed": "Role changed",
|
|
601
|
+
"workspaces.audit.action.member_suspended": "Access suspended",
|
|
602
|
+
"workspaces.audit.action.member_unsuspended": "Access restored",
|
|
603
|
+
"workspaces.audit.action.deleted": "Workspace deleted",
|
|
170
604
|
|
|
171
605
|
// Invite accept flow (org-program §B4)
|
|
172
606
|
"workspaces.invite.loading": "Loading invitation…",
|
|
@@ -175,12 +609,18 @@ export const workspacesI18nBundleEn: I18nDictionary = {
|
|
|
175
609
|
"workspaces.invite.emailLine": "Invitation for {email}",
|
|
176
610
|
"workspaces.invite.joinCta": "Join workspace",
|
|
177
611
|
"workspaces.invite.declineCta": "Decline",
|
|
612
|
+
"workspaces.invite.declineConfirm": "Decline this invitation?",
|
|
613
|
+
"workspaces.invite.declineConfirmBody":
|
|
614
|
+
"The workspace is told you said no and the link stops working. Ask for a new invitation if you change your mind.",
|
|
178
615
|
"workspaces.invite.accepted": "You've joined {workspace}.",
|
|
179
616
|
"workspaces.invite.declined": "Invitation declined.",
|
|
180
617
|
"workspaces.invite.unavailable.expired": "This invitation has expired. Ask for a new one.",
|
|
181
618
|
"workspaces.invite.unavailable.revoked": "This invitation was revoked.",
|
|
182
619
|
"workspaces.invite.unavailable.accepted": "This invitation has already been used.",
|
|
183
620
|
"workspaces.invite.unavailable.declined": "This invitation was declined.",
|
|
621
|
+
"workspaces.invite.unavailable.next_step":
|
|
622
|
+
"Ask an administrator of {workspace} to send you a new invitation.",
|
|
623
|
+
"workspaces.invite.exitCta": "Go to your workspaces",
|
|
184
624
|
"workspaces.invite.wrongAccount": "This invitation is for a different account",
|
|
185
625
|
"workspaces.invite.wrongAccountHint":
|
|
186
626
|
"You're signed in as {email}, but the invitation was sent to {invited}. Switch accounts to continue.",
|
|
@@ -195,6 +635,23 @@ export const workspacesI18nBundleEn: I18nDictionary = {
|
|
|
195
635
|
"workspaces.invite.retryCta": "Try again",
|
|
196
636
|
"workspaces.invite.basicDataTitle": "Set up your profile",
|
|
197
637
|
"workspaces.invite.basicDataContinueCta": "Continue",
|
|
638
|
+
"workspaces.invite.blocked.busy": "Finishing the step already under way…",
|
|
639
|
+
|
|
640
|
+
// A workspace-scoped screen with no active workspace
|
|
641
|
+
"workspaces.active.choose.title": "Choose a workspace",
|
|
642
|
+
"workspaces.active.choose.hint":
|
|
643
|
+
"This screen manages one workspace at a time. Pick one on the Workspaces page and come back.",
|
|
644
|
+
"workspaces.active.none.title": "You are not in a workspace yet",
|
|
645
|
+
"workspaces.active.none.hint":
|
|
646
|
+
"Create one, or ask an owner to invite you — then there will be something to manage here.",
|
|
647
|
+
|
|
648
|
+
// Nav manifest labels
|
|
649
|
+
"workspaces.nav.workspaces": "Workspaces",
|
|
650
|
+
"workspaces.nav.settings": "Workspace",
|
|
651
|
+
"workspaces.nav.members": "Members",
|
|
652
|
+
"workspaces.nav.invitations": "Invitations",
|
|
653
|
+
"workspaces.nav.audit": "History",
|
|
654
|
+
"workspaces.nav.invite": "Invitation",
|
|
198
655
|
};
|
|
199
656
|
|
|
200
657
|
/**
|