@instructure/canvas-rce 5.11.1 → 5.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/es/canvasFileBrowser/FileBrowser.js +6 -1
  3. package/es/common/fileUrl.js +3 -4
  4. package/es/defaultTinymceConfig.js +1 -1
  5. package/es/elementDenylist.js +19 -0
  6. package/es/getThemeVars.js +4 -3
  7. package/es/getTranslations.js +77 -1
  8. package/es/rce/RCEWrapper.js +2 -6
  9. package/es/rce/StatusBar.js +8 -2
  10. package/es/rce/contentInsertion.js +5 -2
  11. package/es/rce/plugins/instructure_documents/components/DocumentsPanel.js +3 -9
  12. package/es/rce/plugins/instructure_html_view/plugin.js +2 -2
  13. package/es/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +3 -2
  14. package/es/rce/plugins/instructure_image/ImageList/Image.js +2 -2
  15. package/es/rce/plugins/instructure_image/Images/index.js +3 -10
  16. package/es/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +3 -0
  17. package/es/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -1
  18. package/es/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +26 -1
  19. package/es/rce/plugins/instructure_record/AudioOptionsTray/index.js +9 -3
  20. package/es/rce/plugins/instructure_record/MediaPanel/index.js +3 -9
  21. package/es/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +27 -2
  22. package/es/rce/plugins/instructure_record/VideoOptionsTray/index.js +35 -6
  23. package/es/rce/plugins/shared/fileShape.js +81 -9
  24. package/es/rce/plugins/shared/fileTypeUtils.js +6 -0
  25. package/es/rcs/api.js +6 -4
  26. package/es/sidebar/store/configureStore.js +2 -2
  27. package/es/translations/locales/ab.js +26 -0
  28. package/es/translations/locales/cs.js +27 -0
  29. package/es/translations/locales/cs_CZ.js +27 -0
  30. package/es/translations/locales/da_DK.js +27 -0
  31. package/es/translations/locales/en_NZ.js +26 -0
  32. package/es/translations/locales/en_SE.js +26 -0
  33. package/es/translations/locales/en_US.js +26 -0
  34. package/es/translations/locales/hu_HU.js +27 -0
  35. package/es/translations/locales/id.js +2426 -0
  36. package/es/{types/inst-ui.d.js → translations/locales/id_ID.js} +9 -1
  37. package/es/translations/locales/ko_KR.js +27 -0
  38. package/es/translations/locales/lt.js +26 -0
  39. package/es/translations/locales/lt_LT.js +26 -0
  40. package/es/translations/locales/mn_MN.js +26 -0
  41. package/es/translations/locales/nl_NL.js +27 -0
  42. package/es/translations/locales/ro.js +27 -0
  43. package/es/translations/locales/ru.js +2375 -32
  44. package/es/translations/locales/sv.js +2379 -30
  45. package/es/translations/locales/th.js +2401 -1
  46. package/es/translations/locales/tl_PH.js +26 -0
  47. package/es/translations/locales/tr.js +3 -0
  48. package/es/translations/locales/vi.js +2396 -8
  49. package/es/translations/locales/zh_TW.Big5.js +27 -0
  50. package/es/translations/locales/zh_TW.js +27 -0
  51. package/lib/canvasFileBrowser/FileBrowser.js +6 -1
  52. package/lib/common/fileUrl.js +3 -4
  53. package/lib/defaultTinymceConfig.js +1 -1
  54. package/lib/elementDenylist.js +19 -0
  55. package/lib/getThemeVars.js +4 -3
  56. package/lib/getTranslations.js +77 -1
  57. package/lib/rce/RCEWrapper.js +2 -6
  58. package/lib/rce/StatusBar.js +8 -2
  59. package/lib/rce/contentInsertion.js +5 -2
  60. package/lib/rce/plugins/instructure_documents/components/DocumentsPanel.js +3 -9
  61. package/lib/rce/plugins/instructure_html_view/plugin.js +2 -2
  62. package/lib/rce/plugins/instructure_icon_maker/components/SavedIconMakerList.js +3 -2
  63. package/lib/rce/plugins/instructure_image/ImageList/Image.js +2 -2
  64. package/lib/rce/plugins/instructure_image/Images/index.js +3 -10
  65. package/lib/rce/plugins/instructure_rce_external_tools/components/ExternalToolDialog/ExternalToolDialog.js +3 -0
  66. package/lib/rce/plugins/instructure_rce_external_tools/lti13-content-items/models/ResourceLinkContentItem.js +3 -1
  67. package/lib/rce/plugins/instructure_record/AudioOptionsTray/TrayController.js +26 -1
  68. package/lib/rce/plugins/instructure_record/AudioOptionsTray/index.js +9 -3
  69. package/lib/rce/plugins/instructure_record/MediaPanel/index.js +3 -9
  70. package/lib/rce/plugins/instructure_record/VideoOptionsTray/TrayController.js +27 -2
  71. package/lib/rce/plugins/instructure_record/VideoOptionsTray/index.js +35 -6
  72. package/lib/rce/plugins/shared/fileShape.js +81 -9
  73. package/lib/rce/plugins/shared/fileTypeUtils.js +6 -0
  74. package/lib/rcs/api.js +6 -4
  75. package/lib/sidebar/store/configureStore.js +2 -2
  76. package/lib/translations/locales/ab.js +26 -0
  77. package/lib/translations/locales/cs.js +27 -0
  78. package/lib/translations/locales/cs_CZ.js +27 -0
  79. package/lib/translations/locales/da_DK.js +27 -0
  80. package/lib/translations/locales/en_NZ.js +26 -0
  81. package/lib/translations/locales/en_SE.js +26 -0
  82. package/lib/translations/locales/en_US.js +26 -0
  83. package/lib/translations/locales/hu_HU.js +27 -0
  84. package/lib/translations/locales/id.js +2426 -0
  85. package/lib/{types/inst-ui.d.js → translations/locales/id_ID.js} +9 -1
  86. package/lib/translations/locales/ko_KR.js +27 -0
  87. package/lib/translations/locales/lt.js +26 -0
  88. package/lib/translations/locales/lt_LT.js +26 -0
  89. package/lib/translations/locales/mn_MN.js +26 -0
  90. package/lib/translations/locales/nl_NL.js +27 -0
  91. package/lib/translations/locales/ro.js +27 -0
  92. package/lib/translations/locales/ru.js +2375 -32
  93. package/lib/translations/locales/sv.js +2379 -30
  94. package/lib/translations/locales/th.js +2401 -1
  95. package/lib/translations/locales/tl_PH.js +26 -0
  96. package/lib/translations/locales/tr.js +3 -0
  97. package/lib/translations/locales/vi.js +2396 -8
  98. package/lib/translations/locales/zh_TW.Big5.js +27 -0
  99. package/lib/translations/locales/zh_TW.js +27 -0
  100. package/package.json +11 -9
  101. package/scripts/publish_to_npm.sh +26 -0
  102. package/canvas/README.md +0 -84
  103. package/canvas/locales/en.json +0 -934
  104. package/canvas/package.json +0 -189
  105. package/es/common/scroll.js +0 -45
  106. package/es/types/ts-migration.js +0 -1
  107. package/lib/common/scroll.js +0 -45
  108. package/lib/types/ts-migration.js +0 -1
@@ -146,7 +146,7 @@ export default class TrayController {
146
146
  // If not, we can't update the MediaObject in the canvas db.
147
147
 
148
148
 
149
- if (videoOptions.media_object_id && videoOptions.media_object_id !== 'undefined') {
149
+ if (videoOptions.media_object_id && videoOptions.media_object_id !== 'undefined' && !videoOptions.editLocked) {
150
150
  videoOptions.updateMediaObject(data).then(_r => {
151
151
  if (this.$videoContainer && videoOptions.displayAs === 'embed') {
152
152
  this.$videoContainer.contentWindow.postMessage({
@@ -177,6 +177,27 @@ export default class TrayController {
177
177
  this._editor = null;
178
178
  }
179
179
 
180
+ requestSubtitlesFromIframe(cb) {
181
+ var _this$$videoContainer2, _this$$videoContainer3;
182
+
183
+ if (!bridge.canvasOrigin) return;
184
+ this._subtitleListener = new AbortController();
185
+ window.addEventListener('message', event => {
186
+ var _event$data;
187
+
188
+ if ((event === null || event === void 0 ? void 0 : (_event$data = event.data) === null || _event$data === void 0 ? void 0 : _event$data.subject) === "media_tracks_response") {
189
+ var _event$data2;
190
+
191
+ cb(event === null || event === void 0 ? void 0 : (_event$data2 = event.data) === null || _event$data2 === void 0 ? void 0 : _event$data2.payload);
192
+ }
193
+ }, {
194
+ signal: this._subtitleListener.signal
195
+ });
196
+ (_this$$videoContainer2 = this.$videoContainer) === null || _this$$videoContainer2 === void 0 ? void 0 : (_this$$videoContainer3 = _this$$videoContainer2.contentWindow) === null || _this$$videoContainer3 === void 0 ? void 0 : _this$$videoContainer3.postMessage({
197
+ subject: 'media_tracks_request'
198
+ }, bridge.canvasOrigin);
199
+ }
200
+
180
201
  _renderTray(trayProps) {
181
202
  let vo = {};
182
203
 
@@ -198,8 +219,11 @@ export default class TrayController {
198
219
  this._isOpen = true;
199
220
  },
200
221
  onExited: () => {
222
+ var _this$_subtitleListen;
223
+
201
224
  bridge.focusActiveEditor(false);
202
225
  this._isOpen = false;
226
+ (_this$_subtitleListen = this._subtitleListener) === null || _this$_subtitleListen === void 0 ? void 0 : _this$_subtitleListen.abort();
203
227
  },
204
228
  onSave: videoOptions => {
205
229
  this._applyVideoOptions(videoOptions);
@@ -207,7 +231,8 @@ export default class TrayController {
207
231
  onRequestClose: () => this._dismissTray(),
208
232
  open: this._shouldOpen,
209
233
  trayProps: trayProps,
210
- studioOptions: isStudioEmbeddedMedia(this.$videoContainer) ? parseStudioOptions(this.$videoContainer) : null
234
+ studioOptions: isStudioEmbeddedMedia(this.$videoContainer) ? parseStudioOptions(this.$videoContainer) : null,
235
+ requestSubtitlesFromIframe: cb => this.requestSubtitlesFromIframe(cb)
211
236
  });
212
237
  ReactDOM.render(element, this.$container);
213
238
  }
@@ -15,7 +15,7 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
- import React, { useState } from 'react';
18
+ import React, { useState, useEffect } from 'react';
19
19
  import { arrayOf, bool, func, number, shape, string } from 'prop-types';
20
20
  import { Button, CloseButton, IconButton } from '@instructure/ui-buttons';
21
21
  import { Heading } from '@instructure/ui-heading';
@@ -27,12 +27,14 @@ import { IconQuestionLine } from '@instructure/ui-icons';
27
27
  import { Flex } from '@instructure/ui-flex';
28
28
  import { FormFieldGroup } from '@instructure/ui-form-field';
29
29
  import { View } from '@instructure/ui-view';
30
+ import { Spinner } from '@instructure/ui-spinner';
30
31
  import { Tooltip } from '@instructure/ui-tooltip';
31
32
  import { Tray } from '@instructure/ui-tray';
32
33
  import { StoreProvider } from '../../shared/StoreContext';
33
34
  import { ClosedCaptionPanel } from '@instructure/canvas-media';
34
35
  import { CUSTOM, MIN_WIDTH_VIDEO, MIN_PERCENTAGE, videoSizes, labelForImageSize, scaleToSize } from '../../instructure_image/ImageEmbedOptions';
35
36
  import Bridge from '../../../../bridge';
37
+ import RceApiSource from '../../../../rcs/api';
36
38
  import formatMessage from '../../../../format-message';
37
39
  import DimensionsInput, { useDimensionsState } from '../../shared/DimensionsInput';
38
40
  import { getTrayHeight } from '../../shared/trayUtils';
@@ -48,6 +50,7 @@ export default function VideoOptionsTray(_ref) {
48
50
  onSave,
49
51
  open,
50
52
  trayProps,
53
+ requestSubtitlesFromIframe = () => {},
51
54
  onEntered = null,
52
55
  onExited = null,
53
56
  id = 'video-options-tray',
@@ -68,6 +71,8 @@ export default function VideoOptionsTray(_ref) {
68
71
  const [minWidth] = useState(MIN_WIDTH_VIDEO);
69
72
  const [minHeight] = useState(Math.round(videoHeight / videoWidth * MIN_WIDTH_VIDEO));
70
73
  const [minPercentage] = useState(MIN_PERCENTAGE);
74
+ const [editLocked, setEditLocked] = useState(null);
75
+ const [loading, setLoading] = useState(true);
71
76
  const isStudio = !!studioOptions;
72
77
  const showDisplayOptions = !isStudio || studioOptions.convertibleToLink;
73
78
  const showSizeControls = !isStudio || studioOptions.resizable;
@@ -76,6 +81,22 @@ export default function VideoOptionsTray(_ref) {
76
81
  minWidth,
77
82
  minPercentage
78
83
  });
84
+ const api = new RceApiSource(trayProps);
85
+ useEffect(() => {
86
+ if (videoOptions.attachmentId) {
87
+ api.getFile(videoOptions.attachmentId, {
88
+ include: ['blueprint_course_status']
89
+ }).then(response => {
90
+ setEditLocked((response === null || response === void 0 ? void 0 : response.restricted_by_master_course) && (response === null || response === void 0 ? void 0 : response.is_master_course_child_content));
91
+ setLoading(false);
92
+ }).catch(error => {
93
+ setLoading(false);
94
+ });
95
+ }
96
+ }, [videoOptions.attachmentId]);
97
+ useEffect(() => {
98
+ if (subtitles.length === 0) requestSubtitlesFromIframe(setSubtitles);
99
+ }, []);
79
100
 
80
101
  function handleTitleTextChange(event) {
81
102
  setTitleText(event.target.value);
@@ -124,7 +145,8 @@ export default function VideoOptionsTray(_ref) {
124
145
  appliedWidth,
125
146
  displayAs,
126
147
  subtitles,
127
- updateMediaObject
148
+ updateMediaObject,
149
+ editLocked
128
150
  });
129
151
  }
130
152
 
@@ -192,7 +214,13 @@ export default function VideoOptionsTray(_ref) {
192
214
  color: "primary",
193
215
  onClick: onRequestClose,
194
216
  screenReaderLabel: formatMessage('Close')
195
- })))), /*#__PURE__*/React.createElement(Flex.Item, {
217
+ })))), loading && videoOptions.attachmentId ? /*#__PURE__*/React.createElement(Flex.Item, {
218
+ textAlign: "center",
219
+ margin: "xx-large",
220
+ padding: "xx-large"
221
+ }, /*#__PURE__*/React.createElement(Spinner, {
222
+ renderTitle: formatMessage("Loading")
223
+ })) : /*#__PURE__*/React.createElement(Flex.Item, {
196
224
  as: "form",
197
225
  shouldGrow: true,
198
226
  margin: "none",
@@ -207,7 +235,7 @@ export default function VideoOptionsTray(_ref) {
207
235
  shouldShrink: true
208
236
  }, /*#__PURE__*/React.createElement(Flex, {
209
237
  direction: "column"
210
- }, /*#__PURE__*/React.createElement(Flex.Item, {
238
+ }, !editLocked && /*#__PURE__*/React.createElement(Flex.Item, {
211
239
  padding: "small"
212
240
  }, isStudio ? /*#__PURE__*/React.createElement(Flex, {
213
241
  direction: "column"
@@ -266,7 +294,7 @@ export default function VideoOptionsTray(_ref) {
266
294
  minWidth: minWidth,
267
295
  minPercentage: minPercentage,
268
296
  hidePercentage: true
269
- }))), !isStudio && /*#__PURE__*/React.createElement(Flex.Item, {
297
+ }))), !isStudio && !editLocked && /*#__PURE__*/React.createElement(Flex.Item, {
270
298
  padding: "small"
271
299
  }, /*#__PURE__*/React.createElement(FormFieldGroup, {
272
300
  description: formatMessage('Closed Captions/Subtitles')
@@ -317,5 +345,6 @@ VideoOptionsTray.propTypes = {
317
345
  jwt: string.isRequired
318
346
  }),
319
347
  id: string,
320
- studioOptions: parsedStudioOptionsPropType
348
+ studioOptions: parsedStudioOptionsPropType,
349
+ requestSubtitlesFromIframe: func
321
350
  };
@@ -15,11 +15,11 @@
15
15
  * You should have received a copy of the GNU Affero General Public License along
16
16
  * with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
- import { bool, number, oneOfType, string } from 'prop-types';
18
+ import { arrayOf, bool, number, oneOfType, shape, string, checkPropTypes } from 'prop-types';
19
19
  export const fileShape = {
20
20
  content_type: string.isRequired,
21
21
  date: string.isRequired,
22
- display_name: string,
22
+ display_name: string.isRequired,
23
23
  filename: string.isRequired,
24
24
  href: string.isRequired,
25
25
  id: oneOfType([number, string]).isRequired,
@@ -31,13 +31,13 @@ export const fileShape = {
31
31
  locked_for_user: bool,
32
32
  published: bool
33
33
  };
34
- export const mediaObjectShape = {
35
- content_type: string.isRequired,
36
- date: string.isRequired,
37
- embedded_iframe_url: string,
38
- id: oneOfType([number, string]).isRequired,
34
+ export const imageShape = { ...fileShape,
35
+ thumbnail_url: string
36
+ };
37
+ export const mediaObjectShape = { ...imageShape,
39
38
  title: string.isRequired,
40
- published: bool
39
+ embedded_iframe_url: string,
40
+ media_entry_id: string
41
41
  };
42
42
  export const fileOrMediaObjectShape = {
43
43
  content_type: string.isRequired,
@@ -54,4 +54,76 @@ export const fileOrMediaObjectShape = {
54
54
  unlock_at: string,
55
55
  locked_for_user: bool,
56
56
  published: bool
57
- };
57
+ };
58
+ export const documentQueryReturnShape = {
59
+ files: arrayOf(shape(fileShape)).isRequired,
60
+ bookmark: string,
61
+ hasMore: bool,
62
+ isLoading: bool,
63
+ error: string
64
+ };
65
+ export const imageQueryReturnShape = {
66
+ files: arrayOf(shape(imageShape)).isRequired,
67
+ bookmark: string,
68
+ hasMore: bool,
69
+ isLoading: bool,
70
+ error: string
71
+ };
72
+ export const mediaQueryReturnShape = {
73
+ files: arrayOf(shape(mediaObjectShape)).isRequired,
74
+ bookmark: string,
75
+ hasMore: bool,
76
+ isLoading: bool,
77
+ error: string
78
+ };
79
+
80
+ function createContentTrayDocumentShape(isRequired) {
81
+ return function validateContentTrayDocuments(props, propName, componentName) {
82
+ const p = props[propName];
83
+
84
+ if (!p) {
85
+ if (isRequired) {
86
+ if (!p) {
87
+ return new Error(`Required prop \`${propName}\` not supplied to \`${componentName}\`. Validation failed.`);
88
+ }
89
+ }
90
+
91
+ return undefined;
92
+ } else {
93
+ const files = p.user || p.course || p.group || p.User || p.Course || p.Group;
94
+
95
+ if (!files) {
96
+ return new Error(`Invalid prop \`${propName}\` supplied to \`${componentName}\`. Missing "user"|"course"|"group" key.`);
97
+ }
98
+
99
+ if ('searchString' in p) {
100
+ if (!(typeof p.searchString === 'string')) {
101
+ return new Error(`Invalid prop \`${propName}\` supplied to \`${componentName}\`. "searchString" must be a string.`);
102
+ }
103
+ }
104
+
105
+ if (propName === 'documents') {
106
+ checkPropTypes({
107
+ docs: shape(documentQueryReturnShape)
108
+ }, {
109
+ docs: files
110
+ }, componentName, componentName);
111
+ } else if (propName === 'images') {
112
+ checkPropTypes({
113
+ images: shape(imageQueryReturnShape)
114
+ }, {
115
+ images: files
116
+ }, componentName, componentName);
117
+ } else if (propName === 'media') {
118
+ checkPropTypes({
119
+ media: shape(mediaQueryReturnShape)
120
+ }, {
121
+ media: files
122
+ }, componentName, componentName);
123
+ }
124
+ }
125
+ };
126
+ }
127
+
128
+ export const contentTrayDocumentShape = createContentTrayDocumentShape(false);
129
+ contentTrayDocumentShape.isRequired = createContentTrayDocumentShape(true);
@@ -112,6 +112,12 @@ export function mediaPlayerURLFromFile(file, canvasOrigin) {
112
112
  }
113
113
 
114
114
  if (file.embedded_iframe_url) {
115
+ const url = new URL(file.embedded_iframe_url, canvasOrigin);
116
+
117
+ if (url.searchParams.has('type')) {
118
+ return `${absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin)}`;
119
+ }
120
+
115
121
  return `${absoluteToRelativeUrl(file.embedded_iframe_url, canvasOrigin)}?type=${type}`;
116
122
  }
117
123
 
package/es/rcs/api.js CHANGED
@@ -468,11 +468,13 @@ class RceApiSource {
468
468
 
469
469
  const {
470
470
  replacement_chain_context_type,
471
- replacement_chain_context_id
471
+ replacement_chain_context_id,
472
+ include
472
473
  } = options;
473
474
  const uri = this.addParamsIfPresent(`${base}/${id}`, {
474
475
  replacement_chain_context_type,
475
- replacement_chain_context_id
476
+ replacement_chain_context_id,
477
+ include
476
478
  });
477
479
  return this.apiFetch(uri, headers).then(normalizeFileData);
478
480
  } // @private
@@ -558,10 +560,10 @@ class RceApiSource {
558
560
  } else {
559
561
  return response;
560
562
  }
561
- }).then(checkStatus).then(res => res.json()).catch(throwConnectionError).catch(e => e.response.json().then(body => {
563
+ }).then(checkStatus).then(res => res.json()).catch(throwConnectionError).catch(e => e.response.json().then(responseBody => {
562
564
  console.error(e); // eslint-disable-line no-console
563
565
 
564
- this.alertFunc(buildError(body));
566
+ this.alertFunc(buildError(responseBody));
565
567
  throw e;
566
568
  }));
567
569
  } // @private
@@ -18,9 +18,9 @@
18
18
  import { createStore, applyMiddleware } from 'redux';
19
19
  import rootReducer from '../reducers';
20
20
  import initialState from './initialState';
21
- import thunkMiddleware from 'redux-thunk';
21
+ import { thunk } from 'redux-thunk';
22
22
  import { batch, batching } from 'redux-batch-middleware';
23
23
  export default function (props, state) {
24
- const store = createStore(batching(rootReducer), state || initialState(props), applyMiddleware(thunkMiddleware, batch));
24
+ const store = createStore(batching(rootReducer), state || initialState(props), applyMiddleware(thunk, batch));
25
25
  return store;
26
26
  }
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Copyright (C) 2021 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import formatMessage from '../../format-message';
19
+ const locale = {
20
+ "count_plural_one_item_loaded_other_items_loaded_857023b7": {
21
+ "message": "{ count, plural,\n one {}\n other {}\n}"
22
+ }
23
+ };
24
+ formatMessage.addLocale({
25
+ ab: locale
26
+ });
@@ -0,0 +1,27 @@
1
+ /*
2
+ * Copyright (C) 2021 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import formatMessage from '../../format-message';
19
+ import '../tinymce/cs';
20
+ const locale = {
21
+ "count_plural_one_item_loaded_other_items_loaded_857023b7": {
22
+ "message": "{ count, plural,\n one {}\n few {}\n many {}\n other {}\n}"
23
+ }
24
+ };
25
+ formatMessage.addLocale({
26
+ cs: locale
27
+ });
@@ -0,0 +1,27 @@
1
+ /*
2
+ * Copyright (C) 2021 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import formatMessage from '../../format-message';
19
+ import '../tinymce/cs';
20
+ const locale = {
21
+ "count_plural_one_item_loaded_other_items_loaded_857023b7": {
22
+ "message": "{ count, plural,\n one {}\n few {}\n many {}\n other {}\n}"
23
+ }
24
+ };
25
+ formatMessage.addLocale({
26
+ 'cs-CZ': locale
27
+ });
@@ -0,0 +1,27 @@
1
+ /*
2
+ * Copyright (C) 2021 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import formatMessage from '../../format-message';
19
+ import '../tinymce/da';
20
+ const locale = {
21
+ "count_plural_one_item_loaded_other_items_loaded_857023b7": {
22
+ "message": "{ count, plural,\n one {}\n other {}\n}"
23
+ }
24
+ };
25
+ formatMessage.addLocale({
26
+ 'da-DK': locale
27
+ });
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Copyright (C) 2021 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import formatMessage from '../../format-message';
19
+ const locale = {
20
+ "count_plural_one_item_loaded_other_items_loaded_857023b7": {
21
+ "message": "{ count, plural,\n one {}\n other {}\n}"
22
+ }
23
+ };
24
+ formatMessage.addLocale({
25
+ 'en-NZ': locale
26
+ });
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Copyright (C) 2021 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import formatMessage from '../../format-message';
19
+ const locale = {
20
+ "count_plural_one_item_loaded_other_items_loaded_857023b7": {
21
+ "message": "{ count, plural,\n one {}\n other {}\n}"
22
+ }
23
+ };
24
+ formatMessage.addLocale({
25
+ 'en-SE': locale
26
+ });
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Copyright (C) 2021 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import formatMessage from '../../format-message';
19
+ const locale = {
20
+ "count_plural_one_item_loaded_other_items_loaded_857023b7": {
21
+ "message": "{ count, plural,\n one {}\n other {}\n}"
22
+ }
23
+ };
24
+ formatMessage.addLocale({
25
+ 'en-US': locale
26
+ });
@@ -0,0 +1,27 @@
1
+ /*
2
+ * Copyright (C) 2021 - present Instructure, Inc.
3
+ *
4
+ * This file is part of Canvas.
5
+ *
6
+ * Canvas is free software: you can redistribute it and/or modify it under
7
+ * the terms of the GNU Affero General Public License as published by the Free
8
+ * Software Foundation, version 3 of the License.
9
+ *
10
+ * Canvas is distributed in the hope that it will be useful, but WITHOUT ANY
11
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12
+ * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13
+ * details.
14
+ *
15
+ * You should have received a copy of the GNU Affero General Public License along
16
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ */
18
+ import formatMessage from '../../format-message';
19
+ import '../tinymce/hu_HU';
20
+ const locale = {
21
+ "count_plural_one_item_loaded_other_items_loaded_857023b7": {
22
+ "message": "{ count, plural,\n one {}\n other {}\n}"
23
+ }
24
+ };
25
+ formatMessage.addLocale({
26
+ 'hu-HU': locale
27
+ });