diff --git a/src/lib/blocks.js b/src/lib/blocks.js
index b7ecc928a9b8e3d02430b95601b9683ad79b38a1..9ca3c6d7ed7b3a33cb83d65992f56f7e9f1cecfe 100644
--- a/src/lib/blocks.js
+++ b/src/lib/blocks.js
@@ -245,9 +245,15 @@ export default function (vm) {
                     // The block was in the flyout so look up future block info there.
                     lookupBlocks = vm.runtime.flyoutBlocks;
                 }
+                const sort = function (options) {
+                    options.sort((str1, str2) => str1.localeCompare(str2, [], {
+                        sensitivity: 'base',
+                        numeric: true
+                    }));
+                };
                 // Get all the stage variables (no lists) so we can add them to menu when the stage is selected.
                 const stageVariableOptions = vm.runtime.getTargetForStage().getAllVariableNamesInScopeByType('');
-                stageVariableOptions.sort(ScratchBlocks.scratchBlocksUtils.compareStrings);
+                sort(stageVariableOptions);
                 const stageVariableMenuItems = stageVariableOptions.map(variable => [variable, variable]);
                 if (sensingOfBlock.inputs.OBJECT.shadow !== sensingOfBlock.inputs.OBJECT.block) {
                     // There's a block dropped on top of the menu. It'd be nice to evaluate it and
@@ -266,7 +272,7 @@ export default function (vm) {
                 // The target should exist, but there are ways for it not to (e.g. #4203).
                 if (target) {
                     spriteVariableOptions = target.getAllVariableNamesInScopeByType('', true);
-                    spriteVariableOptions.sort(ScratchBlocks.scratchBlocksUtils.compareStrings);
+                    sort(spriteVariableOptions);
                 }
                 const spriteVariableMenuItems = spriteVariableOptions.map(variable => [variable, variable]);
                 return spriteOptions.concat(spriteVariableMenuItems);