@strapi/admin 4.3.0-beta.2 → 4.3.0

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.
Files changed (94) hide show
  1. package/admin/src/components/LeftMenu/index.js +12 -2
  2. package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +4 -3
  3. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/cleanData.js +0 -8
  4. package/admin/src/content-manager/components/PreviewWysiwyg/Wrapper.js +7 -13
  5. package/admin/src/content-manager/hooks/useFetchContentTypeLayout/index.js +2 -2
  6. package/admin/src/content-manager/pages/EditSettingsView/components/ModalForm.js +2 -2
  7. package/admin/src/content-manager/pages/ListView/FieldPicker/index.js +9 -1
  8. package/admin/src/content-manager/utils/removeKeyInObject.js +0 -4
  9. package/admin/src/index.js +1 -1
  10. package/admin/src/pages/Admin/index.js +6 -2
  11. package/admin/src/pages/App/index.js +4 -0
  12. package/admin/src/pages/InstalledPluginsPage/Plugins.js +10 -2
  13. package/admin/src/pages/ProfilePage/index.js +19 -18
  14. package/admin/src/pages/SettingsPage/pages/Users/EditPage/utils/layout.js +3 -1
  15. package/admin/src/pages/SettingsPage/pages/Users/ListPage/DynamicTable/TableRows/index.js +1 -1
  16. package/admin/src/pages/SettingsPage/pages/Users/ListPage/utils/tableHeaders.js +18 -4
  17. package/admin/src/pages/SettingsPage/pages/Users/components/SelectRoles/index.js +4 -1
  18. package/admin/src/translations/en.json +36 -0
  19. package/admin/src/translations/gu.json +618 -0
  20. package/admin/src/translations/languageNativeNames.js +2 -0
  21. package/admin/src/translations/ml.json +699 -0
  22. package/admin/src/translations/zh-Hans.json +55 -8
  23. package/build/{9262.25aa12a5.chunk.js → 1669.341e10d8.chunk.js} +1 -1
  24. package/build/3332.1e443103.chunk.js +102 -0
  25. package/build/{5520.9dcd6a9f.chunk.js → 5520.3c6bf86a.chunk.js} +35 -35
  26. package/build/{9166.5c585d7c.chunk.js → 8655.9073e17e.chunk.js} +59 -58
  27. package/build/{8773.16dea88d.chunk.js → 8773.1b2ec266.chunk.js} +6 -6
  28. package/build/9730.8fbe43ee.chunk.js +12 -0
  29. package/build/9799.ce46400f.chunk.js +760 -0
  30. package/build/Admin-authenticatedApp.ea608aff.chunk.js +80 -0
  31. package/build/{2336.cb1c0d6e.chunk.js → Admin_InternalErrorPage.25c53284.chunk.js} +1 -1
  32. package/build/{Admin_homePage.e3571a75.chunk.js → Admin_homePage.118926e0.chunk.js} +1 -1
  33. package/build/{Admin_marketplace.284bf8fc.chunk.js → Admin_marketplace.8efd3fd0.chunk.js} +1 -1
  34. package/build/Admin_pluginsPage.0992c2b5.chunk.js +1 -0
  35. package/build/Admin_profilePage.35ce8e94.chunk.js +15 -0
  36. package/build/Admin_settingsPage.5fc517d7.chunk.js +178 -0
  37. package/build/admin-app.1bd5f67e.chunk.js +112 -0
  38. package/build/{admin-edit-roles-page.33647266.chunk.js → admin-edit-roles-page.358d98c1.chunk.js} +1 -1
  39. package/build/admin-edit-users.714863af.chunk.js +10 -0
  40. package/build/admin-users.2bd6fb37.chunk.js +11 -0
  41. package/build/{api-tokens-create-page.efa1d2aa.chunk.js → api-tokens-create-page.442e3be0.chunk.js} +1 -1
  42. package/build/{api-tokens-edit-page.6101f051.chunk.js → api-tokens-edit-page.5f34eec7.chunk.js} +1 -1
  43. package/build/{api-tokens-list-page.782e872f.chunk.js → api-tokens-list-page.5ea3f6ce.chunk.js} +1 -1
  44. package/build/{content-manager.adf6fc82.chunk.js → content-manager.39bc9201.chunk.js} +58 -64
  45. package/build/{2863.bf3c1eff.chunk.js → content-type-builder-list-view.b12687b2.chunk.js} +1 -1
  46. package/build/content-type-builder-translation-en-json.201bfb78.chunk.js +1 -0
  47. package/build/content-type-builder.ec6ccb59.chunk.js +142 -0
  48. package/build/{email-settings-page.d72e7f4c.chunk.js → email-settings-page.818761d5.chunk.js} +1 -1
  49. package/build/email-translation-en-json.3d74ff95.chunk.js +1 -0
  50. package/build/email-translation-zh-Hans-json.8172da08.chunk.js +1 -0
  51. package/build/en-json.6d70e9ff.chunk.js +1 -0
  52. package/build/gu-json.dafa6f0d.chunk.js +1 -0
  53. package/build/{i18n-settings-page.8803df0b.chunk.js → i18n-settings-page.9d426e96.chunk.js} +1 -1
  54. package/build/i18n-translation-en-json.760250ae.chunk.js +1 -0
  55. package/build/i18n-translation-ko-json.b2d90a83.chunk.js +1 -0
  56. package/build/index.html +1 -1
  57. package/build/{main.689d6439.js → main.b19c2ee3.js} +529 -542
  58. package/build/ml-json.dc946c7f.chunk.js +1 -0
  59. package/build/runtime~main.426f9375.js +2 -0
  60. package/build/{sso-settings-page.2bae79df.chunk.js → sso-settings-page.445184e0.chunk.js} +1 -1
  61. package/build/{upload-settings.f1e587c0.chunk.js → upload-settings.4bad0bdd.chunk.js} +1 -1
  62. package/build/upload-translation-en-json.bc79c867.chunk.js +1 -0
  63. package/build/upload-translation-zh-Hans-json.37a2981e.chunk.js +1 -0
  64. package/build/users-providers-settings-page.a0b0fe39.chunk.js +1 -0
  65. package/build/{users-roles-settings-page.1206751f.chunk.js → users-roles-settings-page.3db986a4.chunk.js} +1 -1
  66. package/build/{webhook-edit-page.5c9bada0.chunk.js → webhook-edit-page.3417d93c.chunk.js} +2 -2
  67. package/build/{webhook-list-page.822927af.chunk.js → webhook-list-page.2ab4bbf0.chunk.js} +1 -1
  68. package/build/zh-Hans-json.eac1d90a.chunk.js +1 -0
  69. package/ee/admin/pages/SettingsPage/pages/Roles/CreatePage/index.js +3 -3
  70. package/package.json +21 -13
  71. package/webpack.alias.js +0 -1
  72. package/webpack.config.js +2 -5
  73. package/build/3531.ef1d2cfc.chunk.js +0 -10
  74. package/build/5250.9988a0ad.chunk.js +0 -12
  75. package/build/5833.970a963d.chunk.js +0 -112
  76. package/build/6925.fb35248e.chunk.js +0 -761
  77. package/build/Admin-authenticatedApp.d38dc4dd.chunk.js +0 -80
  78. package/build/Admin_pluginsPage.8537476f.chunk.js +0 -1
  79. package/build/Admin_profilePage.b7f85e78.chunk.js +0 -15
  80. package/build/Admin_settingsPage.858ef0d7.chunk.js +0 -178
  81. package/build/admin-edit-users.8cd7519b.chunk.js +0 -10
  82. package/build/admin-users.6581eec5.chunk.js +0 -11
  83. package/build/content-type-builder-translation-en-json.e5110288.chunk.js +0 -1
  84. package/build/content-type-builder.366a3b10.chunk.js +0 -142
  85. package/build/email-translation-en-json.6da7e388.chunk.js +0 -1
  86. package/build/email-translation-zh-Hans-json.b463cb25.chunk.js +0 -1
  87. package/build/en-json.729eb94d.chunk.js +0 -1
  88. package/build/i18n-translation-en-json.85bc892c.chunk.js +0 -1
  89. package/build/i18n-translation-ko-json.d0bc1203.chunk.js +0 -1
  90. package/build/runtime~main.308a7c41.js +0 -2
  91. package/build/upload-translation-en-json.fddec9a6.chunk.js +0 -1
  92. package/build/upload-translation-zh-Hans-json.6832ff81.chunk.js +0 -1
  93. package/build/users-providers-settings-page.82a4ba58.chunk.js +0 -101
  94. package/build/zh-Hans-json.cbc69f3d.chunk.js +0 -1
@@ -115,7 +115,12 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => {
115
115
  </NavLink>
116
116
 
117
117
  {pluginsSectionLinks.length > 0 ? (
118
- <NavSection label="Plugins">
118
+ <NavSection
119
+ label={formatMessage({
120
+ id: 'app.components.LeftMenu.plugins',
121
+ defaultMessage: 'Plugins',
122
+ })}
123
+ >
119
124
  {pluginsSectionLinks.map(link => {
120
125
  const Icon = link.icon;
121
126
 
@@ -129,7 +134,12 @@ const LeftMenu = ({ generalSectionLinks, pluginsSectionLinks }) => {
129
134
  ) : null}
130
135
 
131
136
  {generalSectionLinks.length > 0 ? (
132
- <NavSection label="General">
137
+ <NavSection
138
+ label={formatMessage({
139
+ id: 'app.components.LeftMenu.general',
140
+ defaultMessage: 'General',
141
+ })}
142
+ >
133
143
  {generalSectionLinks.map(link => {
134
144
  const LinkIcon = link.icon;
135
145
 
@@ -238,7 +238,8 @@ const EditViewDataManagerProvider = ({
238
238
  ['text', 'textarea', 'string', 'email', 'uid', 'select', 'select-one', 'number'].includes(
239
239
  type
240
240
  ) &&
241
- !value
241
+ !value &&
242
+ value !== 0
242
243
  ) {
243
244
  inputValue = null;
244
245
  }
@@ -310,7 +311,7 @@ const EditViewDataManagerProvider = ({
310
311
  } catch (err) {
311
312
  errors = {
312
313
  ...errors,
313
- ...getAPIInnerErrors(err),
314
+ ...getAPIInnerErrors(err, { getTrad }),
314
315
  };
315
316
  }
316
317
 
@@ -346,7 +347,7 @@ const EditViewDataManagerProvider = ({
346
347
  } catch (err) {
347
348
  errors = {
348
349
  ...errors,
349
- ...getAPIInnerErrors(err),
350
+ ...getAPIInnerErrors(err, { getTrad }),
350
351
  };
351
352
  }
352
353
 
@@ -20,14 +20,6 @@ const cleanData = (retrievedData, currentSchema, componentsSchema) => {
20
20
  case 'json':
21
21
  cleanedData = JSON.parse(value);
22
22
  break;
23
- // TODO
24
- // case 'date':
25
- // cleanedData =
26
- // value && value._isAMomentObject === true ? value.format('YYYY-MM-DD') : value;
27
- // break;
28
- // case 'datetime':
29
- // cleanedData = value && value._isAMomentObject === true ? value.toISOString() : value;
30
- // break;
31
23
  case 'time': {
32
24
  cleanedData = value;
33
25
 
@@ -70,29 +70,23 @@ const Wrapper = styled.div`
70
70
  }
71
71
 
72
72
  table {
73
- font-size: 13px;
74
73
  thead {
75
- background: rgb(243, 243, 243);
76
- tr {
77
- height: 43px;
74
+ background: ${({ theme }) => theme.colors.neutral150};
75
+
76
+ th {
77
+ padding: ${({ theme }) => theme.spaces[4]};
78
78
  }
79
79
  }
80
80
  tr {
81
- border: 1px solid #c6cbd1;
81
+ border: 1px solid ${({ theme }) => theme.colors.neutral200};
82
82
  }
83
83
  th,
84
84
  td {
85
- padding: 0 25px;
86
- border: 1px solid #c6cbd1;
85
+ padding: ${({ theme }) => theme.spaces[4]};
86
+ border: 1px solid ${({ theme }) => theme.colors.neutral200};
87
87
  border-bottom: 0;
88
88
  border-top: 0;
89
89
  }
90
-
91
- tbody {
92
- tr {
93
- height: 54px;
94
- }
95
- }
96
90
  }
97
91
 
98
92
  pre,
@@ -68,10 +68,10 @@ const useFetchContentTypeLayout = contentTypeUID => {
68
68
  }, [contentTypeUID, getData]);
69
69
 
70
70
  const updateLayout = useCallback(
71
- newLayout => {
71
+ data => {
72
72
  dispatch({
73
73
  type: 'UPDATE_LAYOUT',
74
- newLayout: formatLayouts({ contentType: newLayout, components: {} }, schemas),
74
+ newLayout: formatLayouts(data, schemas),
75
75
  });
76
76
  },
77
77
  [schemas]
@@ -59,8 +59,8 @@ const ModalForm = ({ onMetaChange, onSizeChange }) => {
59
59
  const formType = get(attributes, [selectedField, 'type']);
60
60
 
61
61
  if (
62
- formType === 'dynamiczone' ||
63
- (formType === 'component' && !['label', 'description'].includes(meta))
62
+ ['component', 'dynamiczone'].includes(formType) &&
63
+ !['label', 'description'].includes(meta)
64
64
  ) {
65
65
  return null;
66
66
  }
@@ -8,6 +8,7 @@ import { useTracking } from '@strapi/helper-plugin';
8
8
  import { onChangeListHeaders } from '../actions';
9
9
  import { selectDisplayedHeaders } from '../selectors';
10
10
  import getAllAllowedHeaders from './utils/getAllAllowedHeader';
11
+ import getTrad from '../../../utils/getTrad';
11
12
 
12
13
  const FieldPicker = ({ layout }) => {
13
14
  const dispatch = useDispatch();
@@ -50,7 +51,14 @@ const FieldPicker = ({ layout }) => {
50
51
  aria-label="change displayed fields"
51
52
  value={values}
52
53
  onChange={handleChange}
53
- customizeContent={values => `${values.length} currently selected`}
54
+ customizeContent={values =>
55
+ formatMessage(
56
+ {
57
+ id: getTrad('select.currently.selected'),
58
+ defaultMessage: '{count} currently selected',
59
+ },
60
+ { count: values.length }
61
+ )}
54
62
  multi
55
63
  size="S"
56
64
  >
@@ -21,10 +21,6 @@ const removeKeyInObject = (obj, keyToRemove) => {
21
21
  }
22
22
 
23
23
  if (typeof value === 'object') {
24
- if (value._isAMomentObject === true) {
25
- return { ...acc, [current]: value };
26
- }
27
-
28
24
  if (Array.isArray(acc)) {
29
25
  acc[current] = removeKeyInObject(value, keyToRemove);
30
26
 
@@ -48,7 +48,7 @@ const run = async () => {
48
48
 
49
49
  // We need to make sure to fetch the project type before importing the StrapiApp
50
50
  // otherwise the strapi-babel-plugin does not work correctly
51
- const StrapiApp = await import('./StrapiApp');
51
+ const StrapiApp = await import(/* webpackChunkName: "admin-app" */ './StrapiApp');
52
52
 
53
53
  const app = StrapiApp.default({
54
54
  appPlugins: plugins,
@@ -28,8 +28,12 @@ const InstalledPluginsPage = lazy(() =>
28
28
  const MarketplacePage = lazy(() =>
29
29
  import(/* webpackChunkName: "Admin_marketplace" */ '../MarketplacePage')
30
30
  );
31
- const NotFoundPage = lazy(() => import('../NotFoundPage'));
32
- const InternalErrorPage = lazy(() => import('../InternalErrorPage'));
31
+ const NotFoundPage = lazy(() =>
32
+ import(/* webpackChunkName: "Admin_NotFoundPage" */ '../NotFoundPage')
33
+ );
34
+ const InternalErrorPage = lazy(() =>
35
+ import(/* webpackChunkName: "Admin_InternalErrorPage" */ '../InternalErrorPage')
36
+ );
33
37
 
34
38
  const ProfilePage = lazy(() =>
35
39
  import(/* webpackChunkName: "Admin_profilePage" */ '../ProfilePage')
@@ -13,6 +13,7 @@ import {
13
13
  useNotification,
14
14
  TrackingContext,
15
15
  prefixFileUrlWithBackendUrl,
16
+ useAppInfos,
16
17
  } from '@strapi/helper-plugin';
17
18
  import axios from 'axios';
18
19
  import { SkipToContent } from '@strapi/design-system/Main';
@@ -35,6 +36,7 @@ function App() {
35
36
  const { updateProjectSettings } = useConfigurations();
36
37
  const { formatMessage } = useIntl();
37
38
  const [{ isLoading, hasAdmin, uuid }, setState] = useState({ isLoading: true, hasAdmin: false });
39
+ const appInfo = useAppInfos();
38
40
 
39
41
  const authRoutes = useMemo(() => {
40
42
  return makeUniqueRoutes(
@@ -97,6 +99,7 @@ function App() {
97
99
  deviceId,
98
100
  properties: {
99
101
  ...properties,
102
+ environment: appInfo.currentEnvironment,
100
103
  },
101
104
  }),
102
105
  headers: {
@@ -118,6 +121,7 @@ function App() {
118
121
  };
119
122
 
120
123
  getData();
124
+ // eslint-disable-next-line react-hooks/exhaustive-deps
121
125
  }, [toggleNotification, updateProjectSettings]);
122
126
 
123
127
  const setHasAdmin = hasAdmin => setState(prev => ({ ...prev, hasAdmin }));
@@ -82,11 +82,19 @@ const Plugins = () => {
82
82
  <Tr key={name}>
83
83
  <Td>
84
84
  <Typography textColor="neutral800" variant="omega" fontWeight="bold">
85
- {displayName}
85
+ {formatMessage({
86
+ id: `global.plugins.${name}`,
87
+ defaultMessage: displayName,
88
+ })}
86
89
  </Typography>
87
90
  </Td>
88
91
  <Td>
89
- <Typography textColor="neutral800">{description}</Typography>
92
+ <Typography textColor="neutral800">
93
+ {formatMessage({
94
+ id: `global.plugins.${name}.description`,
95
+ defaultMessage: description,
96
+ })}
97
+ </Typography>
90
98
  </Td>
91
99
  </Tr>
92
100
  );
@@ -357,6 +357,7 @@ const ProfilePage = () => {
357
357
  })}
358
358
  name="password"
359
359
  type={passwordShown ? 'text' : 'password'}
360
+ autoComplete="new-password"
360
361
  endAction={
361
362
  <FieldActionWrapper
362
363
  onClick={e => {
@@ -398,6 +399,7 @@ const ProfilePage = () => {
398
399
  })}
399
400
  name="confirmPassword"
400
401
  type={passwordConfirmShown ? 'text' : 'password'}
402
+ autoComplete="new-password"
401
403
  endAction={
402
404
  <FieldActionWrapper
403
405
  onClick={e => {
@@ -531,24 +533,23 @@ const ProfilePage = () => {
531
533
  });
532
534
  }}
533
535
  >
534
- {themesToDisplay.map(theme => {
535
- const label = formatMessage(
536
- {
537
- id:
538
- 'Settings.profile.form.section.experience.mode.option-label',
539
- defaultMessage: '{name} mode',
540
- },
541
- {
542
- name: upperFirst(theme),
543
- }
544
- );
545
-
546
- return (
547
- <Option value={theme} key={theme}>
548
- {label}
549
- </Option>
550
- );
551
- })}
536
+ {themesToDisplay.map(theme => (
537
+ <Option value={theme} key={theme}>
538
+ {formatMessage(
539
+ {
540
+ id:
541
+ 'Settings.profile.form.section.experience.mode.option-label',
542
+ defaultMessage: '{name} mode',
543
+ },
544
+ {
545
+ name: formatMessage({
546
+ id: theme,
547
+ defaultMessage: upperFirst(theme),
548
+ }),
549
+ }
550
+ )}
551
+ </Option>
552
+ ))}
552
553
  </Select>
553
554
  </GridItem>
554
555
  </Grid>
@@ -62,7 +62,7 @@ const layout = [
62
62
  id: 'Auth.form.username.placeholder',
63
63
  defaultMessage: 'e.g. Kai_Doe',
64
64
  },
65
- type: 'email',
65
+ type: 'text',
66
66
  size: {
67
67
  col: 6,
68
68
  xs: 12,
@@ -81,6 +81,7 @@ const layout = [
81
81
  col: 6,
82
82
  xs: 12,
83
83
  },
84
+ autoComplete: 'new-password',
84
85
  },
85
86
  {
86
87
  intlLabel: {
@@ -93,6 +94,7 @@ const layout = [
93
94
  col: 6,
94
95
  xs: 12,
95
96
  },
97
+ autoComplete: 'new-password',
96
98
  },
97
99
  ],
98
100
  [
@@ -63,7 +63,7 @@ const TableRows = ({
63
63
  return (
64
64
  <Td key={key}>
65
65
  {typeof cellFormatter === 'function' ? (
66
- cellFormatter(data, { key, name, ...rest })
66
+ cellFormatter(data, { key, name, formatMessage, ...rest })
67
67
  ) : (
68
68
  <Typography textColor="neutral800">{data[name] || '-'}</Typography>
69
69
  )}
@@ -24,9 +24,18 @@ const tableHeaders = [
24
24
  name: 'roles',
25
25
  metadatas: { label: 'Roles', sortable: false },
26
26
  /* eslint-disable react/prop-types */
27
- cellFormatter: ({ roles }) => {
27
+ cellFormatter: ({ roles }, { formatMessage }) => {
28
28
  return (
29
- <Typography textColor="neutral800">{roles.map(role => role.name).join(',\n')}</Typography>
29
+ <Typography textColor="neutral800">
30
+ {roles
31
+ .map(role =>
32
+ formatMessage({
33
+ id: `global.${role.code}`,
34
+ defaultMessage: role.name,
35
+ })
36
+ )
37
+ .join(',\n')}
38
+ </Typography>
30
39
  );
31
40
  },
32
41
  /* eslint-enable react/prop-types */
@@ -41,11 +50,16 @@ const tableHeaders = [
41
50
  name: 'isActive',
42
51
  metadatas: { label: 'User status', sortable: false },
43
52
  // eslint-disable-next-line react/prop-types
44
- cellFormatter: ({ isActive }) => {
53
+ cellFormatter: ({ isActive }, { formatMessage }) => {
45
54
  return (
46
55
  <Flex>
47
56
  <Status isActive={isActive} variant={isActive ? 'success' : 'danger'} />
48
- <Typography textColor="neutral800">{isActive ? 'Active' : 'Inactive'}</Typography>
57
+ <Typography textColor="neutral800">
58
+ {formatMessage({
59
+ id: isActive ? 'global.active' : 'global.inactive',
60
+ defaultMessage: isActive ? 'Active' : 'Inactive',
61
+ })}
62
+ </Typography>
49
63
  </Flex>
50
64
  );
51
65
  },
@@ -73,7 +73,10 @@ const SelectRoles = ({ disabled, error, onChange, value }) => {
73
73
  {(data || []).map(role => {
74
74
  return (
75
75
  <Option key={role.id} value={role.id}>
76
- {role.name}
76
+ {formatMessage({
77
+ id: `global.${role.code}`,
78
+ defaultMessage: role.name,
79
+ })}
77
80
  </Option>
78
81
  );
79
82
  })}
@@ -3,6 +3,7 @@
3
3
  "Auth.components.Oops.text": "Your account has been suspended.",
4
4
  "Auth.components.Oops.text.admin": "If this is a mistake, please contact your administrator.",
5
5
  "Auth.components.Oops.title": "Oops...",
6
+ "Auth.form.active.label": "Active",
6
7
  "Auth.form.button.forgot-password": "Send Email",
7
8
  "Auth.form.button.go-home": "GO BACK HOME",
8
9
  "Auth.form.button.login": "Login",
@@ -157,6 +158,8 @@
157
158
  "Settings.profile.form.section.experience.mode.label": "Interface mode",
158
159
  "Settings.profile.form.section.experience.mode.hint": "Displays your interface in the chosen mode.",
159
160
  "Settings.profile.form.section.experience.mode.option-label": "{name} mode",
161
+ "light": "Light",
162
+ "dark": "Dark",
160
163
  "Settings.profile.form.section.experience.title": "Experience",
161
164
  "Settings.profile.form.section.helmet.title": "User profile",
162
165
  "Settings.profile.form.section.profile.page.title": "Profile page",
@@ -320,8 +323,10 @@
320
323
  "app.components.InstallPluginPage.description": "Extend your app effortlessly.",
321
324
  "app.components.LeftMenu.collapse": "Collapse the navbar",
322
325
  "app.components.LeftMenu.expand": "Expand the navbar",
326
+ "app.components.LeftMenu.general": "General",
323
327
  "app.components.LeftMenu.logout": "Logout",
324
328
  "app.components.LeftMenu.logo.alt": "Application logo",
329
+ "app.components.LeftMenu.plugins": "Plugins",
325
330
  "app.components.LeftMenu.navbrand.title": "Strapi Dashboard",
326
331
  "app.components.LeftMenu.navbrand.workplace": "Workplace",
327
332
  "app.components.LeftMenuFooter.help": "Help",
@@ -671,6 +676,7 @@
671
676
  "content-manager.popUpwarning.warning.has-draft-relations.button-confirm": "Yes, publish",
672
677
  "content-manager.popUpwarning.warning.has-draft-relations.message": "<b>{count, plural, =0 { of your content relations is} one { of your content relations is} other { of your content relations are}}</b> not published yet.<br></br>It might engender broken links and errors on your project.",
673
678
  "content-manager.popover.display-relations.label": "Display relations",
679
+ "content-manager.select.currently.selected": "{count} currently selected",
674
680
  "content-manager.success.record.delete": "Deleted",
675
681
  "content-manager.success.record.publish": "Published",
676
682
  "content-manager.success.record.save": "Saved",
@@ -681,7 +687,10 @@
681
687
  "form.button.done": "Done",
682
688
  "global.search": "Search",
683
689
  "global.actions": "Actions",
690
+ "global.active": "Active",
691
+ "global.inactive": "Inactive",
684
692
  "global.back": "Back",
693
+ "global.cancel": "Cancel",
685
694
  "global.change-password": "Change password",
686
695
  "global.content-manager": "Content Manager",
687
696
  "global.continue": "Continue",
@@ -698,6 +707,24 @@
698
707
  "global.none": "None",
699
708
  "global.password": "Password",
700
709
  "global.plugins": "Plugins",
710
+ "global.plugins.content-manager": "Content Manager",
711
+ "global.plugins.content-manager.description": "Quick way to see, edit and delete the data in your database.",
712
+ "global.plugins.content-type-builder": "Content Type Builder",
713
+ "global.plugins.content-type-builder.description": "Modelize the data structure of your API. Create new fields and relations in just a minute. The files are automatically created and updated in your project.",
714
+ "global.plugins.email": "Email",
715
+ "global.plugins.email.description": "Configure your application to send emails.",
716
+ "global.plugins.upload": "Media Library",
717
+ "global.plugins.upload.description": "Media file management.",
718
+ "global.plugins.graphql": "GraphQL",
719
+ "global.plugins.graphql.description": "Adds GraphQL endpoint with default API methods.",
720
+ "global.plugins.documentation": "Documentation",
721
+ "global.plugins.documentation.description": "Create an OpenAPI Document and visualize your API with SWAGGER UI.",
722
+ "global.plugins.i18n": "Internationalization",
723
+ "global.plugins.i18n.description": "This plugin enables to create, to read and to update content in different languages, both from the Admin Panel and from the API.",
724
+ "global.plugins.sentry": "Sentry",
725
+ "global.plugins.sentry.description": "Send Strapi error events to Sentry.",
726
+ "global.plugins.users-permissions": "Roles & Permissions",
727
+ "global.plugins.users-permissions.description": "Protect your API with a full authentication process based on JWT. This plugin comes also with an ACL strategy that allows you to manage the permissions between the groups of users.",
701
728
  "global.profile": "Profile",
702
729
  "global.prompt.unsaved": "Are you sure you want to leave this page? All your modifications will be lost",
703
730
  "global.reset-password": "Reset password",
@@ -707,6 +734,15 @@
707
734
  "global.select": "Select",
708
735
  "global.select-all-entries": "Select all entries",
709
736
  "global.settings": "Settings",
737
+ "global.strapi-super-admin": "Super Admin",
738
+ "global.strapi-editor": "Editor",
739
+ "global.strapi-author": "Author",
740
+ "global.table.header.email": "Email",
741
+ "global.table.header.firstname": "Firstname",
742
+ "global.table.header.isActive": "User status",
743
+ "global.table.header.lastname": "Lastname",
744
+ "global.table.header.roles": "Roles",
745
+ "global.table.header.username": "Username",
710
746
  "global.type": "Type",
711
747
  "global.users": "Users",
712
748
  "notification.contentType.relations.conflict": "Content type has conflicting relations",