diff --git a/src/.eslintrc.js b/src/.eslintrc.js index ff88f0f27fa8ea14df758aed45b27ba9460806d5..8dab3c69cf9190d315e6c0851ed3760cbf583c8b 100644 --- a/src/.eslintrc.js +++ b/src/.eslintrc.js @@ -11,6 +11,7 @@ module.exports = { 'import/no-mutable-exports': 'error', 'import/no-commonjs': 'error', 'import/no-amd': 'error', - 'import/no-nodejs-modules': 'error' + 'import/no-nodejs-modules': 'error', + 'react/jsx-no-literals': 'error' } }; diff --git a/src/components/browser-modal/browser-modal.jsx b/src/components/browser-modal/browser-modal.jsx index 94a9d8545e78e5df72a8ef29c7a6d5114149deb1..772ba6575463526d22a1f805a8147d0056fe4dcd 100644 --- a/src/components/browser-modal/browser-modal.jsx +++ b/src/components/browser-modal/browser-modal.jsx @@ -43,18 +43,34 @@ const BrowserModal = ({intl, ...props}) => ( className={styles.backButton} onClick={props.onBack} > - Back + <FormattedMessage + defaultMessage="Back" + description="Button to go back in unsupported browser modal" + id="gui.unsupportedBrowser.back" + /> </button> </Box> <div className={styles.faqLinkText}> - To learn more, go to the {' '} - <a - className={styles.faqLink} - href="//scratch.mit.edu/preview-faq" - > - preview FAQ - </a>. + <FormattedMessage + defaultMessage="To learn more, go to the {previewFaqLink}." + description="Invitation to try 3.0 preview" + id="gui.unsupportedBrowser.previewfaq" + values={{ + previewFaqLink: ( + <a + className={styles.faqLink} + href="//scratch.mit.edu/preview-faq" + > + <FormattedMessage + defaultMessage="Preview FAQ" + description="link to Scratch 3.0 preview FAQ page" + id="gui.unsupportedBrowser.previewfaqlink" + /> + </a> + ) + }} + /> </div> </Box> </ReactModal> diff --git a/src/components/crash-message/crash-message.jsx b/src/components/crash-message/crash-message.jsx index d5fc45d163072d6394c5da665ee6427b6d0159a4..8ea44473986d0803ba37706943dc1d494a7fd1a2 100644 --- a/src/components/crash-message/crash-message.jsx +++ b/src/components/crash-message/crash-message.jsx @@ -1,3 +1,9 @@ +/* eslint-disable react/jsx-no-literals */ +/* + @todo Rule is disabled because this component is rendered outside the + intl provider right now so cannot be translated. +*/ + import PropTypes from 'prop-types'; import React from 'react'; import Box from '../box/box.jsx'; diff --git a/src/components/menu-bar/menu-bar.jsx b/src/components/menu-bar/menu-bar.jsx index 7e098b65f0047c02abf4574ac55bda3f78f20486..d5a4b9fa1a228c09a32aeb189a43114373f0e167 100644 --- a/src/components/menu-bar/menu-bar.jsx +++ b/src/components/menu-bar/menu-bar.jsx @@ -123,20 +123,43 @@ const MenuBar = props => ( })} onMouseUp={props.onClickFile} > - <div className={classNames(styles.fileMenu)}>File</div> + <div className={classNames(styles.fileMenu)}> + <FormattedMessage + defaultMessage="File" + description="Text for file dropdown menu" + id="gui.menuBar.file" + /> + </div> <MenuBarMenu open={props.fileMenuOpen} onRequestClose={props.onRequestCloseFile} > <MenuItemTooltip id="new"> - <MenuItem>New</MenuItem> + <MenuItem> + <FormattedMessage + defaultMessage="New" + description="Menu bar item for creating a new project" + id="gui.menuBar.new" + /> + </MenuItem> </MenuItemTooltip> <MenuSection> <MenuItemTooltip id="save"> - <MenuItem>Save now</MenuItem> + <MenuItem> + <FormattedMessage + defaultMessage="Save now" + description="Menu bar item for saving now" + id="gui.menuBar.saveNow" + /> + </MenuItem> </MenuItemTooltip> <MenuItemTooltip id="copy"> - <MenuItem>Save as a copy</MenuItem> + <MenuItem> + <FormattedMessage + defaultMessage="Save as a copy" + description="Menu bar item for saving as a copy" + id="gui.menuBar.saveAsCopy" + /></MenuItem> </MenuItemTooltip> </MenuSection> <MenuSection> @@ -145,7 +168,11 @@ const MenuBar = props => ( onClick={loadProject} {...loadProps} > - Upload from your computer + <FormattedMessage + defaultMessage="Upload from your computer" + description="Menu bar item for uploading a project from your computer" + id="gui.menuBar.uploadFromComputer" + /> {renderFileInput()} </MenuItem> )}</ProjectLoader> @@ -154,7 +181,11 @@ const MenuBar = props => ( onClick={saveProject} {...saveProps} > - Download to your computer + <FormattedMessage + defaultMessage="Download to your computer" + description="Menu bar item for downloading a project" + id="gui.menuBar.downloadToComputer" + /> </MenuItem> )}</ProjectSaver> </MenuSection> @@ -166,20 +197,44 @@ const MenuBar = props => ( })} onMouseUp={props.onClickEdit} > - <div className={classNames(styles.editMenu)}>Edit</div> + <div className={classNames(styles.editMenu)}> + <FormattedMessage + defaultMessage="Edit" + description="Text for edit dropdown menu" + id="gui.menuBar.edit" + /> + </div> <MenuBarMenu open={props.editMenuOpen} onRequestClose={props.onRequestCloseEdit} > <MenuItemTooltip id="undo"> - <MenuItem>Undo</MenuItem> + <MenuItem> + <FormattedMessage + defaultMessage="Undo" + description="Menu bar item for undoing" + id="gui.menuBar.undo" + /> + </MenuItem> </MenuItemTooltip> <MenuItemTooltip id="redo"> - <MenuItem>Redo</MenuItem> + <MenuItem> + <FormattedMessage + defaultMessage="Redo" + description="Menu bar item for redoing" + id="gui.menuBar.redo" + /> + </MenuItem> </MenuItemTooltip> <MenuSection> <MenuItemTooltip id="turbo"> - <MenuItem>Turbo mode</MenuItem> + <MenuItem> + <FormattedMessage + defaultMessage="Turbo mode" + description="Menu bar item for toggling turbo mode" + id="gui.menuBar.turboMode" + /> + </MenuItem> </MenuItemTooltip> </MenuSection> </MenuBarMenu> @@ -262,7 +317,9 @@ const MenuBar = props => ( className={styles.profileIcon} src={profileIcon} /> - <span>scratch-cat</span> + <span> + {'scratch-cat' /* @todo username */} + </span> <img className={styles.dropdownCaretIcon} src={dropdownCaret} diff --git a/src/components/prompt/prompt.jsx b/src/components/prompt/prompt.jsx index ec20aeb61da9bee899f7c13d03996a198c844497..4feffeb0c8205784938ba1e586c0027bc9de6a05 100644 --- a/src/components/prompt/prompt.jsx +++ b/src/components/prompt/prompt.jsx @@ -59,13 +59,21 @@ const PromptComponent = props => ( className={styles.cancelButton} onClick={props.onCancel} > - Cancel + <FormattedMessage + defaultMessage="Cancel" + description="Button in prompt for cancelling the dialog" + id="gui.prompt.cancel" + /> </button> <button className={styles.okButton} onClick={props.onOk} > - OK + <FormattedMessage + defaultMessage="OK" + description="Button in prompt for confirming the dialog" + id="gui.prompt.ok" + /> </button> </Box> </Box> diff --git a/src/components/question/question.jsx b/src/components/question/question.jsx index 11927bf9652cadd55eeee2654a1429c5250f30dc..2e8b9c9a53159006eb6e92548b60fbb4910c760f 100644 --- a/src/components/question/question.jsx +++ b/src/components/question/question.jsx @@ -28,7 +28,7 @@ const QuestionComponent = props => { className={styles.questionSubmitButton} onClick={onClick} > - ✔︎ + {'✔︎' /* @todo should this be an image? */} </button> </div> </div> diff --git a/src/components/record-modal/playback-step.jsx b/src/components/record-modal/playback-step.jsx index c233a3277794fb8decf0730201e209b0b1ce45d0..40167172deac8f7167c88d2046b89a92d5162886 100644 --- a/src/components/record-modal/playback-step.jsx +++ b/src/components/record-modal/playback-step.jsx @@ -31,6 +31,11 @@ const messages = defineMessages({ defaultMessage: 'Save', description: 'Loading/Save button in recording playback', id: 'gui.playbackStep.saveMsg' + }, + reRecordMsg: { + defaultMessage: 'Re-record', + description: 'Button to re-record sound in recording playback', + id: 'gui.playbackStep.reRecordMsg' } }); @@ -88,7 +93,8 @@ const PlaybackStep = props => ( <img draggable={false} src={backIcon} - /> Re-record + /> + {props.intl.formatMessage(messages.reRecordMsg)} </button> <button className={styles.okButton} diff --git a/src/components/stage-selector/stage-selector.jsx b/src/components/stage-selector/stage-selector.jsx index 66fbc1fe9e20bf3afdc3944daa45091e94fe6d1b..d08cf353fa9825614b495abeb94ffdfae2c08cfa 100644 --- a/src/components/stage-selector/stage-selector.jsx +++ b/src/components/stage-selector/stage-selector.jsx @@ -60,7 +60,13 @@ const StageSelector = props => { {...componentProps} > <div className={styles.header}> - <div className={styles.headerTitle}>Stage</div> + <div className={styles.headerTitle}> + <FormattedMessage + defaultMessage="Stage" + description="Label for the stage in the stage selector" + id="gui.stageSelector.stage" + /> + </div> </div> {url ? ( <CostumeCanvas diff --git a/test/helpers/selenium-helper.js b/test/helpers/selenium-helper.js index f88959e5478c9cdaf94bb8d5e32fccb5c4907294..8ed17e2f7ab76cef8f0b97988f71b8092733af0c 100644 --- a/test/helpers/selenium-helper.js +++ b/test/helpers/selenium-helper.js @@ -87,7 +87,7 @@ class SeleniumHelper { } clickButton (text) { - return this.clickXpath(`//button[contains(text(), '${text}')]`); + return this.clickXpath(`//button//*[contains(text(), '${text}')]`); } getLogs (whitelist) {