From f270b36f64a6af0c8071f40e0b18d894e27252a4 Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Mon, 4 Feb 2019 09:25:17 -0500 Subject: [PATCH 1/2] Initialize locale on ScratchBlocks before initial workspace injection This fixes a problem where having a non-default locale set during the initial load would display the blocks in the default toolbox in the wrong language, because the toolbox recycling toggle in setLocale does not work on initial load because there is no editing target to refresh. --- src/containers/blocks.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/containers/blocks.jsx b/src/containers/blocks.jsx index 98a01db1b..c982bfecc 100644 --- a/src/containers/blocks.jsx +++ b/src/containers/blocks.jsx @@ -87,6 +87,7 @@ class Blocks extends React.Component { componentDidMount () { this.ScratchBlocks.FieldColourSlider.activateEyedropper_ = this.props.onActivateColorPicker; this.ScratchBlocks.Procedures.externalProcedureDefCallback = this.props.onActivateCustomProcedures; + this.ScratchBlocks.ScratchMsgs.setLocale(this.props.locale); const workspaceConfig = defaultsDeep({}, Blocks.defaultOptions, @@ -526,7 +527,7 @@ Blocks.propTypes = { extensionLibraryVisible: PropTypes.bool, isRtl: PropTypes.bool, isVisible: PropTypes.bool, - locale: PropTypes.string, + locale: PropTypes.string.isRequired, messages: PropTypes.objectOf(PropTypes.string), onActivateColorPicker: PropTypes.func, onActivateCustomProcedures: PropTypes.func, From 984eb1b073ed8b154f169794e91d5aec71917819 Mon Sep 17 00:00:00 2001 From: Paul Kaplan Date: Mon, 4 Feb 2019 09:33:43 -0500 Subject: [PATCH 2/2] Include a regression test for #4476 --- test/integration/localization.test.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/test/integration/localization.test.js b/test/integration/localization.test.js index 4fb1e8d59..e7cc64e90 100644 --- a/test/integration/localization.test.js +++ b/test/integration/localization.test.js @@ -24,7 +24,7 @@ describe('Localization', () => { await driver.quit(); }); - test('Localization', async () => { + test('Switching languages', async () => { await loadUri(uri); await clickXpath('//button[@title="Try It"]'); @@ -52,4 +52,15 @@ describe('Localization', () => { const logs = await getLogs(); await expect(logs).toEqual([]); }); + + // Regression test for #4476, blocks in wrong language when loaded with locale + test('Loading with locale shows correct blocks', async () => { + await loadUri(`${uri}?locale=de`); + await clickXpath('//button[@title="Ausprobieren!"]'); // "Try It" + await clickText('Fühlen'); // Sensing category in German + await new Promise(resolve => setTimeout(resolve, 1000)); // wait for blocks to scroll + await clickText('Antwort'); // Find the "answer" block in German + const logs = await getLogs(); + await expect(logs).toEqual([]); + }); });