scratch-blocks 2.0.2 → 2.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/commitlint.config.js +2 -2
- package/dist/main.mjs +1 -2
- package/dist/types/msg/scratch_msgs.d.ts.map +1 -1
- package/dist/types/src/block_reporting.d.ts.map +1 -1
- package/dist/types/src/blocks/colour.d.ts +0 -19
- package/dist/types/src/blocks/colour.d.ts.map +1 -1
- package/dist/types/src/blocks/control.d.ts +0 -19
- package/dist/types/src/blocks/control.d.ts.map +1 -1
- package/dist/types/src/blocks/data.d.ts +0 -19
- package/dist/types/src/blocks/data.d.ts.map +1 -1
- package/dist/types/src/blocks/event.d.ts +0 -19
- package/dist/types/src/blocks/event.d.ts.map +1 -1
- package/dist/types/src/blocks/looks.d.ts +0 -19
- package/dist/types/src/blocks/looks.d.ts.map +1 -1
- package/dist/types/src/blocks/math.d.ts +0 -19
- package/dist/types/src/blocks/math.d.ts.map +1 -1
- package/dist/types/src/blocks/matrix.d.ts +0 -19
- package/dist/types/src/blocks/matrix.d.ts.map +1 -1
- package/dist/types/src/blocks/motion.d.ts +0 -19
- package/dist/types/src/blocks/motion.d.ts.map +1 -1
- package/dist/types/src/blocks/note.d.ts +0 -19
- package/dist/types/src/blocks/note.d.ts.map +1 -1
- package/dist/types/src/blocks/operators.d.ts +0 -19
- package/dist/types/src/blocks/operators.d.ts.map +1 -1
- package/dist/types/src/blocks/procedures.d.ts +6 -9
- package/dist/types/src/blocks/procedures.d.ts.map +1 -1
- package/dist/types/src/blocks/sensing.d.ts +0 -19
- package/dist/types/src/blocks/sensing.d.ts.map +1 -1
- package/dist/types/src/blocks/sound.d.ts +0 -19
- package/dist/types/src/blocks/sound.d.ts.map +1 -1
- package/dist/types/src/blocks/text.d.ts +0 -19
- package/dist/types/src/blocks/text.d.ts.map +1 -1
- package/dist/types/src/blocks/vertical_extensions.d.ts +0 -19
- package/dist/types/src/blocks/vertical_extensions.d.ts.map +1 -1
- package/dist/types/src/checkable_continuous_flyout.d.ts +2 -7
- package/dist/types/src/checkable_continuous_flyout.d.ts.map +1 -1
- package/dist/types/src/checkbox_bubble.d.ts +13 -12
- package/dist/types/src/checkbox_bubble.d.ts.map +1 -1
- package/dist/types/src/colours.d.ts.map +1 -1
- package/dist/types/src/constants.d.ts +0 -7
- package/dist/types/src/constants.d.ts.map +1 -1
- package/dist/types/src/context_menu_items.d.ts +0 -5
- package/dist/types/src/context_menu_items.d.ts.map +1 -1
- package/dist/types/src/data_category.d.ts +2 -4
- package/dist/types/src/data_category.d.ts.map +1 -1
- package/dist/types/src/events/events_block_comment_base.d.ts +2 -3
- package/dist/types/src/events/events_block_comment_base.d.ts.map +1 -1
- package/dist/types/src/events/events_block_comment_change.d.ts +0 -5
- package/dist/types/src/events/events_block_comment_change.d.ts.map +1 -1
- package/dist/types/src/events/events_block_comment_collapse.d.ts +0 -5
- package/dist/types/src/events/events_block_comment_collapse.d.ts.map +1 -1
- package/dist/types/src/events/events_block_comment_create.d.ts +0 -5
- package/dist/types/src/events/events_block_comment_create.d.ts.map +1 -1
- package/dist/types/src/events/events_block_comment_delete.d.ts +0 -5
- package/dist/types/src/events/events_block_comment_delete.d.ts.map +1 -1
- package/dist/types/src/events/events_block_comment_move.d.ts +0 -5
- package/dist/types/src/events/events_block_comment_move.d.ts.map +1 -1
- package/dist/types/src/events/events_block_comment_resize.d.ts +0 -5
- package/dist/types/src/events/events_block_comment_resize.d.ts.map +1 -1
- package/dist/types/src/events/events_block_drag_end.d.ts +1 -2
- package/dist/types/src/events/events_block_drag_end.d.ts.map +1 -1
- package/dist/types/src/events/events_block_drag_outside.d.ts +1 -2
- package/dist/types/src/events/events_block_drag_outside.d.ts.map +1 -1
- package/dist/types/src/events/events_scratch_variable_create.d.ts +0 -5
- package/dist/types/src/events/events_scratch_variable_create.d.ts.map +1 -1
- package/dist/types/src/fields/field_colour_slider.d.ts +3 -27
- package/dist/types/src/fields/field_colour_slider.d.ts.map +1 -1
- package/dist/types/src/fields/field_matrix.d.ts +0 -19
- package/dist/types/src/fields/field_matrix.d.ts.map +1 -1
- package/dist/types/src/fields/field_note.d.ts +8 -23
- package/dist/types/src/fields/field_note.d.ts.map +1 -1
- package/dist/types/src/fields/field_textinput_removable.d.ts +2 -4
- package/dist/types/src/fields/field_textinput_removable.d.ts.map +1 -1
- package/dist/types/src/fields/field_variable_getter.d.ts +0 -19
- package/dist/types/src/fields/field_variable_getter.d.ts.map +1 -1
- package/dist/types/src/fields/field_vertical_separator.d.ts +0 -19
- package/dist/types/src/fields/field_vertical_separator.d.ts.map +1 -1
- package/dist/types/src/fields/scratch_field_angle.d.ts +0 -19
- package/dist/types/src/fields/scratch_field_angle.d.ts.map +1 -1
- package/dist/types/src/fields/scratch_field_dropdown.d.ts +0 -5
- package/dist/types/src/fields/scratch_field_dropdown.d.ts.map +1 -1
- package/dist/types/src/fields/scratch_field_number.d.ts +0 -19
- package/dist/types/src/fields/scratch_field_number.d.ts.map +1 -1
- package/dist/types/src/fields/scratch_field_variable.d.ts +4 -7
- package/dist/types/src/fields/scratch_field_variable.d.ts.map +1 -1
- package/dist/types/src/flyout_checkbox_icon.d.ts +2 -3
- package/dist/types/src/flyout_checkbox_icon.d.ts.map +1 -1
- package/dist/types/src/glows.d.ts +1 -3
- package/dist/types/src/glows.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +50 -51
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/procedures.d.ts +6 -8
- package/dist/types/src/procedures.d.ts.map +1 -1
- package/dist/types/src/recyclable_block_flyout_inflater.d.ts +3 -5
- package/dist/types/src/recyclable_block_flyout_inflater.d.ts.map +1 -1
- package/dist/types/src/renderer/bowler_hat.d.ts +2 -3
- package/dist/types/src/renderer/bowler_hat.d.ts.map +1 -1
- package/dist/types/src/renderer/cat/cat_face.d.ts +6 -5
- package/dist/types/src/renderer/cat/cat_face.d.ts.map +1 -1
- package/dist/types/src/renderer/cat/constants.d.ts +2 -2
- package/dist/types/src/renderer/cat/constants.d.ts.map +1 -1
- package/dist/types/src/renderer/cat/drawer.d.ts +3 -4
- package/dist/types/src/renderer/cat/drawer.d.ts.map +1 -1
- package/dist/types/src/renderer/cat/path_object.d.ts +2 -3
- package/dist/types/src/renderer/cat/path_object.d.ts.map +1 -1
- package/dist/types/src/renderer/cat/render_info.d.ts +3 -4
- package/dist/types/src/renderer/cat/render_info.d.ts.map +1 -1
- package/dist/types/src/renderer/cat/renderer.d.ts +6 -7
- package/dist/types/src/renderer/cat/renderer.d.ts.map +1 -1
- package/dist/types/src/renderer/constants.d.ts +4 -4
- package/dist/types/src/renderer/constants.d.ts.map +1 -1
- package/dist/types/src/renderer/drawer.d.ts +5 -4
- package/dist/types/src/renderer/drawer.d.ts.map +1 -1
- package/dist/types/src/renderer/path_object.d.ts +1 -3
- package/dist/types/src/renderer/path_object.d.ts.map +1 -1
- package/dist/types/src/renderer/render_info.d.ts +3 -4
- package/dist/types/src/renderer/render_info.d.ts.map +1 -1
- package/dist/types/src/renderer/renderer.d.ts +8 -15
- package/dist/types/src/renderer/renderer.d.ts.map +1 -1
- package/dist/types/src/scratch_block_paster.d.ts +0 -5
- package/dist/types/src/scratch_block_paster.d.ts.map +1 -1
- package/dist/types/src/scratch_blocks_utils.d.ts +0 -20
- package/dist/types/src/scratch_blocks_utils.d.ts.map +1 -1
- package/dist/types/src/scratch_comment_bubble.d.ts +1 -4
- package/dist/types/src/scratch_comment_bubble.d.ts.map +1 -1
- package/dist/types/src/scratch_comment_icon.d.ts +2 -3
- package/dist/types/src/scratch_comment_icon.d.ts.map +1 -1
- package/dist/types/src/scratch_connection_checker.d.ts +0 -5
- package/dist/types/src/scratch_connection_checker.d.ts.map +1 -1
- package/dist/types/src/scratch_continuous_category.d.ts +5 -5
- package/dist/types/src/scratch_continuous_category.d.ts.map +1 -1
- package/dist/types/src/scratch_continuous_toolbox.d.ts +3 -6
- package/dist/types/src/scratch_continuous_toolbox.d.ts.map +1 -1
- package/dist/types/src/scratch_dragger.d.ts +1 -10
- package/dist/types/src/scratch_dragger.d.ts.map +1 -1
- package/dist/types/src/scratch_insertion_marker_previewer.d.ts +0 -5
- package/dist/types/src/scratch_insertion_marker_previewer.d.ts.map +1 -1
- package/dist/types/src/scratch_variable_map.d.ts +0 -5
- package/dist/types/src/scratch_variable_map.d.ts.map +1 -1
- package/dist/types/src/scratch_variable_model.d.ts +1 -2
- package/dist/types/src/scratch_variable_model.d.ts.map +1 -1
- package/dist/types/src/scratch_zoom_controls.d.ts +4 -6
- package/dist/types/src/scratch_zoom_controls.d.ts.map +1 -1
- package/dist/types/src/shadows.d.ts +2 -2
- package/dist/types/src/shadows.d.ts.map +1 -1
- package/dist/types/src/status_indicator_label.d.ts +4 -6
- package/dist/types/src/status_indicator_label.d.ts.map +1 -1
- package/dist/types/src/status_indicator_label_flyout_inflater.d.ts +1 -6
- package/dist/types/src/status_indicator_label_flyout_inflater.d.ts.map +1 -1
- package/dist/types/src/variables.d.ts +4 -8
- package/dist/types/src/variables.d.ts.map +1 -1
- package/dist/types/src/xml.d.ts +2 -3
- package/dist/types/src/xml.d.ts.map +1 -1
- package/dist/types/tests/jsunit/block_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/connection_db_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/connection_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/event_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/extensions_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/field_number_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/field_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/field_variable_getter_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/field_variable_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/gesture_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/input_test.d.ts +1 -0
- package/dist/types/tests/jsunit/input_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/json_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/names_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/procedure_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/scratch_block_comment_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/svg_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/test_utilities.d.ts.map +1 -1
- package/dist/types/tests/jsunit/utils_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/variable_map_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/variable_model_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/widget_div_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/workspace_comment_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/workspace_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/workspace_undo_redo_test.d.ts.map +1 -1
- package/dist/types/tests/jsunit/xml_test.d.ts.map +1 -1
- package/dist/types/tests/workspace_svg/workspace_svg_test.d.ts.map +1 -1
- package/eslint.config.mjs +69 -0
- package/i18n/create_scratch_msgs.js +44 -45
- package/i18n/js_to_json.js +40 -32
- package/i18n/json_to_js.js +37 -37
- package/i18n/sync_tx_translations.js +64 -65
- package/i18n/test_scratch_msgs.js +66 -63
- package/msg/js/en.js +289 -287
- package/msg/json/en.json +284 -284
- package/msg/messages.js +289 -287
- package/msg/scratch_msgs.js +22959 -22970
- package/package.json +6 -3
- package/prettier.config.mjs +3 -0
- package/release.config.js +7 -7
- package/renovate.json5 +7 -9
- package/src/block_reporting.ts +15 -18
- package/src/blocks/colour.ts +12 -15
- package/src/blocks/control.ts +167 -177
- package/src/blocks/data.ts +225 -292
- package/src/blocks/event.ts +121 -123
- package/src/blocks/looks.ts +165 -167
- package/src/blocks/math.ts +44 -46
- package/src/blocks/matrix.ts +11 -13
- package/src/blocks/motion.ts +151 -153
- package/src/blocks/note.ts +11 -13
- package/src/blocks/operators.ts +158 -160
- package/src/blocks/procedures.ts +415 -523
- package/src/blocks/sensing.ts +163 -165
- package/src/blocks/sound.ts +58 -60
- package/src/blocks/text.ts +10 -12
- package/src/blocks/vertical_extensions.ts +86 -102
- package/src/checkable_continuous_flyout.ts +25 -42
- package/src/checkbox_bubble.ts +83 -100
- package/src/colours.ts +35 -37
- package/src/constants.ts +22 -29
- package/src/context_menu_items.ts +56 -81
- package/src/css.ts +3 -4
- package/src/data_category.ts +137 -251
- package/src/events/events_block_comment_base.ts +21 -31
- package/src/events/events_block_comment_change.ts +21 -42
- package/src/events/events_block_comment_collapse.ts +22 -43
- package/src/events/events_block_comment_create.ts +29 -46
- package/src/events/events_block_comment_delete.ts +10 -19
- package/src/events/events_block_comment_move.ts +27 -52
- package/src/events/events_block_comment_resize.ts +28 -55
- package/src/events/events_block_drag_end.ts +16 -26
- package/src/events/events_block_drag_outside.ts +12 -22
- package/src/events/events_scratch_variable_create.ts +33 -56
- package/src/fields/field_colour_slider.ts +173 -228
- package/src/fields/field_matrix.ts +200 -269
- package/src/fields/field_note.ts +272 -377
- package/src/fields/field_textinput_removable.ts +25 -40
- package/src/fields/field_variable_getter.ts +26 -31
- package/src/fields/field_vertical_separator.ts +19 -24
- package/src/fields/scratch_field_angle.ts +150 -186
- package/src/fields/scratch_field_dropdown.ts +15 -19
- package/src/fields/scratch_field_number.ts +123 -180
- package/src/fields/scratch_field_variable.ts +54 -75
- package/src/flyout_checkbox_icon.ts +18 -28
- package/src/glows.ts +51 -58
- package/src/index.ts +119 -133
- package/src/procedures.ts +146 -213
- package/src/recyclable_block_flyout_inflater.ts +14 -25
- package/src/renderer/bowler_hat.ts +6 -8
- package/src/renderer/cat/cat_face.ts +98 -99
- package/src/renderer/cat/constants.ts +67 -87
- package/src/renderer/cat/drawer.ts +21 -27
- package/src/renderer/cat/path_object.ts +3 -5
- package/src/renderer/cat/render_info.ts +5 -8
- package/src/renderer/cat/renderer.ts +11 -15
- package/src/renderer/constants.ts +34 -49
- package/src/renderer/drawer.ts +35 -51
- package/src/renderer/path_object.ts +4 -10
- package/src/renderer/render_info.ts +36 -56
- package/src/renderer/renderer.ts +16 -29
- package/src/scratch_block_paster.ts +12 -20
- package/src/scratch_blocks_utils.ts +4 -7
- package/src/scratch_comment_bubble.ts +70 -101
- package/src/scratch_comment_icon.ts +74 -123
- package/src/scratch_connection_checker.ts +7 -17
- package/src/scratch_continuous_category.ts +24 -28
- package/src/scratch_continuous_toolbox.ts +20 -27
- package/src/scratch_dragger.ts +42 -81
- package/src/scratch_insertion_marker_previewer.ts +6 -11
- package/src/scratch_variable_map.ts +5 -12
- package/src/scratch_variable_model.ts +4 -11
- package/src/scratch_zoom_controls.ts +101 -156
- package/src/shadows.ts +32 -37
- package/src/status_indicator_label.ts +54 -67
- package/src/status_indicator_label_flyout_inflater.ts +11 -21
- package/src/variables.ts +89 -138
- package/src/xml.ts +21 -35
- package/tsconfig.json +2 -6
- package/types/continuous-toolbox.d.ts +1 -1
- package/dist/main.mjs.LICENSE.txt +0 -163
|
@@ -8,64 +8,61 @@
|
|
|
8
8
|
* token that has developer access.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
const usage = `
|
|
12
12
|
Pull supported language translations from Transifex. Usage:
|
|
13
13
|
node sync_tx_translations.js
|
|
14
14
|
NOTE: TX_TOKEN environment variable needs to be set with a Transifex API token. See
|
|
15
15
|
the Localization page on the GUI wiki for information about setting up Transifex.
|
|
16
|
-
|
|
16
|
+
`
|
|
17
17
|
// Fail immediately if the TX_TOKEN is not defined
|
|
18
18
|
if (!process.env.TX_TOKEN || process.argv.length !== 2) {
|
|
19
|
-
process.stdout.write(usage)
|
|
20
|
-
process.exit(1)
|
|
21
|
-
}
|
|
19
|
+
process.stdout.write(usage)
|
|
20
|
+
process.exit(1)
|
|
21
|
+
}
|
|
22
22
|
|
|
23
|
-
const fs = require('fs')
|
|
24
|
-
const path = require('path')
|
|
25
|
-
const assert = require('assert')
|
|
26
|
-
const locales = require('scratch-l10n').default
|
|
27
|
-
const {txPull} = require('scratch-l10n/lib/transifex.js')
|
|
23
|
+
const fs = require('fs')
|
|
24
|
+
const path = require('path')
|
|
25
|
+
const assert = require('assert')
|
|
26
|
+
const locales = require('scratch-l10n').default
|
|
27
|
+
const { txPull } = require('scratch-l10n/lib/transifex.js')
|
|
28
28
|
|
|
29
29
|
// Globals
|
|
30
|
-
const PATH_OUTPUT = path.resolve(__dirname, '../msg')
|
|
30
|
+
const PATH_OUTPUT = path.resolve(__dirname, '../msg')
|
|
31
31
|
const PROJECT = 'scratch-editor'
|
|
32
|
-
const RESOURCE = 'blocks'
|
|
33
|
-
const MODE = 'reviewed'
|
|
32
|
+
const RESOURCE = 'blocks'
|
|
33
|
+
const MODE = 'reviewed'
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
en = JSON.parse(en);
|
|
39
|
-
const enKeys = Object.keys(en).sort().toString();
|
|
35
|
+
let en = fs.readFileSync(path.resolve(__dirname, '../msg/json/en.json'))
|
|
36
|
+
en = JSON.parse(en)
|
|
37
|
+
const enKeys = Object.keys(en).sort().toString()
|
|
40
38
|
|
|
41
39
|
// Check that translation is valid:
|
|
42
40
|
// entry: array [key, translation] corresponding to a single string from <locale>.json
|
|
43
41
|
// - messages with placeholders have the same number of placeholders
|
|
44
42
|
// - messages must not have newlines embedded
|
|
45
43
|
const validateEntry = function (entry) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
};
|
|
44
|
+
const re = /(%\d)/g
|
|
45
|
+
const [key, translation] = entry
|
|
46
|
+
const enMatch = en[key].match(re)
|
|
47
|
+
const tMatch = translation.match(re)
|
|
48
|
+
const enCount = enMatch ? enMatch.length : 0
|
|
49
|
+
const tCount = tMatch ? tMatch.length : 0
|
|
50
|
+
assert.strictEqual(tCount, enCount, `${key}:${en[key]} - "${translation}" placeholder mismatch`)
|
|
51
|
+
if (enCount > 0) {
|
|
52
|
+
assert.notStrictEqual(tMatch, null, `${key} is missing a placeholder: ${translation}`)
|
|
53
|
+
assert.strictEqual(
|
|
54
|
+
tMatch.sort().toString(),
|
|
55
|
+
enMatch.sort().toString(),
|
|
56
|
+
`${key} is missing or has duplicate placeholders: ${translation}`,
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
assert.strictEqual(translation.match(/[\n]/), null, `${key} contains a newline character ${translation}`)
|
|
60
|
+
}
|
|
64
61
|
|
|
65
62
|
const validate = function (json, name) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
63
|
+
assert.strictEqual(Object.keys(json).sort().toString(), enKeys, `${name}: Locale json keys do not match en.json`)
|
|
64
|
+
Object.entries(json).forEach(validateEntry)
|
|
65
|
+
}
|
|
69
66
|
|
|
70
67
|
let file = `// This file was automatically generated. Do not modify.
|
|
71
68
|
|
|
@@ -75,37 +72,39 @@ goog.provide('Blockly.ScratchMsgs.allLocales');
|
|
|
75
72
|
|
|
76
73
|
goog.require('Blockly.ScratchMsgs');
|
|
77
74
|
|
|
78
|
-
|
|
75
|
+
`
|
|
79
76
|
|
|
80
77
|
let localeMap = {
|
|
81
78
|
'aa-dj': 'aa_DJ',
|
|
82
79
|
'es-419': 'es_419',
|
|
83
80
|
'pt-br': 'pt_BR',
|
|
84
81
|
'zh-cn': 'zh_CN',
|
|
85
|
-
'zh-tw': 'zh_TW'
|
|
86
|
-
}
|
|
82
|
+
'zh-tw': 'zh_TW',
|
|
83
|
+
}
|
|
87
84
|
|
|
88
85
|
const getLocaleData = async function (locale) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
Promise.all(Object.keys(locales).map(getLocaleData))
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
86
|
+
let txLocale = localeMap[locale] || locale
|
|
87
|
+
const data = await txPull(PROJECT, RESOURCE, txLocale, MODE)
|
|
88
|
+
return {
|
|
89
|
+
locale: locale,
|
|
90
|
+
translations: data,
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
Promise.all(Object.keys(locales).map(getLocaleData))
|
|
95
|
+
.then(function (values) {
|
|
96
|
+
values.forEach(function (translation) {
|
|
97
|
+
validate(translation.translations, translation.locale)
|
|
98
|
+
file += '\n'
|
|
99
|
+
file += `Blockly.ScratchMsgs.locales["${translation.locale}"] =\n`
|
|
100
|
+
file += JSON.stringify(translation.translations, null, 4)
|
|
101
|
+
file += ';\n'
|
|
102
|
+
})
|
|
103
|
+
file += '// End of combined translations\n'
|
|
104
|
+
// write combined file
|
|
105
|
+
fs.writeFileSync(`${PATH_OUTPUT}/scratch_msgs.js`, file)
|
|
106
|
+
})
|
|
107
|
+
.catch(err => {
|
|
108
|
+
console.error(err)
|
|
109
|
+
process.exit(1)
|
|
110
|
+
})
|
|
@@ -1,87 +1,90 @@
|
|
|
1
|
-
const es = require('event-stream')
|
|
2
|
-
const fs = require('fs')
|
|
3
|
-
const path = require('path')
|
|
4
|
-
const assert = require('assert')
|
|
1
|
+
const es = require('event-stream')
|
|
2
|
+
const fs = require('fs')
|
|
3
|
+
const path = require('path')
|
|
4
|
+
const assert = require('assert')
|
|
5
5
|
|
|
6
6
|
// current locale and keys for the locale
|
|
7
|
-
let locale = ''
|
|
8
|
-
let keys = []
|
|
7
|
+
let locale = ''
|
|
8
|
+
let keys = []
|
|
9
9
|
|
|
10
10
|
// current English keys
|
|
11
|
-
let en = fs.readFileSync(path.resolve(__dirname, '../msg/json/en.json'))
|
|
12
|
-
en = JSON.parse(en)
|
|
13
|
-
const enKeys = Object.keys(en)
|
|
11
|
+
let en = fs.readFileSync(path.resolve(__dirname, '../msg/json/en.json'))
|
|
12
|
+
en = JSON.parse(en)
|
|
13
|
+
const enKeys = Object.keys(en)
|
|
14
14
|
|
|
15
15
|
// File paths
|
|
16
|
-
const PATH_INPUT = path.resolve(__dirname, '../msg/scratch_msgs.js')
|
|
16
|
+
const PATH_INPUT = path.resolve(__dirname, '../msg/scratch_msgs.js')
|
|
17
17
|
|
|
18
18
|
// Match lines of the scratch_msgs file
|
|
19
19
|
// Blockly.ScratchMsgs.locales indicates the start of a new locale
|
|
20
20
|
// ": " marks a "key": "value" pair
|
|
21
21
|
// Also match the end of the generated file so the last set of keys can be checked
|
|
22
22
|
const match = function (str) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
if (str.indexOf('Blockly.ScratchMsgs.locales') !== 0) return true
|
|
24
|
+
if (str.indexOf('": "') !== 0) return true
|
|
25
|
+
if (str.indexOf('End of combined translations') !== 0) return true
|
|
26
|
+
return false
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// Extract key and value from message definition, or locale when it changes
|
|
30
30
|
const extract = function (str) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
let m = str.match(/locales\["(.+)"\]/)
|
|
32
|
+
if (m) {
|
|
33
|
+
// locale changed
|
|
34
|
+
return m[1]
|
|
35
|
+
}
|
|
36
|
+
m = str.match(/"(.*)": "(.*)",?$/)
|
|
37
|
+
if (m) {
|
|
38
|
+
return {
|
|
39
|
+
key: m[1],
|
|
40
|
+
value: m[2],
|
|
35
41
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
// return a string for the end of the file so that validate will check the last set of keys
|
|
44
|
-
m = str.match(/^\/\/ End of combined translations$/);
|
|
45
|
-
if (m) return 'last';
|
|
46
|
-
return null;
|
|
47
|
-
};
|
|
42
|
+
}
|
|
43
|
+
// return a string for the end of the file so that validate will check the last set of keys
|
|
44
|
+
m = str.match(/^\/\/ End of combined translations$/)
|
|
45
|
+
if (m) return 'last'
|
|
46
|
+
return null
|
|
47
|
+
}
|
|
48
48
|
|
|
49
49
|
const validateKeys = function () {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
// ignore empty keys first time through
|
|
51
|
+
if (keys.length === 0) return
|
|
52
|
+
assert.strictEqual(keys.length, Object.keys(en).length, `scratch_msgs-${locale}: number of keys doesn't match`)
|
|
53
|
+
keys.map(item => assert(enKeys.includes(item), `scratch_msgs-${locale}: has key ${item} not in en`))
|
|
54
|
+
enKeys.map(item => assert(keys.includes(item), `scratch_msgs-${locale}: is missing key ${item}`))
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// Stream input and push each match to the storage object
|
|
58
|
-
const stream = fs.createReadStream(PATH_INPUT)
|
|
58
|
+
const stream = fs.createReadStream(PATH_INPUT)
|
|
59
59
|
stream
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
// change locale, and reset keys array
|
|
75
|
-
locale = result;
|
|
76
|
-
keys = [];
|
|
77
|
-
} else {
|
|
78
|
-
keys.push(result.key);
|
|
60
|
+
.pipe(es.split('\n'))
|
|
61
|
+
.pipe(
|
|
62
|
+
es.mapSync(function (str) {
|
|
63
|
+
if (!match(str)) return
|
|
64
|
+
const result = extract(str)
|
|
65
|
+
if (!result) return
|
|
66
|
+
if (typeof result === 'string') {
|
|
67
|
+
// locale changed or end of file, validate the current collection of keys
|
|
68
|
+
try {
|
|
69
|
+
validateKeys()
|
|
70
|
+
} catch (err) {
|
|
71
|
+
console.error('Key validation FAILED: %O', err)
|
|
72
|
+
process.exit(1)
|
|
79
73
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
74
|
+
// change locale, and reset keys array
|
|
75
|
+
locale = result
|
|
76
|
+
keys = []
|
|
77
|
+
} else {
|
|
78
|
+
keys.push(result.key)
|
|
79
|
+
}
|
|
80
|
+
}),
|
|
81
|
+
)
|
|
82
|
+
.pipe(
|
|
83
|
+
es.wait(function (err) {
|
|
84
|
+
if (err) {
|
|
85
|
+
console.error(err)
|
|
86
|
+
process.exit(1)
|
|
87
|
+
}
|
|
88
|
+
process.exit(0)
|
|
89
|
+
}),
|
|
90
|
+
)
|