@strapi/i18n 0.0.0-experimental.8ba06b448e7b82ad8505f461edf528901aea9e1e → 0.0.0-experimental.8bf99b7c43ed372264c198d347a2ada9dfed174d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/dist/admin/components/BulkLocaleActionModal.js +262 -0
  2. package/dist/admin/components/BulkLocaleActionModal.js.map +1 -0
  3. package/dist/admin/components/BulkLocaleActionModal.mjs +260 -0
  4. package/dist/admin/components/BulkLocaleActionModal.mjs.map +1 -0
  5. package/dist/admin/components/CMHeaderActions.js +721 -0
  6. package/dist/admin/components/CMHeaderActions.js.map +1 -0
  7. package/dist/admin/components/CMHeaderActions.mjs +696 -0
  8. package/dist/admin/components/CMHeaderActions.mjs.map +1 -0
  9. package/dist/admin/components/CMListViewModalsAdditionalInformation.js +69 -0
  10. package/dist/admin/components/CMListViewModalsAdditionalInformation.js.map +1 -0
  11. package/dist/admin/components/CMListViewModalsAdditionalInformation.mjs +65 -0
  12. package/dist/admin/components/CMListViewModalsAdditionalInformation.mjs.map +1 -0
  13. package/dist/admin/components/CheckboxConfirmation.js +155 -0
  14. package/dist/admin/components/CheckboxConfirmation.js.map +1 -0
  15. package/dist/admin/components/CheckboxConfirmation.mjs +134 -0
  16. package/dist/admin/components/CheckboxConfirmation.mjs.map +1 -0
  17. package/dist/admin/components/CreateLocale.js +395 -0
  18. package/dist/admin/components/CreateLocale.js.map +1 -0
  19. package/dist/admin/components/CreateLocale.mjs +369 -0
  20. package/dist/admin/components/CreateLocale.mjs.map +1 -0
  21. package/dist/admin/components/DeleteLocale.js +90 -0
  22. package/dist/admin/components/DeleteLocale.js.map +1 -0
  23. package/dist/admin/components/DeleteLocale.mjs +69 -0
  24. package/dist/admin/components/DeleteLocale.mjs.map +1 -0
  25. package/dist/admin/components/EditLocale.js +212 -0
  26. package/dist/admin/components/EditLocale.js.map +1 -0
  27. package/dist/admin/components/EditLocale.mjs +190 -0
  28. package/dist/admin/components/EditLocale.mjs.map +1 -0
  29. package/dist/admin/components/LocaleListCell.js +82 -0
  30. package/dist/admin/components/LocaleListCell.js.map +1 -0
  31. package/dist/admin/components/LocaleListCell.mjs +80 -0
  32. package/dist/admin/components/LocaleListCell.mjs.map +1 -0
  33. package/dist/admin/components/LocalePicker.js +98 -0
  34. package/dist/admin/components/LocalePicker.js.map +1 -0
  35. package/dist/admin/components/LocalePicker.mjs +77 -0
  36. package/dist/admin/components/LocalePicker.mjs.map +1 -0
  37. package/dist/admin/components/LocaleTable.js +143 -0
  38. package/dist/admin/components/LocaleTable.js.map +1 -0
  39. package/dist/admin/components/LocaleTable.mjs +122 -0
  40. package/dist/admin/components/LocaleTable.mjs.map +1 -0
  41. package/dist/admin/constants.js +37 -0
  42. package/dist/admin/constants.js.map +1 -0
  43. package/dist/admin/constants.mjs +35 -0
  44. package/dist/admin/constants.mjs.map +1 -0
  45. package/dist/admin/contentManagerHooks/editView.js +106 -0
  46. package/dist/admin/contentManagerHooks/editView.js.map +1 -0
  47. package/dist/admin/contentManagerHooks/editView.mjs +85 -0
  48. package/dist/admin/contentManagerHooks/editView.mjs.map +1 -0
  49. package/dist/admin/contentManagerHooks/listView.js +43 -0
  50. package/dist/admin/contentManagerHooks/listView.js.map +1 -0
  51. package/dist/admin/contentManagerHooks/listView.mjs +41 -0
  52. package/dist/admin/contentManagerHooks/listView.mjs.map +1 -0
  53. package/dist/admin/contentReleasesHooks/releaseDetailsView.js +20 -0
  54. package/dist/admin/contentReleasesHooks/releaseDetailsView.js.map +1 -0
  55. package/dist/admin/contentReleasesHooks/releaseDetailsView.mjs +18 -0
  56. package/dist/admin/contentReleasesHooks/releaseDetailsView.mjs.map +1 -0
  57. package/dist/admin/hooks/useI18n.js +78 -0
  58. package/dist/admin/hooks/useI18n.js.map +1 -0
  59. package/dist/admin/hooks/useI18n.mjs +57 -0
  60. package/dist/admin/hooks/useI18n.mjs.map +1 -0
  61. package/dist/admin/index.js +220 -16
  62. package/dist/admin/index.js.map +1 -1
  63. package/dist/admin/index.mjs +202 -15
  64. package/dist/admin/index.mjs.map +1 -1
  65. package/dist/admin/middlewares/extendCTBAttributeInitialData.js +71 -0
  66. package/dist/admin/middlewares/extendCTBAttributeInitialData.js.map +1 -0
  67. package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs +69 -0
  68. package/dist/admin/middlewares/extendCTBAttributeInitialData.mjs.map +1 -0
  69. package/dist/admin/middlewares/extendCTBInitialData.js +40 -0
  70. package/dist/admin/middlewares/extendCTBInitialData.js.map +1 -0
  71. package/dist/admin/middlewares/extendCTBInitialData.mjs +38 -0
  72. package/dist/admin/middlewares/extendCTBInitialData.mjs.map +1 -0
  73. package/dist/admin/middlewares/rbac-middleware.js +49 -0
  74. package/dist/admin/middlewares/rbac-middleware.js.map +1 -0
  75. package/dist/admin/middlewares/rbac-middleware.mjs +28 -0
  76. package/dist/admin/middlewares/rbac-middleware.mjs.map +1 -0
  77. package/dist/admin/pages/SettingsPage.js +107 -0
  78. package/dist/admin/pages/SettingsPage.js.map +1 -0
  79. package/dist/admin/pages/SettingsPage.mjs +85 -0
  80. package/dist/admin/pages/SettingsPage.mjs.map +1 -0
  81. package/dist/admin/pluginId.js +6 -0
  82. package/dist/admin/pluginId.js.map +1 -0
  83. package/dist/admin/pluginId.mjs +4 -0
  84. package/dist/admin/pluginId.mjs.map +1 -0
  85. package/dist/admin/services/api.js +12 -0
  86. package/dist/admin/services/api.js.map +1 -0
  87. package/dist/admin/services/api.mjs +10 -0
  88. package/dist/admin/services/api.mjs.map +1 -0
  89. package/dist/admin/services/locales.js +70 -0
  90. package/dist/admin/services/locales.js.map +1 -0
  91. package/dist/admin/services/locales.mjs +64 -0
  92. package/dist/admin/services/locales.mjs.map +1 -0
  93. package/dist/admin/services/relations.js +23 -0
  94. package/dist/admin/services/relations.js.map +1 -0
  95. package/dist/admin/services/relations.mjs +21 -0
  96. package/dist/admin/services/relations.mjs.map +1 -0
  97. package/dist/admin/src/utils/schemas.d.ts +424 -16
  98. package/dist/admin/{chunks/de-nEMWvIiY.js → translations/de.json.js} +2 -2
  99. package/dist/admin/translations/de.json.js.map +1 -0
  100. package/dist/admin/{chunks/de-Cm8mYdaO.mjs → translations/de.json.mjs} +1 -1
  101. package/dist/admin/translations/de.json.mjs.map +1 -0
  102. package/dist/admin/{chunks/dk-CYATLPVe.js → translations/dk.json.js} +2 -2
  103. package/dist/admin/translations/dk.json.js.map +1 -0
  104. package/dist/admin/{chunks/dk-BeUFOegB.mjs → translations/dk.json.mjs} +1 -1
  105. package/dist/admin/translations/dk.json.mjs.map +1 -0
  106. package/dist/admin/{chunks/en-CG5cUCbD.js → translations/en.json.js} +2 -2
  107. package/dist/admin/translations/en.json.js.map +1 -0
  108. package/dist/admin/{chunks/en-eWSaCeOb.mjs → translations/en.json.mjs} +1 -1
  109. package/dist/admin/translations/en.json.mjs.map +1 -0
  110. package/dist/admin/{chunks/es-CWsogTGm.js → translations/es.json.js} +2 -2
  111. package/dist/admin/translations/es.json.js.map +1 -0
  112. package/dist/admin/{chunks/es-DqF_IdAc.mjs → translations/es.json.mjs} +1 -1
  113. package/dist/admin/translations/es.json.mjs.map +1 -0
  114. package/dist/admin/{chunks/fr-CC7UFcYd.js → translations/fr.json.js} +2 -2
  115. package/dist/admin/translations/fr.json.js.map +1 -0
  116. package/dist/admin/{chunks/fr-CyARbZ3c.mjs → translations/fr.json.mjs} +1 -1
  117. package/dist/admin/translations/fr.json.mjs.map +1 -0
  118. package/dist/admin/{chunks/ko-XwGmfhoq.js → translations/ko.json.js} +2 -2
  119. package/dist/admin/translations/ko.json.js.map +1 -0
  120. package/dist/admin/{chunks/ko-Ax4NSedM.mjs → translations/ko.json.mjs} +1 -1
  121. package/dist/admin/translations/ko.json.mjs.map +1 -0
  122. package/dist/admin/{chunks/pl-B_vzY_ZB.js → translations/pl.json.js} +2 -2
  123. package/dist/admin/translations/pl.json.js.map +1 -0
  124. package/dist/admin/{chunks/pl-B-aqvMqL.mjs → translations/pl.json.mjs} +1 -1
  125. package/dist/admin/translations/pl.json.mjs.map +1 -0
  126. package/dist/admin/{chunks/ru-WzHcJV1f.js → translations/ru.json.js} +2 -2
  127. package/dist/admin/translations/ru.json.js.map +1 -0
  128. package/dist/admin/{chunks/ru-VkPjQ-Sk.mjs → translations/ru.json.mjs} +1 -1
  129. package/dist/admin/translations/ru.json.mjs.map +1 -0
  130. package/dist/admin/{chunks/tr-CcWp6u3w.js → translations/tr.json.js} +2 -2
  131. package/dist/admin/translations/tr.json.js.map +1 -0
  132. package/dist/admin/{chunks/tr-DcTR88c9.mjs → translations/tr.json.mjs} +1 -1
  133. package/dist/admin/translations/tr.json.mjs.map +1 -0
  134. package/dist/admin/{chunks/uk-CO6JHYRC.js → translations/uk.json.js} +2 -2
  135. package/dist/admin/translations/uk.json.js.map +1 -0
  136. package/dist/admin/{chunks/uk-CMz6iPag.mjs → translations/uk.json.mjs} +1 -1
  137. package/dist/admin/translations/uk.json.mjs.map +1 -0
  138. package/dist/admin/{chunks/zh-Hans-DnU2bhri.js → translations/zh-Hans.json.js} +2 -2
  139. package/dist/admin/translations/zh-Hans.json.js.map +1 -0
  140. package/dist/admin/{chunks/zh-Hans-L3wsRegj.mjs → translations/zh-Hans.json.mjs} +1 -1
  141. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -0
  142. package/dist/admin/{chunks/zh-C9So4SGq.js → translations/zh.json.js} +2 -2
  143. package/dist/admin/translations/zh.json.js.map +1 -0
  144. package/dist/admin/{chunks/zh-RZyMiPIs.mjs → translations/zh.json.mjs} +1 -1
  145. package/dist/admin/translations/zh.json.mjs.map +1 -0
  146. package/dist/admin/utils/baseQuery.js +8 -0
  147. package/dist/admin/utils/baseQuery.js.map +1 -0
  148. package/dist/admin/utils/baseQuery.mjs +6 -0
  149. package/dist/admin/utils/baseQuery.mjs.map +1 -0
  150. package/dist/admin/utils/clean.js +70 -0
  151. package/dist/admin/utils/clean.js.map +1 -0
  152. package/dist/admin/utils/clean.mjs +68 -0
  153. package/dist/admin/utils/clean.mjs.map +1 -0
  154. package/dist/admin/utils/fields.js +34 -0
  155. package/dist/admin/utils/fields.js.map +1 -0
  156. package/dist/admin/utils/fields.mjs +31 -0
  157. package/dist/admin/utils/fields.mjs.map +1 -0
  158. package/dist/admin/utils/getTranslation.js +8 -0
  159. package/dist/admin/utils/getTranslation.js.map +1 -0
  160. package/dist/admin/utils/getTranslation.mjs +6 -0
  161. package/dist/admin/utils/getTranslation.mjs.map +1 -0
  162. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  163. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  164. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  165. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  166. package/dist/admin/utils/schemas.js +74 -0
  167. package/dist/admin/utils/schemas.js.map +1 -0
  168. package/dist/admin/utils/schemas.mjs +72 -0
  169. package/dist/admin/utils/schemas.mjs.map +1 -0
  170. package/dist/admin/utils/strings.js +6 -0
  171. package/dist/admin/utils/strings.js.map +1 -0
  172. package/dist/admin/utils/strings.mjs +4 -0
  173. package/dist/admin/utils/strings.mjs.map +1 -0
  174. package/dist/server/bootstrap.js +79 -0
  175. package/dist/server/bootstrap.js.map +1 -0
  176. package/dist/server/bootstrap.mjs +77 -0
  177. package/dist/server/bootstrap.mjs.map +1 -0
  178. package/dist/server/constants/index.js +29 -0
  179. package/dist/server/constants/index.js.map +1 -0
  180. package/dist/server/constants/index.mjs +25 -0
  181. package/dist/server/constants/index.mjs.map +1 -0
  182. package/dist/server/constants/iso-locales.json.js +2423 -0
  183. package/dist/server/constants/iso-locales.json.js.map +1 -0
  184. package/dist/server/constants/iso-locales.json.mjs +2421 -0
  185. package/dist/server/constants/iso-locales.json.mjs.map +1 -0
  186. package/dist/server/content-types/index.js +10 -0
  187. package/dist/server/content-types/index.js.map +1 -0
  188. package/dist/server/content-types/index.mjs +8 -0
  189. package/dist/server/content-types/index.mjs.map +1 -0
  190. package/dist/server/content-types/locale/index.js +10 -0
  191. package/dist/server/content-types/locale/index.js.map +1 -0
  192. package/dist/server/content-types/locale/index.mjs +8 -0
  193. package/dist/server/content-types/locale/index.mjs.map +1 -0
  194. package/dist/server/content-types/locale/schema.json.js +46 -0
  195. package/dist/server/content-types/locale/schema.json.js.map +1 -0
  196. package/dist/server/content-types/locale/schema.json.mjs +38 -0
  197. package/dist/server/content-types/locale/schema.json.mjs.map +1 -0
  198. package/dist/server/controllers/content-types.js +76 -0
  199. package/dist/server/controllers/content-types.js.map +1 -0
  200. package/dist/server/controllers/content-types.mjs +74 -0
  201. package/dist/server/controllers/content-types.mjs.map +1 -0
  202. package/dist/server/controllers/index.js +14 -0
  203. package/dist/server/controllers/index.js.map +1 -0
  204. package/dist/server/controllers/index.mjs +12 -0
  205. package/dist/server/controllers/index.mjs.map +1 -0
  206. package/dist/server/controllers/iso-locales.js +13 -0
  207. package/dist/server/controllers/iso-locales.js.map +1 -0
  208. package/dist/server/controllers/iso-locales.mjs +11 -0
  209. package/dist/server/controllers/iso-locales.mjs.map +1 -0
  210. package/dist/server/controllers/locales.js +108 -0
  211. package/dist/server/controllers/locales.js.map +1 -0
  212. package/dist/server/controllers/locales.mjs +87 -0
  213. package/dist/server/controllers/locales.mjs.map +1 -0
  214. package/dist/server/controllers/validate-locale-creation.js +47 -0
  215. package/dist/server/controllers/validate-locale-creation.js.map +1 -0
  216. package/dist/server/controllers/validate-locale-creation.mjs +45 -0
  217. package/dist/server/controllers/validate-locale-creation.mjs.map +1 -0
  218. package/dist/server/domain/locale.js +11 -0
  219. package/dist/server/domain/locale.js.map +1 -0
  220. package/dist/server/domain/locale.mjs +9 -0
  221. package/dist/server/domain/locale.mjs.map +1 -0
  222. package/dist/server/graphql.js +115 -0
  223. package/dist/server/graphql.js.map +1 -0
  224. package/dist/server/graphql.mjs +113 -0
  225. package/dist/server/graphql.mjs.map +1 -0
  226. package/dist/server/index.js +10 -3712
  227. package/dist/server/index.js.map +1 -1
  228. package/dist/server/index.mjs +7 -3691
  229. package/dist/server/index.mjs.map +1 -1
  230. package/dist/server/register.js +79 -0
  231. package/dist/server/register.js.map +1 -0
  232. package/dist/server/register.mjs +77 -0
  233. package/dist/server/register.mjs.map +1 -0
  234. package/dist/server/routes/admin.js +102 -0
  235. package/dist/server/routes/admin.js.map +1 -0
  236. package/dist/server/routes/admin.mjs +100 -0
  237. package/dist/server/routes/admin.mjs.map +1 -0
  238. package/dist/server/routes/content-api.js +15 -0
  239. package/dist/server/routes/content-api.js.map +1 -0
  240. package/dist/server/routes/content-api.mjs +13 -0
  241. package/dist/server/routes/content-api.mjs.map +1 -0
  242. package/dist/server/routes/index.js +12 -0
  243. package/dist/server/routes/index.js.map +1 -0
  244. package/dist/server/routes/index.mjs +10 -0
  245. package/dist/server/routes/index.mjs.map +1 -0
  246. package/dist/server/services/content-types.js +157 -0
  247. package/dist/server/services/content-types.js.map +1 -0
  248. package/dist/server/services/content-types.mjs +155 -0
  249. package/dist/server/services/content-types.mjs.map +1 -0
  250. package/dist/server/services/index.js +22 -0
  251. package/dist/server/services/index.js.map +1 -0
  252. package/dist/server/services/index.mjs +20 -0
  253. package/dist/server/services/index.mjs.map +1 -0
  254. package/dist/server/services/iso-locales.js +12 -0
  255. package/dist/server/services/iso-locales.js.map +1 -0
  256. package/dist/server/services/iso-locales.mjs +10 -0
  257. package/dist/server/services/iso-locales.mjs.map +1 -0
  258. package/dist/server/services/locales.js +114 -0
  259. package/dist/server/services/locales.js.map +1 -0
  260. package/dist/server/services/locales.mjs +112 -0
  261. package/dist/server/services/locales.mjs.map +1 -0
  262. package/dist/server/services/localizations.js +68 -0
  263. package/dist/server/services/localizations.js.map +1 -0
  264. package/dist/server/services/localizations.mjs +66 -0
  265. package/dist/server/services/localizations.mjs.map +1 -0
  266. package/dist/server/services/metrics.js +30 -0
  267. package/dist/server/services/metrics.js.map +1 -0
  268. package/dist/server/services/metrics.mjs +28 -0
  269. package/dist/server/services/metrics.mjs.map +1 -0
  270. package/dist/server/services/permissions/actions.js +136 -0
  271. package/dist/server/services/permissions/actions.js.map +1 -0
  272. package/dist/server/services/permissions/actions.mjs +134 -0
  273. package/dist/server/services/permissions/actions.mjs.map +1 -0
  274. package/dist/server/services/permissions/engine.js +52 -0
  275. package/dist/server/services/permissions/engine.js.map +1 -0
  276. package/dist/server/services/permissions/engine.mjs +50 -0
  277. package/dist/server/services/permissions/engine.mjs.map +1 -0
  278. package/dist/server/services/permissions/sections-builder.js +45 -0
  279. package/dist/server/services/permissions/sections-builder.js.map +1 -0
  280. package/dist/server/services/permissions/sections-builder.mjs +43 -0
  281. package/dist/server/services/permissions/sections-builder.mjs.map +1 -0
  282. package/dist/server/services/permissions.js +14 -0
  283. package/dist/server/services/permissions.js.map +1 -0
  284. package/dist/server/services/permissions.mjs +12 -0
  285. package/dist/server/services/permissions.mjs.map +1 -0
  286. package/dist/server/services/sanitize/index.js +34 -0
  287. package/dist/server/services/sanitize/index.js.map +1 -0
  288. package/dist/server/services/sanitize/index.mjs +32 -0
  289. package/dist/server/services/sanitize/index.mjs.map +1 -0
  290. package/dist/server/utils/index.js +16 -0
  291. package/dist/server/utils/index.js.map +1 -0
  292. package/dist/server/utils/index.mjs +13 -0
  293. package/dist/server/utils/index.mjs.map +1 -0
  294. package/dist/server/validation/content-types.js +18 -0
  295. package/dist/server/validation/content-types.js.map +1 -0
  296. package/dist/server/validation/content-types.mjs +16 -0
  297. package/dist/server/validation/content-types.mjs.map +1 -0
  298. package/dist/server/validation/locales.js +23 -0
  299. package/dist/server/validation/locales.js.map +1 -0
  300. package/dist/server/validation/locales.mjs +20 -0
  301. package/dist/server/validation/locales.mjs.map +1 -0
  302. package/package.json +8 -8
  303. package/dist/admin/chunks/SettingsPage-BOEeBbiM.mjs +0 -797
  304. package/dist/admin/chunks/SettingsPage-BOEeBbiM.mjs.map +0 -1
  305. package/dist/admin/chunks/SettingsPage-Mg2Ygywx.js +0 -820
  306. package/dist/admin/chunks/SettingsPage-Mg2Ygywx.js.map +0 -1
  307. package/dist/admin/chunks/de-Cm8mYdaO.mjs.map +0 -1
  308. package/dist/admin/chunks/de-nEMWvIiY.js.map +0 -1
  309. package/dist/admin/chunks/dk-BeUFOegB.mjs.map +0 -1
  310. package/dist/admin/chunks/dk-CYATLPVe.js.map +0 -1
  311. package/dist/admin/chunks/en-CG5cUCbD.js.map +0 -1
  312. package/dist/admin/chunks/en-eWSaCeOb.mjs.map +0 -1
  313. package/dist/admin/chunks/es-CWsogTGm.js.map +0 -1
  314. package/dist/admin/chunks/es-DqF_IdAc.mjs.map +0 -1
  315. package/dist/admin/chunks/fr-CC7UFcYd.js.map +0 -1
  316. package/dist/admin/chunks/fr-CyARbZ3c.mjs.map +0 -1
  317. package/dist/admin/chunks/index--VTS8j_L.mjs +0 -2008
  318. package/dist/admin/chunks/index--VTS8j_L.mjs.map +0 -1
  319. package/dist/admin/chunks/index-hJ67XV0K.js +0 -2037
  320. package/dist/admin/chunks/index-hJ67XV0K.js.map +0 -1
  321. package/dist/admin/chunks/ko-Ax4NSedM.mjs.map +0 -1
  322. package/dist/admin/chunks/ko-XwGmfhoq.js.map +0 -1
  323. package/dist/admin/chunks/pl-B-aqvMqL.mjs.map +0 -1
  324. package/dist/admin/chunks/pl-B_vzY_ZB.js.map +0 -1
  325. package/dist/admin/chunks/ru-VkPjQ-Sk.mjs.map +0 -1
  326. package/dist/admin/chunks/ru-WzHcJV1f.js.map +0 -1
  327. package/dist/admin/chunks/tr-CcWp6u3w.js.map +0 -1
  328. package/dist/admin/chunks/tr-DcTR88c9.mjs.map +0 -1
  329. package/dist/admin/chunks/uk-CMz6iPag.mjs.map +0 -1
  330. package/dist/admin/chunks/uk-CO6JHYRC.js.map +0 -1
  331. package/dist/admin/chunks/zh-C9So4SGq.js.map +0 -1
  332. package/dist/admin/chunks/zh-Hans-DnU2bhri.js.map +0 -1
  333. package/dist/admin/chunks/zh-Hans-L3wsRegj.mjs.map +0 -1
  334. package/dist/admin/chunks/zh-RZyMiPIs.mjs.map +0 -1
@@ -1,3721 +1,19 @@
1
1
  'use strict';
2
2
 
3
- var _ = require('lodash');
4
- var fp = require('lodash/fp');
5
- var utils = require('@strapi/utils');
6
-
7
- function _interopNamespaceDefault(e) {
8
- var n = Object.create(null);
9
- if (e) {
10
- Object.keys(e).forEach(function (k) {
11
- if (k !== 'default') {
12
- var d = Object.getOwnPropertyDescriptor(e, k);
13
- Object.defineProperty(n, k, d.get ? d : {
14
- enumerable: true,
15
- get: function () { return e[k]; }
16
- });
17
- }
18
- });
19
- }
20
- n.default = e;
21
- return Object.freeze(n);
22
- }
23
-
24
- var utils__namespace = /*#__PURE__*/_interopNamespaceDefault(utils);
25
-
26
- const getCoreStore = ()=>{
27
- return strapi.store({
28
- type: 'plugin',
29
- name: 'i18n'
30
- });
31
- };
32
- // retrieve a local service
33
- const getService = (name)=>{
34
- return strapi.plugin('i18n').service(name);
35
- };
36
-
37
- const registerModelsHooks = ()=>{
38
- strapi.db.lifecycles.subscribe({
39
- models: [
40
- 'plugin::i18n.locale'
41
- ],
42
- async afterCreate () {
43
- await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();
44
- },
45
- async afterDelete () {
46
- await getService('permissions').actions.syncSuperAdminPermissionsWithLocales();
47
- }
48
- });
49
- strapi.documents.use(async (context, next)=>{
50
- const schema = context.contentType;
51
- if (![
52
- 'create',
53
- 'update',
54
- 'discardDraft',
55
- 'publish'
56
- ].includes(context.action)) {
57
- return next();
58
- }
59
- if (!getService('content-types').isLocalizedContentType(schema)) {
60
- return next();
61
- }
62
- // Build a populate array for all non localized fields within the schema
63
- const { getNestedPopulateOfNonLocalizedAttributes } = getService('content-types');
64
- const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(schema.uid);
65
- // Get the result of the document service action
66
- const result = await next();
67
- // We may not have received a result with everything populated that we need
68
- // Use the id and populate built from non localized fields to get the full
69
- // result
70
- let resultID;
71
- // TODO: fix bug where an empty array can be returned
72
- if (Array.isArray(result?.entries) && result.entries[0]?.id) {
73
- resultID = result.entries[0].id;
74
- } else if (result?.id) {
75
- resultID = result.id;
76
- } else {
77
- return result;
78
- }
79
- if (attributesToPopulate.length > 0) {
80
- const populatedResult = await strapi.db.query(schema.uid).findOne({
81
- where: {
82
- id: resultID
83
- },
84
- populate: attributesToPopulate
85
- });
86
- await getService('localizations').syncNonLocalizedAttributes(populatedResult, schema);
87
- }
88
- return result;
89
- });
90
- };
91
- var bootstrap = (async ()=>{
92
- const { sendDidInitializeEvent } = getService('metrics');
93
- const { initDefaultLocale } = getService('locales');
94
- const { sectionsBuilder, actions, engine } = getService('permissions');
95
- // Data
96
- await initDefaultLocale();
97
- // Sections Builder
98
- sectionsBuilder.registerLocalesPropertyHandler();
99
- // Actions
100
- await actions.registerI18nActions();
101
- actions.registerI18nActionsHooks();
102
- actions.updateActionsProperties();
103
- // Engine/Permissions
104
- engine.registerI18nPermissionsHandlers();
105
- // Hooks & Models
106
- registerModelsHooks();
107
- sendDidInitializeEvent();
108
- });
109
-
110
- const { ApplicationError: ApplicationError$3 } = utils.errors;
111
- // TODO: v5 if implemented in the CM => delete this middleware
112
- const validateLocaleCreation = async (ctx, next)=>{
113
- const { model } = ctx.params;
114
- const { query } = ctx.request;
115
- // Prevent empty body
116
- if (!ctx.request.body) {
117
- ctx.request.body = {};
118
- }
119
- const body = ctx.request.body;
120
- const { getValidLocale, isLocalizedContentType } = getService('content-types');
121
- const modelDef = strapi.getModel(model);
122
- if (!isLocalizedContentType(modelDef)) {
123
- return next();
124
- }
125
- // Prevent empty string locale
126
- const locale = fp.get('locale', query) || fp.get('locale', body) || undefined;
127
- // cleanup to avoid creating duplicates in single types
128
- ctx.request.query = {};
129
- let entityLocale;
130
- try {
131
- entityLocale = await getValidLocale(locale);
132
- } catch (e) {
133
- throw new ApplicationError$3("This locale doesn't exist");
134
- }
135
- body.locale = entityLocale;
136
- if (modelDef.kind === 'singleType') {
137
- const entity = await strapi.entityService.findMany(modelDef.uid, {
138
- locale: entityLocale
139
- }); // TODO: add this type to entityService
140
- ctx.request.query.locale = body.locale;
141
- // updating
142
- if (entity) {
143
- return next();
144
- }
145
- }
146
- return next();
147
- };
148
-
149
- const { ValidationError } = utils.errors;
150
- const LOCALE_SCALAR_TYPENAME = 'I18NLocaleCode';
151
- const LOCALE_ARG_PLUGIN_NAME = 'I18NLocaleArg';
152
- var graphqlProvider = (({ strapi: strapi1 })=>({
153
- register () {
154
- const { service: getGraphQLService } = strapi1.plugin('graphql');
155
- const { service: getI18NService } = strapi1.plugin('i18n');
156
- const { isLocalizedContentType } = getI18NService('content-types');
157
- const extensionService = getGraphQLService('extension');
158
- extensionService.shadowCRUD('plugin::i18n.locale').disableMutations();
159
- // Disable unwanted fields for localized content types
160
- Object.entries(strapi1.contentTypes).forEach(([uid, ct])=>{
161
- if (isLocalizedContentType(ct)) {
162
- // Disable locale field in localized inputs
163
- extensionService.shadowCRUD(uid).field('locale').disableInput();
164
- // Disable localizations field in localized inputs
165
- extensionService.shadowCRUD(uid).field('localizations').disableInput();
166
- }
167
- });
168
- extensionService.use(({ nexus, typeRegistry })=>{
169
- const i18nLocaleArgPlugin = getI18nLocaleArgPlugin({
170
- nexus,
171
- typeRegistry
172
- });
173
- const i18nLocaleScalar = getLocaleScalar({
174
- nexus
175
- });
176
- return {
177
- plugins: [
178
- i18nLocaleArgPlugin
179
- ],
180
- types: [
181
- i18nLocaleScalar
182
- ],
183
- resolversConfig: {
184
- // Modify the default scope associated to find and findOne locale queries to match the actual action name
185
- 'Query.i18NLocale': {
186
- auth: {
187
- scope: 'plugin::i18n.locales.listLocales'
188
- }
189
- },
190
- 'Query.i18NLocales': {
191
- auth: {
192
- scope: 'plugin::i18n.locales.listLocales'
193
- }
194
- }
195
- }
196
- };
197
- });
198
- }
199
- }));
200
- const getLocaleScalar = ({ nexus })=>{
201
- const { service: getI18NService } = strapi.plugin('i18n');
202
- const locales = getI18NService('iso-locales').getIsoLocales();
203
- return nexus.scalarType({
204
- name: LOCALE_SCALAR_TYPENAME,
205
- description: 'A string used to identify an i18n locale',
206
- serialize: fp.identity,
207
- parseValue: fp.identity,
208
- parseLiteral (ast) {
209
- if (ast.kind !== 'StringValue') {
210
- throw new ValidationError('Locale cannot represent non string type');
211
- }
212
- const isValidLocale = ast.value === '*' || locales.find(fp.propEq('code', ast.value));
213
- if (!isValidLocale) {
214
- throw new ValidationError('Unknown locale supplied');
215
- }
216
- return ast.value;
217
- }
218
- });
219
- };
220
- const getI18nLocaleArgPlugin = ({ nexus, typeRegistry })=>{
221
- const { service: getI18NService } = strapi.plugin('i18n');
222
- const { isLocalizedContentType } = getI18NService('content-types');
223
- return nexus.plugin({
224
- name: LOCALE_ARG_PLUGIN_NAME,
225
- onAddOutputField (config) {
226
- // Add the locale arg to the queries on localized CTs
227
- const { parentType } = config;
228
- // Only target queries or mutations
229
- if (parentType !== 'Query' && parentType !== 'Mutation') {
230
- return;
231
- }
232
- let contentType;
233
- if (config?.extensions?.strapi?.contentType) {
234
- contentType = config.extensions.strapi.contentType;
235
- } else {
236
- const registryType = typeRegistry.get(config.type);
237
- if (!registryType) {
238
- return;
239
- }
240
- contentType = registryType.config.contentType;
241
- }
242
- // Ignore non-localized content types
243
- if (!isLocalizedContentType(contentType)) {
244
- return;
245
- }
246
- if (!config.args) {
247
- config.args = {};
248
- }
249
- config.args.locale = nexus.arg({
250
- type: LOCALE_SCALAR_TYPENAME,
251
- description: 'The locale to use for the query'
252
- });
253
- }
254
- });
255
- };
256
-
257
- var register = (({ strapi })=>{
258
- extendContentTypes(strapi);
259
- addContentManagerLocaleMiddleware(strapi);
260
- });
261
- // TODO: v5 if implemented in the CM => delete this middleware
262
- /**
263
- * Adds middleware on CM creation routes to use i18n locale passed in a specific param
264
- * @param {Strapi} strapi
265
- */ const addContentManagerLocaleMiddleware = (strapi)=>{
266
- strapi.server.router.use('/content-manager/collection-types/:model', (ctx, next)=>{
267
- if (ctx.method === 'POST' || ctx.method === 'PUT') {
268
- return validateLocaleCreation(ctx, next);
269
- }
270
- return next();
271
- });
272
- strapi.server.router.use('/content-manager/single-types/:model', (ctx, next)=>{
273
- if (ctx.method === 'POST' || ctx.method === 'PUT') {
274
- return validateLocaleCreation(ctx, next);
275
- }
276
- return next();
277
- });
278
- };
279
- /**
280
- * Adds locale and localization fields to all content types
281
- * Even if content type is not localized, it will have these fields
282
- * @param {Strapi} strapi
283
- */ const extendContentTypes = (strapi)=>{
284
- const { isLocalizedContentType } = getService('content-types');
285
- Object.values(strapi.contentTypes).forEach((contentType)=>{
286
- const { attributes } = contentType;
287
- const isLocalized = isLocalizedContentType(contentType);
288
- _.set(attributes, 'locale', {
289
- writable: true,
290
- private: !isLocalized,
291
- configurable: false,
292
- visible: false,
293
- type: 'string'
294
- });
295
- _.set(attributes, 'localizations', {
296
- type: 'relation',
297
- relation: 'oneToMany',
298
- target: contentType.uid,
299
- writable: false,
300
- private: !isLocalized,
301
- configurable: false,
302
- visible: false,
303
- unstable_virtual: true,
304
- joinColumn: {
305
- name: 'document_id',
306
- referencedColumn: 'document_id',
307
- referencedTable: strapi.db.metadata.identifiers.getTableName(contentType.collectionName),
308
- // ensure the population will not include the results we already loaded
309
- on ({ results }) {
310
- return {
311
- id: {
312
- $notIn: results.map((r)=>r.id)
313
- }
314
- };
315
- }
316
- }
317
- });
318
- });
319
- if (strapi.plugin('graphql')) {
320
- // eslint-disable-next-line @typescript-eslint/no-var-requires
321
- graphqlProvider({
322
- strapi
323
- }).register();
324
- }
325
- };
326
-
327
- var info = {
328
- singularName: "locale",
329
- pluralName: "locales",
330
- collectionName: "locales",
331
- displayName: "Locale",
332
- description: ""
333
- };
334
- var options = {};
335
- var pluginOptions = {
336
- "content-manager": {
337
- visible: false
338
- },
339
- "content-type-builder": {
340
- visible: false
341
- }
342
- };
343
- var attributes = {
344
- name: {
345
- type: "string",
346
- min: 1,
347
- max: 50,
348
- configurable: false
349
- },
350
- code: {
351
- type: "string",
352
- unique: true,
353
- configurable: false
354
- }
355
- };
356
- var schema = {
357
- info: info,
358
- options: options,
359
- pluginOptions: pluginOptions,
360
- attributes: attributes
361
- };
362
-
363
- var locale = {
364
- schema
365
- };
366
-
367
- var contentTypes$1 = {
368
- locale
369
- };
370
-
371
- const actions = [
372
- {
373
- section: 'settings',
374
- category: 'Internationalization',
375
- subCategory: 'Locales',
376
- pluginName: 'i18n',
377
- displayName: 'Create',
378
- uid: 'locale.create'
379
- },
380
- {
381
- section: 'settings',
382
- category: 'Internationalization',
383
- subCategory: 'Locales',
384
- pluginName: 'i18n',
385
- displayName: 'Read',
386
- uid: 'locale.read',
387
- aliases: [
388
- {
389
- actionId: 'plugin::content-manager.explorer.read',
390
- subjects: [
391
- 'plugin::i18n.locale'
392
- ]
393
- }
394
- ]
395
- },
396
- {
397
- section: 'settings',
398
- category: 'Internationalization',
399
- subCategory: 'Locales',
400
- pluginName: 'i18n',
401
- displayName: 'Update',
402
- uid: 'locale.update'
403
- },
404
- {
405
- section: 'settings',
406
- category: 'Internationalization',
407
- subCategory: 'Locales',
408
- pluginName: 'i18n',
409
- displayName: 'Delete',
410
- uid: 'locale.delete'
411
- }
412
- ];
413
- const addLocalesPropertyIfNeeded = ({ value: action })=>{
414
- const { section, options: { applyToProperties } } = action;
415
- // Only add the locales property to contentTypes' actions
416
- if (section !== 'contentTypes') {
417
- return;
418
- }
419
- // If the 'locales' property is already declared within the applyToProperties array, then ignore the next steps
420
- if (fp.isArray(applyToProperties) && applyToProperties.includes('locales')) {
421
- return;
422
- }
423
- // Add the 'locales' property to the applyToProperties array (create it if necessary)
424
- action.options.applyToProperties = fp.isArray(applyToProperties) ? applyToProperties.concat('locales') : [
425
- 'locales'
426
- ];
427
- };
428
- const shouldApplyLocalesPropertyToSubject = ({ property, subject })=>{
429
- if (property === 'locales') {
430
- const model = strapi.getModel(subject);
431
- return getService('content-types').isLocalizedContentType(model);
432
- }
433
- return true;
434
- };
435
- const addAllLocalesToPermissions = async (permissions)=>{
436
- const { actionProvider } = strapi.service('admin::permission');
437
- const { find: findAllLocales } = getService('locales');
438
- const allLocales = await findAllLocales();
439
- const allLocalesCode = allLocales.map(fp.prop('code'));
440
- return Promise.all(permissions.map(async (permission)=>{
441
- const { action, subject } = permission;
442
- const appliesToLocalesProperty = await actionProvider.appliesToProperty('locales', action, subject);
443
- if (!appliesToLocalesProperty) {
444
- return permission;
445
- }
446
- const oldPermissionProperties = fp.getOr({}, 'properties', permission);
447
- return {
448
- ...permission,
449
- properties: {
450
- ...oldPermissionProperties,
451
- locales: allLocalesCode
452
- }
453
- };
454
- }));
455
- };
456
- const syncSuperAdminPermissionsWithLocales = async ()=>{
457
- const roleService = strapi.service('admin::role');
458
- const permissionService = strapi.service('admin::permission');
459
- const superAdminRole = await roleService.getSuperAdmin();
460
- if (!superAdminRole) {
461
- return;
462
- }
463
- const superAdminPermissions = await permissionService.findMany({
464
- where: {
465
- role: {
466
- id: superAdminRole.id
467
- }
468
- }
469
- });
470
- const newSuperAdminPermissions = await addAllLocalesToPermissions(superAdminPermissions);
471
- await roleService.assignPermissions(superAdminRole.id, newSuperAdminPermissions);
472
- };
473
- const registerI18nActions = async ()=>{
474
- const { actionProvider } = strapi.service('admin::permission');
475
- await actionProvider.registerMany(actions);
476
- };
477
- const registerI18nActionsHooks = ()=>{
478
- const { actionProvider } = strapi.service('admin::permission');
479
- const { hooks } = strapi.service('admin::role');
480
- actionProvider.hooks.appliesPropertyToSubject.register(shouldApplyLocalesPropertyToSubject);
481
- hooks.willResetSuperAdminPermissions.register(addAllLocalesToPermissions);
482
- };
483
- const updateActionsProperties = ()=>{
484
- const { actionProvider } = strapi.service('admin::permission');
485
- // Register the transformation for every new action
486
- actionProvider.hooks.willRegister.register(addLocalesPropertyIfNeeded);
487
- // Handle already registered actions
488
- actionProvider.values().forEach((action)=>addLocalesPropertyIfNeeded({
489
- value: action
490
- }));
491
- };
492
- var i18nActionsService = {
493
- actions,
494
- registerI18nActions,
495
- registerI18nActionsHooks,
496
- updateActionsProperties,
497
- syncSuperAdminPermissionsWithLocales
498
- };
499
-
500
- /**
501
- * Handler for the permissions layout (sections builder)
502
- * Adds the locales property to the subjects
503
- * @param {Action} action
504
- * @param {ContentTypesSection} section
505
- * @return {Promise<void>}
506
- */ const localesPropertyHandler = async ({ action, section })=>{
507
- const { actionProvider } = strapi.service('admin::permission');
508
- const locales = await getService('locales').find();
509
- // Do not add the locales property if there is none registered
510
- if (fp.isEmpty(locales)) {
511
- return;
512
- }
513
- for (const subject of section.subjects){
514
- const applies = await actionProvider.appliesToProperty('locales', action.actionId, subject.uid);
515
- const hasLocalesProperty = subject.properties.find((property)=>property.value === 'locales');
516
- if (applies && !hasLocalesProperty) {
517
- subject.properties.push({
518
- label: 'Locales',
519
- value: 'locales',
520
- children: locales.map(({ name, code })=>({
521
- label: name || code,
522
- value: code
523
- }))
524
- });
525
- }
526
- }
527
- };
528
- const registerLocalesPropertyHandler = ()=>{
529
- const { sectionsBuilder } = strapi.service('admin::permission');
530
- sectionsBuilder.addHandler('singleTypes', localesPropertyHandler);
531
- sectionsBuilder.addHandler('collectionTypes', localesPropertyHandler);
532
- };
533
- var sectionsBuilderService = {
534
- localesPropertyHandler,
535
- registerLocalesPropertyHandler
536
- };
537
-
538
- /**
539
- * @typedef {object} WillRegisterPermissionContext
540
- * @property {Permission} permission
541
- * @property {object} user
542
- * @property {object} condition
543
- */ /**
544
- * Locales property handler for the permission engine
545
- * Add the has-locale-access condition if the locales property is defined
546
- * @param {WillRegisterPermissionContext} context
547
- */ const willRegisterPermission = (context)=>{
548
- const { permission, condition, user } = context;
549
- const { subject, properties } = permission;
550
- const isSuperAdmin = strapi.service('admin::role').hasSuperAdminRole(user);
551
- if (isSuperAdmin) {
552
- return;
553
- }
554
- const { locales } = properties || {};
555
- const { isLocalizedContentType } = getService('content-types');
556
- // If there is no subject defined, ignore the permission
557
- if (!subject) {
558
- return;
559
- }
560
- const ct = strapi.contentTypes[subject];
561
- // If the subject exists but isn't localized, ignore the permission
562
- if (!isLocalizedContentType(ct)) {
563
- return;
564
- }
565
- // If the subject is localized but the locales property is null (access to all locales), ignore the permission
566
- if (locales === null) {
567
- return;
568
- }
569
- condition.and({
570
- locale: {
571
- $in: locales || []
572
- }
573
- });
574
- };
575
- const registerI18nPermissionsHandlers = ()=>{
576
- const { engine } = strapi.service('admin::permission');
577
- engine.hooks['before-register.permission'].register(willRegisterPermission);
578
- };
579
- var engineService = {
580
- willRegisterPermission,
581
- registerI18nPermissionsHandlers
582
- };
583
-
584
- const permissions = ()=>({
585
- actions: i18nActionsService,
586
- sectionsBuilder: sectionsBuilderService,
587
- engine: engineService
588
- });
589
-
590
- const sendDidInitializeEvent = async ()=>{
591
- const { isLocalizedContentType } = getService('content-types');
592
- // TODO: V5: This event should be renamed numberOfContentTypes in V5 as the name is already taken to describe the number of content types using i18n.
593
- const numberOfContentTypes = fp.reduce((sum, contentType)=>isLocalizedContentType(contentType) ? sum + 1 : sum, 0)(strapi.contentTypes);
594
- await strapi.telemetry.send('didInitializeI18n', {
595
- groupProperties: {
596
- numberOfContentTypes
597
- }
598
- });
599
- };
600
- const sendDidUpdateI18nLocalesEvent = async ()=>{
601
- const numberOfLocales = await getService('locales').count();
602
- await strapi.telemetry.send('didUpdateI18nLocales', {
603
- groupProperties: {
604
- numberOfLocales
605
- }
606
- });
607
- };
608
- const metrics = ()=>({
609
- sendDidInitializeEvent,
610
- sendDidUpdateI18nLocalesEvent
611
- });
612
-
613
- /**
614
- * Update non localized fields of all the related localizations of an entry with the entry values
615
- */ const syncNonLocalizedAttributes = async (sourceEntry, model)=>{
616
- const { copyNonLocalizedAttributes } = getService('content-types');
617
- const nonLocalizedAttributes = copyNonLocalizedAttributes(model, sourceEntry);
618
- if (fp.isEmpty(nonLocalizedAttributes)) {
619
- return;
620
- }
621
- const uid = model.uid;
622
- const documentId = sourceEntry.documentId;
623
- const locale = sourceEntry.locale;
624
- const status = sourceEntry?.publishedAt ? 'published' : 'draft';
625
- // Find all the entries that need to be updated
626
- // this is every other entry of the document in the same status but a different locale
627
- const localeEntriesToUpdate = await strapi.db.query(uid).findMany({
628
- where: {
629
- documentId,
630
- publishedAt: status === 'published' ? {
631
- $ne: null
632
- } : null,
633
- locale: {
634
- $ne: locale
635
- }
636
- },
637
- select: [
638
- 'locale',
639
- 'id'
640
- ]
641
- });
642
- const entryData = await strapi.documents(uid).omitComponentData(nonLocalizedAttributes);
643
- await utils.async.map(localeEntriesToUpdate, async (entry)=>{
644
- const transformedData = await strapi.documents.utils.transformData(fp.cloneDeep(nonLocalizedAttributes), {
645
- uid,
646
- status,
647
- locale: entry.locale,
648
- allowMissingId: true
649
- });
650
- // Update or create non localized components for the entry
651
- const componentData = await strapi.documents(uid).updateComponents(entry, transformedData);
652
- // Update every other locale entry of this documentId in the same status
653
- await strapi.db.query(uid).update({
654
- where: {
655
- documentId,
656
- publishedAt: status === 'published' ? {
657
- $ne: null
658
- } : null,
659
- locale: {
660
- $eq: entry.locale
661
- }
662
- },
663
- // The data we send to the update function is the entry data merged with
664
- // the updated component data
665
- data: Object.assign(fp.cloneDeep(entryData), componentData)
666
- });
667
- });
668
- };
669
- const localizations = ()=>({
670
- syncNonLocalizedAttributes
671
- });
672
-
673
- var isoLocales = [
674
- {
675
- code: "af",
676
- name: "Afrikaans (af)"
677
- },
678
- {
679
- code: "af-NA",
680
- name: "Afrikaans (Namibia) (af-NA)"
681
- },
682
- {
683
- code: "af-ZA",
684
- name: "Afrikaans (South Africa) (af-ZA)"
685
- },
686
- {
687
- code: "agq",
688
- name: "Aghem (agq)"
689
- },
690
- {
691
- code: "agq-CM",
692
- name: "Aghem (Cameroon) (agq-CM)"
693
- },
694
- {
695
- code: "ak",
696
- name: "Akan (ak)"
697
- },
698
- {
699
- code: "ak-GH",
700
- name: "Akan (Ghana) (ak-GH)"
701
- },
702
- {
703
- code: "sq",
704
- name: "Albanian (sq)"
705
- },
706
- {
707
- code: "sq-AL",
708
- name: "Albanian (Albania) (sq-AL)"
709
- },
710
- {
711
- code: "am",
712
- name: "Amharic (am)"
713
- },
714
- {
715
- code: "am-ET",
716
- name: "Amharic (Ethiopia) (am-ET)"
717
- },
718
- {
719
- code: "aig",
720
- name: "Antigua and Barbuda Creole English"
721
- },
722
- {
723
- code: "ar",
724
- name: "Arabic (ar)"
725
- },
726
- {
727
- code: "ar-DZ",
728
- name: "Arabic (Algeria) (ar-DZ)"
729
- },
730
- {
731
- code: "ar-BH",
732
- name: "Arabic (Bahrain) (ar-BH)"
733
- },
734
- {
735
- code: "ar-EG",
736
- name: "Arabic (Egypt) (ar-EG)"
737
- },
738
- {
739
- code: "ar-IQ",
740
- name: "Arabic (Iraq) (ar-IQ)"
741
- },
742
- {
743
- code: "ar-JO",
744
- name: "Arabic (Jordan) (ar-JO)"
745
- },
746
- {
747
- code: "ar-KW",
748
- name: "Arabic (Kuwait) (ar-KW)"
749
- },
750
- {
751
- code: "ar-LB",
752
- name: "Arabic (Lebanon) (ar-LB)"
753
- },
754
- {
755
- code: "ar-LY",
756
- name: "Arabic (Libya) (ar-LY)"
757
- },
758
- {
759
- code: "ar-MA",
760
- name: "Arabic (Morocco) (ar-MA)"
761
- },
762
- {
763
- code: "ar-OM",
764
- name: "Arabic (Oman) (ar-OM)"
765
- },
766
- {
767
- code: "ar-QA",
768
- name: "Arabic (Qatar) (ar-QA)"
769
- },
770
- {
771
- code: "ar-SA",
772
- name: "Arabic (Saudi Arabia) (ar-SA)"
773
- },
774
- {
775
- code: "ar-SD",
776
- name: "Arabic (Sudan) (ar-SD)"
777
- },
778
- {
779
- code: "ar-SY",
780
- name: "Arabic (Syria) (ar-SY)"
781
- },
782
- {
783
- code: "ar-TN",
784
- name: "Arabic (Tunisia) (ar-TN)"
785
- },
786
- {
787
- code: "ar-AE",
788
- name: "Arabic (United Arab Emirates) (ar-AE)"
789
- },
790
- {
791
- code: "ar-001",
792
- name: "Arabic (World) (ar-001)"
793
- },
794
- {
795
- code: "ar-YE",
796
- name: "Arabic (Yemen) (ar-YE)"
797
- },
798
- {
799
- code: "hy",
800
- name: "Armenian (hy)"
801
- },
802
- {
803
- code: "hy-AM",
804
- name: "Armenian (Armenia) (hy-AM)"
805
- },
806
- {
807
- code: "as",
808
- name: "Assamese (as)"
809
- },
810
- {
811
- code: "as-IN",
812
- name: "Assamese (India) (as-IN)"
813
- },
814
- {
815
- code: "ast",
816
- name: "Asturian (ast)"
817
- },
818
- {
819
- code: "ast-ES",
820
- name: "Asturian (Spain) (ast-ES)"
821
- },
822
- {
823
- code: "asa",
824
- name: "Asu (asa)"
825
- },
826
- {
827
- code: "asa-TZ",
828
- name: "Asu (Tanzania) (asa-TZ)"
829
- },
830
- {
831
- code: "az",
832
- name: "Azerbaijani (az)"
833
- },
834
- {
835
- code: "az-Cyrl",
836
- name: "Azerbaijani (Cyrillic) (az-Cyrl)"
837
- },
838
- {
839
- code: "az-Cyrl-AZ",
840
- name: "Azerbaijani (Cyrillic, Azerbaijan) (az-Cyrl-AZ)"
841
- },
842
- {
843
- code: "az-Latn",
844
- name: "Azerbaijani (Latin) (az-Latn)"
845
- },
846
- {
847
- code: "az-Latn-AZ",
848
- name: "Azerbaijani (Latin, Azerbaijan) (az-Latn-AZ)"
849
- },
850
- {
851
- code: "ksf",
852
- name: "Bafia (ksf)"
853
- },
854
- {
855
- code: "ksf-CM",
856
- name: "Bafia (Cameroon) (ksf-CM)"
857
- },
858
- {
859
- code: "bah",
860
- name: "Bahamas Creole English"
861
- },
862
- {
863
- code: "bm",
864
- name: "Bambara (bm)"
865
- },
866
- {
867
- code: "bm-ML",
868
- name: "Bambara (Mali) (bm-ML)"
869
- },
870
- {
871
- code: "bas",
872
- name: "Basaa (bas)"
873
- },
874
- {
875
- code: "bas-CM",
876
- name: "Basaa (Cameroon) (bas-CM)"
877
- },
878
- {
879
- code: "eu",
880
- name: "Basque (eu)"
881
- },
882
- {
883
- code: "eu-ES",
884
- name: "Basque (Spain) (eu-ES)"
885
- },
886
- {
887
- code: "be",
888
- name: "Belarusian (be)"
889
- },
890
- {
891
- code: "be-BY",
892
- name: "Belarusian (Belarus) (be-BY)"
893
- },
894
- {
895
- code: "bem",
896
- name: "Bemba (bem)"
897
- },
898
- {
899
- code: "bem-ZM",
900
- name: "Bemba (Zambia) (bem-ZM)"
901
- },
902
- {
903
- code: "bez",
904
- name: "Bena (bez)"
905
- },
906
- {
907
- code: "bez-TZ",
908
- name: "Bena (Tanzania) (bez-TZ)"
909
- },
910
- {
911
- code: "bn",
912
- name: "Bengali (bn)"
913
- },
914
- {
915
- code: "bn-BD",
916
- name: "Bengali (Bangladesh) (bn-BD)"
917
- },
918
- {
919
- code: "bn-IN",
920
- name: "Bengali (India) (bn-IN)"
921
- },
922
- {
923
- code: "brx",
924
- name: "Bodo (brx)"
925
- },
926
- {
927
- code: "brx-IN",
928
- name: "Bodo (India) (brx-IN)"
929
- },
930
- {
931
- code: "bs",
932
- name: "Bosnian (bs)"
933
- },
934
- {
935
- code: "bs-BA",
936
- name: "Bosnian (Bosnia and Herzegovina) (bs-BA)"
937
- },
938
- {
939
- code: "br",
940
- name: "Breton (br)"
941
- },
942
- {
943
- code: "br-FR",
944
- name: "Breton (France) (br-FR)"
945
- },
946
- {
947
- code: "bg",
948
- name: "Bulgarian (bg)"
949
- },
950
- {
951
- code: "bg-BG",
952
- name: "Bulgarian (Bulgaria) (bg-BG)"
953
- },
954
- {
955
- code: "my",
956
- name: "Burmese (my)"
957
- },
958
- {
959
- code: "my-MM",
960
- name: "Burmese (Myanmar [Burma]) (my-MM)"
961
- },
962
- {
963
- code: "ca",
964
- name: "Catalan (ca)"
965
- },
966
- {
967
- code: "ca-ES",
968
- name: "Catalan (Spain) (ca-ES)"
969
- },
970
- {
971
- code: "ckb",
972
- name: "Central Kurdish (ckb)"
973
- },
974
- {
975
- code: "kmr",
976
- name: "Northern Kurdish (kmr)"
977
- },
978
- {
979
- code: "sdh",
980
- name: "Southern Kurdish (sdh)"
981
- },
982
- {
983
- code: "tzm",
984
- name: "Central Morocco Tamazight (tzm)"
985
- },
986
- {
987
- code: "tzm-Latn",
988
- name: "Central Morocco Tamazight (Latin) (tzm-Latn)"
989
- },
990
- {
991
- code: "tzm-Latn-MA",
992
- name: "Central Morocco Tamazight (Latin, Morocco) (tzm-Latn-MA) "
993
- },
994
- {
995
- code: "chr",
996
- name: "Cherokee (chr)"
997
- },
998
- {
999
- code: "chr-US",
1000
- name: "Cherokee (United States) (chr-US)"
1001
- },
1002
- {
1003
- code: "cgg",
1004
- name: "Chiga (cgg)"
1005
- },
1006
- {
1007
- code: "cgg-UG",
1008
- name: "Chiga (Uganda) (cgg-UG)"
1009
- },
1010
- {
1011
- code: "zh",
1012
- name: "Chinese (zh)"
1013
- },
1014
- {
1015
- code: "zh-Hans",
1016
- name: "Chinese (Simplified) (zh-Hans)"
1017
- },
1018
- {
1019
- code: "zh-CN",
1020
- name: "Chinese (Simplified, China) (zh-CN)"
1021
- },
1022
- {
1023
- code: "zh-Hans-CN",
1024
- name: "Chinese (Simplified, China) (zh-Hans-CN)"
1025
- },
1026
- {
1027
- code: "zh-Hans-HK",
1028
- name: "Chinese (Simplified, Hong Kong SAR China) (zh-Hans-HK)"
1029
- },
1030
- {
1031
- code: "zh-Hans-MO",
1032
- name: "Chinese (Simplified, Macau SAR China) (zh-Hans-MO) "
1033
- },
1034
- {
1035
- code: "zh-Hans-SG",
1036
- name: "Chinese (Simplified, Singapore) (zh-Hans-SG)"
1037
- },
1038
- {
1039
- code: "zh-Hant",
1040
- name: "Chinese (Traditional) (zh-Hant)"
1041
- },
1042
- {
1043
- code: "zh-Hant-HK",
1044
- name: "Chinese (Traditional, Hong Kong SAR China) (zh-Hant-HK) "
1045
- },
1046
- {
1047
- code: "zh-Hant-MO",
1048
- name: "Chinese (Traditional, Macau SAR China) (zh-Hant-MO) "
1049
- },
1050
- {
1051
- code: "zh-Hant-TW",
1052
- name: "Chinese (Traditional, Taiwan) (zh-Hant-TW)"
1053
- },
1054
- {
1055
- code: "swc",
1056
- name: "Congo Swahili (swc)"
1057
- },
1058
- {
1059
- code: "swc-CD",
1060
- name: "Congo Swahili (Congo - Kinshasa) (swc-CD)"
1061
- },
1062
- {
1063
- code: "kw",
1064
- name: "Cornish (kw)"
1065
- },
1066
- {
1067
- code: "kw-GB",
1068
- name: "Cornish (United Kingdom) (kw-GB)"
1069
- },
1070
- {
1071
- code: "hr",
1072
- name: "Croatian (hr)"
1073
- },
1074
- {
1075
- code: "hr-HR",
1076
- name: "Croatian (Croatia) (hr-HR)"
1077
- },
1078
- {
1079
- code: "cs",
1080
- name: "Czech (cs)"
1081
- },
1082
- {
1083
- code: "cs-CZ",
1084
- name: "Czech (Czech Republic) (cs-CZ)"
1085
- },
1086
- {
1087
- code: "da",
1088
- name: "Danish (da)"
1089
- },
1090
- {
1091
- code: "da-DK",
1092
- name: "Danish (Denmark) (da-DK)"
1093
- },
1094
- {
1095
- code: "dua",
1096
- name: "Duala (dua)"
1097
- },
1098
- {
1099
- code: "dua-CM",
1100
- name: "Duala (Cameroon) (dua-CM)"
1101
- },
1102
- {
1103
- code: "dv",
1104
- name: "Dhivehi (Maldives)"
1105
- },
1106
- {
1107
- code: "nl",
1108
- name: "Dutch (nl)"
1109
- },
1110
- {
1111
- code: "nl-AW",
1112
- name: "Dutch (Aruba) (nl-AW)"
1113
- },
1114
- {
1115
- code: "nl-BE",
1116
- name: "Dutch (Belgium) (nl-BE)"
1117
- },
1118
- {
1119
- code: "nl-CW",
1120
- name: "Dutch (Curaçao) (nl-CW)"
1121
- },
1122
- {
1123
- code: "nl-NL",
1124
- name: "Dutch (Netherlands) (nl-NL)"
1125
- },
1126
- {
1127
- code: "nl-SX",
1128
- name: "Dutch (Sint Maarten) (nl-SX)"
1129
- },
1130
- {
1131
- code: "ebu",
1132
- name: "Embu (ebu)"
1133
- },
1134
- {
1135
- code: "ebu-KE",
1136
- name: "Embu (Kenya) (ebu-KE)"
1137
- },
1138
- {
1139
- code: "en",
1140
- name: "English (en)"
1141
- },
1142
- {
1143
- code: "en-AI",
1144
- name: "English (Anguilla) (en-AI)"
1145
- },
1146
- {
1147
- code: "en-AS",
1148
- name: "English (American Samoa) (en-AS)"
1149
- },
1150
- {
1151
- code: "en-AU",
1152
- name: "English (Australia) (en-AU)"
1153
- },
1154
- {
1155
- code: "en-AT",
1156
- name: "English (Austria) (en-AT)"
1157
- },
1158
- {
1159
- code: "en-BB",
1160
- name: "English (Barbados) (en-BB)"
1161
- },
1162
- {
1163
- code: "en-BE",
1164
- name: "English (Belgium) (en-BE)"
1165
- },
1166
- {
1167
- code: "en-BZ",
1168
- name: "English (Belize) (en-BZ)"
1169
- },
1170
- {
1171
- code: "en-BM",
1172
- name: "English (Bermuda) (en-BM)"
1173
- },
1174
- {
1175
- code: "en-BW",
1176
- name: "English (Botswana) (en-BW)"
1177
- },
1178
- {
1179
- code: "en-IO",
1180
- name: "English (British Indian Ocean Territory) (en-IO)"
1181
- },
1182
- {
1183
- code: "en-BI",
1184
- name: "English (Burundi) (en-BI)"
1185
- },
1186
- {
1187
- code: "en-CM",
1188
- name: "English (Cameroon) (en-CM)"
1189
- },
1190
- {
1191
- code: "en-CA",
1192
- name: "English (Canada) (en-CA)"
1193
- },
1194
- {
1195
- code: "en-KY",
1196
- name: "English (Cayman Islands) (en-KY)"
1197
- },
1198
- {
1199
- code: "en-CX",
1200
- name: "English (Christmas Island) (en-CX)"
1201
- },
1202
- {
1203
- code: "en-CC",
1204
- name: "English (Cocos [Keeling] Islands) (en-CC)"
1205
- },
1206
- {
1207
- code: "en-CK",
1208
- name: "English (Cook Islands) (en-CK)"
1209
- },
1210
- {
1211
- code: "en-CY",
1212
- name: "English (Cyprus) (en-CY)"
1213
- },
1214
- {
1215
- code: "en-DK",
1216
- name: "English (Denmark) (en-DK)"
1217
- },
1218
- {
1219
- code: "en-DG",
1220
- name: "English (Diego Garcia) (en-DG)"
1221
- },
1222
- {
1223
- code: "en-DM",
1224
- name: "English (Dominica) (en-DM)"
1225
- },
1226
- {
1227
- code: "en-EG",
1228
- name: "English (Egypt) (en-EG)"
1229
- },
1230
- {
1231
- code: "en-ER",
1232
- name: "English (Eritrea) (en-ER)"
1233
- },
1234
- {
1235
- code: "en-EU",
1236
- name: "English (Europe) (en-EU)"
1237
- },
1238
- {
1239
- code: "en-FK",
1240
- name: "English (Falkland Islands) (en-FK)"
1241
- },
1242
- {
1243
- code: "en-FJ",
1244
- name: "English (Fiji) (en-FJ)"
1245
- },
1246
- {
1247
- code: "en-FI",
1248
- name: "English (Finland) (en-FI)"
1249
- },
1250
- {
1251
- code: "en-GM",
1252
- name: "English (Gambia) (en-GM)"
1253
- },
1254
- {
1255
- code: "en-DE",
1256
- name: "English (Germany) (en-DE)"
1257
- },
1258
- {
1259
- code: "en-GH",
1260
- name: "English (Ghana) (en-GH)"
1261
- },
1262
- {
1263
- code: "en-GI",
1264
- name: "English (Gibraltar) (en-GI)"
1265
- },
1266
- {
1267
- code: "en-GD",
1268
- name: "English (Grenada) (en-GD)"
1269
- },
1270
- {
1271
- code: "en-GU",
1272
- name: "English (Guam) (en-GU)"
1273
- },
1274
- {
1275
- code: "en-GG",
1276
- name: "English (Guernsey) (en-GG)"
1277
- },
1278
- {
1279
- code: "en-GY",
1280
- name: "English (Guyana) (en-GY)"
1281
- },
1282
- {
1283
- code: "en-HK",
1284
- name: "English (Hong Kong SAR China) (en-HK)"
1285
- },
1286
- {
1287
- code: "en-IN",
1288
- name: "English (India) (en-IN)"
1289
- },
1290
- {
1291
- code: "en-IE",
1292
- name: "English (Ireland) (en-IE)"
1293
- },
1294
- {
1295
- code: "en-IM",
1296
- name: "English (Isle of Man) (en-IM)"
1297
- },
1298
- {
1299
- code: "en-IL",
1300
- name: "English (Israel) (en-IL)"
1301
- },
1302
- {
1303
- code: "en-JM",
1304
- name: "English (Jamaica) (en-JM)"
1305
- },
1306
- {
1307
- code: "en-JE",
1308
- name: "English (Jersey) (en-JE)"
1309
- },
1310
- {
1311
- code: "en-KE",
1312
- name: "English (Kenya) (en-KE)"
1313
- },
1314
- {
1315
- code: "en-KI",
1316
- name: "English (Kiribati) (en-KI)"
1317
- },
1318
- {
1319
- code: "en-KW",
1320
- name: "English (Kuwait) (en-KW)"
1321
- },
1322
- {
1323
- code: "en-LS",
1324
- name: "English (Lesotho) (en-LS)"
1325
- },
1326
- {
1327
- code: "en-MO",
1328
- name: "English (Macao SAR China) (en-MO)"
1329
- },
1330
- {
1331
- code: "en-MG",
1332
- name: "English (Madagascar) (en-MG)"
1333
- },
1334
- {
1335
- code: "en-MW",
1336
- name: "English (Malawi) (en-MW)"
1337
- },
1338
- {
1339
- code: "en-MY",
1340
- name: "English (Malaysia) (en-MY)"
1341
- },
1342
- {
1343
- code: "en-MT",
1344
- name: "English (Malta) (en-MT)"
1345
- },
1346
- {
1347
- code: "en-MH",
1348
- name: "English (Marshall Islands) (en-MH)"
1349
- },
1350
- {
1351
- code: "en-MU",
1352
- name: "English (Mauritius) (en-MU)"
1353
- },
1354
- {
1355
- code: "en-FM",
1356
- name: "English (Micronesia) (en-FM)"
1357
- },
1358
- {
1359
- code: "en-MS",
1360
- name: "English (Montserrat) (en-MS)"
1361
- },
1362
- {
1363
- code: "en-NA",
1364
- name: "English (Namibia) (en-NA)"
1365
- },
1366
- {
1367
- code: "en-NR",
1368
- name: "English (Nauru) (en-NR)"
1369
- },
1370
- {
1371
- code: "en-NL",
1372
- name: "English (Netherlands) (en-NL)"
1373
- },
1374
- {
1375
- code: "en-NZ",
1376
- name: "English (New Zealand) (en-NZ)"
1377
- },
1378
- {
1379
- code: "en-NG",
1380
- name: "English (Nigeria) (en-NG)"
1381
- },
1382
- {
1383
- code: "en-NU",
1384
- name: "English (Niue) (en-NU)"
1385
- },
1386
- {
1387
- code: "en-NF",
1388
- name: "English (Norfolk Island) (en-NF)"
1389
- },
1390
- {
1391
- code: "en-MP",
1392
- name: "English (Northern Mariana Islands) (en-MP)"
1393
- },
1394
- {
1395
- code: "en-NO",
1396
- name: "English (Norway) (en-NO)"
1397
- },
1398
- {
1399
- code: "en-PA",
1400
- name: "English (Panama) (en-PA)"
1401
- },
1402
- {
1403
- code: "en-PK",
1404
- name: "English (Pakistan) (en-PK)"
1405
- },
1406
- {
1407
- code: "en-PW",
1408
- name: "English (Palau) (en-PW)"
1409
- },
1410
- {
1411
- code: "en-PG",
1412
- name: "English (Papua New Guinea) (en-PG)"
1413
- },
1414
- {
1415
- code: "en-PH",
1416
- name: "English (Philippines) (en-PH)"
1417
- },
1418
- {
1419
- code: "en-PN",
1420
- name: "English (Pitcairn Islands) (en-PN)"
1421
- },
1422
- {
1423
- code: "en-PR",
1424
- name: "English (Puerto Rico) (en-PR)"
1425
- },
1426
- {
1427
- code: "en-RW",
1428
- name: "English (Rwanda) (en-RW)"
1429
- },
1430
- {
1431
- code: "en-WS",
1432
- name: "English (Samoa) (en-WS)"
1433
- },
1434
- {
1435
- code: "en-SA",
1436
- name: "English (Saudi Arabia) (en-SA)"
1437
- },
1438
- {
1439
- code: "en-SC",
1440
- name: "English (Seychelles) (en-SC)"
1441
- },
1442
- {
1443
- code: "en-SL",
1444
- name: "English (Sierra Leone) (en-SL)"
1445
- },
1446
- {
1447
- code: "en-SG",
1448
- name: "English (Singapore) (en-SG)"
1449
- },
1450
- {
1451
- code: "en-SX",
1452
- name: "English (Sint Maarten) (en-SX)"
1453
- },
1454
- {
1455
- code: "en-SI",
1456
- name: "English (Slovenia) (en-SI)"
1457
- },
1458
- {
1459
- code: "en-SB",
1460
- name: "English (Solomon Islands) (en-SB)"
1461
- },
1462
- {
1463
- code: "en-SS",
1464
- name: "English (South Sudan) (en-SS)"
1465
- },
1466
- {
1467
- code: "en-SH",
1468
- name: "English (St Helena) (en-SH)"
1469
- },
1470
- {
1471
- code: "en-KN",
1472
- name: "English (St Kitts & Nevis) (en-KN)"
1473
- },
1474
- {
1475
- code: "en-LC",
1476
- name: "English (St Lucia) (en-LC)"
1477
- },
1478
- {
1479
- code: "svc",
1480
- name: "Vincentian Creole English"
1481
- },
1482
- {
1483
- code: "vic",
1484
- name: "Virgin Islands Creole English"
1485
- },
1486
- {
1487
- code: "en-SD",
1488
- name: "English (Sudan) (en-SD)"
1489
- },
1490
- {
1491
- code: "en-SZ",
1492
- name: "English (Swaziland) (en-SZ)"
1493
- },
1494
- {
1495
- code: "en-SE",
1496
- name: "English (Sweden) (en-SE)"
1497
- },
1498
- {
1499
- code: "en-CH",
1500
- name: "English (Switzerland) (en-CH)"
1501
- },
1502
- {
1503
- code: "en-TZ",
1504
- name: "English (Tanzania) (en-TZ)"
1505
- },
1506
- {
1507
- code: "en-TK",
1508
- name: "English (Tokelau) (en-TK)"
1509
- },
1510
- {
1511
- code: "en-TO",
1512
- name: "English (Tonga) (en-TO)"
1513
- },
1514
- {
1515
- code: "en-TT",
1516
- name: "English (Trinidad and Tobago) (en-TT)"
1517
- },
1518
- {
1519
- code: "en-TV",
1520
- name: "English (Tuvalu) (en-TV)"
1521
- },
1522
- {
1523
- code: "en-ZA",
1524
- name: "English (South Africa) (en-ZA)"
1525
- },
1526
- {
1527
- code: "en-AE",
1528
- name: "English (U.A.E.) (en-AE)"
1529
- },
1530
- {
1531
- code: "en-UM",
1532
- name: "English (U.S. Minor Outlying Islands) (en-UM)"
1533
- },
1534
- {
1535
- code: "en-VI",
1536
- name: "English (U.S. Virgin Islands) (en-VI)"
1537
- },
1538
- {
1539
- code: "en-US-POSIX",
1540
- name: "English (U.S., Computer) (en-US-POSIX)"
1541
- },
1542
- {
1543
- code: "en-UG",
1544
- name: "English (Uganda) (en-UG)"
1545
- },
1546
- {
1547
- code: "en-GB",
1548
- name: "English (United Kingdom) (en-GB)"
1549
- },
1550
- {
1551
- code: "en-US",
1552
- name: "English (United States) (en-US)"
1553
- },
1554
- {
1555
- code: "en-VU",
1556
- name: "English (Vanuatu) (en-VU)"
1557
- },
1558
- {
1559
- code: "en-ZM",
1560
- name: "English (Zambia) (en-ZM)"
1561
- },
1562
- {
1563
- code: "en-ZW",
1564
- name: "English (Zimbabwe) (en-ZW)"
1565
- },
1566
- {
1567
- code: "eo",
1568
- name: "Esperanto (eo)"
1569
- },
1570
- {
1571
- code: "et",
1572
- name: "Estonian (et)"
1573
- },
1574
- {
1575
- code: "et-EE",
1576
- name: "Estonian (Estonia) (et-EE)"
1577
- },
1578
- {
1579
- code: "ee",
1580
- name: "Ewe (ee)"
1581
- },
1582
- {
1583
- code: "ee-GH",
1584
- name: "Ewe (Ghana) (ee-GH)"
1585
- },
1586
- {
1587
- code: "ee-TG",
1588
- name: "Ewe (Togo) (ee-TG)"
1589
- },
1590
- {
1591
- code: "ewo",
1592
- name: "Ewondo (ewo)"
1593
- },
1594
- {
1595
- code: "ewo-CM",
1596
- name: "Ewondo (Cameroon) (ewo-CM)"
1597
- },
1598
- {
1599
- code: "fo",
1600
- name: "Faroese (fo)"
1601
- },
1602
- {
1603
- code: "fo-FO",
1604
- name: "Faroese (Faroe Islands) (fo-FO)"
1605
- },
1606
- {
1607
- code: "fil",
1608
- name: "Filipino (fil)"
1609
- },
1610
- {
1611
- code: "fil-PH",
1612
- name: "Filipino (Philippines) (fil-PH)"
1613
- },
1614
- {
1615
- code: "fi",
1616
- name: "Finnish (fi)"
1617
- },
1618
- {
1619
- code: "fi-FI",
1620
- name: "Finnish (Finland) (fi-FI)"
1621
- },
1622
- {
1623
- code: "fr",
1624
- name: "French (fr)"
1625
- },
1626
- {
1627
- code: "fr-BE",
1628
- name: "French (Belgium) (fr-BE)"
1629
- },
1630
- {
1631
- code: "fr-BJ",
1632
- name: "French (Benin) (fr-BJ)"
1633
- },
1634
- {
1635
- code: "fr-BF",
1636
- name: "French (Burkina Faso) (fr-BF)"
1637
- },
1638
- {
1639
- code: "fr-BI",
1640
- name: "French (Burundi) (fr-BI)"
1641
- },
1642
- {
1643
- code: "fr-CM",
1644
- name: "French (Cameroon) (fr-CM)"
1645
- },
1646
- {
1647
- code: "fr-CA",
1648
- name: "French (Canada) (fr-CA)"
1649
- },
1650
- {
1651
- code: "fr-CF",
1652
- name: "French (Central African Republic) (fr-CF)"
1653
- },
1654
- {
1655
- code: "fr-TD",
1656
- name: "French (Chad) (fr-TD)"
1657
- },
1658
- {
1659
- code: "fr-KM",
1660
- name: "French (Comoros) (fr-KM)"
1661
- },
1662
- {
1663
- code: "fr-CG",
1664
- name: "French (Congo - Brazzaville) (fr-CG)"
1665
- },
1666
- {
1667
- code: "fr-CD",
1668
- name: "French (Congo - Kinshasa) (fr-CD)"
1669
- },
1670
- {
1671
- code: "fr-CI",
1672
- name: "French (Côte d’Ivoire) (fr-CI)"
1673
- },
1674
- {
1675
- code: "fr-DJ",
1676
- name: "French (Djibouti) (fr-DJ)"
1677
- },
1678
- {
1679
- code: "fr-GQ",
1680
- name: "French (Equatorial Guinea) (fr-GQ)"
1681
- },
1682
- {
1683
- code: "fr-FR",
1684
- name: "French (France) (fr-FR)"
1685
- },
1686
- {
1687
- code: "fr-GF",
1688
- name: "French (French Guiana) (fr-GF)"
1689
- },
1690
- {
1691
- code: "fr-GA",
1692
- name: "French (Gabon) (fr-GA)"
1693
- },
1694
- {
1695
- code: "fr-GP",
1696
- name: "French (Guadeloupe) (fr-GP)"
1697
- },
1698
- {
1699
- code: "fr-GN",
1700
- name: "French (Guinea) (fr-GN)"
1701
- },
1702
- {
1703
- code: "fr-LU",
1704
- name: "French (Luxembourg) (fr-LU)"
1705
- },
1706
- {
1707
- code: "fr-MG",
1708
- name: "French (Madagascar) (fr-MG)"
1709
- },
1710
- {
1711
- code: "fr-ML",
1712
- name: "French (Mali) (fr-ML)"
1713
- },
1714
- {
1715
- code: "fr-MQ",
1716
- name: "French (Martinique) (fr-MQ)"
1717
- },
1718
- {
1719
- code: "fr-YT",
1720
- name: "French (Mayotte) (fr-YT)"
1721
- },
1722
- {
1723
- code: "fr-MC",
1724
- name: "French (Monaco) (fr-MC)"
1725
- },
1726
- {
1727
- code: "fr-NE",
1728
- name: "French (Niger) (fr-NE)"
1729
- },
1730
- {
1731
- code: "fr-RW",
1732
- name: "French (Rwanda) (fr-RW)"
1733
- },
1734
- {
1735
- code: "fr-RE",
1736
- name: "French (Réunion) (fr-RE)"
1737
- },
1738
- {
1739
- code: "fr-BL",
1740
- name: "French (Saint Barthélemy) (fr-BL)"
1741
- },
1742
- {
1743
- code: "fr-MF",
1744
- name: "French (Saint Martin) (fr-MF)"
1745
- },
1746
- {
1747
- code: "fr-MU",
1748
- name: "French (Mauritius) (fr-MU)"
1749
- },
1750
- {
1751
- code: "fr-SN",
1752
- name: "French (Senegal) (fr-SN)"
1753
- },
1754
- {
1755
- code: "fr-CH",
1756
- name: "French (Switzerland) (fr-CH)"
1757
- },
1758
- {
1759
- code: "fr-TG",
1760
- name: "French (Togo) (fr-TG)"
1761
- },
1762
- {
1763
- code: "ff",
1764
- name: "Fulah (ff)"
1765
- },
1766
- {
1767
- code: "ff-SN",
1768
- name: "Fulah (Senegal) (ff-SN)"
1769
- },
1770
- {
1771
- code: "gl",
1772
- name: "Galician (gl)"
1773
- },
1774
- {
1775
- code: "gl-ES",
1776
- name: "Galician (Spain) (gl-ES)"
1777
- },
1778
- {
1779
- code: "lao",
1780
- name: "Laotian (Laos) (lao)"
1781
- },
1782
- {
1783
- code: "lg",
1784
- name: "Ganda (lg)"
1785
- },
1786
- {
1787
- code: "lg-UG",
1788
- name: "Ganda (Uganda) (lg-UG)"
1789
- },
1790
- {
1791
- code: "ka",
1792
- name: "Georgian (ka)"
1793
- },
1794
- {
1795
- code: "ka-GE",
1796
- name: "Georgian (Georgia) (ka-GE)"
1797
- },
1798
- {
1799
- code: "de",
1800
- name: "German (de)"
1801
- },
1802
- {
1803
- code: "de-AT",
1804
- name: "German (Austria) (de-AT)"
1805
- },
1806
- {
1807
- code: "de-BE",
1808
- name: "German (Belgium) (de-BE)"
1809
- },
1810
- {
1811
- code: "de-DE",
1812
- name: "German (Germany) (de-DE)"
1813
- },
1814
- {
1815
- code: "de-LI",
1816
- name: "German (Liechtenstein) (de-LI)"
1817
- },
1818
- {
1819
- code: "de-LU",
1820
- name: "German (Luxembourg) (de-LU)"
1821
- },
1822
- {
1823
- code: "de-CH",
1824
- name: "German (Switzerland) (de-CH)"
1825
- },
1826
- {
1827
- code: "el",
1828
- name: "Greek (el)"
1829
- },
1830
- {
1831
- code: "el-CY",
1832
- name: "Greek (Cyprus) (el-CY)"
1833
- },
1834
- {
1835
- code: "el-GR",
1836
- name: "Greek (Greece) (el-GR)"
1837
- },
1838
- {
1839
- code: "gu",
1840
- name: "Gujarati (gu)"
1841
- },
1842
- {
1843
- code: "gu-IN",
1844
- name: "Gujarati (India) (gu-IN)"
1845
- },
1846
- {
1847
- code: "guz",
1848
- name: "Gusii (guz)"
1849
- },
1850
- {
1851
- code: "guz-KE",
1852
- name: "Gusii (Kenya) (guz-KE)"
1853
- },
1854
- {
1855
- code: "ha",
1856
- name: "Hausa (ha)"
1857
- },
1858
- {
1859
- code: "ha-Latn",
1860
- name: "Hausa (Latin) (ha-Latn)"
1861
- },
1862
- {
1863
- code: "ha-Latn-GH",
1864
- name: "Hausa (Latin, Ghana) (ha-Latn-GH)"
1865
- },
1866
- {
1867
- code: "ha-Latn-NE",
1868
- name: "Hausa (Latin, Niger) (ha-Latn-NE)"
1869
- },
1870
- {
1871
- code: "ha-Latn-NG",
1872
- name: "Hausa (Latin, Nigeria) (ha-Latn-NG)"
1873
- },
1874
- {
1875
- code: "haw",
1876
- name: "Hawaiian (haw)"
1877
- },
1878
- {
1879
- code: "haw-US",
1880
- name: "Hawaiian (United States) (haw-US)"
1881
- },
1882
- {
1883
- code: "he",
1884
- name: "Hebrew (he)"
1885
- },
1886
- {
1887
- code: "he-IL",
1888
- name: "Hebrew (Israel) (he-IL)"
1889
- },
1890
- {
1891
- code: "hi",
1892
- name: "Hindi (hi)"
1893
- },
1894
- {
1895
- code: "hi-IN",
1896
- name: "Hindi (India) (hi-IN)"
1897
- },
1898
- {
1899
- code: "hu",
1900
- name: "Hungarian (hu)"
1901
- },
1902
- {
1903
- code: "hu-HU",
1904
- name: "Hungarian (Hungary) (hu-HU)"
1905
- },
1906
- {
1907
- code: "is",
1908
- name: "Icelandic (is)"
1909
- },
1910
- {
1911
- code: "is-IS",
1912
- name: "Icelandic (Iceland) (is-IS)"
1913
- },
1914
- {
1915
- code: "ig",
1916
- name: "Igbo (ig)"
1917
- },
1918
- {
1919
- code: "ig-NG",
1920
- name: "Igbo (Nigeria) (ig-NG)"
1921
- },
1922
- {
1923
- code: "smn",
1924
- name: "Inari Sami"
1925
- },
1926
- {
1927
- code: "smn-FI",
1928
- name: "Inari Sami (Finland)"
1929
- },
1930
- {
1931
- code: "id",
1932
- name: "Indonesian (id)"
1933
- },
1934
- {
1935
- code: "id-ID",
1936
- name: "Indonesian (Indonesia) (id-ID)"
1937
- },
1938
- {
1939
- code: "ga",
1940
- name: "Irish (ga)"
1941
- },
1942
- {
1943
- code: "ga-IE",
1944
- name: "Irish (Ireland) (ga-IE)"
1945
- },
1946
- {
1947
- code: "it",
1948
- name: "Italian (it)"
1949
- },
1950
- {
1951
- code: "it-IT",
1952
- name: "Italian (Italy) (it-IT)"
1953
- },
1954
- {
1955
- code: "it-CH",
1956
- name: "Italian (Switzerland) (it-CH)"
1957
- },
1958
- {
1959
- code: "ja",
1960
- name: "Japanese (ja)"
1961
- },
1962
- {
1963
- code: "ja-JP",
1964
- name: "Japanese (Japan) (ja-JP)"
1965
- },
1966
- {
1967
- code: "dyo",
1968
- name: "Jola-Fonyi (dyo)"
1969
- },
1970
- {
1971
- code: "dyo-SN",
1972
- name: "Jola-Fonyi (Senegal) (dyo-SN)"
1973
- },
1974
- {
1975
- code: "kea",
1976
- name: "Kabuverdianu (kea)"
1977
- },
1978
- {
1979
- code: "kea-CV",
1980
- name: "Kabuverdianu (Cape Verde) (kea-CV)"
1981
- },
1982
- {
1983
- code: "kab",
1984
- name: "Kabyle (kab)"
1985
- },
1986
- {
1987
- code: "kab-DZ",
1988
- name: "Kabyle (Algeria) (kab-DZ)"
1989
- },
1990
- {
1991
- code: "kl",
1992
- name: "Kalaallisut (kl)"
1993
- },
1994
- {
1995
- code: "kl-GL",
1996
- name: "Kalaallisut (Greenland) (kl-GL)"
1997
- },
1998
- {
1999
- code: "kln",
2000
- name: "Kalenjin (kln)"
2001
- },
2002
- {
2003
- code: "kln-KE",
2004
- name: "Kalenjin (Kenya) (kln-KE)"
2005
- },
2006
- {
2007
- code: "kam",
2008
- name: "Kamba (kam)"
2009
- },
2010
- {
2011
- code: "kam-KE",
2012
- name: "Kamba (Kenya) (kam-KE)"
2013
- },
2014
- {
2015
- code: "kn",
2016
- name: "Kannada (kn)"
2017
- },
2018
- {
2019
- code: "kn-IN",
2020
- name: "Kannada (India) (kn-IN)"
2021
- },
2022
- {
2023
- code: "kaa",
2024
- name: "Kara-Kalpak (kaa)"
2025
- },
2026
- {
2027
- code: "kk",
2028
- name: "Kazakh (kk)"
2029
- },
2030
- {
2031
- code: "kk-Cyrl",
2032
- name: "Kazakh (Cyrillic) (kk-Cyrl)"
2033
- },
2034
- {
2035
- code: "kk-Cyrl-KZ",
2036
- name: "Kazakh (Cyrillic, Kazakhstan) (kk-Cyrl-KZ)"
2037
- },
2038
- {
2039
- code: "km",
2040
- name: "Khmer (km)"
2041
- },
2042
- {
2043
- code: "km-KH",
2044
- name: "Khmer (Cambodia) (km-KH)"
2045
- },
2046
- {
2047
- code: "ki",
2048
- name: "Kikuyu (ki)"
2049
- },
2050
- {
2051
- code: "ki-KE",
2052
- name: "Kikuyu (Kenya) (ki-KE)"
2053
- },
2054
- {
2055
- code: "rw",
2056
- name: "Kinyarwanda (rw)"
2057
- },
2058
- {
2059
- code: "rw-RW",
2060
- name: "Kinyarwanda (Rwanda) (rw-RW)"
2061
- },
2062
- {
2063
- code: "kok",
2064
- name: "Konkani (kok)"
2065
- },
2066
- {
2067
- code: "kok-IN",
2068
- name: "Konkani (India) (kok-IN)"
2069
- },
2070
- {
2071
- code: "ko",
2072
- name: "Korean (ko)"
2073
- },
2074
- {
2075
- code: "ko-KR",
2076
- name: "Korean (South Korea) (ko-KR)"
2077
- },
2078
- {
2079
- code: "khq",
2080
- name: "Koyra Chiini (khq)"
2081
- },
2082
- {
2083
- code: "khq-ML",
2084
- name: "Koyra Chiini (Mali) (khq-ML)"
2085
- },
2086
- {
2087
- code: "ses",
2088
- name: "Koyraboro Senni (ses)"
2089
- },
2090
- {
2091
- code: "ses-ML",
2092
- name: "Koyraboro Senni (Mali) (ses-ML)"
2093
- },
2094
- {
2095
- code: "nmg",
2096
- name: "Kwasio (nmg)"
2097
- },
2098
- {
2099
- code: "nmg-CM",
2100
- name: "Kwasio (Cameroon) (nmg-CM)"
2101
- },
2102
- {
2103
- code: "ky",
2104
- name: "Kyrgyz (ky)"
2105
- },
2106
- {
2107
- code: "lag",
2108
- name: "Langi (lag)"
2109
- },
2110
- {
2111
- code: "lag-TZ",
2112
- name: "Langi (Tanzania) (lag-TZ)"
2113
- },
2114
- {
2115
- code: "lv",
2116
- name: "Latvian (lv)"
2117
- },
2118
- {
2119
- code: "lv-LV",
2120
- name: "Latvian (Latvia) (lv-LV)"
2121
- },
2122
- {
2123
- code: "lir",
2124
- name: "Liberian English"
2125
- },
2126
- {
2127
- code: "ln",
2128
- name: "Lingala (ln)"
2129
- },
2130
- {
2131
- code: "ln-CG",
2132
- name: "Lingala (Congo - Brazzaville) (ln-CG)"
2133
- },
2134
- {
2135
- code: "ln-CD",
2136
- name: "Lingala (Congo - Kinshasa) (ln-CD)"
2137
- },
2138
- {
2139
- code: "lt",
2140
- name: "Lithuanian (lt)"
2141
- },
2142
- {
2143
- code: "lt-LT",
2144
- name: "Lithuanian (Lithuania) (lt-LT)"
2145
- },
2146
- {
2147
- code: "lu",
2148
- name: "Luba-Katanga (lu)"
2149
- },
2150
- {
2151
- code: "lu-CD",
2152
- name: "Luba-Katanga (Congo - Kinshasa) (lu-CD)"
2153
- },
2154
- {
2155
- code: "luo",
2156
- name: "Luo (luo)"
2157
- },
2158
- {
2159
- code: "luo-KE",
2160
- name: "Luo (Kenya) (luo-KE)"
2161
- },
2162
- {
2163
- code: "luy",
2164
- name: "Luyia (luy)"
2165
- },
2166
- {
2167
- code: "luy-KE",
2168
- name: "Luyia (Kenya) (luy-KE)"
2169
- },
2170
- {
2171
- code: "mk",
2172
- name: "Macedonian (mk)"
2173
- },
2174
- {
2175
- code: "mk-MK",
2176
- name: "Macedonian (Macedonia) (mk-MK)"
2177
- },
2178
- {
2179
- code: "jmc",
2180
- name: "Machame (jmc)"
2181
- },
2182
- {
2183
- code: "jmc-TZ",
2184
- name: "Machame (Tanzania) (jmc-TZ)"
2185
- },
2186
- {
2187
- code: "mgh",
2188
- name: "Makhuwa-Meetto (mgh)"
2189
- },
2190
- {
2191
- code: "mgh-MZ",
2192
- name: "Makhuwa-Meetto (Mozambique) (mgh-MZ)"
2193
- },
2194
- {
2195
- code: "kde",
2196
- name: "Makonde (kde)"
2197
- },
2198
- {
2199
- code: "kde-TZ",
2200
- name: "Makonde (Tanzania) (kde-TZ)"
2201
- },
2202
- {
2203
- code: "mg",
2204
- name: "Malagasy (mg)"
2205
- },
2206
- {
2207
- code: "mg-MG",
2208
- name: "Malagasy (Madagascar) (mg-MG)"
2209
- },
2210
- {
2211
- code: "ms",
2212
- name: "Malay (ms)"
2213
- },
2214
- {
2215
- code: "ms-BN",
2216
- name: "Malay (Brunei) (ms-BN)"
2217
- },
2218
- {
2219
- code: "ms-MY",
2220
- name: "Malay (Malaysia) (ms-MY)"
2221
- },
2222
- {
2223
- code: "ml",
2224
- name: "Malayalam (ml)"
2225
- },
2226
- {
2227
- code: "ml-IN",
2228
- name: "Malayalam (India) (ml-IN)"
2229
- },
2230
- {
2231
- code: "mt",
2232
- name: "Maltese (mt)"
2233
- },
2234
- {
2235
- code: "mt-MT",
2236
- name: "Maltese (Malta) (mt-MT)"
2237
- },
2238
- {
2239
- code: "gv",
2240
- name: "Manx (gv)"
2241
- },
2242
- {
2243
- code: "gv-GB",
2244
- name: "Manx (United Kingdom) (gv-GB)"
2245
- },
2246
- {
2247
- code: "mr",
2248
- name: "Marathi (mr)"
2249
- },
2250
- {
2251
- code: "mr-IN",
2252
- name: "Marathi (India) (mr-IN)"
2253
- },
2254
- {
2255
- code: "mas",
2256
- name: "Masai (mas)"
2257
- },
2258
- {
2259
- code: "mas-KE",
2260
- name: "Masai (Kenya) (mas-KE)"
2261
- },
2262
- {
2263
- code: "mas-TZ",
2264
- name: "Masai (Tanzania) (mas-TZ)"
2265
- },
2266
- {
2267
- code: "mer",
2268
- name: "Meru (mer)"
2269
- },
2270
- {
2271
- code: "mer-KE",
2272
- name: "Meru (Kenya) (mer-KE)"
2273
- },
2274
- {
2275
- code: "mn",
2276
- name: "Mongolian (mn)"
2277
- },
2278
- {
2279
- code: "mfe",
2280
- name: "Morisyen (mfe)"
2281
- },
2282
- {
2283
- code: "mfe-MU",
2284
- name: "Morisyen (Mauritius) (mfe-MU)"
2285
- },
2286
- {
2287
- code: "mua",
2288
- name: "Mundang (mua)"
2289
- },
2290
- {
2291
- code: "mua-CM",
2292
- name: "Mundang (Cameroon) (mua-CM)"
2293
- },
2294
- {
2295
- code: "naq",
2296
- name: "Nama (naq)"
2297
- },
2298
- {
2299
- code: "naq-NA",
2300
- name: "Nama (Namibia) (naq-NA)"
2301
- },
2302
- {
2303
- code: "ne",
2304
- name: "Nepali (ne)"
2305
- },
2306
- {
2307
- code: "ne-IN",
2308
- name: "Nepali (India) (ne-IN)"
2309
- },
2310
- {
2311
- code: "ne-NP",
2312
- name: "Nepali (Nepal) (ne-NP)"
2313
- },
2314
- {
2315
- code: "se",
2316
- name: "Northern Sami"
2317
- },
2318
- {
2319
- code: "se-FI",
2320
- name: "Northern Sami (Finland)"
2321
- },
2322
- {
2323
- code: "se-NO",
2324
- name: "Northern Sami (Norway)"
2325
- },
2326
- {
2327
- code: "se-SE",
2328
- name: "Northern Sami (Sweden)"
2329
- },
2330
- {
2331
- code: "nd",
2332
- name: "North Ndebele (nd)"
2333
- },
2334
- {
2335
- code: "nd-ZW",
2336
- name: "North Ndebele (Zimbabwe) (nd-ZW)"
2337
- },
2338
- {
2339
- code: "nb",
2340
- name: "Norwegian Bokmål (nb)"
2341
- },
2342
- {
2343
- code: "nb-NO",
2344
- name: "Norwegian Bokmål (Norway) (nb-NO)"
2345
- },
2346
- {
2347
- code: "nn",
2348
- name: "Norwegian Nynorsk (nn)"
2349
- },
2350
- {
2351
- code: "nn-NO",
2352
- name: "Norwegian Nynorsk (Norway) (nn-NO)"
2353
- },
2354
- {
2355
- code: "nus",
2356
- name: "Nuer (nus)"
2357
- },
2358
- {
2359
- code: "nus-SD",
2360
- name: "Nuer (Sudan) (nus-SD)"
2361
- },
2362
- {
2363
- code: "nyn",
2364
- name: "Nyankole (nyn)"
2365
- },
2366
- {
2367
- code: "nyn-UG",
2368
- name: "Nyankole (Uganda) (nyn-UG)"
2369
- },
2370
- {
2371
- code: "or",
2372
- name: "Oriya (or)"
2373
- },
2374
- {
2375
- code: "or-IN",
2376
- name: "Oriya (India) (or-IN)"
2377
- },
2378
- {
2379
- code: "om",
2380
- name: "Oromo (om)"
2381
- },
2382
- {
2383
- code: "om-ET",
2384
- name: "Oromo (Ethiopia) (om-ET)"
2385
- },
2386
- {
2387
- code: "om-KE",
2388
- name: "Oromo (Kenya) (om-KE)"
2389
- },
2390
- {
2391
- code: "ps",
2392
- name: "Pashto (ps)"
2393
- },
2394
- {
2395
- code: "ps-AF",
2396
- name: "Pashto (Afghanistan) (ps-AF)"
2397
- },
2398
- {
2399
- code: "fa",
2400
- name: "Persian (fa)"
2401
- },
2402
- {
2403
- code: "fa-AF",
2404
- name: "Persian (Afghanistan) (fa-AF)"
2405
- },
2406
- {
2407
- code: "fa-IR",
2408
- name: "Persian (Iran) (fa-IR)"
2409
- },
2410
- {
2411
- code: "pl",
2412
- name: "Polish (pl)"
2413
- },
2414
- {
2415
- code: "pl-PL",
2416
- name: "Polish (Poland) (pl-PL)"
2417
- },
2418
- {
2419
- code: "pt",
2420
- name: "Portuguese (pt)"
2421
- },
2422
- {
2423
- code: "pt-AO",
2424
- name: "Portuguese (Angola) (pt-AO)"
2425
- },
2426
- {
2427
- code: "pt-BR",
2428
- name: "Portuguese (Brazil) (pt-BR)"
2429
- },
2430
- {
2431
- code: "pt-GW",
2432
- name: "Portuguese (Guinea-Bissau) (pt-GW)"
2433
- },
2434
- {
2435
- code: "pt-MZ",
2436
- name: "Portuguese (Mozambique) (pt-MZ)"
2437
- },
2438
- {
2439
- code: "pt-PT",
2440
- name: "Portuguese (Portugal) (pt-PT)"
2441
- },
2442
- {
2443
- code: "pt-ST",
2444
- name: "Portuguese (São Tomé and Príncipe) (pt-ST)"
2445
- },
2446
- {
2447
- code: "pa",
2448
- name: "Punjabi (pa)"
2449
- },
2450
- {
2451
- code: "pa-Arab",
2452
- name: "Punjabi (Arabic) (pa-Arab)"
2453
- },
2454
- {
2455
- code: "pa-Arab-PK",
2456
- name: "Punjabi (Arabic, Pakistan) (pa-Arab-PK)"
2457
- },
2458
- {
2459
- code: "pa-Guru",
2460
- name: "Punjabi (Gurmukhi) (pa-Guru)"
2461
- },
2462
- {
2463
- code: "pa-Guru-IN",
2464
- name: "Punjabi (Gurmukhi, India) (pa-Guru-IN)"
2465
- },
2466
- {
2467
- code: "ro",
2468
- name: "Romanian (ro)"
2469
- },
2470
- {
2471
- code: "ro-MD",
2472
- name: "Romanian (Moldova) (ro-MD)"
2473
- },
2474
- {
2475
- code: "ro-RO",
2476
- name: "Romanian (Romania) (ro-RO)"
2477
- },
2478
- {
2479
- code: "rm",
2480
- name: "Romansh (rm)"
2481
- },
2482
- {
2483
- code: "rm-CH",
2484
- name: "Romansh (Switzerland) (rm-CH)"
2485
- },
2486
- {
2487
- code: "rof",
2488
- name: "Rombo (rof)"
2489
- },
2490
- {
2491
- code: "rof-TZ",
2492
- name: "Rombo (Tanzania) (rof-TZ)"
2493
- },
2494
- {
2495
- code: "rn",
2496
- name: "Rundi (rn)"
2497
- },
2498
- {
2499
- code: "rn-BI",
2500
- name: "Rundi (Burundi) (rn-BI)"
2501
- },
2502
- {
2503
- code: "ru",
2504
- name: "Russian (ru)"
2505
- },
2506
- {
2507
- code: "ru-MD",
2508
- name: "Russian (Moldova) (ru-MD)"
2509
- },
2510
- {
2511
- code: "ru-RU",
2512
- name: "Russian (Russia) (ru-RU)"
2513
- },
2514
- {
2515
- code: "ru-UA",
2516
- name: "Russian (Ukraine) (ru-UA)"
2517
- },
2518
- {
2519
- code: "rwk",
2520
- name: "Rwa (rwk)"
2521
- },
2522
- {
2523
- code: "rwk-TZ",
2524
- name: "Rwa (Tanzania) (rwk-TZ)"
2525
- },
2526
- {
2527
- code: "saq",
2528
- name: "Samburu (saq)"
2529
- },
2530
- {
2531
- code: "saq-KE",
2532
- name: "Samburu (Kenya) (saq-KE)"
2533
- },
2534
- {
2535
- code: "sg",
2536
- name: "Sango (sg)"
2537
- },
2538
- {
2539
- code: "sg-CF",
2540
- name: "Sango (Central African Republic) (sg-CF)"
2541
- },
2542
- {
2543
- code: "sbp",
2544
- name: "Sangu (sbp)"
2545
- },
2546
- {
2547
- code: "sbp-TZ",
2548
- name: "Sangu (Tanzania) (sbp-TZ)"
2549
- },
2550
- {
2551
- code: "sa",
2552
- name: "Sanskrit (sa)"
2553
- },
2554
- {
2555
- code: "gd",
2556
- name: "Scottish Gaelic (gd)"
2557
- },
2558
- {
2559
- code: "gd-GB",
2560
- name: "Scottish Gaelic (United Kingdom)"
2561
- },
2562
- {
2563
- code: "seh",
2564
- name: "Sena (seh)"
2565
- },
2566
- {
2567
- code: "seh-MZ",
2568
- name: "Sena (Mozambique) (seh-MZ)"
2569
- },
2570
- {
2571
- code: "sr",
2572
- name: "Serbian (sr)"
2573
- },
2574
- {
2575
- code: "sr-Cyrl",
2576
- name: "Serbian (Cyrillic) (sr-Cyrl)"
2577
- },
2578
- {
2579
- code: "sr-Cyrl-BA",
2580
- name: "Serbian (Cyrillic, Bosnia and Herzegovina)(sr-Cyrl-BA) "
2581
- },
2582
- {
2583
- code: "sr-Cyrl-ME",
2584
- name: "Serbian (Cyrillic, Montenegro) (sr-Cyrl-ME)"
2585
- },
2586
- {
2587
- code: "sr-Cyrl-RS",
2588
- name: "Serbian (Cyrillic, Serbia) (sr-Cyrl-RS)"
2589
- },
2590
- {
2591
- code: "sr-Latn",
2592
- name: "Serbian (Latin) (sr-Latn)"
2593
- },
2594
- {
2595
- code: "sr-Latn-BA",
2596
- name: "Serbian (Latin, Bosnia and Herzegovina) (sr-Latn-BA) "
2597
- },
2598
- {
2599
- code: "sr-Latn-ME",
2600
- name: "Serbian (Latin, Montenegro) (sr-Latn-ME)"
2601
- },
2602
- {
2603
- code: "sr-Latn-RS",
2604
- name: "Serbian (Latin, Serbia) (sr-Latn-RS)"
2605
- },
2606
- {
2607
- code: "ksb",
2608
- name: "Shambala (ksb)"
2609
- },
2610
- {
2611
- code: "ksb-TZ",
2612
- name: "Shambala (Tanzania) (ksb-TZ)"
2613
- },
2614
- {
2615
- code: "sn",
2616
- name: "Shona (sn)"
2617
- },
2618
- {
2619
- code: "sn-ZW",
2620
- name: "Shona (Zimbabwe) (sn-ZW)"
2621
- },
2622
- {
2623
- code: "ii",
2624
- name: "Sichuan Yi (ii)"
2625
- },
2626
- {
2627
- code: "ii-CN",
2628
- name: "Sichuan Yi (China) (ii-CN)"
2629
- },
2630
- {
2631
- code: "si",
2632
- name: "Sinhala (si)"
2633
- },
2634
- {
2635
- code: "si-LK",
2636
- name: "Sinhala (Sri Lanka) (si-LK)"
2637
- },
2638
- {
2639
- code: "sk",
2640
- name: "Slovak (sk)"
2641
- },
2642
- {
2643
- code: "sk-SK",
2644
- name: "Slovak (Slovakia) (sk-SK)"
2645
- },
2646
- {
2647
- code: "sl",
2648
- name: "Slovenian (sl)"
2649
- },
2650
- {
2651
- code: "sl-SI",
2652
- name: "Slovenian (Slovenia) (sl-SI)"
2653
- },
2654
- {
2655
- code: "xog",
2656
- name: "Soga (xog)"
2657
- },
2658
- {
2659
- code: "xog-UG",
2660
- name: "Soga (Uganda) (xog-UG)"
2661
- },
2662
- {
2663
- code: "so",
2664
- name: "Somali (so)"
2665
- },
2666
- {
2667
- code: "so-DJ",
2668
- name: "Somali (Djibouti) (so-DJ)"
2669
- },
2670
- {
2671
- code: "so-ET",
2672
- name: "Somali (Ethiopia) (so-ET)"
2673
- },
2674
- {
2675
- code: "so-KE",
2676
- name: "Somali (Kenya) (so-KE)"
2677
- },
2678
- {
2679
- code: "so-SO",
2680
- name: "Somali (Somalia) (so-SO)"
2681
- },
2682
- {
2683
- code: "es",
2684
- name: "Spanish (es)"
2685
- },
2686
- {
2687
- code: "es-AR",
2688
- name: "Spanish (Argentina) (es-AR)"
2689
- },
2690
- {
2691
- code: "es-BO",
2692
- name: "Spanish (Bolivia) (es-BO)"
2693
- },
2694
- {
2695
- code: "es-CL",
2696
- name: "Spanish (Chile) (es-CL)"
2697
- },
2698
- {
2699
- code: "es-CO",
2700
- name: "Spanish (Colombia) (es-CO)"
2701
- },
2702
- {
2703
- code: "es-CR",
2704
- name: "Spanish (Costa Rica) (es-CR)"
2705
- },
2706
- {
2707
- code: "es-DO",
2708
- name: "Spanish (Dominican Republic) (es-DO)"
2709
- },
2710
- {
2711
- code: "es-EC",
2712
- name: "Spanish (Ecuador) (es-EC)"
2713
- },
2714
- {
2715
- code: "es-SV",
2716
- name: "Spanish (El Salvador) (es-SV)"
2717
- },
2718
- {
2719
- code: "es-GQ",
2720
- name: "Spanish (Equatorial Guinea) (es-GQ)"
2721
- },
2722
- {
2723
- code: "es-GT",
2724
- name: "Spanish (Guatemala) (es-GT)"
2725
- },
2726
- {
2727
- code: "es-HN",
2728
- name: "Spanish (Honduras) (es-HN)"
2729
- },
2730
- {
2731
- code: "es-419",
2732
- name: "Spanish (Latin America) (es-419)"
2733
- },
2734
- {
2735
- code: "es-MX",
2736
- name: "Spanish (Mexico) (es-MX)"
2737
- },
2738
- {
2739
- code: "es-NI",
2740
- name: "Spanish (Nicaragua) (es-NI)"
2741
- },
2742
- {
2743
- code: "es-PA",
2744
- name: "Spanish (Panama) (es-PA)"
2745
- },
2746
- {
2747
- code: "es-PY",
2748
- name: "Spanish (Paraguay) (es-PY)"
2749
- },
2750
- {
2751
- code: "es-PE",
2752
- name: "Spanish (Peru) (es-PE)"
2753
- },
2754
- {
2755
- code: "es-PR",
2756
- name: "Spanish (Puerto Rico) (es-PR)"
2757
- },
2758
- {
2759
- code: "es-ES",
2760
- name: "Spanish (Spain) (es-ES)"
2761
- },
2762
- {
2763
- code: "es-US",
2764
- name: "Spanish (United States) (es-US)"
2765
- },
2766
- {
2767
- code: "es-UY",
2768
- name: "Spanish (Uruguay) (es-UY)"
2769
- },
2770
- {
2771
- code: "es-VE",
2772
- name: "Spanish (Venezuela) (es-VE)"
2773
- },
2774
- {
2775
- code: "sw",
2776
- name: "Swahili (sw)"
2777
- },
2778
- {
2779
- code: "sw-KE",
2780
- name: "Swahili (Kenya) (sw-KE)"
2781
- },
2782
- {
2783
- code: "sw-TZ",
2784
- name: "Swahili (Tanzania) (sw-TZ)"
2785
- },
2786
- {
2787
- code: "sv",
2788
- name: "Swedish (sv)"
2789
- },
2790
- {
2791
- code: "sv-FI",
2792
- name: "Swedish (Finland) (sv-FI)"
2793
- },
2794
- {
2795
- code: "sv-SE",
2796
- name: "Swedish (Sweden) (sv-SE)"
2797
- },
2798
- {
2799
- code: "gsw",
2800
- name: "Swiss German (gsw)"
2801
- },
2802
- {
2803
- code: "gsw-CH",
2804
- name: "Swiss German (Switzerland) (gsw-CH)"
2805
- },
2806
- {
2807
- code: "shi",
2808
- name: "Tachelhit (shi)"
2809
- },
2810
- {
2811
- code: "shi-Latn",
2812
- name: "Tachelhit (Latin) (shi-Latn)"
2813
- },
2814
- {
2815
- code: "shi-Latn-MA",
2816
- name: "Tachelhit (Latin, Morocco) (shi-Latn-MA)"
2817
- },
2818
- {
2819
- code: "shi-Tfng",
2820
- name: "Tachelhit (Tifinagh) (shi-Tfng)"
2821
- },
2822
- {
2823
- code: "shi-Tfng-MA",
2824
- name: "Tachelhit (Tifinagh, Morocco) (shi-Tfng-MA)"
2825
- },
2826
- {
2827
- code: "dav",
2828
- name: "Taita (dav)"
2829
- },
2830
- {
2831
- code: "dav-KE",
2832
- name: "Taita (Kenya) (dav-KE)"
2833
- },
2834
- {
2835
- code: "tg",
2836
- name: "Tajik (tg)"
2837
- },
2838
- {
2839
- code: "ta",
2840
- name: "Tamil (ta)"
2841
- },
2842
- {
2843
- code: "ta-IN",
2844
- name: "Tamil (India) (ta-IN)"
2845
- },
2846
- {
2847
- code: "ta-LK",
2848
- name: "Tamil (Sri Lanka) (ta-LK)"
2849
- },
2850
- {
2851
- code: "twq",
2852
- name: "Tasawaq (twq)"
2853
- },
2854
- {
2855
- code: "twq-NE",
2856
- name: "Tasawaq (Niger) (twq-NE)"
2857
- },
2858
- {
2859
- code: "mi",
2860
- name: "Te Reo Māori (mi)"
2861
- },
2862
- {
2863
- code: "te",
2864
- name: "Telugu (te)"
2865
- },
2866
- {
2867
- code: "te-IN",
2868
- name: "Telugu (India) (te-IN)"
2869
- },
2870
- {
2871
- code: "teo",
2872
- name: "Teso (teo)"
2873
- },
2874
- {
2875
- code: "teo-KE",
2876
- name: "Teso (Kenya) (teo-KE)"
2877
- },
2878
- {
2879
- code: "teo-UG",
2880
- name: "Teso (Uganda) (teo-UG)"
2881
- },
2882
- {
2883
- code: "th",
2884
- name: "Thai (th)"
2885
- },
2886
- {
2887
- code: "th-TH",
2888
- name: "Thai (Thailand) (th-TH)"
2889
- },
2890
- {
2891
- code: "bo",
2892
- name: "Tibetan (bo)"
2893
- },
2894
- {
2895
- code: "bo-CN",
2896
- name: "Tibetan (China) (bo-CN)"
2897
- },
2898
- {
2899
- code: "bo-IN",
2900
- name: "Tibetan (India) (bo-IN)"
2901
- },
2902
- {
2903
- code: "ti",
2904
- name: "Tigrinya (ti)"
2905
- },
2906
- {
2907
- code: "ti-ER",
2908
- name: "Tigrinya (Eritrea) (ti-ER)"
2909
- },
2910
- {
2911
- code: "ti-ET",
2912
- name: "Tigrinya (Ethiopia) (ti-ET)"
2913
- },
2914
- {
2915
- code: "to",
2916
- name: "Tongan (to)"
2917
- },
2918
- {
2919
- code: "to-TO",
2920
- name: "Tongan (Tonga) (to-TO)"
2921
- },
2922
- {
2923
- code: "tr",
2924
- name: "Turkish (tr)"
2925
- },
2926
- {
2927
- code: "tk",
2928
- name: "Turkmen (tk)"
2929
- },
2930
- {
2931
- code: "tr-TR",
2932
- name: "Turkish (Turkey) (tr-TR)"
2933
- },
2934
- {
2935
- code: "tch",
2936
- name: "Turks And Caicos Creole English"
2937
- },
2938
- {
2939
- code: "uk",
2940
- name: "Ukrainian (uk)"
2941
- },
2942
- {
2943
- code: "uk-UA",
2944
- name: "Ukrainian (Ukraine) (uk-UA)"
2945
- },
2946
- {
2947
- code: "ur",
2948
- name: "Urdu (ur)"
2949
- },
2950
- {
2951
- code: "ur-IN",
2952
- name: "Urdu (India) (ur-IN)"
2953
- },
2954
- {
2955
- code: "ur-PK",
2956
- name: "Urdu (Pakistan) (ur-PK)"
2957
- },
2958
- {
2959
- code: "ug",
2960
- name: "Uyghur"
2961
- },
2962
- {
2963
- code: "ug-CN",
2964
- name: "Uyghur (China)"
2965
- },
2966
- {
2967
- code: "uz",
2968
- name: "Uzbek (uz)"
2969
- },
2970
- {
2971
- code: "uz-Arab",
2972
- name: "Uzbek (Arabic) (uz-Arab)"
2973
- },
2974
- {
2975
- code: "uz-Arab-AF",
2976
- name: "Uzbek (Arabic, Afghanistan) (uz-Arab-AF)"
2977
- },
2978
- {
2979
- code: "uz-Cyrl",
2980
- name: "Uzbek (Cyrillic) (uz-Cyrl)"
2981
- },
2982
- {
2983
- code: "uz-Cyrl-UZ",
2984
- name: "Uzbek (Cyrillic, Uzbekistan) (uz-Cyrl-UZ)"
2985
- },
2986
- {
2987
- code: "uz-Latn",
2988
- name: "Uzbek (Latin) (uz-Latn)"
2989
- },
2990
- {
2991
- code: "uz-Latn-UZ",
2992
- name: "Uzbek (Latin, Uzbekistan) (uz-Latn-UZ)"
2993
- },
2994
- {
2995
- code: "vai",
2996
- name: "Vai (vai)"
2997
- },
2998
- {
2999
- code: "vai-Latn",
3000
- name: "Vai (Latin) (vai-Latn)"
3001
- },
3002
- {
3003
- code: "vai-Latn-LR",
3004
- name: "Vai (Latin, Liberia) (vai-Latn-LR)"
3005
- },
3006
- {
3007
- code: "vai-Vaii",
3008
- name: "Vai (Vai) (vai-Vaii)"
3009
- },
3010
- {
3011
- code: "vai-Vaii-LR",
3012
- name: "Vai (Vai, Liberia) (vai-Vaii-LR)"
3013
- },
3014
- {
3015
- code: "val",
3016
- name: "Valencian (val)"
3017
- },
3018
- {
3019
- code: "val-ES",
3020
- name: "Valencian (Spain) (val-ES)"
3021
- },
3022
- {
3023
- code: "ca-ES-valencia",
3024
- name: "Valencian (Spain Catalan) (ca-ES-valencia)"
3025
- },
3026
- {
3027
- code: "vi",
3028
- name: "Vietnamese (vi)"
3029
- },
3030
- {
3031
- code: "vi-VN",
3032
- name: "Vietnamese (Vietnam) (vi-VN)"
3033
- },
3034
- {
3035
- code: "vun",
3036
- name: "Vunjo (vun)"
3037
- },
3038
- {
3039
- code: "vun-TZ",
3040
- name: "Vunjo (Tanzania) (vun-TZ)"
3041
- },
3042
- {
3043
- code: "cy",
3044
- name: "Welsh (cy)"
3045
- },
3046
- {
3047
- code: "cy-GB",
3048
- name: "Welsh (United Kingdom) (cy-GB)"
3049
- },
3050
- {
3051
- code: "wo",
3052
- name: "Wolof (wo)"
3053
- },
3054
- {
3055
- code: "xh",
3056
- name: "Xhosa (xh)"
3057
- },
3058
- {
3059
- code: "yav",
3060
- name: "Yangben (yav)"
3061
- },
3062
- {
3063
- code: "yav-CM",
3064
- name: "Yangben (Cameroon) (yav-CM)"
3065
- },
3066
- {
3067
- code: "yo",
3068
- name: "Yoruba (yo)"
3069
- },
3070
- {
3071
- code: "yo-NG",
3072
- name: "Yoruba (Nigeria) (yo-NG)"
3073
- },
3074
- {
3075
- code: "dje",
3076
- name: "Zarma (dje)"
3077
- },
3078
- {
3079
- code: "dje-NE",
3080
- name: "Zarma (Niger) (dje-NE)"
3081
- },
3082
- {
3083
- code: "zu",
3084
- name: "Zulu (zu)"
3085
- },
3086
- {
3087
- code: "zu-ZA",
3088
- name: "Zulu (South Africa) (zu-ZA)"
3089
- }
3090
- ];
3091
-
3092
- /**
3093
- * Returns the default locale based either on env var or english
3094
- * @returns {string}
3095
- */ const getInitLocale = ()=>{
3096
- const envLocaleCode = process.env.STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE;
3097
- if (envLocaleCode) {
3098
- const matchingLocale = isoLocales.find(({ code })=>code === envLocaleCode);
3099
- if (!matchingLocale) {
3100
- throw new Error('Unknown locale code provided in the environment variable STRAPI_PLUGIN_I18N_INIT_LOCALE_CODE');
3101
- }
3102
- return {
3103
- ...matchingLocale
3104
- };
3105
- }
3106
- return {
3107
- code: 'en',
3108
- name: 'English (en)'
3109
- };
3110
- };
3111
- const DEFAULT_LOCALE = getInitLocale();
3112
-
3113
- const find = (params = {})=>strapi.db.query('plugin::i18n.locale').findMany({
3114
- where: params
3115
- });
3116
- const findById = (id)=>strapi.db.query('plugin::i18n.locale').findOne({
3117
- where: {
3118
- id
3119
- }
3120
- });
3121
- const findByCode = (code)=>strapi.db.query('plugin::i18n.locale').findOne({
3122
- where: {
3123
- code
3124
- }
3125
- });
3126
- const count = (params = {})=>strapi.db.query('plugin::i18n.locale').count({
3127
- where: params
3128
- });
3129
- const create = async (locale)=>{
3130
- const result = await strapi.db.query('plugin::i18n.locale').create({
3131
- data: locale
3132
- });
3133
- getService('metrics').sendDidUpdateI18nLocalesEvent();
3134
- return result;
3135
- };
3136
- const update = async (params, updates)=>{
3137
- const result = await strapi.db.query('plugin::i18n.locale').update({
3138
- where: params,
3139
- data: updates
3140
- });
3141
- getService('metrics').sendDidUpdateI18nLocalesEvent();
3142
- return result;
3143
- };
3144
- const deleteFn = async ({ id })=>{
3145
- const localeToDelete = await findById(id);
3146
- if (localeToDelete) {
3147
- await deleteAllLocalizedEntriesFor({
3148
- locale: localeToDelete.code
3149
- });
3150
- const result = await strapi.db.query('plugin::i18n.locale').delete({
3151
- where: {
3152
- id
3153
- }
3154
- });
3155
- getService('metrics').sendDidUpdateI18nLocalesEvent();
3156
- return result;
3157
- }
3158
- return localeToDelete;
3159
- };
3160
- const setDefaultLocale = ({ code })=>getCoreStore().set({
3161
- key: 'default_locale',
3162
- value: code
3163
- });
3164
- const getDefaultLocale = ()=>getCoreStore().get({
3165
- key: 'default_locale'
3166
- });
3167
- const setIsDefault = async (locales)=>{
3168
- if (fp.isNil(locales)) {
3169
- return locales;
3170
- }
3171
- const actualDefault = await getDefaultLocale();
3172
- if (Array.isArray(locales)) {
3173
- return locales.map((locale)=>({
3174
- ...locale,
3175
- isDefault: actualDefault === locale.code
3176
- }));
3177
- }
3178
- // single locale
3179
- return {
3180
- ...locales,
3181
- isDefault: actualDefault === locales.code
3182
- };
3183
- };
3184
- const initDefaultLocale = async ()=>{
3185
- const existingLocalesNb = await strapi.db.query('plugin::i18n.locale').count();
3186
- if (existingLocalesNb === 0) {
3187
- await create(DEFAULT_LOCALE);
3188
- await setDefaultLocale({
3189
- code: DEFAULT_LOCALE.code
3190
- });
3191
- }
3192
- };
3193
- const deleteAllLocalizedEntriesFor = async ({ locale })=>{
3194
- const { isLocalizedContentType } = getService('content-types');
3195
- const localizedModels = Object.values(strapi.contentTypes).filter(isLocalizedContentType);
3196
- for (const model of localizedModels){
3197
- // FIXME: delete many content & their associations
3198
- await strapi.db.query(model.uid).deleteMany({
3199
- where: {
3200
- locale
3201
- }
3202
- });
3203
- }
3204
- };
3205
- const locales = ()=>({
3206
- find,
3207
- findById,
3208
- findByCode,
3209
- create,
3210
- update,
3211
- count,
3212
- setDefaultLocale,
3213
- getDefaultLocale,
3214
- setIsDefault,
3215
- delete: deleteFn,
3216
- initDefaultLocale
3217
- });
3218
-
3219
- const getIsoLocales = ()=>isoLocales;
3220
- const isoLocalesService = ()=>({
3221
- getIsoLocales
3222
- });
3223
-
3224
- const { isRelationalAttribute, getVisibleAttributes, isTypedAttribute, getScalarAttributes, getRelationalAttributes } = utils.contentTypes;
3225
- const { ApplicationError: ApplicationError$2 } = utils.errors;
3226
- const hasLocalizedOption = (modelOrAttribute)=>{
3227
- return fp.prop('pluginOptions.i18n.localized', modelOrAttribute) === true;
3228
- };
3229
- const getValidLocale = async (locale)=>{
3230
- const localesService = getService('locales');
3231
- if (fp.isNil(locale)) {
3232
- return localesService.getDefaultLocale();
3233
- }
3234
- const foundLocale = await localesService.findByCode(locale);
3235
- if (!foundLocale) {
3236
- throw new ApplicationError$2('Locale not found');
3237
- }
3238
- return locale;
3239
- };
3240
- /**
3241
- * Returns whether an attribute is localized or not
3242
- * @param {*} attribute
3243
- * @returns
3244
- */ const isLocalizedAttribute = (attribute)=>{
3245
- return hasLocalizedOption(attribute) || isRelationalAttribute(attribute) || isTypedAttribute(attribute, 'uid');
3246
- };
3247
- /**
3248
- * Returns whether a model is localized or not
3249
- * @param {*} model
3250
- * @returns
3251
- */ const isLocalizedContentType = (model)=>{
3252
- return hasLocalizedOption(model);
3253
- };
3254
- /**
3255
- * Returns the list of attribute names that are not localized
3256
- * @param {object} model
3257
- * @returns {string[]}
3258
- */ const getNonLocalizedAttributes = (model)=>{
3259
- return getVisibleAttributes(model).filter((attrName)=>!isLocalizedAttribute(model.attributes[attrName]));
3260
- };
3261
- const removeId = (value)=>{
3262
- if (typeof value === 'object' && fp.has('id', value)) {
3263
- delete value.id;
3264
- }
3265
- };
3266
- const removeIds = (model)=>(entry)=>removeIdsMut(model, fp.cloneDeep(entry));
3267
- const removeIdsMut = (model, entry)=>{
3268
- if (fp.isNil(entry)) {
3269
- return entry;
3270
- }
3271
- removeId(entry);
3272
- _.forEach(model.attributes, (attr, attrName)=>{
3273
- const value = entry[attrName];
3274
- if (attr.type === 'dynamiczone' && fp.isArray(value)) {
3275
- value.forEach((compo)=>{
3276
- if (fp.has('__component', compo)) {
3277
- const model = strapi.components[compo.__component];
3278
- removeIdsMut(model, compo);
3279
- }
3280
- });
3281
- } else if (attr.type === 'component') {
3282
- const model = strapi.components[attr.component];
3283
- if (fp.isArray(value)) {
3284
- value.forEach((compo)=>removeIdsMut(model, compo));
3285
- } else {
3286
- removeIdsMut(model, value);
3287
- }
3288
- }
3289
- });
3290
- return entry;
3291
- };
3292
- /**
3293
- * Returns a copy of an entry picking only its non localized attributes
3294
- * @param {object} model
3295
- * @param {object} entry
3296
- * @returns {object}
3297
- */ const copyNonLocalizedAttributes = (model, entry)=>{
3298
- const nonLocalizedAttributes = getNonLocalizedAttributes(model);
3299
- return fp.pipe(fp.pick(nonLocalizedAttributes), removeIds(model))(entry);
3300
- };
3301
- /**
3302
- * Returns the list of attribute names that are localized
3303
- * @param {object} model
3304
- * @returns {string[]}
3305
- */ const getLocalizedAttributes = (model)=>{
3306
- return getVisibleAttributes(model).filter((attrName)=>isLocalizedAttribute(model.attributes[attrName]));
3307
- };
3308
- /**
3309
- * Fill non localized fields of an entry if there are nil
3310
- * @param {Object} entry entry to fill
3311
- * @param {Object} relatedEntry values used to fill
3312
- * @param {Object} options
3313
- * @param {Object} options.model corresponding model
3314
- */ const fillNonLocalizedAttributes = (entry, relatedEntry, { model })=>{
3315
- if (fp.isNil(relatedEntry)) {
3316
- return;
3317
- }
3318
- const modelDef = strapi.getModel(model);
3319
- const relatedEntryCopy = copyNonLocalizedAttributes(modelDef, relatedEntry);
3320
- _.forEach(relatedEntryCopy, (value, field)=>{
3321
- if (fp.isNil(entry[field])) {
3322
- entry[field] = value;
3323
- }
3324
- });
3325
- };
3326
- /**
3327
- * build the populate param to
3328
- * @param {String} modelUID uid of the model, could be of a content-type or a component
3329
- */ const getNestedPopulateOfNonLocalizedAttributes = (modelUID)=>{
3330
- const schema = strapi.getModel(modelUID);
3331
- const scalarAttributes = getScalarAttributes(schema);
3332
- const nonLocalizedAttributes = getNonLocalizedAttributes(schema);
3333
- const allAttributes = [
3334
- ...scalarAttributes,
3335
- ...nonLocalizedAttributes
3336
- ];
3337
- if (schema.modelType === 'component') {
3338
- // When called recursively on a non localized component we
3339
- // need to explicitly populate that components relations
3340
- allAttributes.push(...getRelationalAttributes(schema));
3341
- }
3342
- const currentAttributesToPopulate = allAttributes.filter((value, index, self)=>{
3343
- return self.indexOf(value) === index && self.lastIndexOf(value) === index;
3344
- });
3345
- const attributesToPopulate = [
3346
- ...currentAttributesToPopulate
3347
- ];
3348
- for (const attrName of currentAttributesToPopulate){
3349
- const attr = schema.attributes[attrName];
3350
- if (attr.type === 'component') {
3351
- const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(attr.component).map((nestedAttr)=>`${attrName}.${nestedAttr}`);
3352
- attributesToPopulate.push(...nestedPopulate);
3353
- } else if (attr.type === 'dynamiczone') {
3354
- attr.components.forEach((componentName)=>{
3355
- const nestedPopulate = getNestedPopulateOfNonLocalizedAttributes(componentName).map((nestedAttr)=>`${attrName}.${nestedAttr}`);
3356
- attributesToPopulate.push(...nestedPopulate);
3357
- });
3358
- }
3359
- }
3360
- return attributesToPopulate;
3361
- };
3362
- const contentTypes = ()=>({
3363
- isLocalizedContentType,
3364
- getValidLocale,
3365
- getLocalizedAttributes,
3366
- getNonLocalizedAttributes,
3367
- copyNonLocalizedAttributes,
3368
- fillNonLocalizedAttributes,
3369
- getNestedPopulateOfNonLocalizedAttributes
3370
- });
3371
-
3372
- const LOCALIZATION_FIELDS = [
3373
- 'locale',
3374
- 'localizations'
3375
- ];
3376
- const sanitize = ({ strapi })=>{
3377
- const { isLocalizedContentType } = getService('content-types');
3378
- /**
3379
- * Sanitizes localization fields of a given entity based on its schema.
3380
- *
3381
- * Remove localization-related fields that are unnecessary, that is
3382
- * for schemas that aren't localized.
3383
- */ const sanitizeLocalizationFields = fp.curry((schema, entity)=>utils.traverseEntity(({ key, schema }, { remove })=>{
3384
- const isLocalized = isLocalizedContentType(schema);
3385
- const isLocalizationField = LOCALIZATION_FIELDS.includes(key);
3386
- if (!isLocalized && isLocalizationField) {
3387
- remove(key);
3388
- }
3389
- }, {
3390
- schema,
3391
- getModel: strapi.getModel.bind(strapi)
3392
- }, entity));
3393
- return {
3394
- sanitizeLocalizationFields
3395
- };
3396
- };
3397
-
3398
- var services = {
3399
- permissions,
3400
- metrics,
3401
- localizations,
3402
- locales,
3403
- sanitize,
3404
- 'iso-locales': isoLocalesService,
3405
- 'content-types': contentTypes
3406
- };
3407
-
3408
- var admin = {
3409
- type: 'admin',
3410
- routes: [
3411
- {
3412
- method: 'GET',
3413
- path: '/iso-locales',
3414
- handler: 'iso-locales.listIsoLocales',
3415
- config: {
3416
- policies: [
3417
- 'admin::isAuthenticatedAdmin',
3418
- {
3419
- name: 'plugin::content-manager.hasPermissions',
3420
- config: {
3421
- actions: [
3422
- 'plugin::i18n.locale.read'
3423
- ]
3424
- }
3425
- }
3426
- ]
3427
- }
3428
- },
3429
- {
3430
- method: 'GET',
3431
- path: '/locales',
3432
- handler: 'locales.listLocales',
3433
- config: {
3434
- policies: [
3435
- 'admin::isAuthenticatedAdmin'
3436
- ]
3437
- }
3438
- },
3439
- {
3440
- method: 'POST',
3441
- path: '/locales',
3442
- handler: 'locales.createLocale',
3443
- config: {
3444
- policies: [
3445
- 'admin::isAuthenticatedAdmin',
3446
- {
3447
- name: 'plugin::content-manager.hasPermissions',
3448
- config: {
3449
- actions: [
3450
- 'plugin::i18n.locale.create'
3451
- ]
3452
- }
3453
- }
3454
- ]
3455
- }
3456
- },
3457
- {
3458
- method: 'PUT',
3459
- path: '/locales/:id',
3460
- handler: 'locales.updateLocale',
3461
- config: {
3462
- policies: [
3463
- 'admin::isAuthenticatedAdmin',
3464
- {
3465
- name: 'plugin::content-manager.hasPermissions',
3466
- config: {
3467
- actions: [
3468
- 'plugin::i18n.locale.update'
3469
- ]
3470
- }
3471
- }
3472
- ]
3473
- }
3474
- },
3475
- {
3476
- method: 'DELETE',
3477
- path: '/locales/:id',
3478
- handler: 'locales.deleteLocale',
3479
- config: {
3480
- policies: [
3481
- 'admin::isAuthenticatedAdmin',
3482
- {
3483
- name: 'plugin::content-manager.hasPermissions',
3484
- config: {
3485
- actions: [
3486
- 'plugin::i18n.locale.delete'
3487
- ]
3488
- }
3489
- }
3490
- ]
3491
- }
3492
- },
3493
- {
3494
- method: 'POST',
3495
- path: '/content-manager/actions/get-non-localized-fields',
3496
- handler: 'content-types.getNonLocalizedAttributes',
3497
- config: {
3498
- policies: [
3499
- 'admin::isAuthenticatedAdmin'
3500
- ]
3501
- }
3502
- }
3503
- ]
3504
- };
3505
-
3506
- var contentApi = {
3507
- type: 'content-api',
3508
- routes: [
3509
- {
3510
- method: 'GET',
3511
- path: '/locales',
3512
- handler: 'locales.listLocales'
3513
- }
3514
- ]
3515
- };
3516
-
3517
- var routes = {
3518
- admin,
3519
- 'content-api': contentApi
3520
- };
3521
-
3522
- const allowedLocaleCodes = isoLocales.map(fp.prop('code'));
3523
- const createLocaleSchema = utils.yup.object().shape({
3524
- name: utils.yup.string().max(50).nullable(),
3525
- code: utils.yup.string().oneOf(allowedLocaleCodes).required(),
3526
- isDefault: utils.yup.boolean().required()
3527
- }).noUnknown();
3528
- const updateLocaleSchema = utils.yup.object().shape({
3529
- name: utils.yup.string().min(1).max(50).nullable(),
3530
- isDefault: utils.yup.boolean()
3531
- }).noUnknown();
3532
- const validateCreateLocaleInput = utils.validateYupSchema(createLocaleSchema);
3533
- const validateUpdateLocaleInput = utils.validateYupSchema(updateLocaleSchema);
3534
-
3535
- const formatLocale = (locale)=>{
3536
- return {
3537
- ...locale,
3538
- name: locale.name || null
3539
- };
3540
- };
3541
-
3542
- const { setCreatorFields } = utils__namespace;
3543
- const { ApplicationError: ApplicationError$1 } = utils__namespace.errors;
3544
- const sanitizeLocale = (locale)=>{
3545
- const model = strapi.getModel('plugin::i18n.locale');
3546
- return strapi.contentAPI.sanitize.output(locale, model);
3547
- };
3548
- const controller$2 = {
3549
- async listLocales (ctx) {
3550
- const localesService = getService('locales');
3551
- const locales = await localesService.find();
3552
- const sanitizedLocales = await sanitizeLocale(locales);
3553
- ctx.body = await localesService.setIsDefault(sanitizedLocales);
3554
- },
3555
- async createLocale (ctx) {
3556
- const { user } = ctx.state;
3557
- const body = ctx.request.body;
3558
- const { isDefault, ...localeToCreate } = body;
3559
- await validateCreateLocaleInput(body);
3560
- const localesService = getService('locales');
3561
- const existingLocale = await localesService.findByCode(body.code);
3562
- if (existingLocale) {
3563
- throw new ApplicationError$1('This locale already exists');
3564
- }
3565
- const localeToPersist = setCreatorFields({
3566
- user
3567
- })(formatLocale(localeToCreate));
3568
- const locale = await localesService.create(localeToPersist);
3569
- if (isDefault) {
3570
- await localesService.setDefaultLocale(locale);
3571
- }
3572
- const sanitizedLocale = await sanitizeLocale(locale);
3573
- ctx.body = await localesService.setIsDefault(sanitizedLocale);
3574
- },
3575
- async updateLocale (ctx) {
3576
- const { user } = ctx.state;
3577
- const { id } = ctx.params;
3578
- const body = ctx.request.body;
3579
- const { isDefault, ...updates } = body;
3580
- await validateUpdateLocaleInput(body);
3581
- const localesService = getService('locales');
3582
- const existingLocale = await localesService.findById(id);
3583
- if (!existingLocale) {
3584
- return ctx.notFound('locale.notFound');
3585
- }
3586
- const allowedParams = [
3587
- 'name'
3588
- ];
3589
- const cleanUpdates = setCreatorFields({
3590
- user,
3591
- isEdition: true
3592
- })(fp.pick(allowedParams, updates));
3593
- const updatedLocale = await localesService.update({
3594
- id
3595
- }, cleanUpdates);
3596
- if (isDefault) {
3597
- await localesService.setDefaultLocale(updatedLocale);
3598
- }
3599
- const sanitizedLocale = await sanitizeLocale(updatedLocale);
3600
- ctx.body = await localesService.setIsDefault(sanitizedLocale);
3601
- },
3602
- async deleteLocale (ctx) {
3603
- const { id } = ctx.params;
3604
- const localesService = getService('locales');
3605
- const existingLocale = await localesService.findById(id);
3606
- if (!existingLocale) {
3607
- return ctx.notFound('locale.notFound');
3608
- }
3609
- const defaultLocaleCode = await localesService.getDefaultLocale();
3610
- if (existingLocale.code === defaultLocaleCode) {
3611
- throw new ApplicationError$1('Cannot delete the default locale');
3612
- }
3613
- await localesService.delete({
3614
- id
3615
- });
3616
- const sanitizedLocale = await sanitizeLocale(existingLocale);
3617
- ctx.body = await localesService.setIsDefault(sanitizedLocale);
3618
- }
3619
- };
3620
-
3621
- const validateGetNonLocalizedAttributesSchema = utils.yup.object().shape({
3622
- model: utils.yup.string().required(),
3623
- id: utils.yup.mixed().when('model', {
3624
- is: (model)=>fp.get('kind', strapi.contentType(model)) === 'singleType',
3625
- then: utils.yup.strapiID().nullable(),
3626
- otherwise: utils.yup.strapiID().required()
3627
- }),
3628
- locale: utils.yup.string().required()
3629
- }).noUnknown().required();
3630
- const validateGetNonLocalizedAttributesInput = utils.validateYupSchema(validateGetNonLocalizedAttributesSchema);
3631
-
3632
- const { ApplicationError } = utils.errors;
3633
- const { PUBLISHED_AT_ATTRIBUTE } = utils.contentTypes.constants;
3634
- const getLocalesProperty = fp.getOr([], 'properties.locales');
3635
- const getFieldsProperty = fp.prop('properties.fields');
3636
- const getFirstLevelPath = fp.map((path)=>path.split('.')[0]);
3637
- const controller$1 = {
3638
- async getNonLocalizedAttributes (ctx) {
3639
- const { user } = ctx.state;
3640
- const body = ctx.request.body;
3641
- const { model, id, locale } = body;
3642
- await validateGetNonLocalizedAttributesInput({
3643
- model,
3644
- id,
3645
- locale
3646
- });
3647
- const { copyNonLocalizedAttributes, isLocalizedContentType, getNestedPopulateOfNonLocalizedAttributes } = getService('content-types');
3648
- const { default: { READ_ACTION, CREATE_ACTION } } = strapi.service('admin::constants');
3649
- const modelDef = strapi.contentType(model);
3650
- const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);
3651
- if (!isLocalizedContentType(modelDef)) {
3652
- throw new ApplicationError(`Model ${model} is not localized`);
3653
- }
3654
- const params = modelDef.kind === 'singleType' ? {} : {
3655
- id
3656
- };
3657
- const entity = await strapi.db.query(model).findOne({
3658
- where: params,
3659
- populate: attributesToPopulate
3660
- });
3661
- if (!entity) {
3662
- return ctx.notFound();
3663
- }
3664
- const permissions = await strapi.admin.services.permission.findMany({
3665
- where: {
3666
- action: [
3667
- READ_ACTION,
3668
- CREATE_ACTION
3669
- ],
3670
- subject: model,
3671
- role: {
3672
- id: user.roles.map(fp.prop('id'))
3673
- }
3674
- }
3675
- });
3676
- const localePermissions = permissions.filter((perm)=>getLocalesProperty(perm).includes(locale)).map(getFieldsProperty);
3677
- const permittedFields = fp.pipe(fp.flatten, getFirstLevelPath, fp.uniq)(localePermissions);
3678
- const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);
3679
- const sanitizedNonLocalizedFields = fp.pick(permittedFields, nonLocalizedFields);
3680
- const availableLocalesResult = await strapi.plugins['content-manager'].service('document-metadata').getMetadata(model, entity, {
3681
- availableLocales: true
3682
- });
3683
- const availableLocales = availableLocalesResult.availableLocales.map((localeResult)=>fp.pick([
3684
- 'id',
3685
- 'locale',
3686
- PUBLISHED_AT_ATTRIBUTE
3687
- ], localeResult));
3688
- ctx.body = {
3689
- nonLocalizedFields: sanitizedNonLocalizedFields,
3690
- localizations: availableLocales.concat(fp.pick([
3691
- 'id',
3692
- 'locale',
3693
- PUBLISHED_AT_ATTRIBUTE
3694
- ], entity))
3695
- };
3696
- }
3697
- };
3698
-
3699
- const controller = {
3700
- listIsoLocales (ctx) {
3701
- const isoLocalesService = getService('iso-locales');
3702
- ctx.body = isoLocalesService.getIsoLocales();
3703
- }
3704
- };
3705
-
3706
- var controllers = {
3707
- locales: controller$2,
3708
- 'iso-locales': controller,
3709
- 'content-types': controller$1
3710
- };
3
+ var bootstrap = require('./bootstrap.js');
4
+ var register = require('./register.js');
5
+ var index$3 = require('./content-types/index.js');
6
+ var index$4 = require('./services/index.js');
7
+ var index$1 = require('./routes/index.js');
8
+ var index$2 = require('./controllers/index.js');
3711
9
 
3712
10
  var index = (()=>({
3713
11
  register,
3714
12
  bootstrap,
3715
- routes,
3716
- controllers,
3717
- contentTypes: contentTypes$1,
3718
- services
13
+ routes: index$1,
14
+ controllers: index$2,
15
+ contentTypes: index$3,
16
+ services: index$4
3719
17
  }));
3720
18
 
3721
19
  module.exports = index;