@strapi/i18n 0.0.0-experimental.afa3b513b8f95459043f33fb94f4bac03af1474f → 0.0.0-experimental.b0240412a007bea5d73c29b17c8ce04802fca919
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/_chunks/{SettingsPage-BjxjwEOb.mjs → SettingsPage-B-KzAqT3.mjs} +4 -4
- package/dist/_chunks/SettingsPage-B-KzAqT3.mjs.map +1 -0
- package/dist/_chunks/{SettingsPage-CfTmCkup.js → SettingsPage-hyOi94O9.js} +5 -6
- package/dist/_chunks/SettingsPage-hyOi94O9.js.map +1 -0
- package/dist/_chunks/{de-DtWiGdHl.js → de-BOhNX_-5.js} +1 -2
- package/dist/_chunks/de-BOhNX_-5.js.map +1 -0
- package/dist/_chunks/{de-9eCAqqrB.mjs → de-D80IRBP9.mjs} +1 -2
- package/dist/_chunks/de-D80IRBP9.mjs.map +1 -0
- package/dist/_chunks/{dk-2qBjxt-P.mjs → dk-CJ6Zzz78.mjs} +1 -2
- package/dist/_chunks/dk-CJ6Zzz78.mjs.map +1 -0
- package/dist/_chunks/{dk-D8C-casx.js → dk-cjXm0p3m.js} +1 -2
- package/dist/_chunks/dk-cjXm0p3m.js.map +1 -0
- package/dist/_chunks/{en-2xztdZE1.mjs → en-BTyF7WVW.mjs} +5 -5
- package/dist/_chunks/en-BTyF7WVW.mjs.map +1 -0
- package/dist/_chunks/{en-DWpfm8h5.js → en-UlC0jh2t.js} +5 -5
- package/dist/_chunks/en-UlC0jh2t.js.map +1 -0
- package/dist/_chunks/{es-DlmMVaBG.mjs → es-V8WnPN7w.mjs} +1 -2
- package/dist/_chunks/es-V8WnPN7w.mjs.map +1 -0
- package/dist/_chunks/{es-DS-XFGSw.js → es-hr9b_HLp.js} +1 -2
- package/dist/_chunks/es-hr9b_HLp.js.map +1 -0
- package/dist/_chunks/{fr-BTjekDpq.js → fr-BFmBbE0H.js} +1 -2
- package/dist/_chunks/fr-BFmBbE0H.js.map +1 -0
- package/dist/_chunks/{fr-3S6ke71d.mjs → fr-F94noFiV.mjs} +1 -2
- package/dist/_chunks/fr-F94noFiV.mjs.map +1 -0
- package/dist/_chunks/{index-D-qx3tz4.mjs → index-BcYj5jo9.mjs} +114 -89
- package/dist/_chunks/index-BcYj5jo9.mjs.map +1 -0
- package/dist/_chunks/{index-5XLZwzwx.js → index-C8NzsAKp.js} +114 -90
- package/dist/_chunks/index-C8NzsAKp.js.map +1 -0
- package/dist/_chunks/{ko-DmcGUBQ3.js → ko-C40pNQ9b.js} +1 -2
- package/dist/_chunks/ko-C40pNQ9b.js.map +1 -0
- package/dist/_chunks/{ko-qTjQ8IMw.mjs → ko-CF-P3Car.mjs} +1 -2
- package/dist/_chunks/ko-CF-P3Car.mjs.map +1 -0
- package/dist/_chunks/{pl-B67TSHqT.mjs → pl-Dxr9RUmD.mjs} +1 -2
- package/dist/_chunks/pl-Dxr9RUmD.mjs.map +1 -0
- package/dist/_chunks/{pl-Cn5RYonZ.js → pl-JtWBy-JQ.js} +1 -2
- package/dist/_chunks/pl-JtWBy-JQ.js.map +1 -0
- package/dist/_chunks/{ru-hagMa57T.mjs → ru-B-4sVwXN.mjs} +1 -2
- package/dist/_chunks/ru-B-4sVwXN.mjs.map +1 -0
- package/dist/_chunks/{ru-BMBgVL3s.js → ru-COSWt3Nu.js} +1 -2
- package/dist/_chunks/ru-COSWt3Nu.js.map +1 -0
- package/dist/_chunks/{tr-CarUU76c.js → tr-BVj1O5ch.js} +1 -2
- package/dist/_chunks/tr-BVj1O5ch.js.map +1 -0
- package/dist/_chunks/{tr-Dw_jmkG-.mjs → tr-Ccu6Yj11.mjs} +1 -2
- package/dist/_chunks/tr-Ccu6Yj11.mjs.map +1 -0
- package/dist/_chunks/{zh-57YM4amO.mjs → zh-BIz395Ms.mjs} +1 -2
- package/dist/_chunks/zh-BIz395Ms.mjs.map +1 -0
- package/dist/_chunks/{zh-Hans-Dyc-aR-h.mjs → zh-Hans-Bfo6_TCM.mjs} +1 -2
- package/dist/_chunks/zh-Hans-Bfo6_TCM.mjs.map +1 -0
- package/dist/_chunks/{zh-Hans-DSHIXAa3.js → zh-Hans-DIEm_EMC.js} +1 -2
- package/dist/_chunks/zh-Hans-DIEm_EMC.js.map +1 -0
- package/dist/_chunks/{zh-CukOviB0.js → zh-wkBPBkhc.js} +1 -2
- package/dist/_chunks/zh-wkBPBkhc.js.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/components/CMHeaderActions.d.ts +5 -3
- package/dist/admin/src/components/CreateLocale.d.ts +6 -6
- package/dist/admin/src/components/LocaleListCell.d.ts +4 -4
- package/dist/server/index.js +398 -421
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +399 -421
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/index.d.ts +6 -0
- 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/index.d.ts +6 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/sanitize/index.d.ts +11 -0
- package/dist/server/src/services/sanitize/index.d.ts.map +1 -0
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/package.json +13 -14
- package/dist/_chunks/SettingsPage-BjxjwEOb.mjs.map +0 -1
- package/dist/_chunks/SettingsPage-CfTmCkup.js.map +0 -1
- package/dist/_chunks/de-9eCAqqrB.mjs.map +0 -1
- package/dist/_chunks/de-DtWiGdHl.js.map +0 -1
- package/dist/_chunks/dk-2qBjxt-P.mjs.map +0 -1
- package/dist/_chunks/dk-D8C-casx.js.map +0 -1
- package/dist/_chunks/en-2xztdZE1.mjs.map +0 -1
- package/dist/_chunks/en-DWpfm8h5.js.map +0 -1
- package/dist/_chunks/es-DS-XFGSw.js.map +0 -1
- package/dist/_chunks/es-DlmMVaBG.mjs.map +0 -1
- package/dist/_chunks/fr-3S6ke71d.mjs.map +0 -1
- package/dist/_chunks/fr-BTjekDpq.js.map +0 -1
- package/dist/_chunks/index-5XLZwzwx.js.map +0 -1
- package/dist/_chunks/index-D-qx3tz4.mjs.map +0 -1
- package/dist/_chunks/ko-DmcGUBQ3.js.map +0 -1
- package/dist/_chunks/ko-qTjQ8IMw.mjs.map +0 -1
- package/dist/_chunks/pl-B67TSHqT.mjs.map +0 -1
- package/dist/_chunks/pl-Cn5RYonZ.js.map +0 -1
- package/dist/_chunks/ru-BMBgVL3s.js.map +0 -1
- package/dist/_chunks/ru-hagMa57T.mjs.map +0 -1
- package/dist/_chunks/tr-CarUU76c.js.map +0 -1
- package/dist/_chunks/tr-Dw_jmkG-.mjs.map +0 -1
- package/dist/_chunks/zh-57YM4amO.mjs.map +0 -1
- package/dist/_chunks/zh-CukOviB0.js.map +0 -1
- package/dist/_chunks/zh-Hans-DSHIXAa3.js.map +0 -1
- package/dist/_chunks/zh-Hans-Dyc-aR-h.mjs.map +0 -1
- package/dist/server/src/migrations/content-type/disable/index.d.ts +0 -3
- package/dist/server/src/migrations/content-type/disable/index.d.ts.map +0 -1
- package/dist/server/src/migrations/content-type/enable/index.d.ts +0 -3
- package/dist/server/src/migrations/content-type/enable/index.d.ts.map +0 -1
package/dist/server/index.js
CHANGED
@@ -4,8 +4,7 @@ const fp = require("lodash/fp");
|
|
4
4
|
const utils = require("@strapi/utils");
|
5
5
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
6
6
|
function _interopNamespace(e) {
|
7
|
-
if (e && e.__esModule)
|
8
|
-
return e;
|
7
|
+
if (e && e.__esModule) return e;
|
9
8
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
10
9
|
if (e) {
|
11
10
|
for (const k in e) {
|
@@ -195,6 +194,352 @@ const getI18nLocaleArgPlugin = ({ nexus, typeRegistry }) => {
|
|
195
194
|
}
|
196
195
|
});
|
197
196
|
};
|
197
|
+
const register = ({ strapi: strapi2 }) => {
|
198
|
+
extendContentTypes(strapi2);
|
199
|
+
addContentManagerLocaleMiddleware(strapi2);
|
200
|
+
};
|
201
|
+
const addContentManagerLocaleMiddleware = (strapi2) => {
|
202
|
+
strapi2.server.router.use("/content-manager/collection-types/:model", (ctx, next) => {
|
203
|
+
if (ctx.method === "POST" || ctx.method === "PUT") {
|
204
|
+
return validateLocaleCreation(ctx, next);
|
205
|
+
}
|
206
|
+
return next();
|
207
|
+
});
|
208
|
+
strapi2.server.router.use("/content-manager/single-types/:model", (ctx, next) => {
|
209
|
+
if (ctx.method === "POST" || ctx.method === "PUT") {
|
210
|
+
return validateLocaleCreation(ctx, next);
|
211
|
+
}
|
212
|
+
return next();
|
213
|
+
});
|
214
|
+
};
|
215
|
+
const extendContentTypes = (strapi2) => {
|
216
|
+
const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
|
217
|
+
Object.values(strapi2.contentTypes).forEach((contentType) => {
|
218
|
+
const { attributes: attributes2 } = contentType;
|
219
|
+
const isLocalized = isLocalizedContentType2(contentType);
|
220
|
+
___default.default.set(attributes2, "locale", {
|
221
|
+
writable: true,
|
222
|
+
private: !isLocalized,
|
223
|
+
configurable: false,
|
224
|
+
visible: false,
|
225
|
+
type: "string"
|
226
|
+
});
|
227
|
+
___default.default.set(attributes2, "localizations", {
|
228
|
+
type: "relation",
|
229
|
+
relation: "oneToMany",
|
230
|
+
target: contentType.uid,
|
231
|
+
writable: false,
|
232
|
+
private: !isLocalized,
|
233
|
+
configurable: false,
|
234
|
+
visible: false,
|
235
|
+
unstable_virtual: true,
|
236
|
+
joinColumn: {
|
237
|
+
name: "document_id",
|
238
|
+
referencedColumn: "document_id",
|
239
|
+
referencedTable: strapi2.db.metadata.identifiers.getTableName(contentType.collectionName),
|
240
|
+
// ensure the population will not include the results we already loaded
|
241
|
+
on({ results }) {
|
242
|
+
return {
|
243
|
+
id: {
|
244
|
+
$notIn: results.map((r) => r.id)
|
245
|
+
}
|
246
|
+
};
|
247
|
+
}
|
248
|
+
}
|
249
|
+
});
|
250
|
+
});
|
251
|
+
if (strapi2.plugin("graphql")) {
|
252
|
+
graphqlProvider({ strapi: strapi2 }).register();
|
253
|
+
}
|
254
|
+
};
|
255
|
+
const info = {
|
256
|
+
singularName: "locale",
|
257
|
+
pluralName: "locales",
|
258
|
+
collectionName: "locales",
|
259
|
+
displayName: "Locale",
|
260
|
+
description: ""
|
261
|
+
};
|
262
|
+
const options = {};
|
263
|
+
const pluginOptions = {
|
264
|
+
"content-manager": {
|
265
|
+
visible: false
|
266
|
+
},
|
267
|
+
"content-type-builder": {
|
268
|
+
visible: false
|
269
|
+
}
|
270
|
+
};
|
271
|
+
const attributes = {
|
272
|
+
name: {
|
273
|
+
type: "string",
|
274
|
+
min: 1,
|
275
|
+
max: 50,
|
276
|
+
configurable: false
|
277
|
+
},
|
278
|
+
code: {
|
279
|
+
type: "string",
|
280
|
+
unique: true,
|
281
|
+
configurable: false
|
282
|
+
}
|
283
|
+
};
|
284
|
+
const schema = {
|
285
|
+
info,
|
286
|
+
options,
|
287
|
+
pluginOptions,
|
288
|
+
attributes
|
289
|
+
};
|
290
|
+
const locale = {
|
291
|
+
schema
|
292
|
+
};
|
293
|
+
const contentTypes$1 = {
|
294
|
+
locale
|
295
|
+
};
|
296
|
+
const actions = [
|
297
|
+
{
|
298
|
+
section: "settings",
|
299
|
+
category: "Internationalization",
|
300
|
+
subCategory: "Locales",
|
301
|
+
pluginName: "i18n",
|
302
|
+
displayName: "Create",
|
303
|
+
uid: "locale.create"
|
304
|
+
},
|
305
|
+
{
|
306
|
+
section: "settings",
|
307
|
+
category: "Internationalization",
|
308
|
+
subCategory: "Locales",
|
309
|
+
pluginName: "i18n",
|
310
|
+
displayName: "Read",
|
311
|
+
uid: "locale.read",
|
312
|
+
aliases: [
|
313
|
+
{ actionId: "plugin::content-manager.explorer.read", subjects: ["plugin::i18n.locale"] }
|
314
|
+
]
|
315
|
+
},
|
316
|
+
{
|
317
|
+
section: "settings",
|
318
|
+
category: "Internationalization",
|
319
|
+
subCategory: "Locales",
|
320
|
+
pluginName: "i18n",
|
321
|
+
displayName: "Update",
|
322
|
+
uid: "locale.update"
|
323
|
+
},
|
324
|
+
{
|
325
|
+
section: "settings",
|
326
|
+
category: "Internationalization",
|
327
|
+
subCategory: "Locales",
|
328
|
+
pluginName: "i18n",
|
329
|
+
displayName: "Delete",
|
330
|
+
uid: "locale.delete"
|
331
|
+
}
|
332
|
+
];
|
333
|
+
const addLocalesPropertyIfNeeded = ({ value: action }) => {
|
334
|
+
const {
|
335
|
+
section,
|
336
|
+
options: { applyToProperties }
|
337
|
+
} = action;
|
338
|
+
if (section !== "contentTypes") {
|
339
|
+
return;
|
340
|
+
}
|
341
|
+
if (fp.isArray(applyToProperties) && applyToProperties.includes("locales")) {
|
342
|
+
return;
|
343
|
+
}
|
344
|
+
action.options.applyToProperties = fp.isArray(applyToProperties) ? applyToProperties.concat("locales") : ["locales"];
|
345
|
+
};
|
346
|
+
const shouldApplyLocalesPropertyToSubject = ({ property, subject }) => {
|
347
|
+
if (property === "locales") {
|
348
|
+
const model = strapi.getModel(subject);
|
349
|
+
return getService("content-types").isLocalizedContentType(model);
|
350
|
+
}
|
351
|
+
return true;
|
352
|
+
};
|
353
|
+
const addAllLocalesToPermissions = async (permissions2) => {
|
354
|
+
const { actionProvider } = strapi.service("admin::permission");
|
355
|
+
const { find: findAllLocales } = getService("locales");
|
356
|
+
const allLocales = await findAllLocales();
|
357
|
+
const allLocalesCode = allLocales.map(fp.prop("code"));
|
358
|
+
return Promise.all(
|
359
|
+
permissions2.map(async (permission) => {
|
360
|
+
const { action, subject } = permission;
|
361
|
+
const appliesToLocalesProperty = await actionProvider.appliesToProperty(
|
362
|
+
"locales",
|
363
|
+
action,
|
364
|
+
subject
|
365
|
+
);
|
366
|
+
if (!appliesToLocalesProperty) {
|
367
|
+
return permission;
|
368
|
+
}
|
369
|
+
const oldPermissionProperties = fp.getOr({}, "properties", permission);
|
370
|
+
return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };
|
371
|
+
})
|
372
|
+
);
|
373
|
+
};
|
374
|
+
const syncSuperAdminPermissionsWithLocales = async () => {
|
375
|
+
const roleService = strapi.service("admin::role");
|
376
|
+
const permissionService = strapi.service("admin::permission");
|
377
|
+
const superAdminRole = await roleService.getSuperAdmin();
|
378
|
+
if (!superAdminRole) {
|
379
|
+
return;
|
380
|
+
}
|
381
|
+
const superAdminPermissions = await permissionService.findMany({
|
382
|
+
where: {
|
383
|
+
role: {
|
384
|
+
id: superAdminRole.id
|
385
|
+
}
|
386
|
+
}
|
387
|
+
});
|
388
|
+
const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);
|
389
|
+
await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);
|
390
|
+
};
|
391
|
+
const registerI18nActions = async () => {
|
392
|
+
const { actionProvider } = strapi.service("admin::permission");
|
393
|
+
await actionProvider.registerMany(actions);
|
394
|
+
};
|
395
|
+
const registerI18nActionsHooks = () => {
|
396
|
+
const { actionProvider } = strapi.service("admin::permission");
|
397
|
+
const { hooks } = strapi.service("admin::role");
|
398
|
+
actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);
|
399
|
+
hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);
|
400
|
+
};
|
401
|
+
const updateActionsProperties = () => {
|
402
|
+
const { actionProvider } = strapi.service("admin::permission");
|
403
|
+
actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);
|
404
|
+
actionProvider.values().forEach((action) => addLocalesPropertyIfNeeded({ value: action }));
|
405
|
+
};
|
406
|
+
const i18nActionsService = {
|
407
|
+
actions,
|
408
|
+
registerI18nActions,
|
409
|
+
registerI18nActionsHooks,
|
410
|
+
updateActionsProperties,
|
411
|
+
syncSuperAdminPermissionsWithLocales
|
412
|
+
};
|
413
|
+
const localesPropertyHandler = async ({ action, section }) => {
|
414
|
+
const { actionProvider } = strapi.service("admin::permission");
|
415
|
+
const locales2 = await getService("locales").find();
|
416
|
+
if (fp.isEmpty(locales2)) {
|
417
|
+
return;
|
418
|
+
}
|
419
|
+
for (const subject of section.subjects) {
|
420
|
+
const applies = await actionProvider.appliesToProperty("locales", action.actionId, subject.uid);
|
421
|
+
const hasLocalesProperty = subject.properties.find(
|
422
|
+
(property) => property.value === "locales"
|
423
|
+
);
|
424
|
+
if (applies && !hasLocalesProperty) {
|
425
|
+
subject.properties.push({
|
426
|
+
label: "Locales",
|
427
|
+
value: "locales",
|
428
|
+
children: locales2.map(({ name, code }) => ({ label: name || code, value: code }))
|
429
|
+
});
|
430
|
+
}
|
431
|
+
}
|
432
|
+
};
|
433
|
+
const registerLocalesPropertyHandler = () => {
|
434
|
+
const { sectionsBuilder } = strapi.service("admin::permission");
|
435
|
+
sectionsBuilder.addHandler("singleTypes", localesPropertyHandler);
|
436
|
+
sectionsBuilder.addHandler("collectionTypes", localesPropertyHandler);
|
437
|
+
};
|
438
|
+
const sectionsBuilderService = {
|
439
|
+
localesPropertyHandler,
|
440
|
+
registerLocalesPropertyHandler
|
441
|
+
};
|
442
|
+
const willRegisterPermission = (context) => {
|
443
|
+
const { permission, condition, user } = context;
|
444
|
+
const { subject, properties } = permission;
|
445
|
+
const isSuperAdmin = strapi.service("admin::role").hasSuperAdminRole(user);
|
446
|
+
if (isSuperAdmin) {
|
447
|
+
return;
|
448
|
+
}
|
449
|
+
const { locales: locales2 } = properties || {};
|
450
|
+
const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
|
451
|
+
if (!subject) {
|
452
|
+
return;
|
453
|
+
}
|
454
|
+
const ct = strapi.contentTypes[subject];
|
455
|
+
if (!isLocalizedContentType2(ct)) {
|
456
|
+
return;
|
457
|
+
}
|
458
|
+
if (locales2 === null) {
|
459
|
+
return;
|
460
|
+
}
|
461
|
+
condition.and({
|
462
|
+
locale: {
|
463
|
+
$in: locales2 || []
|
464
|
+
}
|
465
|
+
});
|
466
|
+
};
|
467
|
+
const registerI18nPermissionsHandlers = () => {
|
468
|
+
const { engine } = strapi.service("admin::permission");
|
469
|
+
engine.hooks["before-register.permission"].register(willRegisterPermission);
|
470
|
+
};
|
471
|
+
const engineService = {
|
472
|
+
willRegisterPermission,
|
473
|
+
registerI18nPermissionsHandlers
|
474
|
+
};
|
475
|
+
const permissions = () => ({
|
476
|
+
actions: i18nActionsService,
|
477
|
+
sectionsBuilder: sectionsBuilderService,
|
478
|
+
engine: engineService
|
479
|
+
});
|
480
|
+
const sendDidInitializeEvent = async () => {
|
481
|
+
const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
|
482
|
+
const numberOfContentTypes = fp.reduce(
|
483
|
+
(sum, contentType) => isLocalizedContentType2(contentType) ? sum + 1 : sum,
|
484
|
+
0
|
485
|
+
)(strapi.contentTypes);
|
486
|
+
await strapi.telemetry.send("didInitializeI18n", { groupProperties: { numberOfContentTypes } });
|
487
|
+
};
|
488
|
+
const sendDidUpdateI18nLocalesEvent = async () => {
|
489
|
+
const numberOfLocales = await getService("locales").count();
|
490
|
+
await strapi.telemetry.send("didUpdateI18nLocales", {
|
491
|
+
groupProperties: { numberOfLocales }
|
492
|
+
});
|
493
|
+
};
|
494
|
+
const metrics = () => ({
|
495
|
+
sendDidInitializeEvent,
|
496
|
+
sendDidUpdateI18nLocalesEvent
|
497
|
+
});
|
498
|
+
const syncNonLocalizedAttributes = async (sourceEntry, model) => {
|
499
|
+
const { copyNonLocalizedAttributes: copyNonLocalizedAttributes2 } = getService("content-types");
|
500
|
+
const nonLocalizedAttributes = copyNonLocalizedAttributes2(model, sourceEntry);
|
501
|
+
if (fp.isEmpty(nonLocalizedAttributes)) {
|
502
|
+
return;
|
503
|
+
}
|
504
|
+
const uid = model.uid;
|
505
|
+
const documentId = sourceEntry.documentId;
|
506
|
+
const locale2 = sourceEntry.locale;
|
507
|
+
const status = sourceEntry?.publishedAt ? "published" : "draft";
|
508
|
+
const localeEntriesToUpdate = await strapi.db.query(uid).findMany({
|
509
|
+
where: {
|
510
|
+
documentId,
|
511
|
+
publishedAt: status === "published" ? { $ne: null } : null,
|
512
|
+
locale: { $ne: locale2 }
|
513
|
+
},
|
514
|
+
select: ["locale", "id"]
|
515
|
+
});
|
516
|
+
const entryData = await strapi.documents(uid).omitComponentData(nonLocalizedAttributes);
|
517
|
+
await utils.async.map(localeEntriesToUpdate, async (entry) => {
|
518
|
+
const transformedData = await strapi.documents.utils.transformData(
|
519
|
+
fp.cloneDeep(nonLocalizedAttributes),
|
520
|
+
{
|
521
|
+
uid,
|
522
|
+
status,
|
523
|
+
locale: entry.locale,
|
524
|
+
allowMissingId: true
|
525
|
+
}
|
526
|
+
);
|
527
|
+
const componentData = await strapi.documents(uid).updateComponents(entry, transformedData);
|
528
|
+
await strapi.db.query(uid).update({
|
529
|
+
where: {
|
530
|
+
documentId,
|
531
|
+
publishedAt: status === "published" ? { $ne: null } : null,
|
532
|
+
locale: { $eq: entry.locale }
|
533
|
+
},
|
534
|
+
// The data we send to the update function is the entry data merged with
|
535
|
+
// the updated component data
|
536
|
+
data: Object.assign(fp.cloneDeep(entryData), componentData)
|
537
|
+
});
|
538
|
+
});
|
539
|
+
};
|
540
|
+
const localizations = () => ({
|
541
|
+
syncNonLocalizedAttributes
|
542
|
+
});
|
198
543
|
const isoLocales = [
|
199
544
|
{
|
200
545
|
code: "af",
|
@@ -2572,6 +2917,14 @@ const isoLocales = [
|
|
2572
2917
|
code: "cy-GB",
|
2573
2918
|
name: "Welsh (United Kingdom) (cy-GB)"
|
2574
2919
|
},
|
2920
|
+
{
|
2921
|
+
code: "wo",
|
2922
|
+
name: "Wolof (wo)"
|
2923
|
+
},
|
2924
|
+
{
|
2925
|
+
code: "xh",
|
2926
|
+
name: "Xhosa (xh)"
|
2927
|
+
},
|
2575
2928
|
{
|
2576
2929
|
code: "yav",
|
2577
2930
|
name: "Yangben (yav)"
|
@@ -2588,437 +2941,40 @@ const isoLocales = [
|
|
2588
2941
|
code: "yo-NG",
|
2589
2942
|
name: "Yoruba (Nigeria) (yo-NG)"
|
2590
2943
|
},
|
2591
|
-
{
|
2592
|
-
code: "dje",
|
2593
|
-
name: "Zarma (dje)"
|
2594
|
-
},
|
2595
|
-
{
|
2596
|
-
code: "dje-NE",
|
2597
|
-
name: "Zarma (Niger) (dje-NE)"
|
2598
|
-
},
|
2599
|
-
{
|
2600
|
-
code: "zu",
|
2601
|
-
name: "Zulu (zu)"
|
2602
|
-
},
|
2603
|
-
{
|
2604
|
-
code: "zu-ZA",
|
2605
|
-
name: "Zulu (South Africa) (zu-ZA)"
|
2606
|
-
}
|
2607
|
-
];
|
2608
|
-
const getInitLocale = () => {
|
2609
|
-
const envLocaleCode = process.env.STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE;
|
2610
|
-
if (envLocaleCode) {
|
2611
|
-
const matchingLocale = isoLocales.find(({ code }) => code === envLocaleCode);
|
2612
|
-
if (!matchingLocale) {
|
2613
|
-
throw new Error(
|
2614
|
-
"Unknown locale code provided in the environment variable STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE"
|
2615
|
-
);
|
2616
|
-
}
|
2617
|
-
return { ...matchingLocale };
|
2618
|
-
}
|
2619
|
-
return {
|
2620
|
-
code: "en",
|
2621
|
-
name: "English (en)"
|
2622
|
-
};
|
2623
|
-
};
|
2624
|
-
const DEFAULT_LOCALE = getInitLocale();
|
2625
|
-
const enableContentType = async ({ oldContentTypes, contentTypes: contentTypes2 }) => {
|
2626
|
-
const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
|
2627
|
-
const { getDefaultLocale: getDefaultLocale2 } = getService("locales");
|
2628
|
-
if (!oldContentTypes) {
|
2629
|
-
return;
|
2630
|
-
}
|
2631
|
-
for (const uid in contentTypes2) {
|
2632
|
-
if (!oldContentTypes[uid]) {
|
2633
|
-
continue;
|
2634
|
-
}
|
2635
|
-
const oldContentType = oldContentTypes[uid];
|
2636
|
-
const contentType = contentTypes2[uid];
|
2637
|
-
if (!isLocalizedContentType2(oldContentType) && isLocalizedContentType2(contentType)) {
|
2638
|
-
const defaultLocale = await getDefaultLocale2() || DEFAULT_LOCALE.code;
|
2639
|
-
await strapi.db.query(uid).updateMany({
|
2640
|
-
where: { locale: null },
|
2641
|
-
data: { locale: defaultLocale }
|
2642
|
-
});
|
2643
|
-
}
|
2644
|
-
}
|
2645
|
-
};
|
2646
|
-
const disableContentType = async ({ oldContentTypes, contentTypes: contentTypes2 }) => {
|
2647
|
-
const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
|
2648
|
-
const { getDefaultLocale: getDefaultLocale2 } = getService("locales");
|
2649
|
-
if (!oldContentTypes) {
|
2650
|
-
return;
|
2651
|
-
}
|
2652
|
-
for (const uid in contentTypes2) {
|
2653
|
-
if (!oldContentTypes[uid]) {
|
2654
|
-
continue;
|
2655
|
-
}
|
2656
|
-
const oldContentType = oldContentTypes[uid];
|
2657
|
-
const contentType = contentTypes2[uid];
|
2658
|
-
if (isLocalizedContentType2(oldContentType) && !isLocalizedContentType2(contentType)) {
|
2659
|
-
const defaultLocale = await getDefaultLocale2() || DEFAULT_LOCALE.code;
|
2660
|
-
await Promise.all([
|
2661
|
-
// Delete all entities that are not in the default locale
|
2662
|
-
strapi.db.query(uid).deleteMany({
|
2663
|
-
where: { locale: { $ne: defaultLocale } }
|
2664
|
-
}),
|
2665
|
-
// Set locale to null for the rest
|
2666
|
-
strapi.db.query(uid).updateMany({
|
2667
|
-
where: { locale: { $eq: defaultLocale } },
|
2668
|
-
data: { locale: null }
|
2669
|
-
})
|
2670
|
-
]);
|
2671
|
-
}
|
2672
|
-
}
|
2673
|
-
};
|
2674
|
-
const register = ({ strapi: strapi2 }) => {
|
2675
|
-
extendContentTypes(strapi2);
|
2676
|
-
addContentManagerLocaleMiddleware(strapi2);
|
2677
|
-
addContentTypeSyncHooks(strapi2);
|
2678
|
-
};
|
2679
|
-
const addContentManagerLocaleMiddleware = (strapi2) => {
|
2680
|
-
strapi2.server.router.use("/content-manager/collection-types/:model", (ctx, next) => {
|
2681
|
-
if (ctx.method === "POST" || ctx.method === "PUT") {
|
2682
|
-
return validateLocaleCreation(ctx, next);
|
2683
|
-
}
|
2684
|
-
return next();
|
2685
|
-
});
|
2686
|
-
strapi2.server.router.use("/content-manager/single-types/:model", (ctx, next) => {
|
2687
|
-
if (ctx.method === "POST" || ctx.method === "PUT") {
|
2688
|
-
return validateLocaleCreation(ctx, next);
|
2689
|
-
}
|
2690
|
-
return next();
|
2691
|
-
});
|
2692
|
-
};
|
2693
|
-
const addContentTypeSyncHooks = (strapi2) => {
|
2694
|
-
strapi2.hook("strapi::content-types.beforeSync").register(disableContentType);
|
2695
|
-
strapi2.hook("strapi::content-types.afterSync").register(enableContentType);
|
2696
|
-
};
|
2697
|
-
const extendContentTypes = (strapi2) => {
|
2698
|
-
Object.values(strapi2.contentTypes).forEach((contentType) => {
|
2699
|
-
const { attributes: attributes2 } = contentType;
|
2700
|
-
___default.default.set(attributes2, "locale", {
|
2701
|
-
writable: true,
|
2702
|
-
private: false,
|
2703
|
-
configurable: false,
|
2704
|
-
visible: false,
|
2705
|
-
type: "string"
|
2706
|
-
});
|
2707
|
-
___default.default.set(attributes2, "localizations", {
|
2708
|
-
type: "relation",
|
2709
|
-
relation: "oneToMany",
|
2710
|
-
target: contentType.uid,
|
2711
|
-
writable: false,
|
2712
|
-
private: false,
|
2713
|
-
configurable: false,
|
2714
|
-
visible: false,
|
2715
|
-
joinColumn: {
|
2716
|
-
name: "document_id",
|
2717
|
-
referencedColumn: "document_id",
|
2718
|
-
referencedTable: strapi2.db.metadata.identifiers.getTableName(contentType.collectionName),
|
2719
|
-
// ensure the population will not include the results we already loaded
|
2720
|
-
on({ results }) {
|
2721
|
-
return {
|
2722
|
-
id: {
|
2723
|
-
$notIn: results.map((r) => r.id)
|
2724
|
-
}
|
2725
|
-
};
|
2726
|
-
}
|
2727
|
-
}
|
2728
|
-
});
|
2729
|
-
});
|
2730
|
-
if (strapi2.plugin("graphql")) {
|
2731
|
-
graphqlProvider({ strapi: strapi2 }).register();
|
2732
|
-
}
|
2733
|
-
};
|
2734
|
-
const info = {
|
2735
|
-
singularName: "locale",
|
2736
|
-
pluralName: "locales",
|
2737
|
-
collectionName: "locales",
|
2738
|
-
displayName: "Locale",
|
2739
|
-
description: ""
|
2740
|
-
};
|
2741
|
-
const options = {};
|
2742
|
-
const pluginOptions = {
|
2743
|
-
"content-manager": {
|
2744
|
-
visible: false
|
2745
|
-
},
|
2746
|
-
"content-type-builder": {
|
2747
|
-
visible: false
|
2748
|
-
}
|
2749
|
-
};
|
2750
|
-
const attributes = {
|
2751
|
-
name: {
|
2752
|
-
type: "string",
|
2753
|
-
min: 1,
|
2754
|
-
max: 50,
|
2755
|
-
configurable: false
|
2756
|
-
},
|
2757
|
-
code: {
|
2758
|
-
type: "string",
|
2759
|
-
unique: true,
|
2760
|
-
configurable: false
|
2761
|
-
}
|
2762
|
-
};
|
2763
|
-
const schema = {
|
2764
|
-
info,
|
2765
|
-
options,
|
2766
|
-
pluginOptions,
|
2767
|
-
attributes
|
2768
|
-
};
|
2769
|
-
const locale = {
|
2770
|
-
schema
|
2771
|
-
};
|
2772
|
-
const contentTypes$1 = {
|
2773
|
-
locale
|
2774
|
-
};
|
2775
|
-
const actions = [
|
2776
|
-
{
|
2777
|
-
section: "settings",
|
2778
|
-
category: "Internationalization",
|
2779
|
-
subCategory: "Locales",
|
2780
|
-
pluginName: "i18n",
|
2781
|
-
displayName: "Create",
|
2782
|
-
uid: "locale.create"
|
2944
|
+
{
|
2945
|
+
code: "dje",
|
2946
|
+
name: "Zarma (dje)"
|
2783
2947
|
},
|
2784
2948
|
{
|
2785
|
-
|
2786
|
-
|
2787
|
-
subCategory: "Locales",
|
2788
|
-
pluginName: "i18n",
|
2789
|
-
displayName: "Read",
|
2790
|
-
uid: "locale.read",
|
2791
|
-
aliases: [
|
2792
|
-
{ actionId: "plugin::content-manager.explorer.read", subjects: ["plugin::i18n.locale"] }
|
2793
|
-
]
|
2949
|
+
code: "dje-NE",
|
2950
|
+
name: "Zarma (Niger) (dje-NE)"
|
2794
2951
|
},
|
2795
2952
|
{
|
2796
|
-
|
2797
|
-
|
2798
|
-
subCategory: "Locales",
|
2799
|
-
pluginName: "i18n",
|
2800
|
-
displayName: "Update",
|
2801
|
-
uid: "locale.update"
|
2953
|
+
code: "zu",
|
2954
|
+
name: "Zulu (zu)"
|
2802
2955
|
},
|
2803
2956
|
{
|
2804
|
-
|
2805
|
-
|
2806
|
-
subCategory: "Locales",
|
2807
|
-
pluginName: "i18n",
|
2808
|
-
displayName: "Delete",
|
2809
|
-
uid: "locale.delete"
|
2957
|
+
code: "zu-ZA",
|
2958
|
+
name: "Zulu (South Africa) (zu-ZA)"
|
2810
2959
|
}
|
2811
2960
|
];
|
2812
|
-
const
|
2813
|
-
const
|
2814
|
-
|
2815
|
-
|
2816
|
-
|
2817
|
-
|
2818
|
-
|
2819
|
-
}
|
2820
|
-
if (fp.isArray(applyToProperties) && applyToProperties.includes("locales")) {
|
2821
|
-
return;
|
2822
|
-
}
|
2823
|
-
action.options.applyToProperties = fp.isArray(applyToProperties) ? applyToProperties.concat("locales") : ["locales"];
|
2824
|
-
};
|
2825
|
-
const shouldApplyLocalesPropertyToSubject = ({ property, subject }) => {
|
2826
|
-
if (property === "locales") {
|
2827
|
-
const model = strapi.getModel(subject);
|
2828
|
-
return getService("content-types").isLocalizedContentType(model);
|
2829
|
-
}
|
2830
|
-
return true;
|
2831
|
-
};
|
2832
|
-
const addAllLocalesToPermissions = async (permissions2) => {
|
2833
|
-
const { actionProvider } = strapi.service("admin::permission");
|
2834
|
-
const { find: findAllLocales } = getService("locales");
|
2835
|
-
const allLocales = await findAllLocales();
|
2836
|
-
const allLocalesCode = allLocales.map(fp.prop("code"));
|
2837
|
-
return Promise.all(
|
2838
|
-
permissions2.map(async (permission) => {
|
2839
|
-
const { action, subject } = permission;
|
2840
|
-
const appliesToLocalesProperty = await actionProvider.appliesToProperty(
|
2841
|
-
"locales",
|
2842
|
-
action,
|
2843
|
-
subject
|
2961
|
+
const getInitLocale = () => {
|
2962
|
+
const envLocaleCode = process.env.STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE;
|
2963
|
+
if (envLocaleCode) {
|
2964
|
+
const matchingLocale = isoLocales.find(({ code }) => code === envLocaleCode);
|
2965
|
+
if (!matchingLocale) {
|
2966
|
+
throw new Error(
|
2967
|
+
"Unknown locale code provided in the environment variable STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE"
|
2844
2968
|
);
|
2845
|
-
if (!appliesToLocalesProperty) {
|
2846
|
-
return permission;
|
2847
|
-
}
|
2848
|
-
const oldPermissionProperties = fp.getOr({}, "properties", permission);
|
2849
|
-
return { ...permission, properties: { ...oldPermissionProperties, locales: allLocalesCode } };
|
2850
|
-
})
|
2851
|
-
);
|
2852
|
-
};
|
2853
|
-
const syncSuperAdminPermissionsWithLocales = async () => {
|
2854
|
-
const roleService = strapi.service("admin::role");
|
2855
|
-
const permissionService = strapi.service("admin::permission");
|
2856
|
-
const superAdminRole = await roleService.getSuperAdmin();
|
2857
|
-
if (!superAdminRole) {
|
2858
|
-
return;
|
2859
|
-
}
|
2860
|
-
const superAdminPermissions = await permissionService.findMany({
|
2861
|
-
where: {
|
2862
|
-
role: {
|
2863
|
-
id: superAdminRole.id
|
2864
|
-
}
|
2865
|
-
}
|
2866
|
-
});
|
2867
|
-
const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);
|
2868
|
-
await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);
|
2869
|
-
};
|
2870
|
-
const registerI18nActions = async () => {
|
2871
|
-
const { actionProvider } = strapi.service("admin::permission");
|
2872
|
-
await actionProvider.registerMany(actions);
|
2873
|
-
};
|
2874
|
-
const registerI18nActionsHooks = () => {
|
2875
|
-
const { actionProvider } = strapi.service("admin::permission");
|
2876
|
-
const { hooks } = strapi.service("admin::role");
|
2877
|
-
actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);
|
2878
|
-
hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);
|
2879
|
-
};
|
2880
|
-
const updateActionsProperties = () => {
|
2881
|
-
const { actionProvider } = strapi.service("admin::permission");
|
2882
|
-
actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);
|
2883
|
-
actionProvider.values().forEach((action) => addLocalesPropertyIfNeeded({ value: action }));
|
2884
|
-
};
|
2885
|
-
const i18nActionsService = {
|
2886
|
-
actions,
|
2887
|
-
registerI18nActions,
|
2888
|
-
registerI18nActionsHooks,
|
2889
|
-
updateActionsProperties,
|
2890
|
-
syncSuperAdminPermissionsWithLocales
|
2891
|
-
};
|
2892
|
-
const localesPropertyHandler = async ({ action, section }) => {
|
2893
|
-
const { actionProvider } = strapi.service("admin::permission");
|
2894
|
-
const locales2 = await getService("locales").find();
|
2895
|
-
if (fp.isEmpty(locales2)) {
|
2896
|
-
return;
|
2897
|
-
}
|
2898
|
-
for (const subject of section.subjects) {
|
2899
|
-
const applies = await actionProvider.appliesToProperty("locales", action.actionId, subject.uid);
|
2900
|
-
const hasLocalesProperty = subject.properties.find(
|
2901
|
-
(property) => property.value === "locales"
|
2902
|
-
);
|
2903
|
-
if (applies && !hasLocalesProperty) {
|
2904
|
-
subject.properties.push({
|
2905
|
-
label: "Locales",
|
2906
|
-
value: "locales",
|
2907
|
-
children: locales2.map(({ name, code }) => ({ label: name || code, value: code }))
|
2908
|
-
});
|
2909
|
-
}
|
2910
|
-
}
|
2911
|
-
};
|
2912
|
-
const registerLocalesPropertyHandler = () => {
|
2913
|
-
const { sectionsBuilder } = strapi.service("admin::permission");
|
2914
|
-
sectionsBuilder.addHandler("singleTypes", localesPropertyHandler);
|
2915
|
-
sectionsBuilder.addHandler("collectionTypes", localesPropertyHandler);
|
2916
|
-
};
|
2917
|
-
const sectionsBuilderService = {
|
2918
|
-
localesPropertyHandler,
|
2919
|
-
registerLocalesPropertyHandler
|
2920
|
-
};
|
2921
|
-
const willRegisterPermission = (context) => {
|
2922
|
-
const { permission, condition, user } = context;
|
2923
|
-
const { subject, properties } = permission;
|
2924
|
-
const isSuperAdmin = strapi.service("admin::role").hasSuperAdminRole(user);
|
2925
|
-
if (isSuperAdmin) {
|
2926
|
-
return;
|
2927
|
-
}
|
2928
|
-
const { locales: locales2 } = properties || {};
|
2929
|
-
const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
|
2930
|
-
if (!subject) {
|
2931
|
-
return;
|
2932
|
-
}
|
2933
|
-
const ct = strapi.contentTypes[subject];
|
2934
|
-
if (!isLocalizedContentType2(ct)) {
|
2935
|
-
return;
|
2936
|
-
}
|
2937
|
-
if (locales2 === null) {
|
2938
|
-
return;
|
2939
|
-
}
|
2940
|
-
condition.and({
|
2941
|
-
locale: {
|
2942
|
-
$in: locales2 || []
|
2943
2969
|
}
|
2944
|
-
|
2945
|
-
};
|
2946
|
-
const registerI18nPermissionsHandlers = () => {
|
2947
|
-
const { engine } = strapi.service("admin::permission");
|
2948
|
-
engine.hooks["before-register.permission"].register(willRegisterPermission);
|
2949
|
-
};
|
2950
|
-
const engineService = {
|
2951
|
-
willRegisterPermission,
|
2952
|
-
registerI18nPermissionsHandlers
|
2953
|
-
};
|
2954
|
-
const permissions = () => ({
|
2955
|
-
actions: i18nActionsService,
|
2956
|
-
sectionsBuilder: sectionsBuilderService,
|
2957
|
-
engine: engineService
|
2958
|
-
});
|
2959
|
-
const sendDidInitializeEvent = async () => {
|
2960
|
-
const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
|
2961
|
-
const numberOfContentTypes = fp.reduce(
|
2962
|
-
(sum, contentType) => isLocalizedContentType2(contentType) ? sum + 1 : sum,
|
2963
|
-
0
|
2964
|
-
)(strapi.contentTypes);
|
2965
|
-
await strapi.telemetry.send("didInitializeI18n", { groupProperties: { numberOfContentTypes } });
|
2966
|
-
};
|
2967
|
-
const sendDidUpdateI18nLocalesEvent = async () => {
|
2968
|
-
const numberOfLocales = await getService("locales").count();
|
2969
|
-
await strapi.telemetry.send("didUpdateI18nLocales", {
|
2970
|
-
groupProperties: { numberOfLocales }
|
2971
|
-
});
|
2972
|
-
};
|
2973
|
-
const metrics = () => ({
|
2974
|
-
sendDidInitializeEvent,
|
2975
|
-
sendDidUpdateI18nLocalesEvent
|
2976
|
-
});
|
2977
|
-
const syncNonLocalizedAttributes = async (sourceEntry, model) => {
|
2978
|
-
const { copyNonLocalizedAttributes: copyNonLocalizedAttributes2 } = getService("content-types");
|
2979
|
-
const nonLocalizedAttributes = copyNonLocalizedAttributes2(model, sourceEntry);
|
2980
|
-
if (fp.isEmpty(nonLocalizedAttributes)) {
|
2981
|
-
return;
|
2970
|
+
return { ...matchingLocale };
|
2982
2971
|
}
|
2983
|
-
|
2984
|
-
|
2985
|
-
|
2986
|
-
|
2987
|
-
const localeEntriesToUpdate = await strapi.db.query(uid).findMany({
|
2988
|
-
where: {
|
2989
|
-
documentId,
|
2990
|
-
publishedAt: status === "published" ? { $ne: null } : null,
|
2991
|
-
locale: { $ne: locale2 }
|
2992
|
-
},
|
2993
|
-
select: ["locale", "id"]
|
2994
|
-
});
|
2995
|
-
const entryData = await strapi.documents(uid).omitComponentData(nonLocalizedAttributes);
|
2996
|
-
await utils.async.map(localeEntriesToUpdate, async (entry) => {
|
2997
|
-
const transformedData = await strapi.documents.utils.transformData(
|
2998
|
-
fp.cloneDeep(nonLocalizedAttributes),
|
2999
|
-
{
|
3000
|
-
uid,
|
3001
|
-
status,
|
3002
|
-
locale: entry.locale,
|
3003
|
-
allowMissingId: true
|
3004
|
-
}
|
3005
|
-
);
|
3006
|
-
const componentData = await strapi.documents(uid).updateComponents(entry, transformedData);
|
3007
|
-
await strapi.db.query(uid).update({
|
3008
|
-
where: {
|
3009
|
-
documentId,
|
3010
|
-
publishedAt: status === "published" ? { $ne: null } : null,
|
3011
|
-
locale: { $eq: entry.locale }
|
3012
|
-
},
|
3013
|
-
// The data we send to the update function is the entry data merged with
|
3014
|
-
// the updated component data
|
3015
|
-
data: Object.assign(fp.cloneDeep(entryData), componentData)
|
3016
|
-
});
|
3017
|
-
});
|
2972
|
+
return {
|
2973
|
+
code: "en",
|
2974
|
+
name: "English (en)"
|
2975
|
+
};
|
3018
2976
|
};
|
3019
|
-
const
|
3020
|
-
syncNonLocalizedAttributes
|
3021
|
-
});
|
2977
|
+
const DEFAULT_LOCALE = getInitLocale();
|
3022
2978
|
const find = (params = {}) => strapi.db.query("plugin::i18n.locale").findMany({ where: params });
|
3023
2979
|
const findById = (id) => strapi.db.query("plugin::i18n.locale").findOne({ where: { id } });
|
3024
2980
|
const findByCode = (code) => strapi.db.query("plugin::i18n.locale").findOne({ where: { code } });
|
@@ -3210,11 +3166,32 @@ const contentTypes = () => ({
|
|
3210
3166
|
fillNonLocalizedAttributes,
|
3211
3167
|
getNestedPopulateOfNonLocalizedAttributes
|
3212
3168
|
});
|
3169
|
+
const LOCALIZATION_FIELDS = ["locale", "localizations"];
|
3170
|
+
const sanitize = ({ strapi: strapi2 }) => {
|
3171
|
+
const { isLocalizedContentType: isLocalizedContentType2 } = getService("content-types");
|
3172
|
+
const sanitizeLocalizationFields = fp.curry(
|
3173
|
+
(schema2, entity) => utils.traverseEntity(
|
3174
|
+
({ key, schema: schema22 }, { remove }) => {
|
3175
|
+
const isLocalized = isLocalizedContentType2(schema22);
|
3176
|
+
const isLocalizationField = LOCALIZATION_FIELDS.includes(key);
|
3177
|
+
if (!isLocalized && isLocalizationField) {
|
3178
|
+
remove(key);
|
3179
|
+
}
|
3180
|
+
},
|
3181
|
+
{ schema: schema2, getModel: strapi2.getModel.bind(strapi2) },
|
3182
|
+
entity
|
3183
|
+
)
|
3184
|
+
);
|
3185
|
+
return {
|
3186
|
+
sanitizeLocalizationFields
|
3187
|
+
};
|
3188
|
+
};
|
3213
3189
|
const services = {
|
3214
3190
|
permissions,
|
3215
3191
|
metrics,
|
3216
3192
|
localizations,
|
3217
3193
|
locales,
|
3194
|
+
sanitize,
|
3218
3195
|
"iso-locales": isoLocalesService,
|
3219
3196
|
"content-types": contentTypes
|
3220
3197
|
};
|