fix: let make extract_translations find messages (#290)

Otherwise it'll complain for not finding any message.

`defineMessage` ensures that React i18n static code collector is able to
find the messages.

References
----------

This pull request is part of the [FC-0012 project](https://openedx.atlassian.net/l/cp/XGS0iCcQ) which is sparked by the [Translation Infrastructure update OEP-58](https://open-edx-proposals.readthedocs.io/en/latest/architectural-decisions/oep-0058-arch-translations-management.html#specification).

Check the links above for full information about the overall project.
This commit is contained in:
Omar Al-Ithawi
2023-03-29 17:17:25 +03:00
committed by GitHub
parent e7d69f4e5d
commit 98ec415e2b
45 changed files with 194 additions and 78 deletions

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
contentSaveFailed: {
id: 'authoring.editorfooter.save.error',
defaultMessage: 'Error: Content save failed. Try again later.',
@@ -24,6 +27,6 @@ export const messages = {
defaultMessage: 'Save',
description: 'Label for Save button',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
loading: {
id: 'authoring.texteditor.title.loading',
defaultMessage: 'Loading...',
@@ -24,6 +27,6 @@ export const messages = {
defaultMessage: 'Save',
description: 'Screen reader label title for icon button to edit the xblock title',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
cancelConfirmTitle: {
id: 'authoring.editorContainer.cancelConfirm.title',
defaultMessage: 'Exit the editor?',
@@ -14,6 +17,6 @@ export const messages = {
defaultMessage: 'OK',
description: 'Label for OK button',
},
};
});
export default messages;

View File

@@ -11,8 +11,10 @@ import { AnswersContainer as AnswersContainerWithoutHOC } from './AnswersContain
jest.mock('@edx/frontend-platform/i18n', () => ({
FormattedMessage: ({ defaultMessage }) => (<p>{defaultMessage}</p>),
defineMessages: m => m,
injectIntl: (args) => args,
intlShape: {},
getLocale: jest.fn(),
}));
jest.mock('./AnswerOption', () => () => <div>MockAnswerOption</div>);

View File

@@ -4,7 +4,7 @@ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { answerOptionProps } from '../../../../../../../data/services/cms/types';
import FeedbackControl from './FeedbackControl';
import { messages } from './messages';
import messages from './messages';
import { ProblemTypeKeys } from '../../../../../../../data/constants/problem';
export const FeedbackBox = ({

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
feedbackPlaceholder: {
id: 'authoring.answerwidget.feedback.placeholder',
defaultMessage: 'Feedback message',
@@ -29,6 +32,6 @@ export const messages = {
defaultMessage: 'is not selected',
description: 'Bold & underlined text for feedback if option is not selected',
},
};
});
export default messages;

View File

@@ -9,12 +9,15 @@ import * as module from './hooks';
jest.mock('react', () => {
const updateState = jest.fn();
return {
updateState,
useEffect: jest.fn(),
useState: jest.fn(val => ([{ state: val }, (newVal) => updateState({ val, newVal })])),
};
});
jest.mock('@edx/frontend-platform/i18n', () => ({
defineMessages: m => m,
}));
jest.mock('../../../../../data/redux', () => ({
actions: {
problem: {

View File

@@ -1,4 +1,6 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
answerWidgetTitle: {
id: 'authoring.answerwidget.answer.answerWidgetTitle',
defaultMessage: 'Answers',
@@ -54,6 +56,5 @@ export const messages = {
defaultMessage: 'is not selected',
description: 'Bold & underlined text for feedback if option is not selected',
},
};
});
export default messages;

View File

@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';
import { selectors } from '../../../../../data/redux';
import { messages } from './messages';
import messages from './messages';
import TinyMceWidget from '../../../../../sharedComponents/TinyMceWidget';
import { prepareEditorRef } from '../../../../../sharedComponents/TinyMceWidget/hooks';

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
solutionWidgetTitle: {
id: 'authoring.problemEditor.explanationwidget.explanationWidgetTitle',
defaultMessage: 'Explanation',
@@ -14,6 +17,6 @@ export const messages = {
defaultMessage: 'Enter your explanation',
description: 'Placeholder text for tinyMCE editor',
},
};
});
export default messages;

View File

@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { injectIntl, FormattedMessage, intlShape } from '@edx/frontend-platform/i18n';
import { selectors } from '../../../../../data/redux';
import { messages } from './messages';
import messages from './messages';
import TinyMceWidget from '../../../../../sharedComponents/TinyMceWidget';
import { prepareEditorRef } from '../../../../../sharedComponents/TinyMceWidget/hooks';

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
questionWidgetTitle: {
id: 'authoring.questionwidget.question.questionWidgetTitle',
defaultMessage: 'Question',
@@ -9,6 +12,6 @@ export const messages = {
defaultMessage: 'Enter your question',
description: 'Placeholder text for tinyMCE editor',
},
};
});
export default messages;

View File

@@ -15,6 +15,10 @@ jest.mock('react', () => {
};
});
jest.mock('@edx/frontend-platform/i18n', () => ({
defineMessages: m => m,
}));
jest.mock('../../../../../data/redux', () => ({
actions: {
problem: {

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
settingsWidgetTitle: {
id: 'authoring.problemeditor.settings.settingsWidgetTitle',
defaultMessage: 'Settings',
@@ -185,17 +188,17 @@ export const messages = {
description: 'button to switch to the advanced mode of the editor.',
},
ConfirmSwitchMessage: {
id: 'authoring.problemeditor.settings.switchtoadvancededitor.message',
id: 'authoring.problemeditor.settings.switchtoadvancededitor.ConfirmSwitchMessage',
defaultMessage: 'If you use the advanced editor, this problem will be converted to OLX and you will not be able to return to the simple editor.',
description: 'message to confirm that a user wants to use the advanced editor',
},
ConfirmSwitchMessageTitle: {
id: 'authoring.problemeditor.settings.switchtoadvancededitor.message',
id: 'authoring.problemeditor.settings.switchtoadvancededitor.ConfirmSwitchMessageTitle',
defaultMessage: 'Convert to OLX?',
description: 'message to confirm that a user wants to use the advanced editor',
},
ConfirmSwitchButtonLabel: {
id: 'authoring.problemeditor.settings.switchtoadvancededitor.message',
id: 'authoring.problemeditor.settings.switchtoadvancededitor.ConfirmSwitchButtonLabel',
defaultMessage: 'Switch to advanced editor',
description: 'message to confirm that a user wants to use the advanced editor',
},
@@ -209,5 +212,6 @@ export const messages = {
defaultMessage: 'Provide an explanation for the correct answer.',
description: 'Solution Explanation text',
},
};
});
export default messages;

View File

@@ -12,6 +12,10 @@ jest.mock('react', () => {
};
});
jest.mock('@edx/frontend-platform/i18n', () => ({
defineMessages: m => m,
}));
const state = new MockUseState(hooks);
describe('Problem settings hooks', () => {

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
generalFeebackSettingTitle: {
id: 'authoring.problemeditor.settings.generalFeebackSettingTitle',
defaultMessage: 'General Feedback',
@@ -19,5 +22,5 @@ export const messages = {
defaultMessage: 'None',
description: 'message which informs use there is no general feedback set.',
},
};
});
export default messages;

View File

@@ -12,6 +12,10 @@ jest.mock('react', () => {
};
});
jest.mock('@edx/frontend-platform/i18n', () => ({
defineMessages: m => m,
}));
const state = new MockUseState(hooks);
describe('groupFeedbackCardHooks', () => {

View File

@@ -1,6 +1,9 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
noGroupFeedbackSummary: {
id: 'authoring.problemeditor.settings.GroupFeedbackSummary.message',
id: 'authoring.problemeditor.settings.GroupFeedbackSummary.nonMessage',
defaultMessage: 'None',
description: 'message to confirm that a user wants to use the advanced editor',
},
@@ -24,5 +27,6 @@ export const messages = {
defaultMessage: 'Group Feedback',
description: 'label for group feedback setting',
},
};
});
export default messages;

View File

@@ -12,6 +12,10 @@ jest.mock('react', () => {
};
});
jest.mock('@edx/frontend-platform/i18n', () => ({
defineMessages: m => m,
}));
const state = new MockUseState(hooks);
describe('Problem settings hooks', () => {

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
randomizationSettingTitle: {
id: 'authoring.problemeditor.settings.randomization.SettingTitle',
defaultMessage: 'Randomization',
@@ -14,5 +17,6 @@ export const messages = {
defaultMessage: 'No Python based randomization is present in this problem.',
description: 'text shown when no randomization option is given',
},
};
});
export default messages;

View File

@@ -1,4 +1,6 @@
const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
toleranceSettingTitle: {
id: 'problemEditor.settings.tolerance.title',
defaultMessage: 'Tolerance',
@@ -42,5 +44,6 @@ const messages = {
description: 'A possible value type for a tolerance',
},
};
});
export default messages;

View File

@@ -16,7 +16,7 @@ exports[`SwitchToAdvancedEditorCard snapshot snapshot: SwitchToAdvancedEditorCar
<FormattedMessage
defaultMessage="Switch to advanced editor"
description="message to confirm that a user wants to use the advanced editor"
id="authoring.problemeditor.settings.switchtoadvancededitor.message"
id="authoring.problemeditor.settings.switchtoadvancededitor.ConfirmSwitchButtonLabel"
/>
</Button>
}
@@ -27,14 +27,14 @@ exports[`SwitchToAdvancedEditorCard snapshot snapshot: SwitchToAdvancedEditorCar
<FormattedMessage
defaultMessage="Convert to OLX?"
description="message to confirm that a user wants to use the advanced editor"
id="authoring.problemeditor.settings.switchtoadvancededitor.message"
id="authoring.problemeditor.settings.switchtoadvancededitor.ConfirmSwitchMessageTitle"
/>
}
>
<FormattedMessage
defaultMessage="If you use the advanced editor, this problem will be converted to OLX and you will not be able to return to the simple editor."
description="message to confirm that a user wants to use the advanced editor"
id="authoring.problemeditor.settings.switchtoadvancededitor.message"
id="authoring.problemeditor.settings.switchtoadvancededitor.ConfirmSwitchMessage"
/>
</BaseModal>
<Button

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
selectTypeTitle: {
id: 'authoring.problemEditor.selectType.title',
defaultMessage: 'Select problem type',
@@ -24,6 +27,6 @@ export const messages = {
defaultMessage: 'Select',
description: 'Screen reader label for select button.',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
advanceProblemButtonLabel: {
id: 'authoring.problemEditor.problemSelect.advanceButton.label',
defaultMessage: 'Advanced problem types',
@@ -69,6 +72,6 @@ export const messages = {
defaultMessage: 'Learn more about advanced problem types',
description: 'Label for Learn more about advanced problem types button',
},
};
});
export default messages;

View File

@@ -1,9 +1,12 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
blockFailed: {
id: 'authoring.problemEditor.blockFailed',
defaultMessage: 'Problem failed to load',
description: 'Error message for problem block failing to load',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
couldNotLoadTextContext: {
id: 'authoring.texteditor.load.error',
defaultMessage: 'Error: Could Not Load Text Content',
@@ -9,6 +12,6 @@ export const messages = {
defaultMessage: 'loading',
description: 'Loading message for spinner screenreader text.',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
titleLabel: {
id: 'authoring.videoeditor.handout.title.label',
defaultMessage: 'Handout',
@@ -45,6 +48,6 @@ export const messages = {
defaultMessage: 'Download',
description: 'Message Presented To user for action to download handout',
},
};
});
export default messages;

View File

@@ -21,7 +21,7 @@ import {
import { actions } from '../../../../../../data/redux';
import { LicenseLevel, LicenseTypes } from '../../../../../../data/constants/licenses';
import { messages } from './messages';
import messages from './messages';
export const LicenseDetails = ({
license,

View File

@@ -13,7 +13,7 @@ import {
import { LicenseTypes } from '../../../../../../data/constants/licenses';
import LicenseBlurb from './LicenseBlurb';
import { messages } from './messages';
import messages from './messages';
export const LicenseDisplay = ({
license,

View File

@@ -2,7 +2,7 @@ import { FormattedMessage } from '@edx/frontend-platform/i18n';
import { actions } from '../../../../../../data/redux';
import { LicenseTypes } from '../../../../../../data/constants/licenses';
import * as module from './hooks';
import { messages } from './messages';
import messages from './messages';
jest.mock('../../../../../../data/redux', () => ({
actions: {

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
title: {
id: 'authoring.videoeditor.license.title',
defaultMessage: 'License',
@@ -119,6 +122,6 @@ export const messages = {
defaultMessage: 'You reserve all rights for your work.',
description: 'All Rights Reserved section message',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
title: {
id: 'authoring.videoeditor.thumbnail.title',
defaultMessage: 'Thumbnail',
@@ -56,6 +59,6 @@ export const messages = {
description:
' Message presented to user when file size of image is less than 2 KB or larger than 2 MB',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
title: {
id: 'authoring.videoeditor.transcripts.title',
defaultMessage: 'Transcripts',
@@ -114,6 +117,6 @@ export const messages = {
defaultMessage: 'We found transcript for this video on YouTube. Would you like to import it now?',
description: 'Message for import transcript card asking user if they want to import transcript',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
titleLabel: {
id: 'authoring.videoeditor.videoSource.title.label',
defaultMessage: 'Video source',
@@ -78,6 +81,6 @@ export const messages = {
defaultMessage: 'Add a video URL',
description: 'Label for add a video URL button',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
expandAltText: {
id: 'authoring.videoeditor.expand',
defaultMessage: 'Expand',
@@ -77,6 +80,6 @@ export const messages = {
defaultMessage: 'Other video',
description: 'Shown on the preview card if the video source could not be identified.',
},
};
});
export default messages;

View File

@@ -13,7 +13,7 @@ import { RequestKeys } from '../../data/constants/requests';
import EditorContainer from '../EditorContainer';
import VideoEditorModal from './components/VideoEditorModal';
import { ErrorContext, errorsHook, fetchVideoContent } from './hooks';
import { messages } from './messages';
import messages from './messages';
export const VideoEditor = ({
onClose,

View File

@@ -1,9 +1,12 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
spinnerScreenReaderText: {
id: 'authoring.videoEditor.spinnerScreenReaderText',
defaultMessage: 'loading',
description: 'Loading message for spinner screenreader text.',
},
};
});
export default messages;

View File

@@ -1,9 +1,12 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
couldNotFindEditor: {
id: 'authoring.editorpage.selecteditor.error',
defaultMessage: 'Error: Could Not find Editor',
description: 'Error Message Dispayed When An unsopported Editor is desired in V2',
},
};
});
export default messages;

View File

@@ -1,9 +1,12 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
cancelButtonLabel: {
id: 'authoring.baseModal.cancelButtonLabel',
defaultMessage: 'Cancel',
description: 'Label for cancel button.',
},
};
});
export default messages;

View File

@@ -1,9 +1,12 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
escapeHTMLButtonLabel: {
id: 'authoring.texteditor.codeEditor.escapeHTMLButton',
defaultMessage: 'Unescape HTML Literals',
description: 'Label For escape special html charectars button',
},
};
});
export default messages;

View File

@@ -1,9 +1,12 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
errorTitle: {
id: 'authoring.texteditor.selectimagemodal.error.errorTitle',
defaultMessage: 'Error',
description: 'Title of message presented to user when something goes wrong',
},
};
});
export default messages;

View File

@@ -1,4 +1,6 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
unexpectedError: {
id: 'unexpected.error.message.text',
defaultMessage: 'An unexpected error occurred. Please click the button below to refresh the page.',
@@ -9,5 +11,6 @@ export const messages = {
defaultMessage: 'Try again',
description: 'text for button that tries to reload the app by refreshing the page',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
// index
titleLabel: {
id: 'authoring.texteditor.imagesettingsmodal.titleLabel',
@@ -86,6 +89,6 @@ export const messages = {
defaultMessage: 'Enter a value less than or equal to 100.',
description: 'Message feedback for user below the dimension fields.',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
nextButtonLabel: {
id: 'authoring.texteditor.selectimagemodal.next.label',
defaultMessage: 'Next',
@@ -89,6 +92,6 @@ export const messages = {
description:
'Message presented to user when clicking Next without selecting an image',
},
};
});
export default messages;

View File

@@ -1,4 +1,7 @@
export const messages = {
import { defineMessages } from '@edx/frontend-platform/i18n';
const messages = defineMessages({
saveButtonLabel: {
id: 'authoring.texteditor.sourcecodemodal.next.label',
defaultMessage: 'Save',
@@ -9,5 +12,6 @@ export const messages = {
defaultMessage: 'Edit Source Code',
description: 'Title for the source code editor',
},
};
});
export default messages;