@strapi/i18n 5.49.0 → 5.50.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/dist/admin/components/BulkLocaleActionModal.js +1 -1
- package/dist/admin/components/BulkLocaleActionModal.js.map +1 -1
- package/dist/admin/components/BulkLocaleActionModal.mjs +1 -1
- package/dist/admin/components/BulkLocaleActionModal.mjs.map +1 -1
- package/dist/admin/components/CMHeaderActions.js.map +1 -1
- package/dist/admin/components/CMHeaderActions.mjs.map +1 -1
- package/dist/admin/components/CreateLocale.js +3 -2
- package/dist/admin/components/CreateLocale.js.map +1 -1
- package/dist/admin/components/CreateLocale.mjs +3 -2
- package/dist/admin/components/CreateLocale.mjs.map +1 -1
- package/dist/admin/contentManagerHooks/editView.js +2 -1
- package/dist/admin/contentManagerHooks/editView.js.map +1 -1
- package/dist/admin/contentManagerHooks/editView.mjs +2 -1
- package/dist/admin/contentManagerHooks/editView.mjs.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/components/BulkLocaleActionModal.d.ts +3 -2
- package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +1 -1
- package/dist/admin/src/services/aiLocalizationJobs.d.ts +1 -1
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/fillFromLocale.d.ts +1 -1
- package/dist/admin/src/services/locales.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +3 -3
- package/dist/admin/src/services/settings.d.ts +3 -3
- package/dist/admin/src/utils/schemas.d.ts +6 -6
- package/dist/admin/translations/ja.json.js +92 -0
- package/dist/admin/translations/ja.json.js.map +1 -0
- package/dist/admin/translations/ja.json.mjs +90 -0
- package/dist/admin/translations/ja.json.mjs.map +1 -0
- package/dist/admin/translations/pl.json.js +2 -1
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +2 -1
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/server/register.js +4 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +4 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/permissions/actions.js +95 -1
- package/dist/server/services/permissions/actions.js.map +1 -1
- package/dist/server/services/permissions/actions.mjs +95 -1
- package/dist/server/services/permissions/actions.mjs.map +1 -1
- package/dist/server/services/permissions/sections-builder.js +6 -4
- package/dist/server/services/permissions/sections-builder.js.map +1 -1
- package/dist/server/services/permissions/sections-builder.mjs +6 -4
- package/dist/server/services/permissions/sections-builder.mjs.map +1 -1
- package/dist/server/src/controllers/ai-localization-jobs.d.ts.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts +2 -3
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +2 -3
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/domain/locale.d.ts.map +1 -1
- package/dist/server/src/graphql.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +11 -10
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/ai-localization-jobs.d.ts +1 -1
- package/dist/server/src/services/ai-localization-jobs.d.ts.map +1 -1
- package/dist/server/src/services/ai-localizations.d.ts.map +1 -1
- package/dist/server/src/services/fill-from-locale.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +9 -7
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/localizations.d.ts.map +1 -1
- package/dist/server/src/services/permissions/actions.d.ts +5 -0
- package/dist/server/src/services/permissions/actions.d.ts.map +1 -1
- package/dist/server/src/services/permissions/conditions.d.ts.map +1 -1
- package/dist/server/src/services/permissions/engine.d.ts.map +1 -1
- package/dist/server/src/services/permissions/sections-builder.d.ts.map +1 -1
- package/dist/server/src/services/permissions.d.ts +5 -0
- package/dist/server/src/services/permissions.d.ts.map +1 -1
- package/dist/server/src/services/sanitize/index.d.ts +0 -1
- package/dist/server/src/services/sanitize/index.d.ts.map +1 -1
- package/dist/server/src/services/settings.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +15 -15
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/validation/content-types.d.ts +2 -2
- package/dist/server/src/validation/content-types.d.ts.map +1 -1
- package/dist/server/src/validation/locales.d.ts +2 -2
- package/dist/server/src/validation/settings.d.ts +1 -1
- package/package.json +10 -10
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ja = {
|
|
4
|
+
"actions.delete.dialog.body": "このロケールを削除してもよろしいですか?",
|
|
5
|
+
"actions.delete.dialog.title": "確認",
|
|
6
|
+
"actions.delete.error": "ドキュメントロケールの削除中にエラーが発生しました。",
|
|
7
|
+
"actions.delete.label": "エントリーを削除({locale})",
|
|
8
|
+
"actions.select-locale": "ロケールを選択",
|
|
9
|
+
"CheckboxConfirmation.Modal.body": "無効にしますか?",
|
|
10
|
+
"CheckboxConfirmation.Modal.button-confirm": "はい、無効にする",
|
|
11
|
+
"CheckboxConfirmation.Modal.content": "ローカライゼーションを無効にすると、デフォルトロケールに関連付けられたコンテンツ(存在する場合)を除くすべてのコンテンツが削除されます。",
|
|
12
|
+
"CMEditViewAITranslation.job-completed": "AI翻訳が完了しました!",
|
|
13
|
+
"CMEditViewAITranslation.job-failed": "AI翻訳に失敗しました。もう一度お試しください。",
|
|
14
|
+
"CMEditViewAITranslation.settings-link": "{enabled, select, true {設定で無効にする} false {設定で有効にする} other {設定で有効にする}}",
|
|
15
|
+
"CMEditViewAITranslation.status-aria-label": "AI翻訳ステータス",
|
|
16
|
+
"CMEditViewAITranslation.status-description": "デフォルトロケールで変更を保存するたびに、AIがすべてのロケールのコンテンツを翻訳します。",
|
|
17
|
+
"CMEditViewAITranslation.status-title": "{enabled, select, true {AI翻訳有効} false {AI翻訳無効} other {AI翻訳無効}}",
|
|
18
|
+
"CMEditViewBulkLocale.continue-confirmation": "続行してもよろしいですか?",
|
|
19
|
+
"CMEditViewBulkLocale.draft-relation-warning": "一部のロケールは下書きエントリーに関連付けられています。公開するとアプリ内にリンク切れが発生する可能性があります。",
|
|
20
|
+
"CMEditViewBulkLocale.publication-status": "公開ステータス",
|
|
21
|
+
"CMEditViewBulkLocale.publish-title": "複数ロケールを公開",
|
|
22
|
+
"CMEditViewBulkLocale.status": "ステータス",
|
|
23
|
+
"CMEditViewBulkLocale.unpublish-title": "複数ロケールを非公開",
|
|
24
|
+
"CMEditViewCopyLocale.cancel-text": "いいえ、キャンセル",
|
|
25
|
+
"CMEditViewCopyLocale.copy-failure": "ロケールのコピーに失敗しました",
|
|
26
|
+
"CMEditViewCopyLocale.copy-success": "ロケールをコピーしました",
|
|
27
|
+
"CMEditViewCopyLocale.copy-text": "別のロケールから入力",
|
|
28
|
+
"CMEditViewCopyLocale.dialog.body": "現在のコンテンツは消去され、選択したロケールのコンテンツで上書きされます:",
|
|
29
|
+
"CMEditViewCopyLocale.dialog.field.label": "ロケール",
|
|
30
|
+
"CMEditViewCopyLocale.dialog.field.placeholder": "ロケールを選択...",
|
|
31
|
+
"CMEditViewCopyLocale.dialog.title": "確認",
|
|
32
|
+
"CMEditViewCopyLocale.submit-text": "はい、入力する",
|
|
33
|
+
"CMEditViewLocalePicker.locale.ai-translations": "AI翻訳:",
|
|
34
|
+
"CMEditViewLocalePicker.locale.create": "<bold>{locale}</bold>ロケールを作成",
|
|
35
|
+
"CMListView.popover.display-locales.label": "翻訳済みロケールを表示",
|
|
36
|
+
"CMListView.popover.display-locales.more": "{locales} + 他{count}件",
|
|
37
|
+
"components.Select.locales.not-available": "利用可能なコンテンツがありません",
|
|
38
|
+
"Field.localized": "この値は選択したロケール固有です",
|
|
39
|
+
"Field.not-localized": "この値はすべてのロケールで共通です",
|
|
40
|
+
"list-view.table.header.label": "利用可能なロケール",
|
|
41
|
+
"plugin.description.long": "管理パネルとAPIの両方から、異なる言語でコンテンツを作成・読み取り・更新できるプラグインです。",
|
|
42
|
+
"plugin.description.short": "管理パネルとAPIの両方から、異なる言語でコンテンツを作成・読み取り・更新できるプラグインです。",
|
|
43
|
+
"plugin.name": "国際化",
|
|
44
|
+
"plugin.schema.i18n.localized.description-content-type": "エントリーを異なる言語に翻訳できるようにします",
|
|
45
|
+
"plugin.schema.i18n.localized.description-field": "このフィールドは言語ごとに異なる値を持てます",
|
|
46
|
+
"plugin.schema.i18n.localized.label-content-type": "国際化",
|
|
47
|
+
"plugin.schema.i18n.localized.label-field": "このフィールドのローカライゼーションを有効にする",
|
|
48
|
+
"Settings.aiLocalizations.description": "コンテンツマネージャーで保存するたびに、AIがデフォルトロケールをもとに他のすべてのロケールを自動翻訳します。",
|
|
49
|
+
"Settings.aiLocalizations.label": "AI翻訳",
|
|
50
|
+
"Settings.list.actions.add": "新規ロケールを追加",
|
|
51
|
+
"Settings.list.actions.delete": "{name}ロケールを削除",
|
|
52
|
+
"Settings.list.actions.deleteAdditionalInfos": "アクティブなロケールバージョンが削除されます<em>(国際化)</em>",
|
|
53
|
+
"Settings.list.actions.edit": "{name}ロケールを編集",
|
|
54
|
+
"Settings.list.actions.publishAdditionalInfos": "アクティブなロケールバージョンが公開されます<em>(国際化)</em>",
|
|
55
|
+
"Settings.list.actions.unpublishAdditionalInfos": "アクティブなロケールバージョンが非公開になります<em>(国際化)</em>",
|
|
56
|
+
"Settings.list.description": "国際化プラグインの設定を構成します",
|
|
57
|
+
"Settings.list.empty.description": "これは通常の動作ではなく、データベースを手動で変更した可能性があります。Strapiを正しく使用するには、少なくとも1つのロケールがデータベースに保存されていることを確認してください。",
|
|
58
|
+
"Settings.list.empty.title": "ロケールがありません。",
|
|
59
|
+
"Settings.locales.default": "デフォルト",
|
|
60
|
+
"Settings.locales.list.sort.default": "デフォルトロケールで並べ替え",
|
|
61
|
+
"Settings.locales.list.sort.displayName": "表示名で並べ替え",
|
|
62
|
+
"Settings.locales.list.sort.id": "IDで並べ替え",
|
|
63
|
+
"Settings.locales.modal.advanced": "高度な設定",
|
|
64
|
+
"Settings.locales.modal.advanced.setAsDefault": "デフォルトロケールに設定",
|
|
65
|
+
"Settings.locales.modal.advanced.setAsDefault.hint": "デフォルトロケールは1つ必要です。変更するには別のロケールを選択してください",
|
|
66
|
+
"Settings.locales.modal.advanced.settings": "設定",
|
|
67
|
+
"Settings.locales.modal.base": "基本設定",
|
|
68
|
+
"Settings.locales.modal.create.code.error": "ロケールを選択してください",
|
|
69
|
+
"Settings.locales.modal.create.code.label": "ロケール",
|
|
70
|
+
"Settings.locales.modal.create.name.description": "ロケールは管理パネルでこの名前で表示されます",
|
|
71
|
+
"Settings.locales.modal.create.name.error.min": "ロケール表示名は50文字未満にしてください。",
|
|
72
|
+
"Settings.locales.modal.create.name.error.required": "ロケールの表示名を入力してください",
|
|
73
|
+
"Settings.locales.modal.create.name.label": "ロケール表示名",
|
|
74
|
+
"Settings.locales.modal.create.success": "ロケールを追加しました",
|
|
75
|
+
"Settings.locales.modal.delete.confirm": "はい、削除する",
|
|
76
|
+
"Settings.locales.modal.delete.message": "このロケールを削除すると、関連付けられたすべてのコンテンツが削除されます。残したいコンテンツがある場合は、先に別のロケールへ移し替えてください。",
|
|
77
|
+
"Settings.locales.modal.delete.secondMessage": "このロケールを削除しますか?",
|
|
78
|
+
"Settings.locales.modal.delete.success": "ロケールを削除しました",
|
|
79
|
+
"Settings.locales.modal.edit.confirmation": "完了",
|
|
80
|
+
"Settings.locales.modal.edit.success": "ロケールを編集しました",
|
|
81
|
+
"Settings.locales.modal.edit.tab.label": "I18Nの基本設定と高度な設定の切り替え",
|
|
82
|
+
"Settings.locales.modal.title": "設定",
|
|
83
|
+
"Settings.locales.row.default-locale": "デフォルトロケール",
|
|
84
|
+
"Settings.locales.row.displayName": "表示名",
|
|
85
|
+
"Settings.locales.row.id": "ID",
|
|
86
|
+
"Settings.permissions.loading": "権限を読み込み中",
|
|
87
|
+
"Settings.permissions.read.denied.description": "これを閲覧するには、システム管理者にお問い合わせください。",
|
|
88
|
+
"Settings.permissions.read.denied.title": "このコンテンツにアクセスする権限がありません。"
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
module.exports = ja;
|
|
92
|
+
//# sourceMappingURL=ja.json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ja.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
var ja = {
|
|
2
|
+
"actions.delete.dialog.body": "このロケールを削除してもよろしいですか?",
|
|
3
|
+
"actions.delete.dialog.title": "確認",
|
|
4
|
+
"actions.delete.error": "ドキュメントロケールの削除中にエラーが発生しました。",
|
|
5
|
+
"actions.delete.label": "エントリーを削除({locale})",
|
|
6
|
+
"actions.select-locale": "ロケールを選択",
|
|
7
|
+
"CheckboxConfirmation.Modal.body": "無効にしますか?",
|
|
8
|
+
"CheckboxConfirmation.Modal.button-confirm": "はい、無効にする",
|
|
9
|
+
"CheckboxConfirmation.Modal.content": "ローカライゼーションを無効にすると、デフォルトロケールに関連付けられたコンテンツ(存在する場合)を除くすべてのコンテンツが削除されます。",
|
|
10
|
+
"CMEditViewAITranslation.job-completed": "AI翻訳が完了しました!",
|
|
11
|
+
"CMEditViewAITranslation.job-failed": "AI翻訳に失敗しました。もう一度お試しください。",
|
|
12
|
+
"CMEditViewAITranslation.settings-link": "{enabled, select, true {設定で無効にする} false {設定で有効にする} other {設定で有効にする}}",
|
|
13
|
+
"CMEditViewAITranslation.status-aria-label": "AI翻訳ステータス",
|
|
14
|
+
"CMEditViewAITranslation.status-description": "デフォルトロケールで変更を保存するたびに、AIがすべてのロケールのコンテンツを翻訳します。",
|
|
15
|
+
"CMEditViewAITranslation.status-title": "{enabled, select, true {AI翻訳有効} false {AI翻訳無効} other {AI翻訳無効}}",
|
|
16
|
+
"CMEditViewBulkLocale.continue-confirmation": "続行してもよろしいですか?",
|
|
17
|
+
"CMEditViewBulkLocale.draft-relation-warning": "一部のロケールは下書きエントリーに関連付けられています。公開するとアプリ内にリンク切れが発生する可能性があります。",
|
|
18
|
+
"CMEditViewBulkLocale.publication-status": "公開ステータス",
|
|
19
|
+
"CMEditViewBulkLocale.publish-title": "複数ロケールを公開",
|
|
20
|
+
"CMEditViewBulkLocale.status": "ステータス",
|
|
21
|
+
"CMEditViewBulkLocale.unpublish-title": "複数ロケールを非公開",
|
|
22
|
+
"CMEditViewCopyLocale.cancel-text": "いいえ、キャンセル",
|
|
23
|
+
"CMEditViewCopyLocale.copy-failure": "ロケールのコピーに失敗しました",
|
|
24
|
+
"CMEditViewCopyLocale.copy-success": "ロケールをコピーしました",
|
|
25
|
+
"CMEditViewCopyLocale.copy-text": "別のロケールから入力",
|
|
26
|
+
"CMEditViewCopyLocale.dialog.body": "現在のコンテンツは消去され、選択したロケールのコンテンツで上書きされます:",
|
|
27
|
+
"CMEditViewCopyLocale.dialog.field.label": "ロケール",
|
|
28
|
+
"CMEditViewCopyLocale.dialog.field.placeholder": "ロケールを選択...",
|
|
29
|
+
"CMEditViewCopyLocale.dialog.title": "確認",
|
|
30
|
+
"CMEditViewCopyLocale.submit-text": "はい、入力する",
|
|
31
|
+
"CMEditViewLocalePicker.locale.ai-translations": "AI翻訳:",
|
|
32
|
+
"CMEditViewLocalePicker.locale.create": "<bold>{locale}</bold>ロケールを作成",
|
|
33
|
+
"CMListView.popover.display-locales.label": "翻訳済みロケールを表示",
|
|
34
|
+
"CMListView.popover.display-locales.more": "{locales} + 他{count}件",
|
|
35
|
+
"components.Select.locales.not-available": "利用可能なコンテンツがありません",
|
|
36
|
+
"Field.localized": "この値は選択したロケール固有です",
|
|
37
|
+
"Field.not-localized": "この値はすべてのロケールで共通です",
|
|
38
|
+
"list-view.table.header.label": "利用可能なロケール",
|
|
39
|
+
"plugin.description.long": "管理パネルとAPIの両方から、異なる言語でコンテンツを作成・読み取り・更新できるプラグインです。",
|
|
40
|
+
"plugin.description.short": "管理パネルとAPIの両方から、異なる言語でコンテンツを作成・読み取り・更新できるプラグインです。",
|
|
41
|
+
"plugin.name": "国際化",
|
|
42
|
+
"plugin.schema.i18n.localized.description-content-type": "エントリーを異なる言語に翻訳できるようにします",
|
|
43
|
+
"plugin.schema.i18n.localized.description-field": "このフィールドは言語ごとに異なる値を持てます",
|
|
44
|
+
"plugin.schema.i18n.localized.label-content-type": "国際化",
|
|
45
|
+
"plugin.schema.i18n.localized.label-field": "このフィールドのローカライゼーションを有効にする",
|
|
46
|
+
"Settings.aiLocalizations.description": "コンテンツマネージャーで保存するたびに、AIがデフォルトロケールをもとに他のすべてのロケールを自動翻訳します。",
|
|
47
|
+
"Settings.aiLocalizations.label": "AI翻訳",
|
|
48
|
+
"Settings.list.actions.add": "新規ロケールを追加",
|
|
49
|
+
"Settings.list.actions.delete": "{name}ロケールを削除",
|
|
50
|
+
"Settings.list.actions.deleteAdditionalInfos": "アクティブなロケールバージョンが削除されます<em>(国際化)</em>",
|
|
51
|
+
"Settings.list.actions.edit": "{name}ロケールを編集",
|
|
52
|
+
"Settings.list.actions.publishAdditionalInfos": "アクティブなロケールバージョンが公開されます<em>(国際化)</em>",
|
|
53
|
+
"Settings.list.actions.unpublishAdditionalInfos": "アクティブなロケールバージョンが非公開になります<em>(国際化)</em>",
|
|
54
|
+
"Settings.list.description": "国際化プラグインの設定を構成します",
|
|
55
|
+
"Settings.list.empty.description": "これは通常の動作ではなく、データベースを手動で変更した可能性があります。Strapiを正しく使用するには、少なくとも1つのロケールがデータベースに保存されていることを確認してください。",
|
|
56
|
+
"Settings.list.empty.title": "ロケールがありません。",
|
|
57
|
+
"Settings.locales.default": "デフォルト",
|
|
58
|
+
"Settings.locales.list.sort.default": "デフォルトロケールで並べ替え",
|
|
59
|
+
"Settings.locales.list.sort.displayName": "表示名で並べ替え",
|
|
60
|
+
"Settings.locales.list.sort.id": "IDで並べ替え",
|
|
61
|
+
"Settings.locales.modal.advanced": "高度な設定",
|
|
62
|
+
"Settings.locales.modal.advanced.setAsDefault": "デフォルトロケールに設定",
|
|
63
|
+
"Settings.locales.modal.advanced.setAsDefault.hint": "デフォルトロケールは1つ必要です。変更するには別のロケールを選択してください",
|
|
64
|
+
"Settings.locales.modal.advanced.settings": "設定",
|
|
65
|
+
"Settings.locales.modal.base": "基本設定",
|
|
66
|
+
"Settings.locales.modal.create.code.error": "ロケールを選択してください",
|
|
67
|
+
"Settings.locales.modal.create.code.label": "ロケール",
|
|
68
|
+
"Settings.locales.modal.create.name.description": "ロケールは管理パネルでこの名前で表示されます",
|
|
69
|
+
"Settings.locales.modal.create.name.error.min": "ロケール表示名は50文字未満にしてください。",
|
|
70
|
+
"Settings.locales.modal.create.name.error.required": "ロケールの表示名を入力してください",
|
|
71
|
+
"Settings.locales.modal.create.name.label": "ロケール表示名",
|
|
72
|
+
"Settings.locales.modal.create.success": "ロケールを追加しました",
|
|
73
|
+
"Settings.locales.modal.delete.confirm": "はい、削除する",
|
|
74
|
+
"Settings.locales.modal.delete.message": "このロケールを削除すると、関連付けられたすべてのコンテンツが削除されます。残したいコンテンツがある場合は、先に別のロケールへ移し替えてください。",
|
|
75
|
+
"Settings.locales.modal.delete.secondMessage": "このロケールを削除しますか?",
|
|
76
|
+
"Settings.locales.modal.delete.success": "ロケールを削除しました",
|
|
77
|
+
"Settings.locales.modal.edit.confirmation": "完了",
|
|
78
|
+
"Settings.locales.modal.edit.success": "ロケールを編集しました",
|
|
79
|
+
"Settings.locales.modal.edit.tab.label": "I18Nの基本設定と高度な設定の切り替え",
|
|
80
|
+
"Settings.locales.modal.title": "設定",
|
|
81
|
+
"Settings.locales.row.default-locale": "デフォルトロケール",
|
|
82
|
+
"Settings.locales.row.displayName": "表示名",
|
|
83
|
+
"Settings.locales.row.id": "ID",
|
|
84
|
+
"Settings.permissions.loading": "権限を読み込み中",
|
|
85
|
+
"Settings.permissions.read.denied.description": "これを閲覧するには、システム管理者にお問い合わせください。",
|
|
86
|
+
"Settings.permissions.read.denied.title": "このコンテンツにアクセスする権限がありません。"
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export { ja as default };
|
|
90
|
+
//# sourceMappingURL=ja.json.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ja.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -84,7 +84,8 @@ var pl = {
|
|
|
84
84
|
"plugin.schema.i18n.localized.description-content-type": "Pozwala mieć treść w różnych językach",
|
|
85
85
|
"plugin.schema.i18n.localized.description-field": "To pole może mieć różne wartości w zależności od różnych języków",
|
|
86
86
|
"plugin.schema.i18n.localized.label-content-type": "Włącz lokalizację dla tego typu treści",
|
|
87
|
-
"plugin.schema.i18n.localized.label-field": "Włącz lokalizację dla tego pola"
|
|
87
|
+
"plugin.schema.i18n.localized.label-field": "Włącz lokalizację dla tego pola",
|
|
88
|
+
"list-view.table.header.label": "Dostępne w"
|
|
88
89
|
};
|
|
89
90
|
|
|
90
91
|
module.exports = pl;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pl.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -82,7 +82,8 @@ var pl = {
|
|
|
82
82
|
"plugin.schema.i18n.localized.description-content-type": "Pozwala mieć treść w różnych językach",
|
|
83
83
|
"plugin.schema.i18n.localized.description-field": "To pole może mieć różne wartości w zależności od różnych języków",
|
|
84
84
|
"plugin.schema.i18n.localized.label-content-type": "Włącz lokalizację dla tego typu treści",
|
|
85
|
-
"plugin.schema.i18n.localized.label-field": "Włącz lokalizację dla tego pola"
|
|
85
|
+
"plugin.schema.i18n.localized.label-field": "Włącz lokalizację dla tego pola",
|
|
86
|
+
"list-view.table.header.label": "Dostępne w"
|
|
86
87
|
};
|
|
87
88
|
|
|
88
89
|
export { pl as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pl.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/server/register.js
CHANGED
|
@@ -14,6 +14,10 @@ var register = (async ({ strapi })=>{
|
|
|
14
14
|
strapi.get('models').add(aiLocalizationJob.aiLocalizationJob);
|
|
15
15
|
extendContentTypes(strapi);
|
|
16
16
|
addContentManagerLocaleMiddleware(strapi);
|
|
17
|
+
strapi.hook('strapi::content-types.afterSync').register(({ oldContentTypes, contentTypes })=>index.getService('permissions').actions.repairPermissionsForNewlyLocalizedTypes({
|
|
18
|
+
oldContentTypes,
|
|
19
|
+
contentTypes
|
|
20
|
+
}));
|
|
17
21
|
});
|
|
18
22
|
// TODO: v5 if implemented in the CM => delete this middleware
|
|
19
23
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Core } from '@strapi/types';\n\nimport validateLocaleCreation from './controllers/validate-locale-creation';\nimport graphqlProvider from './graphql';\nimport { getService } from './utils';\nimport { aiLocalizationJob } from './models/ai-localization-job';\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n strapi.get('models').add(aiLocalizationJob);\n\n extendContentTypes(strapi);\n addContentManagerLocaleMiddleware(strapi);\n};\n\n// TODO: v5 if implemented in the CM => delete this middleware\n/**\n * Adds middleware on CM creation routes to use i18n locale passed in a specific param\n * @param {Strapi} strapi\n */\nconst addContentManagerLocaleMiddleware = (strapi: Core.Strapi) => {\n strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n\n strapi.server.router.use('/content-manager/single-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n};\n\n/**\n * Adds locale and localization fields to all content types\n * Even if content type is not localized, it will have these fields\n * @param {Strapi} strapi\n */\nconst extendContentTypes = (strapi: Core.Strapi) => {\n const { isLocalizedContentType } = getService('content-types');\n\n Object.values(strapi.contentTypes).forEach((contentType) => {\n const { attributes } = contentType;\n\n const isLocalized = isLocalizedContentType(contentType);\n\n _.set(attributes, 'locale', {\n writable: true,\n private: !isLocalized,\n configurable: false,\n visible: false,\n type: 'string',\n });\n\n _.set(attributes, 'localizations', {\n type: 'relation',\n relation: 'oneToMany',\n target: contentType.uid,\n writable: false,\n private: !isLocalized,\n configurable: false,\n visible: false,\n unstable_virtual: true,\n joinColumn: {\n name: 'document_id',\n referencedColumn: 'document_id',\n referencedTable: strapi.db.metadata.identifiers.getTableName(contentType.collectionName!),\n // ensure the population will not include the results we already loaded\n on({ results }: { results: any[] }) {\n return {\n id: {\n $notIn: results.map((r) => r.id),\n },\n };\n },\n },\n });\n });\n\n if (strapi.plugin('graphql')) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n graphqlProvider({ strapi }).register();\n }\n};\n"],"names":["strapi","get","add","aiLocalizationJob","extendContentTypes","addContentManagerLocaleMiddleware","server","router","use","ctx","next","method","validateLocaleCreation","isLocalizedContentType","
|
|
1
|
+
{"version":3,"file":"register.js","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Core } from '@strapi/types';\n\nimport validateLocaleCreation from './controllers/validate-locale-creation';\nimport graphqlProvider from './graphql';\nimport { getService } from './utils';\nimport { aiLocalizationJob } from './models/ai-localization-job';\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n strapi.get('models').add(aiLocalizationJob);\n\n extendContentTypes(strapi);\n addContentManagerLocaleMiddleware(strapi);\n\n strapi\n .hook('strapi::content-types.afterSync')\n .register(({ oldContentTypes, contentTypes }: any) =>\n getService('permissions').actions.repairPermissionsForNewlyLocalizedTypes({\n oldContentTypes,\n contentTypes,\n })\n );\n};\n\n// TODO: v5 if implemented in the CM => delete this middleware\n/**\n * Adds middleware on CM creation routes to use i18n locale passed in a specific param\n * @param {Strapi} strapi\n */\nconst addContentManagerLocaleMiddleware = (strapi: Core.Strapi) => {\n strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n\n strapi.server.router.use('/content-manager/single-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n};\n\n/**\n * Adds locale and localization fields to all content types\n * Even if content type is not localized, it will have these fields\n * @param {Strapi} strapi\n */\nconst extendContentTypes = (strapi: Core.Strapi) => {\n const { isLocalizedContentType } = getService('content-types');\n\n Object.values(strapi.contentTypes).forEach((contentType) => {\n const { attributes } = contentType;\n\n const isLocalized = isLocalizedContentType(contentType);\n\n _.set(attributes, 'locale', {\n writable: true,\n private: !isLocalized,\n configurable: false,\n visible: false,\n type: 'string',\n });\n\n _.set(attributes, 'localizations', {\n type: 'relation',\n relation: 'oneToMany',\n target: contentType.uid,\n writable: false,\n private: !isLocalized,\n configurable: false,\n visible: false,\n unstable_virtual: true,\n joinColumn: {\n name: 'document_id',\n referencedColumn: 'document_id',\n referencedTable: strapi.db.metadata.identifiers.getTableName(contentType.collectionName!),\n // ensure the population will not include the results we already loaded\n on({ results }: { results: any[] }) {\n return {\n id: {\n $notIn: results.map((r) => r.id),\n },\n };\n },\n },\n });\n });\n\n if (strapi.plugin('graphql')) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n graphqlProvider({ strapi }).register();\n }\n};\n"],"names":["strapi","get","add","aiLocalizationJob","extendContentTypes","addContentManagerLocaleMiddleware","hook","register","oldContentTypes","contentTypes","getService","actions","repairPermissionsForNewlyLocalizedTypes","server","router","use","ctx","next","method","validateLocaleCreation","isLocalizedContentType","Object","values","forEach","contentType","attributes","isLocalized","_","set","writable","private","configurable","visible","type","relation","target","uid","unstable_virtual","joinColumn","name","referencedColumn","referencedTable","db","metadata","identifiers","getTableName","collectionName","on","results","id","$notIn","map","r","plugin","graphqlProvider"],"mappings":";;;;;;;;;;;;AAQA,eAAe,CAAA,OAAO,EAAEA,MAAM,EAA2B,GAAA;AACvDA,IAAAA,MAAAA,CAAOC,GAAG,CAAC,QAAA,CAAA,CAAUC,GAAG,CAACC,mCAAAA,CAAAA;IAEzBC,kBAAAA,CAAmBJ,MAAAA,CAAAA;IACnBK,iCAAAA,CAAkCL,MAAAA,CAAAA;AAElCA,IAAAA,MAAAA,CACGM,IAAI,CAAC,iCAAA,CAAA,CACLC,QAAQ,CAAC,CAAC,EAAEC,eAAe,EAAEC,YAAY,EAAO,GAC/CC,gBAAAA,CAAW,eAAeC,OAAO,CAACC,uCAAuC,CAAC;AACxEJ,YAAAA,eAAAA;AACAC,YAAAA;AACF,SAAA,CAAA,CAAA;AAEN,CAAA;AAEA;AACA;;;IAIA,MAAMJ,oCAAoC,CAACL,MAAAA,GAAAA;IACzCA,MAAAA,CAAOa,MAAM,CAACC,MAAM,CAACC,GAAG,CAAC,0CAAA,EAA4C,CAACC,GAAAA,EAAKC,IAAAA,GAAAA;AACzE,QAAA,IAAID,IAAIE,MAAM,KAAK,UAAUF,GAAAA,CAAIE,MAAM,KAAK,KAAA,EAAO;AACjD,YAAA,OAAOC,uBAAuBH,GAAAA,EAAKC,IAAAA,CAAAA;AACrC,QAAA;QAEA,OAAOA,IAAAA,EAAAA;AACT,IAAA,CAAA,CAAA;IAEAjB,MAAAA,CAAOa,MAAM,CAACC,MAAM,CAACC,GAAG,CAAC,sCAAA,EAAwC,CAACC,GAAAA,EAAKC,IAAAA,GAAAA;AACrE,QAAA,IAAID,IAAIE,MAAM,KAAK,UAAUF,GAAAA,CAAIE,MAAM,KAAK,KAAA,EAAO;AACjD,YAAA,OAAOC,uBAAuBH,GAAAA,EAAKC,IAAAA,CAAAA;AACrC,QAAA;QAEA,OAAOA,IAAAA,EAAAA;AACT,IAAA,CAAA,CAAA;AACF,CAAA;AAEA;;;;IAKA,MAAMb,qBAAqB,CAACJ,MAAAA,GAAAA;AAC1B,IAAA,MAAM,EAAEoB,sBAAsB,EAAE,GAAGV,gBAAAA,CAAW,eAAA,CAAA;AAE9CW,IAAAA,MAAAA,CAAOC,MAAM,CAACtB,MAAAA,CAAOS,YAAY,CAAA,CAAEc,OAAO,CAAC,CAACC,WAAAA,GAAAA;QAC1C,MAAM,EAAEC,UAAU,EAAE,GAAGD,WAAAA;AAEvB,QAAA,MAAME,cAAcN,sBAAAA,CAAuBI,WAAAA,CAAAA;QAE3CG,kBAAAA,CAAEC,GAAG,CAACH,UAAAA,EAAY,QAAA,EAAU;YAC1BI,QAAAA,EAAU,IAAA;AACVC,YAAAA,OAAAA,EAAS,CAACJ,WAAAA;YACVK,YAAAA,EAAc,KAAA;YACdC,OAAAA,EAAS,KAAA;YACTC,IAAAA,EAAM;AACR,SAAA,CAAA;QAEAN,kBAAAA,CAAEC,GAAG,CAACH,UAAAA,EAAY,eAAA,EAAiB;YACjCQ,IAAAA,EAAM,UAAA;YACNC,QAAAA,EAAU,WAAA;AACVC,YAAAA,MAAAA,EAAQX,YAAYY,GAAG;YACvBP,QAAAA,EAAU,KAAA;AACVC,YAAAA,OAAAA,EAAS,CAACJ,WAAAA;YACVK,YAAAA,EAAc,KAAA;YACdC,OAAAA,EAAS,KAAA;YACTK,gBAAAA,EAAkB,IAAA;YAClBC,UAAAA,EAAY;gBACVC,IAAAA,EAAM,aAAA;gBACNC,gBAAAA,EAAkB,aAAA;gBAClBC,eAAAA,EAAiBzC,MAAAA,CAAO0C,EAAE,CAACC,QAAQ,CAACC,WAAW,CAACC,YAAY,CAACrB,WAAAA,CAAYsB,cAAc,CAAA;;gBAEvFC,EAAAA,CAAAA,CAAG,EAAEC,OAAO,EAAsB,EAAA;oBAChC,OAAO;wBACLC,EAAAA,EAAI;AACFC,4BAAAA,MAAAA,EAAQF,QAAQG,GAAG,CAAC,CAACC,CAAAA,GAAMA,EAAEH,EAAE;AACjC;AACF,qBAAA;AACF,gBAAA;AACF;AACF,SAAA,CAAA;AACF,IAAA,CAAA,CAAA;IAEA,IAAIjD,MAAAA,CAAOqD,MAAM,CAAC,SAAA,CAAA,EAAY;;QAE5BC,OAAAA,CAAgB;AAAEtD,YAAAA;AAAO,SAAA,CAAA,CAAGO,QAAQ,EAAA;AACtC,IAAA;AACF,CAAA;;;;"}
|
package/dist/server/register.mjs
CHANGED
|
@@ -8,6 +8,10 @@ var register = (async ({ strapi })=>{
|
|
|
8
8
|
strapi.get('models').add(aiLocalizationJob);
|
|
9
9
|
extendContentTypes(strapi);
|
|
10
10
|
addContentManagerLocaleMiddleware(strapi);
|
|
11
|
+
strapi.hook('strapi::content-types.afterSync').register(({ oldContentTypes, contentTypes })=>getService('permissions').actions.repairPermissionsForNewlyLocalizedTypes({
|
|
12
|
+
oldContentTypes,
|
|
13
|
+
contentTypes
|
|
14
|
+
}));
|
|
11
15
|
});
|
|
12
16
|
// TODO: v5 if implemented in the CM => delete this middleware
|
|
13
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Core } from '@strapi/types';\n\nimport validateLocaleCreation from './controllers/validate-locale-creation';\nimport graphqlProvider from './graphql';\nimport { getService } from './utils';\nimport { aiLocalizationJob } from './models/ai-localization-job';\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n strapi.get('models').add(aiLocalizationJob);\n\n extendContentTypes(strapi);\n addContentManagerLocaleMiddleware(strapi);\n};\n\n// TODO: v5 if implemented in the CM => delete this middleware\n/**\n * Adds middleware on CM creation routes to use i18n locale passed in a specific param\n * @param {Strapi} strapi\n */\nconst addContentManagerLocaleMiddleware = (strapi: Core.Strapi) => {\n strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n\n strapi.server.router.use('/content-manager/single-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n};\n\n/**\n * Adds locale and localization fields to all content types\n * Even if content type is not localized, it will have these fields\n * @param {Strapi} strapi\n */\nconst extendContentTypes = (strapi: Core.Strapi) => {\n const { isLocalizedContentType } = getService('content-types');\n\n Object.values(strapi.contentTypes).forEach((contentType) => {\n const { attributes } = contentType;\n\n const isLocalized = isLocalizedContentType(contentType);\n\n _.set(attributes, 'locale', {\n writable: true,\n private: !isLocalized,\n configurable: false,\n visible: false,\n type: 'string',\n });\n\n _.set(attributes, 'localizations', {\n type: 'relation',\n relation: 'oneToMany',\n target: contentType.uid,\n writable: false,\n private: !isLocalized,\n configurable: false,\n visible: false,\n unstable_virtual: true,\n joinColumn: {\n name: 'document_id',\n referencedColumn: 'document_id',\n referencedTable: strapi.db.metadata.identifiers.getTableName(contentType.collectionName!),\n // ensure the population will not include the results we already loaded\n on({ results }: { results: any[] }) {\n return {\n id: {\n $notIn: results.map((r) => r.id),\n },\n };\n },\n },\n });\n });\n\n if (strapi.plugin('graphql')) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n graphqlProvider({ strapi }).register();\n }\n};\n"],"names":["strapi","get","add","aiLocalizationJob","extendContentTypes","addContentManagerLocaleMiddleware","server","router","use","ctx","next","method","validateLocaleCreation","isLocalizedContentType","
|
|
1
|
+
{"version":3,"file":"register.mjs","sources":["../../server/src/register.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Core } from '@strapi/types';\n\nimport validateLocaleCreation from './controllers/validate-locale-creation';\nimport graphqlProvider from './graphql';\nimport { getService } from './utils';\nimport { aiLocalizationJob } from './models/ai-localization-job';\n\nexport default async ({ strapi }: { strapi: Core.Strapi }) => {\n strapi.get('models').add(aiLocalizationJob);\n\n extendContentTypes(strapi);\n addContentManagerLocaleMiddleware(strapi);\n\n strapi\n .hook('strapi::content-types.afterSync')\n .register(({ oldContentTypes, contentTypes }: any) =>\n getService('permissions').actions.repairPermissionsForNewlyLocalizedTypes({\n oldContentTypes,\n contentTypes,\n })\n );\n};\n\n// TODO: v5 if implemented in the CM => delete this middleware\n/**\n * Adds middleware on CM creation routes to use i18n locale passed in a specific param\n * @param {Strapi} strapi\n */\nconst addContentManagerLocaleMiddleware = (strapi: Core.Strapi) => {\n strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n\n strapi.server.router.use('/content-manager/single-types/:model', (ctx, next) => {\n if (ctx.method === 'POST' || ctx.method === 'PUT') {\n return validateLocaleCreation(ctx, next);\n }\n\n return next();\n });\n};\n\n/**\n * Adds locale and localization fields to all content types\n * Even if content type is not localized, it will have these fields\n * @param {Strapi} strapi\n */\nconst extendContentTypes = (strapi: Core.Strapi) => {\n const { isLocalizedContentType } = getService('content-types');\n\n Object.values(strapi.contentTypes).forEach((contentType) => {\n const { attributes } = contentType;\n\n const isLocalized = isLocalizedContentType(contentType);\n\n _.set(attributes, 'locale', {\n writable: true,\n private: !isLocalized,\n configurable: false,\n visible: false,\n type: 'string',\n });\n\n _.set(attributes, 'localizations', {\n type: 'relation',\n relation: 'oneToMany',\n target: contentType.uid,\n writable: false,\n private: !isLocalized,\n configurable: false,\n visible: false,\n unstable_virtual: true,\n joinColumn: {\n name: 'document_id',\n referencedColumn: 'document_id',\n referencedTable: strapi.db.metadata.identifiers.getTableName(contentType.collectionName!),\n // ensure the population will not include the results we already loaded\n on({ results }: { results: any[] }) {\n return {\n id: {\n $notIn: results.map((r) => r.id),\n },\n };\n },\n },\n });\n });\n\n if (strapi.plugin('graphql')) {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n graphqlProvider({ strapi }).register();\n }\n};\n"],"names":["strapi","get","add","aiLocalizationJob","extendContentTypes","addContentManagerLocaleMiddleware","hook","register","oldContentTypes","contentTypes","getService","actions","repairPermissionsForNewlyLocalizedTypes","server","router","use","ctx","next","method","validateLocaleCreation","isLocalizedContentType","Object","values","forEach","contentType","attributes","isLocalized","_","set","writable","private","configurable","visible","type","relation","target","uid","unstable_virtual","joinColumn","name","referencedColumn","referencedTable","db","metadata","identifiers","getTableName","collectionName","on","results","id","$notIn","map","r","plugin","graphqlProvider"],"mappings":"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"}
|
|
@@ -88,6 +88,97 @@ const addAllLocalesToPermissions = async (permissions)=>{
|
|
|
88
88
|
};
|
|
89
89
|
}));
|
|
90
90
|
};
|
|
91
|
+
/**
|
|
92
|
+
* `properties.locales === null` means access to all locales (see engine handler) — do not patch.
|
|
93
|
+
*/ const needsLocalesPatch = (properties = {})=>{
|
|
94
|
+
if (!('locales' in properties)) {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
const { locales } = properties;
|
|
98
|
+
if (locales === null) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return Array.isArray(locales) && locales.length === 0;
|
|
102
|
+
};
|
|
103
|
+
const normalizeRolePermissionsLocales = async (permissions)=>{
|
|
104
|
+
const { isLocalizedContentType } = index.getService('content-types');
|
|
105
|
+
const { actionProvider } = strapi.service('admin::permission');
|
|
106
|
+
const defaultLocale = await index.getService('locales').getDefaultLocale();
|
|
107
|
+
return Promise.all(permissions.map(async (permission)=>{
|
|
108
|
+
const { subject, action, properties = {} } = permission;
|
|
109
|
+
if (!subject) {
|
|
110
|
+
return permission;
|
|
111
|
+
}
|
|
112
|
+
const model = strapi.getModel(subject);
|
|
113
|
+
if (!model || !isLocalizedContentType(model)) {
|
|
114
|
+
return permission;
|
|
115
|
+
}
|
|
116
|
+
const appliesToLocales = await actionProvider.appliesToProperty('locales', action, subject);
|
|
117
|
+
if (!appliesToLocales) {
|
|
118
|
+
return permission;
|
|
119
|
+
}
|
|
120
|
+
// null means access to all locales — same semantics as the permission engine handler
|
|
121
|
+
if (properties.locales === null) {
|
|
122
|
+
return permission;
|
|
123
|
+
}
|
|
124
|
+
if (needsLocalesPatch(properties) && defaultLocale) {
|
|
125
|
+
return {
|
|
126
|
+
...permission,
|
|
127
|
+
properties: {
|
|
128
|
+
...properties,
|
|
129
|
+
locales: [
|
|
130
|
+
defaultLocale
|
|
131
|
+
]
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return permission;
|
|
136
|
+
}));
|
|
137
|
+
};
|
|
138
|
+
/**
|
|
139
|
+
* Repairs role permissions on content types that just had i18n enabled in this sync.
|
|
140
|
+
* Only patches permissions where `properties.locales` is missing or `[]`; leaves `null` alone.
|
|
141
|
+
* Safe to run at `afterSync` time because it does not depend on the actionProvider.
|
|
142
|
+
*/ const repairPermissionsForNewlyLocalizedTypes = async ({ oldContentTypes, contentTypes })=>{
|
|
143
|
+
if (!oldContentTypes) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const { isLocalizedContentType } = index.getService('content-types');
|
|
147
|
+
const newlyLocalizedUids = Object.keys(contentTypes).filter((uid)=>oldContentTypes[uid] && !isLocalizedContentType(oldContentTypes[uid]) && isLocalizedContentType(contentTypes[uid]));
|
|
148
|
+
if (newlyLocalizedUids.length === 0) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
const defaultLocaleCode = await index.getService('locales').getDefaultLocale();
|
|
153
|
+
if (!defaultLocaleCode) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
const permissionService = strapi.service('admin::permission');
|
|
157
|
+
const allPermissions = await permissionService.findMany({
|
|
158
|
+
where: {
|
|
159
|
+
subject: {
|
|
160
|
+
$in: newlyLocalizedUids
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
const results = await Promise.allSettled(allPermissions.filter((permission)=>needsLocalesPatch(permission.properties)).map((permission)=>strapi.db.query('admin::permission').update({
|
|
165
|
+
where: {
|
|
166
|
+
id: permission.id
|
|
167
|
+
},
|
|
168
|
+
data: {
|
|
169
|
+
properties: {
|
|
170
|
+
...permission.properties,
|
|
171
|
+
locales: [
|
|
172
|
+
defaultLocaleCode
|
|
173
|
+
]
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
})));
|
|
177
|
+
results.filter((r)=>r.status === 'rejected').forEach((r)=>strapi.log.error('Failed to patch i18n permission during newly-localized type repair.', r.reason));
|
|
178
|
+
} catch (error) {
|
|
179
|
+
strapi.log.error('Failed to repair i18n permissions for newly localized content types.', error);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
91
182
|
const syncSuperAdminPermissionsWithLocales = async ()=>{
|
|
92
183
|
const roleService = strapi.service('admin::role');
|
|
93
184
|
const permissionService = strapi.service('admin::permission');
|
|
@@ -114,6 +205,7 @@ const registerI18nActionsHooks = ()=>{
|
|
|
114
205
|
const { hooks } = strapi.service('admin::role');
|
|
115
206
|
actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);
|
|
116
207
|
hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);
|
|
208
|
+
hooks.willValidateUpdatePermissions.register(normalizeRolePermissionsLocales);
|
|
117
209
|
};
|
|
118
210
|
const updateActionsProperties = ()=>{
|
|
119
211
|
const { actionProvider } = strapi.service('admin::permission');
|
|
@@ -129,7 +221,9 @@ var i18nActionsService = {
|
|
|
129
221
|
registerI18nActions,
|
|
130
222
|
registerI18nActionsHooks,
|
|
131
223
|
updateActionsProperties,
|
|
132
|
-
syncSuperAdminPermissionsWithLocales
|
|
224
|
+
syncSuperAdminPermissionsWithLocales,
|
|
225
|
+
repairPermissionsForNewlyLocalizedTypes,
|
|
226
|
+
normalizeRolePermissionsLocales
|
|
133
227
|
};
|
|
134
228
|
|
|
135
229
|
module.exports = i18nActionsService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sources":["../../../../server/src/services/permissions/actions.ts"],"sourcesContent":["import { isArray, getOr, prop } from 'lodash/fp';\nimport { getService } from '../../utils';\n\nconst actions = [\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Create',\n uid: 'locale.create',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Read',\n uid: 'locale.read',\n aliases: [\n { actionId: 'plugin::content-manager.explorer.read', subjects: ['plugin::i18n.locale'] },\n ],\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Update',\n uid: 'locale.update',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Delete',\n uid: 'locale.delete',\n },\n];\n\nconst addLocalesPropertyIfNeeded = ({ value: action }: any) => {\n const {\n section,\n options: { applyToProperties },\n } = action;\n\n // Only add the locales property to contentTypes' actions\n if (section !== 'contentTypes') {\n return;\n }\n\n // If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps\n if (isArray(applyToProperties) && applyToProperties.includes('locales')) {\n return;\n }\n\n // Add the 'locales' property to the applyToProperties array (create it if necessary)\n action.options.applyToProperties = isArray(applyToProperties)\n ? applyToProperties.concat('locales')\n : ['locales'];\n};\n\nconst shouldApplyLocalesPropertyToSubject = ({ property, subject }: any) => {\n if (property === 'locales') {\n const model = strapi.getModel(subject);\n\n return getService('content-types').isLocalizedContentType(model);\n }\n\n return true;\n};\n\nconst addAllLocalesToPermissions = async (permissions: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n const { find: findAllLocales } = getService('locales');\n\n const allLocales = await findAllLocales();\n const allLocalesCode = allLocales.map(prop('code'));\n\n return Promise.all(\n permissions.map(async (permission: any) => {\n const { action, subject } = permission;\n\n const appliesToLocalesProperty = await actionProvider.appliesToProperty(\n 'locales',\n action,\n subject\n );\n\n if (!appliesToLocalesProperty) {\n return permission;\n }\n\n const oldPermissionProperties = getOr({}, 'properties', permission);\n\n return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };\n })\n );\n};\n\nconst syncSuperAdminPermissionsWithLocales = async () => {\n const roleService = strapi.service('admin::role');\n const permissionService = strapi.service('admin::permission');\n\n const superAdminRole = await roleService.getSuperAdmin();\n\n if (!superAdminRole) {\n return;\n }\n\n const superAdminPermissions = await permissionService.findMany({\n where: {\n role: {\n id: superAdminRole.id,\n },\n },\n });\n\n const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);\n\n await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);\n};\n\nconst registerI18nActions = async () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n await actionProvider.registerMany(actions);\n};\n\nconst registerI18nActionsHooks = () => {\n const { actionProvider } = strapi.service('admin::permission');\n const { hooks } = strapi.service('admin::role');\n\n actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);\n hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);\n};\n\nconst updateActionsProperties = () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n // Register the transformation for every new action\n actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);\n\n // Handle already registered actions\n actionProvider.values().forEach((action: any) => addLocalesPropertyIfNeeded({ value: action }));\n};\n\nexport default {\n actions,\n registerI18nActions,\n registerI18nActionsHooks,\n updateActionsProperties,\n syncSuperAdminPermissionsWithLocales,\n};\n"],"names":["actions","section","category","subCategory","pluginName","displayName","uid","aliases","actionId","subjects","addLocalesPropertyIfNeeded","value","action","options","applyToProperties","isArray","includes","concat","shouldApplyLocalesPropertyToSubject","property","subject","model","strapi","getModel","getService","isLocalizedContentType","addAllLocalesToPermissions","permissions","actionProvider","service","find","findAllLocales","allLocales","allLocalesCode","map","prop","Promise","all","permission","appliesToLocalesProperty","appliesToProperty","oldPermissionProperties","getOr","properties","locales","syncSuperAdminPermissionsWithLocales","roleService","permissionService","superAdminRole","getSuperAdmin","superAdminPermissions","findMany","where","role","id","newSuperAdminPermissions","assignPermissions","registerI18nActions","registerMany","registerI18nActionsHooks","hooks","appliesPropertyToSubject","register","willResetSuperAdminPermissions","updateActionsProperties","willRegister","values","forEach"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"actions.js","sources":["../../../../server/src/services/permissions/actions.ts"],"sourcesContent":["import { isArray, getOr, prop } from 'lodash/fp';\nimport { getService } from '../../utils';\n\nconst actions = [\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Create',\n uid: 'locale.create',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Read',\n uid: 'locale.read',\n aliases: [\n { actionId: 'plugin::content-manager.explorer.read', subjects: ['plugin::i18n.locale'] },\n ],\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Update',\n uid: 'locale.update',\n },\n {\n section: 'settings',\n category: 'Internationalization',\n subCategory: 'Locales',\n pluginName: 'i18n',\n displayName: 'Delete',\n uid: 'locale.delete',\n },\n];\n\nconst addLocalesPropertyIfNeeded = ({ value: action }: any) => {\n const {\n section,\n options: { applyToProperties },\n } = action;\n\n // Only add the locales property to contentTypes' actions\n if (section !== 'contentTypes') {\n return;\n }\n\n // If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps\n if (isArray(applyToProperties) && applyToProperties.includes('locales')) {\n return;\n }\n\n // Add the 'locales' property to the applyToProperties array (create it if necessary)\n action.options.applyToProperties = isArray(applyToProperties)\n ? applyToProperties.concat('locales')\n : ['locales'];\n};\n\nconst shouldApplyLocalesPropertyToSubject = ({ property, subject }: any) => {\n if (property === 'locales') {\n const model = strapi.getModel(subject);\n\n return getService('content-types').isLocalizedContentType(model);\n }\n\n return true;\n};\n\nconst addAllLocalesToPermissions = async (permissions: any) => {\n const { actionProvider } = strapi.service('admin::permission');\n const { find: findAllLocales } = getService('locales');\n\n const allLocales = await findAllLocales();\n const allLocalesCode = allLocales.map(prop('code'));\n\n return Promise.all(\n permissions.map(async (permission: any) => {\n const { action, subject } = permission;\n\n const appliesToLocalesProperty = await actionProvider.appliesToProperty(\n 'locales',\n action,\n subject\n );\n\n if (!appliesToLocalesProperty) {\n return permission;\n }\n\n const oldPermissionProperties = getOr({}, 'properties', permission);\n\n return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };\n })\n );\n};\n\n/**\n * `properties.locales === null` means access to all locales (see engine handler) — do not patch.\n */\nconst needsLocalesPatch = (properties: Record<string, unknown> = {}) => {\n if (!('locales' in properties)) {\n return true;\n }\n\n const { locales } = properties;\n\n if (locales === null) {\n return false;\n }\n\n return Array.isArray(locales) && locales.length === 0;\n};\n\nconst normalizeRolePermissionsLocales = async (permissions: any[]): Promise<any[]> => {\n const { isLocalizedContentType } = getService('content-types');\n const { actionProvider } = strapi.service('admin::permission');\n const defaultLocale = await getService('locales').getDefaultLocale();\n\n return Promise.all(\n permissions.map(async (permission) => {\n const { subject, action, properties = {} } = permission;\n\n if (!subject) {\n return permission;\n }\n\n const model = strapi.getModel(subject);\n\n if (!model || !isLocalizedContentType(model)) {\n return permission;\n }\n\n const appliesToLocales = await actionProvider.appliesToProperty('locales', action, subject);\n\n if (!appliesToLocales) {\n return permission;\n }\n\n // null means access to all locales — same semantics as the permission engine handler\n if (properties.locales === null) {\n return permission;\n }\n\n if (needsLocalesPatch(properties) && defaultLocale) {\n return { ...permission, properties: { ...properties, locales: [defaultLocale] } };\n }\n\n return permission;\n })\n );\n};\n\n/**\n * Repairs role permissions on content types that just had i18n enabled in this sync.\n * Only patches permissions where `properties.locales` is missing or `[]`; leaves `null` alone.\n * Safe to run at `afterSync` time because it does not depend on the actionProvider.\n */\nconst repairPermissionsForNewlyLocalizedTypes = async ({\n oldContentTypes,\n contentTypes,\n}: {\n oldContentTypes: Record<string, any> | null | undefined;\n contentTypes: Record<string, any>;\n}) => {\n if (!oldContentTypes) {\n return;\n }\n\n const { isLocalizedContentType } = getService('content-types');\n\n const newlyLocalizedUids = Object.keys(contentTypes).filter(\n (uid) =>\n oldContentTypes[uid] &&\n !isLocalizedContentType(oldContentTypes[uid]) &&\n isLocalizedContentType(contentTypes[uid])\n );\n\n if (newlyLocalizedUids.length === 0) {\n return;\n }\n\n try {\n const defaultLocaleCode = await getService('locales').getDefaultLocale();\n if (!defaultLocaleCode) {\n return;\n }\n\n const permissionService = strapi.service('admin::permission');\n const allPermissions = await permissionService.findMany({\n where: { subject: { $in: newlyLocalizedUids } },\n });\n\n const results = await Promise.allSettled(\n allPermissions\n .filter((permission: any) => needsLocalesPatch(permission.properties))\n .map((permission: any) =>\n strapi.db.query('admin::permission').update({\n where: { id: permission.id },\n data: {\n properties: { ...permission.properties, locales: [defaultLocaleCode] },\n },\n })\n )\n );\n\n results\n .filter((r): r is PromiseRejectedResult => r.status === 'rejected')\n .forEach((r) =>\n strapi.log.error(\n 'Failed to patch i18n permission during newly-localized type repair.',\n r.reason\n )\n );\n } catch (error) {\n strapi.log.error('Failed to repair i18n permissions for newly localized content types.', error);\n }\n};\n\nconst syncSuperAdminPermissionsWithLocales = async () => {\n const roleService = strapi.service('admin::role');\n const permissionService = strapi.service('admin::permission');\n\n const superAdminRole = await roleService.getSuperAdmin();\n\n if (!superAdminRole) {\n return;\n }\n\n const superAdminPermissions = await permissionService.findMany({\n where: {\n role: {\n id: superAdminRole.id,\n },\n },\n });\n\n const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);\n\n await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);\n};\n\nconst registerI18nActions = async () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n await actionProvider.registerMany(actions);\n};\n\nconst registerI18nActionsHooks = () => {\n const { actionProvider } = strapi.service('admin::permission');\n const { hooks } = strapi.service('admin::role');\n\n actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);\n hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);\n hooks.willValidateUpdatePermissions.register(normalizeRolePermissionsLocales);\n};\n\nconst updateActionsProperties = () => {\n const { actionProvider } = strapi.service('admin::permission');\n\n // Register the transformation for every new action\n actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);\n\n // Handle already registered actions\n actionProvider.values().forEach((action: any) => addLocalesPropertyIfNeeded({ value: action }));\n};\n\nexport default {\n actions,\n registerI18nActions,\n registerI18nActionsHooks,\n updateActionsProperties,\n syncSuperAdminPermissionsWithLocales,\n repairPermissionsForNewlyLocalizedTypes,\n normalizeRolePermissionsLocales,\n};\n"],"names":["actions","section","category","subCategory","pluginName","displayName","uid","aliases","actionId","subjects","addLocalesPropertyIfNeeded","value","action","options","applyToProperties","isArray","includes","concat","shouldApplyLocalesPropertyToSubject","property","subject","model","strapi","getModel","getService","isLocalizedContentType","addAllLocalesToPermissions","permissions","actionProvider","service","find","findAllLocales","allLocales","allLocalesCode","map","prop","Promise","all","permission","appliesToLocalesProperty","appliesToProperty","oldPermissionProperties","getOr","properties","locales","needsLocalesPatch","Array","length","normalizeRolePermissionsLocales","defaultLocale","getDefaultLocale","appliesToLocales","repairPermissionsForNewlyLocalizedTypes","oldContentTypes","contentTypes","newlyLocalizedUids","Object","keys","filter","defaultLocaleCode","permissionService","allPermissions","findMany","where","$in","results","allSettled","db","query","update","id","data","r","status","forEach","log","error","reason","syncSuperAdminPermissionsWithLocales","roleService","superAdminRole","getSuperAdmin","superAdminPermissions","role","newSuperAdminPermissions","assignPermissions","registerI18nActions","registerMany","registerI18nActionsHooks","hooks","appliesPropertyToSubject","register","willResetSuperAdminPermissions","willValidateUpdatePermissions","updateActionsProperties","willRegister","values"],"mappings":"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"}
|
|
@@ -86,6 +86,97 @@ const addAllLocalesToPermissions = async (permissions)=>{
|
|
|
86
86
|
};
|
|
87
87
|
}));
|
|
88
88
|
};
|
|
89
|
+
/**
|
|
90
|
+
* `properties.locales === null` means access to all locales (see engine handler) — do not patch.
|
|
91
|
+
*/ const needsLocalesPatch = (properties = {})=>{
|
|
92
|
+
if (!('locales' in properties)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
const { locales } = properties;
|
|
96
|
+
if (locales === null) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return Array.isArray(locales) && locales.length === 0;
|
|
100
|
+
};
|
|
101
|
+
const normalizeRolePermissionsLocales = async (permissions)=>{
|
|
102
|
+
const { isLocalizedContentType } = getService('content-types');
|
|
103
|
+
const { actionProvider } = strapi.service('admin::permission');
|
|
104
|
+
const defaultLocale = await getService('locales').getDefaultLocale();
|
|
105
|
+
return Promise.all(permissions.map(async (permission)=>{
|
|
106
|
+
const { subject, action, properties = {} } = permission;
|
|
107
|
+
if (!subject) {
|
|
108
|
+
return permission;
|
|
109
|
+
}
|
|
110
|
+
const model = strapi.getModel(subject);
|
|
111
|
+
if (!model || !isLocalizedContentType(model)) {
|
|
112
|
+
return permission;
|
|
113
|
+
}
|
|
114
|
+
const appliesToLocales = await actionProvider.appliesToProperty('locales', action, subject);
|
|
115
|
+
if (!appliesToLocales) {
|
|
116
|
+
return permission;
|
|
117
|
+
}
|
|
118
|
+
// null means access to all locales — same semantics as the permission engine handler
|
|
119
|
+
if (properties.locales === null) {
|
|
120
|
+
return permission;
|
|
121
|
+
}
|
|
122
|
+
if (needsLocalesPatch(properties) && defaultLocale) {
|
|
123
|
+
return {
|
|
124
|
+
...permission,
|
|
125
|
+
properties: {
|
|
126
|
+
...properties,
|
|
127
|
+
locales: [
|
|
128
|
+
defaultLocale
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return permission;
|
|
134
|
+
}));
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Repairs role permissions on content types that just had i18n enabled in this sync.
|
|
138
|
+
* Only patches permissions where `properties.locales` is missing or `[]`; leaves `null` alone.
|
|
139
|
+
* Safe to run at `afterSync` time because it does not depend on the actionProvider.
|
|
140
|
+
*/ const repairPermissionsForNewlyLocalizedTypes = async ({ oldContentTypes, contentTypes })=>{
|
|
141
|
+
if (!oldContentTypes) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const { isLocalizedContentType } = getService('content-types');
|
|
145
|
+
const newlyLocalizedUids = Object.keys(contentTypes).filter((uid)=>oldContentTypes[uid] && !isLocalizedContentType(oldContentTypes[uid]) && isLocalizedContentType(contentTypes[uid]));
|
|
146
|
+
if (newlyLocalizedUids.length === 0) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
try {
|
|
150
|
+
const defaultLocaleCode = await getService('locales').getDefaultLocale();
|
|
151
|
+
if (!defaultLocaleCode) {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const permissionService = strapi.service('admin::permission');
|
|
155
|
+
const allPermissions = await permissionService.findMany({
|
|
156
|
+
where: {
|
|
157
|
+
subject: {
|
|
158
|
+
$in: newlyLocalizedUids
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
const results = await Promise.allSettled(allPermissions.filter((permission)=>needsLocalesPatch(permission.properties)).map((permission)=>strapi.db.query('admin::permission').update({
|
|
163
|
+
where: {
|
|
164
|
+
id: permission.id
|
|
165
|
+
},
|
|
166
|
+
data: {
|
|
167
|
+
properties: {
|
|
168
|
+
...permission.properties,
|
|
169
|
+
locales: [
|
|
170
|
+
defaultLocaleCode
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
})));
|
|
175
|
+
results.filter((r)=>r.status === 'rejected').forEach((r)=>strapi.log.error('Failed to patch i18n permission during newly-localized type repair.', r.reason));
|
|
176
|
+
} catch (error) {
|
|
177
|
+
strapi.log.error('Failed to repair i18n permissions for newly localized content types.', error);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
89
180
|
const syncSuperAdminPermissionsWithLocales = async ()=>{
|
|
90
181
|
const roleService = strapi.service('admin::role');
|
|
91
182
|
const permissionService = strapi.service('admin::permission');
|
|
@@ -112,6 +203,7 @@ const registerI18nActionsHooks = ()=>{
|
|
|
112
203
|
const { hooks } = strapi.service('admin::role');
|
|
113
204
|
actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);
|
|
114
205
|
hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);
|
|
206
|
+
hooks.willValidateUpdatePermissions.register(normalizeRolePermissionsLocales);
|
|
115
207
|
};
|
|
116
208
|
const updateActionsProperties = ()=>{
|
|
117
209
|
const { actionProvider } = strapi.service('admin::permission');
|
|
@@ -127,7 +219,9 @@ var i18nActionsService = {
|
|
|
127
219
|
registerI18nActions,
|
|
128
220
|
registerI18nActionsHooks,
|
|
129
221
|
updateActionsProperties,
|
|
130
|
-
syncSuperAdminPermissionsWithLocales
|
|
222
|
+
syncSuperAdminPermissionsWithLocales,
|
|
223
|
+
repairPermissionsForNewlyLocalizedTypes,
|
|
224
|
+
normalizeRolePermissionsLocales
|
|
131
225
|
};
|
|
132
226
|
|
|
133
227
|
export { i18nActionsService as default };
|