Skip to content
Snippets Groups Projects
Unverified Commit 683241ca authored by chrisgarrity's avatar chrisgarrity Committed by GitHub
Browse files

Localize extension blocks (#968)

Localizes the pen extension:
- loads all pen locale information - may want to consider dynamically loading locales later.
parent 89673ebe
No related branches found
No related tags found
No related merge requests found
......@@ -43,6 +43,7 @@ class Blocks extends React.Component {
'onBlockGlowOn',
'onBlockGlowOff',
'handleExtensionAdded',
'handleBlocksInfoUpdate',
'onTargetsUpdate',
'onVisualReport',
'onWorkspaceUpdate',
......@@ -72,6 +73,7 @@ class Blocks extends React.Component {
addFunctionListener(this.workspace, 'zoom', this.onWorkspaceMetricsChange);
this.attachVM();
this.props.vm.setLocale(this.props.locale, this.props.messages);
}
shouldComponentUpdate (nextProps, nextState) {
return (
......@@ -79,10 +81,15 @@ class Blocks extends React.Component {
this.props.isVisible !== nextProps.isVisible ||
this.props.toolboxXML !== nextProps.toolboxXML ||
this.props.extensionLibraryVisible !== nextProps.extensionLibraryVisible ||
this.props.customProceduresVisible !== nextProps.customProceduresVisible
this.props.customProceduresVisible !== nextProps.customProceduresVisible ||
this.props.locale !== nextProps.locale
);
}
componentDidUpdate (prevProps) {
if (prevProps.locale !== this.props.locale) {
this.props.vm.setLocale(this.props.locale, this.props.messages);
}
if (prevProps.toolboxXML !== this.props.toolboxXML) {
const selectedCategoryName = this.workspace.toolbox_.getSelectedItem().name_;
this.workspace.updateToolbox(this.props.toolboxXML);
......@@ -120,6 +127,7 @@ class Blocks extends React.Component {
this.props.vm.addListener('workspaceUpdate', this.onWorkspaceUpdate);
this.props.vm.addListener('targetsUpdate', this.onTargetsUpdate);
this.props.vm.addListener('EXTENSION_ADDED', this.handleExtensionAdded);
this.props.vm.addListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate);
}
detachVM () {
this.props.vm.removeListener('SCRIPT_GLOW_ON', this.onScriptGlowOn);
......@@ -130,6 +138,7 @@ class Blocks extends React.Component {
this.props.vm.removeListener('workspaceUpdate', this.onWorkspaceUpdate);
this.props.vm.removeListener('targetsUpdate', this.onTargetsUpdate);
this.props.vm.removeListener('EXTENSION_ADDED', this.handleExtensionAdded);
this.props.vm.removeListener('BLOCKSINFO_UPDATE', this.handleBlocksInfoUpdate);
}
updateToolboxBlockValue (id, value) {
const block = this.workspace
......@@ -212,6 +221,10 @@ class Blocks extends React.Component {
const toolboxXML = makeToolboxXML(target.isStage, target.id, dynamicBlocksXML);
this.props.updateToolboxState(toolboxXML);
}
handleBlocksInfoUpdate (blocksInfo) {
// @todo Later we should replace this to avoid all the warnings from redefining blocks.
this.handleExtensionAdded(blocksInfo);
}
handleCategorySelected (categoryName) {
this.workspace.toolbox_.setSelectedCategoryByName(categoryName);
}
......@@ -288,6 +301,8 @@ Blocks.propTypes = {
customProceduresVisible: PropTypes.bool,
extensionLibraryVisible: PropTypes.bool,
isVisible: PropTypes.bool,
locale: PropTypes.string,
messages: PropTypes.objectOf(PropTypes.string),
onActivateColorPicker: PropTypes.func,
onActivateCustomProcedures: PropTypes.func,
onRequestCloseCustomProcedures: PropTypes.func,
......@@ -351,6 +366,8 @@ Blocks.defaultProps = {
const mapStateToProps = state => ({
extensionLibraryVisible: state.modals.extensionLibrary,
locale: state.intl.locale,
messages: state.intl.messages,
toolboxXML: state.toolbox.toolboxXML,
customProceduresVisible: state.customProcedures.active
});
......
......@@ -6,8 +6,9 @@ import defaultsDeep from 'lodash.defaultsdeep';
import localeData from 'scratch-l10n';
import guiMessages from 'scratch-l10n/locales/gui-msgs';
import paintMessages from 'scratch-l10n/locales/paint-msgs';
import penMessages from 'scratch-l10n/locales/pen-msgs';
const combinedMessages = defaultsDeep({}, guiMessages.messages, paintMessages.messages);
const combinedMessages = defaultsDeep({}, guiMessages.messages, paintMessages.messages, penMessages.messages);
Object.keys(localeData).forEach(locale => {
// TODO: will need to handle locales not in the default intl - see www/custom-locales
......
......@@ -219,4 +219,24 @@ describe('costumes, sounds and variables', () => {
const logs = await getLogs(errorWhitelist);
await expect(logs).toEqual([]);
});
test('Localization', async () => {
await loadUri(uri);
await clickText('Blocks');
await clickText('Extensions');
await clickText('Pen', modalScope); // Modal closes
await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for scroll animation
await clickText('English');
await clickText('Deutsch');
await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks refresh
await clickText('Pen'); // will need to be updated when 'Pen' is translated
// Make sure "Add Sprite" has changed to "Figur hinzufügen"
await findByText('Figur hinzufügen');
// Find the stamp block in German
await findByText('Abdruck');
const logs = await getLogs(errorWhitelist);
await expect(logs).toEqual([]);
});
});
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment