diff --git a/translated_images/tw/plant1.a876180d8659acb9.webp b/translated_images/tw/plant1.a876180d8659acb9.webp deleted file mode 100644 index 0afdb8492..000000000 Binary files a/translated_images/tw/plant1.a876180d8659acb9.webp and /dev/null differ diff --git a/translated_images/tw/plant10.2f2c47804ae52dd3.webp b/translated_images/tw/plant10.2f2c47804ae52dd3.webp deleted file mode 100644 index a972d3197..000000000 Binary files a/translated_images/tw/plant10.2f2c47804ae52dd3.webp and /dev/null differ diff --git a/translated_images/tw/plant11.0ce0081b0ef17aa1.webp b/translated_images/tw/plant11.0ce0081b0ef17aa1.webp deleted file mode 100644 index 83718f403..000000000 Binary files a/translated_images/tw/plant11.0ce0081b0ef17aa1.webp and /dev/null differ diff --git a/translated_images/tw/plant12.6b934c4312a00228.webp b/translated_images/tw/plant12.6b934c4312a00228.webp deleted file mode 100644 index abfcadc6c..000000000 Binary files a/translated_images/tw/plant12.6b934c4312a00228.webp and /dev/null differ diff --git a/translated_images/tw/plant13.37d6ab2e2481421f.webp b/translated_images/tw/plant13.37d6ab2e2481421f.webp deleted file mode 100644 index 77816483d..000000000 Binary files a/translated_images/tw/plant13.37d6ab2e2481421f.webp and /dev/null differ diff --git a/translated_images/tw/plant14.908791477a46eb7f.webp b/translated_images/tw/plant14.908791477a46eb7f.webp deleted file mode 100644 index 9b2eea637..000000000 Binary files a/translated_images/tw/plant14.908791477a46eb7f.webp and /dev/null differ diff --git a/translated_images/tw/plant2.9e45efea224115b0.webp b/translated_images/tw/plant2.9e45efea224115b0.webp deleted file mode 100644 index e6b517d90..000000000 Binary files a/translated_images/tw/plant2.9e45efea224115b0.webp and /dev/null differ diff --git a/translated_images/tw/plant3.06efdd0fa0c4b115.webp b/translated_images/tw/plant3.06efdd0fa0c4b115.webp deleted file mode 100644 index fa73f15cf..000000000 Binary files a/translated_images/tw/plant3.06efdd0fa0c4b115.webp and /dev/null differ diff --git a/translated_images/tw/plant4.3b78072b427727c6.webp b/translated_images/tw/plant4.3b78072b427727c6.webp deleted file mode 100644 index be231012e..000000000 Binary files a/translated_images/tw/plant4.3b78072b427727c6.webp and /dev/null differ diff --git a/translated_images/tw/plant5.8ec58b18ac336fa8.webp b/translated_images/tw/plant5.8ec58b18ac336fa8.webp deleted file mode 100644 index 4e295e185..000000000 Binary files a/translated_images/tw/plant5.8ec58b18ac336fa8.webp and /dev/null differ diff --git a/translated_images/tw/plant6.ca4ff8372e6676b1.webp b/translated_images/tw/plant6.ca4ff8372e6676b1.webp deleted file mode 100644 index 46a89a545..000000000 Binary files a/translated_images/tw/plant6.ca4ff8372e6676b1.webp and /dev/null differ diff --git a/translated_images/tw/plant7.194d5a42fcf5a88c.webp b/translated_images/tw/plant7.194d5a42fcf5a88c.webp deleted file mode 100644 index 420dca0b9..000000000 Binary files a/translated_images/tw/plant7.194d5a42fcf5a88c.webp and /dev/null differ diff --git a/translated_images/tw/plant8.7b247809ab0eb492.webp b/translated_images/tw/plant8.7b247809ab0eb492.webp deleted file mode 100644 index 9b4c15c2f..000000000 Binary files a/translated_images/tw/plant8.7b247809ab0eb492.webp and /dev/null differ diff --git a/translated_images/tw/plant9.8fe614c01ded1b1e.webp b/translated_images/tw/plant9.8fe614c01ded1b1e.webp deleted file mode 100644 index 893f89540..000000000 Binary files a/translated_images/tw/plant9.8fe614c01ded1b1e.webp and /dev/null differ diff --git a/translated_images/tw/player.137ee0e47f895ffc.webp b/translated_images/tw/player.137ee0e47f895ffc.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.137ee0e47f895ffc.webp and /dev/null differ diff --git a/translated_images/tw/player.2887422f6982c3cd.webp b/translated_images/tw/player.2887422f6982c3cd.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.2887422f6982c3cd.webp and /dev/null differ diff --git a/translated_images/tw/player.391fed427ede24f5.webp b/translated_images/tw/player.391fed427ede24f5.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.391fed427ede24f5.webp and /dev/null differ diff --git a/translated_images/tw/player.3c4f50182552a73a.webp b/translated_images/tw/player.3c4f50182552a73a.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.3c4f50182552a73a.webp and /dev/null differ diff --git a/translated_images/tw/player.47bc9de0714c723d.webp b/translated_images/tw/player.47bc9de0714c723d.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.47bc9de0714c723d.webp and /dev/null differ diff --git a/translated_images/tw/player.57b3107c03012695.webp b/translated_images/tw/player.57b3107c03012695.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.57b3107c03012695.webp and /dev/null differ diff --git a/translated_images/tw/player.606f85953e5e564e.webp b/translated_images/tw/player.606f85953e5e564e.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.606f85953e5e564e.webp and /dev/null differ diff --git a/translated_images/tw/player.680ea4c619b54fe1.webp b/translated_images/tw/player.680ea4c619b54fe1.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.680ea4c619b54fe1.webp and /dev/null differ diff --git a/translated_images/tw/player.bfe14f110bddf56d.webp b/translated_images/tw/player.bfe14f110bddf56d.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.bfe14f110bddf56d.webp and /dev/null differ diff --git a/translated_images/tw/player.c99c25d54a615ca0.webp b/translated_images/tw/player.c99c25d54a615ca0.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.c99c25d54a615ca0.webp and /dev/null differ diff --git a/translated_images/tw/player.dd24c1afa8c71e9b.webp b/translated_images/tw/player.dd24c1afa8c71e9b.webp deleted file mode 100644 index 879c28a80..000000000 Binary files a/translated_images/tw/player.dd24c1afa8c71e9b.webp and /dev/null differ diff --git a/translated_images/tw/playerDamaged.181703f652fd5176.webp b/translated_images/tw/playerDamaged.181703f652fd5176.webp deleted file mode 100644 index 00d3377d9..000000000 Binary files a/translated_images/tw/playerDamaged.181703f652fd5176.webp and /dev/null differ diff --git a/translated_images/tw/playerLeft.0f928412e66ba5d9.webp b/translated_images/tw/playerLeft.0f928412e66ba5d9.webp deleted file mode 100644 index 0856babce..000000000 Binary files a/translated_images/tw/playerLeft.0f928412e66ba5d9.webp and /dev/null differ diff --git a/translated_images/tw/playerRight.e4825f489e29f737.webp b/translated_images/tw/playerRight.e4825f489e29f737.webp deleted file mode 100644 index 8d6696a22..000000000 Binary files a/translated_images/tw/playerRight.e4825f489e29f737.webp and /dev/null differ diff --git a/translated_images/tw/playground-choice.1d23ba7d407f4758.webp b/translated_images/tw/playground-choice.1d23ba7d407f4758.webp deleted file mode 100644 index 5010c3433..000000000 Binary files a/translated_images/tw/playground-choice.1d23ba7d407f4758.webp and /dev/null differ diff --git a/translated_images/tw/playground.d2b927122224ff8f.webp b/translated_images/tw/playground.d2b927122224ff8f.webp deleted file mode 100644 index bbd1ff813..000000000 Binary files a/translated_images/tw/playground.d2b927122224ff8f.webp and /dev/null differ diff --git a/translated_images/tw/preview.9215f0a010074476.webp b/translated_images/tw/preview.9215f0a010074476.webp deleted file mode 100644 index 76ebad6fb..000000000 Binary files a/translated_images/tw/preview.9215f0a010074476.webp and /dev/null differ diff --git a/translated_images/tw/profiler.5a4a62479c5df01c.webp b/translated_images/tw/profiler.5a4a62479c5df01c.webp deleted file mode 100644 index 9061f1a51..000000000 Binary files a/translated_images/tw/profiler.5a4a62479c5df01c.webp and /dev/null differ diff --git a/translated_images/tw/project-on-vscode.dev.e79815a9a95ee7fe.webp b/translated_images/tw/project-on-vscode.dev.e79815a9a95ee7fe.webp deleted file mode 100644 index bda2bba4a..000000000 Binary files a/translated_images/tw/project-on-vscode.dev.e79815a9a95ee7fe.webp and /dev/null differ diff --git a/translated_images/tw/result.96ef01f607bf856a.webp b/translated_images/tw/result.96ef01f607bf856a.webp deleted file mode 100644 index 727299424..000000000 Binary files a/translated_images/tw/result.96ef01f607bf856a.webp and /dev/null differ diff --git a/translated_images/tw/screen1.baccbba0f1f93364.webp b/translated_images/tw/screen1.baccbba0f1f93364.webp deleted file mode 100644 index e59d8f18b..000000000 Binary files a/translated_images/tw/screen1.baccbba0f1f93364.webp and /dev/null differ diff --git a/translated_images/tw/screen2.123c82a831a1d14a.webp b/translated_images/tw/screen2.123c82a831a1d14a.webp deleted file mode 100644 index c0ae6e0c1..000000000 Binary files a/translated_images/tw/screen2.123c82a831a1d14a.webp and /dev/null differ diff --git a/translated_images/tw/screenshot.0a1ee0d123df681b.webp b/translated_images/tw/screenshot.0a1ee0d123df681b.webp deleted file mode 100644 index 95b613b19..000000000 Binary files a/translated_images/tw/screenshot.0a1ee0d123df681b.webp and /dev/null differ diff --git a/translated_images/tw/screenshot.e7a5ad659e364568.webp b/translated_images/tw/screenshot.e7a5ad659e364568.webp deleted file mode 100644 index fbcda3041..000000000 Binary files a/translated_images/tw/screenshot.e7a5ad659e364568.webp and /dev/null differ diff --git a/translated_images/tw/screenshot_gray.0c796099a1f9f25e.webp b/translated_images/tw/screenshot_gray.0c796099a1f9f25e.webp deleted file mode 100644 index 7f0303b25..000000000 Binary files a/translated_images/tw/screenshot_gray.0c796099a1f9f25e.webp and /dev/null differ diff --git a/translated_images/tw/shield.1b9412b7ca6610ab.webp b/translated_images/tw/shield.1b9412b7ca6610ab.webp deleted file mode 100644 index a2e065ca1..000000000 Binary files a/translated_images/tw/shield.1b9412b7ca6610ab.webp and /dev/null differ diff --git a/translated_images/tw/snapshot.97750180ebcad737.webp b/translated_images/tw/snapshot.97750180ebcad737.webp deleted file mode 100644 index 86fe936e7..000000000 Binary files a/translated_images/tw/snapshot.97750180ebcad737.webp and /dev/null differ diff --git a/translated_images/tw/spa.268ec73b41f992c2.webp b/translated_images/tw/spa.268ec73b41f992c2.webp deleted file mode 100644 index 7f35a28cd..000000000 Binary files a/translated_images/tw/spa.268ec73b41f992c2.webp and /dev/null differ diff --git a/translated_images/tw/speedLine.5bcabb93f48b5ae1.webp b/translated_images/tw/speedLine.5bcabb93f48b5ae1.webp deleted file mode 100644 index 57b77b342..000000000 Binary files a/translated_images/tw/speedLine.5bcabb93f48b5ae1.webp and /dev/null differ diff --git a/translated_images/tw/spritesheet.bec82852290b14ee.webp b/translated_images/tw/spritesheet.bec82852290b14ee.webp deleted file mode 100644 index 02853f8a0..000000000 Binary files a/translated_images/tw/spritesheet.bec82852290b14ee.webp and /dev/null differ diff --git a/translated_images/tw/starBackground.a897b8acb1b0587d.webp b/translated_images/tw/starBackground.a897b8acb1b0587d.webp deleted file mode 100644 index d112fa03c..000000000 Binary files a/translated_images/tw/starBackground.a897b8acb1b0587d.webp and /dev/null differ diff --git a/translated_images/tw/starBig.72e9c6d0d18f363d.webp b/translated_images/tw/starBig.72e9c6d0d18f363d.webp deleted file mode 100644 index 917791333..000000000 Binary files a/translated_images/tw/starBig.72e9c6d0d18f363d.webp and /dev/null differ diff --git a/translated_images/tw/starSmall.ed78b961dbcd0898.webp b/translated_images/tw/starSmall.ed78b961dbcd0898.webp deleted file mode 100644 index bf86a6e91..000000000 Binary files a/translated_images/tw/starSmall.ed78b961dbcd0898.webp and /dev/null differ diff --git a/translated_images/tw/template.67ad477109d29a2b.webp b/translated_images/tw/template.67ad477109d29a2b.webp deleted file mode 100644 index 824dcbd91..000000000 Binary files a/translated_images/tw/template.67ad477109d29a2b.webp and /dev/null differ diff --git a/translated_images/tw/terrarium-final.0920f16e87c13a84.webp b/translated_images/tw/terrarium-final.0920f16e87c13a84.webp deleted file mode 100644 index 652bea47f..000000000 Binary files a/translated_images/tw/terrarium-final.0920f16e87c13a84.webp and /dev/null differ diff --git a/translated_images/tw/terrarium-final.2f07047ffc597d0a.webp b/translated_images/tw/terrarium-final.2f07047ffc597d0a.webp deleted file mode 100644 index 9d666f12d..000000000 Binary files a/translated_images/tw/terrarium-final.2f07047ffc597d0a.webp and /dev/null differ diff --git a/translated_images/tw/validation-error.8bd23e98d416c22f.webp b/translated_images/tw/validation-error.8bd23e98d416c22f.webp deleted file mode 100644 index cf379c6fc..000000000 Binary files a/translated_images/tw/validation-error.8bd23e98d416c22f.webp and /dev/null differ diff --git a/translated_images/tw/vs-code-index.e2986cf919471eb9.webp b/translated_images/tw/vs-code-index.e2986cf919471eb9.webp deleted file mode 100644 index 81255ea88..000000000 Binary files a/translated_images/tw/vs-code-index.e2986cf919471eb9.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-a11y.8ef3025c858d897a.webp b/translated_images/tw/webdev101-a11y.8ef3025c858d897a.webp deleted file mode 100644 index 8ab2ac618..000000000 Binary files a/translated_images/tw/webdev101-a11y.8ef3025c858d897a.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-css.3f7af5991bf53a20.webp b/translated_images/tw/webdev101-css.3f7af5991bf53a20.webp deleted file mode 100644 index dc11c3bab..000000000 Binary files a/translated_images/tw/webdev101-css.3f7af5991bf53a20.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-github.8846d7971abef6f9.webp b/translated_images/tw/webdev101-github.8846d7971abef6f9.webp deleted file mode 100644 index 4a4de987e..000000000 Binary files a/translated_images/tw/webdev101-github.8846d7971abef6f9.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-html.4389c2067af68e98.webp b/translated_images/tw/webdev101-html.4389c2067af68e98.webp deleted file mode 100644 index cf7edb25d..000000000 Binary files a/translated_images/tw/webdev101-html.4389c2067af68e98.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-js-arrays.439d7528b8a29455.webp b/translated_images/tw/webdev101-js-arrays.439d7528b8a29455.webp deleted file mode 100644 index f2345e5ce..000000000 Binary files a/translated_images/tw/webdev101-js-arrays.439d7528b8a29455.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-js-datatypes.4cc470179730702c.webp b/translated_images/tw/webdev101-js-datatypes.4cc470179730702c.webp deleted file mode 100644 index 0384cb000..000000000 Binary files a/translated_images/tw/webdev101-js-datatypes.4cc470179730702c.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-js-decisions.69e1b20f272dd1f0.webp b/translated_images/tw/webdev101-js-decisions.69e1b20f272dd1f0.webp deleted file mode 100644 index 9ba8f93b6..000000000 Binary files a/translated_images/tw/webdev101-js-decisions.69e1b20f272dd1f0.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-js-functions.be049c4726e94f8b.webp b/translated_images/tw/webdev101-js-functions.be049c4726e94f8b.webp deleted file mode 100644 index 3a4f26aea..000000000 Binary files a/translated_images/tw/webdev101-js-functions.be049c4726e94f8b.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-js.10280393044d7eaa.webp b/translated_images/tw/webdev101-js.10280393044d7eaa.webp deleted file mode 100644 index 5ef4026fd..000000000 Binary files a/translated_images/tw/webdev101-js.10280393044d7eaa.webp and /dev/null differ diff --git a/translated_images/tw/webdev101-programming.d6e3f98e61ac4bff.webp b/translated_images/tw/webdev101-programming.d6e3f98e61ac4bff.webp deleted file mode 100644 index 25567412e..000000000 Binary files a/translated_images/tw/webdev101-programming.d6e3f98e61ac4bff.webp and /dev/null differ diff --git a/translated_images/tw/working-tree-pb.6cd43e5076f23ba3.webp b/translated_images/tw/working-tree-pb.6cd43e5076f23ba3.webp deleted file mode 100644 index a1de196c3..000000000 Binary files a/translated_images/tw/working-tree-pb.6cd43e5076f23ba3.webp and /dev/null differ diff --git a/translated_images/tw/working-tree.c58eec08e6335c79.webp b/translated_images/tw/working-tree.c58eec08e6335c79.webp deleted file mode 100644 index 6dad1bc39..000000000 Binary files a/translated_images/tw/working-tree.c58eec08e6335c79.webp and /dev/null differ diff --git a/translated_images/hk/.co-op-translator.json b/translated_images/zh-HK/.co-op-translator.json similarity index 88% rename from translated_images/hk/.co-op-translator.json rename to translated_images/zh-HK/.co-op-translator.json index 24e7991a7..bb97753de 100644 --- a/translated_images/hk/.co-op-translator.json +++ b/translated_images/zh-HK/.co-op-translator.json @@ -3,858 +3,858 @@ "original_hash": "6b12479c2e6a54160867fa8945c04082", "translation_date": "2026-01-15T16:19:38+00:00", "source_file": "5-browser-extension/1-about-browsers/images/1.png", - "language_code": "hk" + "language_code": "zh-HK" }, "1.cc07a5cbe114ad1d.webp": { "original_hash": "fc436b6749801dd90d0558ae92d56b60", "translation_date": "2026-01-15T16:23:55+00:00", "source_file": "3-terrarium/2-intro-to-css/images/1.png", - "language_code": "hk" + "language_code": "zh-HK" }, "2.1dae52ff08042246.webp": { "original_hash": "3995628a6a986308859d0cb6eed8d787", "translation_date": "2026-01-15T16:19:07+00:00", "source_file": "5-browser-extension/1-about-browsers/images/2.png", - "language_code": "hk" + "language_code": "zh-HK" }, "after-codeswing-extension-pb.0ebddddcf73b5509.webp": { "original_hash": "861d59ec65a7334c5f3a4c02dfe22ceb", "translation_date": "2026-01-15T16:13:42+00:00", "source_file": "8-code-editor/images/after-codeswing-extension-pb.png", - "language_code": "hk" + "language_code": "zh-HK" }, "background.148a8d43afde5730.webp": { "original_hash": "5a50f015fb466782c69063ffebb256de", "translation_date": "2026-01-15T16:07:24+00:00", "source_file": "images/background.png", - "language_code": "hk" + "language_code": "zh-HK" }, "backgroundColor.e19c3c60768150c8.webp": { "original_hash": "b3e10fe033f615ec9d3580cce61eae09", "translation_date": "2026-01-15T16:17:47+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/backgroundColor.png", - "language_code": "hk" + "language_code": "zh-HK" }, "browser-console.efaf0b51aaaf6778.webp": { "original_hash": "8d6c5077d1f133d27c65c0014ef503a9", "translation_date": "2026-01-15T16:20:25+00:00", "source_file": "7-bank-project/2-forms/images/browser-console.png", - "language_code": "hk" + "language_code": "zh-HK" }, "browser.60317c9be8b7f84a.webp": { "original_hash": "aa4461fec006d86899864d991b50cc74", "translation_date": "2026-01-15T16:07:48+00:00", "source_file": "sketchnotes/browser.jpg", - "language_code": "hk" + "language_code": "zh-HK" }, "canvas.fbd605ff8e5b8aff.webp": { "original_hash": "29556305738d345dd023554d788d5477", "translation_date": "2026-01-15T16:05:54+00:00", "source_file": "teaching-files/canvas.png", - "language_code": "hk" + "language_code": "zh-HK" }, "canvas_grid.5f209da785ded492.webp": { "original_hash": "8da354720ffbfd778571aa17402de890", "translation_date": "2026-01-15T16:17:15+00:00", "source_file": "6-space-game/2-drawing-to-canvas/canvas_grid.png", - "language_code": "hk" + "language_code": "zh-HK" }, "character.5c0dd8e067ffd693.webp": { "original_hash": "076bbb4d25a17982c81973b8dba9d4fa", "translation_date": "2026-01-15T16:07:07+00:00", "source_file": "images/character.png", - "language_code": "hk" + "language_code": "zh-HK" }, "click-register.e89a30bf0d4bc9ca.webp": { "original_hash": "ef9688313524664fad6ab9b0e080c758", "translation_date": "2026-01-15T16:20:03+00:00", "source_file": "7-bank-project/2-forms/images/click-register.png", - "language_code": "hk" + "language_code": "zh-HK" }, "clone_repo.5085c48d666ead57.webp": { "original_hash": "28c00f3d5861ab95d188b4f6a2d337df", "translation_date": "2026-01-15T16:23:59+00:00", "source_file": "1-getting-started-lessons/2-github-basics/images/clone_repo.png", - "language_code": "hk" + "language_code": "zh-HK" }, "clone_repo.6a202fb230ab6bdd.webp": { "original_hash": "9261d014674312eece91deae958538cf", "translation_date": "2026-01-15T16:07:17+00:00", "source_file": "images/clone_repo.png", - "language_code": "hk" + "language_code": "zh-HK" }, "codespace.bcecbdf5d2747d3d.webp": { "original_hash": "ff86a65511122ddb448e092969566b0a", "translation_date": "2026-01-15T16:24:05+00:00", "source_file": "9-chat-project/assets/codespace.png", - "language_code": "hk" + "language_code": "zh-HK" }, "create-a-fork.297ab42b4bd0af99.webp": { "original_hash": "10712b80e3dcfa7c44fb8820a6ff3ad3", "translation_date": "2026-01-15T16:14:48+00:00", "source_file": "8-code-editor/images/create-a-fork.png", - "language_code": "hk" + "language_code": "zh-HK" }, "create-new-file-pb.0797800d977ec3eb.webp": { "original_hash": "c149c42e04132f2409651425d6924ffa", "translation_date": "2026-01-15T16:12:51+00:00", "source_file": "8-code-editor/images/create-new-file-pb.png", - "language_code": "hk" + "language_code": "zh-HK" }, "create-new-file.2814e609c2af9aeb.webp": { "original_hash": "cf6df76faeac2d92904e5d877b7bdf69", "translation_date": "2026-01-15T16:12:44+00:00", "source_file": "8-code-editor/images/create-new-file.png", - "language_code": "hk" + "language_code": "zh-HK" }, "createcodespace.0238bbf4d7a8d955.webp": { "original_hash": "4f504323085308f4a0e7b5bfb37e16d7", "translation_date": "2026-01-15T16:06:59+00:00", "source_file": "images/createcodespace.png", - "language_code": "hk" + "language_code": "zh-HK" }, "data-flow.fa2354e0908fecc8.webp": { "original_hash": "c9b82b42fa1973b3b7bfad9c7128c24c", "translation_date": "2026-01-15T16:20:53+00:00", "source_file": "7-bank-project/4-state-management/images/data-flow.png", - "language_code": "hk" + "language_code": "zh-HK" }, "default-vscode-dev.5d06881d65c1b323.webp": { "original_hash": "146fecc3a9da37cb1d5c9d628cd94996", "translation_date": "2026-01-15T16:16:05+00:00", "source_file": "8-code-editor/images/default-vscode-dev.png", - "language_code": "hk" + "language_code": "zh-HK" }, "dialog.93bba104afeb79f1.webp": { "original_hash": "c56b5ad7eb8c4df4b3ed8a99bf67e6e2", "translation_date": "2026-01-15T16:20:46+00:00", "source_file": "7-bank-project/4-state-management/images/dialog.png", - "language_code": "hk" + "language_code": "zh-HK" }, "dom-tree.7daf0e763cbbba92.webp": { "original_hash": "579f4ae298ff15a357def7f442671847", "translation_date": "2026-01-15T16:21:08+00:00", "source_file": "3-terrarium/3-intro-to-DOM-and-closures/images/dom-tree.png", - "language_code": "hk" + "language_code": "zh-HK" }, "earlybrowsers.d984b711cdf3a42d.webp": { "original_hash": "810a4d2348668e25289029c5cfcb67bd", "translation_date": "2026-01-15T16:18:56+00:00", "source_file": "5-browser-extension/1-about-browsers/images/earlybrowsers.jpg", - "language_code": "hk" + "language_code": "zh-HK" }, "edit-a-file-pb.263555922c14fc52.webp": { "original_hash": "5c52723d35259eadd110d0c720a87b04", "translation_date": "2026-01-15T16:15:09+00:00", "source_file": "8-code-editor/images/edit-a-file-pb.png", - "language_code": "hk" + "language_code": "zh-HK" }, "edit-a-file.52c0ee665ef19f08.webp": { "original_hash": "c28903236d60be6bba3f3848ea368c63", "translation_date": "2026-01-15T16:17:10+00:00", "source_file": "8-code-editor/images/edit-a-file.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.035a46787bff658c.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:34+00:00", "source_file": "6-space-game/5-keeping-score/solution/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.1a1354d7988de290.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:31+00:00", "source_file": "6-space-game/6-end-condition/solution/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.22cbee6ea27a5809.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:26+00:00", "source_file": "6-space-game/2-drawing-to-canvas/your-work/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.321ecb1b4eb21f2c.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:33+00:00", "source_file": "6-space-game/5-keeping-score/your-work/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.4fbf2889e6129db4.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:29+00:00", "source_file": "6-space-game/6-end-condition/your-work/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.5df2a822c16650c2.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:27+00:00", "source_file": "6-space-game/2-drawing-to-canvas/solution/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.62983ed4bfb2220f.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:55+00:00", "source_file": "6-space-game/3-moving-elements-around/solution/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.add7036e1c3c3014.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:25+00:00", "source_file": "6-space-game/4-collision-detection/solution/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.b39a140287683bf7.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:53+00:00", "source_file": "6-space-game/3-moving-elements-around/your-work/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.b9626ed228a17a32.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:23+00:00", "source_file": "6-space-game/4-collision-detection/your-work/assets/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyShip.deb0477a7312f54d.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:40+00:00", "source_file": "6-space-game/solution/spaceArt/png/enemyShip.png", - "language_code": "hk" + "language_code": "zh-HK" }, "enemyUFO.bf8585e4e8dcdb68.webp": { "original_hash": "18198bef76e4882928e4092344d0fb98", "translation_date": "2026-01-15T16:17:43+00:00", "source_file": "6-space-game/solution/spaceArt/png/enemyUFO.png", - "language_code": "hk" + "language_code": "zh-HK" }, "extension-details.9f8f1fd4e9eb2de5.webp": { "original_hash": "f57d2e246e6ba8a58463d7573640d714", "translation_date": "2026-01-15T16:16:57+00:00", "source_file": "8-code-editor/images/extension-details.png", - "language_code": "hk" + "language_code": "zh-HK" }, "extension-screenshot.0e7f5bfa110e92e3.webp": { "original_hash": "4fdd1d3fdbc9ac2c2932f83847a5e4b8", "translation_date": "2026-01-15T16:06:41+00:00", "source_file": "5-browser-extension/extension-screenshot.png", - "language_code": "hk" + "language_code": "zh-HK" }, "extension-settings.21c752ae4f4cdb78.webp": { "original_hash": "fd7ebcb5d84c78047026ab3337908306", "translation_date": "2026-01-15T16:13:05+00:00", "source_file": "8-code-editor/images/extension-settings.png", - "language_code": "hk" + "language_code": "zh-HK" }, "extensions.eca0e0c7f59a10b5.webp": { "original_hash": "a6c9c8f51d3edd917262e53664f08441", "translation_date": "2026-01-15T16:14:55+00:00", "source_file": "8-code-editor/images/extensions.png", - "language_code": "hk" + "language_code": "zh-HK" }, "favicon.37b561214b36d454.webp": { "original_hash": "228faa6584f8ba1f7e9a75e3200112e9", "translation_date": "2026-01-15T16:07:04+00:00", "source_file": "images/favicon.png", - "language_code": "hk" + "language_code": "zh-HK" }, "form-post.61de4ca1b964d91a.webp": { "original_hash": "7e95c76a8ea2e82bceea70aae89f2360", "translation_date": "2026-01-15T16:20:07+00:00", "source_file": "7-bank-project/2-forms/images/form-post.png", - "language_code": "hk" + "language_code": "zh-HK" }, "history.7fdabbafa521e064.webp": { "original_hash": "445d71bea6a747dfe547df7eea846439", "translation_date": "2026-01-15T16:19:46+00:00", "source_file": "7-bank-project/1-template-route/history.png", - "language_code": "hk" + "language_code": "zh-HK" }, "install-on-edge.78634f02842c4828.webp": { "original_hash": "6224aad8f1cd252da83c2808ff5c7a4e", "translation_date": "2026-01-15T16:06:21+00:00", "source_file": "5-browser-extension/install-on-edge.png", - "language_code": "hk" + "language_code": "zh-HK" }, "install-on-edge.d68781acaf0b3d3d.webp": { "original_hash": "6224aad8f1cd252da83c2808ff5c7a4e", "translation_date": "2026-01-15T16:19:22+00:00", "source_file": "5-browser-extension/1-about-browsers/images/install-on-edge.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserGreen.89904f0f49945560.webp": { "original_hash": "ddf7102c86fc3ec46037714c60091851", "translation_date": "2026-01-15T16:17:42+00:00", "source_file": "6-space-game/solution/spaceArt/png/laserGreen.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserGreenShot.e4fbfc4714c08a5b.webp": { "original_hash": "cb6ed500c16736a41998e4cd0c467df7", "translation_date": "2026-01-15T16:17:42+00:00", "source_file": "6-space-game/solution/spaceArt/png/laserGreenShot.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.2040e11f55c0a40a.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:30+00:00", "source_file": "6-space-game/6-end-condition/solution/assets/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.381bc5555491ce67.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:53+00:00", "source_file": "6-space-game/3-moving-elements-around/your-work/assets/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.69730edd76f0b3bd.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:28+00:00", "source_file": "6-space-game/6-end-condition/your-work/assets/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.b583dc1728eb8581.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:34+00:00", "source_file": "6-space-game/5-keeping-score/solution/assets/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.cae9ab24ea9b18fd.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:24+00:00", "source_file": "6-space-game/4-collision-detection/solution/assets/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.d81ce4986f87c251.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:40+00:00", "source_file": "6-space-game/solution/spaceArt/png/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.e58ef8db2585dfbe.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:32+00:00", "source_file": "6-space-game/5-keeping-score/your-work/assets/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.e66e29ace6666064.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:54+00:00", "source_file": "6-space-game/3-moving-elements-around/solution/assets/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRed.e86e8fb629c6026e.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:22+00:00", "source_file": "6-space-game/4-collision-detection/your-work/assets/laserRed.png", - "language_code": "hk" + "language_code": "zh-HK" }, "laserRedShot.c39d066745996a71.webp": { "original_hash": "1f1048184aab9d405e9f7d067a57af01", "translation_date": "2026-01-15T16:17:43+00:00", "source_file": "6-space-game/solution/spaceArt/png/laserRedShot.png", - "language_code": "hk" + "language_code": "zh-HK" }, "life.27144b6d4bfdea76.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:42+00:00", "source_file": "6-space-game/solution/spaceArt/png/life.png", - "language_code": "hk" + "language_code": "zh-HK" }, "life.2a159298dd98f4ef.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:34+00:00", "source_file": "6-space-game/5-keeping-score/your-work/assets/life.png", - "language_code": "hk" + "language_code": "zh-HK" }, "life.466df3b1692a244a.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:24+00:00", "source_file": "6-space-game/4-collision-detection/your-work/assets/life.png", - "language_code": "hk" + "language_code": "zh-HK" }, "life.65a2aaceca875284.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:26+00:00", "source_file": "6-space-game/4-collision-detection/solution/assets/life.png", - "language_code": "hk" + "language_code": "zh-HK" }, "life.6fb9f50d53ee0413.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:36+00:00", "source_file": "6-space-game/5-keeping-score/solution/assets/life.png", - "language_code": "hk" + "language_code": "zh-HK" }, "life.78b6e96a3003767e.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:30+00:00", "source_file": "6-space-game/6-end-condition/your-work/assets/life.png", - "language_code": "hk" + "language_code": "zh-HK" }, "life.86d843ce9c23289c.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:32+00:00", "source_file": "6-space-game/6-end-condition/solution/assets/life.png", - "language_code": "hk" + "language_code": "zh-HK" }, "localstorage.472f8147b6a3f8d1.webp": { "original_hash": "7706ccb87a13a08250f315f03140bc61", "translation_date": "2026-01-15T16:18:00+00:00", "source_file": "5-browser-extension/2-forms-browsers-local-storage/images/localstorage.png", - "language_code": "hk" + "language_code": "zh-HK" }, "log.804026979f3707e0.webp": { "original_hash": "4c5e39f339781db01641b77b6b2d6026", "translation_date": "2026-01-15T16:18:47+00:00", "source_file": "5-browser-extension/3-background-tasks-and-performance/images/log.png", - "language_code": "hk" + "language_code": "zh-HK" }, "login-error.416fe019b36a6327.webp": { "original_hash": "ea96ed372d7a4c37ee2df3f0352f79d1", "translation_date": "2026-01-15T16:20:31+00:00", "source_file": "7-bank-project/3-data/images/login-error.png", - "language_code": "hk" + "language_code": "zh-HK" }, "meteorBig.1e452b3ad7af50ad.webp": { "original_hash": "07f37816512f563dd68780fdee2e30a6", "translation_date": "2026-01-15T16:17:39+00:00", "source_file": "6-space-game/solution/spaceArt/png/meteorBig.png", - "language_code": "hk" + "language_code": "zh-HK" }, "meteorSmall.0d729bc71c12d41f.webp": { "original_hash": "ebabf6690cc614f9e33f019c356166fa", "translation_date": "2026-01-15T16:17:40+00:00", "source_file": "6-space-game/solution/spaceArt/png/meteorSmall.png", - "language_code": "hk" + "language_code": "zh-HK" }, "moodle.94eb93d714a50cb2.webp": { "original_hash": "0d04a6ef1ac524b452d5a0aae3f45bee", "translation_date": "2026-01-15T16:05:34+00:00", "source_file": "teaching-files/moodle.png", - "language_code": "hk" + "language_code": "zh-HK" }, "mpa.7f7375a1a2d4aa77.webp": { "original_hash": "021255b74f0b79b0c286c163c210ef3d", "translation_date": "2026-01-15T16:20:35+00:00", "source_file": "7-bank-project/3-data/images/mpa.png", - "language_code": "hk" + "language_code": "zh-HK" }, "nebula.55c2933d36d035d3.webp": { "original_hash": "e0fa4f86653c6fe97bc77271c46241c2", "translation_date": "2026-01-15T16:17:52+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/nebula.png", - "language_code": "hk" + "language_code": "zh-HK" }, "new-file-github.com.c886796d800e8056.webp": { "original_hash": "2e0ddd0dad4734e3968b70907df9c052", "translation_date": "2026-01-15T16:16:23+00:00", "source_file": "8-code-editor/images/new-file-github.com.png", - "language_code": "hk" + "language_code": "zh-HK" }, "open-palette-menu.46dda01084738da8.webp": { "original_hash": "1860e80bf0534b9d54ef0fcb7e1a9f9e", "translation_date": "2026-01-15T16:15:59+00:00", "source_file": "8-code-editor/images/open-palette-menu.png", - "language_code": "hk" + "language_code": "zh-HK" }, "open-remote-repository.bd9c2598b8949e7f.webp": { "original_hash": "777c01a9242da7d5d0e1b037df9c86f9", "translation_date": "2026-01-15T16:14:51+00:00", "source_file": "8-code-editor/images/open-remote-repository.png", - "language_code": "hk" + "language_code": "zh-HK" }, "palette-menu.4946174e07f42622.webp": { "original_hash": "7387b91076790084ec8828866e88c6ce", "translation_date": "2026-01-15T16:15:46+00:00", "source_file": "8-code-editor/images/palette-menu.png", - "language_code": "hk" + "language_code": "zh-HK" }, "partI-solution.36c53b48c9ffae2a.webp": { "original_hash": "fbbd263368f61f8ed3a86c4571e6810b", "translation_date": "2026-01-15T16:17:19+00:00", "source_file": "6-space-game/2-drawing-to-canvas/partI-solution.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant1.a876180d8659acb9.webp": { "original_hash": "e08f9b0f46f6d9d7c9949d4c3e590694", "translation_date": "2026-01-15T16:22:08+00:00", "source_file": "3-terrarium/solution/images/plant1.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant10.2f2c47804ae52dd3.webp": { "original_hash": "dba97454882c2796c52a33c403db61f7", "translation_date": "2026-01-15T16:22:51+00:00", "source_file": "3-terrarium/solution/images/plant10.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant11.0ce0081b0ef17aa1.webp": { "original_hash": "68346dbd1ae03331b0a87025c3e8e9e2", "translation_date": "2026-01-15T16:22:38+00:00", "source_file": "3-terrarium/solution/images/plant11.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant12.6b934c4312a00228.webp": { "original_hash": "dafacde8e7a0b56c4baaabe88b4f90e2", "translation_date": "2026-01-15T16:23:47+00:00", "source_file": "3-terrarium/solution/images/plant12.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant13.37d6ab2e2481421f.webp": { "original_hash": "5cac561d7596ee631c4d02436d8f6998", "translation_date": "2026-01-15T16:23:03+00:00", "source_file": "3-terrarium/solution/images/plant13.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant14.908791477a46eb7f.webp": { "original_hash": "349b8e5a33d1221bef4a4ac3bb439bb9", "translation_date": "2026-01-15T16:22:16+00:00", "source_file": "3-terrarium/solution/images/plant14.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant2.9e45efea224115b0.webp": { "original_hash": "24beefd3dcca66085b44d3ae5d9758e1", "translation_date": "2026-01-15T16:23:38+00:00", "source_file": "3-terrarium/solution/images/plant2.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant3.06efdd0fa0c4b115.webp": { "original_hash": "7e40e6f14cf52f7d75ed42320817b044", "translation_date": "2026-01-15T16:23:23+00:00", "source_file": "3-terrarium/solution/images/plant3.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant4.3b78072b427727c6.webp": { "original_hash": "c523205855d0691a9a0161c6abca983c", "translation_date": "2026-01-15T16:23:14+00:00", "source_file": "3-terrarium/solution/images/plant4.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant5.8ec58b18ac336fa8.webp": { "original_hash": "bcf5f2eacd7da3fe6b07c857d7f5a2ce", "translation_date": "2026-01-15T16:23:30+00:00", "source_file": "3-terrarium/solution/images/plant5.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant6.ca4ff8372e6676b1.webp": { "original_hash": "6932fdb455fcae5b324b129367d2f56a", "translation_date": "2026-01-15T16:22:29+00:00", "source_file": "3-terrarium/solution/images/plant6.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant7.194d5a42fcf5a88c.webp": { "original_hash": "b7a1e35f9946cb04440ce620c34f201d", "translation_date": "2026-01-15T16:21:25+00:00", "source_file": "3-terrarium/solution/images/plant7.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant8.7b247809ab0eb492.webp": { "original_hash": "3eb38c747aaf33ce7aa70b58a31b62a8", "translation_date": "2026-01-15T16:21:52+00:00", "source_file": "3-terrarium/solution/images/plant8.png", - "language_code": "hk" + "language_code": "zh-HK" }, "plant9.8fe614c01ded1b1e.webp": { "original_hash": "a9655c162938a27c63d48ac675061e2b", "translation_date": "2026-01-15T16:21:37+00:00", "source_file": "3-terrarium/solution/images/plant9.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.137ee0e47f895ffc.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:31+00:00", "source_file": "6-space-game/6-end-condition/solution/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.2887422f6982c3cd.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:33+00:00", "source_file": "6-space-game/5-keeping-score/your-work/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.391fed427ede24f5.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:35+00:00", "source_file": "6-space-game/5-keeping-score/solution/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.3c4f50182552a73a.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:54+00:00", "source_file": "6-space-game/3-moving-elements-around/your-work/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.47bc9de0714c723d.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:27+00:00", "source_file": "6-space-game/2-drawing-to-canvas/your-work/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.57b3107c03012695.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:41+00:00", "source_file": "6-space-game/solution/spaceArt/png/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.606f85953e5e564e.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:29+00:00", "source_file": "6-space-game/6-end-condition/your-work/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.680ea4c619b54fe1.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:23+00:00", "source_file": "6-space-game/4-collision-detection/your-work/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.bfe14f110bddf56d.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:55+00:00", "source_file": "6-space-game/3-moving-elements-around/solution/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.c99c25d54a615ca0.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:25+00:00", "source_file": "6-space-game/4-collision-detection/solution/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "player.dd24c1afa8c71e9b.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:28+00:00", "source_file": "6-space-game/2-drawing-to-canvas/solution/assets/player.png", - "language_code": "hk" + "language_code": "zh-HK" }, "playerDamaged.181703f652fd5176.webp": { "original_hash": "9d71aebe7303edd536064fb0f5e2ae82", "translation_date": "2026-01-15T16:17:45+00:00", "source_file": "6-space-game/solution/spaceArt/png/playerDamaged.png", - "language_code": "hk" + "language_code": "zh-HK" }, "playerLeft.0f928412e66ba5d9.webp": { "original_hash": "40a42047b8ee49c6dd87c981e98d4d2e", "translation_date": "2026-01-15T16:17:46+00:00", "source_file": "6-space-game/solution/spaceArt/png/playerLeft.png", - "language_code": "hk" + "language_code": "zh-HK" }, "playerRight.e4825f489e29f737.webp": { "original_hash": "1c7b03f73e1d6ed74955357680cb05cb", "translation_date": "2026-01-15T16:17:46+00:00", "source_file": "6-space-game/solution/spaceArt/png/playerRight.png", - "language_code": "hk" + "language_code": "zh-HK" }, "playground-choice.1d23ba7d407f4758.webp": { "original_hash": "1c2e88cad7aad10922b4de1e87f1a47f", "translation_date": "2026-01-15T16:24:38+00:00", "source_file": "9-chat-project/assets/playground-choice.png", - "language_code": "hk" + "language_code": "zh-HK" }, "playground.d2b927122224ff8f.webp": { "original_hash": "4152bb8cd5f23e73d58b3beb52919477", "translation_date": "2026-01-15T16:24:19+00:00", "source_file": "9-chat-project/assets/playground.png", - "language_code": "hk" + "language_code": "zh-HK" }, "preview.9215f0a010074476.webp": { "original_hash": "6eaab6a69de1fa433e822578652c7287", "translation_date": "2026-01-15T16:17:37+00:00", "source_file": "6-space-game/solution/spaceArt/preview.jpg", - "language_code": "hk" + "language_code": "zh-HK" }, "profiler.5a4a62479c5df01c.webp": { "original_hash": "40b8a4d9f47e2f3e18aa2e814a15356c", "translation_date": "2026-01-15T16:18:23+00:00", "source_file": "5-browser-extension/3-background-tasks-and-performance/images/profiler.png", - "language_code": "hk" + "language_code": "zh-HK" }, "project-on-vscode.dev.e79815a9a95ee7fe.webp": { "original_hash": "35de4bc32ea66a11f919671558e07d52", "translation_date": "2026-01-15T16:16:15+00:00", "source_file": "8-code-editor/images/project-on-vscode.dev.png", - "language_code": "hk" + "language_code": "zh-HK" }, "result.96ef01f607bf856a.webp": { "original_hash": "e83c44a0fcaa7720ce32eb71d53d5250", "translation_date": "2026-01-15T16:20:17+00:00", "source_file": "7-bank-project/2-forms/images/result.png", - "language_code": "hk" + "language_code": "zh-HK" }, "screen1.baccbba0f1f93364.webp": { "original_hash": "92c8fa2dbe566c4e19c98a9e7de6faa6", "translation_date": "2026-01-15T16:19:51+00:00", "source_file": "7-bank-project/images/screen1.png", - "language_code": "hk" + "language_code": "zh-HK" }, "screen2.123c82a831a1d14a.webp": { "original_hash": "43b7f2857d5f758394e443df8fbc31cf", "translation_date": "2026-01-15T16:19:56+00:00", "source_file": "7-bank-project/images/screen2.png", - "language_code": "hk" + "language_code": "zh-HK" }, "screenshot.0a1ee0d123df681b.webp": { "original_hash": "f909b463a14ff6542a816470f68bfac3", "translation_date": "2026-01-15T16:24:51+00:00", "source_file": "9-chat-project/assets/screenshot.png", - "language_code": "hk" + "language_code": "zh-HK" }, "screenshot.e7a5ad659e364568.webp": { "original_hash": "c562c1fdc9d73658456e02b873e4dff9", "translation_date": "2026-01-15T16:07:34+00:00", "source_file": "images/screenshot.png", - "language_code": "hk" + "language_code": "zh-HK" }, "screenshot_gray.0c796099a1f9f25e.webp": { "original_hash": "324b7bff7867c38e100d0acad18ed53d", "translation_date": "2026-01-15T16:20:56+00:00", "source_file": "3-terrarium/images/screenshot_gray.png", - "language_code": "hk" + "language_code": "zh-HK" }, "shield.1b9412b7ca6610ab.webp": { "original_hash": "a672dc1a5f905918272bb58f1e236340", "translation_date": "2026-01-15T16:17:44+00:00", "source_file": "6-space-game/solution/spaceArt/png/shield.png", - "language_code": "hk" + "language_code": "zh-HK" }, "snapshot.97750180ebcad737.webp": { "original_hash": "9db2fa7afcc1d258ec1a130cef145f94", "translation_date": "2026-01-15T16:18:09+00:00", "source_file": "5-browser-extension/3-background-tasks-and-performance/images/snapshot.png", - "language_code": "hk" + "language_code": "zh-HK" }, "spa.268ec73b41f992c2.webp": { "original_hash": "3d3d7273070c2ddab04458fbb084ad4a", "translation_date": "2026-01-15T16:20:40+00:00", "source_file": "7-bank-project/3-data/images/spa.png", - "language_code": "hk" + "language_code": "zh-HK" }, "speedLine.5bcabb93f48b5ae1.webp": { "original_hash": "ef791dbe8ea2e21cf697831e203803d5", "translation_date": "2026-01-15T16:17:51+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/speedLine.png", - "language_code": "hk" + "language_code": "zh-HK" }, "spritesheet.bec82852290b14ee.webp": { "original_hash": "d593b0f366e9efd2f2b3ef18e7eb2d0c", "translation_date": "2026-01-15T16:17:21+00:00", "source_file": "6-space-game/solution/spritesheet.png", - "language_code": "hk" + "language_code": "zh-HK" }, "starBackground.a897b8acb1b0587d.webp": { "original_hash": "cca00ba0b9e73859ab5bb928d5ca2fa2", "translation_date": "2026-01-15T16:17:48+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/starBackground.png", - "language_code": "hk" + "language_code": "zh-HK" }, "starBig.72e9c6d0d18f363d.webp": { "original_hash": "4e8f1abc8b48d75990117ea8b6207842", "translation_date": "2026-01-15T16:17:47+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/starBig.png", - "language_code": "hk" + "language_code": "zh-HK" }, "starSmall.ed78b961dbcd0898.webp": { "original_hash": "609bf88a971475818f95816b8cf71508", "translation_date": "2026-01-15T16:17:51+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/starSmall.png", - "language_code": "hk" + "language_code": "zh-HK" }, "template.67ad477109d29a2b.webp": { "original_hash": "a184e4c012fd4fca9ab3c552df87bd0c", "translation_date": "2026-01-15T16:24:43+00:00", "source_file": "9-chat-project/assets/template.png", - "language_code": "hk" + "language_code": "zh-HK" }, "terrarium-final.0920f16e87c13a84.webp": { "original_hash": "324b7bff7867c38e100d0acad18ed53d", "translation_date": "2026-01-15T16:21:18+00:00", "source_file": "3-terrarium/3-intro-to-DOM-and-closures/images/terrarium-final.png", - "language_code": "hk" + "language_code": "zh-HK" }, "terrarium-final.2f07047ffc597d0a.webp": { "original_hash": "c669f9222e16690bb2015ce86bb4739c", "translation_date": "2026-01-15T16:23:52+00:00", "source_file": "3-terrarium/2-intro-to-css/images/terrarium-final.png", - "language_code": "hk" + "language_code": "zh-HK" }, "validation-error.8bd23e98d416c22f.webp": { "original_hash": "d614ce6b24e2583901da9038297fe327", "translation_date": "2026-01-15T16:20:12+00:00", "source_file": "7-bank-project/2-forms/images/validation-error.png", - "language_code": "hk" + "language_code": "zh-HK" }, "vs-code-index.e2986cf919471eb9.webp": { "original_hash": "ed8437cb2629b95551fff5e5d72ef4f5", "translation_date": "2026-01-15T16:21:01+00:00", "source_file": "3-terrarium/1-intro-to-html/images/vs-code-index.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-a11y.8ef3025c858d897a.webp": { "original_hash": "3f5220c5d502a906028b8a85245cc6da", "translation_date": "2026-01-15T16:11:14+00:00", "source_file": "sketchnotes/webdev101-a11y.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-css.3f7af5991bf53a20.webp": { "original_hash": "9de1dc14864697c82395b02f31a72aec", "translation_date": "2026-01-15T16:09:51+00:00", "source_file": "sketchnotes/webdev101-css.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-github.8846d7971abef6f9.webp": { "original_hash": "412ec8fc404fead25f314e2fdb564548", "translation_date": "2026-01-15T16:09:26+00:00", "source_file": "sketchnotes/webdev101-github.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-html.4389c2067af68e98.webp": { "original_hash": "23bf24ecb0e72f0c6c835824dec5ee54", "translation_date": "2026-01-15T16:08:16+00:00", "source_file": "sketchnotes/webdev101-html.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-js-arrays.439d7528b8a29455.webp": { "original_hash": "564c9e2d7f8e5a3b7e23570df300c732", "translation_date": "2026-01-15T16:12:27+00:00", "source_file": "sketchnotes/webdev101-js-arrays.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-js-datatypes.4cc470179730702c.webp": { "original_hash": "20fda1612cc0e8d20e6be01ffc28e5f7", "translation_date": "2026-01-15T16:11:38+00:00", "source_file": "sketchnotes/webdev101-js-datatypes.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-js-decisions.69e1b20f272dd1f0.webp": { "original_hash": "5e49a0b9b4149f782a4378354ba7fd56", "translation_date": "2026-01-15T16:10:50+00:00", "source_file": "sketchnotes/webdev101-js-decisions.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-js-functions.be049c4726e94f8b.webp": { "original_hash": "ec4279b1b2191fa07a83e78a97e81f29", "translation_date": "2026-01-15T16:10:26+00:00", "source_file": "sketchnotes/webdev101-js-functions.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-js.10280393044d7eaa.webp": { "original_hash": "fe1f154de74b31fdeb9a6df40e7ad5e1", "translation_date": "2026-01-15T16:12:04+00:00", "source_file": "sketchnotes/webdev101-js.png", - "language_code": "hk" + "language_code": "zh-HK" }, "webdev101-programming.d6e3f98e61ac4bff.webp": { "original_hash": "adf4dac4d350592773dbdba8ebaaa262", "translation_date": "2026-01-15T16:08:51+00:00", "source_file": "sketchnotes/webdev101-programming.png", - "language_code": "hk" + "language_code": "zh-HK" }, "working-tree-pb.6cd43e5076f23ba3.webp": { "original_hash": "f6b14887694745dd143a09bd60b74185", "translation_date": "2026-01-15T16:16:46+00:00", "source_file": "8-code-editor/images/working-tree-pb.png", - "language_code": "hk" + "language_code": "zh-HK" }, "working-tree.c58eec08e6335c79.webp": { "original_hash": "bf2608b4302123a00a8e7b1b6a430b4a", "translation_date": "2026-01-15T16:16:35+00:00", "source_file": "8-code-editor/images/working-tree.png", - "language_code": "hk" + "language_code": "zh-HK" } } \ No newline at end of file diff --git a/translated_images/hk/1.b6da8c1394b07491.webp b/translated_images/zh-HK/1.b6da8c1394b07491.webp similarity index 100% rename from translated_images/hk/1.b6da8c1394b07491.webp rename to translated_images/zh-HK/1.b6da8c1394b07491.webp diff --git a/translated_images/hk/1.cc07a5cbe114ad1d.webp b/translated_images/zh-HK/1.cc07a5cbe114ad1d.webp similarity index 100% rename from translated_images/hk/1.cc07a5cbe114ad1d.webp rename to translated_images/zh-HK/1.cc07a5cbe114ad1d.webp diff --git a/translated_images/hk/2.1dae52ff08042246.webp b/translated_images/zh-HK/2.1dae52ff08042246.webp similarity index 100% rename from translated_images/hk/2.1dae52ff08042246.webp rename to translated_images/zh-HK/2.1dae52ff08042246.webp diff --git a/translated_images/hk/after-codeswing-extension-pb.0ebddddcf73b5509.webp b/translated_images/zh-HK/after-codeswing-extension-pb.0ebddddcf73b5509.webp similarity index 100% rename from translated_images/hk/after-codeswing-extension-pb.0ebddddcf73b5509.webp rename to translated_images/zh-HK/after-codeswing-extension-pb.0ebddddcf73b5509.webp diff --git a/translated_images/hk/background.148a8d43afde5730.webp b/translated_images/zh-HK/background.148a8d43afde5730.webp similarity index 100% rename from translated_images/hk/background.148a8d43afde5730.webp rename to translated_images/zh-HK/background.148a8d43afde5730.webp diff --git a/translated_images/hk/backgroundColor.e19c3c60768150c8.webp b/translated_images/zh-HK/backgroundColor.e19c3c60768150c8.webp similarity index 100% rename from translated_images/hk/backgroundColor.e19c3c60768150c8.webp rename to translated_images/zh-HK/backgroundColor.e19c3c60768150c8.webp diff --git a/translated_images/hk/browser-console.efaf0b51aaaf6778.webp b/translated_images/zh-HK/browser-console.efaf0b51aaaf6778.webp similarity index 100% rename from translated_images/hk/browser-console.efaf0b51aaaf6778.webp rename to translated_images/zh-HK/browser-console.efaf0b51aaaf6778.webp diff --git a/translated_images/hk/browser.60317c9be8b7f84a.webp b/translated_images/zh-HK/browser.60317c9be8b7f84a.webp similarity index 100% rename from translated_images/hk/browser.60317c9be8b7f84a.webp rename to translated_images/zh-HK/browser.60317c9be8b7f84a.webp diff --git a/translated_images/hk/canvas.fbd605ff8e5b8aff.webp b/translated_images/zh-HK/canvas.fbd605ff8e5b8aff.webp similarity index 100% rename from translated_images/hk/canvas.fbd605ff8e5b8aff.webp rename to translated_images/zh-HK/canvas.fbd605ff8e5b8aff.webp diff --git a/translated_images/hk/canvas_grid.5f209da785ded492.webp b/translated_images/zh-HK/canvas_grid.5f209da785ded492.webp similarity index 100% rename from translated_images/hk/canvas_grid.5f209da785ded492.webp rename to translated_images/zh-HK/canvas_grid.5f209da785ded492.webp diff --git a/translated_images/hk/character.5c0dd8e067ffd693.webp b/translated_images/zh-HK/character.5c0dd8e067ffd693.webp similarity index 100% rename from translated_images/hk/character.5c0dd8e067ffd693.webp rename to translated_images/zh-HK/character.5c0dd8e067ffd693.webp diff --git a/translated_images/hk/click-register.e89a30bf0d4bc9ca.webp b/translated_images/zh-HK/click-register.e89a30bf0d4bc9ca.webp similarity index 100% rename from translated_images/hk/click-register.e89a30bf0d4bc9ca.webp rename to translated_images/zh-HK/click-register.e89a30bf0d4bc9ca.webp diff --git a/translated_images/hk/clone_repo.5085c48d666ead57.webp b/translated_images/zh-HK/clone_repo.5085c48d666ead57.webp similarity index 100% rename from translated_images/hk/clone_repo.5085c48d666ead57.webp rename to translated_images/zh-HK/clone_repo.5085c48d666ead57.webp diff --git a/translated_images/hk/clone_repo.6a202fb230ab6bdd.webp b/translated_images/zh-HK/clone_repo.6a202fb230ab6bdd.webp similarity index 100% rename from translated_images/hk/clone_repo.6a202fb230ab6bdd.webp rename to translated_images/zh-HK/clone_repo.6a202fb230ab6bdd.webp diff --git a/translated_images/hk/codespace.bcecbdf5d2747d3d.webp b/translated_images/zh-HK/codespace.bcecbdf5d2747d3d.webp similarity index 100% rename from translated_images/hk/codespace.bcecbdf5d2747d3d.webp rename to translated_images/zh-HK/codespace.bcecbdf5d2747d3d.webp diff --git a/translated_images/hk/create-a-fork.297ab42b4bd0af99.webp b/translated_images/zh-HK/create-a-fork.297ab42b4bd0af99.webp similarity index 100% rename from translated_images/hk/create-a-fork.297ab42b4bd0af99.webp rename to translated_images/zh-HK/create-a-fork.297ab42b4bd0af99.webp diff --git a/translated_images/hk/create-new-file-pb.0797800d977ec3eb.webp b/translated_images/zh-HK/create-new-file-pb.0797800d977ec3eb.webp similarity index 100% rename from translated_images/hk/create-new-file-pb.0797800d977ec3eb.webp rename to translated_images/zh-HK/create-new-file-pb.0797800d977ec3eb.webp diff --git a/translated_images/hk/create-new-file.2814e609c2af9aeb.webp b/translated_images/zh-HK/create-new-file.2814e609c2af9aeb.webp similarity index 100% rename from translated_images/hk/create-new-file.2814e609c2af9aeb.webp rename to translated_images/zh-HK/create-new-file.2814e609c2af9aeb.webp diff --git a/translated_images/hk/createcodespace.0238bbf4d7a8d955.webp b/translated_images/zh-HK/createcodespace.0238bbf4d7a8d955.webp similarity index 100% rename from translated_images/hk/createcodespace.0238bbf4d7a8d955.webp rename to translated_images/zh-HK/createcodespace.0238bbf4d7a8d955.webp diff --git a/translated_images/hk/data-flow.fa2354e0908fecc8.webp b/translated_images/zh-HK/data-flow.fa2354e0908fecc8.webp similarity index 100% rename from translated_images/hk/data-flow.fa2354e0908fecc8.webp rename to translated_images/zh-HK/data-flow.fa2354e0908fecc8.webp diff --git a/translated_images/hk/default-vscode-dev.5d06881d65c1b323.webp b/translated_images/zh-HK/default-vscode-dev.5d06881d65c1b323.webp similarity index 100% rename from translated_images/hk/default-vscode-dev.5d06881d65c1b323.webp rename to translated_images/zh-HK/default-vscode-dev.5d06881d65c1b323.webp diff --git a/translated_images/hk/dialog.93bba104afeb79f1.webp b/translated_images/zh-HK/dialog.93bba104afeb79f1.webp similarity index 100% rename from translated_images/hk/dialog.93bba104afeb79f1.webp rename to translated_images/zh-HK/dialog.93bba104afeb79f1.webp diff --git a/translated_images/hk/dom-tree.7daf0e763cbbba92.webp b/translated_images/zh-HK/dom-tree.7daf0e763cbbba92.webp similarity index 100% rename from translated_images/hk/dom-tree.7daf0e763cbbba92.webp rename to translated_images/zh-HK/dom-tree.7daf0e763cbbba92.webp diff --git a/translated_images/hk/earlybrowsers.d984b711cdf3a42d.webp b/translated_images/zh-HK/earlybrowsers.d984b711cdf3a42d.webp similarity index 100% rename from translated_images/hk/earlybrowsers.d984b711cdf3a42d.webp rename to translated_images/zh-HK/earlybrowsers.d984b711cdf3a42d.webp diff --git a/translated_images/hk/edit-a-file-pb.263555922c14fc52.webp b/translated_images/zh-HK/edit-a-file-pb.263555922c14fc52.webp similarity index 100% rename from translated_images/hk/edit-a-file-pb.263555922c14fc52.webp rename to translated_images/zh-HK/edit-a-file-pb.263555922c14fc52.webp diff --git a/translated_images/hk/edit-a-file.52c0ee665ef19f08.webp b/translated_images/zh-HK/edit-a-file.52c0ee665ef19f08.webp similarity index 100% rename from translated_images/hk/edit-a-file.52c0ee665ef19f08.webp rename to translated_images/zh-HK/edit-a-file.52c0ee665ef19f08.webp diff --git a/translated_images/hk/enemyShip.035a46787bff658c.webp b/translated_images/zh-HK/enemyShip.035a46787bff658c.webp similarity index 100% rename from translated_images/hk/enemyShip.035a46787bff658c.webp rename to translated_images/zh-HK/enemyShip.035a46787bff658c.webp diff --git a/translated_images/hk/enemyShip.1a1354d7988de290.webp b/translated_images/zh-HK/enemyShip.1a1354d7988de290.webp similarity index 100% rename from translated_images/hk/enemyShip.1a1354d7988de290.webp rename to translated_images/zh-HK/enemyShip.1a1354d7988de290.webp diff --git a/translated_images/hk/enemyShip.22cbee6ea27a5809.webp b/translated_images/zh-HK/enemyShip.22cbee6ea27a5809.webp similarity index 100% rename from translated_images/hk/enemyShip.22cbee6ea27a5809.webp rename to translated_images/zh-HK/enemyShip.22cbee6ea27a5809.webp diff --git a/translated_images/hk/enemyShip.321ecb1b4eb21f2c.webp b/translated_images/zh-HK/enemyShip.321ecb1b4eb21f2c.webp similarity index 100% rename from translated_images/hk/enemyShip.321ecb1b4eb21f2c.webp rename to translated_images/zh-HK/enemyShip.321ecb1b4eb21f2c.webp diff --git a/translated_images/hk/enemyShip.4fbf2889e6129db4.webp b/translated_images/zh-HK/enemyShip.4fbf2889e6129db4.webp similarity index 100% rename from translated_images/hk/enemyShip.4fbf2889e6129db4.webp rename to translated_images/zh-HK/enemyShip.4fbf2889e6129db4.webp diff --git a/translated_images/hk/enemyShip.5df2a822c16650c2.webp b/translated_images/zh-HK/enemyShip.5df2a822c16650c2.webp similarity index 100% rename from translated_images/hk/enemyShip.5df2a822c16650c2.webp rename to translated_images/zh-HK/enemyShip.5df2a822c16650c2.webp diff --git a/translated_images/hk/enemyShip.62983ed4bfb2220f.webp b/translated_images/zh-HK/enemyShip.62983ed4bfb2220f.webp similarity index 100% rename from translated_images/hk/enemyShip.62983ed4bfb2220f.webp rename to translated_images/zh-HK/enemyShip.62983ed4bfb2220f.webp diff --git a/translated_images/hk/enemyShip.add7036e1c3c3014.webp b/translated_images/zh-HK/enemyShip.add7036e1c3c3014.webp similarity index 100% rename from translated_images/hk/enemyShip.add7036e1c3c3014.webp rename to translated_images/zh-HK/enemyShip.add7036e1c3c3014.webp diff --git a/translated_images/hk/enemyShip.b39a140287683bf7.webp b/translated_images/zh-HK/enemyShip.b39a140287683bf7.webp similarity index 100% rename from translated_images/hk/enemyShip.b39a140287683bf7.webp rename to translated_images/zh-HK/enemyShip.b39a140287683bf7.webp diff --git a/translated_images/hk/enemyShip.b9626ed228a17a32.webp b/translated_images/zh-HK/enemyShip.b9626ed228a17a32.webp similarity index 100% rename from translated_images/hk/enemyShip.b9626ed228a17a32.webp rename to translated_images/zh-HK/enemyShip.b9626ed228a17a32.webp diff --git a/translated_images/hk/enemyShip.deb0477a7312f54d.webp b/translated_images/zh-HK/enemyShip.deb0477a7312f54d.webp similarity index 100% rename from translated_images/hk/enemyShip.deb0477a7312f54d.webp rename to translated_images/zh-HK/enemyShip.deb0477a7312f54d.webp diff --git a/translated_images/hk/enemyUFO.bf8585e4e8dcdb68.webp b/translated_images/zh-HK/enemyUFO.bf8585e4e8dcdb68.webp similarity index 100% rename from translated_images/hk/enemyUFO.bf8585e4e8dcdb68.webp rename to translated_images/zh-HK/enemyUFO.bf8585e4e8dcdb68.webp diff --git a/translated_images/hk/extension-details.9f8f1fd4e9eb2de5.webp b/translated_images/zh-HK/extension-details.9f8f1fd4e9eb2de5.webp similarity index 100% rename from translated_images/hk/extension-details.9f8f1fd4e9eb2de5.webp rename to translated_images/zh-HK/extension-details.9f8f1fd4e9eb2de5.webp diff --git a/translated_images/hk/extension-screenshot.0e7f5bfa110e92e3.webp b/translated_images/zh-HK/extension-screenshot.0e7f5bfa110e92e3.webp similarity index 100% rename from translated_images/hk/extension-screenshot.0e7f5bfa110e92e3.webp rename to translated_images/zh-HK/extension-screenshot.0e7f5bfa110e92e3.webp diff --git a/translated_images/hk/extension-settings.21c752ae4f4cdb78.webp b/translated_images/zh-HK/extension-settings.21c752ae4f4cdb78.webp similarity index 100% rename from translated_images/hk/extension-settings.21c752ae4f4cdb78.webp rename to translated_images/zh-HK/extension-settings.21c752ae4f4cdb78.webp diff --git a/translated_images/hk/extensions.eca0e0c7f59a10b5.webp b/translated_images/zh-HK/extensions.eca0e0c7f59a10b5.webp similarity index 100% rename from translated_images/hk/extensions.eca0e0c7f59a10b5.webp rename to translated_images/zh-HK/extensions.eca0e0c7f59a10b5.webp diff --git a/translated_images/hk/favicon.37b561214b36d454.webp b/translated_images/zh-HK/favicon.37b561214b36d454.webp similarity index 100% rename from translated_images/hk/favicon.37b561214b36d454.webp rename to translated_images/zh-HK/favicon.37b561214b36d454.webp diff --git a/translated_images/hk/form-post.61de4ca1b964d91a.webp b/translated_images/zh-HK/form-post.61de4ca1b964d91a.webp similarity index 100% rename from translated_images/hk/form-post.61de4ca1b964d91a.webp rename to translated_images/zh-HK/form-post.61de4ca1b964d91a.webp diff --git a/translated_images/hk/history.7fdabbafa521e064.webp b/translated_images/zh-HK/history.7fdabbafa521e064.webp similarity index 100% rename from translated_images/hk/history.7fdabbafa521e064.webp rename to translated_images/zh-HK/history.7fdabbafa521e064.webp diff --git a/translated_images/hk/install-on-edge.78634f02842c4828.webp b/translated_images/zh-HK/install-on-edge.78634f02842c4828.webp similarity index 100% rename from translated_images/hk/install-on-edge.78634f02842c4828.webp rename to translated_images/zh-HK/install-on-edge.78634f02842c4828.webp diff --git a/translated_images/hk/install-on-edge.d68781acaf0b3d3d.webp b/translated_images/zh-HK/install-on-edge.d68781acaf0b3d3d.webp similarity index 100% rename from translated_images/hk/install-on-edge.d68781acaf0b3d3d.webp rename to translated_images/zh-HK/install-on-edge.d68781acaf0b3d3d.webp diff --git a/translated_images/hk/laserGreen.89904f0f49945560.webp b/translated_images/zh-HK/laserGreen.89904f0f49945560.webp similarity index 100% rename from translated_images/hk/laserGreen.89904f0f49945560.webp rename to translated_images/zh-HK/laserGreen.89904f0f49945560.webp diff --git a/translated_images/hk/laserGreenShot.e4fbfc4714c08a5b.webp b/translated_images/zh-HK/laserGreenShot.e4fbfc4714c08a5b.webp similarity index 100% rename from translated_images/hk/laserGreenShot.e4fbfc4714c08a5b.webp rename to translated_images/zh-HK/laserGreenShot.e4fbfc4714c08a5b.webp diff --git a/translated_images/hk/laserRed.2040e11f55c0a40a.webp b/translated_images/zh-HK/laserRed.2040e11f55c0a40a.webp similarity index 100% rename from translated_images/hk/laserRed.2040e11f55c0a40a.webp rename to translated_images/zh-HK/laserRed.2040e11f55c0a40a.webp diff --git a/translated_images/hk/laserRed.381bc5555491ce67.webp b/translated_images/zh-HK/laserRed.381bc5555491ce67.webp similarity index 100% rename from translated_images/hk/laserRed.381bc5555491ce67.webp rename to translated_images/zh-HK/laserRed.381bc5555491ce67.webp diff --git a/translated_images/hk/laserRed.69730edd76f0b3bd.webp b/translated_images/zh-HK/laserRed.69730edd76f0b3bd.webp similarity index 100% rename from translated_images/hk/laserRed.69730edd76f0b3bd.webp rename to translated_images/zh-HK/laserRed.69730edd76f0b3bd.webp diff --git a/translated_images/hk/laserRed.b583dc1728eb8581.webp b/translated_images/zh-HK/laserRed.b583dc1728eb8581.webp similarity index 100% rename from translated_images/hk/laserRed.b583dc1728eb8581.webp rename to translated_images/zh-HK/laserRed.b583dc1728eb8581.webp diff --git a/translated_images/hk/laserRed.cae9ab24ea9b18fd.webp b/translated_images/zh-HK/laserRed.cae9ab24ea9b18fd.webp similarity index 100% rename from translated_images/hk/laserRed.cae9ab24ea9b18fd.webp rename to translated_images/zh-HK/laserRed.cae9ab24ea9b18fd.webp diff --git a/translated_images/hk/laserRed.d81ce4986f87c251.webp b/translated_images/zh-HK/laserRed.d81ce4986f87c251.webp similarity index 100% rename from translated_images/hk/laserRed.d81ce4986f87c251.webp rename to translated_images/zh-HK/laserRed.d81ce4986f87c251.webp diff --git a/translated_images/hk/laserRed.e58ef8db2585dfbe.webp b/translated_images/zh-HK/laserRed.e58ef8db2585dfbe.webp similarity index 100% rename from translated_images/hk/laserRed.e58ef8db2585dfbe.webp rename to translated_images/zh-HK/laserRed.e58ef8db2585dfbe.webp diff --git a/translated_images/hk/laserRed.e66e29ace6666064.webp b/translated_images/zh-HK/laserRed.e66e29ace6666064.webp similarity index 100% rename from translated_images/hk/laserRed.e66e29ace6666064.webp rename to translated_images/zh-HK/laserRed.e66e29ace6666064.webp diff --git a/translated_images/hk/laserRed.e86e8fb629c6026e.webp b/translated_images/zh-HK/laserRed.e86e8fb629c6026e.webp similarity index 100% rename from translated_images/hk/laserRed.e86e8fb629c6026e.webp rename to translated_images/zh-HK/laserRed.e86e8fb629c6026e.webp diff --git a/translated_images/hk/laserRedShot.c39d066745996a71.webp b/translated_images/zh-HK/laserRedShot.c39d066745996a71.webp similarity index 100% rename from translated_images/hk/laserRedShot.c39d066745996a71.webp rename to translated_images/zh-HK/laserRedShot.c39d066745996a71.webp diff --git a/translated_images/hk/life.27144b6d4bfdea76.webp b/translated_images/zh-HK/life.27144b6d4bfdea76.webp similarity index 100% rename from translated_images/hk/life.27144b6d4bfdea76.webp rename to translated_images/zh-HK/life.27144b6d4bfdea76.webp diff --git a/translated_images/hk/life.2a159298dd98f4ef.webp b/translated_images/zh-HK/life.2a159298dd98f4ef.webp similarity index 100% rename from translated_images/hk/life.2a159298dd98f4ef.webp rename to translated_images/zh-HK/life.2a159298dd98f4ef.webp diff --git a/translated_images/hk/life.466df3b1692a244a.webp b/translated_images/zh-HK/life.466df3b1692a244a.webp similarity index 100% rename from translated_images/hk/life.466df3b1692a244a.webp rename to translated_images/zh-HK/life.466df3b1692a244a.webp diff --git a/translated_images/hk/life.65a2aaceca875284.webp b/translated_images/zh-HK/life.65a2aaceca875284.webp similarity index 100% rename from translated_images/hk/life.65a2aaceca875284.webp rename to translated_images/zh-HK/life.65a2aaceca875284.webp diff --git a/translated_images/hk/life.6fb9f50d53ee0413.webp b/translated_images/zh-HK/life.6fb9f50d53ee0413.webp similarity index 100% rename from translated_images/hk/life.6fb9f50d53ee0413.webp rename to translated_images/zh-HK/life.6fb9f50d53ee0413.webp diff --git a/translated_images/hk/life.78b6e96a3003767e.webp b/translated_images/zh-HK/life.78b6e96a3003767e.webp similarity index 100% rename from translated_images/hk/life.78b6e96a3003767e.webp rename to translated_images/zh-HK/life.78b6e96a3003767e.webp diff --git a/translated_images/hk/life.86d843ce9c23289c.webp b/translated_images/zh-HK/life.86d843ce9c23289c.webp similarity index 100% rename from translated_images/hk/life.86d843ce9c23289c.webp rename to translated_images/zh-HK/life.86d843ce9c23289c.webp diff --git a/translated_images/hk/localstorage.472f8147b6a3f8d1.webp b/translated_images/zh-HK/localstorage.472f8147b6a3f8d1.webp similarity index 100% rename from translated_images/hk/localstorage.472f8147b6a3f8d1.webp rename to translated_images/zh-HK/localstorage.472f8147b6a3f8d1.webp diff --git a/translated_images/hk/log.804026979f3707e0.webp b/translated_images/zh-HK/log.804026979f3707e0.webp similarity index 100% rename from translated_images/hk/log.804026979f3707e0.webp rename to translated_images/zh-HK/log.804026979f3707e0.webp diff --git a/translated_images/hk/login-error.416fe019b36a6327.webp b/translated_images/zh-HK/login-error.416fe019b36a6327.webp similarity index 100% rename from translated_images/hk/login-error.416fe019b36a6327.webp rename to translated_images/zh-HK/login-error.416fe019b36a6327.webp diff --git a/translated_images/hk/meteorBig.1e452b3ad7af50ad.webp b/translated_images/zh-HK/meteorBig.1e452b3ad7af50ad.webp similarity index 100% rename from translated_images/hk/meteorBig.1e452b3ad7af50ad.webp rename to translated_images/zh-HK/meteorBig.1e452b3ad7af50ad.webp diff --git a/translated_images/hk/meteorSmall.0d729bc71c12d41f.webp b/translated_images/zh-HK/meteorSmall.0d729bc71c12d41f.webp similarity index 100% rename from translated_images/hk/meteorSmall.0d729bc71c12d41f.webp rename to translated_images/zh-HK/meteorSmall.0d729bc71c12d41f.webp diff --git a/translated_images/hk/moodle.94eb93d714a50cb2.webp b/translated_images/zh-HK/moodle.94eb93d714a50cb2.webp similarity index 100% rename from translated_images/hk/moodle.94eb93d714a50cb2.webp rename to translated_images/zh-HK/moodle.94eb93d714a50cb2.webp diff --git a/translated_images/hk/mpa.7f7375a1a2d4aa77.webp b/translated_images/zh-HK/mpa.7f7375a1a2d4aa77.webp similarity index 100% rename from translated_images/hk/mpa.7f7375a1a2d4aa77.webp rename to translated_images/zh-HK/mpa.7f7375a1a2d4aa77.webp diff --git a/translated_images/hk/nebula.55c2933d36d035d3.webp b/translated_images/zh-HK/nebula.55c2933d36d035d3.webp similarity index 100% rename from translated_images/hk/nebula.55c2933d36d035d3.webp rename to translated_images/zh-HK/nebula.55c2933d36d035d3.webp diff --git a/translated_images/hk/new-file-github.com.c886796d800e8056.webp b/translated_images/zh-HK/new-file-github.com.c886796d800e8056.webp similarity index 100% rename from translated_images/hk/new-file-github.com.c886796d800e8056.webp rename to translated_images/zh-HK/new-file-github.com.c886796d800e8056.webp diff --git a/translated_images/hk/open-palette-menu.46dda01084738da8.webp b/translated_images/zh-HK/open-palette-menu.46dda01084738da8.webp similarity index 100% rename from translated_images/hk/open-palette-menu.46dda01084738da8.webp rename to translated_images/zh-HK/open-palette-menu.46dda01084738da8.webp diff --git a/translated_images/hk/open-remote-repository.bd9c2598b8949e7f.webp b/translated_images/zh-HK/open-remote-repository.bd9c2598b8949e7f.webp similarity index 100% rename from translated_images/hk/open-remote-repository.bd9c2598b8949e7f.webp rename to translated_images/zh-HK/open-remote-repository.bd9c2598b8949e7f.webp diff --git a/translated_images/hk/palette-menu.4946174e07f42622.webp b/translated_images/zh-HK/palette-menu.4946174e07f42622.webp similarity index 100% rename from translated_images/hk/palette-menu.4946174e07f42622.webp rename to translated_images/zh-HK/palette-menu.4946174e07f42622.webp diff --git a/translated_images/hk/partI-solution.36c53b48c9ffae2a.webp b/translated_images/zh-HK/partI-solution.36c53b48c9ffae2a.webp similarity index 100% rename from translated_images/hk/partI-solution.36c53b48c9ffae2a.webp rename to translated_images/zh-HK/partI-solution.36c53b48c9ffae2a.webp diff --git a/translated_images/hk/plant1.a876180d8659acb9.webp b/translated_images/zh-HK/plant1.a876180d8659acb9.webp similarity index 100% rename from translated_images/hk/plant1.a876180d8659acb9.webp rename to translated_images/zh-HK/plant1.a876180d8659acb9.webp diff --git a/translated_images/hk/plant10.2f2c47804ae52dd3.webp b/translated_images/zh-HK/plant10.2f2c47804ae52dd3.webp similarity index 100% rename from translated_images/hk/plant10.2f2c47804ae52dd3.webp rename to translated_images/zh-HK/plant10.2f2c47804ae52dd3.webp diff --git a/translated_images/hk/plant11.0ce0081b0ef17aa1.webp b/translated_images/zh-HK/plant11.0ce0081b0ef17aa1.webp similarity index 100% rename from translated_images/hk/plant11.0ce0081b0ef17aa1.webp rename to translated_images/zh-HK/plant11.0ce0081b0ef17aa1.webp diff --git a/translated_images/hk/plant12.6b934c4312a00228.webp b/translated_images/zh-HK/plant12.6b934c4312a00228.webp similarity index 100% rename from translated_images/hk/plant12.6b934c4312a00228.webp rename to translated_images/zh-HK/plant12.6b934c4312a00228.webp diff --git a/translated_images/hk/plant13.37d6ab2e2481421f.webp b/translated_images/zh-HK/plant13.37d6ab2e2481421f.webp similarity index 100% rename from translated_images/hk/plant13.37d6ab2e2481421f.webp rename to translated_images/zh-HK/plant13.37d6ab2e2481421f.webp diff --git a/translated_images/hk/plant14.908791477a46eb7f.webp b/translated_images/zh-HK/plant14.908791477a46eb7f.webp similarity index 100% rename from translated_images/hk/plant14.908791477a46eb7f.webp rename to translated_images/zh-HK/plant14.908791477a46eb7f.webp diff --git a/translated_images/hk/plant2.9e45efea224115b0.webp b/translated_images/zh-HK/plant2.9e45efea224115b0.webp similarity index 100% rename from translated_images/hk/plant2.9e45efea224115b0.webp rename to translated_images/zh-HK/plant2.9e45efea224115b0.webp diff --git a/translated_images/hk/plant3.06efdd0fa0c4b115.webp b/translated_images/zh-HK/plant3.06efdd0fa0c4b115.webp similarity index 100% rename from translated_images/hk/plant3.06efdd0fa0c4b115.webp rename to translated_images/zh-HK/plant3.06efdd0fa0c4b115.webp diff --git a/translated_images/hk/plant4.3b78072b427727c6.webp b/translated_images/zh-HK/plant4.3b78072b427727c6.webp similarity index 100% rename from translated_images/hk/plant4.3b78072b427727c6.webp rename to translated_images/zh-HK/plant4.3b78072b427727c6.webp diff --git a/translated_images/hk/plant5.8ec58b18ac336fa8.webp b/translated_images/zh-HK/plant5.8ec58b18ac336fa8.webp similarity index 100% rename from translated_images/hk/plant5.8ec58b18ac336fa8.webp rename to translated_images/zh-HK/plant5.8ec58b18ac336fa8.webp diff --git a/translated_images/hk/plant6.ca4ff8372e6676b1.webp b/translated_images/zh-HK/plant6.ca4ff8372e6676b1.webp similarity index 100% rename from translated_images/hk/plant6.ca4ff8372e6676b1.webp rename to translated_images/zh-HK/plant6.ca4ff8372e6676b1.webp diff --git a/translated_images/hk/plant7.194d5a42fcf5a88c.webp b/translated_images/zh-HK/plant7.194d5a42fcf5a88c.webp similarity index 100% rename from translated_images/hk/plant7.194d5a42fcf5a88c.webp rename to translated_images/zh-HK/plant7.194d5a42fcf5a88c.webp diff --git a/translated_images/hk/plant8.7b247809ab0eb492.webp b/translated_images/zh-HK/plant8.7b247809ab0eb492.webp similarity index 100% rename from translated_images/hk/plant8.7b247809ab0eb492.webp rename to translated_images/zh-HK/plant8.7b247809ab0eb492.webp diff --git a/translated_images/hk/plant9.8fe614c01ded1b1e.webp b/translated_images/zh-HK/plant9.8fe614c01ded1b1e.webp similarity index 100% rename from translated_images/hk/plant9.8fe614c01ded1b1e.webp rename to translated_images/zh-HK/plant9.8fe614c01ded1b1e.webp diff --git a/translated_images/hk/player.137ee0e47f895ffc.webp b/translated_images/zh-HK/player.137ee0e47f895ffc.webp similarity index 100% rename from translated_images/hk/player.137ee0e47f895ffc.webp rename to translated_images/zh-HK/player.137ee0e47f895ffc.webp diff --git a/translated_images/hk/player.2887422f6982c3cd.webp b/translated_images/zh-HK/player.2887422f6982c3cd.webp similarity index 100% rename from translated_images/hk/player.2887422f6982c3cd.webp rename to translated_images/zh-HK/player.2887422f6982c3cd.webp diff --git a/translated_images/hk/player.391fed427ede24f5.webp b/translated_images/zh-HK/player.391fed427ede24f5.webp similarity index 100% rename from translated_images/hk/player.391fed427ede24f5.webp rename to translated_images/zh-HK/player.391fed427ede24f5.webp diff --git a/translated_images/hk/player.3c4f50182552a73a.webp b/translated_images/zh-HK/player.3c4f50182552a73a.webp similarity index 100% rename from translated_images/hk/player.3c4f50182552a73a.webp rename to translated_images/zh-HK/player.3c4f50182552a73a.webp diff --git a/translated_images/hk/player.47bc9de0714c723d.webp b/translated_images/zh-HK/player.47bc9de0714c723d.webp similarity index 100% rename from translated_images/hk/player.47bc9de0714c723d.webp rename to translated_images/zh-HK/player.47bc9de0714c723d.webp diff --git a/translated_images/hk/player.57b3107c03012695.webp b/translated_images/zh-HK/player.57b3107c03012695.webp similarity index 100% rename from translated_images/hk/player.57b3107c03012695.webp rename to translated_images/zh-HK/player.57b3107c03012695.webp diff --git a/translated_images/hk/player.606f85953e5e564e.webp b/translated_images/zh-HK/player.606f85953e5e564e.webp similarity index 100% rename from translated_images/hk/player.606f85953e5e564e.webp rename to translated_images/zh-HK/player.606f85953e5e564e.webp diff --git a/translated_images/hk/player.680ea4c619b54fe1.webp b/translated_images/zh-HK/player.680ea4c619b54fe1.webp similarity index 100% rename from translated_images/hk/player.680ea4c619b54fe1.webp rename to translated_images/zh-HK/player.680ea4c619b54fe1.webp diff --git a/translated_images/hk/player.bfe14f110bddf56d.webp b/translated_images/zh-HK/player.bfe14f110bddf56d.webp similarity index 100% rename from translated_images/hk/player.bfe14f110bddf56d.webp rename to translated_images/zh-HK/player.bfe14f110bddf56d.webp diff --git a/translated_images/hk/player.c99c25d54a615ca0.webp b/translated_images/zh-HK/player.c99c25d54a615ca0.webp similarity index 100% rename from translated_images/hk/player.c99c25d54a615ca0.webp rename to translated_images/zh-HK/player.c99c25d54a615ca0.webp diff --git a/translated_images/hk/player.dd24c1afa8c71e9b.webp b/translated_images/zh-HK/player.dd24c1afa8c71e9b.webp similarity index 100% rename from translated_images/hk/player.dd24c1afa8c71e9b.webp rename to translated_images/zh-HK/player.dd24c1afa8c71e9b.webp diff --git a/translated_images/hk/playerDamaged.181703f652fd5176.webp b/translated_images/zh-HK/playerDamaged.181703f652fd5176.webp similarity index 100% rename from translated_images/hk/playerDamaged.181703f652fd5176.webp rename to translated_images/zh-HK/playerDamaged.181703f652fd5176.webp diff --git a/translated_images/hk/playerLeft.0f928412e66ba5d9.webp b/translated_images/zh-HK/playerLeft.0f928412e66ba5d9.webp similarity index 100% rename from translated_images/hk/playerLeft.0f928412e66ba5d9.webp rename to translated_images/zh-HK/playerLeft.0f928412e66ba5d9.webp diff --git a/translated_images/hk/playerRight.e4825f489e29f737.webp b/translated_images/zh-HK/playerRight.e4825f489e29f737.webp similarity index 100% rename from translated_images/hk/playerRight.e4825f489e29f737.webp rename to translated_images/zh-HK/playerRight.e4825f489e29f737.webp diff --git a/translated_images/hk/playground-choice.1d23ba7d407f4758.webp b/translated_images/zh-HK/playground-choice.1d23ba7d407f4758.webp similarity index 100% rename from translated_images/hk/playground-choice.1d23ba7d407f4758.webp rename to translated_images/zh-HK/playground-choice.1d23ba7d407f4758.webp diff --git a/translated_images/hk/playground.d2b927122224ff8f.webp b/translated_images/zh-HK/playground.d2b927122224ff8f.webp similarity index 100% rename from translated_images/hk/playground.d2b927122224ff8f.webp rename to translated_images/zh-HK/playground.d2b927122224ff8f.webp diff --git a/translated_images/hk/preview.9215f0a010074476.webp b/translated_images/zh-HK/preview.9215f0a010074476.webp similarity index 100% rename from translated_images/hk/preview.9215f0a010074476.webp rename to translated_images/zh-HK/preview.9215f0a010074476.webp diff --git a/translated_images/hk/profiler.5a4a62479c5df01c.webp b/translated_images/zh-HK/profiler.5a4a62479c5df01c.webp similarity index 100% rename from translated_images/hk/profiler.5a4a62479c5df01c.webp rename to translated_images/zh-HK/profiler.5a4a62479c5df01c.webp diff --git a/translated_images/hk/project-on-vscode.dev.e79815a9a95ee7fe.webp b/translated_images/zh-HK/project-on-vscode.dev.e79815a9a95ee7fe.webp similarity index 100% rename from translated_images/hk/project-on-vscode.dev.e79815a9a95ee7fe.webp rename to translated_images/zh-HK/project-on-vscode.dev.e79815a9a95ee7fe.webp diff --git a/translated_images/hk/result.96ef01f607bf856a.webp b/translated_images/zh-HK/result.96ef01f607bf856a.webp similarity index 100% rename from translated_images/hk/result.96ef01f607bf856a.webp rename to translated_images/zh-HK/result.96ef01f607bf856a.webp diff --git a/translated_images/hk/screen1.baccbba0f1f93364.webp b/translated_images/zh-HK/screen1.baccbba0f1f93364.webp similarity index 100% rename from translated_images/hk/screen1.baccbba0f1f93364.webp rename to translated_images/zh-HK/screen1.baccbba0f1f93364.webp diff --git a/translated_images/hk/screen2.123c82a831a1d14a.webp b/translated_images/zh-HK/screen2.123c82a831a1d14a.webp similarity index 100% rename from translated_images/hk/screen2.123c82a831a1d14a.webp rename to translated_images/zh-HK/screen2.123c82a831a1d14a.webp diff --git a/translated_images/hk/screenshot.0a1ee0d123df681b.webp b/translated_images/zh-HK/screenshot.0a1ee0d123df681b.webp similarity index 100% rename from translated_images/hk/screenshot.0a1ee0d123df681b.webp rename to translated_images/zh-HK/screenshot.0a1ee0d123df681b.webp diff --git a/translated_images/hk/screenshot.e7a5ad659e364568.webp b/translated_images/zh-HK/screenshot.e7a5ad659e364568.webp similarity index 100% rename from translated_images/hk/screenshot.e7a5ad659e364568.webp rename to translated_images/zh-HK/screenshot.e7a5ad659e364568.webp diff --git a/translated_images/hk/screenshot_gray.0c796099a1f9f25e.webp b/translated_images/zh-HK/screenshot_gray.0c796099a1f9f25e.webp similarity index 100% rename from translated_images/hk/screenshot_gray.0c796099a1f9f25e.webp rename to translated_images/zh-HK/screenshot_gray.0c796099a1f9f25e.webp diff --git a/translated_images/hk/shield.1b9412b7ca6610ab.webp b/translated_images/zh-HK/shield.1b9412b7ca6610ab.webp similarity index 100% rename from translated_images/hk/shield.1b9412b7ca6610ab.webp rename to translated_images/zh-HK/shield.1b9412b7ca6610ab.webp diff --git a/translated_images/hk/snapshot.97750180ebcad737.webp b/translated_images/zh-HK/snapshot.97750180ebcad737.webp similarity index 100% rename from translated_images/hk/snapshot.97750180ebcad737.webp rename to translated_images/zh-HK/snapshot.97750180ebcad737.webp diff --git a/translated_images/hk/spa.268ec73b41f992c2.webp b/translated_images/zh-HK/spa.268ec73b41f992c2.webp similarity index 100% rename from translated_images/hk/spa.268ec73b41f992c2.webp rename to translated_images/zh-HK/spa.268ec73b41f992c2.webp diff --git a/translated_images/hk/speedLine.5bcabb93f48b5ae1.webp b/translated_images/zh-HK/speedLine.5bcabb93f48b5ae1.webp similarity index 100% rename from translated_images/hk/speedLine.5bcabb93f48b5ae1.webp rename to translated_images/zh-HK/speedLine.5bcabb93f48b5ae1.webp diff --git a/translated_images/hk/spritesheet.bec82852290b14ee.webp b/translated_images/zh-HK/spritesheet.bec82852290b14ee.webp similarity index 100% rename from translated_images/hk/spritesheet.bec82852290b14ee.webp rename to translated_images/zh-HK/spritesheet.bec82852290b14ee.webp diff --git a/translated_images/hk/starBackground.a897b8acb1b0587d.webp b/translated_images/zh-HK/starBackground.a897b8acb1b0587d.webp similarity index 100% rename from translated_images/hk/starBackground.a897b8acb1b0587d.webp rename to translated_images/zh-HK/starBackground.a897b8acb1b0587d.webp diff --git a/translated_images/hk/starBig.72e9c6d0d18f363d.webp b/translated_images/zh-HK/starBig.72e9c6d0d18f363d.webp similarity index 100% rename from translated_images/hk/starBig.72e9c6d0d18f363d.webp rename to translated_images/zh-HK/starBig.72e9c6d0d18f363d.webp diff --git a/translated_images/hk/starSmall.ed78b961dbcd0898.webp b/translated_images/zh-HK/starSmall.ed78b961dbcd0898.webp similarity index 100% rename from translated_images/hk/starSmall.ed78b961dbcd0898.webp rename to translated_images/zh-HK/starSmall.ed78b961dbcd0898.webp diff --git a/translated_images/hk/template.67ad477109d29a2b.webp b/translated_images/zh-HK/template.67ad477109d29a2b.webp similarity index 100% rename from translated_images/hk/template.67ad477109d29a2b.webp rename to translated_images/zh-HK/template.67ad477109d29a2b.webp diff --git a/translated_images/hk/terrarium-final.0920f16e87c13a84.webp b/translated_images/zh-HK/terrarium-final.0920f16e87c13a84.webp similarity index 100% rename from translated_images/hk/terrarium-final.0920f16e87c13a84.webp rename to translated_images/zh-HK/terrarium-final.0920f16e87c13a84.webp diff --git a/translated_images/hk/terrarium-final.2f07047ffc597d0a.webp b/translated_images/zh-HK/terrarium-final.2f07047ffc597d0a.webp similarity index 100% rename from translated_images/hk/terrarium-final.2f07047ffc597d0a.webp rename to translated_images/zh-HK/terrarium-final.2f07047ffc597d0a.webp diff --git a/translated_images/hk/validation-error.8bd23e98d416c22f.webp b/translated_images/zh-HK/validation-error.8bd23e98d416c22f.webp similarity index 100% rename from translated_images/hk/validation-error.8bd23e98d416c22f.webp rename to translated_images/zh-HK/validation-error.8bd23e98d416c22f.webp diff --git a/translated_images/hk/vs-code-index.e2986cf919471eb9.webp b/translated_images/zh-HK/vs-code-index.e2986cf919471eb9.webp similarity index 100% rename from translated_images/hk/vs-code-index.e2986cf919471eb9.webp rename to translated_images/zh-HK/vs-code-index.e2986cf919471eb9.webp diff --git a/translated_images/hk/webdev101-a11y.8ef3025c858d897a.webp b/translated_images/zh-HK/webdev101-a11y.8ef3025c858d897a.webp similarity index 100% rename from translated_images/hk/webdev101-a11y.8ef3025c858d897a.webp rename to translated_images/zh-HK/webdev101-a11y.8ef3025c858d897a.webp diff --git a/translated_images/hk/webdev101-css.3f7af5991bf53a20.webp b/translated_images/zh-HK/webdev101-css.3f7af5991bf53a20.webp similarity index 100% rename from translated_images/hk/webdev101-css.3f7af5991bf53a20.webp rename to translated_images/zh-HK/webdev101-css.3f7af5991bf53a20.webp diff --git a/translated_images/hk/webdev101-github.8846d7971abef6f9.webp b/translated_images/zh-HK/webdev101-github.8846d7971abef6f9.webp similarity index 100% rename from translated_images/hk/webdev101-github.8846d7971abef6f9.webp rename to translated_images/zh-HK/webdev101-github.8846d7971abef6f9.webp diff --git a/translated_images/hk/webdev101-html.4389c2067af68e98.webp b/translated_images/zh-HK/webdev101-html.4389c2067af68e98.webp similarity index 100% rename from translated_images/hk/webdev101-html.4389c2067af68e98.webp rename to translated_images/zh-HK/webdev101-html.4389c2067af68e98.webp diff --git a/translated_images/hk/webdev101-js-arrays.439d7528b8a29455.webp b/translated_images/zh-HK/webdev101-js-arrays.439d7528b8a29455.webp similarity index 100% rename from translated_images/hk/webdev101-js-arrays.439d7528b8a29455.webp rename to translated_images/zh-HK/webdev101-js-arrays.439d7528b8a29455.webp diff --git a/translated_images/hk/webdev101-js-datatypes.4cc470179730702c.webp b/translated_images/zh-HK/webdev101-js-datatypes.4cc470179730702c.webp similarity index 100% rename from translated_images/hk/webdev101-js-datatypes.4cc470179730702c.webp rename to translated_images/zh-HK/webdev101-js-datatypes.4cc470179730702c.webp diff --git a/translated_images/hk/webdev101-js-decisions.69e1b20f272dd1f0.webp b/translated_images/zh-HK/webdev101-js-decisions.69e1b20f272dd1f0.webp similarity index 100% rename from translated_images/hk/webdev101-js-decisions.69e1b20f272dd1f0.webp rename to translated_images/zh-HK/webdev101-js-decisions.69e1b20f272dd1f0.webp diff --git a/translated_images/hk/webdev101-js-functions.be049c4726e94f8b.webp b/translated_images/zh-HK/webdev101-js-functions.be049c4726e94f8b.webp similarity index 100% rename from translated_images/hk/webdev101-js-functions.be049c4726e94f8b.webp rename to translated_images/zh-HK/webdev101-js-functions.be049c4726e94f8b.webp diff --git a/translated_images/hk/webdev101-js.10280393044d7eaa.webp b/translated_images/zh-HK/webdev101-js.10280393044d7eaa.webp similarity index 100% rename from translated_images/hk/webdev101-js.10280393044d7eaa.webp rename to translated_images/zh-HK/webdev101-js.10280393044d7eaa.webp diff --git a/translated_images/hk/webdev101-programming.d6e3f98e61ac4bff.webp b/translated_images/zh-HK/webdev101-programming.d6e3f98e61ac4bff.webp similarity index 100% rename from translated_images/hk/webdev101-programming.d6e3f98e61ac4bff.webp rename to translated_images/zh-HK/webdev101-programming.d6e3f98e61ac4bff.webp diff --git a/translated_images/hk/working-tree-pb.6cd43e5076f23ba3.webp b/translated_images/zh-HK/working-tree-pb.6cd43e5076f23ba3.webp similarity index 100% rename from translated_images/hk/working-tree-pb.6cd43e5076f23ba3.webp rename to translated_images/zh-HK/working-tree-pb.6cd43e5076f23ba3.webp diff --git a/translated_images/hk/working-tree.c58eec08e6335c79.webp b/translated_images/zh-HK/working-tree.c58eec08e6335c79.webp similarity index 100% rename from translated_images/hk/working-tree.c58eec08e6335c79.webp rename to translated_images/zh-HK/working-tree.c58eec08e6335c79.webp diff --git a/translated_images/tw/.co-op-translator.json b/translated_images/zh-TW/.co-op-translator.json similarity index 88% rename from translated_images/tw/.co-op-translator.json rename to translated_images/zh-TW/.co-op-translator.json index 9e5dc98d7..f4fdc9968 100644 --- a/translated_images/tw/.co-op-translator.json +++ b/translated_images/zh-TW/.co-op-translator.json @@ -3,858 +3,858 @@ "original_hash": "6b12479c2e6a54160867fa8945c04082", "translation_date": "2026-01-15T16:19:41+00:00", "source_file": "5-browser-extension/1-about-browsers/images/1.png", - "language_code": "tw" + "language_code": "zh-TW" }, "1.cc07a5cbe114ad1d.webp": { "original_hash": "fc436b6749801dd90d0558ae92d56b60", "translation_date": "2026-01-15T16:23:56+00:00", "source_file": "3-terrarium/2-intro-to-css/images/1.png", - "language_code": "tw" + "language_code": "zh-TW" }, "2.1dae52ff08042246.webp": { "original_hash": "3995628a6a986308859d0cb6eed8d787", "translation_date": "2026-01-15T16:19:11+00:00", "source_file": "5-browser-extension/1-about-browsers/images/2.png", - "language_code": "tw" + "language_code": "zh-TW" }, "after-codeswing-extension-pb.0ebddddcf73b5509.webp": { "original_hash": "861d59ec65a7334c5f3a4c02dfe22ceb", "translation_date": "2026-01-15T16:14:05+00:00", "source_file": "8-code-editor/images/after-codeswing-extension-pb.png", - "language_code": "tw" + "language_code": "zh-TW" }, "background.148a8d43afde5730.webp": { "original_hash": "5a50f015fb466782c69063ffebb256de", "translation_date": "2026-01-15T16:07:28+00:00", "source_file": "images/background.png", - "language_code": "tw" + "language_code": "zh-TW" }, "backgroundColor.e19c3c60768150c8.webp": { "original_hash": "b3e10fe033f615ec9d3580cce61eae09", "translation_date": "2026-01-15T16:17:47+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/backgroundColor.png", - "language_code": "tw" + "language_code": "zh-TW" }, "browser-console.efaf0b51aaaf6778.webp": { "original_hash": "8d6c5077d1f133d27c65c0014ef503a9", "translation_date": "2026-01-15T16:20:28+00:00", "source_file": "7-bank-project/2-forms/images/browser-console.png", - "language_code": "tw" + "language_code": "zh-TW" }, "browser.60317c9be8b7f84a.webp": { "original_hash": "aa4461fec006d86899864d991b50cc74", "translation_date": "2026-01-15T16:07:58+00:00", "source_file": "sketchnotes/browser.jpg", - "language_code": "tw" + "language_code": "zh-TW" }, "canvas.fbd605ff8e5b8aff.webp": { "original_hash": "29556305738d345dd023554d788d5477", "translation_date": "2026-01-15T16:06:04+00:00", "source_file": "teaching-files/canvas.png", - "language_code": "tw" + "language_code": "zh-TW" }, "canvas_grid.5f209da785ded492.webp": { "original_hash": "8da354720ffbfd778571aa17402de890", "translation_date": "2026-01-15T16:17:16+00:00", "source_file": "6-space-game/2-drawing-to-canvas/canvas_grid.png", - "language_code": "tw" + "language_code": "zh-TW" }, "character.5c0dd8e067ffd693.webp": { "original_hash": "076bbb4d25a17982c81973b8dba9d4fa", "translation_date": "2026-01-15T16:07:11+00:00", "source_file": "images/character.png", - "language_code": "tw" + "language_code": "zh-TW" }, "click-register.e89a30bf0d4bc9ca.webp": { "original_hash": "ef9688313524664fad6ab9b0e080c758", "translation_date": "2026-01-15T16:20:03+00:00", "source_file": "7-bank-project/2-forms/images/click-register.png", - "language_code": "tw" + "language_code": "zh-TW" }, "clone_repo.5085c48d666ead57.webp": { "original_hash": "28c00f3d5861ab95d188b4f6a2d337df", "translation_date": "2026-01-15T16:24:01+00:00", "source_file": "1-getting-started-lessons/2-github-basics/images/clone_repo.png", - "language_code": "tw" + "language_code": "zh-TW" }, "clone_repo.6a202fb230ab6bdd.webp": { "original_hash": "9261d014674312eece91deae958538cf", "translation_date": "2026-01-15T16:07:19+00:00", "source_file": "images/clone_repo.png", - "language_code": "tw" + "language_code": "zh-TW" }, "codespace.bcecbdf5d2747d3d.webp": { "original_hash": "ff86a65511122ddb448e092969566b0a", "translation_date": "2026-01-15T16:24:08+00:00", "source_file": "9-chat-project/assets/codespace.png", - "language_code": "tw" + "language_code": "zh-TW" }, "create-a-fork.297ab42b4bd0af99.webp": { "original_hash": "10712b80e3dcfa7c44fb8820a6ff3ad3", "translation_date": "2026-01-15T16:14:49+00:00", "source_file": "8-code-editor/images/create-a-fork.png", - "language_code": "tw" + "language_code": "zh-TW" }, "create-new-file-pb.0797800d977ec3eb.webp": { "original_hash": "c149c42e04132f2409651425d6924ffa", "translation_date": "2026-01-15T16:12:54+00:00", "source_file": "8-code-editor/images/create-new-file-pb.png", - "language_code": "tw" + "language_code": "zh-TW" }, "create-new-file.2814e609c2af9aeb.webp": { "original_hash": "cf6df76faeac2d92904e5d877b7bdf69", "translation_date": "2026-01-15T16:12:46+00:00", "source_file": "8-code-editor/images/create-new-file.png", - "language_code": "tw" + "language_code": "zh-TW" }, "createcodespace.0238bbf4d7a8d955.webp": { "original_hash": "4f504323085308f4a0e7b5bfb37e16d7", "translation_date": "2026-01-15T16:07:01+00:00", "source_file": "images/createcodespace.png", - "language_code": "tw" + "language_code": "zh-TW" }, "data-flow.fa2354e0908fecc8.webp": { "original_hash": "c9b82b42fa1973b3b7bfad9c7128c24c", "translation_date": "2026-01-15T16:20:54+00:00", "source_file": "7-bank-project/4-state-management/images/data-flow.png", - "language_code": "tw" + "language_code": "zh-TW" }, "default-vscode-dev.5d06881d65c1b323.webp": { "original_hash": "146fecc3a9da37cb1d5c9d628cd94996", "translation_date": "2026-01-15T16:16:08+00:00", "source_file": "8-code-editor/images/default-vscode-dev.png", - "language_code": "tw" + "language_code": "zh-TW" }, "dialog.93bba104afeb79f1.webp": { "original_hash": "c56b5ad7eb8c4df4b3ed8a99bf67e6e2", "translation_date": "2026-01-15T16:20:49+00:00", "source_file": "7-bank-project/4-state-management/images/dialog.png", - "language_code": "tw" + "language_code": "zh-TW" }, "dom-tree.7daf0e763cbbba92.webp": { "original_hash": "579f4ae298ff15a357def7f442671847", "translation_date": "2026-01-15T16:21:12+00:00", "source_file": "3-terrarium/3-intro-to-DOM-and-closures/images/dom-tree.png", - "language_code": "tw" + "language_code": "zh-TW" }, "earlybrowsers.d984b711cdf3a42d.webp": { "original_hash": "810a4d2348668e25289029c5cfcb67bd", "translation_date": "2026-01-15T16:18:59+00:00", "source_file": "5-browser-extension/1-about-browsers/images/earlybrowsers.jpg", - "language_code": "tw" + "language_code": "zh-TW" }, "edit-a-file-pb.263555922c14fc52.webp": { "original_hash": "5c52723d35259eadd110d0c720a87b04", "translation_date": "2026-01-15T16:15:20+00:00", "source_file": "8-code-editor/images/edit-a-file-pb.png", - "language_code": "tw" + "language_code": "zh-TW" }, "edit-a-file.52c0ee665ef19f08.webp": { "original_hash": "c28903236d60be6bba3f3848ea368c63", "translation_date": "2026-01-15T16:17:12+00:00", "source_file": "8-code-editor/images/edit-a-file.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.035a46787bff658c.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:35+00:00", "source_file": "6-space-game/5-keeping-score/solution/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.1a1354d7988de290.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:31+00:00", "source_file": "6-space-game/6-end-condition/solution/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.22cbee6ea27a5809.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:26+00:00", "source_file": "6-space-game/2-drawing-to-canvas/your-work/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.321ecb1b4eb21f2c.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:33+00:00", "source_file": "6-space-game/5-keeping-score/your-work/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.4fbf2889e6129db4.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:29+00:00", "source_file": "6-space-game/6-end-condition/your-work/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.5df2a822c16650c2.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:28+00:00", "source_file": "6-space-game/2-drawing-to-canvas/solution/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.62983ed4bfb2220f.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:55+00:00", "source_file": "6-space-game/3-moving-elements-around/solution/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.add7036e1c3c3014.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:25+00:00", "source_file": "6-space-game/4-collision-detection/solution/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.b39a140287683bf7.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:54+00:00", "source_file": "6-space-game/3-moving-elements-around/your-work/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.b9626ed228a17a32.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:23+00:00", "source_file": "6-space-game/4-collision-detection/your-work/assets/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyShip.deb0477a7312f54d.webp": { "original_hash": "2a41854e0eaa974e8619298f3b333e11", "translation_date": "2026-01-15T16:17:41+00:00", "source_file": "6-space-game/solution/spaceArt/png/enemyShip.png", - "language_code": "tw" + "language_code": "zh-TW" }, "enemyUFO.bf8585e4e8dcdb68.webp": { "original_hash": "18198bef76e4882928e4092344d0fb98", "translation_date": "2026-01-15T16:17:43+00:00", "source_file": "6-space-game/solution/spaceArt/png/enemyUFO.png", - "language_code": "tw" + "language_code": "zh-TW" }, "extension-details.9f8f1fd4e9eb2de5.webp": { "original_hash": "f57d2e246e6ba8a58463d7573640d714", "translation_date": "2026-01-15T16:17:03+00:00", "source_file": "8-code-editor/images/extension-details.png", - "language_code": "tw" + "language_code": "zh-TW" }, "extension-screenshot.0e7f5bfa110e92e3.webp": { "original_hash": "4fdd1d3fdbc9ac2c2932f83847a5e4b8", "translation_date": "2026-01-15T16:06:49+00:00", "source_file": "5-browser-extension/extension-screenshot.png", - "language_code": "tw" + "language_code": "zh-TW" }, "extension-settings.21c752ae4f4cdb78.webp": { "original_hash": "fd7ebcb5d84c78047026ab3337908306", "translation_date": "2026-01-15T16:13:12+00:00", "source_file": "8-code-editor/images/extension-settings.png", - "language_code": "tw" + "language_code": "zh-TW" }, "extensions.eca0e0c7f59a10b5.webp": { "original_hash": "a6c9c8f51d3edd917262e53664f08441", "translation_date": "2026-01-15T16:14:57+00:00", "source_file": "8-code-editor/images/extensions.png", - "language_code": "tw" + "language_code": "zh-TW" }, "favicon.37b561214b36d454.webp": { "original_hash": "228faa6584f8ba1f7e9a75e3200112e9", "translation_date": "2026-01-15T16:07:04+00:00", "source_file": "images/favicon.png", - "language_code": "tw" + "language_code": "zh-TW" }, "form-post.61de4ca1b964d91a.webp": { "original_hash": "7e95c76a8ea2e82bceea70aae89f2360", "translation_date": "2026-01-15T16:20:09+00:00", "source_file": "7-bank-project/2-forms/images/form-post.png", - "language_code": "tw" + "language_code": "zh-TW" }, "history.7fdabbafa521e064.webp": { "original_hash": "445d71bea6a747dfe547df7eea846439", "translation_date": "2026-01-15T16:19:48+00:00", "source_file": "7-bank-project/1-template-route/history.png", - "language_code": "tw" + "language_code": "zh-TW" }, "install-on-edge.78634f02842c4828.webp": { "original_hash": "6224aad8f1cd252da83c2808ff5c7a4e", "translation_date": "2026-01-15T16:06:28+00:00", "source_file": "5-browser-extension/install-on-edge.png", - "language_code": "tw" + "language_code": "zh-TW" }, "install-on-edge.d68781acaf0b3d3d.webp": { "original_hash": "6224aad8f1cd252da83c2808ff5c7a4e", "translation_date": "2026-01-15T16:19:28+00:00", "source_file": "5-browser-extension/1-about-browsers/images/install-on-edge.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserGreen.89904f0f49945560.webp": { "original_hash": "ddf7102c86fc3ec46037714c60091851", "translation_date": "2026-01-15T16:17:42+00:00", "source_file": "6-space-game/solution/spaceArt/png/laserGreen.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserGreenShot.e4fbfc4714c08a5b.webp": { "original_hash": "cb6ed500c16736a41998e4cd0c467df7", "translation_date": "2026-01-15T16:17:42+00:00", "source_file": "6-space-game/solution/spaceArt/png/laserGreenShot.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.2040e11f55c0a40a.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:30+00:00", "source_file": "6-space-game/6-end-condition/solution/assets/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.381bc5555491ce67.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:53+00:00", "source_file": "6-space-game/3-moving-elements-around/your-work/assets/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.69730edd76f0b3bd.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:29+00:00", "source_file": "6-space-game/6-end-condition/your-work/assets/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.b583dc1728eb8581.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:34+00:00", "source_file": "6-space-game/5-keeping-score/solution/assets/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.cae9ab24ea9b18fd.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:24+00:00", "source_file": "6-space-game/4-collision-detection/solution/assets/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.d81ce4986f87c251.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:40+00:00", "source_file": "6-space-game/solution/spaceArt/png/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.e58ef8db2585dfbe.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:32+00:00", "source_file": "6-space-game/5-keeping-score/your-work/assets/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.e66e29ace6666064.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:54+00:00", "source_file": "6-space-game/3-moving-elements-around/solution/assets/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRed.e86e8fb629c6026e.webp": { "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", "translation_date": "2026-01-15T16:17:22+00:00", "source_file": "6-space-game/4-collision-detection/your-work/assets/laserRed.png", - "language_code": "tw" + "language_code": "zh-TW" }, "laserRedShot.c39d066745996a71.webp": { "original_hash": "1f1048184aab9d405e9f7d067a57af01", "translation_date": "2026-01-15T16:17:43+00:00", "source_file": "6-space-game/solution/spaceArt/png/laserRedShot.png", - "language_code": "tw" + "language_code": "zh-TW" }, "life.27144b6d4bfdea76.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:42+00:00", "source_file": "6-space-game/solution/spaceArt/png/life.png", - "language_code": "tw" + "language_code": "zh-TW" }, "life.2a159298dd98f4ef.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:34+00:00", "source_file": "6-space-game/5-keeping-score/your-work/assets/life.png", - "language_code": "tw" + "language_code": "zh-TW" }, "life.466df3b1692a244a.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:24+00:00", "source_file": "6-space-game/4-collision-detection/your-work/assets/life.png", - "language_code": "tw" + "language_code": "zh-TW" }, "life.65a2aaceca875284.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:26+00:00", "source_file": "6-space-game/4-collision-detection/solution/assets/life.png", - "language_code": "tw" + "language_code": "zh-TW" }, "life.6fb9f50d53ee0413.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:36+00:00", "source_file": "6-space-game/5-keeping-score/solution/assets/life.png", - "language_code": "tw" + "language_code": "zh-TW" }, "life.78b6e96a3003767e.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:30+00:00", "source_file": "6-space-game/6-end-condition/your-work/assets/life.png", - "language_code": "tw" + "language_code": "zh-TW" }, "life.86d843ce9c23289c.webp": { "original_hash": "9a5d93e699071693b15b7b157f760a90", "translation_date": "2026-01-15T16:17:32+00:00", "source_file": "6-space-game/6-end-condition/solution/assets/life.png", - "language_code": "tw" + "language_code": "zh-TW" }, "localstorage.472f8147b6a3f8d1.webp": { "original_hash": "7706ccb87a13a08250f315f03140bc61", "translation_date": "2026-01-15T16:18:03+00:00", "source_file": "5-browser-extension/2-forms-browsers-local-storage/images/localstorage.png", - "language_code": "tw" + "language_code": "zh-TW" }, "log.804026979f3707e0.webp": { "original_hash": "4c5e39f339781db01641b77b6b2d6026", "translation_date": "2026-01-15T16:18:50+00:00", "source_file": "5-browser-extension/3-background-tasks-and-performance/images/log.png", - "language_code": "tw" + "language_code": "zh-TW" }, "login-error.416fe019b36a6327.webp": { "original_hash": "ea96ed372d7a4c37ee2df3f0352f79d1", "translation_date": "2026-01-15T16:20:33+00:00", "source_file": "7-bank-project/3-data/images/login-error.png", - "language_code": "tw" + "language_code": "zh-TW" }, "meteorBig.1e452b3ad7af50ad.webp": { "original_hash": "07f37816512f563dd68780fdee2e30a6", "translation_date": "2026-01-15T16:17:39+00:00", "source_file": "6-space-game/solution/spaceArt/png/meteorBig.png", - "language_code": "tw" + "language_code": "zh-TW" }, "meteorSmall.0d729bc71c12d41f.webp": { "original_hash": "ebabf6690cc614f9e33f019c356166fa", "translation_date": "2026-01-15T16:17:40+00:00", "source_file": "6-space-game/solution/spaceArt/png/meteorSmall.png", - "language_code": "tw" + "language_code": "zh-TW" }, "moodle.94eb93d714a50cb2.webp": { "original_hash": "0d04a6ef1ac524b452d5a0aae3f45bee", "translation_date": "2026-01-15T16:05:38+00:00", "source_file": "teaching-files/moodle.png", - "language_code": "tw" + "language_code": "zh-TW" }, "mpa.7f7375a1a2d4aa77.webp": { "original_hash": "021255b74f0b79b0c286c163c210ef3d", "translation_date": "2026-01-15T16:20:37+00:00", "source_file": "7-bank-project/3-data/images/mpa.png", - "language_code": "tw" + "language_code": "zh-TW" }, "nebula.55c2933d36d035d3.webp": { "original_hash": "e0fa4f86653c6fe97bc77271c46241c2", "translation_date": "2026-01-15T16:17:52+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/nebula.png", - "language_code": "tw" + "language_code": "zh-TW" }, "new-file-github.com.c886796d800e8056.webp": { "original_hash": "2e0ddd0dad4734e3968b70907df9c052", "translation_date": "2026-01-15T16:16:27+00:00", "source_file": "8-code-editor/images/new-file-github.com.png", - "language_code": "tw" + "language_code": "zh-TW" }, "open-palette-menu.46dda01084738da8.webp": { "original_hash": "1860e80bf0534b9d54ef0fcb7e1a9f9e", "translation_date": "2026-01-15T16:16:01+00:00", "source_file": "8-code-editor/images/open-palette-menu.png", - "language_code": "tw" + "language_code": "zh-TW" }, "open-remote-repository.bd9c2598b8949e7f.webp": { "original_hash": "777c01a9242da7d5d0e1b037df9c86f9", "translation_date": "2026-01-15T16:14:53+00:00", "source_file": "8-code-editor/images/open-remote-repository.png", - "language_code": "tw" + "language_code": "zh-TW" }, "palette-menu.4946174e07f42622.webp": { "original_hash": "7387b91076790084ec8828866e88c6ce", "translation_date": "2026-01-15T16:15:48+00:00", "source_file": "8-code-editor/images/palette-menu.png", - "language_code": "tw" + "language_code": "zh-TW" }, "partI-solution.36c53b48c9ffae2a.webp": { "original_hash": "fbbd263368f61f8ed3a86c4571e6810b", "translation_date": "2026-01-15T16:17:19+00:00", "source_file": "6-space-game/2-drawing-to-canvas/partI-solution.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant1.a876180d8659acb9.webp": { "original_hash": "e08f9b0f46f6d9d7c9949d4c3e590694", "translation_date": "2026-01-15T16:22:10+00:00", "source_file": "3-terrarium/solution/images/plant1.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant10.2f2c47804ae52dd3.webp": { "original_hash": "dba97454882c2796c52a33c403db61f7", "translation_date": "2026-01-15T16:22:55+00:00", "source_file": "3-terrarium/solution/images/plant10.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant11.0ce0081b0ef17aa1.webp": { "original_hash": "68346dbd1ae03331b0a87025c3e8e9e2", "translation_date": "2026-01-15T16:22:43+00:00", "source_file": "3-terrarium/solution/images/plant11.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant12.6b934c4312a00228.webp": { "original_hash": "dafacde8e7a0b56c4baaabe88b4f90e2", "translation_date": "2026-01-15T16:23:49+00:00", "source_file": "3-terrarium/solution/images/plant12.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant13.37d6ab2e2481421f.webp": { "original_hash": "5cac561d7596ee631c4d02436d8f6998", "translation_date": "2026-01-15T16:23:07+00:00", "source_file": "3-terrarium/solution/images/plant13.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant14.908791477a46eb7f.webp": { "original_hash": "349b8e5a33d1221bef4a4ac3bb439bb9", "translation_date": "2026-01-15T16:22:22+00:00", "source_file": "3-terrarium/solution/images/plant14.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant2.9e45efea224115b0.webp": { "original_hash": "24beefd3dcca66085b44d3ae5d9758e1", "translation_date": "2026-01-15T16:23:42+00:00", "source_file": "3-terrarium/solution/images/plant2.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant3.06efdd0fa0c4b115.webp": { "original_hash": "7e40e6f14cf52f7d75ed42320817b044", "translation_date": "2026-01-15T16:23:25+00:00", "source_file": "3-terrarium/solution/images/plant3.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant4.3b78072b427727c6.webp": { "original_hash": "c523205855d0691a9a0161c6abca983c", "translation_date": "2026-01-15T16:23:17+00:00", "source_file": "3-terrarium/solution/images/plant4.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant5.8ec58b18ac336fa8.webp": { "original_hash": "bcf5f2eacd7da3fe6b07c857d7f5a2ce", "translation_date": "2026-01-15T16:23:32+00:00", "source_file": "3-terrarium/solution/images/plant5.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant6.ca4ff8372e6676b1.webp": { "original_hash": "6932fdb455fcae5b324b129367d2f56a", "translation_date": "2026-01-15T16:22:31+00:00", "source_file": "3-terrarium/solution/images/plant6.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant7.194d5a42fcf5a88c.webp": { "original_hash": "b7a1e35f9946cb04440ce620c34f201d", "translation_date": "2026-01-15T16:21:29+00:00", "source_file": "3-terrarium/solution/images/plant7.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant8.7b247809ab0eb492.webp": { "original_hash": "3eb38c747aaf33ce7aa70b58a31b62a8", "translation_date": "2026-01-15T16:21:59+00:00", "source_file": "3-terrarium/solution/images/plant8.png", - "language_code": "tw" + "language_code": "zh-TW" }, "plant9.8fe614c01ded1b1e.webp": { "original_hash": "a9655c162938a27c63d48ac675061e2b", "translation_date": "2026-01-15T16:21:41+00:00", "source_file": "3-terrarium/solution/images/plant9.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.137ee0e47f895ffc.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:31+00:00", "source_file": "6-space-game/6-end-condition/solution/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.2887422f6982c3cd.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:33+00:00", "source_file": "6-space-game/5-keeping-score/your-work/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.391fed427ede24f5.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:35+00:00", "source_file": "6-space-game/5-keeping-score/solution/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.3c4f50182552a73a.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:54+00:00", "source_file": "6-space-game/3-moving-elements-around/your-work/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.47bc9de0714c723d.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:27+00:00", "source_file": "6-space-game/2-drawing-to-canvas/your-work/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.57b3107c03012695.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:41+00:00", "source_file": "6-space-game/solution/spaceArt/png/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.606f85953e5e564e.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:30+00:00", "source_file": "6-space-game/6-end-condition/your-work/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.680ea4c619b54fe1.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:24+00:00", "source_file": "6-space-game/4-collision-detection/your-work/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.bfe14f110bddf56d.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:56+00:00", "source_file": "6-space-game/3-moving-elements-around/solution/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.c99c25d54a615ca0.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:25+00:00", "source_file": "6-space-game/4-collision-detection/solution/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "player.dd24c1afa8c71e9b.webp": { "original_hash": "952e66c2dd458cfd6e82052f7123a97b", "translation_date": "2026-01-15T16:17:28+00:00", "source_file": "6-space-game/2-drawing-to-canvas/solution/assets/player.png", - "language_code": "tw" + "language_code": "zh-TW" }, "playerDamaged.181703f652fd5176.webp": { "original_hash": "9d71aebe7303edd536064fb0f5e2ae82", "translation_date": "2026-01-15T16:17:45+00:00", "source_file": "6-space-game/solution/spaceArt/png/playerDamaged.png", - "language_code": "tw" + "language_code": "zh-TW" }, "playerLeft.0f928412e66ba5d9.webp": { "original_hash": "40a42047b8ee49c6dd87c981e98d4d2e", "translation_date": "2026-01-15T16:17:46+00:00", "source_file": "6-space-game/solution/spaceArt/png/playerLeft.png", - "language_code": "tw" + "language_code": "zh-TW" }, "playerRight.e4825f489e29f737.webp": { "original_hash": "1c7b03f73e1d6ed74955357680cb05cb", "translation_date": "2026-01-15T16:17:46+00:00", "source_file": "6-space-game/solution/spaceArt/png/playerRight.png", - "language_code": "tw" + "language_code": "zh-TW" }, "playground-choice.1d23ba7d407f4758.webp": { "original_hash": "1c2e88cad7aad10922b4de1e87f1a47f", "translation_date": "2026-01-15T16:24:39+00:00", "source_file": "9-chat-project/assets/playground-choice.png", - "language_code": "tw" + "language_code": "zh-TW" }, "playground.d2b927122224ff8f.webp": { "original_hash": "4152bb8cd5f23e73d58b3beb52919477", "translation_date": "2026-01-15T16:24:27+00:00", "source_file": "9-chat-project/assets/playground.png", - "language_code": "tw" + "language_code": "zh-TW" }, "preview.9215f0a010074476.webp": { "original_hash": "6eaab6a69de1fa433e822578652c7287", "translation_date": "2026-01-15T16:17:38+00:00", "source_file": "6-space-game/solution/spaceArt/preview.jpg", - "language_code": "tw" + "language_code": "zh-TW" }, "profiler.5a4a62479c5df01c.webp": { "original_hash": "40b8a4d9f47e2f3e18aa2e814a15356c", "translation_date": "2026-01-15T16:18:34+00:00", "source_file": "5-browser-extension/3-background-tasks-and-performance/images/profiler.png", - "language_code": "tw" + "language_code": "zh-TW" }, "project-on-vscode.dev.e79815a9a95ee7fe.webp": { "original_hash": "35de4bc32ea66a11f919671558e07d52", "translation_date": "2026-01-15T16:16:16+00:00", "source_file": "8-code-editor/images/project-on-vscode.dev.png", - "language_code": "tw" + "language_code": "zh-TW" }, "result.96ef01f607bf856a.webp": { "original_hash": "e83c44a0fcaa7720ce32eb71d53d5250", "translation_date": "2026-01-15T16:20:20+00:00", "source_file": "7-bank-project/2-forms/images/result.png", - "language_code": "tw" + "language_code": "zh-TW" }, "screen1.baccbba0f1f93364.webp": { "original_hash": "92c8fa2dbe566c4e19c98a9e7de6faa6", "translation_date": "2026-01-15T16:19:53+00:00", "source_file": "7-bank-project/images/screen1.png", - "language_code": "tw" + "language_code": "zh-TW" }, "screen2.123c82a831a1d14a.webp": { "original_hash": "43b7f2857d5f758394e443df8fbc31cf", "translation_date": "2026-01-15T16:20:00+00:00", "source_file": "7-bank-project/images/screen2.png", - "language_code": "tw" + "language_code": "zh-TW" }, "screenshot.0a1ee0d123df681b.webp": { "original_hash": "f909b463a14ff6542a816470f68bfac3", "translation_date": "2026-01-15T16:25:01+00:00", "source_file": "9-chat-project/assets/screenshot.png", - "language_code": "tw" + "language_code": "zh-TW" }, "screenshot.e7a5ad659e364568.webp": { "original_hash": "c562c1fdc9d73658456e02b873e4dff9", "translation_date": "2026-01-15T16:07:36+00:00", "source_file": "images/screenshot.png", - "language_code": "tw" + "language_code": "zh-TW" }, "screenshot_gray.0c796099a1f9f25e.webp": { "original_hash": "324b7bff7867c38e100d0acad18ed53d", "translation_date": "2026-01-15T16:20:58+00:00", "source_file": "3-terrarium/images/screenshot_gray.png", - "language_code": "tw" + "language_code": "zh-TW" }, "shield.1b9412b7ca6610ab.webp": { "original_hash": "a672dc1a5f905918272bb58f1e236340", "translation_date": "2026-01-15T16:17:44+00:00", "source_file": "6-space-game/solution/spaceArt/png/shield.png", - "language_code": "tw" + "language_code": "zh-TW" }, "snapshot.97750180ebcad737.webp": { "original_hash": "9db2fa7afcc1d258ec1a130cef145f94", "translation_date": "2026-01-15T16:18:11+00:00", "source_file": "5-browser-extension/3-background-tasks-and-performance/images/snapshot.png", - "language_code": "tw" + "language_code": "zh-TW" }, "spa.268ec73b41f992c2.webp": { "original_hash": "3d3d7273070c2ddab04458fbb084ad4a", "translation_date": "2026-01-15T16:20:41+00:00", "source_file": "7-bank-project/3-data/images/spa.png", - "language_code": "tw" + "language_code": "zh-TW" }, "speedLine.5bcabb93f48b5ae1.webp": { "original_hash": "ef791dbe8ea2e21cf697831e203803d5", "translation_date": "2026-01-15T16:17:52+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/speedLine.png", - "language_code": "tw" + "language_code": "zh-TW" }, "spritesheet.bec82852290b14ee.webp": { "original_hash": "d593b0f366e9efd2f2b3ef18e7eb2d0c", "translation_date": "2026-01-15T16:17:22+00:00", "source_file": "6-space-game/solution/spritesheet.png", - "language_code": "tw" + "language_code": "zh-TW" }, "starBackground.a897b8acb1b0587d.webp": { "original_hash": "cca00ba0b9e73859ab5bb928d5ca2fa2", "translation_date": "2026-01-15T16:17:50+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/starBackground.png", - "language_code": "tw" + "language_code": "zh-TW" }, "starBig.72e9c6d0d18f363d.webp": { "original_hash": "4e8f1abc8b48d75990117ea8b6207842", "translation_date": "2026-01-15T16:17:47+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/starBig.png", - "language_code": "tw" + "language_code": "zh-TW" }, "starSmall.ed78b961dbcd0898.webp": { "original_hash": "609bf88a971475818f95816b8cf71508", "translation_date": "2026-01-15T16:17:51+00:00", "source_file": "6-space-game/solution/spaceArt/png/Background/starSmall.png", - "language_code": "tw" + "language_code": "zh-TW" }, "template.67ad477109d29a2b.webp": { "original_hash": "a184e4c012fd4fca9ab3c552df87bd0c", "translation_date": "2026-01-15T16:24:44+00:00", "source_file": "9-chat-project/assets/template.png", - "language_code": "tw" + "language_code": "zh-TW" }, "terrarium-final.0920f16e87c13a84.webp": { "original_hash": "324b7bff7867c38e100d0acad18ed53d", "translation_date": "2026-01-15T16:21:19+00:00", "source_file": "3-terrarium/3-intro-to-DOM-and-closures/images/terrarium-final.png", - "language_code": "tw" + "language_code": "zh-TW" }, "terrarium-final.2f07047ffc597d0a.webp": { "original_hash": "c669f9222e16690bb2015ce86bb4739c", "translation_date": "2026-01-15T16:23:53+00:00", "source_file": "3-terrarium/2-intro-to-css/images/terrarium-final.png", - "language_code": "tw" + "language_code": "zh-TW" }, "validation-error.8bd23e98d416c22f.webp": { "original_hash": "d614ce6b24e2583901da9038297fe327", "translation_date": "2026-01-15T16:20:14+00:00", "source_file": "7-bank-project/2-forms/images/validation-error.png", - "language_code": "tw" + "language_code": "zh-TW" }, "vs-code-index.e2986cf919471eb9.webp": { "original_hash": "ed8437cb2629b95551fff5e5d72ef4f5", "translation_date": "2026-01-15T16:21:02+00:00", "source_file": "3-terrarium/1-intro-to-html/images/vs-code-index.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-a11y.8ef3025c858d897a.webp": { "original_hash": "3f5220c5d502a906028b8a85245cc6da", "translation_date": "2026-01-15T16:11:23+00:00", "source_file": "sketchnotes/webdev101-a11y.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-css.3f7af5991bf53a20.webp": { "original_hash": "9de1dc14864697c82395b02f31a72aec", "translation_date": "2026-01-15T16:10:05+00:00", "source_file": "sketchnotes/webdev101-css.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-github.8846d7971abef6f9.webp": { "original_hash": "412ec8fc404fead25f314e2fdb564548", "translation_date": "2026-01-15T16:09:33+00:00", "source_file": "sketchnotes/webdev101-github.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-html.4389c2067af68e98.webp": { "original_hash": "23bf24ecb0e72f0c6c835824dec5ee54", "translation_date": "2026-01-15T16:08:27+00:00", "source_file": "sketchnotes/webdev101-html.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-js-arrays.439d7528b8a29455.webp": { "original_hash": "564c9e2d7f8e5a3b7e23570df300c732", "translation_date": "2026-01-15T16:12:34+00:00", "source_file": "sketchnotes/webdev101-js-arrays.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-js-datatypes.4cc470179730702c.webp": { "original_hash": "20fda1612cc0e8d20e6be01ffc28e5f7", "translation_date": "2026-01-15T16:11:47+00:00", "source_file": "sketchnotes/webdev101-js-datatypes.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-js-decisions.69e1b20f272dd1f0.webp": { "original_hash": "5e49a0b9b4149f782a4378354ba7fd56", "translation_date": "2026-01-15T16:10:57+00:00", "source_file": "sketchnotes/webdev101-js-decisions.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-js-functions.be049c4726e94f8b.webp": { "original_hash": "ec4279b1b2191fa07a83e78a97e81f29", "translation_date": "2026-01-15T16:10:35+00:00", "source_file": "sketchnotes/webdev101-js-functions.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-js.10280393044d7eaa.webp": { "original_hash": "fe1f154de74b31fdeb9a6df40e7ad5e1", "translation_date": "2026-01-15T16:12:11+00:00", "source_file": "sketchnotes/webdev101-js.png", - "language_code": "tw" + "language_code": "zh-TW" }, "webdev101-programming.d6e3f98e61ac4bff.webp": { "original_hash": "adf4dac4d350592773dbdba8ebaaa262", "translation_date": "2026-01-15T16:09:05+00:00", "source_file": "sketchnotes/webdev101-programming.png", - "language_code": "tw" + "language_code": "zh-TW" }, "working-tree-pb.6cd43e5076f23ba3.webp": { "original_hash": "f6b14887694745dd143a09bd60b74185", "translation_date": "2026-01-15T16:16:49+00:00", "source_file": "8-code-editor/images/working-tree-pb.png", - "language_code": "tw" + "language_code": "zh-TW" }, "working-tree.c58eec08e6335c79.webp": { "original_hash": "bf2608b4302123a00a8e7b1b6a430b4a", "translation_date": "2026-01-15T16:16:38+00:00", "source_file": "8-code-editor/images/working-tree.png", - "language_code": "tw" + "language_code": "zh-TW" } } \ No newline at end of file diff --git a/translated_images/tw/1.b6da8c1394b07491.webp b/translated_images/zh-TW/1.b6da8c1394b07491.webp similarity index 100% rename from translated_images/tw/1.b6da8c1394b07491.webp rename to translated_images/zh-TW/1.b6da8c1394b07491.webp diff --git a/translated_images/tw/1.cc07a5cbe114ad1d.webp b/translated_images/zh-TW/1.cc07a5cbe114ad1d.webp similarity index 100% rename from translated_images/tw/1.cc07a5cbe114ad1d.webp rename to translated_images/zh-TW/1.cc07a5cbe114ad1d.webp diff --git a/translated_images/tw/2.1dae52ff08042246.webp b/translated_images/zh-TW/2.1dae52ff08042246.webp similarity index 100% rename from translated_images/tw/2.1dae52ff08042246.webp rename to translated_images/zh-TW/2.1dae52ff08042246.webp diff --git a/translated_images/tw/after-codeswing-extension-pb.0ebddddcf73b5509.webp b/translated_images/zh-TW/after-codeswing-extension-pb.0ebddddcf73b5509.webp similarity index 100% rename from translated_images/tw/after-codeswing-extension-pb.0ebddddcf73b5509.webp rename to translated_images/zh-TW/after-codeswing-extension-pb.0ebddddcf73b5509.webp diff --git a/translated_images/tw/background.148a8d43afde5730.webp b/translated_images/zh-TW/background.148a8d43afde5730.webp similarity index 100% rename from translated_images/tw/background.148a8d43afde5730.webp rename to translated_images/zh-TW/background.148a8d43afde5730.webp diff --git a/translated_images/tw/backgroundColor.e19c3c60768150c8.webp b/translated_images/zh-TW/backgroundColor.e19c3c60768150c8.webp similarity index 100% rename from translated_images/tw/backgroundColor.e19c3c60768150c8.webp rename to translated_images/zh-TW/backgroundColor.e19c3c60768150c8.webp diff --git a/translated_images/tw/browser-console.efaf0b51aaaf6778.webp b/translated_images/zh-TW/browser-console.efaf0b51aaaf6778.webp similarity index 100% rename from translated_images/tw/browser-console.efaf0b51aaaf6778.webp rename to translated_images/zh-TW/browser-console.efaf0b51aaaf6778.webp diff --git a/translated_images/tw/browser.60317c9be8b7f84a.webp b/translated_images/zh-TW/browser.60317c9be8b7f84a.webp similarity index 100% rename from translated_images/tw/browser.60317c9be8b7f84a.webp rename to translated_images/zh-TW/browser.60317c9be8b7f84a.webp diff --git a/translated_images/tw/canvas.fbd605ff8e5b8aff.webp b/translated_images/zh-TW/canvas.fbd605ff8e5b8aff.webp similarity index 100% rename from translated_images/tw/canvas.fbd605ff8e5b8aff.webp rename to translated_images/zh-TW/canvas.fbd605ff8e5b8aff.webp diff --git a/translated_images/tw/canvas_grid.5f209da785ded492.webp b/translated_images/zh-TW/canvas_grid.5f209da785ded492.webp similarity index 100% rename from translated_images/tw/canvas_grid.5f209da785ded492.webp rename to translated_images/zh-TW/canvas_grid.5f209da785ded492.webp diff --git a/translated_images/tw/character.5c0dd8e067ffd693.webp b/translated_images/zh-TW/character.5c0dd8e067ffd693.webp similarity index 100% rename from translated_images/tw/character.5c0dd8e067ffd693.webp rename to translated_images/zh-TW/character.5c0dd8e067ffd693.webp diff --git a/translated_images/tw/click-register.e89a30bf0d4bc9ca.webp b/translated_images/zh-TW/click-register.e89a30bf0d4bc9ca.webp similarity index 100% rename from translated_images/tw/click-register.e89a30bf0d4bc9ca.webp rename to translated_images/zh-TW/click-register.e89a30bf0d4bc9ca.webp diff --git a/translated_images/tw/clone_repo.5085c48d666ead57.webp b/translated_images/zh-TW/clone_repo.5085c48d666ead57.webp similarity index 100% rename from translated_images/tw/clone_repo.5085c48d666ead57.webp rename to translated_images/zh-TW/clone_repo.5085c48d666ead57.webp diff --git a/translated_images/tw/clone_repo.6a202fb230ab6bdd.webp b/translated_images/zh-TW/clone_repo.6a202fb230ab6bdd.webp similarity index 100% rename from translated_images/tw/clone_repo.6a202fb230ab6bdd.webp rename to translated_images/zh-TW/clone_repo.6a202fb230ab6bdd.webp diff --git a/translated_images/tw/codespace.bcecbdf5d2747d3d.webp b/translated_images/zh-TW/codespace.bcecbdf5d2747d3d.webp similarity index 100% rename from translated_images/tw/codespace.bcecbdf5d2747d3d.webp rename to translated_images/zh-TW/codespace.bcecbdf5d2747d3d.webp diff --git a/translated_images/tw/create-a-fork.297ab42b4bd0af99.webp b/translated_images/zh-TW/create-a-fork.297ab42b4bd0af99.webp similarity index 100% rename from translated_images/tw/create-a-fork.297ab42b4bd0af99.webp rename to translated_images/zh-TW/create-a-fork.297ab42b4bd0af99.webp diff --git a/translated_images/tw/create-new-file-pb.0797800d977ec3eb.webp b/translated_images/zh-TW/create-new-file-pb.0797800d977ec3eb.webp similarity index 100% rename from translated_images/tw/create-new-file-pb.0797800d977ec3eb.webp rename to translated_images/zh-TW/create-new-file-pb.0797800d977ec3eb.webp diff --git a/translated_images/tw/create-new-file.2814e609c2af9aeb.webp b/translated_images/zh-TW/create-new-file.2814e609c2af9aeb.webp similarity index 100% rename from translated_images/tw/create-new-file.2814e609c2af9aeb.webp rename to translated_images/zh-TW/create-new-file.2814e609c2af9aeb.webp diff --git a/translated_images/tw/createcodespace.0238bbf4d7a8d955.webp b/translated_images/zh-TW/createcodespace.0238bbf4d7a8d955.webp similarity index 100% rename from translated_images/tw/createcodespace.0238bbf4d7a8d955.webp rename to translated_images/zh-TW/createcodespace.0238bbf4d7a8d955.webp diff --git a/translated_images/tw/data-flow.fa2354e0908fecc8.webp b/translated_images/zh-TW/data-flow.fa2354e0908fecc8.webp similarity index 100% rename from translated_images/tw/data-flow.fa2354e0908fecc8.webp rename to translated_images/zh-TW/data-flow.fa2354e0908fecc8.webp diff --git a/translated_images/tw/default-vscode-dev.5d06881d65c1b323.webp b/translated_images/zh-TW/default-vscode-dev.5d06881d65c1b323.webp similarity index 100% rename from translated_images/tw/default-vscode-dev.5d06881d65c1b323.webp rename to translated_images/zh-TW/default-vscode-dev.5d06881d65c1b323.webp diff --git a/translated_images/tw/dialog.93bba104afeb79f1.webp b/translated_images/zh-TW/dialog.93bba104afeb79f1.webp similarity index 100% rename from translated_images/tw/dialog.93bba104afeb79f1.webp rename to translated_images/zh-TW/dialog.93bba104afeb79f1.webp diff --git a/translated_images/tw/dom-tree.7daf0e763cbbba92.webp b/translated_images/zh-TW/dom-tree.7daf0e763cbbba92.webp similarity index 100% rename from translated_images/tw/dom-tree.7daf0e763cbbba92.webp rename to translated_images/zh-TW/dom-tree.7daf0e763cbbba92.webp diff --git a/translated_images/tw/earlybrowsers.d984b711cdf3a42d.webp b/translated_images/zh-TW/earlybrowsers.d984b711cdf3a42d.webp similarity index 100% rename from translated_images/tw/earlybrowsers.d984b711cdf3a42d.webp rename to translated_images/zh-TW/earlybrowsers.d984b711cdf3a42d.webp diff --git a/translated_images/tw/edit-a-file-pb.263555922c14fc52.webp b/translated_images/zh-TW/edit-a-file-pb.263555922c14fc52.webp similarity index 100% rename from translated_images/tw/edit-a-file-pb.263555922c14fc52.webp rename to translated_images/zh-TW/edit-a-file-pb.263555922c14fc52.webp diff --git a/translated_images/tw/edit-a-file.52c0ee665ef19f08.webp b/translated_images/zh-TW/edit-a-file.52c0ee665ef19f08.webp similarity index 100% rename from translated_images/tw/edit-a-file.52c0ee665ef19f08.webp rename to translated_images/zh-TW/edit-a-file.52c0ee665ef19f08.webp diff --git a/translated_images/tw/enemyShip.035a46787bff658c.webp b/translated_images/zh-TW/enemyShip.035a46787bff658c.webp similarity index 100% rename from translated_images/tw/enemyShip.035a46787bff658c.webp rename to translated_images/zh-TW/enemyShip.035a46787bff658c.webp diff --git a/translated_images/tw/enemyShip.1a1354d7988de290.webp b/translated_images/zh-TW/enemyShip.1a1354d7988de290.webp similarity index 100% rename from translated_images/tw/enemyShip.1a1354d7988de290.webp rename to translated_images/zh-TW/enemyShip.1a1354d7988de290.webp diff --git a/translated_images/tw/enemyShip.22cbee6ea27a5809.webp b/translated_images/zh-TW/enemyShip.22cbee6ea27a5809.webp similarity index 100% rename from translated_images/tw/enemyShip.22cbee6ea27a5809.webp rename to translated_images/zh-TW/enemyShip.22cbee6ea27a5809.webp diff --git a/translated_images/tw/enemyShip.321ecb1b4eb21f2c.webp b/translated_images/zh-TW/enemyShip.321ecb1b4eb21f2c.webp similarity index 100% rename from translated_images/tw/enemyShip.321ecb1b4eb21f2c.webp rename to translated_images/zh-TW/enemyShip.321ecb1b4eb21f2c.webp diff --git a/translated_images/tw/enemyShip.4fbf2889e6129db4.webp b/translated_images/zh-TW/enemyShip.4fbf2889e6129db4.webp similarity index 100% rename from translated_images/tw/enemyShip.4fbf2889e6129db4.webp rename to translated_images/zh-TW/enemyShip.4fbf2889e6129db4.webp diff --git a/translated_images/tw/enemyShip.5df2a822c16650c2.webp b/translated_images/zh-TW/enemyShip.5df2a822c16650c2.webp similarity index 100% rename from translated_images/tw/enemyShip.5df2a822c16650c2.webp rename to translated_images/zh-TW/enemyShip.5df2a822c16650c2.webp diff --git a/translated_images/tw/enemyShip.62983ed4bfb2220f.webp b/translated_images/zh-TW/enemyShip.62983ed4bfb2220f.webp similarity index 100% rename from translated_images/tw/enemyShip.62983ed4bfb2220f.webp rename to translated_images/zh-TW/enemyShip.62983ed4bfb2220f.webp diff --git a/translated_images/tw/enemyShip.add7036e1c3c3014.webp b/translated_images/zh-TW/enemyShip.add7036e1c3c3014.webp similarity index 100% rename from translated_images/tw/enemyShip.add7036e1c3c3014.webp rename to translated_images/zh-TW/enemyShip.add7036e1c3c3014.webp diff --git a/translated_images/tw/enemyShip.b39a140287683bf7.webp b/translated_images/zh-TW/enemyShip.b39a140287683bf7.webp similarity index 100% rename from translated_images/tw/enemyShip.b39a140287683bf7.webp rename to translated_images/zh-TW/enemyShip.b39a140287683bf7.webp diff --git a/translated_images/tw/enemyShip.b9626ed228a17a32.webp b/translated_images/zh-TW/enemyShip.b9626ed228a17a32.webp similarity index 100% rename from translated_images/tw/enemyShip.b9626ed228a17a32.webp rename to translated_images/zh-TW/enemyShip.b9626ed228a17a32.webp diff --git a/translated_images/tw/enemyShip.deb0477a7312f54d.webp b/translated_images/zh-TW/enemyShip.deb0477a7312f54d.webp similarity index 100% rename from translated_images/tw/enemyShip.deb0477a7312f54d.webp rename to translated_images/zh-TW/enemyShip.deb0477a7312f54d.webp diff --git a/translated_images/tw/enemyUFO.bf8585e4e8dcdb68.webp b/translated_images/zh-TW/enemyUFO.bf8585e4e8dcdb68.webp similarity index 100% rename from translated_images/tw/enemyUFO.bf8585e4e8dcdb68.webp rename to translated_images/zh-TW/enemyUFO.bf8585e4e8dcdb68.webp diff --git a/translated_images/tw/extension-details.9f8f1fd4e9eb2de5.webp b/translated_images/zh-TW/extension-details.9f8f1fd4e9eb2de5.webp similarity index 100% rename from translated_images/tw/extension-details.9f8f1fd4e9eb2de5.webp rename to translated_images/zh-TW/extension-details.9f8f1fd4e9eb2de5.webp diff --git a/translated_images/tw/extension-screenshot.0e7f5bfa110e92e3.webp b/translated_images/zh-TW/extension-screenshot.0e7f5bfa110e92e3.webp similarity index 100% rename from translated_images/tw/extension-screenshot.0e7f5bfa110e92e3.webp rename to translated_images/zh-TW/extension-screenshot.0e7f5bfa110e92e3.webp diff --git a/translated_images/tw/extension-settings.21c752ae4f4cdb78.webp b/translated_images/zh-TW/extension-settings.21c752ae4f4cdb78.webp similarity index 100% rename from translated_images/tw/extension-settings.21c752ae4f4cdb78.webp rename to translated_images/zh-TW/extension-settings.21c752ae4f4cdb78.webp diff --git a/translated_images/tw/extensions.eca0e0c7f59a10b5.webp b/translated_images/zh-TW/extensions.eca0e0c7f59a10b5.webp similarity index 100% rename from translated_images/tw/extensions.eca0e0c7f59a10b5.webp rename to translated_images/zh-TW/extensions.eca0e0c7f59a10b5.webp diff --git a/translated_images/tw/favicon.37b561214b36d454.webp b/translated_images/zh-TW/favicon.37b561214b36d454.webp similarity index 100% rename from translated_images/tw/favicon.37b561214b36d454.webp rename to translated_images/zh-TW/favicon.37b561214b36d454.webp diff --git a/translated_images/tw/form-post.61de4ca1b964d91a.webp b/translated_images/zh-TW/form-post.61de4ca1b964d91a.webp similarity index 100% rename from translated_images/tw/form-post.61de4ca1b964d91a.webp rename to translated_images/zh-TW/form-post.61de4ca1b964d91a.webp diff --git a/translated_images/tw/history.7fdabbafa521e064.webp b/translated_images/zh-TW/history.7fdabbafa521e064.webp similarity index 100% rename from translated_images/tw/history.7fdabbafa521e064.webp rename to translated_images/zh-TW/history.7fdabbafa521e064.webp diff --git a/translated_images/tw/install-on-edge.78634f02842c4828.webp b/translated_images/zh-TW/install-on-edge.78634f02842c4828.webp similarity index 100% rename from translated_images/tw/install-on-edge.78634f02842c4828.webp rename to translated_images/zh-TW/install-on-edge.78634f02842c4828.webp diff --git a/translated_images/tw/install-on-edge.d68781acaf0b3d3d.webp b/translated_images/zh-TW/install-on-edge.d68781acaf0b3d3d.webp similarity index 100% rename from translated_images/tw/install-on-edge.d68781acaf0b3d3d.webp rename to translated_images/zh-TW/install-on-edge.d68781acaf0b3d3d.webp diff --git a/translated_images/tw/laserGreen.89904f0f49945560.webp b/translated_images/zh-TW/laserGreen.89904f0f49945560.webp similarity index 100% rename from translated_images/tw/laserGreen.89904f0f49945560.webp rename to translated_images/zh-TW/laserGreen.89904f0f49945560.webp diff --git a/translated_images/tw/laserGreenShot.e4fbfc4714c08a5b.webp b/translated_images/zh-TW/laserGreenShot.e4fbfc4714c08a5b.webp similarity index 100% rename from translated_images/tw/laserGreenShot.e4fbfc4714c08a5b.webp rename to translated_images/zh-TW/laserGreenShot.e4fbfc4714c08a5b.webp diff --git a/translated_images/tw/laserRed.2040e11f55c0a40a.webp b/translated_images/zh-TW/laserRed.2040e11f55c0a40a.webp similarity index 100% rename from translated_images/tw/laserRed.2040e11f55c0a40a.webp rename to translated_images/zh-TW/laserRed.2040e11f55c0a40a.webp diff --git a/translated_images/tw/laserRed.381bc5555491ce67.webp b/translated_images/zh-TW/laserRed.381bc5555491ce67.webp similarity index 100% rename from translated_images/tw/laserRed.381bc5555491ce67.webp rename to translated_images/zh-TW/laserRed.381bc5555491ce67.webp diff --git a/translated_images/tw/laserRed.69730edd76f0b3bd.webp b/translated_images/zh-TW/laserRed.69730edd76f0b3bd.webp similarity index 100% rename from translated_images/tw/laserRed.69730edd76f0b3bd.webp rename to translated_images/zh-TW/laserRed.69730edd76f0b3bd.webp diff --git a/translated_images/tw/laserRed.b583dc1728eb8581.webp b/translated_images/zh-TW/laserRed.b583dc1728eb8581.webp similarity index 100% rename from translated_images/tw/laserRed.b583dc1728eb8581.webp rename to translated_images/zh-TW/laserRed.b583dc1728eb8581.webp diff --git a/translated_images/tw/laserRed.cae9ab24ea9b18fd.webp b/translated_images/zh-TW/laserRed.cae9ab24ea9b18fd.webp similarity index 100% rename from translated_images/tw/laserRed.cae9ab24ea9b18fd.webp rename to translated_images/zh-TW/laserRed.cae9ab24ea9b18fd.webp diff --git a/translated_images/tw/laserRed.d81ce4986f87c251.webp b/translated_images/zh-TW/laserRed.d81ce4986f87c251.webp similarity index 100% rename from translated_images/tw/laserRed.d81ce4986f87c251.webp rename to translated_images/zh-TW/laserRed.d81ce4986f87c251.webp diff --git a/translated_images/tw/laserRed.e58ef8db2585dfbe.webp b/translated_images/zh-TW/laserRed.e58ef8db2585dfbe.webp similarity index 100% rename from translated_images/tw/laserRed.e58ef8db2585dfbe.webp rename to translated_images/zh-TW/laserRed.e58ef8db2585dfbe.webp diff --git a/translated_images/tw/laserRed.e66e29ace6666064.webp b/translated_images/zh-TW/laserRed.e66e29ace6666064.webp similarity index 100% rename from translated_images/tw/laserRed.e66e29ace6666064.webp rename to translated_images/zh-TW/laserRed.e66e29ace6666064.webp diff --git a/translated_images/tw/laserRed.e86e8fb629c6026e.webp b/translated_images/zh-TW/laserRed.e86e8fb629c6026e.webp similarity index 100% rename from translated_images/tw/laserRed.e86e8fb629c6026e.webp rename to translated_images/zh-TW/laserRed.e86e8fb629c6026e.webp diff --git a/translated_images/tw/laserRedShot.c39d066745996a71.webp b/translated_images/zh-TW/laserRedShot.c39d066745996a71.webp similarity index 100% rename from translated_images/tw/laserRedShot.c39d066745996a71.webp rename to translated_images/zh-TW/laserRedShot.c39d066745996a71.webp diff --git a/translated_images/tw/life.27144b6d4bfdea76.webp b/translated_images/zh-TW/life.27144b6d4bfdea76.webp similarity index 100% rename from translated_images/tw/life.27144b6d4bfdea76.webp rename to translated_images/zh-TW/life.27144b6d4bfdea76.webp diff --git a/translated_images/tw/life.2a159298dd98f4ef.webp b/translated_images/zh-TW/life.2a159298dd98f4ef.webp similarity index 100% rename from translated_images/tw/life.2a159298dd98f4ef.webp rename to translated_images/zh-TW/life.2a159298dd98f4ef.webp diff --git a/translated_images/tw/life.466df3b1692a244a.webp b/translated_images/zh-TW/life.466df3b1692a244a.webp similarity index 100% rename from translated_images/tw/life.466df3b1692a244a.webp rename to translated_images/zh-TW/life.466df3b1692a244a.webp diff --git a/translated_images/tw/life.65a2aaceca875284.webp b/translated_images/zh-TW/life.65a2aaceca875284.webp similarity index 100% rename from translated_images/tw/life.65a2aaceca875284.webp rename to translated_images/zh-TW/life.65a2aaceca875284.webp diff --git a/translated_images/tw/life.6fb9f50d53ee0413.webp b/translated_images/zh-TW/life.6fb9f50d53ee0413.webp similarity index 100% rename from translated_images/tw/life.6fb9f50d53ee0413.webp rename to translated_images/zh-TW/life.6fb9f50d53ee0413.webp diff --git a/translated_images/tw/life.78b6e96a3003767e.webp b/translated_images/zh-TW/life.78b6e96a3003767e.webp similarity index 100% rename from translated_images/tw/life.78b6e96a3003767e.webp rename to translated_images/zh-TW/life.78b6e96a3003767e.webp diff --git a/translated_images/tw/life.86d843ce9c23289c.webp b/translated_images/zh-TW/life.86d843ce9c23289c.webp similarity index 100% rename from translated_images/tw/life.86d843ce9c23289c.webp rename to translated_images/zh-TW/life.86d843ce9c23289c.webp diff --git a/translated_images/tw/localstorage.472f8147b6a3f8d1.webp b/translated_images/zh-TW/localstorage.472f8147b6a3f8d1.webp similarity index 100% rename from translated_images/tw/localstorage.472f8147b6a3f8d1.webp rename to translated_images/zh-TW/localstorage.472f8147b6a3f8d1.webp diff --git a/translated_images/tw/log.804026979f3707e0.webp b/translated_images/zh-TW/log.804026979f3707e0.webp similarity index 100% rename from translated_images/tw/log.804026979f3707e0.webp rename to translated_images/zh-TW/log.804026979f3707e0.webp diff --git a/translated_images/tw/login-error.416fe019b36a6327.webp b/translated_images/zh-TW/login-error.416fe019b36a6327.webp similarity index 100% rename from translated_images/tw/login-error.416fe019b36a6327.webp rename to translated_images/zh-TW/login-error.416fe019b36a6327.webp diff --git a/translated_images/tw/meteorBig.1e452b3ad7af50ad.webp b/translated_images/zh-TW/meteorBig.1e452b3ad7af50ad.webp similarity index 100% rename from translated_images/tw/meteorBig.1e452b3ad7af50ad.webp rename to translated_images/zh-TW/meteorBig.1e452b3ad7af50ad.webp diff --git a/translated_images/tw/meteorSmall.0d729bc71c12d41f.webp b/translated_images/zh-TW/meteorSmall.0d729bc71c12d41f.webp similarity index 100% rename from translated_images/tw/meteorSmall.0d729bc71c12d41f.webp rename to translated_images/zh-TW/meteorSmall.0d729bc71c12d41f.webp diff --git a/translated_images/tw/moodle.94eb93d714a50cb2.webp b/translated_images/zh-TW/moodle.94eb93d714a50cb2.webp similarity index 100% rename from translated_images/tw/moodle.94eb93d714a50cb2.webp rename to translated_images/zh-TW/moodle.94eb93d714a50cb2.webp diff --git a/translated_images/tw/mpa.7f7375a1a2d4aa77.webp b/translated_images/zh-TW/mpa.7f7375a1a2d4aa77.webp similarity index 100% rename from translated_images/tw/mpa.7f7375a1a2d4aa77.webp rename to translated_images/zh-TW/mpa.7f7375a1a2d4aa77.webp diff --git a/translated_images/tw/nebula.55c2933d36d035d3.webp b/translated_images/zh-TW/nebula.55c2933d36d035d3.webp similarity index 100% rename from translated_images/tw/nebula.55c2933d36d035d3.webp rename to translated_images/zh-TW/nebula.55c2933d36d035d3.webp diff --git a/translated_images/tw/new-file-github.com.c886796d800e8056.webp b/translated_images/zh-TW/new-file-github.com.c886796d800e8056.webp similarity index 100% rename from translated_images/tw/new-file-github.com.c886796d800e8056.webp rename to translated_images/zh-TW/new-file-github.com.c886796d800e8056.webp diff --git a/translated_images/tw/open-palette-menu.46dda01084738da8.webp b/translated_images/zh-TW/open-palette-menu.46dda01084738da8.webp similarity index 100% rename from translated_images/tw/open-palette-menu.46dda01084738da8.webp rename to translated_images/zh-TW/open-palette-menu.46dda01084738da8.webp diff --git a/translated_images/tw/open-remote-repository.bd9c2598b8949e7f.webp b/translated_images/zh-TW/open-remote-repository.bd9c2598b8949e7f.webp similarity index 100% rename from translated_images/tw/open-remote-repository.bd9c2598b8949e7f.webp rename to translated_images/zh-TW/open-remote-repository.bd9c2598b8949e7f.webp diff --git a/translated_images/tw/palette-menu.4946174e07f42622.webp b/translated_images/zh-TW/palette-menu.4946174e07f42622.webp similarity index 100% rename from translated_images/tw/palette-menu.4946174e07f42622.webp rename to translated_images/zh-TW/palette-menu.4946174e07f42622.webp diff --git a/translated_images/tw/partI-solution.36c53b48c9ffae2a.webp b/translated_images/zh-TW/partI-solution.36c53b48c9ffae2a.webp similarity index 100% rename from translated_images/tw/partI-solution.36c53b48c9ffae2a.webp rename to translated_images/zh-TW/partI-solution.36c53b48c9ffae2a.webp diff --git a/translations/hk/1-getting-started-lessons/1-intro-to-programming-languages/README.md b/translations/hk/1-getting-started-lessons/1-intro-to-programming-languages/README.md deleted file mode 100644 index 6e23c077a..000000000 --- a/translations/hk/1-getting-started-lessons/1-intro-to-programming-languages/README.md +++ /dev/null @@ -1,862 +0,0 @@ - -# 程式語言與現代開發工具簡介 - -嗨,未來的開發者!👋 可不可以跟你說件每天都讓我雞皮疙瘩掉滿地的事?你即將發現,程式設計不只是關於電腦——它是擁有真正超能力,把你最狂野的想法實現出來的能力! - -你知道那種用你最喜歡的 app,所有操作都剛剛好完美連接的瞬間嗎?當你按一個按鈕,然後發生了某種完全神奇的事,讓你忍不住想說「哇,他們到底怎麼做到的?」剛好,某個跟你一樣的人——可能正坐在他最喜歡的咖啡店裡凌晨兩點,喝著第三杯濃縮咖啡——寫了造就那魔法的程式碼。你將親眼見證的令人震驚的事是:到了這節課結束,你不僅會理解他們是怎麼做到的,還會迫不及待想要自己試試看! - -聽著,如果你覺得程式設計現在很可怕,我完全可以理解。當我剛開始時,我真的以為你需要是某種數學天才,或者從五歲就開始寫程式。但徹底改變我觀念的是這件事:程式設計就像學一門語言溝通一樣。你從「你好」和「謝謝」學起,然後開始點咖啡,不知不覺你開始進行深刻的哲學討論!只不過在這案例裡,你是在和電腦對話。說真的?它們是你能找到的最有耐性的對話夥伴——它們從不責備你的錯誤,而是永遠準備好再試一次! - -今天,我們將探索現代網頁開發令人驚嘆的工具,讓它不僅僅是可行,而是讓人嚴重上癮。我說的就是 Netflix、Spotify 和你喜歡的獨立應用工作室每天使用的同一套編輯器、瀏覽器和工作流程。最棒的是:這些專業級、業界標準的工具大多數都是完全免費的! - -![Intro Programming](../../../../translated_images/zh-HK/webdev101-programming.d6e3f98e61ac4bff.webp) -> Sketchnote by [Tomomi Imura](https://twitter.com/girlie_mac) - -```mermaid -journey - title 你今日嘅程式編寫旅程 - section 發現 - 乜嘢係程式設計: 5: You - 程式語言: 4: You - 工具概覽: 5: You - section 探索 - 程式碼編輯器: 4: You - 瀏覽器同開發者工具: 5: You - 指令行: 3: You - section 練習 - 語言偵探: 4: You - 工具探索: 5: You - 社群連繫: 5: You -``` -## 讓我們看看你已經知道些什麼! - -在跳進有趣的內容前,我很好奇——你對程式設計這個世界已經知道多少?聽著,如果你看到這些問題心想「我根本完全沒概念」,那不只是可以,反而是完美!這表示你正處於正確位置。把這個小測驗想成運動前的暖身——我們只是熱身大腦肌肉! - -[做課前測驗](https://forms.office.com/r/dru4TE0U9n?origin=lprLink) - - -## 我們即將一起展開的冒險 - -好啦,我真心為我們今天將探討的東西興奮到蹦蹦跳!說真的,我希望能看到當你理解這些概念的那張臉。這就是我們一起踏上的驚奇旅程: - -- **什麼是程式設計(以及為什麼它超酷!)** – 我們要了解程式碼如何成為背後無形魔法,驅動你周遭一切,從那個能準時知道是星期一早晨的鬧鐘,到完美推薦你 Netflix 節目的算法 -- **程式語言和它們奇妙的個性** – 想像走進一場派對,每個人都有完全不同的超能力和解決問題的方法。這就是程式語言的世界,你會很享受認識它們! -- **數位魔法的基本構件** – 想像這是終極創意樂高組合套件。一旦你了解這些積木怎麼拼組,你會發現你實際上能打造出你想像的任何東西 -- **讓你感覺像握到魔法棒的專業工具** – 我不是誇張——這些工具真的會讓你覺得你有超能力,最棒的是?它們是專業人士每天使用的! - -> 💡 **重點是**:今天不要想著要全部記住!我現在只想讓你感受到對可能性的那股興奮。細節會隨著我們一起練習自然記住——真正的學習就是這樣發生的! - -> 你也可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/introduction-programming/?WT.mc_id=academic-77807-sagibbon) 上進行這堂課程! - -## 那麼究竟什麼是*程式設計*? - -好,來回答百萬美元的問題:程式設計到底是什麼? - -我來分享一個徹底改變我思考的故事。上週我試著向媽媽解釋如何使用我們的新智慧電視遙控器。結果我發現自己一直在說「按紅色的按鈕,不是大紅色的,是左邊那個小紅色的…不,是另一個左邊…好,現在按住兩秒,不是一秒,不是三秒…」聽起來很熟悉嗎?😅 - -這就是程式設計!它是對一個非常強大的東西,給出極度詳細、逐步的指令,而它需要所有步驟都說得非常清楚的藝術。只不過你不是在解釋給媽媽聽(她可以問「哪個紅色按鈕?!」),而是在解釋給電腦——電腦會精確執行你說的每一句話,即便你真正想說的不是這樣。 - -第一次學到這點時讓我震撼的是:電腦其實本質非常簡單。它們字面上只懂兩個東西——1 和 0,基本上就是「是」和「否」或「開」和「關」。就這樣!但神奇之處在於——我們不必像《駭客任務》裡那樣只說 1 和 0 。這時就是**程式語言**大顯身手的地方。它們就像世界上最棒的翻譯官,把你正常的人類思考完美地轉換成電腦語言。 - -而每天早上醒來仍讓我起雞皮疙瘩的是:你生活中所有數位東西都是由跟你一樣的人開始的,可能他們穿著睡衣,手裡拿著咖啡,在筆電前敲著程式碼。讓你看起來完美無瑕的 Instagram 濾鏡?有人寫了那程式碼。推推薦你發現新歌的算法?一位開發者設計了它。幫你和朋友分餐費用的 app?沒錯,有人想「這很煩,我一定能解決它」,結果…他們做到了! - -學程式不僅是學新技術——你是加入這個超棒的問題解決社群,他們每天的想法是,「如果我能做出些什麼讓別人的生活更好一點點呢?」說真的,還有比這更帥的事嗎? - -✅ **趣味知識探索**:有空時去查查世界上第一位程式設計師是誰?提示一下:她可能不是你預期的人!她的故事非常吸引人,而且證明了程式設計一直是關於創意解決問題和跳出框架思考。 - -### 🧠 **回顧時間:你感覺如何?** - -**花點時間反思:** -- 「給電腦下指令」的概念現在對你來說有意義嗎? -- 你能想到想用程式自動化的日常任務嗎? -- 關於程式設計,你腦中冒出什麼問題? - -> **記住**:如果某些概念現在還模糊是完全正常的。學程式就像學一門新語言——你的大腦需要時間建立神經通路。你做得很棒! - -## 程式語言就像不同口味的魔法 - -好啦,這聽起來怪怪的,但跟我走——程式語言很像不同類型的音樂。想想看:有浪漫即興的爵士樂、強而有力的搖滾、典雅嚴謹的古典樂和充滿創造力與表達的嘻哈。每種風格都有自己的氛圍、熱情粉絲社群,也適合不同心情和場合。 - -程式語言也是如此!你不會用同一種語言寫一款有趣的手機遊戲和處理大量氣候數據的程式,就像你不會在瑜伽課播放死亡金屬(嗯,大多數瑜伽課至少是這樣😄)。 - -每次想起這點,我都覺得超神奇:這些語言就像世界上最有耐性的、最聰明的口譯員坐在你旁邊。你以對你腦子自然的方式表達想法,它們處理把這些轉成電腦真正懂的 1 和 0。就像你有一位朋友同時流利「人類創意」和「電腦邏輯」——而且永不疲倦、不需要喝咖啡休息,也不會因為你問第二次同樣問題而嘲笑你! - -### 熱門程式語言與用途 - -```mermaid -mindmap - root((程式語言)) - Web Development - JavaScript - 前端魔法 - 互動網站 - TypeScript - JavaScript + 類型 - 企業應用 - Data & AI - Python - 數據科學 - 機器學習 - 自動化 - R - 統計學 - 研究 - Mobile Apps - Java - 安卓 - 企業 - Swift - iOS - 蘋果生態系統 - Kotlin - 現代安卓 - 跨平台 - Systems & Performance - C++ - 遊戲 - 性能關鍵 - Rust - 記憶體安全 - 系統編程 - Go - 雲端服務 - 可擴展後端 -``` -| 語言 | 最適合的用途 | 為什麼受歡迎 | -|----------|----------|------------------| -| **JavaScript** | 網頁開發、使用者介面 | 在瀏覽器執行,驅動互動網站 | -| **Python** | 數據科學、自動化、AI | 易讀易學,擁有強大函式庫 | -| **Java** | 企業應用、Android 應用 | 跨平台,適合大型系統 | -| **C#** | Windows 應用、遊戲開發 | 微軟生態系統強力支援 | -| **Go** | 雲端服務、後端系統 | 快速、簡單,為現代運算設計 | - -### 高階語言 vs 低階語言 - -說實話,這是我剛開始學程式時完全被弄得暈頭轉向的概念,所以我會分享讓我終於理解的比喻——希望也能幫助你! - -想像你去到一個陌生國家,你不會說當地語言,而你急著要找廁所(大家都有這經驗吧?😅): - -- **低階程式設計** 就像你學會當地方言,甚至能跟街角賣水果的老奶奶用文化暗號、地方俚語和只有在當地長大的人才懂的笑話聊天。超厲害而且效率超高……但前提是你必須流利!不然光找廁所就快瘋掉。 - -- **高階程式設計** 就像你有個超棒的當地朋友理解你。你只要用簡單的英文說「我很需要找廁所」,他就會做所有文化轉換,給你用你這個局外人腦袋能懂的指引。 - -用程式語言來說: -- **低階語言**(像組合語言或 C)讓你能和電腦硬體進行非常細緻的對話,但你必須用機器的思維方式——嗯,可以說是大腦大轉彎! -- **高階語言**(像 JavaScript、Python 或 C#)讓你用人的思考方式,而它們在背後處理所有機器語言的轉換。而且它們還有熱情的社群,有許多曾經是新手的人,真心想幫忙! - -你猜我建議從哪開始?😉 高階語言就像有輔助輪,你會捨不得拆掉,因為它讓整個體驗愉快許多! - -```mermaid -flowchart TB - A["👤 人類思考:
'我想計算費波納契數列'"] --> B{選擇語言層級} - - B -->|高階| C["🌟 JavaScript/Python
易讀易寫"] - B -->|低階| D["⚙️ 組合語言/C
直接硬體控制"] - - C --> E["📝 撰寫:fibonacci(10)"] - D --> F["📝 撰寫:mov r0,#00
sub r0,r0,#01"] - - E --> G["🤖 電腦理解:
翻譯器處理複雜性"] - F --> G - - G --> H["💻 相同結果:
0, 1, 1, 2, 3, 5, 8, 13..."] - - style C fill:#e1f5fe - style D fill:#fff3e0 - style H fill:#e8f5e8 -``` -### 讓我告訴你為什麼高階語言更友善 - -好,我馬上展示一個絕佳例子,說明我為何愛上高階語言。不過先請你答應我一件事。看到第一個程式碼範例時,別怕!看起來嚇人完全是我的重點! - -我們會用兩種完全不同方式寫同樣的任務。兩個都產生所謂的費氏數列——這是一個美麗的數學模式,每個數字都是前兩個數字之和:0、1、1、2、3、5、8、13……(趣味知識:你會在大自然各處找到這個模式——向日葵種子漩渦、松果圖案、甚至星系形成方式!) - -準備好看到差異了嗎?出發! - -**高階語言(JavaScript)– 對人類友善:** - -```javascript -// 第一步:基本斐波那契設置 -const fibonacciCount = 10; -let current = 0; -let next = 1; - -console.log('Fibonacci sequence:'); -``` - -**這段程式碼做了什麼:** -- **宣告** 一個常數指定要產生多少 Fibonacci 數字 -- **初始化** 兩個變數追蹤目前和下一個序列數字 -- **設定** 起始值(0 和 1)定義 Fibonacci 模式 -- **顯示** 標題訊息辨識輸出 - -```javascript -// 步驟 2:使用迴圈生成序列 -for (let i = 0; i < fibonacciCount; i++) { - console.log(`Position ${i + 1}: ${current}`); - - // 計算序列中的下一個數字 - const sum = current + next; - current = next; - next = sum; -} -``` - -**分解運作過程:** -- **使用** `for` 迴圈走訪序列的每個位置 -- **顯示** 每個數字及其位置,使用模板字串格式化 -- **計算** 下一個 Fibonacci 數字為現值與次值相加 -- **更新** 追蹤變數,以進入下一輪迴圈 - -```javascript -// 第三步:現代函數式方法 -const generateFibonacci = (count) => { - const sequence = [0, 1]; - - for (let i = 2; i < count; i++) { - sequence[i] = sequence[i - 1] + sequence[i - 2]; - } - - return sequence; -}; - -// 使用範例 -const fibSequence = generateFibonacci(10); -console.log(fibSequence); -``` - -**在上面,我們:** -- **創建** 使用現代箭頭函數語法的可重複使用函式 -- **建構** 陣列儲存完整序列,而非逐個顯示 -- **使用** 陣列索引由前值計算每個新數字 -- **回傳** 完整序列以便程序其他部分彈性使用 - -**低階語言(ARM 組合語言)– 對電腦友善:** - -```assembly - area ascen,code,readonly - entry - code32 - adr r0,thumb+1 - bx r0 - code16 -thumb - mov r0,#00 - sub r0,r0,#01 - mov r1,#01 - mov r4,#10 - ldr r2,=0x40000000 -back add r0,r1 - str r0,[r2] - add r2,#04 - mov r3,r0 - mov r0,r1 - mov r1,r3 - sub r4,#01 - cmp r4,#00 - bne back - end -``` - -注意 JavaScript 幾乎像英文指令一樣易讀,而組合語言用神秘指令直接控制電腦處理器。兩者完成完全相同的任務,但高階語言對人類來說更容易理解、撰寫和維護。 - -**你會注意到的主要差異:** -- **可讀性**:JavaScript 使用描述性名稱如 `fibonacciCount`,組合語言用難懂標籤如 `r0`、`r1` -- **註解**:高階語言鼓勵使用解釋性的註解,使程式碼本身成為自我說明 -- **結構**:JavaScript 的邏輯流程與人類逐步思考問題的方式相符合 -- **維護**:根據不同需求更新 JavaScript 版本是直觀且清晰的 - -✅ **關於費波那契數列**:這個絕美的數字模式(每個數字是前兩項的和:0、1、1、2、3、5、8……)幾乎在自然界到處可見!你會在向日葵螺旋、松果排列、鳳梨貝殼的弧度,甚至樹枝的生長方式中看到它。數學與程式碼如何幫助我們理解並重現自然用來創造美的模式,實在令人驚嘆! - - -## 讓魔法發生的基本元素 - -好了,現在你已經見識過程式語言的實際運作,我們來拆解構成每一段程式碼的基本部分。把這些想成你最愛食譜中的關鍵材料──一旦瞭解每個元素的功能,你就能閱讀並撰寫幾乎任何語言的程式碼! - -這有點像學習程式設計的文法。還記得學校時學過名詞、動詞以及如何組成句子嗎?程式語言也有自己的文法,老實說,它比英文文法邏輯多也更寬容!😄 - -### 陳述句:逐步指令 - -先從 **陳述句** 開始──它們就像與電腦對話中的單句話。每句陳述告訴電腦要做一件具體的事,就像指示:「這裡左轉」、「紅燈停下」、「停在那個車位」。 - -我喜歡陳述句的是它們通常很易讀。看看這個: - -```javascript -// 執行單一操作的基本語句 -const userName = "Alex"; -console.log("Hello, world!"); -const sum = 5 + 3; -``` - -**這段程式碼做了什麼:** -- **宣告**一個常數變數來存放使用者名稱 -- **顯示**歡迎訊息到控制台輸出 -- **計算**並儲存一個數學運算結果 - -```javascript -// 與網頁互動的語句 -document.title = "My Awesome Website"; -document.body.style.backgroundColor = "lightblue"; -``` - -**一步一步看發生了什麼:** -- **修改**瀏覽器頁籤上顯示的網頁標題 -- **變更**整個頁面內容的背景顏色 - -### 變數:程式的記憶體系統 - -說實話,**變數** 是我最喜歡教的概念之一,因為它們就像你每天都會用到的東西! - -想像一下你的手機聯絡人列表。你不會記得每個人的電話號碼──而是將「媽媽」、「最好的朋友」或「凌晨兩點還送披薩的店」存起來,讓手機記住實際的號碼。變數就是這樣!它們是有標籤的容器,你的程式可以使用有意義的名稱存取資訊。 - -更酷的是:變數會隨著程式運行而改變(所以叫「變數」──你懂的吧?)。就像發現更好的披薩店時會更新聯絡資訊一樣,變數能隨著程式得到新資訊或情況改變而更新! - -讓我示範這有多簡單又美妙: - -```javascript -// 第一步:建立基本變量 -const siteName = "Weather Dashboard"; -let currentWeather = "sunny"; -let temperature = 75; -let isRaining = false; -``` - -**理解這些概念:** -- **存放**不變的數值到 `const` 變數(比如網站名稱) -- **使用** `let` 定義可變動的數值 -- **賦予**不同的資料型態:字串(文字)、數字及布林值(真/假) -- **選擇**描述性的名稱說明變數內容 - -```javascript -// 第 2 步:使用物件來群組相關資料 -const weatherData = { - location: "San Francisco", - humidity: 65, - windSpeed: 12 -}; -``` - -**上面我們:** -- **建立**一個物件來群組相關的天氣資訊 -- **整理**多筆資料放在同一個變數名稱下 -- **用**鍵值對清楚標示每筆資訊 - -```javascript -// 第3步:使用及更新變數 -console.log(`${siteName}: Today is ${currentWeather} and ${temperature}°F`); -console.log(`Wind speed: ${weatherData.windSpeed} mph`); - -// 更新可變變數 -currentWeather = "cloudy"; -temperature = 68; -``` - -**理解每個部分:** -- **顯示**內容使用帶有 `${}` 語法的模板字串 -- **使用**點記法 (`weatherData.windSpeed`) 取物件屬性 -- **更新**使用 `let` 宣告的變數以反映變化 -- **結合**多個變數創造有意義的訊息 - -```javascript -// 第4步:使用現代解構賦值以使代碼更清晰 -const { location, humidity } = weatherData; -console.log(`${location} humidity: ${humidity}%`); -``` - -**你需要知道的:** -- **從物件中解構賦值以擷取特定屬性** -- **創建與物件鍵相同名稱的新變數** -- **簡化程式碼,避免反覆使用點記法** - -### 控制流程:教你的程式思考 - -好了,這就是程式設計讓人驚嘆的地方!**控制流程** 就是教你的程式如何做出智慧決策,就像你每天不假思索地做的一樣。 - -想像一下:今天早上你可能心裡想「如果下雨,我就帶傘;如果很冷,我會穿外套;如果我遲到了,我會跳過早餐順路買杯咖啡。」你的大腦天然遵循這種如果──那麼的邏輯,天天做好幾十次! - -這就是為什麼程式感覺聰明又活潑,而不只是乏味、可預測的腳本。它們真能看情況、評估狀況,並適當回應。就像給你的程式一顆能適應並做決定的大腦! - -想看看這個邏輯怎麼精采運作?讓我示範: - -```javascript -// 第一步:基本條件邏輯 -const userAge = 17; - -if (userAge >= 18) { - console.log("You can vote!"); -} else { - const yearsToWait = 18 - userAge; - console.log(`You'll be able to vote in ${yearsToWait} year(s).`); -} -``` - -**這段程式碼做的事:** -- **檢查**使用者是否達到投票年齡要求 -- **依條件結果執行**不同程式區塊 -- **計算**並顯示距離投票資格還要多久(如果未滿18歲) -- **針對各情況提供**具體有用的回饋 - -```javascript -// 第 2 步:使用邏輯運算子設置多重條件 -const userAge = 17; -const hasPermission = true; - -if (userAge >= 18 && hasPermission) { - console.log("Access granted: You can enter the venue."); -} else if (userAge >= 16) { - console.log("You need parent permission to enter."); -} else { - console.log("Sorry, you must be at least 16 years old."); -} -``` - -**解析這裡發生的事:** -- **用 `&&`(且)運算子結合多個條件** -- **用 `else if` 建立多層條件階層處理多種情況** -- **最後用 `else` 處理所有剩餘可能狀況** -- **為每種情況提供明確可執行的回饋** - -```javascript -// 第三步:使用三元運算子寫簡潔的條件判斷 -const votingStatus = userAge >= 18 ? "Can vote" : "Cannot vote yet"; -console.log(`Status: ${votingStatus}`); -``` - -**你需要記住:** -- **用三元運算子(`? :`)處理簡單的兩種條件** -- **先寫條件,接著 `?`,然後是條件成立結果,接著是 `:`,最後是不成立結果** -- **當要根據條件賦值時運用此模式** - -```javascript -// 第4步:處理多個特定情況 -const dayOfWeek = "Tuesday"; - -switch (dayOfWeek) { - case "Monday": - case "Tuesday": - case "Wednesday": - case "Thursday": - case "Friday": - console.log("It's a weekday - time to work!"); - break; - case "Saturday": - case "Sunday": - console.log("It's the weekend - time to relax!"); - break; - default: - console.log("Invalid day of the week"); -} -``` - -**這段程式碼完成的事:** -- **根據變數值匹配多個具體案例** -- **將類似案例(平日與週末)分組** -- **找到匹配時執行對應區塊** -- **包含 `default` 處理意外值** -- **用 `break` 阻止程式繼續執行後續案例** - -> 💡 **現實世界類比**:把控制流程想成世界上最有耐心的 GPS 指路員。它可能說「如果主要幹道塞車,改走高速公路。如果高速公路施工,試試風景路線。」程式用完全相同的條件邏輯,智能地回應不同情況,總給使用者最佳體驗。 - -### 🎯 **概念檢視:基礎元素精通** - -**讓我們來看看你基礎掌握得如何:** -- 你能用自己的話解釋變數和陳述句的不同嗎? -- 想一個現實例子,使用 if-then 決策(就像投票範例) -- 程式邏輯中,有什麼令你感到意外的事? - -**快速信心提升:** -```mermaid -flowchart LR - A["📝 陳述
(指令)"] --> B["📦 變量
(儲存)"] --> C["🔀 控制流程
(決策)"] --> D["🎉 工作程式!"] - - style A fill:#ffeb3b - style B fill:#4caf50 - style C fill:#2196f3 - style D fill:#ff4081 -``` -✅ **接著要探討的是**:我們將一起深入挖掘這些概念,展開一段令人興奮的旅程!現在只要感受未來諸多精彩可能帶來的興奮。隨著練習,特定技巧和方法自然會掌握──我保證這比你想像中還更有趣! - -## 開發工具 - -說真的,這裡是我最興奮到快控制不住自己的一部分!🚀 我們將說說那些令人感覺像握到了數位太空船鑰匙的神奇工具。 - -你知道廚師手中完美平衡、彷彿化身為手的刀具嗎?或是音樂家那把一碰就奏出美妙音符的吉他?開發者也有我們自己的神奇工具,而下面這些會徹底顛覆你的想像──其中大多完全免費! - -我自己坐立難安想跟你分享這些,因為它們徹底改變了我們打造軟體的方式。我們談的是由 AI 助理撰寫程式碼的工具(我不是開玩笑!)、可以從任何有 Wi-Fi 的地方建立整個應用的雲端環境,還有讓你程式宛如 X 光般透視的偵錯工具。 - -震撼的是:這些不是你用一陣子就會丟掉的「新手工具」,它們就是 Google、Netflix 還有你喜歡的獨立應用工作室活躍開發者此刻用的專業級工具。你會用它們感覺像個專家! - -```mermaid -graph TD - A["💡 你的點子"] --> B["⌨️ 程式碼編輯器
(VS Code)"] - B --> C["🌐 瀏覽器開發工具
(測試與除錯)"] - C --> D["⚡ 命令列
(自動化與工具)"] - D --> E["📚 文件說明
(學習與參考)"] - E --> F["🚀 超讚的網頁應用!"] - - B -.-> G["🤖 AI 助理
(GitHub Copilot)"] - C -.-> H["📱 裝置測試
(響應式設計)"] - D -.-> I["📦 套件管理器
(npm, yarn)"] - E -.-> J["👥 社群
(Stack Overflow)"] - - style A fill:#fff59d - style F fill:#c8e6c9 - style G fill:#e1f5fe - style H fill:#f3e5f5 - style I fill:#ffccbc - style J fill:#e8eaf6 -``` -### 程式碼編輯器與整合開發環境:你的新數位好夥伴 - -談談程式碼編輯器──這可真快成為你最愛聚集的地方!把它想成你的程式碼聖地,你會花最多時間在這裡編寫和優化數位創作。 - -而且現代編輯器超魔法──它們不只是花俏的文本編輯器。它們就像全天候坐在你旁邊、無比聰明而且支持你寫程式的導師。它們會在你發現錯字之前找到它們,建議改善讓你看起來更厲害,還幫你理解每段程式碼在做什麼,其中一些甚至能預測你下一步打什麼與你的想法! - -我還記得第一次發現自動完成功能──感覺彷彿生活在未來。你開始打字,編輯器就跳出來說:「诶,你是不是想用這個,剛好能幫你完成需要的功能?」就像有個心靈感應的程式碼夥伴! - -**令這些編輯器不可思議的原因?** - -現代程式碼編輯器提供一系列功能,設計來提升你的生產力: - -| 功能 | 功能說明 | 為何有用 | -|---------|--------------|--------------| -| **語法高亮** | 為程式碼不同部分著色 | 讓程式碼更易讀與找錯 | -| **自動完成** | 打字時推薦程式碼 | 加快寫程式速度並減少錯字 | -| **除錯工具** | 幫你找到並修正錯誤 | 節省無數除錯時間 | -| **擴充功能** | 新增專業化能力 | 讓你能依技術需求客製編輯器 | -| **AI 助手** | 建議程式碼與解說 | 加速學習與工作效率 | - -> 🎥 **影片資源**:想實際看看這些工具的運作?請觀看這部 [Tools of the Trade video](https://youtube.com/watch?v=69WJeXGBdxg) 獲得完整介紹。 - -#### 推薦給網頁開發者的編輯器 - -**[Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon)**(免費) -- 網頁開發者最火紅的編輯器 -- 擁有豐富擴充生態系 -- 內建終端機與 Git 整合 -- **必裝擴充**: - - [GitHub Copilot](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) - AI 程式碼建議 - - [Live Share](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare) - 即時協作 - - [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) - 自動格式化程式碼 - - [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker) - 抓出程式碼錯字 - -**[JetBrains WebStorm](https://www.jetbrains.com/webstorm/)**(付費,學生免費) -- 進階除錯與測試工具 -- 智慧程式碼補全 -- 內建版本控制 - -**雲端 IDE**(多種定價) -- [GitHub Codespaces](https://github.com/features/codespaces) - 瀏覽器中完整 VS Code -- [Replit](https://replit.com/) - 非常適合學習與分享程式碼 -- [StackBlitz](https://stackblitz.com/) - 即時全端網頁開發 - -> 💡 **入門建議**:先用 Visual Studio Code──它免費,行業使用率高,社群及教學資源豐富。 - -### 網頁瀏覽器:你的秘密開發實驗室 - -準備好徹底被震撼了嗎!你知道一直以來用瀏覽器滑社交媒體和看影片,其實它們藏著一個巨大的秘密開發實驗室? - -每次你在網頁上點右鍵選「檢查」元素,就是在開啟一個隱藏的開發者工具世界──它們強大到比我以前花大錢買的某些軟體還厲害。就像發現你平凡廚房後面藏著一座專業大廚實驗室的秘密通道! -第一次有人向我展示瀏覽器 DevTools 時,我花了差不多三個小時一直點來點去,然後不停地說:「等等,原來它仲可以做呢啲嘢?!」你可以即時修改任何網站,準確睇到每樣嘢加載嘅速度,測試你嘅網站喺唔同裝置上嘅效果,甚至可以好似專業人士咁除錯 JavaScript。真係令人嘆為觀止! - -**以下係瀏覽器成為你秘密武器嘅原因:** - -當你建立網站或者網頁應用程式時,你需要睇下佢喺現實世界中嘅外觀同埋行為。瀏覽器唔單止係用嚟顯示你嘅作品,仲會提供有關效能、無障礙性同埋潛在問題嘅詳細反饋。 - -#### 瀏覽器開發者工具(DevTools) - -現代瀏覽器包咗全面嘅開發套件: - -| 工具類別 | 功能 | 使用範例 | -|---------------|--------------|------------------| -| **元素檢查器** | 即時檢視同編輯 HTML/CSS | 調整樣式,立即睇到結果 | -| **主控台** | 查看錯誤訊息同測試 JavaScript | 除錯問題同試驗代碼 | -| **網絡監控器** | 跟踪資源加載情況 | 優化效能同載入時間 | -| **無障礙檢查器** | 測試包容性設計 | 確保網站適合所有用戶使用 | -| **裝置模擬器** | 預覽不同屏幕尺寸效果 | 測試響應式設計無需多部裝置 | - -#### 推薦開發用瀏覽器 - -- **[Chrome](https://developers.google.com/web/tools/chrome-devtools/)** - 業界標準 DevTools,有豐富文檔 -- **[Firefox](https://developer.mozilla.org/docs/Tools)** - 出色嘅 CSS Grid 同無障礙工具 -- **[Edge](https://docs.microsoft.com/microsoft-edge/devtools-guide-chromium/?WT.mc_id=academic-77807-sagibbon)** - 基於 Chromium,配合微軟開發資源 - -> ⚠️ **重要測試提示**:一定要喺多個瀏覽器上測試網站!喺 Chrome 完美運作嘅嘢,可能喺 Safari 或 Firefox 呈現唔同。專業開發者會喺所有主流瀏覽器測試,確保用戶體驗一致。 - - -### 命令行工具:開發者超能力之門 - -好啦,講真,我哋依家誠實吓講命令行,因為我想你聽聽一個真係明白你嘅人嘅心聲。初次見到佢嗰陣──只係一個可怕嘅黑色畫面同閃動字元──我真係以為:「唔,好唔得!呢啲好似1980年代駭客電影入面先有嘅,完全唔係我啱用嘅!」😅 - -但我希望當年有人告訴我(而家我就告訴你):命令行唔驚人──其實好似直接同你嘅電腦對話咁。想像下,叫外賣經過一個有圖有菜單嘅高級app(好方便),同埋行入你最愛嘅本地餐廳,廚師只需你一句「驚喜點啲特別嘢畀我」就整返啱你嘅餐點,兩者完全不一樣。 - -命令行係開發者感覺自己成為巫師嘅地方。你打幾個似乎好神奇嘅字(好啦,其實就係指令,但佢哋感覺好神奇!),按 enter,嘭──你就建立咗整個項目結構,從全球安裝強大工具,或者把你嘅應用部署到互聯網,畀數百萬人睇到。試過一次嗰種力量,真係令人上癮! - -**點解命令行會成為你最愛嘅工具:** - -雖然圖形介面好適合好多任務,但命令行擅長自動化、精確同速度。好多開發工具主要透過命令行介面操作,而學懂點高效使用可以大大提升你嘅生產力。 - -```bash -# 第一步:創建並進入專案目錄 -mkdir my-awesome-website -cd my-awesome-website -``` - -**呢段代碼做緊啲咩:** -- **建立** 一個叫 "my-awesome-website" 嘅新目錄俾你嘅項目用 -- **進入** 新建立嘅目錄開始工作 - -```bash -# 第2步:使用 package.json 初始化項目 -npm init -y - -# 安裝現代開發工具 -npm install --save-dev vite prettier eslint -npm install --save-dev @eslint/js -``` - -**一步步嘅流程說明:** -- **初始化** 使用 `npm init -y` 用預設設置建立新嘅 Node.js 項目 -- **安裝** Vite 作為快速開發同生產構建嘅現代構建工具 -- **添加** Prettier 用自動格式化代碼,ESLint 用檢查代碼質量 -- **用** `--save-dev` 標記佢哋係僅開發時依賴 - -```bash -# 第三步:建立項目結構及檔案 -mkdir src assets -echo 'My Site

Hello World

' > index.html - -# 啟動開發伺服器 -npx vite -``` - -**上面我哋做咗:** -- **組織** 項目,建立源代碼同資源嘅獨立資料夾 -- **生成** 一個基本嘅 HTML 文件,包含正確嘅文件結構 -- **啟動** Vite 開發服務器,支持即時重新載入同模組熱替換 - -#### 網頁開發必備命令行工具 - -| 工具 | 作用 | 為何需要 | -|------|---------|-----------------| -| **[Git](https://git-scm.com/)** | 版本控制 | 追蹤更改,協作,備份工作 | -| **[Node.js & npm](https://nodejs.org/)** | JavaScript 執行環境及包管理 | 喺瀏覽器以外運行 JavaScript,安裝現代開發工具 | -| **[Vite](https://vitejs.dev/)** | 構建工具及開發伺服器 | 極速開發支援模組熱替換 | -| **[ESLint](https://eslint.org/)** | 代碼質量 | 自動發現及修復 JavaScript 問題 | -| **[Prettier](https://prettier.io/)** | 代碼格式化 | 保持代碼格式一致且易讀 | - -#### 平台特定選擇 - -**Windows:** -- **[Windows Terminal](https://docs.microsoft.com/windows/terminal/?WT.mc_id=academic-77807-sagibbon)** - 現代功能豐富嘅終端 -- **[PowerShell](https://docs.microsoft.com/powershell/?WT.mc_id=academic-77807-sagibbon)** 💻 - 強大嘅腳本環境 -- **[Command Prompt](https://docs.microsoft.com/windows-server/administration/windows-commands/?WT.mc_id=academic-77807-sagibbon)** 💻 - 傳統嘅 Windows 命令行 - -**macOS:** -- **[Terminal](https://support.apple.com/guide/terminal/)** 💻 - 內置終端應用 -- **[iTerm2](https://iterm2.com/)** - 帶進階功能嘅增強終端 - -**Linux:** -- **[Bash](https://www.gnu.org/software/bash/)** 💻 - Linux 標準 shell -- **[KDE Konsole](https://docs.kde.org/trunk5/en/konsole/konsole/index.html)** - 進階終端模擬器 - -> 💻 = 作業系統預裝 - -> 🎯 **學習路線**:由基本命令開始學起,例如 `cd`(切換目錄)、`ls` 或 `dir`(列出檔案)、`mkdir`(建立資料夾)。練習現代工作流程常用命令,例如 `npm install`、`git status` 同 `code .`(喺 VS Code 開啟目前資料夾)。隨住習慣,會自然而然掌握更高級命令同自動化技巧。 - - -### 文件:你永遠可用嘅學習導師 - -好啦,畀我講個秘密令你作為初學者心裡好啲:就算最有經驗嘅開發者,都花大量時間喺睇文件上。唔係因為佢哋唔識做──其實反而係智慧嘅象徵! - -諗吓文件就似全天候全年無休嘅最有耐性、最識嘅老師。凌晨兩點卡住解決唔到嘅問題?文件會以暖心虛擬擁抱同你提供正確答案。想了解啲人人都講嘅新特性?文件會提供逐步教學。想明白點解件事係咁運作?嘩,文件就係你嗰個最終令你「啊哈!」嘅解說員! - -有一樣完全改變咗我觀念嘅事情:網頁開發世界發展超級快,冇人(講真,冇一個人!)會把所有嘢記曬。我見過有 15 年經驗以上嘅資深開發者都要查基本語法,知唔知道?呢啲唔係丟人──係明智!唔係靠記憶,而係知道喺邊度好快搵到可靠答案,並且懂得應用。 - -**魔力就喺呢度:** - -專業開發者大量時間用嚟睇文件──唔係因為唔識做,而係網頁開發環境變化太快,要持續學習先跟得上。好文件幫你明白唔單止「點用」,仲有「點解要用」同「幾時用」。 - -#### 必備文件資源 - -**[Mozilla Developer Network (MDN)](https://developer.mozilla.org/docs/Web)** -- 網絡技術文件嘅黃金標準 -- 詳盡 HTML、CSS 同 JavaScript 指南 -- 包含瀏覽器兼容性資訊 -- 實用範例同互動演示 - -**[Web.dev](https://web.dev)** (由 Google 提供) -- 現代網頁開發最佳實踐 -- 性能優化指南 -- 無障礙同包容性設計原則 -- 實踐案例研究 - -**[Microsoft Developer Documentation](https://docs.microsoft.com/microsoft-edge/#microsoft-edge-for-developers)** -- Edge 瀏覽器開發資源 -- 漸進式網頁應用指南 -- 跨平台開發洞見 - -**[Frontend Masters Learning Paths](https://frontendmasters.com/learn/)** -- 有系統嘅學習課程 -- 業界專家視頻課程 -- 實操編程練習 - -> 📚 **學習策略**:唔好死記硬背文件──要學識有效瀏覽。收藏常用參考資料,練習用搜尋功能迅速搵特定訊息。 - -### 🔧 **工具掌握檢查:你有咩共鳴?** - -**花啲時間諗吓:** -- 你最期待先試邊個工具?(冇錯誤答案!) -- 命令行依然令你驚,定係想了解佢? -- 你可唔可以想像用瀏覽器 DevTools 去偷睇你最鍾意網站嘅背後? - -```mermaid -pie title "開發者使用工具時間分佈" - "程式碼編輯器" : 40 - "瀏覽器測試" : 25 - "命令行" : 15 - "閱讀文件" : 15 - "除錯" : 5 -``` -> **有趣嘅見解**:大多數開發者約有 40% 嘅時間喺代碼編輯器度,但你有冇留意測試、學習同問題解決花咗幾多時間?編程唔單止係寫代碼——係塑造體驗! - -✅ **思考題**:諗吓有趣嘅嘢──你認為開發網站用嘅工具(開發)同用嚟設計網站外觀嘅工具(設計)會有咩分別?就好似建築師設計靚屋,跟承包商建嗰間屋一樣。兩個都重要,但要用唔同嘅工具箱!呢種思考會幫助你睇清網站點樣誕生嘅大局。 - -## GitHub Copilot Agent 挑戰 🚀 - -用 Agent 模式完成以下挑戰: - -**描述:** 探索現代代碼編輯器或 IDE 嘅功能,展示佢點樣提升你作為網頁開發者嘅工作流程。 - -**提示:** 揀一個代碼編輯器或 IDE(例如 Visual Studio Code、WebStorm 或雲端 IDE)。列出三個幫助你更有效率寫代碼、除錯或維護代碼嘅功能或擴展。對每個功能,提供簡短說明講解佢點樣增強你嘅工作效率。 - ---- - -## 🚀 挑戰 - -**好啦,偵探,你準備好攪第一宗案未?** - -依家你有咗呢個超棒嘅基礎,我會畀你一個冒險,幫你見識到編程世界嘅多元同精采。聽好──呢個唔係寫代碼嘅挑戰,所以唔使擔心!想像自己係編程語言嘅偵探,展開你第一單振奮人心嘅案件! - -**你嘅任務,如果你願意接受:** -1. **成為語言探索者**:揀三種完全唔同領域嘅編程語言——可能一個用嚟建網站,一個做手機 app,一個用嚟處理科學數據。找出同一個簡單任務喺佢哋嘅寫法。保證你會超乎想像佢哋雖然做同樣嘢,表達可以咁唔同! - -2. **揭開佢哋嘅故事**:每個語言有咩特色?有趣嘅係,每種語言背後都係因為有人覺得「有冇更好方法解決呢個具體問題?」你能唔能搵出嗰啲問題係咩?啲故事好精彩㗎! - -3. **認識社群**:睇吓每個語言嘅社群係點樣熱情同支持成員。有啲有幾百萬名開發者分享知識,有啲雖然細細,但超級緊密而且支援力十足。睇吓佢哋性格點,好打開眼界! - -4. **跟隨直覺**:而家邊個語言最吸引你?唔好擔心揀「完美」──聽住你直覺就得!無錯誤答案,將來你可以慢慢探索其他語言。 - -**額外偵探技巧**:試搵吓每個語言有咩大型網站或應用係用佢寫嘅。我保證你會震驚發現 Instagram、Netflix,甚至係嗰個停唔到玩嘅手機遊戲係用邊種語言做嘅! - -> 💡 **記住**:你唔係想今日成為專家,只係想先認識吓個社區,之後再決定喺邊度安家。慢慢嚟,玩得開心,畀好奇心帶領你! - -## 一齊慶祝你嘅發現! - -嘩,你今日吸收咗好多精彩資訊!我非常興奮見到你同行呢個奇妙旅程嘅收穫。記住──呢唔係測驗唔使做到完美,反而係慶祝你認識到呢個奇妙世界嘅所有精彩嘢! - -[參加課後測驗](https://ff-quizzes.netlify.app/web/) -## 評閱與自學 - -**慢慢探索,享受其中的樂趣!** - -你今天已經學了很多內容,真值得驕傲!現在是最有趣的部分——探索那些激發你好奇心的主題。記住,這不是功課——這是一場冒險! - -**深入了解讓你感興趣的內容:** - -**親手玩玩程式語言:** -- 訪問 2-3 個引起你注意的官方網站。每個語言都有自己的個性和故事! -- 嘗試一些線上程式碼練習場,比如 [CodePen](https://codepen.io/)、[JSFiddle](https://jsfiddle.net/) 或 [Replit](https://replit.com/)。不要害怕嘗試——你不會壞掉什麼東西! -- 閱讀你最喜愛的語言是如何誕生的。認真說,有些語言的起源故事非常有趣,能幫助你理解語言為什麼會那樣運作。 - -**熟悉你新工具:** -- 如果還沒下載 Visual Studio Code,就趕快下載吧——它免費,你會愛上的! -- 花幾分鐘瀏覽一下擴充套件市場。它就像你的程式碼編輯器的應用商店! -- 打開瀏覽器的開發者工具,隨便點點看看。不要擔心能不能理解全部內容——只是熟悉一下介面。 - -**加入社群:** -- 在 [Dev.to](https://dev.to/)、[Stack Overflow](https://stackoverflow.com/) 或 [GitHub](https://github.com/) 追蹤一些開發者社群。程式設計社群對新手非常友善! -- 在 YouTube 看一些適合初學者的程式教學影片。那裡有很多優秀的創作者,懂得新手的感受。 -- 思考加入本地的見面會或線上社群。相信我,開發者們都很樂意幫助新手! - -> 🎯 **聽著,請記得這點**:你不需要一夜之間成為程式高手!現在你只是開始認識這個你即將成為一份子的精彩新世界。慢慢來,享受這段旅程,並記得——每一位你敬佩的開發者,曾經都坐在你現在的位置上,感到興奮並可能有些不知所措。這非常正常,這表示你做得很對! - -## 作業 - -[Reading the Docs](assignment.md) - -> 💡 **給你作業的小提醒**:我非常想看到你探索一些我們還沒提過的工具!跳過已討論過的編輯器、瀏覽器和指令列工具——這個世界上有一整個令人驚嘆的開發工具宇宙在等你去發現。尋找那些活躍維護且社群活躍、樂於助人的工具(這些通常有最棒的教學,當你卡關時也最有人幫忙)。 - ---- - -## 🚀 你的程式之旅時間表 - -### ⚡ **接下來 5 分鐘你可以做什麼** -- [ ] 收藏 2-3 個引起你注意的程式語言網站 -- [ ] 如果還沒下載,立刻安裝 Visual Studio Code -- [ ] 打開瀏覽器的 DevTools (F12),隨便點點瀏覽任何網站 -- [ ] 加入一個程式社群(Dev.to、Reddit r/webdev 或 Stack Overflow) - -### ⏰ **接下來 1 小時你可以完成什麼** -- [ ] 完成課後小測驗並思考你的答案 -- [ ] 設定 VS Code,安裝 GitHub Copilot 擴充套件 -- [ ] 線上用兩種不同程式語言試寫「Hello World」範例 -- [ ] 觀看一支「開發者的一天」YouTube 影片 -- [ ] 開始你的程式語言調查工作(挑戰中提到的) - -### 📅 **你的一週冒險** -- [ ] 完成作業並探索 3 個新的開發工具 -- [ ] 在社群媒體追蹤 5 位開發者或程式帳號 -- [ ] 在 CodePen 或 Replit 嘗試建構一個小作品(哪怕只是說「Hello, [你的名字]!」) -- [ ] 閱讀一篇開發者部落格文章,了解他人的程式歷程 -- [ ] 參加一次線上見面會或觀看程式主題講座 -- [ ] 使用線上教學開始學習你選擇的程式語言 - -### 🗓️ **你的一個月蛻變** -- [ ] 建造你的第一個小專案(就算是一個簡單的網頁也算!) -- [ ] 為開源專案做出貢獻(可以從文件修正開始) -- [ ] 輔導一名剛開始學程式的新手 -- [ ] 建立你的開發者作品集網站 -- [ ] 與當地開發者社群或讀書會建立連結 -- [ ] 開始規劃下一個學習里程碑 - -### 🎯 **最終反思檢視** - -**在繼續前,花點時間慶祝:** -- 今天有什麼程式相關的事讓你感到興奮? -- 你想先探索哪一個工具或概念? -- 你對開始這段程式之旅有什麼感覺? -- 你現在最想問開發者什麼問題? - -```mermaid -journey - title 你的信心建立旅程 - section 今天 - 好奇: 3: 你 - 不知所措: 4: 你 - 興奮: 5: 你 - section 本週 - 探索: 4: 你 - 學習: 5: 你 - 聯繫: 4: 你 - section 下個月 - 建立: 5: 你 - 自信: 5: 你 - 幫助他人: 5: 你 -``` -> 🌟 **記住**:每個專家都曾是初學者。每位資深開發者都曾經有和你一樣的感覺——興奮,可能有點不知所措,並且對未來充滿好奇。你有很棒的夥伴,這段旅程將會非常精彩。歡迎來到奇妙的程式世界!🎉 - ---- - - -**免責聲明**: -本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於翻譯準確性,但請注意自動翻譯可能包含錯誤或不準確之處。原始文件的原文版本應視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們不對因使用本翻譯而引起的任何誤解或誤譯負責。 - \ No newline at end of file diff --git a/translations/hk/1-getting-started-lessons/1-intro-to-programming-languages/assignment.md b/translations/hk/1-getting-started-lessons/1-intro-to-programming-languages/assignment.md deleted file mode 100644 index b508e3086..000000000 --- a/translations/hk/1-getting-started-lessons/1-intro-to-programming-languages/assignment.md +++ /dev/null @@ -1,78 +0,0 @@ - -# Assignment: Exploring Modern Web Development Tools - -## Instructions - -The web development ecosystem includes hundreds of specialized tools that help developers build, test, and maintain applications efficiently. Your task is to research and understand tools that complement the ones covered in this lesson. - -**Your Mission:** Select **three tools** that are **not covered in this lesson** (avoid choosing code editors, browsers, or command line tools already listed). Focus on tools that solve specific problems in modern web development workflows. - -**For each tool, provide:** - -1. **Tool name and category** (e.g., "Figma - Design Tool" or "Jest - Testing Framework") -2. **Purpose and benefits** - Explain in 2-3 sentences why a web developer would use this tool and what problems it solves -3. **Official documentation link** - Provide a link to the tool's official documentation or website (not just tutorial sites) -4. **Real-world context** - Mention one way this tool fits into a professional development workflow - -## Suggested Tool Categories - -Consider exploring tools from these categories: - -| Category | Examples | What They Do | -|----------|----------|--------------| -| **Build Tools** | Vite, Webpack, Parcel, esbuild | Bundle and optimize code for production with fast development servers | -| **Testing Frameworks** | Vitest, Jest, Cypress, Playwright | Ensure code works correctly and catch bugs before deployment | -| **Design Tools** | Figma, Adobe XD, Penpot | Create mockups, prototypes, and design systems collaboratively | -| **Deployment Platforms** | Netlify, Vercel, Cloudflare Pages | Host and distribute websites with automatic CI/CD | -| **Version Control** | GitHub, GitLab, Bitbucket | Manage code changes, collaboration, and project workflows | -| **CSS Frameworks** | Tailwind CSS, Bootstrap, Bulma | Accelerate styling with pre-built component libraries | -| **Package Managers** | npm, pnpm, Yarn | Install and manage code libraries and dependencies | -| **Accessibility Tools** | axe-core, Lighthouse, Pa11y | Test for inclusive design and WCAG compliance | -| **API Development** | Postman, Insomnia, Thunder Client | Test and document APIs during development | - -## Format Requirements - -**For each tool:** -``` -### [Tool Name] - [Category] - -**Purpose:** [2-3 sentences explaining why developers use this tool] - -**Documentation:** [Official website/documentation link] - -**Workflow Integration:** [1 sentence about how it fits into development process] -``` - -## Quality Guidelines - -- **Choose current tools**: Select tools that are actively maintained and widely used in 2025 -- **Focus on value**: Explain the specific benefits, not just what the tool does -- **Professional context**: Consider tools used by development teams, not just individual hobbyists -- **Diverse selection**: Pick tools from different categories to show breadth of the ecosystem -- **Modern relevance**: Prioritize tools that align with current web development trends and best practices - -## Rubric - -| Excellent | Good | Needs Improvement | -|-----------|------|-------------------| -| **Clearly explained why developers use each tool and what problems it solves** | **Explained what the tool does but missed some context about its value** | **Listed tools but didn't explain their purpose or benefits** | -| **Provided official documentation links for all tools** | **Provided mostly official links with 1-2 tutorial sites** | **Relied mainly on tutorial sites rather than official documentation** | -| **Selected current, professionally-used tools from diverse categories** | **Selected good tools but limited variety in categories** | **Selected outdated tools or only from one category** | -| **Demonstrated understanding of how tools fit into development workflows** | **Showed some understanding of professional context** | **Focused only on tool features without workflow context** | - -> 💡 **Research Tip**: Look for tools mentioned in job postings for web developers, check popular developer surveys, or explore the dependencies used by successful open-source projects on GitHub! - ---- - - -**免責聲明**: -本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們力求準確,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的本地語言版本應被視為權威來源。對於重要資訊,建議使用專業人工翻譯。我們對因使用本翻譯而引起的任何誤解或誤讀概不負責。 - \ No newline at end of file diff --git a/translations/hk/1-getting-started-lessons/2-github-basics/README.md b/translations/hk/1-getting-started-lessons/2-github-basics/README.md deleted file mode 100644 index 753567588..000000000 --- a/translations/hk/1-getting-started-lessons/2-github-basics/README.md +++ /dev/null @@ -1,777 +0,0 @@ - -# GitHub 簡介 - -嗨,未來的開發者!👋 準備好加入全球數百萬程式員的行列了嗎?我非常興奮地向你介紹 GitHub——把它想像成程式員的社交媒體平台,不同的是,我們分享的不是午餐照,而是程式碼,一起打造令人驚嘆的作品! - -這點真的讓我震撼不已:你手機上的每個應用程式、你瀏覽的每個網站,以及你將學習使用的大多數工具,都是由團隊開發者在像 GitHub 這樣的平台上共同協作完成的。你喜愛的音樂應用程式?可能就有人跟你一樣貢獻了程式碼。那款玩不膩的遊戲?沒錯,可能就是用 GitHub 協作建造出來的。現在,你也將學會如何成為這個精彩社群的一員! - -我知道剛開始可能會覺得很多——說真的,我還記得第一次看到 GitHub 頁面時想:「這到底是什麼意思?」但事實是:每個開發者都是從你現在的狀態開始的。結束這堂課時,你會有自己的 GitHub 倉庫(把它想像成你個人在雲端的專案展示台),你會知道如何儲存工作、與他人分享,甚至參與數百萬人使用的專案。 - -我們會一步步一起走這趟旅程,沒有急躁,沒有壓力——只有你我和一些超酷的工具,它們將成為你新的好朋友! - -![Intro to GitHub](../../../../translated_images/zh-HK/webdev101-github.8846d7971abef6f9.webp) -> Sketchnote by [Tomomi Imura](https://twitter.com/girlie_mac) - -```mermaid -journey - title 你今日的 GitHub 冒險 - section 設置 - Install Git: 4: You - Create Account: 5: You - First Repository: 5: You - section 精通 Git - Local Changes: 4: You - Commits & Pushes: 5: You - Branching: 4: You - section 合作 - Fork Projects: 4: You - Pull Requests: 5: You - Open Source: 5: You -``` -## 課前小測驗 -[Pre-lecture quiz](https://ff-quizzes.netlify.app) - -## 介紹 - -在我們深入真正令人興奮的內容之前,先讓你的電腦準備好 GitHub 的魔法吧!想像這就像在創作傑作之前整理藝術工具——有了合適的工具,一切都會變得更順暢、更有趣。 - -我會親自引導你完成每個設定步驟,我保證並沒有看起來那麼可怕。如果一開始有些地方不太懂,那完全正常!我還記得設定第一個開發環境時,感覺像在解讀古埃及象形文字。每個開發者都曾經跟你現在一樣,不知道自己有沒有做對。劇透一下:你正在學習,已經做對了!🌟 - -本課將涵蓋: - -- 追蹤你在電腦上的工作 -- 與他人合作專案 -- 如何貢獻開源軟體 - -### 先決條件 - -先讓你的電腦準備好 GitHub 的魔法吧!別擔心--這個設定只需做一次,之後你的程式之旅都將順利進行。 - -好了,讓我們從基礎開始!首先,我們需要確認你的電腦上是否已經安裝了 Git。Git 基本上就像一個超聰明的助手,記錄你對程式碼的每個變更,比起每兩秒猛按 Ctrl+S(我們都做過)好太多了! - -在終端機輸入這行魔法指令,看看你的電腦是否有安裝 Git: -`git --version` - -如果還沒安裝,別擔心!到 [download Git](https://git-scm.com/downloads) 下載安裝就好。裝好之後,我們要正式介紹你和 Git 認識一下: - -> 💡 **初次設定**:這些指令會告訴 Git 你是誰。這資訊會附加在你每次提交(commit)中,所以請選擇你願意公開分享的名字和郵件。 - -```bash -git config --global user.name "your-name" -git config --global user.email "your-email" -``` - -要檢查 Git 是否已設好,可以輸入: -```bash -git config --list -``` - -你還需要有 GitHub 帳號、程式碼編輯器(如 Visual Studio Code),還有打開終端機(或命令提示字元)。 - -造訪 [github.com](https://github.com/),還沒帳號就註冊,或登入並完善個人資料。 - -💡 **現代提示**:考慮設定 [SSH 金鑰](https://docs.github.com/en/authentication/connecting-to-github-with-ssh) 或使用 [GitHub CLI](https://cli.github.com/) 來無密碼更輕鬆認證。 - -✅ GitHub 並非唯一的程式碼倉庫,市場上還有其他選擇,但 GitHub 最出名。 - -### 準備工作 - -你需要在本機(筆電或電腦)準備一個有程式碼的資料夾,還有 GitHub 上一個公開倉庫,作為示範如何貢獻他人專案的例子。 - -### 保護你的程式碼安全 - -說點安全性的事情——別擔心,不會嚇到你!把安全習慣想成鎖車或鎖房門。這些簡單習慣會成為你的第二天性,保護你辛苦的作品。 - -我們會從一開始就展示如何用現代且安全的方式與 GitHub 合作。這樣你能培養好習慣,伴隨你整個程式人生。 - -使用 GitHub 時,重要的是遵守安全最佳實務: - -| 安全範疇 | 最佳實務 | 重要原因 | -|---------------|---------------|----------------| -| **身份驗證** | 使用 SSH 金鑰或個人存取權杖 | 密碼安全性較差並逐漸淘汰 | -| **雙重認證** | 啟用 GitHub 帳號 2FA | 增加帳號安全防護層 | -| **倉庫安全** | 永遠不提交敏感資訊 | API 金鑰與密碼不該放公開倉庫 | -| **相依管理** | 啟用 Dependabot 更新 | 保持依賴套件安全與最新 | - -> ⚠️ **重要安全提醒**:切勿將 API 金鑰、密碼或其他敏感資訊提交到任何倉庫。使用環境變數與 `.gitignore` 檔案來保護敏感資料。 - -**現代認證設定:** - -```bash -# 產生 SSH 金鑰(現代 ed25519 演算法) -ssh-keygen -t ed25519 -C "your_email@example.com" - -# 設定 Git 使用 SSH -git remote set-url origin git@github.com:username/repository.git -``` - -> 💡 **專業提示**:SSH 金鑰讓你不必重複輸入密碼,比傳統認證更安全。 - ---- - -## 像專業人士般管理你的程式碼 - -好了,這裡開始真正有趣了!🎉 我們將學習如何像專家一樣追蹤與管理程式碼,坦白說,這是我最喜歡教的主題之一,因為它會改變你的開發方式。 - -想像你正在寫一個精彩故事,想要記錄每個稿本、每個絕妙修訂,還有每個「等等,這主意太棒了!」的瞬間。Git 就是為你的程式碼做到這件事!它就像一個不可思議的時光筆記本,記錄所有細節——每一次敲擊鍵盤、每個修正、每個「哎呀,壞了!」的時刻,你都能立刻回到過去。 - -說實話——剛開始可能會有點難懂。我當年也想:「為什麼不能像平常一樣直接存檔呢?」但相信我,一旦你「察覺」了 Git 的妙用(一定會的!),你會有「以前怎麼沒用過它?」的靈光一閃。就像一輩子走路,忽然發現自己會飛一樣! - -假設你本機有一個資料夾,裡面放著程式碼專案,你想開始用 git(版本控制系統)追蹤進度。有人說用 git 有點像寫給未來自己的情書。數天、數週、數月後,再回頭看你的 commit 訊息,你能回憶為何改動,或「還原」變更--前提是你有寫好 commit 訊息。 - -```mermaid -flowchart TD - A[📁 你的專案檔案] --> B{是否為 Git 倉庫?} - B -->|否| C[git init] - B -->|是| D[進行更改] - C --> D - D --> E[git add .] - E --> F["git commit -m '訊息'"] - F --> G[git push] - G --> H[🌟 GitHub 上的代碼!] - - H --> I{想要協作嗎?} - I -->|是| J[分叉並克隆] - I -->|否| D - J --> K[建立分支] - K --> L[進行更改] - L --> M[提取請求] - M --> N[🎉 貢獻中!] - - style A fill:#fff59d - style H fill:#c8e6c9 - style N fill:#ff4081,color:#fff -``` -### 任務:建立你的第一個倉庫! - -> 🎯 **你的任務(我超級期待!)**:我們要一起建立你的第一個 GitHub 倉庫!完成後,你會有屬於自己的網路小天地存放程式碼,並完成第一次「commit」(開發者專用語:用聰明方式保存工作成果)。 -> -> 這真的是特別的時刻——你即將正式加入全球開發者社群!我依然記得第一次創建倉庫時的興奮,心想「哇,我真的做到了!」 - -咱們一步步共赴這場冒險。每個步驟都慢慢來,不用急,保證你絕對懂。記得,每位你認識的程式達人都曾跟你一樣,正準備創建他們的第一個倉庫。多酷啊! - -> 觀看影片 -> -> [![Git and GitHub basics video](https://img.youtube.com/vi/9R31OUPpxU4/0.jpg)](https://www.youtube.com/watch?v=9R31OUPpxU4) - -**一起動手做:** - -1. **在 GitHub 建立你的倉庫**。前往 GitHub.com,找那個明亮的綠色 **New** 按鈕(或右上角的 **+** 號),點擊並選擇 **New repository**。 - - 以下是操作步驟: - 1. 幫你的倉庫取個名字──取一個對你有意義的! - 1. 可以加個描述(讓別人知道專案是什麼) - 1. 決定是公開(大家都能看到)還是私密(只限你) - 1. 建議勾選新增 README 檔案——這是你專案的封面頁 - 1. 點擊 **Create repository**,慶祝一下-你剛創建了第一個倉庫!🎉 - -2. **進入你的專案資料夾**。打開終端機(別怕,真的沒那麼可怕!)。我們要指示電腦專案檔案位置。輸入以下指令: - - ```bash - cd [name of your folder] - ``` - - **我們這樣做是因為:** - - 其實是在告訴電腦「嘿,帶我到專案資料夾」 - - 這就像在桌面打開指定資料夾,但用文字指令執行 - - 把 `[name of your folder]` 換成你專案資料夾的真實名稱 - -3. **將資料夾變成 Git 倉庫**。魔法就在此發生!打: - - ```bash - git init - ``` - - **這步驟的意義(很酷吧!):** - - Git 在你的專案中建立一個隱藏的 `.git` 資料夾,你看不到它,但它存在著! - - 你的資料夾現在成為可追蹤所有變更的「倉庫」 - - 就像賦予資料夾超能力,能記住一切 - -4. **查看目前狀態**。看看 Git 對你的專案「怎麼看」: - - ```bash - git status - ``` - - **讀懂 Git 講了什麼:** - - 你可能會看到像這樣的東西: - - ```output - Changes not staged for commit: - (use "git add ..." to update what will be committed) - (use "git restore ..." to discard changes in working directory) - - modified: file.txt - modified: file2.txt - ``` - - **別慌!這是什麼意思:** - - 紅色的檔案代表有變更但還沒準備好要儲存 - - 綠色的檔案(如果有看到)代表已準備好儲存 - - Git 很貼心,告訴你下一步該怎麼做 - - > 💡 **專業提示**:`git status` 是你最好的朋友!任何時候搞不懂狀況就用它。它就像問 Git 「嘿,情況怎樣?」 - -5. **準備好要儲存的檔案**(稱為「暫存」): - - ```bash - git add . - ``` - - **我們剛做了什麼:** - - 告訴 Git 「我想把這資料夾裡的所有檔案都加入下一次儲存」 - - `.` 就像說「資料夾裡所有的東西」 - - 現在檔案都「暫存」了,準備下一步 - - **想挑選性加入?** 你也可以只加入特定檔案: - - ```bash - git add [file or folder name] - ``` - - **為什麼會想這樣做?** - - 有時候你想一併保存相關修改 - - 幫助你把工作化整為零 - - 更容易理解什麼時候改了什麼 - - **改主意了?** 沒問題!可以這樣取消暫存: - - ```bash - # 取消暫存所有項目 - git reset - - # 只取消暫存一個檔案 - git reset [file name] - ``` - - 別擔心-這不會刪除你的檔案,只是把檔案從「準備儲存」的列表移除。 - -6. **正式永久保存你的工作**(做出第一個 commit!): - - ```bash - git commit -m "first commit" - ``` - - **🎉 恭喜你!完成你的第一次 commit!** - - **剛發生了什麼:** - - Git 在這一刻幫你把所有暫存檔案「拍了一張快照」 - - commit 訊息「first commit」說明這次保存的意義 - - Git 給予這張快照一個獨特 ID,讓你能隨時找到它 - - 你正式開始追蹤專案歷史! - - > 💡 **未來 commit 訊息**:下次提交時,訊息要更具描述性!不要只寫「updated stuff」,試試「Add contact form to homepage」或「Fix navigation menu bug」。未來的你會感謝現在用心的你! - -7. **連接本機專案到 GitHub**。目前專案只在你電腦裡,我們要連到 GitHub 倉庫,才能分享給全世界! - - 先去你的 GitHub 倉庫頁面,複製 URL 回來,然後打: - - ```bash - git remote add origin https://github.com/username/repository_name.git - ``` - - (把這個 URL 換成你實際的倉庫網址!) - - **我們做了什麼:** - - 我們已建立你本地專案和你的 GitHub 倉庫之間的連接 - - 「origin」只是你 GitHub 倉庫的暱稱——就像把聯絡人加到你的電話裡一樣 - - 現在本地的 Git 知道該把你的程式碼傳送到哪裡,當你準備好分享時 - - 💡 **更簡易的方法**:如果你已安裝 GitHub CLI,可以用一條指令完成這些動作: - ```bash - gh repo create my-repo --public --push --source=. - ``` - -8. **將你的程式碼傳送到 GitHub**(重要時刻!): - - ```bash - git push -u origin main - ``` - - **🚀 就是現在!你要將程式碼上傳到 GitHub 了!** - - **發生了什麼:** - - 你的提交從電腦傳到 GitHub - - `-u` 旗標建立永久連接,未來推送更方便 - - 「main」是你的主要分支名稱(就像主資料夾) - - 之後你只要打 `git push` 就能上傳! - - 💡 **小提示**:如果你的分支叫別的名字(例如「master」),請用那個名稱。可用 `git branch --show-current` 確認。 - -9. **你的全新日常編程節奏**(這會讓你上癮!): - - 從此以後,當你對專案作出改動時,有一個簡單的三步舞: - - ```bash - git add . - git commit -m "describe what you changed" - git push - ``` - - **這會成為你的編程節奏:** - - 作出很棒的程式碼改動 ✨ - - 用 `git add` 登記改動(「Git,請注意這些改動!」) - - 用 `git commit` 並附上描述訊息儲存改動(未來的你會感謝現在的你!) - - 用 `git push` 和世界分享你的改動 🚀 - - 不斷重複——認真說,這會像呼吸一樣自然! - - 我喜歡這個工作流程,因為它就像遊戲裡有多個儲存點。喜歡剛才的改動?就 commit!想試些冒險的東西?沒問題——如果出錯,隨時可以回到最後的提交狀態! - - > 💡 **小貼士**:你也可能想用 `.gitignore` 檔,避免不想追蹤的檔案出現在 GitHub 上——像存在同資料夾裡但不適合放公開倉庫的筆記檔。能從 [.gitignore templates](https://github.com/github/gitignore) 找到範本,或用 [gitignore.io](https://www.toptal.com/developers/gitignore) 自製。 - -### 🧠 **第一次倉庫提交:感覺如何?** - -**花點時間慶祝並反思:** -- 第一次看到程式碼出現在 GitHub 時是什麼感覺? -- 哪一步最令你困惑,哪一步出乎意料地簡單? -- 你能用自己的話解釋 `git add`、`git commit` 和 `git push` 的差別嗎? - -```mermaid -stateDiagram-v2 - [*] --> LocalFiles: 建立專案 - LocalFiles --> Staged: git add . - Staged --> Committed: git commit - Committed --> GitHub: git push - GitHub --> [*]: 成功!🎉 - - note right of Staged - 檔案準備好儲存 - end note - - note right of Committed - 快照已建立 - end note -``` -> **記住**:即使是有經驗的開發者,有時也會忘記正確指令。讓這流程變成肌肉記憶需要練習——你做得很棒! - -#### 現代 Git 工作流程 - -考慮採用以下現代規範: - -- **Conventional Commits**:用標準化的提交訊息格式,如 `feat:`、`fix:`、`docs:` 等。了解更多:[conventionalcommits.org](https://www.conventionalcommits.org/) -- **Atomic commits**:每個 commit 只代表一個邏輯修改 -- **Frequent commits**:經常、用描述性訊息提交,避免一次大量、少次提交 - -#### Commit 訊息 - -一個優秀的 Git commit 主旨句應完成以下句子: -If applied, this commit will <你的主旨句> - -主旨用命令式、現在時:用「change」非「changed」或「changes」。 -正文(可選)也用命令式、現在時,應說明為何改動並和之前行為對比。是解釋「為什麼」不是「怎麼做」。 - -✅ 花幾分鐘逛逛 GitHub。能找到非常好的 commit 訊息嗎?或非常簡短的訊息?你覺得 commit 訊息中最重要且有用的資訊是什麼? - -## 與他人合作(有趣的部分!) - -戴好帽子,因為這正是 GitHub 魔法開始的地方!🪄 你已掌握管理自己程式碼,但現在我們要進入我最愛的部分——與來自世界各地的優秀開發者合作。 - -想像一下:明天醒來時,你發現有人在東京幫你改進了程式碼;有人在柏林修復你卡住的 bug;下午時,聖保羅的一位開發者加入了你從未想過的功能。這不是科幻——在 GitHub 世界裡,這就是日常! - -讓我最興奮的是,你即將學到的協作技能,就是 Google、微軟以及你喜歡的初創公司每天使用的 EXACT 工作流程。你不只是在學一個酷工具——你在學讓全球軟體世界協同運作的祕密語言。 - -說真的,一旦你體驗到有人合併你的第一個 Pull Request 的快感,就會懂為什麼開發者對開源充滿熱情。就像參與全球最大、最具創意的團隊專案! - -> 參考影片 -> -> [![Git and GitHub basics video](https://img.youtube.com/vi/bFCM-PC3cu8/0.jpg)](https://www.youtube.com/watch?v=bFCM-PC3cu8) - -放到 GitHub 的主要原因是為了方便與其他開發者合作。 - -```mermaid -flowchart LR - A[🔍 尋找專案] --> B[🍴 分叉儲存庫] - B --> C[📥 複製到本地] - C --> D[🌿 建立分支] - D --> E[✏️ 進行更改] - E --> F[💾 提交更改] - F --> G[📤 推送分支] - G --> H[🔄 建立拉取請求] - H --> I{維護者審核} - I -->|✅ 核准| J[🎉 合併!] - I -->|❓ 要求修改| K[📝 更新內容] - K --> F - J --> L[🧹 清理分支] - - style A fill:#e3f2fd - style J fill:#e8f5e8 - style L fill:#fff3e0 -``` -在你的倉庫中,前往 `Insights > Community` 查看你的專案如何符合社區建議標準。 - -想讓你的倉庫看起來專業且讓人感到歡迎嗎?到你的倉庫點擊 `Insights > Community`。這個很棒的功能會告訴你專案在 GitHub 社區認為「良好倉庫實踐」方面的表現。 - -> 🎯 **讓你的專案閃耀**:一個組織良好且文件齊全的倉庫就像乾淨、招人的店面。它告訴大家你很在乎作品,也讓其他人想投入貢獻! - -**以下讓倉庫變優秀:** - -| 應加入什麼 | 為何重要 | 帶給你的效果 | -|-------------|-----------|---------------| -| **描述** | 第一印象很重要! | 讓人第一時間知道你的專案做什麼 | -| **README** | 專案的門面 | 就像迎新導覽給新訪客 | -| **貢獻指南** | 表示歡迎協助 | 讓人明白如何協助你 | -| **行為守則** | 創造友善環境 | 讓每個人都感覺被歡迎參與 | -| **授權條款** | 法務清楚 | 讓他人知道如何使用你的程式碼 | -| **安全政策** | 展現負責任 | 表現專業作風 | - -> 💡 **專家秘訣**:GitHub 提供這些檔案的範本。建立新倉庫時勾選即可自動生成。 - -**探索現代 GitHub 功能:** - -🤖 **自動化與 CI/CD:** -- **GitHub Actions** 自動化測試與部署 -- **Dependabot** 依賴自動更新 - -💬 **社群與專案管理:** -- **GitHub Discussions** 問題之外的社群討論空間 -- **GitHub Projects** 看板式專案管理 -- **分支保護規則** 強制程式碼品質標準 - - -這些資源能幫助新團隊成員加入時更快上手。通常新貢獻者在看程式碼前會先看這些,判斷專案是否值得他們花時間。 - -✅ README 檔雖然準備起來花時間,但常被忙碌的維護者忽略。能找到特別有描述性的範例嗎?備註:有一些[工具幫助創建優質 README](https://www.makeareadme.com/)值得嘗試。 - -### 任務:合併一些程式碼 - -貢獻文件幫助他人參與專案。說明你找什麼樣的貢獻及流程如何。貢獻者需經過一系列步驟,才能在 GitHub 貢獻給你的倉庫: - - -1. **Fork 你的倉庫** 大概你會希望大家先對你的專案 _fork_。Fork 是建立你倉庫的複製品在他們的 GitHub 帳號上。 -1. **Clone**。接著他們會 clone 專案到本地機器。 -1. **建立分支**。你會想請他們為他們的工作建立一個 _branch_。 -1. **專注於一件事**。請貢獻者一次專注於一個改動內容——這樣你合併他們工作的機率比較高。想像他們修 bug、新增功能、更新多項測試——如果你只能接受其中兩項或一項怎麼辦? - -✅ 想像在寫和交付優質程式碼時,分支扮演關鍵角色。你能想到哪些應用場景? - -> 註:成為你想看到的改變,也建立分支管理自己的工作吧。你所做的 commit 預設是在你當前「checkout」的分支上。用 `git status` 查看你在哪個分支。 - -讓我們來看一下貢獻者的工作流程。假設貢獻者已經 _fork_ 並 _clone_ 好 repo,且本地已有 Git 環境: - -1. **建立分支**。用命令 `git branch` 建立一個準備提交改動的分支: - - ```bash - git branch [branch-name] - ``` - - > 💡 **現代做法**:你也可以用一條命令同時建立並切換分支: - ```bash - git switch -c [branch-name] - ``` - -1. **切換到工作分支**。用 `git switch` 切換到剛建立的分支並更新工作目錄: - - ```bash - git switch [branch-name] - ``` - - > 💡 **現代提示**:`git switch` 是改用於切分支的更清晰替代 `git checkout`,對初學者更安全。 - -1. **開始工作**。此時你要新增改動。別忘告訴 Git,命令如下: - - ```bash - git add . - git commit -m "my changes" - ``` - - > ⚠️ **提交訊息品質**:務必為 commit 取個好名字,無論是為自己還是你協助的 repo 維護者。具體說明你改了什麼! - -1. **合併你的工作到 `main` 分支**。完成工作後,想結合你的工作和 `main` 分支的內容。`main` 可能已有更新,先用以下命令拉最新版本: - - ```bash - git switch main - git pull - ``` - - 現在你要確保任何 _衝突_,即 Git 不知如何 _合併_ 的情況,都處理在你的工作分支。執行: - - ```bash - git switch [branch_name] - git merge main - ``` - - `git merge main` 會把 `main` 最新變更帶入你的分支。希望能直接繼續。如果不行,VS Code 會告訴你 Git 混淆在哪裡,並讓你修改檔案指定正確版本。 - - 💡 **現代替代法**:考慮用 `git rebase` 取得更乾淨的歷史: - ```bash - git rebase main - ``` - 這會把你的提交依序放到最新的 main 上,形成線性歷史。 - -1. **推送你的工作到 GitHub**。推送工作到 GitHub 具包含兩件事。先把分支推送到你的遠端 fork,然後開 Pull Request。 - - ```bash - git push --set-upstream origin [branch-name] - ``` - - 上述指令會在你的 forked repo 建立分支。 - -### 🤝 **協作技能檢測:準備好與別人合作了嗎?** - -**來看看你對協作的感覺:** -- 對 fork 與 pull request 的概念是否明白? -- 有關使用分支工作,你還想練習什麼? -- 對貢獻別人專案感到多大信心? - -```mermaid -mindmap - root((Git 協作)) - Branching - Feature branches - Bug fix branches - Experimental work - Pull Requests - Code review - Discussion - Testing - Best Practices - Clear commit messages - Small focused changes - Good documentation -``` -> **信心加油站**:你敬佩的每位開發者,在提出第一個 PR 時都曾緊張。GitHub 社區對新手非常友好! - -1. **開 PR**。接著要開 pull request。到你 fork 的 repo 頁面上,GitHub 會提示你是否建立新 PR,點擊即可進入介面修改 commit 標題和敘述。原專案維護者會看到,並 _希望_ 會合併你的 PR。從此你成為一名貢獻者,耶 :) - - 💡 **現代提示**:也可使用 GitHub CLI 建立 PR: - ```bash - gh pr create --title "Your PR title" --body "Description of changes" - ``` - - 🔧 **PR 最佳實踐**: - - 用關鍵字連結相關 issue,如 "Fixes #123" - - UI 改動補充截圖 - - 指定特定審查者 - - 進行中可用草稿 PR - - 發出審查請求前確保所有 CI 通過 -1. **清理**。成功合併 PR 後,進行 _清理_ 是良好做法。你需要清理本地分支和推送到 GitHub 的分支。首先,使用以下命令在本地刪除它: - - ```bash - git branch -d [branch-name] - ``` - - 接著請到該 fork 的 GitHub 頁面,刪除你剛剛推送過去的遠端分支。 - -`Pull request`(拉取請求)聽起來怪怪的,因為你真正想做的是把變更推送到專案裡。但維護者(專案擁有者)或核心團隊需要先審核你的變更,才會將它合併進專案的「main」分支,所以你其實是在請求維護者做變更決定。 - -拉取請求是用來比較和討論分支所引入差異的地方,可以包含審核、評論、整合測試等等。一個好的拉取請求大致遵循和提交說明相同的規則。如果你的工作是修復某個問題,可以加上 issue 的參考,格式是 `#` 後面接問題號碼。例如 `#97`。 - -🤞希望所有檢查通過,且專案擁有者能將你的變更合併進專案🤞 - -用以下指令更新你當前的本地工作分支,將 GitHub 上對應遠端分支的所有新提交拉下來: - -`git pull` - -## 貢獻開源專案(你改變世界的機會!) - -準備好迎接讓你驚嘆的新世界了嗎?🤯 來談談如何參與開源貢獻吧 —— 光是想著能和你分享這些內容我就起雞皮疙瘩了! - -這是你成為真正偉大事物一部分的機會。想像一下,改善數百萬開發者每天使用的工具,或者修正你朋友們都愛用的應用程式的錯誤。這不只是一場夢想 —— 這就是開源貢獻的精髓! - -讓我每次想到都感到顫慄的是:你所學的每個工具 —— 你的程式碼編輯器、我們將探索的框架,甚至你正在閱讀本文的瀏覽器 —— 都是由像你一樣的人首次貢獻開始。那位打造你最愛 VS Code 擴充功能的優秀開發者?他們曾經也是充滿忐忑地按下「建立拉取請求」按鈕的初學者,就像你現在一樣。 - -最美好的部分是:開源社群就像網路上最大的群體擁抱。大多數專案都積極尋找新手,並且有標示為「good first issue」的議題,就是專門為你這樣的初學者準備!維護者看到新貢獻者時會非常興奮,因為他們記得自己也從第一次踏出第一步開始。 - -```mermaid -flowchart TD - A[🔍 探索 GitHub] --> B[🏷️ 尋找 "good first issue"] - B --> C[📖 閱讀貢獻指南] - C --> D[🍴 分叉倉庫] - D --> E[💻 設置本地環境] - E --> F[🌿 建立功能分支] - F --> G[✨ 做出你的貢獻] - G --> H[🧪 測試你的更改] - H --> I[📝 撰寫清晰提交訊息] - I --> J[📤 推送並建立 PR] - J --> K[💬 參與反饋交流] - K --> L[🎉 合併成功!你成為了貢獻者!] - L --> M[🌟 尋找下一個議題] - - style A fill:#e1f5fe - style L fill:#c8e6c9 - style M fill:#fff59d -``` -你不只是學寫程式,更是在準備加入一個每天早上醒來就思考「我們怎麼讓數位世界變得更好一點?」的全球創作者大家庭。歡迎加入!🌟 - -首先,我們來找一個你感興趣並想貢獻變更的 GitHub 儲存庫(repo)。你需要將它的內容複製到你的電腦。 - -✅ 找到「新手友好」的 repo 一個好方法是[使用 'good-first-issue' 標籤搜尋](https://github.blog/2020-01-22-browse-good-first-issues-to-start-contributing-to-open-source/)。 - -![Copy a repo locally](../../../../translated_images/zh-HK/clone_repo.5085c48d666ead57.webp) - -複製代碼有好幾種方式。最常見的是使用 HTTPS、SSH 或 GitHub CLI(命令列工具)「克隆」該儲存庫內容。 - -打開你的終端機並這樣克隆儲存庫: -```bash -# 使用 HTTPS -git clone https://github.com/ProjectURL - -# 使用 SSH(需要設定 SSH 金鑰) -git clone git@github.com:username/repository.git - -# 使用 GitHub CLI -gh repo clone username/repository -``` - -要在專案內工作,切換到正確資料夾: -`cd ProjectURL` - -你也可以開啟整個專案: -- **[GitHub Codespaces](https://github.com/features/codespaces)** - GitHub 的雲端開發環境,可在瀏覽器中使用 VS Code -- **[GitHub Desktop](https://desktop.github.com/)** - 用於 Git 操作的圖形使用者介面應用程式 -- **[GitHub.dev](https://github.dev)** - 任何 GitHub repo 按下 `.` 鍵即可在瀏覽器開啟 VS Code -- 搭配 GitHub 拉取請求擴充功能的 VS Code - -最後,你可以下載壓縮檔形式的代碼。 - -### 關於 GitHub 的更多有趣事 - -你可以對任何公開 repo 加星標、訂閱觀察和/或「fork」它們。加星的 repo 可以在右上角的下拉選單找到,這就像書籤,但用於程式碼。 - -專案有譯題追蹤器,通常是在 GitHub 的「Issues」標籤頁(除非另有說明),用來討論專案相關問題。拉取請求標籤是用來討論和審查正在進行的改動。 - -有些專案還會在論壇、郵件列表或聊天頻道(像 Slack、Discord 或 IRC)進行討論。 - -🔧 **現代 GitHub 功能**: -- **GitHub Discussions** - 內建的社群討論區 -- **GitHub Sponsors** - 財務支持維護者 -- **Security tab** - 漏洞報告與安全公告 -- **Actions tab** - 查看自動化工作流程及 CI/CD 管線 -- **Insights tab** - 關於貢獻者、提交和專案健康度的分析 -- **Projects tab** - GitHub 內建的專案管理工具 - -✅ 四處逛逛你的新 GitHub repo,試試修改設定、添加資訊、建立專案(如看板)、設定 GitHub Actions 來自動化。你能做的事非常多! - ---- - -## 🚀 挑戰 - -好了,現在是測試你閃亮新 GitHub 超能力的時刻了!🚀 這項挑戰會讓一切以最令人滿足的方式連結起來: - -找一個朋友(或那位一直問你在做什麼「電腦東西」的家人)一起展開協同編程冒險吧!這就是魔法所在 —— 建立一個專案,讓他們 fork,建立一些分支,像專業人士一樣合併變更。 - -說實話 —— 你們絕對會笑翻(尤其是當你們試圖同時更改同一行),可能還會被搞得抓頭困惑,但你一定會體驗到那些令人驚豔的「啊哈!」時刻,讓所有學習都變得值得。此外,與人分享第一次成功合併有著特別的意義 —— 它像是在慶祝你已走多遠! - -還沒有編程夥伴?完全沒問題!GitHub 社群熱情友善,他們都記得當初自己也是新手。找標記「good first issue」的儲存庫 —— 這基本上是在說「嘿,新手,來和我們一起學吧!」多棒啊! - -## 課後小測 -[Post-lecture quiz](https://ff-quizzes.netlify.app/web/en/) - -## 複習並持續學習 - -呼!🎉 看你多棒 —— 你剛剛像冠軍一樣征服了 GitHub 基礎!如果你現在覺得腦子有點爆炸,那是很正常,說實話這也是好事。你剛剛學到的工具,是我當初花了好幾週才習慣的。 - -Git 和 GitHub 非常強大(真的很強),我認識的每位開發者 —— 包括現在看起來像魔法師的那些 —— 都必須練習和摸索一段時間才有突破。你能順利完成這堂課,代表你已經踏上掌握開發者工具箱中最重要工具的旅程。 - -以下是一些超棒的資源,幫助你練習並變得更棒: - -- [貢獻開源軟體指南](https://opensource.guide/how-to-contribute/#how-to-submit-a-contribution) —— 你改變世界的路線圖 -- [Git 速查表](https://training.github.com/downloads/github-git-cheat-sheet/) —— 方便快速查詢! - -別忘了:練習促成進步,而非完美!你使用 Git 和 GitHub 越多,就越自然。GitHub 創建了很多有趣的互動課程,讓你在安全環境中練習: - -- [GitHub 入門](https://github.com/skills/introduction-to-github) -- [使用 Markdown 交流](https://github.com/skills/communicate-using-markdown) -- [GitHub Pages](https://github.com/skills/github-pages) -- [管理合併衝突](https://github.com/skills/resolve-merge-conflicts) - -**想更冒險一點?試試這些現代工具:** -- [GitHub CLI 文件](https://cli.github.com/manual/) —— 讓你感覺像指令列大師 -- [GitHub Codespaces 文件](https://docs.github.com/en/codespaces) —— 雲端程式編輯體驗! -- [GitHub Actions 文件](https://docs.github.com/en/actions) —— 自動化一切 -- [Git 最佳實踐](https://www.atlassian.com/git/tutorials/comparing-workflows) —— 升級你的工作流程 - -## GitHub Copilot Agent 挑戰 🚀 - -使用 Agent 模式完成以下挑戰: - -**說明:** 建立一個合作式網頁開發專案,展示你在本課程學到的完整 GitHub 工作流程。這個挑戰幫助你練習儲存庫建立、協作特性,以及現代 Git 工作流程,在實際場景中操練。 - -**提示:** 建立一個新的公開 GitHub 儲存庫,名為「Web Development Resources(網頁開發資源)」。儲存庫應包含結構良好的 README.md,列出有用的網頁開發工具和資源,依照不同類別(HTML、CSS、JavaScript 等)組織。按社群標準設定儲存庫,包括授權、貢獻指南和行為準則。至少建立兩個功能分支:一個新增 CSS 資源、另一個新增 JavaScript 資源。分別在各分支做有描述的提交,然後發出拉取請求合併回 main。啟用 GitHub 功能,例如 Issues、Discussions,並建立基本的 GitHub Actions 工作流程做自動化檢查。 - -## 作業 - -你的任務(如果你願意接受):完成 GitHub Skills 的 [GitHub 入門](https://github.com/skills/introduction-to-github) 課程。這個互動課程讓你在安全且有指導的環境中練習所學。完成後還能獲得酷炫徽章!🏅 - -**想挑戰更多?** -- 為 GitHub 帳號設定 SSH 認證(不用再輸入密碼!) -- 嘗試使用 GitHub CLI 執行日常 Git 操作 -- 建立一個有 GitHub Actions 工作流程的儲存庫 -- 嘗試用雲端編輯器 GitHub Codespaces 開啟本儲存庫 - ---- - -## 🚀 你的 GitHub 精通時間表 - -### ⚡ **接下來 5 分鐘你可以做的事** -- [ ] 給這個儲存庫和另外三個你感興趣的專案加星標 -- [ ] 為你的 GitHub 帳戶設定雙重身份驗證 -- [ ] 為你第一個儲存庫創建簡單的 README -- [ ] 追蹤 5 位令你受啟發的開發者 - -### 🎯 **接下來一小時你可以完成的目標** -- [ ] 完成課後小測並反思你的 GitHub 旅程 -- [ ] 設定 SSH 金鑰,實現免密碼登入 GitHub -- [ ] 做出你的第一個有意義的提交並寫好提交訊息 -- [ ] 探索 GitHub「Explore」分頁,發掘熱門專案 -- [ ] 練習 fork 一個儲存庫並做小改動 - -### 📅 **你的一週 GitHub 冒險** -- [ ] 完成 GitHub Skills 課程(GitHub 入門、Markdown) -- [ ] 對開源專案提出第一個拉取請求 -- [ ] 設置 GitHub Pages 網站展示你的作品 -- [ ] 參與你感興趣專案的 GitHub Discussions -- [ ] 建立具社群標準(README、授權等)的儲存庫 -- [ ] 嘗試使用 GitHub Codespaces 進行雲端開發 - -### 🌟 **你的一月蛻變** -- [ ] 對 3 個不同開源項目做出貢獻 -- [ ] 輔導一位 GitHub 新手(回饋社群!) -- [ ] 設定 GitHub Actions 自動化工作流程 -- [ ] 建立展示 GitHub 貢獻的作品集 -- [ ] 參加 Hacktoberfest 或類似社群活動 -- [ ] 成為自己開源專案的維護者,讓他人貢獻 - -### 🎓 **最終 GitHub 精通回顧** - -**慶祝你走過的路:** -- 你最喜歡使用 GitHub 的哪個部分? -- 哪個協作功能最讓你興奮? -- 你現在對參與開源貢獻有多大信心? -- 你想要貢獻的第一個專案是什麼? - -```mermaid -journey - title 你的 GitHub 信心之旅 - section 今日 - 緊張: 3: 你 - 好奇: 4: 你 - 興奮: 5: 你 - section 本週 - 練習中: 4: 你 - 貢獻中: 5: 你 - 聯繫中: 5: 你 - section 下個月 - 合作中: 5: 你 - 領導中: 5: 你 - 啟發他人: 5: 你 -``` -> 🌍 **歡迎加入全球開發者社群!** 你現在擁有和全球數百萬開發者合作的工具。你的第一次貢獻看似微小,但別忘了 —— 每個重大開源專案都是從某個人首次提交開始的。問題不是你是否能產生影響,而是什麼令人驚嘆的專案將率先受益於你獨特的視角!🚀 - -記住:每位專家都曾是新手。你可以的!💪 - ---- - - -**免責聲明**: -本文件由 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們雖力求準確,但請注意自動翻譯可能存在錯誤或不準確之處。原始文件的母語版本應視為權威來源。對於重要資訊,建議採用專業人工翻譯。因使用本翻譯所產生之任何誤解或誤讀,我們概不負責。 - \ No newline at end of file diff --git a/translations/hk/1-getting-started-lessons/3-accessibility/README.md b/translations/hk/1-getting-started-lessons/3-accessibility/README.md deleted file mode 100644 index b2e9b3938..000000000 --- a/translations/hk/1-getting-started-lessons/3-accessibility/README.md +++ /dev/null @@ -1,1500 +0,0 @@ - -# 建立無障礙網頁 - -![All About Accessibility](../../../../translated_images/zh-HK/webdev101-a11y.8ef3025c858d897a.webp) -> 筆記作者:[Tomomi Imura](https://twitter.com/girlie_mac) - -```mermaid -journey - title 你的無障礙學習歷程 - section 基礎 - 了解用戶: 5: You - 測試工具: 4: You - POUR 原則: 5: You - section 建立技能 - 語義 HTML: 4: You - 視覺設計: 5: You - ARIA 技術: 4: You - section 精通實踐 - 鍵盤導航: 5: You - 表單無障礙: 4: You - 實地測試: 5: You -``` -## 講座前小測驗 -[講座前小測驗](https://ff-quizzes.netlify.app/web/) - -> 網際網路的力量在於其普及性。無論有無障礙,人人均可使用是必須的面向。 -> -> \- Sir Timothy Berners-Lee,W3C 主任及萬維網發明人 - -這裡有件事可能會讓你驚訝:當你建立無障礙網站時,你不僅是在幫助有障礙的人——你其實是在為每個人打造更好的網絡! - -有沒有注意過街角的人行道斜坡?它們最初是為輪椅設計,但現在也幫助推嬰兒車的人、送貨員使用手推車、旅行者拖著行李,以及騎單車的朋友。這正是無障礙網頁設計的運作方式——幫助單一群體的解決方案往往會惠及所有人。很酷吧? - -本課程將探討如何創建真正適合每個人使用的網站,無論他們如何瀏覽網頁。你將學習已內建於網頁標準的實用技術,動手使用測試工具,並了解無障礙如何提升全體使用者的使用體驗。 - -課程結束時,你將有信心將無障礙作為開發工作流程的自然部分。準備好探索用心設計如何讓數十億用戶暢遊網絡?我們開始吧! - -```mermaid -mindmap - root((網頁無障礙)) - Users - Screen readers[螢幕閱讀器] - Keyboard navigation[鍵盤導航] - Voice control[語音控制] - Magnification[放大功能] - Technologies - HTML semantics[HTML 語義] - ARIA attributes[ARIA 屬性] - CSS focus indicators[CSS 聚焦指示器] - Keyboard events[鍵盤事件] - Benefits - Wider audience[更廣泛的受眾] - Better SEO[更佳的搜尋引擎優化] - Legal compliance[符合法律規範] - Universal design[通用設計] - Testing - Automated tools[自動化工具] - Manual testing[手動測試] - User feedback[使用者回饋] - Real assistive tech[真實輔助技術] -``` -> 你可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/accessibility/?WT.mc_id=academic-77807-sagibbon) 參加這堂課! - -## 認識輔助技術 - -在開始寫程式碼之前,讓我們先了解不同能力者如何實際體驗網絡。這不只是理論——理解現實世界的導航模式會讓你成為更棒的開發者! - -輔助技術是非常驚人的工具,幫助有障礙的人以你可能沒想到的方式互動網站。掌握這些技術的運作,打造無障礙網頁經驗會變得直覺好用。就像學會用別人的眼睛看自己的程式碼。 - -### 螢幕閱讀器 - -[螢幕閱讀器](https://en.wikipedia.org/wiki/Screen_reader) 是相當先進的技術,能將數位文字轉換成語音或點字輸出。雖然主要為視障者使用,它們對患有閱讀障礙(例如閱讀困難症)的人也非常有幫助。 - -我喜歡將螢幕閱讀器想像成一位非常聰明的敘述者在朗讀書本。它以邏輯順序朗讀內容,並宣告「按鈕」或「連結」等互動元素,提供鍵盤快捷鍵協助用戶快速跳轉頁面。不過重點是——螢幕閱讀器只有在我們正確構建網站的結構和內容意義時,才有辦法發揮神奇功效。這就是你作為開發者的重要角色! - -**跨平台熱門螢幕閱讀器:** -- **Windows**: [NVDA](https://www.nvaccess.org/about-nvda/)(免費且最流行)、[JAWS](https://webaim.org/articles/jaws/)、[Narrator](https://support.microsoft.com/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1/?WT.mc_id=academic-77807-sagibbon)(內建) -- **macOS/iOS**: [VoiceOver](https://support.apple.com/guide/voiceover/welcome/10)(內建且功能強大) -- **Android**: [TalkBack](https://support.google.com/accessibility/android/answer/6283677)(內建) -- **Linux**: [Orca](https://wiki.gnome.org/Projects/Orca)(免費及開源) - -**螢幕閱讀器瀏覽網頁內容的方式:** - -螢幕閱讀器提供多種導航方法,使經驗豐富的使用者能有效率地瀏覽: -- **連續閱讀**:從上到下朗讀內容,像閱讀書本 -- **地標導覽**:跳轉頁面區塊(標頭、導航、主內容、頁尾) -- **標題導航**:跳轉標題,了解頁面結構 -- **連結清單**:產生所有連結的列表以快速存取 -- **表單控制**:直接在輸入欄位與按鈕之間導航 - -> 💡 **讓我驚豔的事實**:68% 螢幕閱讀器使用者主要透過標題導航([WebAIM 調查](https://webaim.org/projects/screenreadersurvey9/#finding))。這意味著你的標題結構就像地圖——當你做好它,就真的是在幫助用戶更快找到內容! - -### 建立你的測試工作流程 - -好消息是——有效的無障礙測試並不一定讓人感到複雜!你會想要結合自動化工具(它們很棒地捕捉明顯問題)和部分親身操作的測試。我整理出一套系統化方法,能檢測最多問題又不會耗盡你的一整天: - -**必要的手動測試流程:** - -```mermaid -flowchart TD - A[🚀 開始測試] --> B{⌨️ 鍵盤導航} - B --> C[用Tab鍵瀏覽所有互動元素] - C --> D{🎧 螢幕閱讀器測試} - D --> E[使用 NVDA/VoiceOver 測試] - E --> F{🔍 縮放測試} - F --> G[縮放至200%並測試功能] - G --> H{🎨 顏色/對比檢查} - H --> I[確認所有文字符合對比度] - I --> J{👁️ 焦點管理} - J --> K[確保焦點指示器可見] - K --> L[✅ 測試完成] - - style A fill:#e3f2fd - style L fill:#e8f5e8 - style B fill:#fff3e0 - style D fill:#f3e5f5 - style F fill:#e0f2f1 - style H fill:#fce4ec - style J fill:#e8eaf6 -``` -**逐步測試檢查清單:** -1. **鍵盤導航**:只用 Tab、Shift+Tab、Enter、空白鍵、方向鍵 -2. **螢幕閱讀器測試**:啟用 NVDA、VoiceOver 或 Narrator,閉眼導航 -3. **縮放測試**:在 200% 與 400% 縮放比例下操作 -4. **色彩對比驗證**:檢查所有文字和 UI 元件 -5. **焦點指示器測試**:確保所有互動元素有可見焦點狀態 - -✅ **從 Lighthouse 開始**:開啟瀏覽器 DevTools,執行 Lighthouse 無障礙稽核,利用結果來指引手動測試的重點。 - -### 縮放與放大工具 - -你知道的,有時手機上的文字太小,你會用雙指捏合手勢放大,或者陽光刺眼時找角度看筆電螢幕?很多人每天必須依賴放大工具來讓內容可讀。這包括視力不足者、老年人,以及任何嘗試在戶外看網站的人。 - -現代縮放技術不再只是放大文字,而是幫助你製作在任何放大比例下都能操作且美觀的響應式設計。 - -**現代瀏覽器的縮放功能:** -- **頁面縮放**:比例放大所有內容(文字、圖片、版面)-這是首選方法 -- **僅文字放大**:放大字體大小但維持原始版面 -- **捏合縮放**:手機上的臨時放大手勢 -- **瀏覽器支援**:所有現代瀏覽器支援最高 500% 縮放且功能不破壞 - -**專用放大軟體:** -- **Windows**: [放大鏡](https://support.microsoft.com/windows/use-magnifier-to-make-things-on-the-screen-easier-to-see-414948ba-8b1c-d3bd-8615-0e5e32204198)(內建)、[ZoomText](https://www.freedomscientific.com/training/zoomtext/getting-started/) -- **macOS/iOS**: [放大器](https://www.apple.com/accessibility/mac/vision/)(內建進階功能) - -> ⚠️ **設計考量**:WCAG 要求內容在縮放至 200% 時仍保持功能。此時橫向捲動應盡量減少,所有互動元素都應可操作。 - -✅ **測試你的響應式設計**:將瀏覽器縮放至 200% 與 400%。你的版面能優雅調整嗎?是否仍可在不過度捲動下使用全部功能? - -## 現代無障礙測試工具 - -既然你已了解使用輔助技術的使用者如何導航網絡,接下來讓我們探索幫助你建立和測試無障礙網站的工具。 - -想像這樣:自動化工具擅長抓明顯的問題(例如缺 ALT 文字),而實際動手測試則確保網站在真實情境中使用起來良好。兩者結合,讓你有信心網站適合所有人。 - -### 色彩對比測試 - -好消息:色彩對比是最常見的無障礙問題之一,同時也是最容易改善的。良好的對比對每個人都有益——從視障者到在海邊看手機的人。 - -**WCAG 對比要求:** - -| 文字類型 | WCAG AA(最低標準) | WCAG AAA(強化標準) | -|-----------|-------------------|---------------------| -| **一般文字**(小於 18pt) | 4.5:1 對比比例 | 7:1 對比比例 | -| **大字體文字**(18pt+ 或 14pt+ 粗體) | 3:1 對比比例 | 4.5:1 對比比例 | -| **介面元件**(按鈕、表單邊框) | 3:1 對比比例 | 3:1 對比比例 | - -**必要測試工具:** -- [Colour Contrast Analyser](https://www.tpgi.com/color-contrast-checker/) - 桌面應用程式,帶色彩選取器 -- [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/) - 網頁版,立即反饋 -- [Stark](https://www.getstark.co/) - Figma、Sketch、Adobe XD 設計插件 -- [Accessible Colors](https://accessible-colors.com/) - 找適合無障礙的配色組合 - -✅ **打造更佳色彩調色盤**:以你的品牌色為起點,使用對比檢查器創建無障礙變體。將這些紀錄為你的設計系統無障礙色彩代碼。 - -### 全面無障礙稽核 - -最有效的無障礙測試結合多種方式。沒有單一工具能抓出所有問題,建立有多種方法的測試流程才能全面覆蓋。 - -**瀏覽器內建測試(DevTools):** -- **Chrome/Edge**:Lighthouse 無障礙稽核 + 無障礙面板 -- **Firefox**:無障礙檢視器,含詳細樹狀圖 -- **Safari**:Web Inspector 中的稽核分頁,帶 VoiceOver 模擬 - -**專業測試擴充套件:** -- [axe DevTools](https://www.deque.com/axe/devtools/) - 業界標準的自動化測試工具 -- [WAVE](https://wave.webaim.org/extension/) - 視覺化反饋與錯誤標示 -- [Accessibility Insights](https://accessibilityinsights.io/) - 微軟全方位測試套件 - -**命令列及持續整合測試:** -- [axe-core](https://github.com/dequelabs/axe-core) - JavaScript 自動測試函式庫 -- [Pa11y](https://pa11y.org/) - 命令列無障礙測試工具 -- [Lighthouse CI](https://github.com/GoogleChrome/lighthouse-ci) - 自動化無障礙評分 - -> 🎯 **測試目標**:目標在 Lighthouse 無障礙評分達 95+ 作為基本線。請記得,自動工具只能偵測約 30-40% 的問題——手動測試仍不可少! - -### 🧠 **測試能力檢測:準備找問題了嗎?** - -**來看看你對無障礙測試的感覺:** -- 現在你覺得哪種測試方法最容易入手? -- 你能想像使用全鍵盤操作一天嗎? -- 你個人線上遇過哪一種無障礙障礙? - -```mermaid -pie title "透過不同方法發現的無障礙問題" - "自動化工具" : 35 - "手動測試" : 40 - "用戶反饋" : 25 -``` -> **信心提升**:專業無障礙測試人員正是使用這套組合。你正在學習業界標準做法! - -## 從根基打造無障礙 - -無障礙成功的關鍵是從一開始就把它建進基礎。我知道你可能會想「我要晚點再加無障礙功能」,但那就像房子建好才打算裝斜坡一樣。可能嗎?可以。但簡單嗎?不見得。 - -想像無障礙是房屋規劃——在設計階段就納入輪椅通行,比事後改裝容易得多。 - -### POUR 原則:你的無障礙基礎 - -網頁內容無障礙指南(WCAG)圍繞著四項基本原則,簡稱 POUR。別擔心,它們並非枯燥學術理論!實際上是實用指導,幫助你製作符合每個人需求的內容。 - -熟悉 POUR 後,無障礙相關決策會更直覺。就像腦海裡有份核對單指引你的設計選擇。讓我們詳解: - -```mermaid -flowchart LR - A[🔍 可感知的
用戶能感知嗎?] --> B[🎮 可操作的
用戶能使用嗎?] - B --> C[📖 可理解的
用戶能明白嗎?] - C --> D[💪 強健的
在任何地方都能運作嗎?] - - A1[替代文字
字幕
對比度] --> A - B1[鍵盤操作
無癲癇發作
時間限制] --> B - C1[清晰語言
可預測
錯誤幫助] --> C - D1[有效代碼
相容性
面向未來] --> D - - style A fill:#e1f5fe - style B fill:#e8f5e8 - style C fill:#fff3e0 - style D fill:#f3e5f5 -``` -**🔍 Perceivable(感知性)**:資訊必須以使用者可感知的方式呈現 - -- 為非文字內容(圖片、影片、音訊)提供文字替代 -- 確保所有文字及 UI 元件具足夠色彩對比 -- 為多媒體提供字幕及文字稿 -- 設計內容在放大至 200% 時仍可正常使用 -- 利用多種感官特徵(不僅是顏色)傳達資訊 - -**🎮 Operable(可操作性)**:所有介面元件必須能以可用的輸入方式操作 - -- 使所有功能皆可用鍵盤操作 -- 提供使用者足夠時間閱讀及互動 -- 避免會引發癲癇或前庭系統問題的內容 -- 以清晰結構及地標標示協助有效導航 -- 確保互動元素目標大小足夠(最低 44px) - -**📖 Understandable(可理解性)**:資訊及界面操作須清晰易懂 - -- 使用清楚簡單且適合受眾的語言 -- 保持內容顯示和操作方式可預測且一致 -- 提供明確的操作指示及錯誤訊息 -- 協助使用者理解並修正表單錯誤 -- 以合邏輯的閱讀順序及資訊層級組織內容 - -**💪 Robust(穩健性)**:內容必須能在不同技術及輔助設備上可靠運作 - -- **以有效的語意 HTML 作為基礎** -- **確保與現在及未來輔助技術相容** -- **遵循網頁標準及優良標記實務** -- **在不同瀏覽器、裝置及輔助工具上測試** -- **結構化內容,讓它在不支援進階功能時仍能漸進降級** - -### 🎯 **POUR 原則檢查:牢記於心** - -**對基礎的快速反思:** -- 你能想出一個未符合每個 POUR 原則的網站功能嗎? -- 哪個原則對你作為開發者來說最自然? -- 這些原則如何改善設計,讓所有人受益,而不僅是殘障用戶? - -```mermaid -quadrantChart - title POUR 原則影響矩陣 - x-axis 低努力 --> 高努力 - y-axis 低影響 --> 高影響 - quadrant-1 快速贏得 - quadrant-2 主要項目 - quadrant-3 之後考慮 - quadrant-4 策略重點 - - Alt Text: [0.2, 0.9] - Color Contrast: [0.3, 0.8] - Semantic HTML: [0.4, 0.9] - Keyboard Nav: [0.6, 0.8] - ARIA Complex: [0.8, 0.7] - Screen Reader Testing: [0.7, 0.6] -``` -> **記住**:從高影響、低成本的改進開始。語義化 HTML 和替代文字能帶來最高的無障礙提升,同時成本最低! - -## 建立無障礙的視覺設計 - -良好的視覺設計和無障礙是並行不悖的。當你以無障礙為設計考量時,通常會發現這些限制促使你找到更簡潔、更優雅的解決方案,惠及所有使用者。 - -讓我們探討如何創造對所有人都合適的視覺吸引設計,不管他們的視覺能力如何,或在什麼條件下閱覽你的內容。 - -### 顏色與視覺無障礙策略 - -顏色在溝通上非常有力,但絕不應該是傳遞重要資訊的唯一方式。超越顏色的設計創造更健全且包容的體驗,適用於更多情境。 - -**針對色覺差異設計:** - -約有 8% 的男性與 0.5% 的女性有某種程度的色覺差異(常稱「色盲」)。最常見的類型是: -- **綠色盲(Deuteranopia)**:難以分辨紅色與綠色 -- **紅色盲(Protanopia)**:紅色看起來較暗 -- **藍黃色盲(Tritanopia)**:難以分辨藍與黃(較少見) - -**包容性顏色策略:** - -```css -/* ❌ Bad: Using only color to indicate status */ -.error { color: red; } -.success { color: green; } - -/* ✅ Good: Color plus icons and context */ -.error { - color: #d32f2f; - border-left: 4px solid #d32f2f; -} -.error::before { - content: "⚠️"; - margin-right: 8px; -} - -.success { - color: #2e7d32; - border-left: 4px solid #2e7d32; -} -.success::before { - content: "✅"; - margin-right: 8px; -} -``` - -**超越基礎對比要求:** -- 用色盲模擬器測試你的色彩選擇 -- 在顏色編碼旁使用圖案、紋理或形狀 -- 確保互動狀態在無顏色情況下依然可辨識 -- 考慮設計在高對比模式下的呈現 - -✅ **測試你的色彩無障礙**:使用像 [Coblis](https://www.color-blindness.com/coblis-color-blindness-simulator/) 等工具,檢視你的網站在不同色覺用戶眼中的樣子。 - -### 焦點指示器與互動設計 - -焦點指示器就像數位光標—它告訴鍵盤使用者目前聚焦在頁面上的位置。設計良好的焦點指示器使互動明確且可預期,提升每個人的體驗。 - -**現代焦點指示器最佳實踐:** - -```css -/* Enhanced focus styles that work across browsers */ -button:focus-visible { - outline: 2px solid #0066cc; - outline-offset: 2px; - box-shadow: 0 0 0 4px rgba(0, 102, 204, 0.25); -} - -/* Remove focus outline for mouse users, preserve for keyboard users */ -button:focus:not(:focus-visible) { - outline: none; -} - -/* Focus-within for complex components */ -.card:focus-within { - box-shadow: 0 0 0 3px rgba(74, 144, 164, 0.5); - border-color: #4A90A4; -} - -/* Ensure focus indicators meet contrast requirements */ -.custom-focus:focus-visible { - outline: 3px solid #ffffff; - outline-offset: 2px; - box-shadow: 0 0 0 6px #000000; -} -``` - -**焦點指示器基本要求:** -- **可見性**:與周圍元素對比度至少達 3:1 -- **寬度**:元素周圍厚度至少 2px -- **持續性**:直到焦點移動至其他位置都應保持可見 -- **區別性**:須在視覺上與其他 UI 狀態明顯區隔 - -> 💡 **設計秘訣**:優秀的焦點指示器通常結合輪廓線、盒子陰影及顏色變化,確保在各種背景和情境均清晰可見。 - -✅ **審核焦點指示器**:透過 Tab 鍵瀏覽你的網站,注意哪些元素有明確焦點指示?有沒有難以看清或完全沒有的? - -### 語義化 HTML:無障礙的基礎 - -語義化 HTML 就像是為輔助技術提供網站的 GPS。當你使用適合用途的 HTML 元素時,等於是為螢幕朗讀器、鍵盤及其他工具提供詳細導航路線,協助用戶有效瀏覽。 - -我喜歡這個比喻:語義化 HTML 的差別就像整齊分類並有清楚標示的圖書館,與書籍雜亂無章散落的倉庫。兩處的書籍數量相同,但你會願意在哪裡找書?就是這個道理! - -```mermaid -flowchart TD - A[🏠 HTML 文件] --> B[📰 頁首] - A --> C[🧭 導航] - A --> D[📄 主要內容] - A --> E[📋 頁尾] - - B --> B1[h1: 網站名稱
標誌與品牌] - C --> C1[ul: 導航列表
主要連結] - D --> D1[article: 內容
section: 子部分] - D --> D2[aside: 側欄
相關內容] - E --> E1[nav: 頁尾連結
版權資訊] - - D1 --> D1a[h1: 頁面標題
h2: 主要部分
h3: 子部分] - - style A fill:#e3f2fd - style B fill:#e8f5e8 - style C fill:#fff3e0 - style D fill:#f3e5f5 - style E fill:#e0f2f1 -``` -**無障礙頁面結構的構件:** - -```html - -
-

Your Site Name

- -
- -
-
-
-

Article Title

-

Published on

-
- -
-

First Section

-

Content that relates to this section...

-
- -
-

Second Section

-

More related content...

-
-
- - -
- - -``` - -**語義化 HTML 如何改造無障礙體驗:** - -| 語義元素 | 用途 | 螢幕朗讀器受益 | -|-------------------|--------------|--------------------------------| -| `
` | 頁面或區塊標頭 | 「橫幅地標」—快速導覽頁首 | -| `