diff --git a/translated_images/km/.co-op-translator.json b/translated_images/km/.co-op-translator.json new file mode 100644 index 000000000..549091881 --- /dev/null +++ b/translated_images/km/.co-op-translator.json @@ -0,0 +1,860 @@ +{ + "1.b6da8c1394b07491.webp": { + "original_hash": "6b12479c2e6a54160867fa8945c04082", + "translation_date": "2026-04-06T21:36:11+00:00", + "source_file": "5-browser-extension/1-about-browsers/images/1.png", + "language_code": "km" + }, + "1.cc07a5cbe114ad1d.webp": { + "original_hash": "fc436b6749801dd90d0558ae92d56b60", + "translation_date": "2026-04-06T21:37:37+00:00", + "source_file": "3-terrarium/2-intro-to-css/images/1.png", + "language_code": "km" + }, + "2.1dae52ff08042246.webp": { + "original_hash": "3995628a6a986308859d0cb6eed8d787", + "translation_date": "2026-04-06T21:35:57+00:00", + "source_file": "5-browser-extension/1-about-browsers/images/2.png", + "language_code": "km" + }, + "after-codeswing-extension-pb.0ebddddcf73b5509.webp": { + "original_hash": "861d59ec65a7334c5f3a4c02dfe22ceb", + "translation_date": "2026-04-06T21:34:26+00:00", + "source_file": "8-code-editor/images/after-codeswing-extension-pb.png", + "language_code": "km" + }, + "background.148a8d43afde5730.webp": { + "original_hash": "5a50f015fb466782c69063ffebb256de", + "translation_date": "2026-04-06T21:31:57+00:00", + "source_file": "images/background.png", + "language_code": "km" + }, + "backgroundColor.e19c3c60768150c8.webp": { + "original_hash": "b3e10fe033f615ec9d3580cce61eae09", + "translation_date": "2026-04-06T21:35:22+00:00", + "source_file": "6-space-game/solution/spaceArt/png/Background/backgroundColor.png", + "language_code": "km" + }, + "browser-console.efaf0b51aaaf6778.webp": { + "original_hash": "8d6c5077d1f133d27c65c0014ef503a9", + "translation_date": "2026-04-06T21:36:26+00:00", + "source_file": "7-bank-project/2-forms/images/browser-console.png", + "language_code": "km" + }, + "browser.60317c9be8b7f84a.webp": { + "original_hash": "aa4461fec006d86899864d991b50cc74", + "translation_date": "2026-04-06T21:32:11+00:00", + "source_file": "sketchnotes/browser.jpg", + "language_code": "km" + }, + "canvas.fbd605ff8e5b8aff.webp": { + "original_hash": "29556305738d345dd023554d788d5477", + "translation_date": "2026-04-06T21:31:26+00:00", + "source_file": "teaching-files/canvas.png", + "language_code": "km" + }, + "canvas_grid.5f209da785ded492.webp": { + "original_hash": "8da354720ffbfd778571aa17402de890", + "translation_date": "2026-04-06T21:35:14+00:00", + "source_file": "6-space-game/2-drawing-to-canvas/canvas_grid.png", + "language_code": "km" + }, + "character.5c0dd8e067ffd693.webp": { + "original_hash": "076bbb4d25a17982c81973b8dba9d4fa", + "translation_date": "2026-04-06T21:31:50+00:00", + "source_file": "images/character.png", + "language_code": "km" + }, + "click-register.e89a30bf0d4bc9ca.webp": { + "original_hash": "ef9688313524664fad6ab9b0e080c758", + "translation_date": "2026-04-06T21:36:18+00:00", + "source_file": "7-bank-project/2-forms/images/click-register.png", + "language_code": "km" + }, + "clone_repo.5085c48d666ead57.webp": { + "original_hash": "28c00f3d5861ab95d188b4f6a2d337df", + "translation_date": "2026-04-06T21:37:39+00:00", + "source_file": "1-getting-started-lessons/2-github-basics/images/clone_repo.png", + "language_code": "km" + }, + "clone_repo.6a202fb230ab6bdd.webp": { + "original_hash": "9261d014674312eece91deae958538cf", + "translation_date": "2026-04-06T21:31:53+00:00", + "source_file": "images/clone_repo.png", + "language_code": "km" + }, + "codespace.bcecbdf5d2747d3d.webp": { + "original_hash": "ff86a65511122ddb448e092969566b0a", + "translation_date": "2026-04-06T21:37:40+00:00", + "source_file": "9-chat-project/assets/codespace.png", + "language_code": "km" + }, + "create-a-fork.297ab42b4bd0af99.webp": { + "original_hash": "10712b80e3dcfa7c44fb8820a6ff3ad3", + "translation_date": "2026-04-06T21:34:27+00:00", + "source_file": "8-code-editor/images/create-a-fork.png", + "language_code": "km" + }, + "create-new-file-pb.0797800d977ec3eb.webp": { + "original_hash": "c149c42e04132f2409651425d6924ffa", + "translation_date": "2026-04-06T21:33:51+00:00", + "source_file": "8-code-editor/images/create-new-file-pb.png", + "language_code": "km" + }, + "create-new-file.2814e609c2af9aeb.webp": { + "original_hash": "cf6df76faeac2d92904e5d877b7bdf69", + "translation_date": "2026-04-06T21:33:47+00:00", + "source_file": "8-code-editor/images/create-new-file.png", + "language_code": "km" + }, + "createcodespace.0238bbf4d7a8d955.webp": { + "original_hash": "4f504323085308f4a0e7b5bfb37e16d7", + "translation_date": "2026-04-06T21:31:46+00:00", + "source_file": "images/createcodespace.png", + "language_code": "km" + }, + "data-flow.fa2354e0908fecc8.webp": { + "original_hash": "c9b82b42fa1973b3b7bfad9c7128c24c", + "translation_date": "2026-04-06T21:36:38+00:00", + "source_file": "7-bank-project/4-state-management/images/data-flow.png", + "language_code": "km" + }, + "default-vscode-dev.5d06881d65c1b323.webp": { + "original_hash": "146fecc3a9da37cb1d5c9d628cd94996", + "translation_date": "2026-04-06T21:34:49+00:00", + "source_file": "8-code-editor/images/default-vscode-dev.png", + "language_code": "km" + }, + "dialog.93bba104afeb79f1.webp": { + "original_hash": "c56b5ad7eb8c4df4b3ed8a99bf67e6e2", + "translation_date": "2026-04-06T21:36:37+00:00", + "source_file": "7-bank-project/4-state-management/images/dialog.png", + "language_code": "km" + }, + "dom-tree.7daf0e763cbbba92.webp": { + "original_hash": "579f4ae298ff15a357def7f442671847", + "translation_date": "2026-04-06T21:36:45+00:00", + "source_file": "3-terrarium/3-intro-to-DOM-and-closures/images/dom-tree.png", + "language_code": "km" + }, + "earlybrowsers.d984b711cdf3a42d.webp": { + "original_hash": "810a4d2348668e25289029c5cfcb67bd", + "translation_date": "2026-04-06T21:35:53+00:00", + "source_file": "5-browser-extension/1-about-browsers/images/earlybrowsers.jpg", + "language_code": "km" + }, + "edit-a-file-pb.263555922c14fc52.webp": { + "original_hash": "5c52723d35259eadd110d0c720a87b04", + "translation_date": "2026-04-06T21:34:42+00:00", + "source_file": "8-code-editor/images/edit-a-file-pb.png", + "language_code": "km" + }, + "edit-a-file.52c0ee665ef19f08.webp": { + "original_hash": "c28903236d60be6bba3f3848ea368c63", + "translation_date": "2026-04-06T21:35:13+00:00", + "source_file": "8-code-editor/images/edit-a-file.png", + "language_code": "km" + }, + "enemyShip.035a46787bff658c.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/5-keeping-score/solution/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.1a1354d7988de290.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/6-end-condition/solution/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.22cbee6ea27a5809.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/2-drawing-to-canvas/your-work/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.321ecb1b4eb21f2c.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/5-keeping-score/your-work/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.4fbf2889e6129db4.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:17+00:00", + "source_file": "6-space-game/6-end-condition/your-work/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.5df2a822c16650c2.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:17+00:00", + "source_file": "6-space-game/2-drawing-to-canvas/solution/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.62983ed4bfb2220f.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:24+00:00", + "source_file": "6-space-game/3-moving-elements-around/solution/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.add7036e1c3c3014.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/4-collision-detection/solution/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.b39a140287683bf7.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:24+00:00", + "source_file": "6-space-game/3-moving-elements-around/your-work/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.b9626ed228a17a32.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/4-collision-detection/your-work/assets/enemyShip.png", + "language_code": "km" + }, + "enemyShip.deb0477a7312f54d.webp": { + "original_hash": "2a41854e0eaa974e8619298f3b333e11", + "translation_date": "2026-04-06T21:35:20+00:00", + "source_file": "6-space-game/solution/spaceArt/png/enemyShip.png", + "language_code": "km" + }, + "enemyUFO.bf8585e4e8dcdb68.webp": { + "original_hash": "18198bef76e4882928e4092344d0fb98", + "translation_date": "2026-04-06T21:35:21+00:00", + "source_file": "6-space-game/solution/spaceArt/png/enemyUFO.png", + "language_code": "km" + }, + "extension-details.9f8f1fd4e9eb2de5.webp": { + "original_hash": "f57d2e246e6ba8a58463d7573640d714", + "translation_date": "2026-04-06T21:35:12+00:00", + "source_file": "8-code-editor/images/extension-details.png", + "language_code": "km" + }, + "extension-screenshot.0e7f5bfa110e92e3.webp": { + "original_hash": "4fdd1d3fdbc9ac2c2932f83847a5e4b8", + "translation_date": "2026-04-06T21:31:43+00:00", + "source_file": "5-browser-extension/extension-screenshot.png", + "language_code": "km" + }, + "extension-settings.21c752ae4f4cdb78.webp": { + "original_hash": "fd7ebcb5d84c78047026ab3337908306", + "translation_date": "2026-04-06T21:34:03+00:00", + "source_file": "8-code-editor/images/extension-settings.png", + "language_code": "km" + }, + "extensions.eca0e0c7f59a10b5.webp": { + "original_hash": "a6c9c8f51d3edd917262e53664f08441", + "translation_date": "2026-04-06T21:34:31+00:00", + "source_file": "8-code-editor/images/extensions.png", + "language_code": "km" + }, + "favicon.37b561214b36d454.webp": { + "original_hash": "228faa6584f8ba1f7e9a75e3200112e9", + "translation_date": "2026-04-06T21:31:47+00:00", + "source_file": "images/favicon.png", + "language_code": "km" + }, + "form-post.61de4ca1b964d91a.webp": { + "original_hash": "7e95c76a8ea2e82bceea70aae89f2360", + "translation_date": "2026-04-06T21:36:20+00:00", + "source_file": "7-bank-project/2-forms/images/form-post.png", + "language_code": "km" + }, + "history.7fdabbafa521e064.webp": { + "original_hash": "445d71bea6a747dfe547df7eea846439", + "translation_date": "2026-04-06T21:36:13+00:00", + "source_file": "7-bank-project/1-template-route/history.png", + "language_code": "km" + }, + "install-on-edge.78634f02842c4828.webp": { + "original_hash": "6224aad8f1cd252da83c2808ff5c7a4e", + "translation_date": "2026-04-06T21:31:34+00:00", + "source_file": "5-browser-extension/install-on-edge.png", + "language_code": "km" + }, + "install-on-edge.d68781acaf0b3d3d.webp": { + "original_hash": "6224aad8f1cd252da83c2808ff5c7a4e", + "translation_date": "2026-04-06T21:36:07+00:00", + "source_file": "5-browser-extension/1-about-browsers/images/install-on-edge.png", + "language_code": "km" + }, + "laserGreen.89904f0f49945560.webp": { + "original_hash": "ddf7102c86fc3ec46037714c60091851", + "translation_date": "2026-04-06T21:35:21+00:00", + "source_file": "6-space-game/solution/spaceArt/png/laserGreen.png", + "language_code": "km" + }, + "laserGreenShot.e4fbfc4714c08a5b.webp": { + "original_hash": "cb6ed500c16736a41998e4cd0c467df7", + "translation_date": "2026-04-06T21:35:21+00:00", + "source_file": "6-space-game/solution/spaceArt/png/laserGreenShot.png", + "language_code": "km" + }, + "laserRed.2040e11f55c0a40a.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:17+00:00", + "source_file": "6-space-game/6-end-condition/solution/assets/laserRed.png", + "language_code": "km" + }, + "laserRed.381bc5555491ce67.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:24+00:00", + "source_file": "6-space-game/3-moving-elements-around/your-work/assets/laserRed.png", + "language_code": "km" + }, + "laserRed.69730edd76f0b3bd.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:17+00:00", + "source_file": "6-space-game/6-end-condition/your-work/assets/laserRed.png", + "language_code": "km" + }, + "laserRed.b583dc1728eb8581.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/5-keeping-score/solution/assets/laserRed.png", + "language_code": "km" + }, + "laserRed.cae9ab24ea9b18fd.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/4-collision-detection/solution/assets/laserRed.png", + "language_code": "km" + }, + "laserRed.d81ce4986f87c251.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:20+00:00", + "source_file": "6-space-game/solution/spaceArt/png/laserRed.png", + "language_code": "km" + }, + "laserRed.e58ef8db2585dfbe.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/5-keeping-score/your-work/assets/laserRed.png", + "language_code": "km" + }, + "laserRed.e66e29ace6666064.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:24+00:00", + "source_file": "6-space-game/3-moving-elements-around/solution/assets/laserRed.png", + "language_code": "km" + }, + "laserRed.e86e8fb629c6026e.webp": { + "original_hash": "6f0626e9839beb9d9a82ff40699aabfd", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/4-collision-detection/your-work/assets/laserRed.png", + "language_code": "km" + }, + "laserRedShot.c39d066745996a71.webp": { + "original_hash": "1f1048184aab9d405e9f7d067a57af01", + "translation_date": "2026-04-06T21:35:21+00:00", + "source_file": "6-space-game/solution/spaceArt/png/laserRedShot.png", + "language_code": "km" + }, + "life.27144b6d4bfdea76.webp": { + "original_hash": "9a5d93e699071693b15b7b157f760a90", + "translation_date": "2026-04-06T21:35:21+00:00", + "source_file": "6-space-game/solution/spaceArt/png/life.png", + "language_code": "km" + }, + "life.2a159298dd98f4ef.webp": { + "original_hash": "9a5d93e699071693b15b7b157f760a90", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/5-keeping-score/your-work/assets/life.png", + "language_code": "km" + }, + "life.466df3b1692a244a.webp": { + "original_hash": "9a5d93e699071693b15b7b157f760a90", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/4-collision-detection/your-work/assets/life.png", + "language_code": "km" + }, + "life.65a2aaceca875284.webp": { + "original_hash": "9a5d93e699071693b15b7b157f760a90", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/4-collision-detection/solution/assets/life.png", + "language_code": "km" + }, + "life.6fb9f50d53ee0413.webp": { + "original_hash": "9a5d93e699071693b15b7b157f760a90", + "translation_date": "2026-04-06T21:35:19+00:00", + "source_file": "6-space-game/5-keeping-score/solution/assets/life.png", + "language_code": "km" + }, + "life.78b6e96a3003767e.webp": { + "original_hash": "9a5d93e699071693b15b7b157f760a90", + "translation_date": "2026-04-06T21:35:17+00:00", + "source_file": "6-space-game/6-end-condition/your-work/assets/life.png", + "language_code": "km" + }, + "life.86d843ce9c23289c.webp": { + "original_hash": "9a5d93e699071693b15b7b157f760a90", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/6-end-condition/solution/assets/life.png", + "language_code": "km" + }, + "localstorage.472f8147b6a3f8d1.webp": { + "original_hash": "7706ccb87a13a08250f315f03140bc61", + "translation_date": "2026-04-06T21:35:28+00:00", + "source_file": "5-browser-extension/2-forms-browsers-local-storage/images/localstorage.png", + "language_code": "km" + }, + "log.804026979f3707e0.webp": { + "original_hash": "4c5e39f339781db01641b77b6b2d6026", + "translation_date": "2026-04-06T21:35:49+00:00", + "source_file": "5-browser-extension/3-background-tasks-and-performance/images/log.png", + "language_code": "km" + }, + "login-error.416fe019b36a6327.webp": { + "original_hash": "ea96ed372d7a4c37ee2df3f0352f79d1", + "translation_date": "2026-04-06T21:36:27+00:00", + "source_file": "7-bank-project/3-data/images/login-error.png", + "language_code": "km" + }, + "meteorBig.1e452b3ad7af50ad.webp": { + "original_hash": "07f37816512f563dd68780fdee2e30a6", + "translation_date": "2026-04-06T21:35:20+00:00", + "source_file": "6-space-game/solution/spaceArt/png/meteorBig.png", + "language_code": "km" + }, + "meteorSmall.0d729bc71c12d41f.webp": { + "original_hash": "ebabf6690cc614f9e33f019c356166fa", + "translation_date": "2026-04-06T21:35:20+00:00", + "source_file": "6-space-game/solution/spaceArt/png/meteorSmall.png", + "language_code": "km" + }, + "moodle.94eb93d714a50cb2.webp": { + "original_hash": "0d04a6ef1ac524b452d5a0aae3f45bee", + "translation_date": "2026-04-06T21:31:16+00:00", + "source_file": "teaching-files/moodle.png", + "language_code": "km" + }, + "mpa.7f7375a1a2d4aa77.webp": { + "original_hash": "021255b74f0b79b0c286c163c210ef3d", + "translation_date": "2026-04-06T21:36:30+00:00", + "source_file": "7-bank-project/3-data/images/mpa.png", + "language_code": "km" + }, + "nebula.55c2933d36d035d3.webp": { + "original_hash": "e0fa4f86653c6fe97bc77271c46241c2", + "translation_date": "2026-04-06T21:35:24+00:00", + "source_file": "6-space-game/solution/spaceArt/png/Background/nebula.png", + "language_code": "km" + }, + "new-file-github.com.c886796d800e8056.webp": { + "original_hash": "2e0ddd0dad4734e3968b70907df9c052", + "translation_date": "2026-04-06T21:34:56+00:00", + "source_file": "8-code-editor/images/new-file-github.com.png", + "language_code": "km" + }, + "open-palette-menu.46dda01084738da8.webp": { + "original_hash": "1860e80bf0534b9d54ef0fcb7e1a9f9e", + "translation_date": "2026-04-06T21:34:46+00:00", + "source_file": "8-code-editor/images/open-palette-menu.png", + "language_code": "km" + }, + "open-remote-repository.bd9c2598b8949e7f.webp": { + "original_hash": "777c01a9242da7d5d0e1b037df9c86f9", + "translation_date": "2026-04-06T21:34:29+00:00", + "source_file": "8-code-editor/images/open-remote-repository.png", + "language_code": "km" + }, + "palette-menu.4946174e07f42622.webp": { + "original_hash": "7387b91076790084ec8828866e88c6ce", + "translation_date": "2026-04-06T21:34:43+00:00", + "source_file": "8-code-editor/images/palette-menu.png", + "language_code": "km" + }, + "partI-solution.36c53b48c9ffae2a.webp": { + "original_hash": "fbbd263368f61f8ed3a86c4571e6810b", + "translation_date": "2026-04-06T21:35:15+00:00", + "source_file": "6-space-game/2-drawing-to-canvas/partI-solution.png", + "language_code": "km" + }, + "plant1.a876180d8659acb9.webp": { + "original_hash": "e08f9b0f46f6d9d7c9949d4c3e590694", + "translation_date": "2026-04-06T21:37:03+00:00", + "source_file": "3-terrarium/solution/images/plant1.png", + "language_code": "km" + }, + "plant10.2f2c47804ae52dd3.webp": { + "original_hash": "dba97454882c2796c52a33c403db61f7", + "translation_date": "2026-04-06T21:37:17+00:00", + "source_file": "3-terrarium/solution/images/plant10.png", + "language_code": "km" + }, + "plant11.0ce0081b0ef17aa1.webp": { + "original_hash": "68346dbd1ae03331b0a87025c3e8e9e2", + "translation_date": "2026-04-06T21:37:14+00:00", + "source_file": "3-terrarium/solution/images/plant11.png", + "language_code": "km" + }, + "plant12.6b934c4312a00228.webp": { + "original_hash": "dafacde8e7a0b56c4baaabe88b4f90e2", + "translation_date": "2026-04-06T21:37:34+00:00", + "source_file": "3-terrarium/solution/images/plant12.png", + "language_code": "km" + }, + "plant13.37d6ab2e2481421f.webp": { + "original_hash": "5cac561d7596ee631c4d02436d8f6998", + "translation_date": "2026-04-06T21:37:22+00:00", + "source_file": "3-terrarium/solution/images/plant13.png", + "language_code": "km" + }, + "plant14.908791477a46eb7f.webp": { + "original_hash": "349b8e5a33d1221bef4a4ac3bb439bb9", + "translation_date": "2026-04-06T21:37:07+00:00", + "source_file": "3-terrarium/solution/images/plant14.png", + "language_code": "km" + }, + "plant2.9e45efea224115b0.webp": { + "original_hash": "24beefd3dcca66085b44d3ae5d9758e1", + "translation_date": "2026-04-06T21:37:32+00:00", + "source_file": "3-terrarium/solution/images/plant2.png", + "language_code": "km" + }, + "plant3.06efdd0fa0c4b115.webp": { + "original_hash": "7e40e6f14cf52f7d75ed42320817b044", + "translation_date": "2026-04-06T21:37:27+00:00", + "source_file": "3-terrarium/solution/images/plant3.png", + "language_code": "km" + }, + "plant4.3b78072b427727c6.webp": { + "original_hash": "c523205855d0691a9a0161c6abca983c", + "translation_date": "2026-04-06T21:37:24+00:00", + "source_file": "3-terrarium/solution/images/plant4.png", + "language_code": "km" + }, + "plant5.8ec58b18ac336fa8.webp": { + "original_hash": "bcf5f2eacd7da3fe6b07c857d7f5a2ce", + "translation_date": "2026-04-06T21:37:29+00:00", + "source_file": "3-terrarium/solution/images/plant5.png", + "language_code": "km" + }, + "plant6.ca4ff8372e6676b1.webp": { + "original_hash": "6932fdb455fcae5b324b129367d2f56a", + "translation_date": "2026-04-06T21:37:09+00:00", + "source_file": "3-terrarium/solution/images/plant6.png", + "language_code": "km" + }, + "plant7.194d5a42fcf5a88c.webp": { + "original_hash": "b7a1e35f9946cb04440ce620c34f201d", + "translation_date": "2026-04-06T21:36:50+00:00", + "source_file": "3-terrarium/solution/images/plant7.png", + "language_code": "km" + }, + "plant8.7b247809ab0eb492.webp": { + "original_hash": "3eb38c747aaf33ce7aa70b58a31b62a8", + "translation_date": "2026-04-06T21:37:01+00:00", + "source_file": "3-terrarium/solution/images/plant8.png", + "language_code": "km" + }, + "plant9.8fe614c01ded1b1e.webp": { + "original_hash": "a9655c162938a27c63d48ac675061e2b", + "translation_date": "2026-04-06T21:36:54+00:00", + "source_file": "3-terrarium/solution/images/plant9.png", + "language_code": "km" + }, + "player.137ee0e47f895ffc.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/6-end-condition/solution/assets/player.png", + "language_code": "km" + }, + "player.2887422f6982c3cd.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/5-keeping-score/your-work/assets/player.png", + "language_code": "km" + }, + "player.391fed427ede24f5.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:18+00:00", + "source_file": "6-space-game/5-keeping-score/solution/assets/player.png", + "language_code": "km" + }, + "player.3c4f50182552a73a.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:24+00:00", + "source_file": "6-space-game/3-moving-elements-around/your-work/assets/player.png", + "language_code": "km" + }, + "player.47bc9de0714c723d.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:17+00:00", + "source_file": "6-space-game/2-drawing-to-canvas/your-work/assets/player.png", + "language_code": "km" + }, + "player.57b3107c03012695.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:21+00:00", + "source_file": "6-space-game/solution/spaceArt/png/player.png", + "language_code": "km" + }, + "player.606f85953e5e564e.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:17+00:00", + "source_file": "6-space-game/6-end-condition/your-work/assets/player.png", + "language_code": "km" + }, + "player.680ea4c619b54fe1.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/4-collision-detection/your-work/assets/player.png", + "language_code": "km" + }, + "player.bfe14f110bddf56d.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:24+00:00", + "source_file": "6-space-game/3-moving-elements-around/solution/assets/player.png", + "language_code": "km" + }, + "player.c99c25d54a615ca0.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/4-collision-detection/solution/assets/player.png", + "language_code": "km" + }, + "player.dd24c1afa8c71e9b.webp": { + "original_hash": "952e66c2dd458cfd6e82052f7123a97b", + "translation_date": "2026-04-06T21:35:17+00:00", + "source_file": "6-space-game/2-drawing-to-canvas/solution/assets/player.png", + "language_code": "km" + }, + "playerDamaged.181703f652fd5176.webp": { + "original_hash": "9d71aebe7303edd536064fb0f5e2ae82", + "translation_date": "2026-04-06T21:35:21+00:00", + "source_file": "6-space-game/solution/spaceArt/png/playerDamaged.png", + "language_code": "km" + }, + "playerLeft.0f928412e66ba5d9.webp": { + "original_hash": "40a42047b8ee49c6dd87c981e98d4d2e", + "translation_date": "2026-04-06T21:35:22+00:00", + "source_file": "6-space-game/solution/spaceArt/png/playerLeft.png", + "language_code": "km" + }, + "playerRight.e4825f489e29f737.webp": { + "original_hash": "1c7b03f73e1d6ed74955357680cb05cb", + "translation_date": "2026-04-06T21:35:22+00:00", + "source_file": "6-space-game/solution/spaceArt/png/playerRight.png", + "language_code": "km" + }, + "playground-choice.1d23ba7d407f4758.webp": { + "original_hash": "1c2e88cad7aad10922b4de1e87f1a47f", + "translation_date": "2026-04-06T21:37:52+00:00", + "source_file": "9-chat-project/assets/playground-choice.png", + "language_code": "km" + }, + "playground.d2b927122224ff8f.webp": { + "original_hash": "4152bb8cd5f23e73d58b3beb52919477", + "translation_date": "2026-04-06T21:37:50+00:00", + "source_file": "9-chat-project/assets/playground.png", + "language_code": "km" + }, + "preview.9215f0a010074476.webp": { + "original_hash": "6eaab6a69de1fa433e822578652c7287", + "translation_date": "2026-04-06T21:35:20+00:00", + "source_file": "6-space-game/solution/spaceArt/preview.jpg", + "language_code": "km" + }, + "profiler.5a4a62479c5df01c.webp": { + "original_hash": "40b8a4d9f47e2f3e18aa2e814a15356c", + "translation_date": "2026-04-06T21:35:46+00:00", + "source_file": "5-browser-extension/3-background-tasks-and-performance/images/profiler.png", + "language_code": "km" + }, + "project-on-vscode.dev.e79815a9a95ee7fe.webp": { + "original_hash": "35de4bc32ea66a11f919671558e07d52", + "translation_date": "2026-04-06T21:34:50+00:00", + "source_file": "8-code-editor/images/project-on-vscode.dev.png", + "language_code": "km" + }, + "result.96ef01f607bf856a.webp": { + "original_hash": "e83c44a0fcaa7720ce32eb71d53d5250", + "translation_date": "2026-04-06T21:36:23+00:00", + "source_file": "7-bank-project/2-forms/images/result.png", + "language_code": "km" + }, + "screen1.baccbba0f1f93364.webp": { + "original_hash": "92c8fa2dbe566c4e19c98a9e7de6faa6", + "translation_date": "2026-04-06T21:36:15+00:00", + "source_file": "7-bank-project/images/screen1.png", + "language_code": "km" + }, + "screen2.123c82a831a1d14a.webp": { + "original_hash": "43b7f2857d5f758394e443df8fbc31cf", + "translation_date": "2026-04-06T21:36:18+00:00", + "source_file": "7-bank-project/images/screen2.png", + "language_code": "km" + }, + "screenshot.0a1ee0d123df681b.webp": { + "original_hash": "f909b463a14ff6542a816470f68bfac3", + "translation_date": "2026-04-06T21:38:03+00:00", + "source_file": "9-chat-project/assets/screenshot.png", + "language_code": "km" + }, + "screenshot.e7a5ad659e364568.webp": { + "original_hash": "c562c1fdc9d73658456e02b873e4dff9", + "translation_date": "2026-04-06T21:32:00+00:00", + "source_file": "images/screenshot.png", + "language_code": "km" + }, + "screenshot_gray.0c796099a1f9f25e.webp": { + "original_hash": "324b7bff7867c38e100d0acad18ed53d", + "translation_date": "2026-04-06T21:36:40+00:00", + "source_file": "3-terrarium/images/screenshot_gray.png", + "language_code": "km" + }, + "shield.1b9412b7ca6610ab.webp": { + "original_hash": "a672dc1a5f905918272bb58f1e236340", + "translation_date": "2026-04-06T21:35:21+00:00", + "source_file": "6-space-game/solution/spaceArt/png/shield.png", + "language_code": "km" + }, + "snapshot.97750180ebcad737.webp": { + "original_hash": "9db2fa7afcc1d258ec1a130cef145f94", + "translation_date": "2026-04-06T21:35:31+00:00", + "source_file": "5-browser-extension/3-background-tasks-and-performance/images/snapshot.png", + "language_code": "km" + }, + "spa.268ec73b41f992c2.webp": { + "original_hash": "3d3d7273070c2ddab04458fbb084ad4a", + "translation_date": "2026-04-06T21:36:33+00:00", + "source_file": "7-bank-project/3-data/images/spa.png", + "language_code": "km" + }, + "speedLine.5bcabb93f48b5ae1.webp": { + "original_hash": "ef791dbe8ea2e21cf697831e203803d5", + "translation_date": "2026-04-06T21:35:23+00:00", + "source_file": "6-space-game/solution/spaceArt/png/Background/speedLine.png", + "language_code": "km" + }, + "spritesheet.bec82852290b14ee.webp": { + "original_hash": "d593b0f366e9efd2f2b3ef18e7eb2d0c", + "translation_date": "2026-04-06T21:35:16+00:00", + "source_file": "6-space-game/solution/spritesheet.png", + "language_code": "km" + }, + "starBackground.a897b8acb1b0587d.webp": { + "original_hash": "cca00ba0b9e73859ab5bb928d5ca2fa2", + "translation_date": "2026-04-06T21:35:23+00:00", + "source_file": "6-space-game/solution/spaceArt/png/Background/starBackground.png", + "language_code": "km" + }, + "starBig.72e9c6d0d18f363d.webp": { + "original_hash": "4e8f1abc8b48d75990117ea8b6207842", + "translation_date": "2026-04-06T21:35:22+00:00", + "source_file": "6-space-game/solution/spaceArt/png/Background/starBig.png", + "language_code": "km" + }, + "starSmall.ed78b961dbcd0898.webp": { + "original_hash": "609bf88a971475818f95816b8cf71508", + "translation_date": "2026-04-06T21:35:23+00:00", + "source_file": "6-space-game/solution/spaceArt/png/Background/starSmall.png", + "language_code": "km" + }, + "template.67ad477109d29a2b.webp": { + "original_hash": "a184e4c012fd4fca9ab3c552df87bd0c", + "translation_date": "2026-04-06T21:37:53+00:00", + "source_file": "9-chat-project/assets/template.png", + "language_code": "km" + }, + "terrarium-final.0920f16e87c13a84.webp": { + "original_hash": "324b7bff7867c38e100d0acad18ed53d", + "translation_date": "2026-04-06T21:36:46+00:00", + "source_file": "3-terrarium/3-intro-to-DOM-and-closures/images/terrarium-final.png", + "language_code": "km" + }, + "terrarium-final.2f07047ffc597d0a.webp": { + "original_hash": "c669f9222e16690bb2015ce86bb4739c", + "translation_date": "2026-04-06T21:37:35+00:00", + "source_file": "3-terrarium/2-intro-to-css/images/terrarium-final.png", + "language_code": "km" + }, + "validation-error.8bd23e98d416c22f.webp": { + "original_hash": "d614ce6b24e2583901da9038297fe327", + "translation_date": "2026-04-06T21:36:21+00:00", + "source_file": "7-bank-project/2-forms/images/validation-error.png", + "language_code": "km" + }, + "vs-code-index.e2986cf919471eb9.webp": { + "original_hash": "ed8437cb2629b95551fff5e5d72ef4f5", + "translation_date": "2026-04-06T21:36:41+00:00", + "source_file": "3-terrarium/1-intro-to-html/images/vs-code-index.png", + "language_code": "km" + }, + "webdev101-a11y.8ef3025c858d897a.webp": { + "original_hash": "3f5220c5d502a906028b8a85245cc6da", + "translation_date": "2026-04-06T21:33:18+00:00", + "source_file": "sketchnotes/webdev101-a11y.png", + "language_code": "km" + }, + "webdev101-css.3f7af5991bf53a20.webp": { + "original_hash": "9de1dc14864697c82395b02f31a72aec", + "translation_date": "2026-04-06T21:32:51+00:00", + "source_file": "sketchnotes/webdev101-css.png", + "language_code": "km" + }, + "webdev101-github.8846d7971abef6f9.webp": { + "original_hash": "412ec8fc404fead25f314e2fdb564548", + "translation_date": "2026-04-06T21:32:41+00:00", + "source_file": "sketchnotes/webdev101-github.png", + "language_code": "km" + }, + "webdev101-html.4389c2067af68e98.webp": { + "original_hash": "23bf24ecb0e72f0c6c835824dec5ee54", + "translation_date": "2026-04-06T21:32:20+00:00", + "source_file": "sketchnotes/webdev101-html.png", + "language_code": "km" + }, + "webdev101-js-arrays.439d7528b8a29455.webp": { + "original_hash": "564c9e2d7f8e5a3b7e23570df300c732", + "translation_date": "2026-04-06T21:33:45+00:00", + "source_file": "sketchnotes/webdev101-js-arrays.png", + "language_code": "km" + }, + "webdev101-js-datatypes.4cc470179730702c.webp": { + "original_hash": "20fda1612cc0e8d20e6be01ffc28e5f7", + "translation_date": "2026-04-06T21:33:28+00:00", + "source_file": "sketchnotes/webdev101-js-datatypes.png", + "language_code": "km" + }, + "webdev101-js-decisions.69e1b20f272dd1f0.webp": { + "original_hash": "5e49a0b9b4149f782a4378354ba7fd56", + "translation_date": "2026-04-06T21:33:08+00:00", + "source_file": "sketchnotes/webdev101-js-decisions.png", + "language_code": "km" + }, + "webdev101-js-functions.be049c4726e94f8b.webp": { + "original_hash": "ec4279b1b2191fa07a83e78a97e81f29", + "translation_date": "2026-04-06T21:33:00+00:00", + "source_file": "sketchnotes/webdev101-js-functions.png", + "language_code": "km" + }, + "webdev101-js.10280393044d7eaa.webp": { + "original_hash": "fe1f154de74b31fdeb9a6df40e7ad5e1", + "translation_date": "2026-04-06T21:33:38+00:00", + "source_file": "sketchnotes/webdev101-js.png", + "language_code": "km" + }, + "webdev101-programming.d6e3f98e61ac4bff.webp": { + "original_hash": "adf4dac4d350592773dbdba8ebaaa262", + "translation_date": "2026-04-06T21:32:31+00:00", + "source_file": "sketchnotes/webdev101-programming.png", + "language_code": "km" + }, + "working-tree-pb.6cd43e5076f23ba3.webp": { + "original_hash": "f6b14887694745dd143a09bd60b74185", + "translation_date": "2026-04-06T21:35:07+00:00", + "source_file": "8-code-editor/images/working-tree-pb.png", + "language_code": "km" + }, + "working-tree.c58eec08e6335c79.webp": { + "original_hash": "bf2608b4302123a00a8e7b1b6a430b4a", + "translation_date": "2026-04-06T21:34:59+00:00", + "source_file": "8-code-editor/images/working-tree.png", + "language_code": "km" + } +} \ No newline at end of file diff --git a/translated_images/km/1.b6da8c1394b07491.webp b/translated_images/km/1.b6da8c1394b07491.webp new file mode 100644 index 000000000..1e2a4faee Binary files /dev/null and b/translated_images/km/1.b6da8c1394b07491.webp differ diff --git a/translated_images/km/1.cc07a5cbe114ad1d.webp b/translated_images/km/1.cc07a5cbe114ad1d.webp new file mode 100644 index 000000000..6fd9f4741 Binary files /dev/null and b/translated_images/km/1.cc07a5cbe114ad1d.webp differ diff --git a/translated_images/km/2.1dae52ff08042246.webp b/translated_images/km/2.1dae52ff08042246.webp new file mode 100644 index 000000000..aaa45a2f4 Binary files /dev/null and b/translated_images/km/2.1dae52ff08042246.webp differ diff --git a/translated_images/km/after-codeswing-extension-pb.0ebddddcf73b5509.webp b/translated_images/km/after-codeswing-extension-pb.0ebddddcf73b5509.webp new file mode 100644 index 000000000..0f79be567 Binary files /dev/null and b/translated_images/km/after-codeswing-extension-pb.0ebddddcf73b5509.webp differ diff --git a/translated_images/km/background.148a8d43afde5730.webp b/translated_images/km/background.148a8d43afde5730.webp new file mode 100644 index 000000000..6d79a1aa2 Binary files /dev/null and b/translated_images/km/background.148a8d43afde5730.webp differ diff --git a/translated_images/km/backgroundColor.e19c3c60768150c8.webp b/translated_images/km/backgroundColor.e19c3c60768150c8.webp new file mode 100644 index 000000000..415592530 Binary files /dev/null and b/translated_images/km/backgroundColor.e19c3c60768150c8.webp differ diff --git a/translated_images/km/browser-console.efaf0b51aaaf6778.webp b/translated_images/km/browser-console.efaf0b51aaaf6778.webp new file mode 100644 index 000000000..c10bb7540 Binary files /dev/null and b/translated_images/km/browser-console.efaf0b51aaaf6778.webp differ diff --git a/translated_images/km/browser.60317c9be8b7f84a.webp b/translated_images/km/browser.60317c9be8b7f84a.webp new file mode 100644 index 000000000..cc04f68c9 Binary files /dev/null and b/translated_images/km/browser.60317c9be8b7f84a.webp differ diff --git a/translated_images/km/canvas.fbd605ff8e5b8aff.webp b/translated_images/km/canvas.fbd605ff8e5b8aff.webp new file mode 100644 index 000000000..1b5d25e5a Binary files /dev/null and b/translated_images/km/canvas.fbd605ff8e5b8aff.webp differ diff --git a/translated_images/km/canvas_grid.5f209da785ded492.webp b/translated_images/km/canvas_grid.5f209da785ded492.webp new file mode 100644 index 000000000..49c5579eb Binary files /dev/null and b/translated_images/km/canvas_grid.5f209da785ded492.webp differ diff --git a/translated_images/km/character.5c0dd8e067ffd693.webp b/translated_images/km/character.5c0dd8e067ffd693.webp new file mode 100644 index 000000000..6736fb70b Binary files /dev/null and b/translated_images/km/character.5c0dd8e067ffd693.webp differ diff --git a/translated_images/km/click-register.e89a30bf0d4bc9ca.webp b/translated_images/km/click-register.e89a30bf0d4bc9ca.webp new file mode 100644 index 000000000..f054292ed Binary files /dev/null and b/translated_images/km/click-register.e89a30bf0d4bc9ca.webp differ diff --git a/translated_images/km/clone_repo.5085c48d666ead57.webp b/translated_images/km/clone_repo.5085c48d666ead57.webp new file mode 100644 index 000000000..03ec13354 Binary files /dev/null and b/translated_images/km/clone_repo.5085c48d666ead57.webp differ diff --git a/translated_images/km/clone_repo.6a202fb230ab6bdd.webp b/translated_images/km/clone_repo.6a202fb230ab6bdd.webp new file mode 100644 index 000000000..1545ac731 Binary files /dev/null and b/translated_images/km/clone_repo.6a202fb230ab6bdd.webp differ diff --git a/translated_images/km/codespace.bcecbdf5d2747d3d.webp b/translated_images/km/codespace.bcecbdf5d2747d3d.webp new file mode 100644 index 000000000..097b7cf65 Binary files /dev/null and b/translated_images/km/codespace.bcecbdf5d2747d3d.webp differ diff --git a/translated_images/km/create-a-fork.297ab42b4bd0af99.webp b/translated_images/km/create-a-fork.297ab42b4bd0af99.webp new file mode 100644 index 000000000..2f7982b58 Binary files /dev/null and b/translated_images/km/create-a-fork.297ab42b4bd0af99.webp differ diff --git a/translated_images/km/create-new-file-pb.0797800d977ec3eb.webp b/translated_images/km/create-new-file-pb.0797800d977ec3eb.webp new file mode 100644 index 000000000..90c582ef2 Binary files /dev/null and b/translated_images/km/create-new-file-pb.0797800d977ec3eb.webp differ diff --git a/translated_images/km/create-new-file.2814e609c2af9aeb.webp b/translated_images/km/create-new-file.2814e609c2af9aeb.webp new file mode 100644 index 000000000..6f5b15b9b Binary files /dev/null and b/translated_images/km/create-new-file.2814e609c2af9aeb.webp differ diff --git a/translated_images/km/createcodespace.0238bbf4d7a8d955.webp b/translated_images/km/createcodespace.0238bbf4d7a8d955.webp new file mode 100644 index 000000000..add279b50 Binary files /dev/null and b/translated_images/km/createcodespace.0238bbf4d7a8d955.webp differ diff --git a/translated_images/km/data-flow.fa2354e0908fecc8.webp b/translated_images/km/data-flow.fa2354e0908fecc8.webp new file mode 100644 index 000000000..58cc069ce Binary files /dev/null and b/translated_images/km/data-flow.fa2354e0908fecc8.webp differ diff --git a/translated_images/km/default-vscode-dev.5d06881d65c1b323.webp b/translated_images/km/default-vscode-dev.5d06881d65c1b323.webp new file mode 100644 index 000000000..a20718b48 Binary files /dev/null and b/translated_images/km/default-vscode-dev.5d06881d65c1b323.webp differ diff --git a/translated_images/km/dialog.93bba104afeb79f1.webp b/translated_images/km/dialog.93bba104afeb79f1.webp new file mode 100644 index 000000000..e679b866d Binary files /dev/null and b/translated_images/km/dialog.93bba104afeb79f1.webp differ diff --git a/translated_images/km/dom-tree.7daf0e763cbbba92.webp b/translated_images/km/dom-tree.7daf0e763cbbba92.webp new file mode 100644 index 000000000..2866b049c Binary files /dev/null and b/translated_images/km/dom-tree.7daf0e763cbbba92.webp differ diff --git a/translated_images/km/earlybrowsers.d984b711cdf3a42d.webp b/translated_images/km/earlybrowsers.d984b711cdf3a42d.webp new file mode 100644 index 000000000..34c2f1cc9 Binary files /dev/null and b/translated_images/km/earlybrowsers.d984b711cdf3a42d.webp differ diff --git a/translated_images/km/edit-a-file-pb.263555922c14fc52.webp b/translated_images/km/edit-a-file-pb.263555922c14fc52.webp new file mode 100644 index 000000000..74baf7453 Binary files /dev/null and b/translated_images/km/edit-a-file-pb.263555922c14fc52.webp differ diff --git a/translated_images/km/edit-a-file.52c0ee665ef19f08.webp b/translated_images/km/edit-a-file.52c0ee665ef19f08.webp new file mode 100644 index 000000000..56fc3fce5 Binary files /dev/null and b/translated_images/km/edit-a-file.52c0ee665ef19f08.webp differ diff --git a/translated_images/km/enemyShip.035a46787bff658c.webp b/translated_images/km/enemyShip.035a46787bff658c.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.035a46787bff658c.webp differ diff --git a/translated_images/km/enemyShip.1a1354d7988de290.webp b/translated_images/km/enemyShip.1a1354d7988de290.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.1a1354d7988de290.webp differ diff --git a/translated_images/km/enemyShip.22cbee6ea27a5809.webp b/translated_images/km/enemyShip.22cbee6ea27a5809.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.22cbee6ea27a5809.webp differ diff --git a/translated_images/km/enemyShip.321ecb1b4eb21f2c.webp b/translated_images/km/enemyShip.321ecb1b4eb21f2c.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.321ecb1b4eb21f2c.webp differ diff --git a/translated_images/km/enemyShip.4fbf2889e6129db4.webp b/translated_images/km/enemyShip.4fbf2889e6129db4.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.4fbf2889e6129db4.webp differ diff --git a/translated_images/km/enemyShip.5df2a822c16650c2.webp b/translated_images/km/enemyShip.5df2a822c16650c2.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.5df2a822c16650c2.webp differ diff --git a/translated_images/km/enemyShip.62983ed4bfb2220f.webp b/translated_images/km/enemyShip.62983ed4bfb2220f.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.62983ed4bfb2220f.webp differ diff --git a/translated_images/km/enemyShip.add7036e1c3c3014.webp b/translated_images/km/enemyShip.add7036e1c3c3014.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.add7036e1c3c3014.webp differ diff --git a/translated_images/km/enemyShip.b39a140287683bf7.webp b/translated_images/km/enemyShip.b39a140287683bf7.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.b39a140287683bf7.webp differ diff --git a/translated_images/km/enemyShip.b9626ed228a17a32.webp b/translated_images/km/enemyShip.b9626ed228a17a32.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.b9626ed228a17a32.webp differ diff --git a/translated_images/km/enemyShip.deb0477a7312f54d.webp b/translated_images/km/enemyShip.deb0477a7312f54d.webp new file mode 100644 index 000000000..a668c6e24 Binary files /dev/null and b/translated_images/km/enemyShip.deb0477a7312f54d.webp differ diff --git a/translated_images/km/enemyUFO.bf8585e4e8dcdb68.webp b/translated_images/km/enemyUFO.bf8585e4e8dcdb68.webp new file mode 100644 index 000000000..4f52507d2 Binary files /dev/null and b/translated_images/km/enemyUFO.bf8585e4e8dcdb68.webp differ diff --git a/translated_images/km/extension-details.9f8f1fd4e9eb2de5.webp b/translated_images/km/extension-details.9f8f1fd4e9eb2de5.webp new file mode 100644 index 000000000..53388a425 Binary files /dev/null and b/translated_images/km/extension-details.9f8f1fd4e9eb2de5.webp differ diff --git a/translated_images/km/extension-screenshot.0e7f5bfa110e92e3.webp b/translated_images/km/extension-screenshot.0e7f5bfa110e92e3.webp new file mode 100644 index 000000000..9350de8bc Binary files /dev/null and b/translated_images/km/extension-screenshot.0e7f5bfa110e92e3.webp differ diff --git a/translated_images/km/extension-settings.21c752ae4f4cdb78.webp b/translated_images/km/extension-settings.21c752ae4f4cdb78.webp new file mode 100644 index 000000000..7859462fc Binary files /dev/null and b/translated_images/km/extension-settings.21c752ae4f4cdb78.webp differ diff --git a/translated_images/km/extensions.eca0e0c7f59a10b5.webp b/translated_images/km/extensions.eca0e0c7f59a10b5.webp new file mode 100644 index 000000000..749044b7b Binary files /dev/null and b/translated_images/km/extensions.eca0e0c7f59a10b5.webp differ diff --git a/translated_images/km/favicon.37b561214b36d454.webp b/translated_images/km/favicon.37b561214b36d454.webp new file mode 100644 index 000000000..48a53960d Binary files /dev/null and b/translated_images/km/favicon.37b561214b36d454.webp differ diff --git a/translated_images/km/form-post.61de4ca1b964d91a.webp b/translated_images/km/form-post.61de4ca1b964d91a.webp new file mode 100644 index 000000000..7054cc176 Binary files /dev/null and b/translated_images/km/form-post.61de4ca1b964d91a.webp differ diff --git a/translated_images/km/history.7fdabbafa521e064.webp b/translated_images/km/history.7fdabbafa521e064.webp new file mode 100644 index 000000000..4ba4c4c4b Binary files /dev/null and b/translated_images/km/history.7fdabbafa521e064.webp differ diff --git a/translated_images/km/install-on-edge.78634f02842c4828.webp b/translated_images/km/install-on-edge.78634f02842c4828.webp new file mode 100644 index 000000000..62bd579fd Binary files /dev/null and b/translated_images/km/install-on-edge.78634f02842c4828.webp differ diff --git a/translated_images/km/install-on-edge.d68781acaf0b3d3d.webp b/translated_images/km/install-on-edge.d68781acaf0b3d3d.webp new file mode 100644 index 000000000..4780daf9c Binary files /dev/null and b/translated_images/km/install-on-edge.d68781acaf0b3d3d.webp differ diff --git a/translated_images/km/laserGreen.89904f0f49945560.webp b/translated_images/km/laserGreen.89904f0f49945560.webp new file mode 100644 index 000000000..bfe37aafc Binary files /dev/null and b/translated_images/km/laserGreen.89904f0f49945560.webp differ diff --git a/translated_images/km/laserGreenShot.e4fbfc4714c08a5b.webp b/translated_images/km/laserGreenShot.e4fbfc4714c08a5b.webp new file mode 100644 index 000000000..dd3e87139 Binary files /dev/null and b/translated_images/km/laserGreenShot.e4fbfc4714c08a5b.webp differ diff --git a/translated_images/km/laserRed.2040e11f55c0a40a.webp b/translated_images/km/laserRed.2040e11f55c0a40a.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.2040e11f55c0a40a.webp differ diff --git a/translated_images/km/laserRed.381bc5555491ce67.webp b/translated_images/km/laserRed.381bc5555491ce67.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.381bc5555491ce67.webp differ diff --git a/translated_images/km/laserRed.69730edd76f0b3bd.webp b/translated_images/km/laserRed.69730edd76f0b3bd.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.69730edd76f0b3bd.webp differ diff --git a/translated_images/km/laserRed.b583dc1728eb8581.webp b/translated_images/km/laserRed.b583dc1728eb8581.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.b583dc1728eb8581.webp differ diff --git a/translated_images/km/laserRed.cae9ab24ea9b18fd.webp b/translated_images/km/laserRed.cae9ab24ea9b18fd.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.cae9ab24ea9b18fd.webp differ diff --git a/translated_images/km/laserRed.d81ce4986f87c251.webp b/translated_images/km/laserRed.d81ce4986f87c251.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.d81ce4986f87c251.webp differ diff --git a/translated_images/km/laserRed.e58ef8db2585dfbe.webp b/translated_images/km/laserRed.e58ef8db2585dfbe.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.e58ef8db2585dfbe.webp differ diff --git a/translated_images/km/laserRed.e66e29ace6666064.webp b/translated_images/km/laserRed.e66e29ace6666064.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.e66e29ace6666064.webp differ diff --git a/translated_images/km/laserRed.e86e8fb629c6026e.webp b/translated_images/km/laserRed.e86e8fb629c6026e.webp new file mode 100644 index 000000000..27c042acb Binary files /dev/null and b/translated_images/km/laserRed.e86e8fb629c6026e.webp differ diff --git a/translated_images/km/laserRedShot.c39d066745996a71.webp b/translated_images/km/laserRedShot.c39d066745996a71.webp new file mode 100644 index 000000000..99fcece7a Binary files /dev/null and b/translated_images/km/laserRedShot.c39d066745996a71.webp differ diff --git a/translated_images/km/life.27144b6d4bfdea76.webp b/translated_images/km/life.27144b6d4bfdea76.webp new file mode 100644 index 000000000..442ec0a5b Binary files /dev/null and b/translated_images/km/life.27144b6d4bfdea76.webp differ diff --git a/translated_images/km/life.2a159298dd98f4ef.webp b/translated_images/km/life.2a159298dd98f4ef.webp new file mode 100644 index 000000000..442ec0a5b Binary files /dev/null and b/translated_images/km/life.2a159298dd98f4ef.webp differ diff --git a/translated_images/km/life.466df3b1692a244a.webp b/translated_images/km/life.466df3b1692a244a.webp new file mode 100644 index 000000000..442ec0a5b Binary files /dev/null and b/translated_images/km/life.466df3b1692a244a.webp differ diff --git a/translated_images/km/life.65a2aaceca875284.webp b/translated_images/km/life.65a2aaceca875284.webp new file mode 100644 index 000000000..442ec0a5b Binary files /dev/null and b/translated_images/km/life.65a2aaceca875284.webp differ diff --git a/translated_images/km/life.6fb9f50d53ee0413.webp b/translated_images/km/life.6fb9f50d53ee0413.webp new file mode 100644 index 000000000..442ec0a5b Binary files /dev/null and b/translated_images/km/life.6fb9f50d53ee0413.webp differ diff --git a/translated_images/km/life.78b6e96a3003767e.webp b/translated_images/km/life.78b6e96a3003767e.webp new file mode 100644 index 000000000..442ec0a5b Binary files /dev/null and b/translated_images/km/life.78b6e96a3003767e.webp differ diff --git a/translated_images/km/life.86d843ce9c23289c.webp b/translated_images/km/life.86d843ce9c23289c.webp new file mode 100644 index 000000000..442ec0a5b Binary files /dev/null and b/translated_images/km/life.86d843ce9c23289c.webp differ diff --git a/translated_images/km/localstorage.472f8147b6a3f8d1.webp b/translated_images/km/localstorage.472f8147b6a3f8d1.webp new file mode 100644 index 000000000..5c30e7550 Binary files /dev/null and b/translated_images/km/localstorage.472f8147b6a3f8d1.webp differ diff --git a/translated_images/km/log.804026979f3707e0.webp b/translated_images/km/log.804026979f3707e0.webp new file mode 100644 index 000000000..827b32612 Binary files /dev/null and b/translated_images/km/log.804026979f3707e0.webp differ diff --git a/translated_images/km/login-error.416fe019b36a6327.webp b/translated_images/km/login-error.416fe019b36a6327.webp new file mode 100644 index 000000000..fa1d1baed Binary files /dev/null and b/translated_images/km/login-error.416fe019b36a6327.webp differ diff --git a/translated_images/km/meteorBig.1e452b3ad7af50ad.webp b/translated_images/km/meteorBig.1e452b3ad7af50ad.webp new file mode 100644 index 000000000..39fba1031 Binary files /dev/null and b/translated_images/km/meteorBig.1e452b3ad7af50ad.webp differ diff --git a/translated_images/km/meteorSmall.0d729bc71c12d41f.webp b/translated_images/km/meteorSmall.0d729bc71c12d41f.webp new file mode 100644 index 000000000..631797205 Binary files /dev/null and b/translated_images/km/meteorSmall.0d729bc71c12d41f.webp differ diff --git a/translated_images/km/moodle.94eb93d714a50cb2.webp b/translated_images/km/moodle.94eb93d714a50cb2.webp new file mode 100644 index 000000000..902b9962d Binary files /dev/null and b/translated_images/km/moodle.94eb93d714a50cb2.webp differ diff --git a/translated_images/km/mpa.7f7375a1a2d4aa77.webp b/translated_images/km/mpa.7f7375a1a2d4aa77.webp new file mode 100644 index 000000000..0d5b3d008 Binary files /dev/null and b/translated_images/km/mpa.7f7375a1a2d4aa77.webp differ diff --git a/translated_images/km/nebula.55c2933d36d035d3.webp b/translated_images/km/nebula.55c2933d36d035d3.webp new file mode 100644 index 000000000..a294cbf33 Binary files /dev/null and b/translated_images/km/nebula.55c2933d36d035d3.webp differ diff --git a/translated_images/km/new-file-github.com.c886796d800e8056.webp b/translated_images/km/new-file-github.com.c886796d800e8056.webp new file mode 100644 index 000000000..e43c9a04f Binary files /dev/null and b/translated_images/km/new-file-github.com.c886796d800e8056.webp differ diff --git a/translated_images/km/open-palette-menu.46dda01084738da8.webp b/translated_images/km/open-palette-menu.46dda01084738da8.webp new file mode 100644 index 000000000..f5a820297 Binary files /dev/null and b/translated_images/km/open-palette-menu.46dda01084738da8.webp differ diff --git a/translated_images/km/open-remote-repository.bd9c2598b8949e7f.webp b/translated_images/km/open-remote-repository.bd9c2598b8949e7f.webp new file mode 100644 index 000000000..e0832eaeb Binary files /dev/null and b/translated_images/km/open-remote-repository.bd9c2598b8949e7f.webp differ diff --git a/translated_images/km/palette-menu.4946174e07f42622.webp b/translated_images/km/palette-menu.4946174e07f42622.webp new file mode 100644 index 000000000..7faaa6204 Binary files /dev/null and b/translated_images/km/palette-menu.4946174e07f42622.webp differ diff --git a/translated_images/km/partI-solution.36c53b48c9ffae2a.webp b/translated_images/km/partI-solution.36c53b48c9ffae2a.webp new file mode 100644 index 000000000..e7df45a1e Binary files /dev/null and b/translated_images/km/partI-solution.36c53b48c9ffae2a.webp differ diff --git a/translated_images/km/plant1.a876180d8659acb9.webp b/translated_images/km/plant1.a876180d8659acb9.webp new file mode 100644 index 000000000..0afdb8492 Binary files /dev/null and b/translated_images/km/plant1.a876180d8659acb9.webp differ diff --git a/translated_images/km/plant10.2f2c47804ae52dd3.webp b/translated_images/km/plant10.2f2c47804ae52dd3.webp new file mode 100644 index 000000000..a972d3197 Binary files /dev/null and b/translated_images/km/plant10.2f2c47804ae52dd3.webp differ diff --git a/translated_images/km/plant11.0ce0081b0ef17aa1.webp b/translated_images/km/plant11.0ce0081b0ef17aa1.webp new file mode 100644 index 000000000..83718f403 Binary files /dev/null and b/translated_images/km/plant11.0ce0081b0ef17aa1.webp differ diff --git a/translated_images/km/plant12.6b934c4312a00228.webp b/translated_images/km/plant12.6b934c4312a00228.webp new file mode 100644 index 000000000..abfcadc6c Binary files /dev/null and b/translated_images/km/plant12.6b934c4312a00228.webp differ diff --git a/translated_images/km/plant13.37d6ab2e2481421f.webp b/translated_images/km/plant13.37d6ab2e2481421f.webp new file mode 100644 index 000000000..77816483d Binary files /dev/null and b/translated_images/km/plant13.37d6ab2e2481421f.webp differ diff --git a/translated_images/km/plant14.908791477a46eb7f.webp b/translated_images/km/plant14.908791477a46eb7f.webp new file mode 100644 index 000000000..9b2eea637 Binary files /dev/null and b/translated_images/km/plant14.908791477a46eb7f.webp differ diff --git a/translated_images/km/plant2.9e45efea224115b0.webp b/translated_images/km/plant2.9e45efea224115b0.webp new file mode 100644 index 000000000..e6b517d90 Binary files /dev/null and b/translated_images/km/plant2.9e45efea224115b0.webp differ diff --git a/translated_images/km/plant3.06efdd0fa0c4b115.webp b/translated_images/km/plant3.06efdd0fa0c4b115.webp new file mode 100644 index 000000000..fa73f15cf Binary files /dev/null and b/translated_images/km/plant3.06efdd0fa0c4b115.webp differ diff --git a/translated_images/km/plant4.3b78072b427727c6.webp b/translated_images/km/plant4.3b78072b427727c6.webp new file mode 100644 index 000000000..be231012e Binary files /dev/null and b/translated_images/km/plant4.3b78072b427727c6.webp differ diff --git a/translated_images/km/plant5.8ec58b18ac336fa8.webp b/translated_images/km/plant5.8ec58b18ac336fa8.webp new file mode 100644 index 000000000..4e295e185 Binary files /dev/null and b/translated_images/km/plant5.8ec58b18ac336fa8.webp differ diff --git a/translated_images/km/plant6.ca4ff8372e6676b1.webp b/translated_images/km/plant6.ca4ff8372e6676b1.webp new file mode 100644 index 000000000..46a89a545 Binary files /dev/null and b/translated_images/km/plant6.ca4ff8372e6676b1.webp differ diff --git a/translated_images/km/plant7.194d5a42fcf5a88c.webp b/translated_images/km/plant7.194d5a42fcf5a88c.webp new file mode 100644 index 000000000..420dca0b9 Binary files /dev/null and b/translated_images/km/plant7.194d5a42fcf5a88c.webp differ diff --git a/translated_images/km/plant8.7b247809ab0eb492.webp b/translated_images/km/plant8.7b247809ab0eb492.webp new file mode 100644 index 000000000..9b4c15c2f Binary files /dev/null and b/translated_images/km/plant8.7b247809ab0eb492.webp differ diff --git a/translated_images/km/plant9.8fe614c01ded1b1e.webp b/translated_images/km/plant9.8fe614c01ded1b1e.webp new file mode 100644 index 000000000..893f89540 Binary files /dev/null and b/translated_images/km/plant9.8fe614c01ded1b1e.webp differ diff --git a/translated_images/km/player.137ee0e47f895ffc.webp b/translated_images/km/player.137ee0e47f895ffc.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.137ee0e47f895ffc.webp differ diff --git a/translated_images/km/player.2887422f6982c3cd.webp b/translated_images/km/player.2887422f6982c3cd.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.2887422f6982c3cd.webp differ diff --git a/translated_images/km/player.391fed427ede24f5.webp b/translated_images/km/player.391fed427ede24f5.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.391fed427ede24f5.webp differ diff --git a/translated_images/km/player.3c4f50182552a73a.webp b/translated_images/km/player.3c4f50182552a73a.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.3c4f50182552a73a.webp differ diff --git a/translated_images/km/player.47bc9de0714c723d.webp b/translated_images/km/player.47bc9de0714c723d.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.47bc9de0714c723d.webp differ diff --git a/translated_images/km/player.57b3107c03012695.webp b/translated_images/km/player.57b3107c03012695.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.57b3107c03012695.webp differ diff --git a/translated_images/km/player.606f85953e5e564e.webp b/translated_images/km/player.606f85953e5e564e.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.606f85953e5e564e.webp differ diff --git a/translated_images/km/player.680ea4c619b54fe1.webp b/translated_images/km/player.680ea4c619b54fe1.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.680ea4c619b54fe1.webp differ diff --git a/translated_images/km/player.bfe14f110bddf56d.webp b/translated_images/km/player.bfe14f110bddf56d.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.bfe14f110bddf56d.webp differ diff --git a/translated_images/km/player.c99c25d54a615ca0.webp b/translated_images/km/player.c99c25d54a615ca0.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.c99c25d54a615ca0.webp differ diff --git a/translated_images/km/player.dd24c1afa8c71e9b.webp b/translated_images/km/player.dd24c1afa8c71e9b.webp new file mode 100644 index 000000000..879c28a80 Binary files /dev/null and b/translated_images/km/player.dd24c1afa8c71e9b.webp differ diff --git a/translated_images/km/playerDamaged.181703f652fd5176.webp b/translated_images/km/playerDamaged.181703f652fd5176.webp new file mode 100644 index 000000000..00d3377d9 Binary files /dev/null and b/translated_images/km/playerDamaged.181703f652fd5176.webp differ diff --git a/translated_images/km/playerLeft.0f928412e66ba5d9.webp b/translated_images/km/playerLeft.0f928412e66ba5d9.webp new file mode 100644 index 000000000..0856babce Binary files /dev/null and b/translated_images/km/playerLeft.0f928412e66ba5d9.webp differ diff --git a/translated_images/km/playerRight.e4825f489e29f737.webp b/translated_images/km/playerRight.e4825f489e29f737.webp new file mode 100644 index 000000000..8d6696a22 Binary files /dev/null and b/translated_images/km/playerRight.e4825f489e29f737.webp differ diff --git a/translated_images/km/playground-choice.1d23ba7d407f4758.webp b/translated_images/km/playground-choice.1d23ba7d407f4758.webp new file mode 100644 index 000000000..5f0842ec3 Binary files /dev/null and b/translated_images/km/playground-choice.1d23ba7d407f4758.webp differ diff --git a/translated_images/km/playground.d2b927122224ff8f.webp b/translated_images/km/playground.d2b927122224ff8f.webp new file mode 100644 index 000000000..84771ead6 Binary files /dev/null and b/translated_images/km/playground.d2b927122224ff8f.webp differ diff --git a/translated_images/km/preview.9215f0a010074476.webp b/translated_images/km/preview.9215f0a010074476.webp new file mode 100644 index 000000000..a1f693216 Binary files /dev/null and b/translated_images/km/preview.9215f0a010074476.webp differ diff --git a/translated_images/km/profiler.5a4a62479c5df01c.webp b/translated_images/km/profiler.5a4a62479c5df01c.webp new file mode 100644 index 000000000..090a0d315 Binary files /dev/null and b/translated_images/km/profiler.5a4a62479c5df01c.webp differ diff --git a/translated_images/km/project-on-vscode.dev.e79815a9a95ee7fe.webp b/translated_images/km/project-on-vscode.dev.e79815a9a95ee7fe.webp new file mode 100644 index 000000000..a78b787ae Binary files /dev/null and b/translated_images/km/project-on-vscode.dev.e79815a9a95ee7fe.webp differ diff --git a/translated_images/km/result.96ef01f607bf856a.webp b/translated_images/km/result.96ef01f607bf856a.webp new file mode 100644 index 000000000..c6f5d8933 Binary files /dev/null and b/translated_images/km/result.96ef01f607bf856a.webp differ diff --git a/translated_images/km/screen1.baccbba0f1f93364.webp b/translated_images/km/screen1.baccbba0f1f93364.webp new file mode 100644 index 000000000..2774d826e Binary files /dev/null and b/translated_images/km/screen1.baccbba0f1f93364.webp differ diff --git a/translated_images/km/screen2.123c82a831a1d14a.webp b/translated_images/km/screen2.123c82a831a1d14a.webp new file mode 100644 index 000000000..50d66d599 Binary files /dev/null and b/translated_images/km/screen2.123c82a831a1d14a.webp differ diff --git a/translated_images/km/screenshot.0a1ee0d123df681b.webp b/translated_images/km/screenshot.0a1ee0d123df681b.webp new file mode 100644 index 000000000..bb3042527 Binary files /dev/null and b/translated_images/km/screenshot.0a1ee0d123df681b.webp differ diff --git a/translated_images/km/screenshot.e7a5ad659e364568.webp b/translated_images/km/screenshot.e7a5ad659e364568.webp new file mode 100644 index 000000000..dbb632998 Binary files /dev/null and b/translated_images/km/screenshot.e7a5ad659e364568.webp differ diff --git a/translated_images/km/screenshot_gray.0c796099a1f9f25e.webp b/translated_images/km/screenshot_gray.0c796099a1f9f25e.webp new file mode 100644 index 000000000..66daf4b81 Binary files /dev/null and b/translated_images/km/screenshot_gray.0c796099a1f9f25e.webp differ diff --git a/translated_images/km/shield.1b9412b7ca6610ab.webp b/translated_images/km/shield.1b9412b7ca6610ab.webp new file mode 100644 index 000000000..a2e065ca1 Binary files /dev/null and b/translated_images/km/shield.1b9412b7ca6610ab.webp differ diff --git a/translated_images/km/snapshot.97750180ebcad737.webp b/translated_images/km/snapshot.97750180ebcad737.webp new file mode 100644 index 000000000..6edae76a1 Binary files /dev/null and b/translated_images/km/snapshot.97750180ebcad737.webp differ diff --git a/translated_images/km/spa.268ec73b41f992c2.webp b/translated_images/km/spa.268ec73b41f992c2.webp new file mode 100644 index 000000000..bd0a3f02e Binary files /dev/null and b/translated_images/km/spa.268ec73b41f992c2.webp differ diff --git a/translated_images/km/speedLine.5bcabb93f48b5ae1.webp b/translated_images/km/speedLine.5bcabb93f48b5ae1.webp new file mode 100644 index 000000000..57b77b342 Binary files /dev/null and b/translated_images/km/speedLine.5bcabb93f48b5ae1.webp differ diff --git a/translated_images/km/spritesheet.bec82852290b14ee.webp b/translated_images/km/spritesheet.bec82852290b14ee.webp new file mode 100644 index 000000000..02853f8a0 Binary files /dev/null and b/translated_images/km/spritesheet.bec82852290b14ee.webp differ diff --git a/translated_images/km/starBackground.a897b8acb1b0587d.webp b/translated_images/km/starBackground.a897b8acb1b0587d.webp new file mode 100644 index 000000000..16f2c9669 Binary files /dev/null and b/translated_images/km/starBackground.a897b8acb1b0587d.webp differ diff --git a/translated_images/km/starBig.72e9c6d0d18f363d.webp b/translated_images/km/starBig.72e9c6d0d18f363d.webp new file mode 100644 index 000000000..917791333 Binary files /dev/null and b/translated_images/km/starBig.72e9c6d0d18f363d.webp differ diff --git a/translated_images/km/starSmall.ed78b961dbcd0898.webp b/translated_images/km/starSmall.ed78b961dbcd0898.webp new file mode 100644 index 000000000..bf86a6e91 Binary files /dev/null and b/translated_images/km/starSmall.ed78b961dbcd0898.webp differ diff --git a/translated_images/km/template.67ad477109d29a2b.webp b/translated_images/km/template.67ad477109d29a2b.webp new file mode 100644 index 000000000..1d9761d70 Binary files /dev/null and b/translated_images/km/template.67ad477109d29a2b.webp differ diff --git a/translated_images/km/terrarium-final.0920f16e87c13a84.webp b/translated_images/km/terrarium-final.0920f16e87c13a84.webp new file mode 100644 index 000000000..cbed2996b Binary files /dev/null and b/translated_images/km/terrarium-final.0920f16e87c13a84.webp differ diff --git a/translated_images/km/terrarium-final.2f07047ffc597d0a.webp b/translated_images/km/terrarium-final.2f07047ffc597d0a.webp new file mode 100644 index 000000000..fed1b6d02 Binary files /dev/null and b/translated_images/km/terrarium-final.2f07047ffc597d0a.webp differ diff --git a/translated_images/km/validation-error.8bd23e98d416c22f.webp b/translated_images/km/validation-error.8bd23e98d416c22f.webp new file mode 100644 index 000000000..d862773e7 Binary files /dev/null and b/translated_images/km/validation-error.8bd23e98d416c22f.webp differ diff --git a/translated_images/km/vs-code-index.e2986cf919471eb9.webp b/translated_images/km/vs-code-index.e2986cf919471eb9.webp new file mode 100644 index 000000000..48d99086c Binary files /dev/null and b/translated_images/km/vs-code-index.e2986cf919471eb9.webp differ diff --git a/translated_images/km/webdev101-a11y.8ef3025c858d897a.webp b/translated_images/km/webdev101-a11y.8ef3025c858d897a.webp new file mode 100644 index 000000000..1d8a8f364 Binary files /dev/null and b/translated_images/km/webdev101-a11y.8ef3025c858d897a.webp differ diff --git a/translated_images/km/webdev101-css.3f7af5991bf53a20.webp b/translated_images/km/webdev101-css.3f7af5991bf53a20.webp new file mode 100644 index 000000000..0afacc8ec Binary files /dev/null and b/translated_images/km/webdev101-css.3f7af5991bf53a20.webp differ diff --git a/translated_images/km/webdev101-github.8846d7971abef6f9.webp b/translated_images/km/webdev101-github.8846d7971abef6f9.webp new file mode 100644 index 000000000..0f3aab7bd Binary files /dev/null and b/translated_images/km/webdev101-github.8846d7971abef6f9.webp differ diff --git a/translated_images/km/webdev101-html.4389c2067af68e98.webp b/translated_images/km/webdev101-html.4389c2067af68e98.webp new file mode 100644 index 000000000..99f3ba308 Binary files /dev/null and b/translated_images/km/webdev101-html.4389c2067af68e98.webp differ diff --git a/translated_images/km/webdev101-js-arrays.439d7528b8a29455.webp b/translated_images/km/webdev101-js-arrays.439d7528b8a29455.webp new file mode 100644 index 000000000..bea74376d Binary files /dev/null and b/translated_images/km/webdev101-js-arrays.439d7528b8a29455.webp differ diff --git a/translated_images/km/webdev101-js-datatypes.4cc470179730702c.webp b/translated_images/km/webdev101-js-datatypes.4cc470179730702c.webp new file mode 100644 index 000000000..facc9f6c4 Binary files /dev/null and b/translated_images/km/webdev101-js-datatypes.4cc470179730702c.webp differ diff --git a/translated_images/km/webdev101-js-decisions.69e1b20f272dd1f0.webp b/translated_images/km/webdev101-js-decisions.69e1b20f272dd1f0.webp new file mode 100644 index 000000000..3d3c53ef3 Binary files /dev/null and b/translated_images/km/webdev101-js-decisions.69e1b20f272dd1f0.webp differ diff --git a/translated_images/km/webdev101-js-functions.be049c4726e94f8b.webp b/translated_images/km/webdev101-js-functions.be049c4726e94f8b.webp new file mode 100644 index 000000000..4332099bc Binary files /dev/null and b/translated_images/km/webdev101-js-functions.be049c4726e94f8b.webp differ diff --git a/translated_images/km/webdev101-js.10280393044d7eaa.webp b/translated_images/km/webdev101-js.10280393044d7eaa.webp new file mode 100644 index 000000000..22c20b351 Binary files /dev/null and b/translated_images/km/webdev101-js.10280393044d7eaa.webp differ diff --git a/translated_images/km/webdev101-programming.d6e3f98e61ac4bff.webp b/translated_images/km/webdev101-programming.d6e3f98e61ac4bff.webp new file mode 100644 index 000000000..70e9e001b Binary files /dev/null and b/translated_images/km/webdev101-programming.d6e3f98e61ac4bff.webp differ diff --git a/translated_images/km/working-tree-pb.6cd43e5076f23ba3.webp b/translated_images/km/working-tree-pb.6cd43e5076f23ba3.webp new file mode 100644 index 000000000..98c90f995 Binary files /dev/null and b/translated_images/km/working-tree-pb.6cd43e5076f23ba3.webp differ diff --git a/translated_images/km/working-tree.c58eec08e6335c79.webp b/translated_images/km/working-tree.c58eec08e6335c79.webp new file mode 100644 index 000000000..8ac1f5bdd Binary files /dev/null and b/translated_images/km/working-tree.c58eec08e6335c79.webp differ diff --git a/translations/km/.co-op-translator.json b/translations/km/.co-op-translator.json new file mode 100644 index 000000000..98039a0a7 --- /dev/null +++ b/translations/km/.co-op-translator.json @@ -0,0 +1,584 @@ +{ + "1-getting-started-lessons/1-intro-to-programming-languages/README.md": { + "original_hash": "d5eeb6e975b5864d8da52d4a41941f8d", + "translation_date": "2026-04-06T21:21:03+00:00", + "source_file": "1-getting-started-lessons/1-intro-to-programming-languages/README.md", + "language_code": "km" + }, + "1-getting-started-lessons/1-intro-to-programming-languages/assignment.md": { + "original_hash": "17b8ec8e85d99e27dcb3f73842e583be", + "translation_date": "2026-04-06T21:21:35+00:00", + "source_file": "1-getting-started-lessons/1-intro-to-programming-languages/assignment.md", + "language_code": "km" + }, + "1-getting-started-lessons/2-github-basics/README.md": { + "original_hash": "5c383cc2cc23bb164b06417d1c107a44", + "translation_date": "2026-04-06T21:30:37+00:00", + "source_file": "1-getting-started-lessons/2-github-basics/README.md", + "language_code": "km" + }, + "1-getting-started-lessons/3-accessibility/README.md": { + "original_hash": "7f2c48e04754724123ea100a822765e5", + "translation_date": "2026-04-06T21:13:59+00:00", + "source_file": "1-getting-started-lessons/3-accessibility/README.md", + "language_code": "km" + }, + "1-getting-started-lessons/3-accessibility/assignment.md": { + "original_hash": "e6d0f456dfc22afb41bbdefeb5ec179d", + "translation_date": "2026-04-06T21:15:21+00:00", + "source_file": "1-getting-started-lessons/3-accessibility/assignment.md", + "language_code": "km" + }, + "1-getting-started-lessons/README.md": { + "original_hash": "770d9f83dddc841c19f210dee5fe0712", + "translation_date": "2026-04-06T19:18:30+00:00", + "source_file": "1-getting-started-lessons/README.md", + "language_code": "km" + }, + "10-ai-framework-project/README.md": { + "original_hash": "3925b6a1c31c60755eaae4d578232c25", + "translation_date": "2026-04-06T19:14:53+00:00", + "source_file": "10-ai-framework-project/README.md", + "language_code": "km" + }, + "2-js-basics/1-data-types/README.md": { + "original_hash": "672b0bb6e8b431075f3bdb7130590d2d", + "translation_date": "2026-04-06T19:34:31+00:00", + "source_file": "2-js-basics/1-data-types/README.md", + "language_code": "km" + }, + "2-js-basics/1-data-types/assignment.md": { + "original_hash": "6fd645e97c48cd5eb5a3d290815ec8b5", + "translation_date": "2026-04-06T19:34:51+00:00", + "source_file": "2-js-basics/1-data-types/assignment.md", + "language_code": "km" + }, + "2-js-basics/2-functions-methods/README.md": { + "original_hash": "71f7d7dafa1c7194d79ddac87f669ff9", + "translation_date": "2026-04-06T19:30:41+00:00", + "source_file": "2-js-basics/2-functions-methods/README.md", + "language_code": "km" + }, + "2-js-basics/2-functions-methods/assignment.md": { + "original_hash": "8328f58f4593b4671656ff8f4b2edbd9", + "translation_date": "2026-04-06T19:31:12+00:00", + "source_file": "2-js-basics/2-functions-methods/assignment.md", + "language_code": "km" + }, + "2-js-basics/3-making-decisions/README.md": { + "original_hash": "c688385d15dd3645e924ea0ffee8967f", + "translation_date": "2026-04-06T19:37:59+00:00", + "source_file": "2-js-basics/3-making-decisions/README.md", + "language_code": "km" + }, + "2-js-basics/3-making-decisions/assignment.md": { + "original_hash": "ffe366b2d1f037b99fbadbe1dc81083d", + "translation_date": "2026-04-06T19:38:39+00:00", + "source_file": "2-js-basics/3-making-decisions/assignment.md", + "language_code": "km" + }, + "2-js-basics/4-arrays-loops/README.md": { + "original_hash": "1710a50a519a6e4a1b40a5638783018d", + "translation_date": "2026-04-06T19:41:44+00:00", + "source_file": "2-js-basics/4-arrays-loops/README.md", + "language_code": "km" + }, + "2-js-basics/4-arrays-loops/assignment.md": { + "original_hash": "8abcada0534e0fb3a7556ea3c5a2a8a4", + "translation_date": "2026-04-06T19:42:22+00:00", + "source_file": "2-js-basics/4-arrays-loops/assignment.md", + "language_code": "km" + }, + "2-js-basics/README.md": { + "original_hash": "cc9e70a2f096c67389c8acff1521fc27", + "translation_date": "2026-04-06T19:10:03+00:00", + "source_file": "2-js-basics/README.md", + "language_code": "km" + }, + "3-terrarium/1-intro-to-html/README.md": { + "original_hash": "3fcfa99c4897e051b558b5eaf1e8cc74", + "translation_date": "2026-04-06T20:58:46+00:00", + "source_file": "3-terrarium/1-intro-to-html/README.md", + "language_code": "km" + }, + "3-terrarium/1-intro-to-html/assignment.md": { + "original_hash": "650e63282e1dfa032890fcf5c1c4119d", + "translation_date": "2026-04-06T20:59:30+00:00", + "source_file": "3-terrarium/1-intro-to-html/assignment.md", + "language_code": "km" + }, + "3-terrarium/2-intro-to-css/README.md": { + "original_hash": "e39f3a4e3bcccf94639e3af1248f8a4d", + "translation_date": "2026-04-06T21:07:11+00:00", + "source_file": "3-terrarium/2-intro-to-css/README.md", + "language_code": "km" + }, + "3-terrarium/2-intro-to-css/assignment.md": { + "original_hash": "bee6762d4092a13fc7c338814963f980", + "translation_date": "2026-04-06T21:07:57+00:00", + "source_file": "3-terrarium/2-intro-to-css/assignment.md", + "language_code": "km" + }, + "3-terrarium/3-intro-to-DOM-and-closures/README.md": { + "original_hash": "973e48ad87d67bf5bb819746c9f8e302", + "translation_date": "2026-04-06T21:03:26+00:00", + "source_file": "3-terrarium/3-intro-to-DOM-and-closures/README.md", + "language_code": "km" + }, + "3-terrarium/3-intro-to-DOM-and-closures/assignment.md": { + "original_hash": "947ca5ce7c94aee9c7de7034e762bc17", + "translation_date": "2026-04-06T21:04:02+00:00", + "source_file": "3-terrarium/3-intro-to-DOM-and-closures/assignment.md", + "language_code": "km" + }, + "3-terrarium/README.md": { + "original_hash": "bc5c5550f79d10add90ce419ee34abb3", + "translation_date": "2026-04-06T19:17:58+00:00", + "source_file": "3-terrarium/README.md", + "language_code": "km" + }, + "3-terrarium/solution/README.md": { + "original_hash": "6329fbe8bd936068debd78cca6f09c0a", + "translation_date": "2026-04-06T21:04:13+00:00", + "source_file": "3-terrarium/solution/README.md", + "language_code": "km" + }, + "4-typing-game/README.md": { + "original_hash": "efa2ab875b8bb5a7883816506da6b6d2", + "translation_date": "2026-04-06T19:17:48+00:00", + "source_file": "4-typing-game/README.md", + "language_code": "km" + }, + "4-typing-game/solution/README.md": { + "original_hash": "068cbb9b3c10a96d503f6cdd6c9ace8c", + "translation_date": "2026-04-06T20:52:22+00:00", + "source_file": "4-typing-game/solution/README.md", + "language_code": "km" + }, + "4-typing-game/typing-game/README.md": { + "original_hash": "da8bc72041a2bb3826a54654ee1a8844", + "translation_date": "2026-04-06T20:55:33+00:00", + "source_file": "4-typing-game/typing-game/README.md", + "language_code": "km" + }, + "4-typing-game/typing-game/assignment.md": { + "original_hash": "3eac59d70e2532a677a2ce6bf765485a", + "translation_date": "2026-04-06T20:56:09+00:00", + "source_file": "4-typing-game/typing-game/assignment.md", + "language_code": "km" + }, + "5-browser-extension/1-about-browsers/README.md": { + "original_hash": "00aa85715e1efd4930c17a23e3012e69", + "translation_date": "2026-04-06T20:28:51+00:00", + "source_file": "5-browser-extension/1-about-browsers/README.md", + "language_code": "km" + }, + "5-browser-extension/1-about-browsers/assignment.md": { + "original_hash": "b6897c02603d0045dd6d8256e8714baa", + "translation_date": "2026-04-06T20:29:50+00:00", + "source_file": "5-browser-extension/1-about-browsers/assignment.md", + "language_code": "km" + }, + "5-browser-extension/2-forms-browsers-local-storage/README.md": { + "original_hash": "2b6203a48c48d8234e0948353b47d84e", + "translation_date": "2026-04-06T20:20:30+00:00", + "source_file": "5-browser-extension/2-forms-browsers-local-storage/README.md", + "language_code": "km" + }, + "5-browser-extension/2-forms-browsers-local-storage/assignment.md": { + "original_hash": "25b8d28b8531352d4eb67291fd7824c4", + "translation_date": "2026-04-06T20:21:01+00:00", + "source_file": "5-browser-extension/2-forms-browsers-local-storage/assignment.md", + "language_code": "km" + }, + "5-browser-extension/3-background-tasks-and-performance/README.md": { + "original_hash": "b275fed2c6fc90d2b9b6661a3225faa2", + "translation_date": "2026-04-06T20:25:10+00:00", + "source_file": "5-browser-extension/3-background-tasks-and-performance/README.md", + "language_code": "km" + }, + "5-browser-extension/3-background-tasks-and-performance/assignment.md": { + "original_hash": "a203e560e58ccc6ba68bffc40c7c8676", + "translation_date": "2026-04-06T20:25:59+00:00", + "source_file": "5-browser-extension/3-background-tasks-and-performance/assignment.md", + "language_code": "km" + }, + "5-browser-extension/README.md": { + "original_hash": "b121a279a6ab39878491f3e572673515", + "translation_date": "2026-04-06T19:15:58+00:00", + "source_file": "5-browser-extension/README.md", + "language_code": "km" + }, + "5-browser-extension/solution/README.md": { + "original_hash": "fab4e6b4f0efcd587a9029d82991f597", + "translation_date": "2026-04-06T20:30:04+00:00", + "source_file": "5-browser-extension/solution/README.md", + "language_code": "km" + }, + "5-browser-extension/solution/translation/README.es.md": { + "original_hash": "cbaf73f94a9ab4c680a10ef871e92948", + "translation_date": "2026-04-06T20:30:57+00:00", + "source_file": "5-browser-extension/solution/translation/README.es.md", + "language_code": "km" + }, + "5-browser-extension/solution/translation/README.fr.md": { + "original_hash": "9361268ca430b2579375009e1eceb5e5", + "translation_date": "2026-04-06T20:31:12+00:00", + "source_file": "5-browser-extension/solution/translation/README.fr.md", + "language_code": "km" + }, + "5-browser-extension/solution/translation/README.hi.md": { + "original_hash": "dd58ae1b7707034f055718c1b68bc8de", + "translation_date": "2026-04-06T20:30:42+00:00", + "source_file": "5-browser-extension/solution/translation/README.hi.md", + "language_code": "km" + }, + "5-browser-extension/solution/translation/README.it.md": { + "original_hash": "9a6b22a2eff0f499b66236be973b24ad", + "translation_date": "2026-04-06T20:32:05+00:00", + "source_file": "5-browser-extension/solution/translation/README.it.md", + "language_code": "km" + }, + "5-browser-extension/solution/translation/README.ja.md": { + "original_hash": "3f5e6821e0febccfc5d05e7c944d9e3d", + "translation_date": "2026-04-06T20:31:30+00:00", + "source_file": "5-browser-extension/solution/translation/README.ja.md", + "language_code": "km" + }, + "5-browser-extension/solution/translation/README.ms.md": { + "original_hash": "21b364c158c8e4f698de65eeac16c9fe", + "translation_date": "2026-04-06T20:31:49+00:00", + "source_file": "5-browser-extension/solution/translation/README.ms.md", + "language_code": "km" + }, + "5-browser-extension/start/README.md": { + "original_hash": "26fd39046d264ba185dcb086d3a8cf3e", + "translation_date": "2026-04-06T20:30:22+00:00", + "source_file": "5-browser-extension/start/README.md", + "language_code": "km" + }, + "6-space-game/1-introduction/README.md": { + "original_hash": "a6332a7bb4d0be3bfd24199c83993777", + "translation_date": "2026-04-06T20:12:01+00:00", + "source_file": "6-space-game/1-introduction/README.md", + "language_code": "km" + }, + "6-space-game/1-introduction/assignment.md": { + "original_hash": "c8fc39a014d08247c082878122e2ba73", + "translation_date": "2026-04-06T20:12:40+00:00", + "source_file": "6-space-game/1-introduction/assignment.md", + "language_code": "km" + }, + "6-space-game/2-drawing-to-canvas/README.md": { + "original_hash": "7994743c5b21fdcceb36307916ef249a", + "translation_date": "2026-04-06T19:54:21+00:00", + "source_file": "6-space-game/2-drawing-to-canvas/README.md", + "language_code": "km" + }, + "6-space-game/2-drawing-to-canvas/assignment.md": { + "original_hash": "87cd43afe5b69dbbffb5c4b209ea6791", + "translation_date": "2026-04-06T19:54:50+00:00", + "source_file": "6-space-game/2-drawing-to-canvas/assignment.md", + "language_code": "km" + }, + "6-space-game/3-moving-elements-around/README.md": { + "original_hash": "8c55a2bd4bc0ebe4c88198fd563a9e09", + "translation_date": "2026-04-06T20:16:22+00:00", + "source_file": "6-space-game/3-moving-elements-around/README.md", + "language_code": "km" + }, + "6-space-game/3-moving-elements-around/assignment.md": { + "original_hash": "c162b3b3a1cafc1483c8015e9b266f0d", + "translation_date": "2026-04-06T20:16:41+00:00", + "source_file": "6-space-game/3-moving-elements-around/assignment.md", + "language_code": "km" + }, + "6-space-game/4-collision-detection/README.md": { + "original_hash": "039b4d8ce65f5edd82cf48d9c3e6728c", + "translation_date": "2026-04-06T19:50:46+00:00", + "source_file": "6-space-game/4-collision-detection/README.md", + "language_code": "km" + }, + "6-space-game/4-collision-detection/assignment.md": { + "original_hash": "124efddbb65166cddb38075ad6dae324", + "translation_date": "2026-04-06T19:51:15+00:00", + "source_file": "6-space-game/4-collision-detection/assignment.md", + "language_code": "km" + }, + "6-space-game/4-collision-detection/solution/README.md": { + "original_hash": "068cbb9b3c10a96d503f6cdd6c9ace8c", + "translation_date": "2026-04-06T20:16:56+00:00", + "source_file": "6-space-game/4-collision-detection/solution/README.md", + "language_code": "km" + }, + "6-space-game/4-collision-detection/your-work/README.md": { + "original_hash": "068cbb9b3c10a96d503f6cdd6c9ace8c", + "translation_date": "2026-04-06T20:16:50+00:00", + "source_file": "6-space-game/4-collision-detection/your-work/README.md", + "language_code": "km" + }, + "6-space-game/5-keeping-score/README.md": { + "original_hash": "2ed9145a16cf576faa2a973dff84d099", + "translation_date": "2026-04-06T20:08:15+00:00", + "source_file": "6-space-game/5-keeping-score/README.md", + "language_code": "km" + }, + "6-space-game/5-keeping-score/assignment.md": { + "original_hash": "81f292dbda01685b91735e0398dc0504", + "translation_date": "2026-04-06T20:08:27+00:00", + "source_file": "6-space-game/5-keeping-score/assignment.md", + "language_code": "km" + }, + "6-space-game/5-keeping-score/solution/README.md": { + "original_hash": "068cbb9b3c10a96d503f6cdd6c9ace8c", + "translation_date": "2026-04-06T20:17:23+00:00", + "source_file": "6-space-game/5-keeping-score/solution/README.md", + "language_code": "km" + }, + "6-space-game/5-keeping-score/your-work/README.md": { + "original_hash": "068cbb9b3c10a96d503f6cdd6c9ace8c", + "translation_date": "2026-04-06T20:17:15+00:00", + "source_file": "6-space-game/5-keeping-score/your-work/README.md", + "language_code": "km" + }, + "6-space-game/6-end-condition/README.md": { + "original_hash": "a4b78043f4d64bf3ee24e0689b8b391d", + "translation_date": "2026-04-06T20:04:28+00:00", + "source_file": "6-space-game/6-end-condition/README.md", + "language_code": "km" + }, + "6-space-game/6-end-condition/assignment.md": { + "original_hash": "232d592791465c1678cab3a2bb6cd3e8", + "translation_date": "2026-04-06T20:05:31+00:00", + "source_file": "6-space-game/6-end-condition/assignment.md", + "language_code": "km" + }, + "6-space-game/6-end-condition/solution/README.md": { + "original_hash": "068cbb9b3c10a96d503f6cdd6c9ace8c", + "translation_date": "2026-04-06T20:17:08+00:00", + "source_file": "6-space-game/6-end-condition/solution/README.md", + "language_code": "km" + }, + "6-space-game/6-end-condition/your-work/README.md": { + "original_hash": "068cbb9b3c10a96d503f6cdd6c9ace8c", + "translation_date": "2026-04-06T20:17:02+00:00", + "source_file": "6-space-game/6-end-condition/your-work/README.md", + "language_code": "km" + }, + "6-space-game/README.md": { + "original_hash": "c40a698395ee5102715f7880bba3f2e7", + "translation_date": "2026-04-06T19:15:09+00:00", + "source_file": "6-space-game/README.md", + "language_code": "km" + }, + "6-space-game/solution/README.md": { + "original_hash": "068cbb9b3c10a96d503f6cdd6c9ace8c", + "translation_date": "2026-04-06T20:12:47+00:00", + "source_file": "6-space-game/solution/README.md", + "language_code": "km" + }, + "7-bank-project/1-template-route/README.md": { + "original_hash": "351678bece18f07d9daa987a881fb062", + "translation_date": "2026-04-06T20:41:07+00:00", + "source_file": "7-bank-project/1-template-route/README.md", + "language_code": "km" + }, + "7-bank-project/1-template-route/assignment.md": { + "original_hash": "df0dcecddcd28ea8cbf6ede0ad57d673", + "translation_date": "2026-04-06T20:41:32+00:00", + "source_file": "7-bank-project/1-template-route/assignment.md", + "language_code": "km" + }, + "7-bank-project/2-forms/README.md": { + "original_hash": "7cbdbd132d39a2bb493e85bc2a9387cc", + "translation_date": "2026-04-06T20:36:16+00:00", + "source_file": "7-bank-project/2-forms/README.md", + "language_code": "km" + }, + "7-bank-project/2-forms/assignment.md": { + "original_hash": "efb01fcafd2ef40c593a6e662fc938a8", + "translation_date": "2026-04-06T20:37:05+00:00", + "source_file": "7-bank-project/2-forms/assignment.md", + "language_code": "km" + }, + "7-bank-project/3-data/README.md": { + "original_hash": "86ee5069f27ea3151389d8687c95fac9", + "translation_date": "2026-04-06T20:46:24+00:00", + "source_file": "7-bank-project/3-data/README.md", + "language_code": "km" + }, + "7-bank-project/3-data/assignment.md": { + "original_hash": "d0a02cb117e91a5b5f24178080068a3d", + "translation_date": "2026-04-06T20:47:11+00:00", + "source_file": "7-bank-project/3-data/assignment.md", + "language_code": "km" + }, + "7-bank-project/4-state-management/README.md": { + "original_hash": "b807b09df716dc48a2b750835bf8e933", + "translation_date": "2026-04-06T20:51:02+00:00", + "source_file": "7-bank-project/4-state-management/README.md", + "language_code": "km" + }, + "7-bank-project/4-state-management/assignment.md": { + "original_hash": "50a7783473b39a2e0f133e271a102231", + "translation_date": "2026-04-06T20:51:59+00:00", + "source_file": "7-bank-project/4-state-management/assignment.md", + "language_code": "km" + }, + "7-bank-project/README.md": { + "original_hash": "830359535306594b448db6575ce5cdee", + "translation_date": "2026-04-06T19:16:22+00:00", + "source_file": "7-bank-project/README.md", + "language_code": "km" + }, + "7-bank-project/api/README.md": { + "original_hash": "9884f8c8a61cf56214450f8b16a094ce", + "translation_date": "2026-04-06T20:37:22+00:00", + "source_file": "7-bank-project/api/README.md", + "language_code": "km" + }, + "7-bank-project/solution/README.md": { + "original_hash": "461aa4fc74c6b1789c3a13b5d82c0cd9", + "translation_date": "2026-04-06T20:52:14+00:00", + "source_file": "7-bank-project/solution/README.md", + "language_code": "km" + }, + "8-code-editor/1-using-a-code-editor/README.md": { + "original_hash": "a9a3bcc037a447e2d8994d99e871cd9f", + "translation_date": "2026-04-06T19:45:48+00:00", + "source_file": "8-code-editor/1-using-a-code-editor/README.md", + "language_code": "km" + }, + "8-code-editor/1-using-a-code-editor/assignment.md": { + "original_hash": "effe56ba51c38d7bdfad1ea38288666b", + "translation_date": "2026-04-06T19:47:33+00:00", + "source_file": "8-code-editor/1-using-a-code-editor/assignment.md", + "language_code": "km" + }, + "9-chat-project/README.md": { + "original_hash": "2066c17078e9d18b5e309f31d8e8bc24", + "translation_date": "2026-04-06T19:27:51+00:00", + "source_file": "9-chat-project/README.md", + "language_code": "km" + }, + "9-chat-project/solution/README.md": { + "original_hash": "cb549dcad8eea3221cb89793aeaa3bb3", + "translation_date": "2026-04-06T21:30:43+00:00", + "source_file": "9-chat-project/solution/README.md", + "language_code": "km" + }, + "9-chat-project/solution/backend/README.md": { + "original_hash": "bcd2c2bbaae71151b1ed1b9170aa78af", + "translation_date": "2026-04-06T21:30:56+00:00", + "source_file": "9-chat-project/solution/backend/README.md", + "language_code": "km" + }, + "9-chat-project/solution/backend/python/README.md": { + "original_hash": "0aaa930f076f2d83cc872ad157f8ffd3", + "translation_date": "2026-04-06T21:31:08+00:00", + "source_file": "9-chat-project/solution/backend/python/README.md", + "language_code": "km" + }, + "9-chat-project/solution/frontend/README.md": { + "original_hash": "7746a470be8fc7f736eb1b43ebb710ee", + "translation_date": "2026-04-06T21:30:49+00:00", + "source_file": "9-chat-project/solution/frontend/README.md", + "language_code": "km" + }, + "AGENTS.md": { + "original_hash": "a362efd06d64d4134a0cfe8515a86d34", + "translation_date": "2026-04-06T19:04:32+00:00", + "source_file": "AGENTS.md", + "language_code": "km" + }, + "CODE_OF_CONDUCT.md": { + "original_hash": "b0a9b4cccd918195f58224d5793da1a6", + "translation_date": "2026-04-06T19:04:41+00:00", + "source_file": "CODE_OF_CONDUCT.md", + "language_code": "km" + }, + "CONTRIBUTING.md": { + "original_hash": "777400e9f0336c7ee2f9a1200a88478f", + "translation_date": "2026-04-06T19:02:55+00:00", + "source_file": "CONTRIBUTING.md", + "language_code": "km" + }, + "Git-Basics/README.md": { + "original_hash": "5cf5e1ed51455fefed4895fcc4d6ba2a", + "translation_date": "2026-04-06T19:10:40+00:00", + "source_file": "Git-Basics/README.md", + "language_code": "km" + }, + "README.md": { + "original_hash": "b885c87c7544109b78d6684daad6cba6", + "translation_date": "2026-04-06T19:09:56+00:00", + "source_file": "README.md", + "language_code": "km" + }, + "Roadmap.md": { + "original_hash": "28bf6185fd7f27b62ddc210514366192", + "translation_date": "2026-04-06T19:02:28+00:00", + "source_file": "Roadmap.md", + "language_code": "km" + }, + "SECURITY.md": { + "original_hash": "4ecc3bf2e27983d4c780be6f26ee6228", + "translation_date": "2026-04-06T19:05:02+00:00", + "source_file": "SECURITY.md", + "language_code": "km" + }, + "SUPPORT.md": { + "original_hash": "c9d207ff77b4bb46e46dc2b607a8ec1a", + "translation_date": "2026-04-06T19:02:40+00:00", + "source_file": "SUPPORT.md", + "language_code": "km" + }, + "_404.md": { + "original_hash": "ea9f0804bd62f46d9808e953ec7fc459", + "translation_date": "2026-04-06T19:03:05+00:00", + "source_file": "_404.md", + "language_code": "km" + }, + "docs/_navbar.md": { + "original_hash": "3bd2f51ecf4ac9b39277cba748943793", + "translation_date": "2026-04-06T19:18:20+00:00", + "source_file": "docs/_navbar.md", + "language_code": "km" + }, + "docs/_sidebar.md": { + "original_hash": "655c91b5979de46f1d70d97f0c5f1d14", + "translation_date": "2026-04-06T19:18:12+00:00", + "source_file": "docs/_sidebar.md", + "language_code": "km" + }, + "for-teachers.md": { + "original_hash": "71009af209f81cc01a1f2d324200375f", + "translation_date": "2026-04-06T19:02:03+00:00", + "source_file": "for-teachers.md", + "language_code": "km" + }, + "lesson-template/README.md": { + "original_hash": "0494be70ad7fadd13a8c3d549c23e355", + "translation_date": "2026-04-06T19:18:43+00:00", + "source_file": "lesson-template/README.md", + "language_code": "km" + }, + "lesson-template/assignment.md": { + "original_hash": "b5f62ec256c7e43e771f0d3b4e1a9130", + "translation_date": "2026-04-06T19:18:49+00:00", + "source_file": "lesson-template/assignment.md", + "language_code": "km" + }, + "memory-game/README.md": { + "original_hash": "ff47271e53637b2ba6ba72ad2b70f6d7", + "translation_date": "2026-04-06T19:16:09+00:00", + "source_file": "memory-game/README.md", + "language_code": "km" + }, + "quiz-app/README.md": { + "original_hash": "5301875c55bb305e6046bed3a4fd06d2", + "translation_date": "2026-04-06T19:15:37+00:00", + "source_file": "quiz-app/README.md", + "language_code": "km" + } +} \ No newline at end of file diff --git a/translations/km/1-getting-started-lessons/1-intro-to-programming-languages/README.md b/translations/km/1-getting-started-lessons/1-intro-to-programming-languages/README.md new file mode 100644 index 000000000..937cf7a22 --- /dev/null +++ b/translations/km/1-getting-started-lessons/1-intro-to-programming-languages/README.md @@ -0,0 +1,849 @@ +# ការណែនាំអំពីភាសាកម្មវិធី និងឧបករណ៍អ្នកអwickាសពេលបច្ចុប្បន្ន + +សួស្តីអ្នកអwickាសនៅអនាគត! 👋 តើខ្ញុំអាចប្រាប់អ្នកអ្វីមួយដែលនៅតែធ្វើអោយខ្ញុំមានអារម្មណ៍រំភើបគ្រប់ថ្ងៃបានទេ? អ្នកកំពុងត្រៀមខ្លួនដើម្បីស្គាល់ថាការកម្មវិធីមិនមែនត្រឹមតែជាកុំព្យូទ័រទេ – តែវា គឺជាការទទួលបានអំណាចពិសេសដើម្បីធ្វើឱ្យគំនិតសំខាន់ៗរបស់អ្នកក្លាយជាជាក់ស្តែង! + +អ្នកដឹងថាពេលណាដែលអ្នកកំពុងប្រើកម្មវិធីពេញចិត្តរបស់អ្នក ហើយសព្វគ្រប់យ៉ាងគឺជារឿងល្អឥតខ្ចោះមែនទេ? ពេលអ្នកចុចប៊ូតុងមួយ ហើយមានអ្វីមួយប្រសើរជាប់ចិត្តដែលធ្វើអោយអ្នកនិយាយថា "វ៉ាវ, តើអ្នកបានធ្វើរបៀបណា?" អ្នកណាម្នាក់ដូចជាអ្នក - ប្រហែលជាកំពុងអង្គុយនៅកាហ្វេទាំងមនុស្សនៅម៉ោង ២ ព្រឹកជាមួយកាហ្វេអេសប្រេសសូទីបី - បានសរសេរកូដដែលបង្កើតអ្វីមួយអស្ចារ្យនោះ។ ហើយនេះជារឿងដែលនឹងធ្វើអោយអ្នកភ្ញាក់ផ្អើល៖ នៅចុងบทសិក្សានេះ អ្នកនឹងមិនត្រឹមតែយល់ពីរបៀបដែលពួកគេចែករំលែកតែប៉ុណ្ណោះទេ ប៉ុន្តែអ្នកនឹងមានបំណងចង់សាកល្បងវាផងដែរ! + +សូមមើល ខ្ញុំយល់ថា ប្រសិនបើការកម្មវិធីធ្វើអោយអ្នកមានអារម្មណ៍ភ័យក្រែងឥឡូវនេះមែនទេ។ នៅពេលខ្ញុំចាប់ផ្តើម ខ្ញុំពិតជាចាប់អារម្មណ៍ថាអ្នកត្រូវតែជាអ្នកដំណឹងគណិតវិទ្យាឬបានរៀនកូដម្ដង ពីពេលអ្នកមានពាន់ឆ្នាំប្រាំ។ ប៉ុន្តែនេះជារឿងដែលបានផ្លាស់ប្តូរមើលឃើញរបស់ខ្ញុំបាននៅលើសម្បយ: ការកម្មវិធីគឺដូចជាការរៀនធ្វើបន្ទាប់បន្សល់ក្នុងភាសាថ្មីមួយ។ អ្នកចាប់ផ្តើមជាមួយ "ជំរាបសួរ" ហើយ "អរគុណ" បន្ទាប់មករៀនបញ្ជាទិញកាហ្វេ ហើយមុនពេលអ្នកដឹង អ្នកកំពុងមានការពិភាក្សាទូលំទូលាយទូទៅ! លើកលែងតែរឿងនេះ អ្នកកំពុងនិយាយជាមួយកុំព្យូទ័រ ហើយពិតប្រាកដទេ? ពួកវាជាដៃគូនិយាយដែលអត់ថប់សន្លាក់បំផុតដែលអ្នកធ្លាប់មាន – ពួកវាមិនដែល phê phán កំហុសរបស់អ្នក ហើយពួកវាផ្ទាល់ខ្លួនរំខានចង់សាកល្បងម្តងទៀត! + +ថ្ងៃនេះ យើងនឹងរំលឹកទៅលើឧបករណ៍អស្ចារ្យដែលធ្វើឱ្យការអwickាសវែបសម័យទំនើបមិនមែនត្រឹមតែអាចធ្វើបានទេ ប៉ុន្តែនៅក្នុងកម្រិតដែលធ្វើឱ្យអ្នកចងចាំ! ខ្ញុំកំពុងនិយាយអំពីក្រុមកម្មវិធីកែសម្រួល, កម្មវិធីរកមើល និងដំណើរការដូចគ្នានឹងដែលអ្នកអwickាសនៅ Netflix, Spotify និងស្ទូឌីយ៉ូកម្មវិធីឯករាជ្យដែលអ្នកចូលចិត្តប្រើរៀងរាល់ថ្ងៃ។ ហើយនេះជាផ្នែកដែលនឹងធ្វើឱ្យអ្នករាំសប្បាយចិត្ត៖ ឧបករណ៍ស្តង់ដារផ្នែកវិស័យភាគច្រើននេះគឺឥតគិតថ្លៃទាំងស្រុង! + +![Intro Programming](../../../../translated_images/km/webdev101-programming.d6e3f98e61ac4bff.webp) +> Sketchnote ដោយ [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://ff-quizzes.netlify.app/web/) + + +## ធ្វើដំណើរដែលយើងនឹងធ្វើរួមគ្នា + +ល្អហើយ ខ្ញុំមាន អារម្មណ៍រំភើបយ៉ាងខ្លាំងអំពីអ្វីដែលយើងនឹងស្វែងរកថ្ងៃនេះ! ពិតប្រាថ្នាខ្ញុំអាចមើលមុខអ្នកពេលដែលមុខងារដែលខ្លះទទួលបានចំណាំ។ នេះគឺជាធម្មតាដំណើរអស្ចារ្យដែលយើងនឹងធ្វើរួមគ្នា៖ + +- **តើកម្មវិធីជាអ្វីពិត (និងមូលហេតុដែលវាជារឿងដ៏កក់ក្តៅ!)** – យើងនឹងរកឃើញថាកូដគឺជាអាកាសធាតុមិនច្បាស់ដែលបណ្តាលថាមពលអ្វីគ្រប់យ៉ាងនៅជុំវិញអ្នក ពីឧបករណ៍រោទិ៍ដែលដឹងថាព្រឹកថ្ងៃច័ន្ទ រហូតដល់អាល់ហ្គរីធ្ម៍ដែលរៀបចំជាផ្លូវការជួប Netflix របស់អ្នកបានគ្រប់លក្ខណៈ +- **ភាសាកម្មវិធី និងបុគ្គលិកលក្ខណៈដ៏អស្ចារ្យរបស់ពួកវា** – សូមស្រមៃថាអ្នកចូលរួមក្នុងគ្រួសារ ដែលមនុស្សនីមួយៗមានអំណាចពិសេស និងវិធីដោះស្រាយបញ្ហាទាំងមូល។ នេះគឺជាពិភពភាសាកម្មវិធី ហើយអ្នកនឹងស្រឡាញ់ការជួបពួកវា! +- **ឋាននឿយយ៉ាងសំខាន់ដែលធ្វើអោយវេទិកាឌីជីថលកើតឡើង** – សូមគិតថា រឿងទាំងនេះដូចជាបន្ទះ LEGO បង្កើតដ៏អស្ចារ្យបំផុត។ នៅពេលអ្នកយល់ពីរបៀបភ្ជាប់ចំណែកទាំងនេះ អ្នកនឹងដឹងថាអ្នកអាចបង្កើតអ្វីគ្រប់យ៉ាងតាមក្តីស្រមៃរបស់អ្នក +- **ឧបករណ៍វិជ្ជាជីវៈដែលនឹងធ្វើអោយអ្នកមានអារម្មណ៍ដូចជាពួកគេមួយមានដែកឆ្លងពិសេស** – ខ្ញុំមិនខ្លាចនិយាយទេ – ឧបករណ៍ទាំងនេះពិតជានឹងធ្វើអោយអ្នកមានអំណាចពិសេស ហើយផ្នែកល្អបំផុត គឺពួកវាជាឧបករណ៍ដែលអ្នកជំនាញប្រើប្រាស់! + +> 💡 **នេះជារឿងមួយ**៖ កុំគិតអំពីការចងចាំអ្វីគ្រប់យ៉ាងថ្ងៃនេះទេ! ឥឡូវនេះ ខ្ញុំគ្រាន់តែនឹងចង់ឲ្យអ្នកមានអារម្មណ៍រំភើបចំពោះអ្វីដែលអាចបង្កើតបាន។ លម្អិតនឹងត្រូវចងចាំដោយស្វ័យប្រវត្តិពេលដែលយើងហាត់រួមគ្នា – នេះជាការសិក្សាពិតប្រាកដ! + +> អ្នកអាចយកមេរៀននេះនៅលើ [Microsoft Learn](https://learn.microsoft.com/en-us/learn/modules/web-development-101/introduction-programming/?WT.mc_id=academic-77807-sagibbon)! + +## តើកម្មវិធីគឺជាអ្វី? + +ល្អហើយ ទស្សនាអំពីសំណួរមានតំលៃម៉ឺនដុល្លារ៖ តើកម្មវិធីគឺជាអ្វីពិតប្រាកដ? + +ខ្ញុំនឹងប្រាប់អ្នករឿងមួយដែលបានផ្លាស់ប្តូរយ៉ាងខ្លាំងចំពោះការគិតរបស់ខ្ញុំអំពីរឿងនេះ។ សប្តាហ៍មុន ខ្ញុំកំពុងព្យាយាមពន្យល់ឲ្យម៉ាក់បានដឹងពីរបៀបប្រើឧបករណ៍ត្រួតប័ណ្ណរបស់ធេវីឆ្លាតថ្មីរបស់យើង។ ខ្ញុំបាននិយាយដូចក្ដៅថា "ចុចប៊ូតុងក្រហម ប៉ុន្តែមិនត្រូវចុចប៊ូតុងក្រហមធំទេ ជាប៊ូតុងក្រហមតូចនៅខាងឆ្វេង... មិនមែនខាងឆ្វេងនេះទេ... ល្អហើយ ឥឡូវចុចយករយៈពេលពីរវិនាទី មិនមែនមួយ មិនមែនបី..." តើអ្នកធ្លាប់បានជួបទេ? 😅 + +នេះហើយហ្នឹងហៅថាកម្មវិធី! វាជាសិល្បៈនៃការផ្តល់ដាក់ទិសដៅលម្អិតប្រកបដោយជំហានច្រើនទៅឱ្យអ្វីមួយមានអំណាចខ្ពស់ប៉ុន្ត្រូវការបញ្ជាក់គ្រប់រឿងត្រឹមត្រូវ។ លើកលែងតែពេលដែលអ្នកពន្យល់ទៅឱ្យម៉ាក់ (ដែលអាចសួរថា "ប៊ូតុងក្រហមមួយណា?") អ្នកកំពុងពន្យល់ទៅកុំព្យូទ័រ (ដែលគ្រាន់តែអនុវត្តតាមអ្វីដែលអ្នកបានប្រាប់ ព្រមទាំងបញ្ហាដែលអ្នកចង់ប្រាប់មិនមែនសម្រាប់អ្វីដែលអ្នកមានជំនឿ)។ + +នេះជារឿងដែលធ្វើអោយខ្ញុំភ្ញាក់ផ្អើលពេលខ្ញុំបានរៀនដំបូង៖ កុំព្យូទ័រពិតជាប្រហែលថាតូចស្រីតាមសំណុំរបស់ពួកវា។ ពួកវាគ្រាន់តែយល់ពីពីរពាក្យតែប៉ុណ្ណោះ – 1 និង 0 ដែលគឺមានន័យថា "បាទ/ចាស" និង "ទេ" ឬ "បើក" និង "បិទ"។ មានតែក្នុងនេះប៉ុណ្ណោះ! ប៉ុន្តែមកទីនេះចាប់ផ្តើមពន្លឺ – យើងមិនត្រូវនិយាយជាផ្ទាំង ១ និង ០ ដូចជានៅក្នុងភាពយន្ត The Matrix ទេ។ នោះហើយជា **ភាសាកម្មវិធី** ជួយយើងបាន។ ពួកវាគឺដូចជាអ្នកបកប្រែបំផុតល្អបំផុតដែលយកគំនិតជាមនុស្សរបស់អ្នក ហើយបម្លែងវាទៅជាភាសាកុំព្យូទ័រ។ + +ហើយនេះគឺជារឿងដែលនៅតែធ្វើអោយខ្ញុំមានអារម្មណ៍ដូចជាអារម្មណ៍រំញ័រពិតប្រាកដនៅរៀងរាល់ព្រឹកពេលខ្ញុំនិយាយថា៖ ពីរស្គាល់ *គ្រប់យ៉ាង* ឌីជីថលនៅក្នុងជីវិតអ្នកបានចាប់ផ្តើមជាមួយនរណាម្នាក់ដូចអ្នក កំពុងអង្គុយក្នុងប៉ោម៉៉ាសាហ្វាតទាំងមួយជាមួយកាហ្វេ ហើយសរសេរកូដលើកុំព្យូទ័រយួរដៃរបស់ពួកគេ។ ឧបករណ៍ Instagram ធ្វើឲ្យអ្នកមើលស្រស់ស្អាត? មាននរណាម្នាក់សរសេរកូដនោះ។ កម្មវិធីណែនាំដែលនាំអ្នកទៅកាន់បទចម្រៀងថ្មីដែលអ្នកចូលចិត្ត? អwickាសបានបង្កើតអាល់ហ្គរីធ្ម៍នោះ។ កម្មវិធីជួយអ្នកបែងចែកលុយដល់ម៉ឺនុយនៅម៉ោងអាហារពេលល្ងាចជាមួយមិត្តភក្តិ? មែនហើយ អ្នកណាម្នាក់បានគិតថា "នេះគឺគ្មានអារម្មណ៍ល្អទេ ខ្ញុំអាចជួសជុលបាន" ហើយបន្ទាប់មកពួកគេបានធ្វើទៅហើយ! + +ពេលអ្នករៀនកុំប្រតិបត្តិការ អ្នកមិនត្រឹមតែទទួលបានជំនាញថ្មីនោះទេ – អ្នកកំពុងក្លាយជាផ្នែកមួយនៃសហគមន៍បញ្ហាដោះស្រាយដ៏អស្ចារ្យដែលចំណាយពេលរាល់ថ្ងៃនិយាយថា "តើយ៉ាងដូចម្តេចបើខ្ញុំអាចបង្កើតអ្វីមួយដែលធ្វើឲ្យថ្ងៃរបស់នរណាម្នាក់ល្អប្រសើរបន្តិច?" ពិតហើយ តើមានអ្វីល្អបំផុតជាងនេះទេ? + +✅ **ការស្វែងរកពត៌មានសប្បាយភ្ញាក់ផ្អើល**៖ នេះជារឿងមួយដ៏អស្ចារ្យសម្រាប់ស្វែងរកពេលមានវេលាចន្លោះ – តើអ្នកគិតថា នរណាជាអwickាសកុំព្យូទ័រដំបូងបំផុតនៅលើពិភពលោក? ខ្ញុំនឹងផ្តល់ស្វ័យតំណរណ៍មួយ៖ វាប្រហែលជាមិនមែនជាអ្នកដែលអ្នករំពឹងទុកទេ! រឿងពីក្រោយមនុស្សនេះគឺគួរឱ្យចាប់អារម្មណ៍ ហើយបង្ហាញថាកម្មវិធីតែងតែជាអំពើបញ្ហាដោះស្រាយដោយច្នៃប្រឌិត និងគិតផុតពីប្រអប់។ + +### 🧠 **ពេលពិនិត្យ៖ អ្នកមានអារម្មណ៍យ៉ាងដូចម្តេច?** + +**សូមចំណាយពេលមួយដើម្បីគិតថា:** +- តើគំនិតនៃ "ផ្តល់សេចក្ដីណែនាំទៅកុំព្យូទ័រ" បានច្បាស់រួចហើយទេ? +- តើអ្នកអាចគិតអំពីភារកិច្ចប្រចាំថ្ងៃណាមួយដែលអ្នកចង់ស្វ័យប្រវត្តិកម្មបានទេ? +- តើមានសំណួរអ្វីខ្លះកំពុងកើតឡើងនៅក្នុងចិត្តរបស់អ្នកអំពីការកម្មវិធីនេះ? + +> **ចងចាំ**: វាត្រូវបានគ្រាន់តែក្នុងស្ថានភាពអនុញ្ញាត បើសិនជាភាសាតិចសារសម្រាប់ខ្លះៗត្រូវបានចូលចិត្ត។ ការរៀនកម្មវិធីដូចជាការរៀនភាសាថ្មី – វាត្រូវការពេលវេលាដើម្បីអោយខួរក្បាលរបស់អ្នកបង្កើតផ្លូវប្រសាសន៍ឆ្លងកាត់ខួរក្បាល។ អ្នកកំពុងធ្វើបានល្អណាស់! + +## ភាសាកម្មវិធីគឺដូចជារសជាតិដ៏ខុសគ្នារបស់ព្រះបាទមហាវិស័យ + +ល្អហើយ នេះឮអដូចជាអ្វីមួយច្របូកច្របល់ ប៉ុន្តែសូមរង់ចាំខ្ញុំ – ភាសាកម្មវិធីគឺស្រដៀងនឹងតន្ត្រីច្រើនប្រភេទ។ សូមគិតថា: អ្នកមានជាស្ទាយ jazz ដែលទន់ភ្លន់និងហួសចិត្ត, rock ដែលខ្លាំងនិងត្រង់, classical ដែលឯកទេសនិងមានសណ្ឋាន, និង hip-hop ដែលច្នៃប្រឌិតនិងបង្ហាញអារម្មណ៍។ រៀងទាំងស្ទាយមានយ៉ាងខ្លួនផ្ទាល់, ក្រុមគាំទ្រគ្រប់គ្នាដែលមានចិត្តស្មោះ, ហើយរៀងរាល់មួយគឺល្អសម្រាប់ជំរើសនិងឱកាសខុសៗគ្នា។ + +ភាសាកម្មវិធីដំណើរការដូចគ្នា! អ្នកមិននឹងប្រើភាសាដូចគ្នាដើម្បីបង្កើតហ្គេមទូរស័ព្ទដែលគួរឲ្យសប្បាយតែអ្នកនឹងប្រើដើម្បីកាន់ទិន្នន័យអាកាសធាតុនៅកម្រិតខ្ពស់ទេ ដូចដែលអ្នកមិនលេង death metal នៅក្នុងថ្នាក់យូហ្គាឡើយ (យើងប្រហែលជាក៏មែន! 😄)។ + +ប៉ុន្តែនេះជាអ្វីដែលធ្វើអោយខ្ញុំភ្ញាក់រីករាយគ្រប់ពេលខ្ញុំគិតពីវា៖ ភាសាទាំងនេះដូចជាអ្នកបកប្រែពិតប្រាកដម្នាក់ដែលអង្គុយនៅចំហៀងអ្នក។ អ្នកអាចបញ្ចេញគំនិតរបស់អ្នកដោយរបៀបដែលធម្មតាចំពោះខួរក្បាលមនុស្សរបស់អ្នក ហើយពួកវាត្រូវទទួលខុសត្រូវការងារលំបាកក្នុងការបម្លែងទៅជារបៀប ១ និង ០ ដែលកុំព្យូទ័រនិយាយ។ វាដូចជាមានមិត្តភ័ក្រម្នាក់ដែលមានជំនាញជាភាសាមនុស្ស និងភាសាគណិតវិទ្យារៀងរាល់ពេល – ហើយពួកគេមិនដែលទៅអស់កម្លាំង មិនដែលត្រូវការឈប់ផឹកកាហ្វេ ក៏មិនដែល phê phán អ្នកសម្រាប់សំណួរដូចគ្នាដងពីរទេ! + +### ភាសាកម្មវិធីពេញនិយម និងការប្រើប្រាស់របស់ពួកវា + +```mermaid +mindmap + root((ភាសាកម្មវិធី)) + ការអភិវឌ្ឍវេបសាយ + JavaScript + មន្តស្រមោលផ្នែកមុខ + គេហទំព័របញ្ញវន្ត + TypeScript + JavaScript + ប្រភេទ + កម្មវិធីស្ថាប័ន + ទិន្នន័យ & បញ្ញាសិប្បនិម្មិត + Python + វិជ្ជាសារព័ត៌មានទិន្នន័យ + រៀនម៉ាស៊ីន + ឯករាជ្យដំណើរការ + R + ស្ថិតិវិទ្យា + ការស្រាវជ្រាវ + កម្មវិធីទូរសព្ទ័ចល័ត + Java + Android + ស្ថាប័ន + Swift + iOS + អេកូស៊ីស្ទម Apple + Kotlin + Android សម័យទំនើบ + បណ្តាប្រព័ន្ធសហគ្រិន + ប្រព័ន្ធ & ប្រសិទ្ធភាព + C++ + ហ្គេម + សារៈសំខាន់ប្រសិទ្ធភាព + Rust + សន្តិសុខអង្គចងចាំ + កម្មវិធីប្រព័ន្ធ + Go + សេវាកម្មពពក + ផ្នែកខាងក្រោយអាចពង្រីកបាន +``` +| ភាសា | ល្អបំផុតសម្រាប់ | ហេតុអ្វីបានពេញនិយម | +|----------|----------|------------------| +| **JavaScript** | ការអwickាសវែប, ចំណុចប្រទាក់អ្នកប្រើ | រត់នៅក្នុងកម្មវិធីរកមើល និងគ្រប់គ្រងវែបសាយអន្តរប្រតិបត្តិការ | +| **Python** | វិទ្យាសាស្ត្រទិន្នន័យ, ស្វ័យប្រវត្តិ, AI | ស្រាលក្នុងការអាន និងរៀន មានបណ្ណាល័យដ៏មានអំណាច | +| **Java** | កម្មវិធីសម្រាប់សហគ្រាស, កម្មវិធី Android | ផ្នែកប្លាតផ្លាត់មិនខ្វះខាត និងរឹងមាំសម្រាប់ប្រព័ន្ធធំៗ | +| **C#** | កម្មវិធីវីនដូ, ការ​អwickាសហ្គេម | មានគាំទ្រយ៉ាងខ្លាំងពីប្រព័ន្ធ Microsoft | +| **Go** | សេវាកម្មពពក, ប្រព័ន្ធក្រោយ | លឿន, សាមញ្ញ, រចនាសម្រាប់កុំព្យូទ័រសម័យថ្មី | + +### ភាសារថ្មីកម្រិតខ្ពស់ និងភាសារថ្មីកម្រិតទាប + +ល្អ, នេះជាឧទាហរណ៍មួយដែលអស់សមត្ថភាពខួរក្បាលខ្ញុំច្រើនពេលខ្ញុំចាប់ផ្តើមរៀន ដូច្នេះខ្ញុំនឹងចែករំលែករឿងងាយយល់ដែលបានធ្វើអោយវាច្បាស់សម្រាប់ខ្ញុំ – ហើយខ្ញុំសង្ឃឹមវានឹងជួយអ្នកផងដែរ! + +សូមស្រមៃថាអ្នកកំពុងទៅទស្សនាប្រទេសមួយដែលអ្នកមិនចេះភាសា ហើយអ្នកត្រូវការស្វែងរកបង្គន់ជិតជាងគេតែម៉េច? (យើងរាល់គ្នាត្រូវបានដែរមែនទេ? 😅): + +- **ការកម្មវិធីកម្រិតទាប** គឺដូចជា ជ្រាបភាសាតំបន់ដែលអ្នកអាចនិយាយជាមួយពៅតាស់ដាំផ្លែឈើនៅមួកផ្លូវ ប្រើការប្រៀបធៀបវប្បធម៌, ពាក្យសំដីនៅតំបន់, និងរឿងកំប្លែងក្នុងស្រុក ដែលមានតែអ្នកដែលបានធំឡើងនៅទីនោះតែប៉ុណ្ណោះដែលយល់។ គួរអោយកត់សម្គាល់ខ្លាំងហើយមានប្រសិទ្ធភាពខ្ពស់... ប៉ុន្តែវាលំបាកខ្លាំងនៅពេលអ្នកត្រឹមត្រូវស្វែងរកបង្គន់។ +- **ការកម្មវិធីកម្រិតខ្ពស់** គឺដូចជាមិត្តភ័ក្រ្តនៅក្នុងស្រុកដែលយល់អ្នក។ អ្នកអាចនិយាយថា "ខ្ញុំត្រូវការស្វែងរកបង្គន់" ជាភាសាអង់គ្លេសធម្មតា ហើយពួកគេនឹងបកប្រែវាបានជាថ្មីជាមួយព័ត៌មានវប្បធម៌ និងផ្តល់ទិសដៅដែលមានសមតុល្យមែនទែនសម្រាប់ខួរក្បាលអ្នកដែលមិនមែនជាកន្លែងជាតិ។ + +ក្នុងភាសាកម្មវិធី៖ +- **ភាសាប្រភេទកម្រិតទាប** (ដូចជា Assembly ឬ C) អនុញ្ញាតឲ្យអ្នកមានការពិភាក្សារយៈពេលលម្អិតជាមួយឧបករណ៍រឹងដែលកុំព្យូទ័រប្រើ ប៉ុន្តែអ្នកត្រូវតែគិតដូចជាម៉ាស៊ីនមួយ ដែល... យើងនិយាយថា វា ជាការផ្លាស់ប្តូរចិត្តយ៉ាងធំមួយ! +- **ភាសាប្រភេទកម្រិតខ្ពស់** (ដូចជា JavaScript, Python, ឬ C#) អនុញ្ញាតឲ្យអ្នកគិតដូចមនុស្ស ខណៈពួកវាកំពុងគ្រប់គ្រងការលំបាកជាច្រើនដែលមាននៅជាប់ក្រោយម៉ាស៊ីន។ លើសពីនេះ ពួកវាមានសហគមន៍មនុស្សទាំងស្រុងដែលចាំបាច់ខ្លួនជាគ្រាប់តូចទាំងមូលផងដែរ ហើយពិតជាចង់ជួយអ្នក! + +អ្នកគិតថាអ្នកនឹងចាប់ផ្តើមជាមួយភាសាណា? 😉 ភាសាកម្រិតខ្ពស់គឺដូចជាម៉ាស៊ីនប៉ា្រស៊ែតដែលអ្នកមិនចង់ដកចេញទេ ព្រោះវាធ្វើអោយបទពិសោធន៍ទាំងមូលគួរឲ្យរីករាយជាងមុន! + +```mermaid +flowchart TB + A["👤 គំនិតមនុស្ស:
'ខ្ញុំចង់គណនាលេខ Fibonacci'"] --> B{ជ្រើសរើសកម្រិតភាសា} + + B -->|កម្រិតខ្ពស់| C["🌟 JavaScript/Python
ងាយស្រួលអាន និងសរសេរ"] + B -->|កម្រិតទាប| D["⚙️ Assembly/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 +``` +### ខ្ញុំនឹងបង្ហាញអ្នកថា អេត្បោវភាសាកម្រិតខ្ពស់កាន់តែងាយស្រួល + +ល្អហើយ ខ្ញុំនឹងបង្ហាញអ្នកអ្វីដែលបង្ហាញយ៉ាងច្បាស់ថាហេតុអ្វីខ្ញុំស្រឡាញ់ភាសាកម្រិតខ្ពស់ តែសិនខ្ញុំត្រូវការអ្នកសន្យាអ្វីមួយ។ នៅពេលអ្នកឃើញឧទាហរណ៍កូដលើកដំបូង កុំភ័យ! វាត្រូវមានរូបរាងធ្វើអោយភ័យ។ នេះជាគោលបំណងដែលខ្ញុំចង់បញ្ជាក់! + +យើងនឹងមើលការងារដូចគ្នាមួយដែលបានសរសេរដោយរបៀបពីរផ្សេងៗគ្នាទាំងស្រុង។ ទាំងពីរបង្កើតអ្វីដែលហៅថាស៊េរី Fibonacci – របៀបគណិតវិទ្យាដ៏ស្រស់ស្អាត ដែលលេខនីមួយៗគឺជាផលបូករបស់លេខពីរមុនៗ៖ 0, 1, 1, 2, 3, 5, 8, 13... (កំណត់សំគាល់: អ្នកនឹងឃើញរបៀបនេះនៅគ្រប់ទីកន្លែងធម្មជាតិ – ព្រលឹងមូលផ្កាផ្សិតទូៗ, រចនាសម្ព័ន្ធប្រចាំត្នោត, រហូតដល់របៀបឆ្នាំកាឡាក់ស៊ីកើតឡើង!) + +តើអ្នករួចរាល់ទេដើម្បីមើលភាពខុសគ្នា? ទៅមុខ! + +**ភាសាកម្រិតខ្ពស់ (JavaScript) – ងាយស្រួលសម្រាប់មនុស្ស:** + +```javascript +// ជំហានទី 1: ការកំណត់ Fibonacci មូលដ្ឋាន +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` +- **បង្ហាញ** លេខនីមួយៗជាមួយទីតាំងដោយប្រើទ្រង់ទ្រាយអក្សរស្លាក (template literal) +- **គណនា** លេខ 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); +``` + +**នៅក្នុងនេះ យើងបាន:** +- **បង្កើត** មុខងារដែលអាចប្រើឡើងវិញ ដោយប្រើរបៀបសរសេរមុខងារបង្ហើប (arrow function) +- **កសាង** អារេដើម្បីទុកស៊េរីពេញលេញ មិនបង្ហាញចេញតែមួយៗទេ +- **ប្រើ** ការកំណត់ទីតាំងអារេដើម្បីគណនាលេខថ្មីៗ ពីតម្លៃមុនៗ +- **ត្រឡប់** ស៊េរីពេញលេញសម្រាប់ប្រើប្រាស់បានច្រើនផ្នែកក្រៅក្នុងកម្មវិធីរបស់យើង + +**ភាសាកម្រិតទាប (ARM Assembly) – ងាយស្រួលសម្រាប់កុំព្យូទ័រ:** + +```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 កន្លែងនេះអានដូចជាដឹកនាំជាភាសាអង់គ្លេស ខណៈសំឡេង Assembly ប្រើបញ្ជាក្រុមហ៊ុនដែលគ្រប់គ្រងផ្ទាល់ processor របស់កុំព្យូទ័រ។ ទាំងពីរធ្វើការងារដូចគ្នា តែភាសាកម្រិតខ្ពស់ងាយស្រួលសម្រាប់មនុស្សយល់ សរសេរ និងថែរក្សាបំផុត។ + +**ភាពខុសគ្នាចម្បងដែលអ្នកនឹងមើលឃើញ:** +- **អាចអានបាន**: JavaScript ប្រើឈ្មោះពណ៌នាដូចជា `fibonacciCount` ខណៈពេលដែល Assembly ប្រើស្លាកសញ្ញាដ៏អស្ចារ្យដូចជា `r0`, `r1` +- **មន្ត្រីផ្តល់កត់សម្គាល់**: ភាសាឧត្តមកម្រិតលើកលែងរំលឹកពីមន្ត្រីសំខាន់ៗដែលធ្វើឱ្យកូដអាចធ្វើឱ្យមានឯកសារផ្ទាល់ខ្លួន +- **រចនាសម្ព័ន្ធ**: ជំហានตรេត្រដ្ឋនៃ JavaScript ល្អនិងផ្គូផ្គងនឹងរបៀបដែលមនុស្សគិតអំពីបញ្ហាជាជំហានៗ +- **ការថែទាំ**: ការអាប់ដេតកំណែ JavaScript សម្រាប់តម្រូវការផ្សេងៗកាន់តែងាយស្រួល និងច្បាស់លាស់ + +✅ **អំពីស៊េរី Fibonacci**: លំនាំលេខដ៏ស្អាតប្លែកនេះ (កំណត់ឥតខ្លាចលេខមួយស្មើនឹងទិន្នផលនៃលេខពីរ​កន្លងមក: 0, 1, 1, 2, 3, 5, 8...) មាននៅជិតគ្រប់ទីកន្លែងក្នុងធម្មជាតិ! អ្នកអាចរកឃើញវានៅក្នុងស្លឹកផ្កាឈូក, លំនាំផ្លែស៉ៃ, របៀបសង្ហារលំនាំសន្លឹក Nautilus ហើយរហូតដល់របៀបជាំបាក់ពន្លឺរបស់ដើមឈើ។ វាបង្ហាញពីវិធីដែលគណិតវិទ្យានិងកូដអាចជួយយើងយល់ដឹងនិងបង្កើតឡើងវិញនូវលំនាំដែលធម្មជាតិប្រើដើម្បីបង្កើតភាពស្រស់ស្អាត! + +## គ្រឿងដែកគ្រឿងធ្វើអោយយុទ្ធសាស្ត្ររូបមន្ដកើតឡើង + +ចាប់ផ្តើមឥឡូវដែលអ្នកបានឃើញរបៀបដែលភាសាកម្មវិធីមើលទៅក្នុងសកម្មភាព ខ្ញុំចង់បំបែកផ្នែកមូលដ្ឋានដែលបង្កើតកម្មវិធីអ្វីៗគ្រប់សរសេរឡើង។ គិតថាវា​ជា​គ្រឿងផ្សំមូលដ្ឋាន​នៅ​ក្នុង resipe ដែលអ្នកចូលចិត្ត - ពេលអ្នកយល់ពីតួនាទីនៃមួយៗ អ្នកនឹងអាចអាននិងសរសេរកូដនៅភាសាគ្រប់មាន! + +នេះគឺដូចជាការរៀនវេយ្យាករណ៍របស់កម្មវិធី។ ចាំបានមុនពេលនៅសាលាដែលអ្នករៀនអំពីនាម វិធាន និងរបៀបដាក់ប្រយោគរួម? កម្មវិធីក៏មានរចនាសម្ព័ន្ធវេយ្យាករណ៍ផ្ទាល់ខ្លួន ហើយជាសំណាងមួយ វាល្អប្រសើរជាងវេយ្យាករណ៍ភាសាអង់គ្លេសច្រើន! 😄 + +### សម្ងាត់៖ คំពុងផ្តល់​ដំណើរការ​​​ជាថ្នាក់ៗ + +ចាប់ផ្តើមជាមួយ **សម្ងាត់** – អ្វីនេះគឺដូចជាប្រយោគ​បុគ្គល​មួយ​ក្នុង​ការពិភាក្សាជាមួយកុំព្យូទ័រ។ សម្ងាត់មួយៗសំដៅឱ្យកុំព្យូទ័រធ្វើអ្វីមួយជាក់លាក់ ដូចជាការបញ្ជូនផ្លូវ៖ "បត់ឆ្វេងទីនេះ," "ឈប់នៅច្រកសញ្ញាចរាចរណ៍ក្រហម," "ចតឡាននៅកន្លែងនោះ។" + +អ្វីដែលខ្ញុំចូលចិត្តនៅលើសម្ងាត់គឺថាវាអាចអានបានយ៉ាងស្រួល។ សូមពិនិត្យមើលនេះ៖ + +```javascript +// ប្រកាសមូលដ្ឋានដែលអនុវត្តសកម្មភាពតែមួយ +const userName = "Alex"; +console.log("Hello, world!"); +const sum = 5 + 3; +``` + +**នេះគឺអ្វីដែលកូដនេះធ្វើ៖** +- **ប្រកាស** អថេរមួយដើម្បីរក្សារឈ្មោះអ្នកប្រើ +- **បង្ហាញ** សារពីពាក្យអរគុណទៅកាន់ការបង្ហាញ console +- **គណនា** និងរក្សាទុកលទ្ធផលនៃប្រតិបត្តិការគណិតវិទ្យា + +```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; +``` + +**យល់ដឹងលម្អិតពីមួយៗ៖** +- **បង្ហាញ** ព័ត៌មានដោយប្រើ template literals ជាមួយ `${}` ស៊ីនតាក់ +- **ចូលដំណើរការ** អចលនវត្ថុដោយប្រើ dot notation (`weatherData.windSpeed`) +- **ធ្វើបច្ចុប្បន្នភាព** អថេរដែលបានប្រកាសជាមួយ `let` ដើម្បីបង្ហាញស្ថានភាពផ្លាស់ប្តូរ +- **បញ្ចូលគ្នា** ជាមួយអថេរជាច្រើនដើម្បីបង្កើតសារ​មានអត្ថន័យ + +```javascript +// ជំហាន 4: ការបំបែកទំនាក់ដោយទំនើបសម្រាប់កូដស្អាតជាងមុន +const { location, humidity } = weatherData; +console.log(`${location} humidity: ${humidity}%`); +``` + +**អ្វីដែលអ្នកត្រូវចេះគឺ៖** +- **ដកស្រង់** លក្ខណៈពិសេសពីវត្ថុដោយប្រើការចំណាត់ថ្នាក់ destructuring assignment +- **បង្កើត** អថេរថ្មីដោយស្វ័យប្រវត្តិជាមួយឈ្មោះដូចគ្នានៅក្នុងវត្ថុ +- **សម្រួល** កូដដោយជៀសវាងការប្រើ dot notation ក្រៀមក្រំឡើងវិញ + +### របៀបដំណើរការ ​Control Flow៖ បង្រៀនកម្មវិធីឲ្យគិត + +ល្អណាស់ នៅទីនេះកម្មវិធីក្លាយជារឿងចម្លែកមែន! **Control flow** គឺជាការបង្រៀនកម្មវិធីរបស់អ្នកឱ្យធ្វើជម្រើសរបស់ខ្លួនយ៉ាងវៃឆ្លាត ដូចជាអ្នកធ្វើរៀងរាល់ថ្ងៃដោយមិនចេះអើយ។ + +សូមរៀបរាប់៖ ព្រឹកនេះអ្នកប្រហែលជាមានរឿងជា "បើមានភ្លៀង ខ្ញុំនឹងយកឆ័ត្រ។ បើត្រជាក់ ខ្ញុំនឹងស្លៀកអាវក្រៅ។ បើខ្ញុំពេញលេញខ្ពស់ ខ្ញុំនឹងរំលងអាហារព្រឹកហើយយកកាហ្វេកាន់ទៅ។" សម្ថតិបញ្ញារបស់អ្នកធម្មជាតិតាមដាន បើ-បរិបទ នេះជាច្រើនដងរាល់ថ្ងៃ! + +នេះជាឱកាសដែលកម្មវិធីមានផាសុខភាពនិងមានជីវិត ជាជាងតែការតាមដានស្គ្រីបរ៉ូបូតដូចជាកំណត់។ វាអាចពិនិត្យឡើងវិញពីស្ថានភាព ធ្វើការវាយតម្លៃ តាមដាននិងឆ្លើយតបយ៉ាងសមស្រប។ វាដូចជាការផ្តល់ខួរក្បាលដល់កម្មវិធីដែលអាចបត់បែននិងធ្វើជម្រើសបាន! + +ចង់ឃើញរបៀបដែលវាដំណើរការយ៉ាងស្រស់ស្អាតទេ? ខ្ញុំនឹងបង្ហាញអ្នក៖ + +```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 +// ជំហាន ២: លក្ខខណ្ឌច្រើនជាមួយអូបូឡង់លោហហ្សិច +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 +// ជំហានទី 3: លក្ខខណ្ឌសង្ខេបជាមួយអូប៉េរ៉ាទ័រតឺណារី +const votingStatus = userAge >= 18 ? "Can vote" : "Cannot vote yet"; +console.log(`Status: ${votingStatus}`); +``` + +**អ្វីដែលអ្នកត្រូវចងចាំ៖** +- **ប្រើ** អ្នកបម្រើ ternary (`? :`) សម្រាប់លក្ខខណ្ឌពីរជម្រើសងាយស្រួល +- **សរសេរ** លក្ខខណ្ឌមុន បន្ទាប់ជា `?`, បន្ទាប់ជា លទ្ធផលពិត, បន្ទាប់ជា `:`, បន្ទាប់ជា លទ្ធផលមិនពិត +- **អនុវត្ត** លំនាំនេះពេលអ្នកត្រូវចាត់តម្លៃទៅលើលក្ខខណ្ឌ + +```javascript +// ជំហានទី ៤: ដោះស្រាយករណីច្រើនជាក់លាក់ +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"); +} +``` + +**កូដនេះបានសម្រេចរួច៖** +- **ផ្គូផ្គង** តម្លៃអថេរសម្រាប់ករណីជាច្រើនពិសេស +- **ផ្ដុំ** ករណីដែលដូចគ្នា (ថ្ងៃធ្វើការ vs ទីរដូវសៅរ៍-អាទិត្យ) +- **បញ្ជា** សម្ងាត់ស្របតាមការប្រហែលបាន +- **មាន** ករណី `default` ដើម្បីចាប់ករណីមិនរំពឹងទុក +- **ប្រើ** សម្ងាត់ `break` ដើម្បីបញ្ឈប់កូដមិនឲ្យបន្តទៅករណីបន្ទាប់ + +> 💡 **ការប្រៀបធៀបពីពិភពពិត**៖ គិតថា control flow ដូចជាការមាន GPS ដែលមានភាពអត់ធ្មត់ខ្ពស់បំផុតក្នុងពិភពលោកបញ្ចូនអ្នកផ្លូវ។ វាអាចនិយាយថា "បើមានចរាចរណ៍នៅផ្លូវ Main Street សូមទៅផ្លូវល្បឿនវិញ។ បើមានការសំណង់រារាំងផ្លូវល្បឿន សូមសាកល្បងផ្លូវទេសភាព។" កម្មវិធីប្រើលក្ខខណ្ឌដូចគ្នានេះដើម្បីឆ្លើយតបយ៉ាងឆ្លាតវៃទៅស្ថានភាពខុសៗគ្នា ហើយផ្តល់បទពិសោធន៍ល្អបំផុតជាមនុស្សប្រើ។ + +### 🎯 **ពិនិត្យគំនិត៖ ជំនាញគ្រឿងគ្រឹះ** + +**សូមមើលថាអ្នកដំណើរការយ៉ាងម៉េចជាមួយគ្រឿងគ្រឹះ៖** +- តើអ្នកអាចពន្យល់​មាតិកាផ្សេងគ្នារវាងអថេរនិងសម្ងាត់ដោយប្រើពាក្យរបស់អ្នកឯងទេ? +- គិតពីស្ថានភាពពិតដែលអ្នកនឹងប្រើ 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 +``` +✅ **អ្វីដែលនឹងមកជាបន្ទាប់**៖ យើងត្រូវធ្វើការកំសាន្តយ៉ាងខ្លាំងក្នុងការជ្រាបជ្រៅសារមន្ទីរ​នេះខណៈពេលយើងបន្តដំណើរល្អមួយនេះជាមួយគ្នា! សព្វថ្ងៃនេះ គ្រាន់តែលើកទឹកចិត្តអារម្មណ៍របស់អ្នកចំពោះពេលវេលាពិតប្រាកដ។ ជំនាញ និងបច្ចេកទេសជាក់លាក់នឹងឆាប់រឹតតែរឹងនិងសម្រួលដោយធម្មជាតិពេលយើងអនុវត្តជាមួយគ្នា – ខ្ញុំសន្យាថា វានឹងរីករាយជាងដែលអ្នកគិត! + +## ឧបករណ៍ធ្វើការងារ + +ល្អហើយ, នេះជាកន្លែងដែលខ្ញុំមានអារម្មណ៍រំភើបខ្លាំងដែលមិនអាចទប់បាន! 🚀 យើងកំពុងនិយាយអំពីឧបករណ៍ដ៏អស្ចារ្យដែលនឹងធ្វើឲ្យអ្នកមានអារម្មណ៍ថាអ្នកទទួលបានសោភន្តិភាពនៃចរាចរណ៍យន្តហោះឌីជីថលមួយ។ + +អ្នកដឹងថា​គ្រូបោកបាចខ្សែដែកមានកាំបិតដែលត្រូវគ្នាយ៉ាងល្អជាមួយដៃរបស់ពួកគេដែរឬទេ? ឬតើអ្នកអ្នកតន្ត្រីមានហ្គីតាប្រភេទមួយដែលផ្តួលសំឡេងពេលពួកគេចាប់វា? អ្នកអwickរការអភិវឌ្ឍន៍មានឧបករណ៍ផ្ទាល់ខ្លួនដូចជាទាំងនោះ ហើយនេះជាអ្វីដែលនឹងបំផ្លាញចិត្តអ្នក – ភាគច្រើនទាំងនេះមានឥតគិតថ្លៃទាំងស្រុង! + +ខ្ញុំកំពុងរាំឡើងសម្រាប់ចែករំលែកវាជាមួយអ្នក ព្រោះវាបានបំលែងវិធីដែលយើងសាងសង់កម្មវិធី។ យើងនិយាយអំពីជំនួយការសរសេរកូដដែលចលនាដោយ AI ដែលអាចជួយសរសេរកូដអ្នក (ខ្ញុំមិនបានលេងរឿងទេ!), បរិយាកាសខ្សែបាយដែលអាចបង្កើតកម្មវិធីពេញលេញពីកន្លែងណាមួយតាមឥតខ្សោយ Wi-Fi និងឧបករណ៍ស្វែងរកកំហុសដែលមានភាពចวามហ៊ុមដូចជាមានទស្សនៈវិច្ឆ័យ X-ray សម្រាប់កម្មវិធីរបស់អ្នក។ + +ហើយនេះជាផ្នែកដែលនៅតែធ្វើឲ្យខ្ញុំមានកន្ធ្រាក់ទឹកក្តៅ៖ ទាំងនេះមិនមែនជា "ឧបករណ៍សម្រាប់អ្នកចាប់ផ្តើម" ដែលអ្នកអាចលះបង់បាននាពេលក្រោយទេ។ ទាំងនេះជាឧបករណ៍កម្រិតវិជ្ជាជីវៈដដែលដែលអ្នកអភិវឌ្ឍនៅ Google, Netflix និងស្ទូឌីយោ app indie ដែលអ្នកចូលចិត្តកំពុងប្រើនៅពេលនេះ។ អ្នកនឹងមានអារម្មណ៍ថាអ្នកជាអ្នកជំនាញយ៉ាងខ្លាំងដោយប្រើវា! + +```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 +``` +### កម្មវិធីកែសម្រួលកូដ និង IDEs៖ មិត្តភាពឌីជីថលថ្មីរបស់អ្នក + +អញ្ចឹងនិយាយអំពីកម្មវិធីកែសម្រួលកូដ – វាចឹងជាកន្លែងដែលអ្នកនឹងស្រឡាញ់ខ្លាំងក្នុងការស្នាក់នៅ! គិតពួកវាដូចជាកន្លែងស្នាក់នៅផ្ទាល់ខ្លួនដែលអ្នកត្រូវចំណាយពេលភាគច្រើនដើម្បីបង្កើតនិងបរិច្ឆេទច្នៃប្រឌិតឌីជីថលរបស់អ្នក។ + +តែអ្វីដែលដ៏អស្ចារ្យនៅលើកម្មវិធីកែសម្រួលចុងក្រោយគឺ ពួកវាមិនមែនគ្រាន់តែជាកម្មវិធីកែសម្រួលអត្ថបទធម្មតា។ ពួកវាដូចជាមានគ្រូបង្រៀនកូដដ៏ឆ្លាតវៃម្នាក់អង្គុយក្បែរអ្នក24ម៉ោងជារៀងរាល់ថ្ងៃ។ ពួកវាបញ្ចេញកំហុសមុនពេលអ្នកសង្កេតឃើញ វាស្នើសុំកែលំអរដែលធ្វើឱ្យអ្នកមើលទៅឆ្លាត បង្រៀនអំពីអ្វីដែលកូដនីមួយៗធ្វើ ហើយក៏មាននរណាមួយអាចទស្សនាថាអ្នកកំពុងសរសេរអ្វី ហើយផ្តល់ដំណោះស្រាយសម្រាប់បញ្ចប់គំនិតរបស់អ្នក! + +ខ្ញុំចាំបានពេលប្រាថ្នាដំបូងរបស់ auto-completion – ខ្ញុំដូចជាកំពុងរស់នៅក្នុងអនាគត។ អ្នកចាប់ផ្តើមសរសេរអ្វីមួយ ហើយកម្មវិធីកែសម្រួលនោះនិយាយថា "សូម្បីតែក្រោមមនុស្សកំពុងគិតអំពីមុខងារ​នេះដែលអាចជួយបានអ្វីដែលអ្នកត្រូវការ?" វាដូចជាមិត្តភក្តិអាចអានចិត្តរបស់អ្នកបាននៅក្នុងពេលសរសេរកូដ! + +**តើអ្វីខ្លះធ្វើឱ្យកម្មវិធីកែសម្រួលទាំងនេះអស្ចារ្យ?** + +កម្មវិធីកែសម្រួលទំនើបផ្តល់លក្ខណៈពិសេសជាច្រេីនដើម្បីបង្កើនផលិតភាពរបស់អ្នក៖ + +| លក្ខណៈពិសេស | វាធ្វើអ្វី | ហេតុអ្វីបានជាវាជួយ | +|---------|--------------|--------------| +| **ការផ្ដូរពណ៌នៅក្នុងវេយ្យករណ៍** | ពណ៌ផ្សេងៗសម្រាប់ផ្នែកខុសៗនៃកូដ | ធ្វើឲ្យកូដអាចអានបានងាយនិងរកកំហុសលឿន | +| **បញ្ចូលដោយស្វ័យប្រវត្តិ** | មានការស្នើរកូដពេលអ្នកសរសេរ | ល្បឿនខ្ពស់និងកាត់បន្ថយកំហុសវាយអក្សរ | +| **ឧបករណ៍ស្វែងរកកំហុស** | ជួយរកនិងដោះស្រាយកំហុស | រក្សាពេលវេលាការស្វែងរកកំហុសបានជាច្រើនម៉ោង | +| **ផ្នែកបន្ថែម** | បន្ថែមមុខងារពិសេស | បង្រៀនកម្មវិធីរបស់អ្នកសម្រាប់បច្ចេកវិទ្យាទាំងឡាយ | +| **ជំនួយការជាមួយ 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/)** (មានតម្លៃ, ឥតគិតថ្លៃសម្រាប់សិស្ស) +- ឧបករណ៍ស្វែងរកកំហុស និងសាកល្បងកម្រិតខ្ពស់ +- ការសរសេរកូដវៃឆ្លាត +- ជំនួយគ្រប់គ្រងកំណែទំរង់ក្នុងខ្លួន + +**IDEs បើកមេឃ** (តំលៃផ្សេងៗ) +- [GitHub Codespaces](https://github.com/features/codespaces) - Visual Studio Code ពេញលេញនៅក្នុងប្រាវស័រ +- [Replit](https://replit.com/) - ល្អសម្រាប់រៀននិងចែករំលែកកូដ +- [StackBlitz](https://stackblitz.com/) - ការអភិវឌ្ឍន៍បណ្តាញពេញលេញភ្លាមៗ + +> 💡 **មួកចាប់ផ្ដើម**៖ ចាប់ផ្ដើមជាមួយ Visual Studio Code – វាឥតគិតថ្លៃ ប្រើគ្រប់ជ្រុងប្រាជ្ញានៃឧស្សាហកម្ម ហើយមានសហគមន៍ធំទូលាយបង្កើតមេរៀននិងផ្នែកបន្ថែមជួយ។ + +### កម្មវិធីរុករកបណ្ដាញ៖ ហេដ្ឋារចនាសម្រង់ពិសេសរបស់អ្នក + +ល្អហើយ សូមរៀបចំចិត្តឲ្យភ្ញាក់ផ្អើលឡើងទាំងស្រុង! អ្នកដឹងថាអ្នកកំពុងប្រើកម្មវិធីរុករកដើម្បីរុករកបណ្តាញសង្គម និងមើលវីដេអូមែនទេ? ប៉ុន្តែកម្មវិធីនោះបានលាក់សារព័ត៌មាននៃមន្ទីរពិសោធន៍អភិវឌ្ឍន៍ដ៏អស្ចារ្យមួយទាំងមូល ដែលរង់ចាំឲ្យអ្នករកឃើញ! + +រាល់ពេលដែលអ្នកចុចមុនបង្អួចវេបសាយហើយជ្រើសរើស "Inspect Element" អ្នកកំពុងបើកពិភពដែលមិនគួរជឿនៃឧបករណ៍អភិវឌ្ឍដែលមានថាមពលខ្លាំងជាងកម្មវិធីថ្លៃថ្លាដែលខ្ញុំធ្លាប់បង់រាប់រយដុល្លារ។ វាដូចជាការរកឃើញថាម៉ាក់ចាស់របស់អ្នកបានលាក់មន្ទីរពិសោធន៍ឆុងផៅមុខជំនាញអ្នកខ​រោចដូចជាផ្ទាំងសម្ងាត់! +ពេលដំបូងដែលនរណាម្នាក់បង្ហាញខ្ញុំអំពី DevTools នៃកម្មវិធីរុករក វាបានចំណាយម៉ោងប្រហែលបីម៉ោងដើម្បីចុចជុំវិញហើយនិយាយថា “រង់ចាំ មើល! វាអាចធ្វើបានដែរ​ឬ?!” អ្នកអាចកែប្រែគេហទំព័រណាមួយបានជាល real-time មើលឃើញច្បាស់ថាអ្វីៗត្រូវបានផ្ទុកលឿនប៉ុណ្ណា ទៀតទៀតអាចសាកល្បងមើលវេបសាយអ្នកនៅលើឧបករណ៍ផ្សេងៗ ហើយក៏អាចដោះស្រាយបញ្ហា JavaScript ដូចជាអ្នក​ជំនាញពេញលេញ។ វាគឺជារឿងដែលធ្វើឲ្យមានការភ្ញាក់ផ្អើលជាបំផុត! + +**សូមមើលហេតុผลដែលកម្មវិធីរុករកគឺជាឧបករណ៍សម្ងាត់របស់អ្នក៖** + +ពេលដែលអ្នកបង្កើតគេហទំព័រ ឬកម្មវិធីវេប អ្នកត្រូវការមើលថាដូចម្តេចវាមានរាង និងឥរិយាបថក្នុងពិភពពិត។ កម្មវិធីរុករកមិនត្រឹមតែបង្ហាញការងាររបស់អ្នកផ្ទាល់ទេ ប៉ុន្តែផ្តល់មតិយោបល់លម្អិតអំពីប្រសិទ្ធិភាព ការចូលប្រើបាន និងបញ្ហាអាចកើតមាន។ + +#### ឧបករណ៍ភាគីអ្នកអភិវឌ្ឍកម្មវិធីរុករក (DevTools) + +កម្មវិធីរុករកទំនើបរួមបញ្ចូលផ្នែកអភិវឌ្ឍន៍ទូលំទូលាយៈ + +| ក្រុមឧបករណ៍ | ការងារដែលវាជួយ | ករណីប្រើប្រាស់ឧទាហរណ៍ | +|---------------|------------------|----------------------------| +| **ការ​ពិនិត្យធាតុ** | មើល និងកែប្រែ HTML/CSS ជាលស real-time | កែសម្រួលស្ទៃក្នុងទ្វារបង្ហាញដើម្បីមើលលទ្ធផលភ្លាមៗ | +| **Console** | មើលសារបញ្ហា និងសាកល្បង 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 ជាមួយធនធាន អ្នកអភិវឌ្ឍន្ទ Microsoft + +> ⚠️ **កុំភ្លេចសាកល្បង**៖ តែងតែសាកល្បងគេហទំព័ររបស់អ្នកនៅក្នុងកម្មវិធីរុករកច្រើនៗ! អ្វីដែលធ្វើបានល្អក្នុង Chrome អាចមើលខុសគ្នានៅ Safari ឬ Firefox។ អ្នកអភិវឌ្ឍពហុជំនាញពិនិត្យនៅក្នុងកម្មវិធីរុករកធំៗទាំងអស់ដើម្បីធានាបទពិសោធន៍ប្រើប្រាស់សរុបកន្លង។ + +### ឧបករណ៍បន្ទាត់បញ្ជា៖ ទ្វារចូលរបស់អ្នកក្នុងការជាមនុស្សវីរបុរសអភិវឌ្ឍន៍ + +មើលទៅ តោះយកពេលក្លាយជាផ្នែកពេញចិត្តស្មោះត្រង់អំពីបន្ទាត់បញ្ជា ព្រោះខ្ញុំចង់ឲ្យអ្នកស្តាប់ពីនរណាម្នាក់ដែលយល់អារម្មណ៍របស់វា ពេលខ្ញុំបានមើលវាលើកដំបូង — របារក្រហមខ្មៅភ្លឺរះក្រហម — ខ្ញុំបានគិតថា "ទេ! មិនចាំបាច់! វាហាក់ដូចជាសុបិន្តភាគទី១៩៨០ និងខ្ញុំមិនមានប្រាជ្ញាគ្រប់គ្រាន់សម្រាប់វានោះទេ!" 😅 + +តែកន្លែងនេះកាលណាខ្ញុំចង់ឲ្យអ្នកដឹងថាខ្ញុំចង់ប្រាប់អ្នកឥឡូវនេះ៖ បន្ទាត់បញ្ជាគឺមិនភ័យសោះទេ — វាជាផ្លូវដែលមានការទំនាក់ទំនងផ្ទាល់មកកុំព្យូទ័ររបស់អ្នក។ គិតវាដូចជាការត្រូវបញ្ជាទិញម្ហូបតាមកម្មវិធីបង្ហាញរូបភាព និងម៉ឺនុយដែលងាយស្រួល ទល់នឹងការចូលទៅភោជនីយដ្ឋានដែលអ្នកចូលចិត្តដែលបំប៉នចេះច្បាប់ហើយអាចធ្វើម្ហូបល្អដោយឲ្យអ្នកនិយាយ "ជំហានឲ្យខ្ញុំភ្ញាក់ផ្អើលទៅជាមួយអ្វីមួយរីករាយ"។ + +បន្ទាត់បញ្ជាគឺជាកន្លែងដែលអ្នកអភិវឌ្ឍន៍ត្រូវការដើម្បីមានអារម្មណ៍ដូចជាគណៈកម្មការតន្ត្រីមួយ។ អ្នកវាយពាក្យបញ្ជាដូចរឿងមន្ត (សូមចាំថាវាជាបញ្ជា ប៉ុន្តែគេមានអារម្មណ៍ជាមន្ត!), ចុច 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 +``` + +**ជំហាននិម្មិតនេះកំពុងធ្វើអ្វី៖** +- **ចាប់ផ្តើម**គម្រោង Node.js ថ្មីដោយប្រើការកំណត់លំនាំ `npm init -y` +- **ដំឡើង** Vite ជាឧបករណ៍សាងសង់ទំនើបសម្រាប់អភិវឌ្ឍន៍លឿន និងបង្កើតផលិតផល +- **បន្ថែម** Prettier សម្រាប់បង្ហាញទ្រង់ទ្រាយកូដដោយស្វ័យប្រវត្តិ និង ESLint សម្រាប់ពិនិត្យគុណភាពកូដ +- **ប្រើ**ស្លាក `--save-dev` ដើម្បីសម្គាល់ថាវាជាឧបករណ៍អភិវឌ្ឍន៍ប៉ុណ្ណោះ + +```bash +# ជំហានទី 3: បង្កើតរចនាសម្ព័ន្ធគម្រោង និងឯកសារ +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://learn.microsoft.com/windows-server/administration/windows-commands/windows-commands)** 💻 - បន្ទាត់បញ្ជាប្រពៃណីWindows + +**macOS:** +- **[Terminal](https://support.apple.com/guide/terminal/)** 💻 -កម្មវិធីបន្ទាត់បញ្ជាបញ្ចូលរួច +- **[iTerm2](https://iterm2.com/)** - បន្ទាត់បញ្ជាដែលបានបង្កើតឡើងជាមួយមុខងារវិជ្ជមាន + +**Linux:** +- **[Bash](https://www.gnu.org/software/bash/)** 💻 - សែល Linux ស្ដង់ដារ +- **[KDE Konsole](https://docs.kde.org/trunk5/en/konsole/konsole/index.html)** - ឧបករណ៍និម្មិតបន្ទាត់បញ្ជាពេញលេញ + +> 💻 = មានតម្លើងរួចក្នុងប្រព័ន្ធប្រតិបត្តិការ + +> 🎯 **ផ្លូវរៀន**៖ ចាប់ផ្តើមជាមួយបញ្ជាយដូចជា `cd` (ផ្លាស់ទីថត), `ls` ឬ `dir` (បញ្ជីឯកសារ), និង `mkdir` (បង្កើតថត)។ អនុវត្តជាមួយបញ្ជាសម្រាប់វេហ្បូរកម្មវិធីទំនើបដូចជា `npm install`, `git status`, និង `code .` (បើកថតបច្ចុប្បន្នក្នុង VS Code)។ ពេលដែលអ្នកចេះល្អ អ្នកនឹងយល់ពីបញ្ជាឡើងជម្រៅ និងបច្ចេកទេសរៀបចំស្វ័យប្រវត្តិ។ + +### ឯកសារណែនាំ៖ មិត្តអ្នករៀនដែលមានស្រាប់របស់អ្នក + +យ៉ាងហោចណាស់ ខ្ញុំចង់ចែករំលែកអាថ៌កំបាំងមួយដែលធ្វើឲ្យអ្នកមានអារម្មណ៍ល្អពេញលេញក្នុងការជាអ្នកចាប់ផ្តើម៖ អ្នកអភិវឌ្ឍមានបទពិសោធន៍ភាគច្រើនចំណាយពេលភាគច្រើនក្នុងការអានឯកសារណែនាំ។ ហើយវាមិនមកពីព្រោះពួកគេទាំងអស់មិនដឹងអ្វីទាំងអស់ទេ — វាជាសញ្ញានៃការបញ្ញា! + +គិតឯកសារណែនាំដូចជាគ្រូបង្រៀនរដូវក្ដៅ សំណាងល្អនិងមានប្រាជ្ញាដែលអាចស្វាគមន៍អ្នកត круглម៉ោង។ បញ្ហាដែលអ្នក មិនដឹងថ្ងៃ ២ ត្រឹមម៉ោង ២ ព្រឹក? ឯកសារណែនាំនៅទីនោះជាមួយកន្លែងទន់ភ្លន់ និងចម្លើយត្រឹមត្រូវដែលអ្នកត្រូវការ។ ចង់រៀនអំពីមុខងារថ្មីៗដែលមនុស្សទាំងអស់និយាយ? ឯកសារណែនាំមានគំនូរសំណុំ និងប្រើប្រាស់អនឡាញ។ កំពុងព្យាយាមយល់ថាហេតុអ្វីអ្វីមួយដំណើរការដូច្នេះ? អ្នកគួរតែដឹងថា ឯកសារណែនាំរួចរាល់ក្នុងការបង្រៀនអ្នកយល់ប្រកបដោយន័យ! + +នេះជារឿងដែលផ្លាស់ប្តូរយោបល់ខ្ញុំសម្រាប់មហិច្ឆតាវេបសាយ៖ ពិភពអភិវឌ្ឍន៍វេបដំណើរយ៉ាងលឿន និងគ្មានមនុស្សណា (ពិតៗគ្មានទេ!) រក្សាទុកអ្វីៗទាំងអស់ក្នុងចម្លងចងចាំ។ ខ្ញុំបានមើលអ្នកអភិវឌ្ឍវ័យជំនាន់ចាស់​ដែលមានបទពិសោធអោយជាង ១៥ ឆ្នាំ មើលសំណុំពាក្យផងដែរ ហើយអ្នកដឹងទេ? វាមិនអាក្រក់ទេ – វាគឺជាអំពើបញ្ញា! វាមិនមែនជារឿងផ្ដេកផ្ដួច ចាំបាច់ចាំបាន ១០០% ទាំងអស់ទេ ប៉ុន្តែជាអំពើដឹងជ្រាបកន្លែងស្វែងរកចម្លើយដែលជាក់ស្តែងបានយ៉ាងលឿន ហើយយល់ពីរបៀបប្រើប្រាស់របស់វា។ + +**កន្លែងដែលអស្ចារ្យត្រូវកើតឡើង៖** + +អ្នកអភិវឌ្ឍវិជ្ជាជីវៈចំណាយពេលយ៉ាងច្រើនក្នុងការអានឯកសារណែនាំ — មិនមែនព្រោះពួកគេទាំងអស់មិនដឹងអ្វីទេ ប៉ុន្តែព្រោះពិភពអភិវឌ្ឍវេបផ្លាស់ប្ដូរយ៉ាងលឿន ដូច្នេះការសិក្សាបន្តគឺទាមទារជានិច្ច។ ឯកសារណែនាំល្អជួយអ្នកយល់បានមិនត្រឹមតែ *របៀប* ប្រើអ្វីមួយទេ ប៉ុន្តែ *ហេតុផល* និង *ពេលវេលា* ត្រូវប្រើវា។ + +#### ឧបករណ៍ឯកសារណែនាំចម្បងៗ + +**[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 +``` +> **ការជ្រាបជ្រាបសប្បាយ**៖ អ្នកអភិវឌ្ឍច្រើនក្នុងសំណុំបឺកឧបករណ៍កូដរបស់ពួកគេប្រហែល ៤០% ពេលវេលា ប៉ុន្តែចំណាយពេលជាច្រើនក្នុងការសាកល្បង រៀន និងដោះស្រាយបញ្ហា។ ការប្រមូលផ្តុំកូដគឺមិនមែនតែក្នុងការសរសេរកូដទេ — ផ្ទុយទៅវិញ វាជាការអភិវឌ្ឍបទពិសោធន៍! + +✅ **អាហារសម្រាប់គិត**៖ នេះជារឿងគួរឱ្យចាប់អារម្មណ៍សម្រាប់គិត — តើយុទ្ធសាស្រ្តសម្រាប់សាងសង់គេហទំព័រ (អភិវឌ្ឍន៍) អាចខុសពីឧបករណ៍សម្រាប់រចនាដូចម្តេច? វាស្រដៀងនឹងការខុសគ្នារវាងស្ថាបត្យករ ដែលរចនាប្រទេសដ៏ស្រស់ស្អាត និងអ្នកតម្កល់ដីដែលបង្កើតវា។ ពួកគេចាំបាច់ ប៉ុន្តែត្រូវការឧបករណ៍ខុសៗគ្នា! វាជារបៀបគិតដែលជួយឲ្យអ្នកមើលឃើញទិដ្ឋភាពធំសម្រាប់របៀបដែលគេហទំព័រមកម្នាក់ទៅជិត។ + +## ការប្រកួតប្រជែង GitHub Copilot Agent 🚀 + +ប្រើរបៀប Agent ដើម្បីបញ្ចប់ការប្រកួតខាងក្រោម៖ + +**ការពិពណ៌នា៖** ស្វែងសម្បទានៃកម្មវិធីកូដរូបភាពទំនើប ឬ IDE ហើយបង្ហាញពីរបៀបវាអាចធ្វើឲ្យការងារអភិវឌ្ឍរបស់អ្នកប្រសើរឡើង។ + +**ការស្នើសុំ៖** ជ្រើសកម្មវិធីកូដរបស់អ្នក ឬ IDE (ដូចជា Visual Studio Code, WebStorm, ឬ IDE នៅលើពពក)។ រាយបញ្ជីលក្ខណៈពិសេសឬបន្ថែមបីដែលជួយអ្នកសរសេរ ដោះស្រាយបញ្ហា ឬថែរក្សាកូដឲ្យមានប្រសិទ្ធភាពជាងមុន។ សម្រាប់នីមួយៗ ផ្តល់ការពិពណ៌ខ្លីពីរបៀបវាផ្តល់ផលប្រយោជន៍ដល់ការងាររបស់អ្នក។ + +--- + +## 🚀 ការប្រកួតប្រជែង + +**យល់ហើយ អ្នកត្រូវស្រោចស្រង់សំណួរដំបូងរបស់អ្នកទេ?** + +ឥឡូវនេះដែលអ្នកមានមូលដ្ឋានដ៏អស្ចារ្យនេះ ខ្ញុំមានការផ្សងព្រមមួយដែល នឹងជួយអ្នកឲ្យឃើញថាពិភពកម្មវិធីសរសេរកូដពិតជាគួរឲ្យចាប់អារម្មណ៍និងមានការផ្សេងគ្នាដូចម្តេច។ ហើយស្តាប់ — វាមិនមែនជាការសរសេរកូដនៅឡើយទេ ដូច្នេះកុំមានសំពាធណា! គិតថាខ្លួនអ្នកជាអ្នកស៊ើបអង្កេតភាសាកម្មវិធី នៅក្នុងការស៊ើបអង្កេតតំបន់ដំបូងដែលគួរឱ្យរំភើប! + +**បេសកកម្មរបស់អ្នក ប្រសិនបើអ្នកព្រមទទួល៖** +1. **ក្លាយជាអ្នកស្វែងរកភាសា**៖ ជ្រើសរើសភាសាកម្មវិធីបីយ៉ាងពី​លក្ខណៈផ្សេងៗ មួយឆ្លើយតបបង្កើតគេហទំព័រ មួយបង្កើតកម្មវិធីចល័ត មួយប្រែប្រួលទិន្នន័យសម្រាប់អ្នកវិទ្យាសាស្ត្រ។ រកឧទាហរណ៍នៃភាសាកម្មវិធីទាំងបីសម្រាប់ការងារងាយៗដូចគ្នាផង។ ខ្ញុំធានាអ្នកនឹងភ្ញាក់ផ្អើលចំពោះភាពខុសគ្នានៃរបៀបបង្ហាញខុសៗគ្នា ទោះបីដំណើរការតែមួយដដែលក៏ដោយ! + +2. **រកមើលរឿងប្រែប្រួលរបស់ពួកវា**៖ តើអ្វីដែលធ្វើឲ្យភាសា​នីមួយៗពិសេស? នេះជាការពិតបែបវីរុស — កម្មវិធីភាសាត្រូវបង្កើតឡើង ព្រោះនរណាមួយគិតថា "ដឹងទេ អាចមានគន្លងល្អប្រសើរជាងនេះសម្រាប់ដោះស្រាយបញ្ហាគ្រាន់តែនេះ"។ អ្នកអាចស្វែងយល់ពីបញ្ហានេះទេ? រឿងខ្លះគួរឲ្យចាប់អារម្មណ៍ពិតជាមិនធម្មតា! + +3. **ជួបប្រជុំសហគមន៍**៖ មើលថា សហគមន៍នៃភាសាបានស្វាគមន៍ អំណរខ្លាំងទេដូចម្តេច។ មានភាសាដែលមានអ្នកអភិវឌ្ឍរាប់លាន ចែករំលែកចំណេះដឹង និងជួយគ្នា ច្រើនឬតិចប៉ុន្តែមានភាពរឹងមាំនិងគាំទ្រខ្លាំង។ អ្នកនឹងរីករាយនឹងមើលស្ទីលជាញឹកញាប់របស់សហគមន៍នោះ! + +4. **តាមចិត្តរបស់អ្នក**៖ ភាសាណាដែលមានអារម្មណ៍ងាយស្រួលសម្រាប់អ្នកឥឡូវនេះ? កុំភ័យក្នុងការជ្រើសរើស “ល្អបំផុត” — តែត្រូវស្តាប់អារម្មណ៍របស់អ្នក! អ្នកមិនមានចម្លើយខុសទេ ហើយអ្នកបានរីករាយក្នុងការស្វែងរកវិញពេលក្រោយ។ + +**ការស៊ើបអង្កេតបន្ថែម**៖ ព្យាយាមស្វែងរក​ឃើញថាគេហទំព័រឬកម្មវិធីធំៗណាដែលបានបង្កើតជាមួយភាសានីមួយៗ។ ខ្ញុំធានាអ្នកនឹងភ្ញាក់ផ្អើលមើលថា Instagram, Netflix ឬហ្គេមចល័តដែលអ្នកមិនអាចផ្អាកលេងបាន វាអាចត្រូវបានបង្កើតដោយភាសាណាដែរ! + +> 💡 **កុំភ្លេច**៖ អ្នកមិនត្រូវក្លាយជាអ្នកជំនាញភាសាណាមួយថ្ងៃនេះទេ។ អ្នកគ្រាន់តែស្វែងយល់បរិស្ថានមុន ដើម្បីសម្រេចចិត្តថាអ្នកចង់ចាប់ផ្តើមនៅណា។ ចំណាយពេលរីករាយជាមួយវា ហើយអោយចិត្តក្មេងរបស់អ្នកដឹកនាំ! + +## មករីករាយជាមួយអ្វីដែលអ្នកបានរកឃើញ! + +លើកដំបូង អ្នកបានទទួលយកព័ត៌មានអស្ចារ្យច្រើនណាស់ថ្ងៃនេះ! ខ្ញុំមានអារម្មណ៍រីករាយពិតប្រាកដ ហើយរំពឹងថាអ្នកមានតម្លៃចំពោះដំណើរដ៏អស្ចារ្យនេះ។ ហើយចងចាំមិនមែនជាការប្រលងដែលអ្នកត្រូវតែបានត្រឹមត្រូវទាំងស្រុងទេ។ វាមានទំនងជាការប្រារព្ធពិធីអបអរសាទរអំពីអ្វីដែលអ្នកបានរៀនពីពិភពដែលគួរឱ្យចាប់អារម្មណ៍នេះ! + +[ចូលប្រឡងបន្ទាប់មេរៀននេះ](https://ff-quizzes.netlify.app/web/) + +## ពិនិត្យឡើងវិញ និងសិក្សាឯករាជ្យ + +**ចំណាយពេលរីករាយជាមួយការស្វែងយល់!** +អ្នកបានគ្របដណ្តប់ច្រើនណាស់ថ្ងៃនេះ ហើយវាជារឿងដែលគួរអោយ गर्व! ឥឡូវនេះជាផ្នែកដែលគួរឱ្យសប្បាយ – ការស្វែងយល់ពីប្រធានបទដែលបង្កើតការចាប់អារម្មណ៍របស់អ្នក។ ចងចាំថា វា​មិនមែន​ជា​ការងារផ្ទះ​ទេ – វាជាការផ្សងព្រេង! + +**ជ្រេ្ជះជ្រែងជាងនេះទៀតនូវអ្វីដែលធ្វើឱ្យអ្នករំភើប៖** + +**អនុវត្តន៍ភាសាកម្មវិធី៖** +- ទៅកាន់គេហទំព័រផ្លូវការរបស់ភាសា ២-៣ ដែលទាក់ទាញចិត្តអ្នក។ រាល់ភាសាម្នាក់មានបុគ្គលិកលក្ខណៈ និងរឿងរ៉ាវផ្ទាល់ខ្លួន! +- សាកល្បងលេងកូដតាមអនឡាញដូចជា [CodePen](https://codepen.io/), [JSFiddle](https://jsfiddle.net/), ឬ [Replit](https://replit.com/). កុំខ្លាចសាកល្បង – អ្នកមិនអាចបំបែកអ្វីក៏បានទេ! +- អានអំពីរបៀបដែលភាសាដែលអ្នកចូលចិត្តបានកើតឡើង។ ទីបំផុត រឿងនិទានដើមផងណាស់គឺគួរឲ្យចាប់អារម្មណ៍ និងជួយឲ្យអ្នកយល់ដឹងថាហេតុអ្វីភាសានីមួយៗធ្វើការបែបនេះ។ + +**ធ្វើឲ្យស្រួលចិត្តជាមួយឧបករណ៍ថ្មី៖** +- ទាញយក Visual Studio Code ប្រសិនបើអ្នកមិនទាន់មានទេ – វាឥតគិតថ្លៃ និងអ្នកនឹងស្រលាញ់វា! +- ចំណាយពេលប៉ុន្មាននាទីស្វែងរក Extensions នៅក្នុង marketplace។ វាដូចជាហាង app សម្រាប់កម្មវិធីកូដរបស់អ្នក! +- បើក Developer Tools របស់ browser របស់អ្នក ហើយចុចលេង។ កុំបារម្ភអំពីការយល់ដឹងគ្រប់យ៉ាង – តែសូមស្គាល់អ្វីដែលមាននៅទីនោះ។ + +**ចូលរួមជាផ្នែកក្រុមសហគមន៍៖** +- តាមដានសហគមន៍អ្នកអភិវឌ្ឍមួយចំនួននៅ [Dev.to](https://dev.to/), [Stack Overflow](https://stackoverflow.com/), ឬ [GitHub](https://github.com/). សហគមន៍កម្មវិធីកំពុងស្វាគមន៍អ្នកថ្មីដ៏សប្បាយរីករាយ! +- មើលវីដេអូបណ្តុះបណ្តាលកូដសម្រាប់អ្នកចាប់ផ្តើមនៅ YouTube. មានអ្នកបង្កើតល្អៗជាច្រើន ដែលចាំបានពីអារម្មណ៍នៃការចាប់ផ្តើម។ +- ពិចារណាចូលរួមជាមួយការជួបជុំក្នុងតំបន់ឬសហគមន៍អនឡាញ។ ជំនាញមិនមែនអត់គ្នា អ្នកអភិវឌ្ឍស្រឡាញ់ការជួយអ្នកថ្មី! + +> 🎯 **សូមស្តាប់ ខ្ញុំចង់ឲ្យអ្នកចងចាំ**៖ អ្នកមិនត្រូវរីកចម្រើនជាជំនាញកូដរហ័សទេ! ឥឡូវនេះ អ្នកកំពុងស្គាល់ភពលោកថ្មីដ៏អស្ចារ្យដែលអ្នកនឹងចូលរួម។ សូមចំណាយពេលរបស់អ្នក រីករាយនឹងការផ្សងព្រេង ហើយចងចាំថា – អ្នកអភិវឌ្ឍម្នាក់ៗដែលអ្នកគោរព គឺធ្លាប់អង្គុយនៅត្រង់កន្លែងដែលអ្នកកំពុងនៅពេលនេះ ដើម្បីមានក្តីរំភើប និងខ្លះៗអាចនឹកស្មារតីច្រើន។ នេះជារឿងធម្មតា និងមានន័យថាអ្នកកំពុងធ្វើបានត្រឹមត្រូវ! + +## Assignment + +[Reading the Docs](assignment.md) + +> 💡 **ជំនួយតិចសម្រាប់ការងាររបស់អ្នក**៖ ខ្ញុំចង់ឃើញអ្នកស្វែងរកឧបករណ៍មួយចំនួនដែលយើងមិនទាន់គ្របដណ្តប់ទេ! ដោះលែងកម្មវិធីកែសម្រួល browser និងឧបករណ៍ command line ដែលយើងបានបញ្ចេញរួចហើយ – មានអក្ខរាវិទ្យាមុនការអភិវឌ្ឍដ៏អស្ចារ្យមួយទៀតដែលរង់ចាំការស្វែងរក។ សូមស្វែងរកឧបករណ៍ដែលបានថែរក្សាទាញយក និងមានសហគមន៍រស់រវើក និងជួយគ្នា (ទូទៅមានមេរៀនល្អបំផុត និងមនុស្សគាំទ្រល្អបំផុតទស្សនាថាត្រូវការជំនួយ)។ + +--- + +## 🚀 អធិភាពដំណើរការកម្មវិធីរបស់អ្នក + +### ⚡ **អ្វីដែលអ្នកអាចធ្វើបានក្នុង ៥ នាទីខាងមុខ** +- [ ] គូសទុកគេហទំព័រភាសាកម្មវិធី ២-៣ ដែលទាក់ទាញអ្នក +- [ ] ទាញយក Visual Studio Code ប្រសិនបើអ្នកមិនទាន់មានទេ +- [ ] បើក Developer Tools របស់ browser (F12) និងចុចលេងគេហទំព័រណាមួយ +- [ ] ចូលរួមជាមួយសហគមន៍កម្មវិធីមួយ (Dev.to, Reddit r/webdev, ឬ Stack Overflow) + +### ⏰ **អ្វីដែលអ្នកអាចបំពេញបានក្នុង​មួយម៉ោងនេះ** +- [ ] បញ្ចប់ការប្រលងបន្ទាប់មកកម្មវិធី ហើយពិចារណាពីចម្លើយរបស់អ្នក +- [ ] ដំឡើង VS Code ជាមួយផ្នែកបន្ថែម GitHub Copilot +- [ ] សាកល្បងឧទាហរណ៍ "Hello World" ក្នុងភាសាកម្មវិធី ២ ផ្សេងគ្នាផ្សេងគ្នាផ្សេងគ្នាផ្សេងគ្នាភាសាក្នុងអនឡាញ +- [ ] មើលវីដេអូ "មួយថ្ងៃជាអ្នកបង្កើតកម្មវិធី" នៅ YouTube +- [ ] ចាប់ផ្តើមស្វែងរករឿងរ៉ាវភាសាកម្មវិធីរបស់អ្នក (ពីលំហាត់) + +### 📅 **ការផ្សងព្រេងរយៈសប្តាហ៍របស់អ្នក** +- [ ] បញ្ចប់ការងារនិងស្វែងរកឧបករណ៍អភិវឌ្ឍ ៣ ថ្មី +- [ ] តាមដានអ្នកអភិវឌ្ឍ ៥ នាក់ ឬគណនីកម្មវិធីនៅបណ្តាញសង្គម +- [ ] ព្យាយាមបង្កើតអ្វីមួយតូចនៅ CodePen ឬ Replit (សូម្បីតែនិយាយ "Hello, [Your Name]!") +- [ ] អានអត្ថបទប្លុកអ្នកអភិវឌ្ឍម្នាក់ពីគោលដៅកម្មវិធីរបស់គាត់ +- [ ] ចូលរួមជួបមិត្តក្នុងការប្រជុំវីដេអូឬមើលការនិយាយកម្មវិធី +- [ ] ចាប់ផ្តើមរៀនភាសាកម្មវិធីដែលអ្នកជ្រើសរើសជាមួយមេរៀនអនឡាញ + +### 🗓️ **ការបម្លែងរយៈខែរបស់អ្នក** +- [ ] បង្កើតគម្រោងតូចដំបូងរបស់អ្នក (ច្រើនពេកគេហទំព័រពេញលេញក៏រាប់បញ្ចូល!) +- [ ] ចូលរួមក្នុងគម្រោង open-source (ចាប់ផ្តើមពីការជួសជុលឯកសារ) +- [ ] ក្រូវជាម៉ង់ទ័រអ្នកដែលទើបចាប់ផ្តើមដំណើរការកម្មវិធី +- [ ] បង្កើតគេហទំព័រផ្ទាល់ខ្លួនរបស់អ្នក ជាអ្នកអភិវឌ្ឍ +- [ ] ភ្ជាប់ជាមួយសហគមន៍អ្នកអភិវឌ្ឍក្នុងតំបន់ ឬក្រុមសិក្សា +- [ ] ចាប់ផ្តើមផែនការពហិការអនាគតនៃការរៀនរបស់អ្នក + +### 🎯 **ការត្រួតពិនិត្យចុងក្រោយ** + +**មុនពេលអ្នកបន្ត សូមចំណាយពេលខ្លីអបអរសាទរ៖** +- តើអ្វីមួយទាក់ទងកម្មវិធីដែលធ្វើឱ្យអ្នករំភើបថ្ងៃនេះ? +- តើឧបករណ៍ ឬគោលន័យណាមួយដែលអ្នកចង់ស្វែងរកជាមុនដំបូង? +- តើអ្នកមានអារម្មណ៍ដូចម្តេចនៅពេលចាប់ផ្តើមដំណើរការកម្មវិធីនេះ? +- តើសំណួរណាមួយដែលអ្នកចង់សួរអ្នកអភិវឌ្ឍឥឡូវនេះ? + +```mermaid +journey + title ឈានដល់ភាពទទួលខុសត្រូវរបស់អ្នក + section ថ្ងៃនេះ + គំនិតចង់ដឹង: 3: You + មិនទាន់ដឹង: 4: You + រំភើប: 5: You + section សប្តាហ៍នេះ + កំពុងស្ទង់មើល: 4: You + កំពុងរៀន: 5: You + កំពុងភ្ជាប់ទំនាក់ទំនង: 4: You + section ខែក្រោយ + កំពុងសាងសង់: 5: You + មានទំនុកចិត្ត: 5: You + ជួយអ្នកផ្សេង: 5: You +``` +> 🌟 **ចងចាំ**៖ អ្នកជំនាញទាំងអស់ធ្លាប់ជាអ្នកចាប់ផ្តើម។ អ្នកអភិវឌ្ឍជាន់ខ្ពស់ទាំងឡាយធ្លាប់មានអារម្មណ៍ដូចអ្នកឥឡូវនេះ – រំភើប អាចមានបន្តិចបន្តួចស្ទើរច្របូកច្របល់ និងចាប់អារម្មណ៍ថាអ្វីទៅទៅបាន។ អ្នកកំពុងនៅក្នុងក្រុមដ៏អស្ចារ្យ ហើយដំណើរនេះនឹងអស្ចារ្យណាស់។ សូមស្វាគមន៍មកភពលោកដ៏អស្ចារ្យនៃកម្មវិធី! 🎉 + +--- + + +**ការសម្គាល់**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលយើងខិតខំសម្រាប់ភាពត្រឹមត្រូវ សូមយល់ឲ្យបានថាការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុសឬភាពចម្លងមិនពិតប្រាកដ។ ឯកសារដើមជាភាសាគោលគួរត្រូវបានគេចាត់ទុកជាធនធានច្បាស់លាស់។ សម្រាប់ព័ត៌មានសំខាន់ ការបកប្រែដោយអ្នកជំនាញមនុស្សត្រូវបានកាន់តែផ្តល់អាទិភាព។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការប្រែប្រួលមិនត្រឹមត្រូវណាមួយដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/1-getting-started-lessons/1-intro-to-programming-languages/assignment.md b/translations/km/1-getting-started-lessons/1-intro-to-programming-languages/assignment.md new file mode 100644 index 000000000..95d6341a4 --- /dev/null +++ b/translations/km/1-getting-started-lessons/1-intro-to-programming-languages/assignment.md @@ -0,0 +1,69 @@ +# Assignment: ស្វែងយល់អំពីឧបករណ៍អភិវឌ្ឍន៍វែបទំនើប + +## Instructions + +ប្រព័ន្ធអភិវឌ្ឍន៍វែបមានឧបករណ៍ជាច្រើនដែលមានលក្ខណៈឯកទេសជួយឲ្យអ្នកអភិវឌ្ឍន៍បង្កើត សាកល្បង និងថែទាំកម្មវិធីបានយ៉ាងមានប្រសិទ្ធភាព។ ភារកិច្ចរបស់អ្នកគឺស្រាវជ្រាវ និងយល់ដឹងអំពីឧបករណ៍ដែលបំពេញជាមួយនឹង那些已涵盖于本课程中的工具。 + +**បេសកកម្មរបស់អ្នក:** ជ្រើសរើស **បីឧបករណ៍** ដែល **មិនបានរៀបរាប់ក្នុងមេរៀននេះ** (ជៀសវាងការជ្រើសរើសកម្មវិធីកែសម្រួលកូដ, កម្មវិធីរុករក ឬឧបករណ៍បញ្ជារដែលបានរាប់បញ្ចូលរួច)។ ផ្តោតលើឧបករណ៍ដែលដោះស្រាយបញ្ហាផ្សេងៗក្នុងចរន្តការងារអភិវឌ្ឍន៍វែបទំនើប។ + +**សម្រាប់ឧបករណ៍នីមួយៗ សូមផ្តល់:** + +1. **ឈ្មោះឧបករណ៍ និងប្រភេទ** (ឧ. "Figma - ឧបករណ៍រចនា" ឬ "Jest - ស៊ុមសាកល្បង") +2. **គោលបំណង និងអត្ថប្រយោជន៍** - ពន្យល់ក្នុង 2-3 ប្រយោគថាហេតុអ្វីអ្នកអភិវឌ្ឍន៍វែបប្រើឧបករណ៍នេះ និងបញ្ហាអ្វីដែលវាដោះស្រាយ +3. **តំណខ្សែឯកសារផ្លូវការសម្រាប់ឧបករណ៍** - ផ្តល់តំណខ្សែទៅឯកសារផ្លូវការឬគេហទំព័រនៃឧបករណ៍ (មិនមែនតំណបណ្ដាញបង្រៀនទេ) +4. **បរិបទពិភពលោកពិត** - រាយការណ៍ពីវិធីមួយឧបករណ៍នេះសមរម្យក្នុងចរន្តការងារអភិវឌ្ឍន៍វិជ្ជាជីវៈ + +## ប្រភេទឧបករណ៍ដែលបានផ្តល់អនុសាសន៍ + +សូមពិចារណាស្វែងយល់ពីឧបករណ៍ពីប្រភេទខាងក្រោម៖ + +| ប្រភេទ | ឧទាហរណ៍ | តួនាទីរបស់វា | +|----------|----------|--------------| +| **ឧបករណ៍បង្កើត** | Vite, Webpack, Parcel, esbuild | បញ្ចូល និងបង្រួមកូដសម្រាប់ផលិតកម្មជាមួយម៉ាស៊ីនម៉ូដអភិវឌ្ឍន៍លឿន | +| **ស៊ុមសាកល្បង** | Vitest, Jest, Cypress, Playwright | ធានាគូដដំណើរការប្រក្រតី និងចាប់កំហុសមុនការចេញផ្សាយ | +| **ឧបករណ៍រចនា** | Figma, Adobe XD, Penpot | បង្កើតគំរូ, ព្រីប្រតូតាយ និងប្រព័ន្ធរចនាដោយរួមចំណែកគ្នា | +| **វេទិការចាប់ផ្តើមផ្សាយ** | Netlify, Vercel, Cloudflare Pages | អភិរក្ស និងចែកចាយគេហទំព័រជាមួយ CI/CD ស្វ័យប្រវត្តិ | +| **ការគ្រប់គ្រងកំណែ** | GitHub, GitLab, Bitbucket | គ្រប់គ្រងការផ្លាស់ប្តូរកូដ, ការសហការហើយចរន្តការងារ | +| **ស៊ុម CSS** | Tailwind CSS, Bootstrap, Bulma | លឿនបំផុតរចនាស្ទាយជាមួយបណ្ណាល័យក្រុមភាពបំពាក់រួចរាល់ | +| **អ្នកគ្រប់គ្រងកញ្ចប់** | npm, pnpm, Yarn | ដំឡើង និងគ្រប់គ្រងបណ្ណាល័យកូដ និងការពឹងផ្អែក | +| **ឧបករណ៍គ្រប់គ្រងការចូលដំណើរការ** | axe-core, Lighthouse, Pa11y | សាកល្បងរចនាបានរួមចូល និងគោរពតាម WCAG | +| **អភិវឌ្ឍ API** | Postman, Insomnia, Thunder Client | សាកល្បង និងចេញផ្សាយឯកសារសម្រាប់ API ក្នុងដំណើរការ | + +## ទម្រង់តម្រូវការ + +**សម្រាប់ឧបករណ៍នីមួយៗ៖** +``` +### [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] +``` + +## គោលនយោបាយគុណភាព + +- **ជ្រើសរើសឧបករណ៍នាពេលបច្ចុប្បន្ន**: ជ្រើសឧបករណ៍ដែលត្រូវបានថែរក្សាដោយសកម្ម និងប្រើប្រាស់យ៉ាងទូលំទូលាយនៅឆ្នាំ ២០២៥ +- **ផ្តោតលើតម្លៃ**: ពន្យល់អត្ថប្រយោជន៍ជាក់លាក់មិនមែនត្រឹមតែអ្វីដែលឧបករណ៍ធ្វើបានទេ +- **បរិបទវិជ្ជាជីវៈ**: ការពិចារណាឧបករណ៍ដែលក្រុមអភិវឌ្ឍន៍ប្រើ មិនមែនត្រឹមតែអ្នកចូលចិត្តផ្ទាល់ខ្លួន +- **ជម្រើសចម្រុះ**: ជ្រើសឧបករណ៍ពីប្រភេទផ្សេងៗដើម្បីបង្ហាញភាពសម្ពាធនៃបរិយាកាស +- **សម័យទំនើប**: ផ្តល់អាទិភាពឧបករណ៍ដែលសមរម្យនឹងនិន្នាការអភិវឌ្ឍន៍វែបនិងអនុវត្តល្អបំផុតបច្ចុប្បន្ន + +## ក្រមពិនិត្យ + +| ល្អឥតខ្ចោះ | ល្អ | តម្រូវការកែលម្អ | +|-----------|------|-------------------| +| **ពន្យល់យ៉ាងច្បាស់ថាហេតុអ្វីអ្នកអភិវឌ្ឍន៍ប្រើឧបករណ៍នីមួយៗ និងបញ្ហាអ្វីវាដោះស្រាយ** | **ពន្យល់អ្វីដែលឧបករណ៍ធ្វើប៉ុន្តែមិនបានធ្វើឲ្យមានបរិបទអំពីតម្លៃ** | **រាយឈ្មោះឧបករណ៍ប៉ុណ្ណោះគ្មានការពន្យល់គោលបំណង ឬអត្ថប្រយោជន៍** | +| **ផ្តល់តំណខ្សែឯកសារផ្លូវការសម្រាប់ឧបករណ៍ទាំងអស់** | **ផ្តល់តំណបណ្តាញផ្លូវការច្រើនប៉ុន្តែមាន 1-2 តំណបណ្ដាញបង្រៀន** | **ពឹងផ្អែកគេហទំព័របង្រៀនច្រើនជាងឯកសារផ្លូវការ** | +| **ជ្រើសឧបករណ៍ថ្មីដែលប្រើប្រាស់ដោយវិជ្ជាជីវៈពីប្រភេទចម្រុះ** | **ជ្រើសឧបករណ៍ល្អ ប៉ុន្តែមានប្រភេទកំណត់** | **ជ្រើសឧបករណ៍ចាស់ ឬតែពីប្រភេទតែមួយ** | +| **បង្ហាញភាពយល់ដឹងពីរបៀបដែលឧបករណ៍រួមចំណែកក្នុងចរន្តការងារ** | **បង្ហាញភាពយល់ដឹងខ្លះតិចពីបរិបទវិជ្ជាជីវៈ** | **ផ្ដោតតែនៅលើលក្ខណៈឧបករណ៍ដោយគ្មានបរិបទការងារ** | + +> 💡 **យុទ្ធសាស្ត្រ​ស្រាវជ្រាវ**៖ ស្វែងរកឧបករណ៍ដែលបង្ហាញក្នុងការជ្រើសរើសការងារអ្នកអភិវឌ្ឍន៍វែប ពិនិត្យការស្ទង់មតិអ្នកអភិវឌ្ឍន៍ល្បីៗ ឬស្វែងរកឯកសារពឹងផ្អែកដែលប្រើដោយគម្រោង open-source ដែលមានជោគជ័យនៅលើ GitHub! + +--- + + +**ការព្រមាន**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែកម្មវិធី AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខិតខំសំរាប់ភាពត្រឹមត្រូវ សូមចងចាំថា ការបកប្រែដោយស្វ័យប្រវត្តិអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមក្នុងភាសាទីជាតិគួរត្រូវបានគិតថាជាមធ្យោបាយដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ៗ ការបកប្រែដោយអ្នកជំនាញមនុស្សត្រូវបានណែនាំ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសប្រកបដោយបញ្ហាដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/1-getting-started-lessons/2-github-basics/README.md b/translations/km/1-getting-started-lessons/2-github-basics/README.md new file mode 100644 index 000000000..85d15337d --- /dev/null +++ b/translations/km/1-getting-started-lessons/2-github-basics/README.md @@ -0,0 +1,769 @@ +# ការណែនាំអំពី GitHub + +សួស្ដី អ្នកអភិវឌ្ឍន៍នាពេលអនាគត! 👋 តើអ្នករៀបចំខ្លួនរួចហើយដើម្បីចូលរួមជាមួយអ្នកសរសេរកូដលើលោករាប់លាននាក់ទេ? ខ្ញុំរីករាយចិត្តណាស់ក្នុងការណែនាំអ្នកទៅកាន់ GitHub – គិតថាវាគឺជាវេទិកាសង្គមសម្រាប់អ្នកកម្មវិធី ដែលជំនួសការចែករំលែករូបថតអាហារពេលត្រង់នេះយើងចែករំលែកកូដ និងសាងសង់របស់អស្ចារ្យៗរួមគ្នា! + +អ្វីដែលធ្វើឲ្យខ្ញុំភ្ញាក់ផ្អើលខ្លាំងគឺ៖ ពាក្យសម្រាប់កម្មវិធីទូរស័ព្ទក្នុងហត្ថរបស់អ្នក គេហទំព័រទាំងអស់ដែលអ្នកទស្សនា និងសម្ភារៈភាគច្រើនដែលអ្នកនឹងរៀនប្រើសាងសង់ឡើងដោយក្រុមអ្នកអភិវឌ្ឍន៍ប្រើប្រាស់វេទិកាដូច GitHub។ កម្មវិធីតន្ត្រីដែលអ្នកចូលចិត្ត? មានមនុស្សដូចអ្នកបានចូលរួមក្នុងវា។ ហ្គេមដែលអ្នកមិនអាចដាក់ចេញបាន? ច្បាស់ណាស់ គឺប្រហែលជាបានសាងសង់ជាមួយការសហការរបស់ GitHub។ ហើយឥឡូវនេះ អ្នកនឹងរៀនពីរបៀបចូលរួមជាសមាជិកសហគមន៍ដ៏អស្ចារ្យនោះ! + +ខ្ញុំដឹងថាវាអាចមើលទៅស្មុគស្ស្មាញពីដំបូង – ពីព្រោះខ្ញុំចាប់ផ្តើមបានមើលទំព័រ GitHub ដំបូងរបស់ខ្ញុំហើយគិតថា "អ្វីទៅនេះ?" ប៉ុន្តែអ្វីដែលចង់ប្រាប់គឺ អ្នកអភិវឌ្ឍន៍រាល់នាក់បានចាប់ផ្តើមនៅចំណុចដែលអ្នកស្ថិតនៅឥឡូវនេះ។ នៅចុងบทเรียนនេះ អ្នកនឹងមានឃ្លាំង GitHub ផ្ទាល់ឯងមួយ (គិតថាវាជាកន្លែងបង្ហាញគម្រោងផ្ទាល់ខ្លួនលើបណ្ដាញ) ហើយអ្នកនឹងចេះរក្សាទុក កែកូដរបស់អ្នក ចែករំលែកវាជាមួយអ្នកដទៃ និងចូលរួមក្នុងគម្រោងដែលមនុស្សរាប់លានគេប្រើ។ + +យើងនឹងធ្វើដំណើរនេះរួមគ្នា មួយជំហានក្នុងមួយ។ មិនប្រញាប់មិនខកចិត្តទេ – រស់នៅជាមួយខ្ញុំ និងឧបករណ៍ដ៏អស្ចារ្យដែលនឹងក្លាយជាមិត្តល្អថ្មីរបស់អ្នក! + +![Intro to GitHub](../../../../translated_images/km/webdev101-github.8846d7971abef6f9.webp) +> Sketchnote ពី [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 +``` +## សំណួរពីមុនថ្នាក់រៀន +[សំណួរពីមុនថ្នាក់រៀន](https://ff-quizzes.netlify.app) + +## ការណែនាំ + +មុនពេលយើងចូលទៅក្នុងអ្វីដែលគួរឲ្យរំភើប ពួកយើងត្រូវតែរៀបចំកុំព្យូទ័ររបស់អ្នកសម្រាប់មន្តស្នូល GitHub! នឹកឃើញវាដូចការរៀបចំឧបករណ៍គំនូរ មុនបង្កើតស្នាដៃមួយ – ការមានឧបករណ៍ត្រឹមត្រូវធ្វើឲ្យអ្វីៗរលូន និងសប្បាយចិត្តជាងមុន។ + +ខ្ញុំនឹងដឹកនាំអ្នកតាមជំហានរាល់ជំហាន ដោយខ្ញុំសន្យាថាវានៅក្រោមកម្រិតភ័យខ្លាចដូចមើលពីដំបូង។ ប្រសិនបើអ្វីមិនចាប់មានន័យភ្លាមៗ នោះគឺធម្មតាទេ! ខ្ញុំនឹកឃើញខ្លួនឯងពេលរៀបចំបរិវេណអភិវឌ្ឍន៍ដំបូងហើយមានអារម្មណ៍ដូចកំពុងអាន hieroglyphics ពីអតីតកាល។ អ្នកអភិវឌ្ឍន៍រាល់នាក់មានអារម្មណ៍ដូចអ្នកឥឡូវនេះ ដោយសង្ស័យថា ពួកគេខំប្រឹងត្រឹមត្រូវឫទេ។ ប្លង់ល្បង់៖ បើអ្នកនៅទីនេះកំពុងរៀន អ្នកមានភាពត្រឹមត្រូវហើយ! 🌟 + +ក្នុងមេរៀននេះ យើងនឹងគ្របដណ្តប់៖ + +- ការតាមដានការងារដែលអ្នកធ្វើលើម៉ាស៊ីនរបស់អ្នក +- ការធ្វើការជាមួយគម្រោងជាមួយអ្នកដទៃ +- របៀបចូលរួមនៅក្នុងកម្មវិធីម៉ាស៊ីនកូដឯករាជ្យ + +### អ្វីដែលត្រូវមានជាមុន + +មកត្រៀមកុំព្យូទ័ររបស់អ្នកសម្រាប់មន្តស្នូល GitHub! កុំបារម្ភ – ការរៀបចំនេះគឺត្រូវធ្វើតែមួយលើក​ប៉ុណ្ណោះ ហើយបន្ទាប់មក អ្នកនឹងរួចរាល់សម្រាប់ដំណើរការសរសេរកូដរបស់អ្នកទាំងមូល។ + +ឥឡូវនេះ តោះចាប់ផ្តើមពីមូលដ្ឋាន! មុនដំបូង ត្រូវពិនិត្យមើលថា Git មាននៅលើកុំព្យូទ័ររបស់អ្នករួចហើយឬនៅ។ Git គឺដូចជាជំនួយការដ៏វៃឆ្លាតម្នាក់ដែលចងចាំគ្រប់ការផ្លាស់ប្តូររបស់អ្នកផ្នែកកូដ – ល្អជាងចុច Ctrl+S រាល់ពីរវិនាទី (យើងទាំងអស់បានធ្វើហើយ!). + +មកមើលថា Git ត្រូវបានដំឡើងរួចដោយវាយពាក្យបញ្ជានេះក្នុង terminal របស់អ្នក៖ +`git --version` + +បើ Git មិនមាននៅទីនោះទេសូមកុំបារម្ភ! ចូលទៅកាន់ [download Git](https://git-scm.com/downloads) ហើយទាញយកវា។ បន្ទាប់ពីដំឡើងរួច យើងត្រូវណែនាំ Git ដល់អ្នកឲ្យឆ្ងាយថាគឺអ្នកជា៖ + +> 💡 **ការកំណត់ជាលើកដំបូង**៖ ពាក្យបញ្ជានេះប្រាប់ Git ថាអ្នកជានរណា។ ព័ត៌មាននេះនឹងភ្ជាប់ជាមួយការបញ្ចូលផ្សេងៗ ដែលអ្នកធ្វើ ដូច្នេះជ្រើសរើសឈ្មោះ និងអ៊ីមែលដែលអ្នកធ្វើមិនអូនចិត្តធ្វើការចែករំលែកជាសាធារណៈ។ + +```bash +git config --global user.name "your-name" +git config --global user.email "your-email" +``` + +ដើម្បីពិនិត្យមើលថា Git ត្រូវបានកំណត់រួចហើយ អ្នកអាចវាយ៖ +```bash +git config --list +``` + +អ្នកក៏ត្រូវមានគណនី GitHub កម្មវិធីកែសម្រួលកូដ (ដូចជា Visual Studio Code) ហើយត្រូវបើក terminal (ឬ command prompt) របស់អ្នកផងដែរ។ + +ចូលទៅកាន់ [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 គឺឈ្មោះល្បីជាងគេ។ + +### ការរៀបចំ + +អ្នកនឹងត្រូវការបណ្ណាល័យកូដនៅលើកុំព្យូទ័រផ្ទាល់ខ្លួនមួយ (laptop ឬ PC) និងឃ្លាំងសាធារណៈមួយលើ GitHub ដែលនឹងឲ្យតំរូវការជាឧទាហរណ៍ថាតើរបៀបចូលរួមក្នុងគម្រោងរបស់អ្នកដទៃ។ + +### ការការពារកូដរបស់អ្នក + +យើងនឹងនិយាយអំពីសុវត្ថិភាពខណៈប៉ុន្តែមិនធ្វើឲ្យអ្នកភ័យខ្លាចទេ! គិតថាផែនការណ៍សុវត្ថិភាពទាំងនេះដូចជាការចាក់សោរឡានឬផ្ទះរបស់អ្នក។ វាជាទម្លាប់សាមញ្ញដែលក្លាយជាស្ថាបត្យកម្មទីពីរហើយការពារការងារលំបាករបស់អ្នក។ + +យើងនឹងបង្ហាញអំពីរបៀបសុវត្ថិភាពទំនើបក្នុងការធ្វើការជាមួយ GitHub ពីដំបូង។ ដូច្នេះ អ្នកនឹងបង្កើតទម្លាប់ល្អដែលនឹងជួយអ្នកក្នុងអាជីពកូដរបស់អ្នក។ + +ពេលធ្វើការជាមួយ GitHub វាជាការសំខាន់ក្នុងការតាមដានផែនការសុវត្ថិភាពដូចខាងក្រោម៖ + +| តំបន់សុវត្ថិភាព | ប្រតិបត្តិការល្អបំផុត | មូលហេតុ | +|---------------|---------------|----------------| +| **ការផ្ទៀងផ្ទាត់** | ប្រើកូនសោ SSH ឬ Personal Access Tokens | ពាក្យសម្ងាត់មានសុវត្ថិភាពតិចជាង ហើយត្រូវដកហូតចេញ | +| **ការផ្ទៀងផ្ទាត់ពីរជា** | បើក 2FA លើគណនី GitHub របស់អ្នក | បន្ថែមស្រទាប់ការការពារគណនី | +| **សុវត្ថិភាពឃ្លាំងកូដ** | កុំធ្វើ commit ព័ត៌មានសំងាត់ | កូនសោ API និងពាក្យសម្ងាត់មិនគួរមាននៅក្នុងឃ្លាំងសាធារណៈ | +| **ការគ្រប់គ្រងការពឹងផ្អែក** | បើក Dependabot សម្រាប់ការអាប់ដេត | ប្រើបច្ចេកវិទ្យានេះយកធានាសុវត្ថិភាពនិងជំនាញលើការពឹងផ្អែករបស់អ្នក | + +> ⚠️ **ការមិនភ្លេចទុកចិត្តសុវត្ថិភាពសំខាន់**៖ មិនធ្វើ commit កូនសោ 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 ធ្វើសម្រាប់កូដរបស់អ្នក! វាដូចជាសៀវភៅកំណត់ថ្ងៃដ៏អស្ចារ្យ ដែលចងចាំគ្រប់អ្វីៗបានទាំងអស់ – គ្រប់ការចុចក្តារចុច ការផ្លាស់ប្តូរ គ្រប់ពេល "ops, វាខូចទាំងអស់" ដែលអ្នកអាចបញ្ចប់វិញភ្លាមៗ។ + +ខ្ញុំនឹងស្មោះថា វាអាចមានអារម្មណ៍ដូចស្ទាក់ស្ទើរពីដំបូង។ នៅពេលខ្ញុំចាប់ផ្តើម ខ្ញុំគិតថា "ហេតុអ្វីខ្ញុំមិនអាចរក្សាទុកឯកសារដូចធម្មតាបាន?" ប៉ុន្តែជឿជាក់លើខ្ញុំ៖ ពេល Git ចាប់អារម្មណ៍ អ្នកនឹងមានពេលដែលគិតថា "តើយ៉ាងដូចម្តេចដែលខ្ញុំបានសរសេរកូដដោយគ្មានវា?" វាដូចជាការរកឃើញអាចហោះបាន ភ្លាមៗបន្ទាប់ពីអ្នកដើរពីជើង! + +ឧទាហរណ៍៖ អ្នកមានថតមួយនៅក្នុងកុំព្យូទ័រផ្ទាល់ខ្លួន ជាមួយគម្រោងកូដមួយ និងចង់ចាប់ផ្តើមតាមដានវាប្រើ git - ប្រព័ន្ធ version control មួយ។ មនុស្សខ្លះប្រៀបធៀបការប្រើ git ដូចជាការសរសេរពាក្យស្នេហ៍ទៅអ្នកមួយរយៈនៅអនាគត។ អ្នកអាចអានសារបញ្ចូល commit របស់អ្នកពីរបីថ្ងៃ ឬសប្តាហ៍ ឬខែក្រោយ ដើម្បីចងក្រងមូលហេតុដែលអ្នកបានធ្វើសេចក្ដីសម្រេច មួយឬ "rollback" អ្វីមួយ – នេះគឺនៅពេលដែលអ្នកសរសេរសារបញ្ចូលល្អ។ + +```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[Fork & Clone] + 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** ហើយសាទរក្នុងការបង្កើត repo ដំបូងរបស់អ្នក! 🎉 + +2. **រុករកទៅថតគម្រោងរបស់អ្នក**។ ឥឡូវនេះបើក terminal របស់អ្នក (កុំបារម្ភ វាមិនគួរភ័យខ្លាចដូចមើលទេ!)។ យើងត្រូវប្រាប់កុំព្យូទ័រថាតើឯកសារគម្រោងរបស់អ្នកនៅឯណា។ វាយបញ្ជា៖ + + ```bash + cd [name of your folder] + ``` + + **អ្វីដែលយើងកំពុងធ្វើ៖** + - យើងកំពុងនិយាយថា "សួរ កុំព្យូទ័រ នាំខ្ញុំទៅថតគម្រោង" + - វាដូចជាការបើកថតមួយលើផ្ទាំងដេស្ខដ៏របស់អ្នក តែយើងកំពុងធ្វើវាយកមួយជាមួយពាក្យបញ្ជា។ + - ជំនួស `[name of your folder]` ជាឈ្មោះពិតនៃថតគម្រោងរបស់អ្នក។ + +3. **បម្លែងថតរបស់អ្នកទៅជាឃ្លាំង Git**។ នេះជាគន្លងនៃមន្តស្នូល! វាយ៖ + + ```bash + git init + ``` + + **នេះហើយជាអ្វីដែលកើតឡើង (វាជារឿងល្អណាស់!):** + - Git បានបង្កើតថត `.git` លាក់ក្នុងគម្រោងរបស់អ្នក – អ្នកមិនអាចមើលឃើញវាប៉ុន្តែវានៅទីនោះ! + - ថតធម្មតារបស់អ្នកឥឡូវជា "repository" ដែលអាចតាមដានការផ្លាស់ប្តូរទាំងអស់បាន។ + - គិតថាវាជាការផ្តល់ថាច់កំលាំងអភិវឌ្ឍទៅថតរបស់អ្នក ដើម្បីចងចាំគ្រប់វាណាមួយ។ + +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. **រៀបចំឯកសាររបស់អ្នកសម្រាប់រក្សាទុក** (ហៅថា "staging")៖ + + ```bash + git add . + ``` + + **អ្វីដែលយើងធ្វើទៅហើយ៖** + - យើងបានប្រាប់ Git ថា "ខ្ញុំចង់បញ្ចូលឯកសារទាំងអស់ក្នុងការសន្សំខាងមុខ" + - `.` មានន័យថា "គ្រប់អ្វីក្នុងថតនេះ" + - ឥឡូវនេះឯកសាររបស់អ្នកត្រូវបាន "staged" ហើយរួចរាល់សម្រាប់ជំហានបន្ទាប់ + + **ចង់ជ្រើសរើសវិញមែនទេ?** អ្នកអាចបញ្ចូលឯកសារពិសេសបានផងដែរ៖ + + ```bash + git add [file or folder name] + ``` + + **ហេតុអ្វីអ្នកអាចចង់ធ្វើបែបនេះ៖** + - ករណីមួយចំនួន អ្នកចង់រក្សាទុកការផ្លាស់ប្តូរដែលទាក់ទងគ្នា + - វាជួយអ្នករៀបចំការងារជាចំណែកត្រឹមត្រូវ + - ងាយស្រួលយល់ថាអ្វីបានផ្លាស់ប្តូរនិងពេលណា + + **ផ្លាស់ប្តូរមានការផ្លាស់ប្តូរឫ?** កុំបារម្ភ! អ្នកអាចយកឯកសារចេញពី staging ដូចខាងក្រោម៖ + + ```bash + # ដកធាតុទាំងអស់ចេញពីការតម្រង + git reset + + # ដកធាតុគឺឯកសារតែមួយចេញពីការតម្រង + git reset [file name] + ``` + + កុំបារម្ភ – វាមិនលុបការងាររបស់អ្នកទេ តែផ្តាច់ឯកសារពីចំណាត់ការអំបោះសម្រាប់រក្សាទុក។ + +6. **រក្សាទុកការងាររបស់អ្នកជាអចិន្រ្តៃយ៍** (ធ្វើ commit ដំបូងរបស់អ្នក!)៖ + + ```bash + git commit -m "first commit" + ``` + + **🎉 អបអរសាទរ! អ្នកបានធ្វើ commit ដំបូងរបស់អ្នកហើយ!** + + **អ្វីកើតឡើង៖** + - Git បានយក "រូបភាព​ថត" នៃឯកសារដែលបាន staged នៅពេលនេះ + - សារបញ្ចូល commit "first commit" បញ្ជាក់ពីពេលកំណត់សន្សំនេះ + - Git បានផ្ដល់លេខសម្គាល់ពិសេសដល់រូបភាពថតនេះ ដូច្នេះអ្នកអាចស្វែងរកវាបានពេលដែលចង់ + - អ្នកបានចាប់ផ្តើមតាមដានប្រវត្តិកម្មវិធីរបស់គម្រោងរបស់អ្នកឱ្យជាផ្លូវការហើយ! + + > 💡 **សារបញ្ចូល commit នៅពេលក្រោយ**៖ សម្រាប់ 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 នោះជាមួយ URL thậtប្រាកដរបស់ឃ្លាំងរបស់អ្នក!) + + **អ្វីដែលយើងធ្វើទៅហើយ៖** + - យើងបានបង្កើតការតភ្ជាប់រវាងគម្រោងក្នុងម៉ាស៊ីនរបស់អ្នក និងឃ្លាំង 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. **របបកូដថ្មីប្រចាំថ្ងៃរបស់អ្នក** (នេះជាកន្លែងដែលវាក្លាយជាវិជ្ជាជីវៈ!): + + ចាប់ពីពេលនេះទៅ តWheneverអ្នកធ្វើការប្រែប្រាស់លើគម្រោងរបស់អ្នក អ្នកមានការតំណើរការរង្វិលបីជំហាននេះងាយៗ៖ + + ```bash + git add . + git commit -m "describe what you changed" + git push + ``` + + **នេះក្លាយជាឈាមដាន់កូដរបស់អ្នក៖** + - បង្កើតការផ្លាស់ប្តូរល្អបំផុតទៅលើកូដរបស់អ្នក✨ + - ដាក់វាទៅក្នុងស្តេចជាមួយ `git add` ("សួរសំណួរពី Git, សូមចាប់អារម្មណ៍សម្រាប់ការផ្លាស់ប្តូរទាំងនេះ!") + - រក្សាវាជាមួយ `git commit` ហើយបញ្ចូលសារ​ពិពណ៌នា (អ្នកនៅពេលអនាគតនឹងអរគុណអ្នក!) + - ចែករំលែកវា​ទៅ​សកលលោក​ប្រើ `git push` 🚀 + - ធ្វើឡើងវិញ និង​ធ្វើម្ដងទៀត – ពិតជាវាជាការសាមញ្ញដូចជាការដកដង្ហើម! + + ខ្ញុំចូលចិត្តការដំណើរការនេះ ព្រោះវាដូចជាមានចំនុចរក្សាទុកច្រើនចំពោះហ្គេមវីដេអូមួយ។ ប្តូរអ្វីដែលអ្នកចូលចិត្តហើយ? Commit វា! ចង់សាកល្បងអ្វីមួយគ្រោះថ្នាក់មែនទេ? មិនបញ្ហា – អ្នកអាចត្រឡប់ទៅ commit ចុងក្រោយរបស់អ្នកពេលដែលមានបញ្ហា! + + > 💡 **ធ្វើតាមគន្លឹះ**: អ្នកក៏អាចចង់ទទួលបានឯកសារ `.gitignore` ដើម្បីបិទមិនអោយឯកសារដែលអ្នកមិនចង់តាមដានបង្ហាញនៅលើ GitHub – ដូចឯកសារសំំណេីសដែលអ្នករក្សាទុកនៅក្នុងថតដូចគ្នា តែគ្មានទីតាំងនៅលើឃ្លាំងសាធារណៈ។ អ្នកអាចរកមើលគំរូសម្រាប់ឯកសារ `.gitignore` បាននៅ [។gitignore templates](https://github.com/github/gitignore) ឬបង្កើតមួយដោយប្រើ [gitignore.io](https://www.toptal.com/developers/gitignore)។ + +### 🧠 **ការត្រួតពិនិត្យ仓ាRepositoryដំបូង៖ តើអ្នកមានអារម្មណ៍យ៉ាងដូចម្តេច?** + +**ចំណាយពេលមួយរយៈ ដើម្បីអបអរសាទរ និងចម្រាញ់មតិយោបល់៖** +- តើអ្នកមានអារម្មណ៍យ៉ាងដូចម្តេចពេលឃើញកូដរបស់អ្នកបង្ហាញនៅលើ 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 + បានបង្កើត Snapshot + end note +``` +> **ចងចាំ**: អ្នកអwickយ័នដែលមានបទពិសោធន៍ខ្លះៗ ក៏អាចភ្លេចបញ្ជាការយ៉ាងម៉ត់ចត់។ ការធ្វើឲ្យដំណើរការនេះក្លាយជា நினាប់ដល់ចិត្តបេះដូង ត្រូវការប្រយ័ត្នធ្វើអនុវត្ត – អ្នកកំពុងធ្វើបានល្អហើយ! + +#### របៀបប្រើ Git ទំនើប + +ពិចារណាទទួលយកការអនុវត្តទំនើបទាំងនេះ៖ + +- **Conventional Commits**: ប្រើទ្រង់ទ្រាយសារប្ដូរដែលមានស្តង់ដារដូចជា `feat:`, `fix:`, `docs:`, ល។ ស្វែងយល់បន្ថែមនៅ [conventionalcommits.org](https://www.conventionalcommits.org/) +- **Atomic commits**: បង្កើត commit ទីមួយមួយដែលតំណាងអោយការផ្លាស់ប្តូរតែមួយគត់ +- **Frequent commits**: commit ជាញឹកញាប់ជាមួយសារ​ពិពណ៌នាជិតស្និទ្ធ មិនមែន commit ធំ និងគ្រាអស់កំឡុងពេលវែង + +#### សារសម្រាប់ commit + +ខ្សែសង្វាក់ចំណងជើង commit Git ល្អ គួរឱ្យបញ្ចប់វាគ្មិនដូចតទៅ៖ +បើយោងទៅលើ វា commit នឹង <ប្រធានបទរបស់អ្នកនៅទីនេះ> + +សម្រាប់ប្រធានបទ សូមប្រើប្រយោគបញ្ជាដែលមានទិសបច្ចុប្បន្ន៖ "change" មិនមែន "changed" ឬ "changes"។\ +ដូចដែលនៅក្នុងប្រធានបទ នៅក្នុងខ្លឹមសារពេញ (ជាជម្រើស) ក៏ប្រើប្រយោគបញ្ជា ទិសបច្ចុប្បន្នផងដែរ។ ខ្លឹមសារគួរឱ្យមានមូលហេតុសម្រាប់ការផ្លាស់ប្តូរនិងផ្ទៀងផ្ទាត់​មើលពីទំលាប់ពីមុន។ អ្នកកំពុងពន្យល់ពី «ហេតុអ្វី» មិនមែន «របៀប»។ + +✅ ចំណាយពេលប៉ុន្មាននាទី ស្វែងរកនៅលើយើង GitHub។ តើអ្នកអាចរកឃើញសារប្ដូរល្អមួយ? តើអ្នកអាចរកឃើញសារប្ដូរបំផុតតិចមួយ? តើព័ត៌មានណាអ្នកគិតថា មានសារៈសំខាន់ និងមានប្រយោជន៍បំផុតក្នុងការបញ្ជូនទៅក្នុងសារប្ដូរមួយ? + +## ធ្វើការជាមួយអ្នកដទៃ (ផ្នែករីករាយ!) + +សូមចូលចិត្តកីឡាក្រវាត់របស់អ្នក ព្រោះនេះជាកន្លែងដែល GitHub ក្លាយជាមហិច្ឆតា ពិតប្រាកដ! 🪄 អ្នកបានទទួលជំនាញគ្រប់គ្រងកូដផ្ទាល់ខ្លួនរួចមកហើយ ប៉ុន្តែឥឡូវនេះយើងកំពុងចូលទៅកាន់ផ្នែកដែលខ្ញុំចូលចិត្តបំផុត – ការសហការជាមួយមនុស្សដ៏អស្ចារ្យពីគ្រប់ជ្រុងជ្រោយពិភពលោក។ + +ស្រមៃឃើញ៖ អ្នកភ្ញាក់ឡើងនៅស្អែក ហើយឃើញថាមនុស្សម្នាក់នៅទូក្យូ បានធ្វើឲ្យកូដរបស់អ្នកកាន់តែប្រសើរទៅរឿងចុងក្រោយពេលអ្នកគេង។ បន្ទាប់មកមនុស្សម្នាក់នៅប៊ែរឡាញ់ បានជួសជុលបញ្ហាដែលអ្នកពិបាក។ វេលាសៀកថ្ងៃត្រង់ អ្នកអភិវឌ្ឍនៅ São Paulo បានបន្ថែមមុខងារមួយដែលអ្នកមិនដែលគិតដល់ទេ។ វានៅមិនមែនគឺវិទ្យាសាស្ត្រសិចទេ – វាគ្រាន់តែជាថ្ងៃអង្គារនៅលើពិភព GitHub! + +អ្វីដែលធ្វើឲ្យខ្ញុំរីករាយជាងគេគឺជំនាញសហការដែលអ្នកកំពុងនឹងរៀន? វាគឺជារបៀបដំណើរការពេញលេញដូចគ្នានៅក្នុងក្រុម Google, Microsoft និង Startup ដែលអ្នកចូលចិត្តប្រើរាល់ថ្ងៃ។ អ្នកមិនគ្រាន់តែជ្រាបឧបករណ៍ស្ងប់ស្ងាត់មួយទេ – អ្នកកំពុងរៀនភាសាផលិតកម្មដែលធ្វើឲ្យពិភពកម្មវិធីទាំងមូលសហប្រតិបត្តិការជាមួយគ្នា។ + +ពិតជាអីចឹង ពេលអ្នកបានស្គាល់អារម្មណ៍ខណៈដែលមានមនុស្សរួមបញ្ចូល pull request ដំបូងរបស់អ្នក អ្នកនឹងយល់ថាហេតុអីអ្នកអភិវឌ្ឍឯកទេសមានចិត្តខ្លាំងចំពោះ open source។ វាដូចជាជាផ្នែកមួយនៃគំរោងក្រុមធំជាងគេបំផុតនិងមានភាពច្នៃប្រឌិតបំផុតនៃពិភពលោក! + +> ទស្សនាវីដេអូ +> +> [![មូលដ្ឋាន Git និង GitHub វីដេអូ](https://img.youtube.com/vi/bFCM-PC3cu8/0.jpg)](https://www.youtube.com/watch?v=bFCM-PC3cu8) + +ហេតុផលសំខាន់ក្នុងការដាក់អ្វីៗនៅលើ GitHub គឺដើម្បីអនុញ្ញាតឲ្យមានការសហការជាមួយអ្នកអភិវឌ្ឍផ្សេងទៀត។ + +```mermaid +flowchart LR + A[🔍 ស្វែងរកគម្រោង] --> B[🍴 បង្កើតការបម្លែង Repository] + B --> C[📥 ពុម្ពចម្លងទៅកាន់ក្នុងតំបន់] + C --> D[🌿 បង្កើតសាខា] + D --> E[✏️ បម្លែង] + E --> F[💾 ភ្ជាប់ការបម្លែង] + F --> G[📤 ជូនសាខា] + G --> H[🔄 បង្កើតសំណើ Pull] + 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** សម្រាប់ការគ្រប់គ្រងគម្រោងរាល់ថ្ងៃជាប្រភេទកំណត់ត្រា​ +- **Branch protection rules** ដើម្បីរឹតបន្តឹងស្តង់ដារកូដគុណភាព + + +ធនធានទាំងនេះនឹងមានប្រយោជន៍ក្នុងការបង្ហាញអ្នកជាមួយក្រុមថ្មីៗ។ លម្អិតเหล่านี้ជារឿយៗជារឿងដែលអ្នកចូលរួមថ្មីៗពិនិត្យមើលមុននឹងមើលកូដរបស់អ្នក ដើម្បីរកមើលថាគម្រោងរបស់អ្នកសមរម្យសម្រាប់ពួកគេចំណាយពេលឬអត់។ + +✅ ឯកសារ README ទោះបីមានពេលវេលាច្រើនក្នុងការរៀបចំ ក៏ពួកវាមិនត្រូវបានថែរក្សាពីអ្នកត្រូវបម្រើការងារច្រើនជារឿយៗទេ។ តើអ្នកអាចរកឃើញឯកសារមួយដែលមានការពិពណ៌នាអែម៉គ្រប់គ្រាន់ទេ? ចំណាំ៖ មានឧបករណ៍ខ្លះៗដែលជួយបង្កើត README ល្អៗ [tools to help create good READMEs](https://www.makeareadme.com/) ដែលអ្នកអាចចង់សាកល្បង។ + +### ភារកិច្ច: បញ្ចូលកូដមួយចំនួន + +ឯកសាររួមចូលជួយឲ្យមនុស្សចូលរួមក្នុងគម្រោង។ វាពន្យល់ពីប្រភេទនៃការរួមចំណែកដែលអ្នកកំពុងស្វែងរក និងរបៀបដំណើរការនេះដំណើរការ។ អ្នករួមចំណែកត្រូវការធ្វើជាដំណាក់កាលជាបន្តបន្ទាប់ ដើម្បីអាចចូលរួមក្នុងឃ្លាំងរបស់អ្នកនៅលើ GitHub៖ + + +1. **Forking your repo** អ្នកប្រហែលជាចង់ឲ្យមនុស្សចូលចិត្ត _fork_ គម្រោងរបស់អ្នក។ Forking មានន័យថាបង្កើតច្បាប់តំណាងនៃឃ្លាំងរបស់អ្នកនៅលើប្រវត្តិរូប GitHub របស់ពួកគេ។ +1. **Clone**។ ពីទីនោះពួកគេនឹង clone គម្រោងទៅម៉ាស៊ីនផ្ទាល់ខ្លួនរបស់ពួកគេ។ +1. **បង្កើតសាខា**។ អ្នកចង់ស្នើឲ្យពួកគេបង្កើត _branch_ មួយសម្រាប់ការងាររបស់ពួកគេ។ +1. **ផ្ដោតការផ្លាស់ប្តូរបស់ពួកគេលើតំបន់មួយ**។ សូមស្នើឲ្យអ្នករួមចំណែកផ្ដោតការចូលរួមរបស់ពួកគេទៅលើរឿងតែមួយម្តងៗ – ដូច្នេះឱកាសក្នុងការអាច _merge_ ការងាររបស់ពួកគេទៅកាន់គម្រោងរបស់អ្នកនឹងខ្ពស់ឡើង។ សូមស្រមៃថាពួកគេបានសរសេរជួសជុល bug មួយ បន្ថែមមុខងារថ្មីមួយ និងធ្វើបច្ចុប្បន្នភាពតេស្តជាច្រើន – ប្រសិនបើអ្នកចង់ ឬ អាចម៉ាសុំអនុវត្តតែកែប្រែពីរចំណែកក្នុងចំណោមបី ឬតែ១ ចំណែកក្នុងចំណោមបី? + +✅ សូមស្រមៃពីสถานการณ์ដែលសាខាមានសារៈសំខាន់ជាងគេក្នុងការសរសេរ និងដឹកជញ្ជូនកូដល្អ។ តើអ្នកអាចគិតឃើញករណីប្រើប្រាស់អ្វីខ្លះ? + +> ចំណាំ សូមជាអ្នកប្តូរដែលអ្នកចង់ឃើញក្នុងពិភពលោក ហើយបង្កើតសាខាសម្រាប់ការងារផ្ទាល់ខ្លួនរបស់អ្នកផងដែរ។ commit មួយណាមួយដែលអ្នកធ្វើ នឹងជា commit នៅលើសាខាដែលអ្នកកំពុង "checked out" ។ ប្រើ `git status` ដើម្បីមើលថាសាខាណា។ + +យើងនឹងរត់តាមរបៀបរួមចំណែកអ្នករួមគ្នា។ សន្និដ្ឋានថាអ្នករួមចំណែកបាន _fork_ និង _clone_ ឃ្លាំងរួចរួមចំណែកហើយ មាន Git repo រួចដើម្បីធ្វើការលើវាបាននៅក្នុងម៉ាស៊ីនផ្ទាល់ខ្លួនរបស់ពួកគេ៖ + +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 ល្អ មិនត្រឹមតែសម្រាប់ខ្លួនអ្នកទេ និងសម្រាប់អ្នកថែរក្សាឃ្លាំងដែលអ្នកជួយផងដែរ។ សូមច្បាស់លាស់អំពីអ្វីដែលអ្នកបានផ្លាស់ប្តូរ! + +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 + ``` + វាបញ្ចូល commit របស់អ្នកលើកំពូលសាខា main ចុងក្រោយ បង្កើតប្រវត្តិនៃរបៀបសំរាប់ជាត្រឡប់មួយ។ + +1. **ផ្ញើការងាររបស់អ្នកទៅ GitHub**។ ផ្ញើការងាររបស់អ្នកទៅ GitHub មានទីបំផុតពីរអ្វី។ ផ្ញើសាខារបស់អ្នកទៅឃ្លាំងរបស់អ្នក ហើយបើក PR (Pull Request) ។ + + ```bash + git push --set-upstream origin [branch-name] + ``` + + ពាក្យបញ្ជាខាងលើបង្កើតសាខានៅលើឃ្លាំង fork របស់អ្នក។ + +### 🤝 **ការត្រួតពិនិត្យជំនាញសហការណ៍: តើអ្នករួចរាល់ធ្វើការជាមួយអ្នកដទៃទេ?** + +**មកមើលថាតើអ្នកមានអារម្មណ៍យ៉ាងដូចម្តេចចំពោះការសហការណ៍៖** +- តើគំនិតរបស់ការរបូត និង pull requests ធ្វើអោយអ្នកយល់ដូចម្តេចឥឡូវនេះ? +- តើមានអ្វីមួយពីការធ្វើការជាមួយសាខាដែលអ្នកចង់បង្ហាញកាន់តែច្រើនទៀត? +- តើអ្នកមានអារម្មណ៍ធូរស្បើយប៉ុណ្ណា ចំពោះការចូលរួមក្នុងគម្រោងរបស់អ្នកផ្សេងទៀត? + +```mermaid +mindmap + root((ការ​សហការជាមួយ Git)) + Branching + សាខាខុសគំនិត + សាខា​កែ​បញ្ហា​កំហុស + ការងារសាកល្បង + Pull Requests + ការត្រួតពិនិត្យកូដ + ការពិភាក្សា + ការបញ្ចេញតេស្ត + Best Practices + សារ​បញ្ជាក់ commit ឆ្លាក់​សុភាព + ការផ្លាស់ប្តូរ​តូច ដែលមាន​គោលបំណង​ច្បាស់ + ឯកសារ​ស្អាតល្អ +``` +> **បង្កើនភាពទំនុកចិត្ត**: អ្នកអភិវឌ្ឍជាច្រើនដែលអ្នកគោរពគួរឱ្យគោរព នៅមុននេះបានមានអារម្មណ៍ច្របូកច្របល់ចំពោះ pull request ដំបូងរបស់ពួកគេ។ សហគមន៍ GitHub ស្វាគមន៍យ៉ាងខ្លាំងចំពោះអ្នកថ្មី! + +1. **បើក PR**។ បន្ទាប់មក អ្នកចង់បើក PR។ អ្នកធ្វើដូចនេះដោយចូលទៅឃ្លាំង fork នៅលើ GitHub។ អ្នកនឹងឃើញសញ្ញាដែលបង្ហាញនៅលើ GitHub ដែលសួរថា តើអ្នកចង់បង្កើត PR ថ្មីទេ។ អ្នកចុចហើយត្រូវបាននាំទៅអន្តរជាតិមួយ ដែលអាចផ្លាស់ប្តូរសំពាធសារប្ដូរ ចុះសារពិពណ៌នា ឲ្យវាសមរម្យ។ ឥឡូវនេះអ្នកថែរក្សាឃ្លាំងដែលអ្នកបាន fork នឹងឃើញ PR នេះ ហើយ _ជួរដៃឆន្ទៈ_ ពួកគេនឹងគេចាត់ទុក និង _merge_ PR របស់អ្នក។ អ្នកឥឡូវជាអ្នករួមចំណែក, ហោរា :) + + 💡 **ចំណាំទំនើប**: អ្នកក៏អាចបង្កើត PRs ដោយប្រើ GitHub CLI ៖ + ```bash + gh pr create --title "Your PR title" --body "Description of changes" + ``` + + 🔧 **ការអនុវត្តល្អបំផុតសម្រាប់ PRs**: + - តំណភ្ជាប់ទៅកាន់បញ្ហាដែលពាក់ព័ន្ធដោយប្រើពាក្យគន្លឹះដូចជា "Fixes #123" + - បន្ថែមរូបថតអេក្រង់សម្រាប់ការផ្លាស់ប្តូរ UI + - ស្នើរសុំអ្នកពិនិត្យជាក់លាក់ + - ប្រើ PR ឯកសារសរសេរសម្រាប់ការងារកំពុងបន្ត + - ធានាថាការត្រួតពិនិត្យ CI ទាំងអស់ជោគជ័យមុនពេលស្នើរសុំការពិនិត្យ + +1. **សម្អាត**។ វាត្រូវបានចាត់ទុកថាជាការអនុវត្តល្អក្នុងការសម្អាតបន្ទាប់ពីអ្នករួមបញ្ចូល PR បានជោគជ័យ។ អ្នកចង់សម្អាតទាំងសាខា​ក្រៅតំបន់របស់អ្នក និងសាខាដែលអ្នកបានបញ្ចូលទៅ GitHub។ ជាដំបូង ដកសាខាក្រៅតំបន់ដោយប្រើពាក្យបញ្ជាដូចខាងក្រោម៖ + + ```bash + git branch -d [branch-name] + ``` + + ធានាថាអ្នកទៅកាន់ទំព័រ GitHub សម្រាប់ repo ដែលបានសាខា fork ហើយដកសាខា remote ដែលអ្នកទើបបានបញ្ចូលទៅ។ + +`Pull request` មើលទៅដូចជាពាក្យសំដៅមិនទាន់ច្បាស់ព្រោះជាក់ស្តែង អ្នកចង់បញ្ចូលការផ្លាស់ប្តូររបស់អ្នកទៅក្នុងគម្រោង។ ប៉ុន្តែម្ចាស់គម្រោង (ម្ចាស់គម្រោង) ឬក្រុមមូលដ្ឋានត្រូវតែពិចារណាការផ្លាស់ប្តូររបស់អ្នកមុនពេលរួមបញ្ចូលវានឹងសាខា "main" របស់គម្រោង ដូច្នេះជាការស្នើរសុំសម្រេចចិត្តពីម្ចាស់គម្រោងម្នាក់។ + +Pull request គឺជាទីកន្លែងសម្រាប់ប្រៀបធៀប និងពិភាក្សាអំពីភាពខុសគ្នាដែលបានណែនាំនៅលើសាខាមួយជាមួយការពិនិត្យមើល ការ​យោបល់ ការធ្វើតេស្តរួម និងផ្សេងទៀត។ Pull request ល្អត្រូវតែអនុវត្តតាមច្បាប់ប្រហែលដូចជា​សារ commit message។ អ្នកអាចបន្ថែមយោងទៅកាន់បញ្ហាមួយក្នុង​អ្នកតាមដានបញ្ហា នៅពេលដែលការងាររបស់អ្នកដោះសោបញ្ហាមួយ។ នេះធ្វើឡើងដោយប្រើ `#` ផ្ទ followed បន្ទាប់លេខបញ្ហារបស់អ្នក។ ឧទាហរណ៍ `#97`។ + +🤞សង្ឃឹមថាការត្រួតពិនិត្យទាំងអស់ជោគជ័យ និងម្ចាស់គម្រោងមួយចំនួនរួមបញ្ចូលការផ្លាស់ប្តូររបស់អ្នកទៅក្នុងគម្រោង🤞 + +បច្ចុប្បន្នភាពសាខាការងារក្រៅតំបន់របស់អ្នកជាមួយការបញ្ចូលថ្មីទាំងអស់ពីសាខា remote អនាគតដែលសមស្រូបនៅលើ GitHub៖ + +`git pull` + +## ចូលរួមក្នុង Open Source (ឱកាសរបស់អ្នកក្នុងការធ្វើឥទ្ធិពល!) + +តើអ្នកត្រៀមខ្លួនសម្រាប់អ្វីមួយដែលនឹងធ្វើឱ្យអ្នកភ្ញាក់ផ្អើលមែនទេ? 🤯 មកនិយាយអំពីការចូលរួមក្នុងគម្រោង open source - ហើយខ្ញុំកំពុងមាន goosebumps ព្រោះគិតអំពីការចែករំលែកនេះជាមួយអ្នក! + +នេះគឺជាឱកាសរបស់អ្នកក្នុងការចូលរួមជាផ្នែកមួយនៃអ្វីដែលពិតជាអស្ចារ្យណាស់។ សូមស្រមៃថាអ្នកកំពុងធ្វើឱ្យឧបករណ៍ដែលអ្នកអភិវឌ្ឍន៍លើល្វែងប្រើរៀងរាល់ថ្ងៃកាន់តែប្រសើរឡើង ឬកែសម្រួលកំហុសក្នុងកម្មវិធីមួយដែលមិត្តរបស់អ្នកចូលចិត្ត។ នេះមិនមែនជាឈុតសុបិនទេ - នេះជារឿងដែលការចូលរួម open source មានន័យថា! + +នេះជាអ្វីដែលធ្វើឲ្យខ្ញុំមានអារម្មណ៍ចង់ញញឹមរាល់ពេលដែលខ្ញុំគេទៅក្នុង៖ ឧបករណ៍ទាំងអស់ដែលអ្នកបានរៀនជាមួយ - កម្មវិធីកែសម្រួលកូដ​របស់អ្នក ស៊ុមប្រភេទដែលយើងនឹងស្រាវជ្រាវ ទាំងម៉ាស៊ីនអានចល័តដែលអ្នកកំពុងអាននេះ - ទាំងអស់គេបានចាប់ផ្តើមពីលំនាំដើមដោយអ្នកស្គាល់ដូចអ្នក កំពុងធ្វើការចូលរួមដំបូងរបស់ពួកគេ។ អ្នកអភិវឌ្ឍន៍ល្អឥតខ្ចោះដែលបានបង្កើតកម្មវិធីបន្ថែម VS Code ដែលអ្នកចូលចិត្តទេ? ពួកគេធ្លាប់ជាអ្នកចាប់ផ្តើមដែលចុច "create pull request" ដោយដៃទន់ទោល ដូចដែលអ្នកកំពុងត្រៀមធ្វើឥឡូវនេះ។ + +ហើយនេះជាផ្នែកស្រស់ស្អាតបំផុត៖ គ្រួសារសហគមน์ open source គឺដូចជាការលៃតម្រូវធំនៅលើអ៊ីនធឺណិត។ គម្រោងភាគច្រើនកំពុងស្វែងរកអ្នកចូលរួមថ្មីៗហើយមានបញ្ហាដែលបានធ្វើស្លាក "good first issue" ជាពិសេសសម្រាប់មនុស្សដូចអ្នក! អ្នកថែរក្សាផ្ទាល់គិតថាអារម្មណ៍រីករាយនៅពេលដែលពួកគេចាប់ផ្តើមឃើញអ្នកចូលរួមថ្មី ដោយពួកគេចងចាំជំហានដំបូងរបស់ខ្លួនផងដែរ។ + +```mermaid +flowchart TD + A[🔍 ស្វែងរក GitHub] --> B[🏷️ រក "បញ្ហាល្អដំបូង"] + B --> C[📖 អានក្រមណីយកម្មចូលរួម] + C --> D[🍴 ផFork ឃ្លាំងទិន្នន័យ] + D --> E[💻 តំឡើងបរិច្ឆេទក្នុងតំបន់] + E --> F[🌿 បង្កើតសាខាលក្ខណៈ] + F --> G[✨ ធ្វើការរួមចំណែករបស់អ្នក] + G --> H[🧪 សាកល្បងការផ្លាស់ប្តូររបស់អ្នក] + H --> I[📝 សរសេរ Commit ឱ្យច្បាស់] + I --> J[📤 បញ្ជូន & បង្កើត PR] + J --> K[💬 ចូលរួមជាមួយមតិយោបល់] + K --> L[🎉 បានផ្ដោត! អ្នកជាអ្នករួមចំណែក!] + L --> M[🌟 រកបញ្ហាបន្ទាប់] + + style A fill:#e1f5fe + style L fill:#c8e6c9 + style M fill:#fff59d +``` +អ្នកមិនត្រឹមតែចេះកូដនៅទីនេះទេ - អ្នកកំពង់ត្រៀមចូលរួមជាមួយគ្រួសារអភិវឌ្ឍន៍ពិភពលោកដែលភ្ញាក់លើកមួយរាល់ថ្ងៃគិតថា "តើយើងអាចធ្វើឱ្យពិភពឌីជីថលប្រសើរឡើងតិចតួចបានយ៉ាងដូចម្តេច?" សូមស្វាគមន៍ចូលរួមក្លឹបទាំងនេះ! 🌟 + +ជាមុនសិន យើងស្វែងរកឃ្លាំងព័ត៌មាន (ឬ **repo**) នៅលើ GitHub ដែលអ្នកចាប់អារម្មណ៍ និងអ្នកចង់ចូលរួមផ្លាស់ប្តូរតួអង្គមួយ។ អ្នកនឹងចង់ចម្លងមាតិការបស់វាទៅឧបករណ៍របស់អ្នក។ + +✅ វិធីល្អសម្រាប់ស្វែងរក repo មិត្តអ្នកចាប់ផ្តើមគឺ [ស្វែងរកដោយស្លាក 'good-first-issue'](https://github.blog/2020-01-22-browse-good-first-issues-to-start-contributing-to-open-source/)។ + +![ចម្លង repo មូលដ្ឋាន](../../../../translated_images/km/clone_repo.5085c48d666ead57.webp) + +មានជម្រើសជាច្រើនក្នុងការចម្លងកូដ។ វិធីមួយគឺ "clone" មាតិកា repo ដោយប្រើ HTTPS, SSH, ឬ GitHub CLI (Command Line Interface)។ + +បើក terminal របស់អ្នក ហើយ clone repo ដូច្នេះ៖ +```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)** - បរិយាកាសអភិវឌ្ឍន៍ cloud របស់ GitHub ជាមួយ VS Code ក្នុងកម្មវិធីរុករក +- **[GitHub Desktop](https://desktop.github.com/)** - កម្មវិធី GUI សម្រាប់ប្រតិបត្តិការក្នុង Git +- **[GitHub.dev](https://github.dev)** - ចុចក្តារចុច `.` នៅលើ repo GitHub មួយណា ដើម្បីបើក VS Code ក្នុងកម្មវិធីរុករក +- **VS Code** ជាមួយបទបន្ថែម GitHub Pull Requests + +ចុងប៉ុន, អ្នកអាចទាញយកកូដនៅក្នុងថត zipped។ + +### អ្វីដែលគួរចាប់អារម្មណ៍បន្ថែមអំពី GitHub + +អ្នកអាចផ្ដល់ផ្កាយ, តាមដាន និង/ឬ "fork" repo ណាមួយសាធារណៈនៅលើ GitHub។ អ្នកអាចរកឃើញ repo ដែលអ្នកបានផ្ដល់ផ្កាយនៅក្នុងម៉ឺនុយ dropdown ផ្នែកខាងលើ-ស្តាំ។ វាក្លាយជាការតែងសំគាល់សម្រាប់កូដ។ + +គម្រោងមានអ្នកតាមដានបញ្ហា ភាគច្រើននៅលើ GitHub នៅផ្ទាំង "Issues" លុះតែក្នុងករណីបាតបណ្ដឹងផ្សេងៗ គេនិយាយពីបញ្ហាដែលពាក់ព័ន្ធនឹងគម្រោង។ ផ្ទាំង Pull Requests គឺកន្លែងដែលមនុស្សពិភាក្សា និងពិនិត្យមើលការផ្លាស់ប្តូរកំពុងត្រូវបានធ្វើ។ + +គម្រោងក៏អាចមានការពិភាក្សាក្នុងវេទិកា បញ្ជីអ៊ីមែល ឬបន្ទប់ជជែកដូចជា Slack, Discord ឬ IRC។ + +🔧 **មុខងារថ្មីៗរបស់ GitHub**: +- **GitHub Discussions** - វេទិការសម្រាប់ការពិភាក្សាសហគមน์ +- **GitHub Sponsors** - គាំទ្រអ្នកថែរក្សាដោយហិរញ្ញវត្ថុ +- **ផ្ទាំងសន្តិសុខ** - របាយការណ៍ចាប់បានកំហុសសន្តិសុខ និងដំណឹងសន្តិសុខ +- **ផ្ទាំង Actions** - មើលរៀបចំការដំណើរការបែបស្វ័យប្រវត្តិ និង CI/CD +- **ផ្ទាំង Insights** - វិភាគអំពីអ្នកចូលរួម ការបញ្ចូល ការគ្រប់គ្រងគម្រោង +- **ផ្ទាំង Projects** - ឧបករណ៍គ្រប់គ្រងគម្រោងរបស់ GitHub + +✅ សូមពិនិត្យ repo GitHub ថ្មីរបស់អ្នក ហើយសាកល្បងធ្វើអ្វីមួយចំនួន ដូចជា កែសម្រួលការកំណត់ បន្ថែមព័ត៌មានទៅ repo របស់អ្នក បង្កើតគម្រោង (ដូចជា​កាតាឡុក Kanban) និងរៀបចំ GitHub Actions សម្រាប់ការស្វ័យប្រវត្តិ។ មានច្រើនសម្រាប់អ្នកអាចធ្វើបាន! + +--- + +## 🚀 សម្ភាសន៍ + +មែនហើយ វេលានេះគឺពេលវេលាដើម្បីប្រើប្រាស់អំណាច GitHub ថ្មីរបស់អ្នកដើម្បីធ្វើតេស្ត! 🚀 នេះជាការសម្ភាសន៍ដែលនឹងធ្វើអោយគ្រប់យ៉ាងចុះទៅទៅតាមរបៀបសប្បាយចិត្តបំផុត៖ + +យកមិត្តភក្តិម្នាក់ (ឬអ្នកជំនុំជម្រះក្នុងគ្រួសារដែលតែងសួរថាអ្នកកំពុងធ្វើអ្វីជាមួយ "រឿងកុំព្យូទ័រ" ទាំងនេះ) ហើយចូលរួមក្នុងការសហការជាមួយគ្នានៅក្នុងសម័យអភិវឌ្ឍន៍កូដ! នេះជាកន្លែងដែលមន្ទិលពិតប្រាកដកើតឡើង - បង្កើតគម្រោង ឲ្យពួកគេ fork វា បង្កើតសាខា និងរួមបញ្ចូលការផ្លាស់ប្តូរដូចជាអ្នកជាមួយជំនាញ។ + +ខ្ញុំមិននិយាយមិនត្រឹមត្រូវ - អ្នកអាចខូចមុខខ្លះៗនៅពេលណាមួយ (ពិសេសពេលដែលអ្នកទាំងពីរព្យាយាមផ្លាស់ប្តូរបន្ទាត់ដូចគ្នា) ប្រហែលជាលំបាកស្កត់ក្បាល ប៉ុន្តែមិនខ្វល់ទេ អ្នកនិងមានពេលវេលាដ៏ចម្លែក "aha!" ដែលធ្វើអោយការសិក្សាពិតជាគួរជាទីកត់សម្គាល់។ លើសពីនេះ មានអ្វីមួយពិសេសនៅក្នុងការចែករំលែកការរួមបញ្ចូលជោគជ័យជាលើកដំបូងជាមួយនរណាម្នាក់ - វាដូចជាការប្រារព្ធខ្នាតតូចមួយនៃការរីកចម្រើនរបស់អ្នក! + +មិនមានមិត្តអ្នកអភិវឌ្ឍន៍ទេ? កុំបារម្ភឡើយ! សហគមน์ GitHub មានមនុស្សប្រុងប្រែងល្អៗជាច្រើនដែលចងចាំពីការចាប់ផ្តើមរបស់ពួកគេ។ ស្វែងរកឃ្លាំងដែលមានស្លាក "good first issue" - ពួកគេចង់និយាយថា "ហេប៉ូនថ្មីៗ មករៀនជាមួយពួកយើង!" ម្តេចចេញល្អបែបនេះ? + +## សំនួរប្រលងក្រោយមេរៀន +[សំនួរប្រលងក្រោយមេរៀន](https://ff-quizzes.netlify.app/web/en/) + +## ការត្រួតពិនិត្យ & អបអរសាទរ + +ហេតុអ្វី? 🎉 មើលទៅអ្នក - អ្នកទើបតែយកឈ្នះផ្នែកមូលដ្ឋាន GitHub ដូចជាអ្នកជើងឯកពិតប្រាកដ! ប្រសិនបើខួរក្បាលរបស់អ្នកមានអារម្មណ៍ពេញលេញមួយ chút ឆេះហ្នឹងនេះ ហើយពិតជាសញ្ញាដ៏ល្អ។ អ្នកទើបតែបានរៀនអំពីឧបករណ៍ដែលខ្ញុំបានចំណាយពីរបីសប្តាហ៍ក្នុងការធ្វើអោយមានសុខដុមសុខដូននៅពេលចាប់ផ្តើម។ + +Git និង GitHub មានអំណាចខ្លាំងណាស់ (វាពិតជាមានអំណាចខ្លាំងណាស់), ហើយអ្នកអភិវឌ្ឍន៍គ្រប់គ្នាដែលខ្ញុំស្គាល់ - រួមទាំងអ្នកដែលមើលទៅដូចជាគ្រប់កាល់យន្តនៅលើសព្វថ្ងៃ - ត្រូវបានហាត់ប្រាណ និងមានការប្រឈមមុខមួយចំនួនមុនពេលបានចេះយ៉ាងពេញលេញ។ ការពិតដែលអ្នកអាចឆ្លងកាត់មេរៀននេះទៅបានរាប់ថាអ្នកបានចាប់ផ្តើមរួចហើយក្នុងការជៀសវាងឧបករណ៍សំខាន់ៗបំផុតក្នុងប្រអប់ឧបករណ៍របស់អ្នកអភិវឌ្ឍន៍។ + +នេះគឺជាធនធានដ៏អស្ចារ្យមួយចំនួនដើម្បីជួយអ្នកហាត់ប្រាណ និងក្លាយជាអ្នកល្អប្រសើរជាងមុន៖ + +- [មាគ៌ាចូលរួមក្នុងកម្មវិធី open source](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/) – សម្រាប់ពេលដែលអ្នកចង់មានអារម្មណ៍ដូចជារត់ command-line +- [ឯកសារវិធីប្រើ 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 ពេញលេញដែលអ្នកបានរៀនក្នុងមេរៀននេះ។ សមួសនេះនឹងជួយអ្នកហាត់ការបង្កើត repository, មុខងារ​នៃការសហការនិងដំណើរការថ្មីៗ Git នៅក្នុងស្ថានភាពពិត។ + +**ការស្នើសុំ:** បង្កើត repo GitHub សាធារណៈថ្មីសម្រាប់គម្រោង "ធនធានអភិវឌ្ឍន៍វែប" មួយ។ Repo នេះគួរមានឯកសារ README.md ដែលមានរចនាសម្ព័ន្ធល្អ រាយបញ្ជីឧបករណ៌ និងធនធានអភិវឌ្ឍន៍វែបមានប្រយោជន៍ តម្រៀបតាមប្រភេទ (HTML, CSS, JavaScript, ល។) រៀបចំ repo ជាមួយស្តង់ដារសហគមน์ត្រឹមត្រូវ រួមមានអាជ្ញាប័ណ្ណ, គោលការណ៍ចូលរួម និងក្បួនឯកសារអនុវត្តន៍។ បង្កើតសាខាឆ្នើមយ៉ាងហោចណាស់ពីរជា feature branch: មួយសម្រាប់បន្ថែមធនធាន CSS និងមួយសម្រាប់ធនធាន JavaScript។ ធ្វើការបញ្ជូលការផ្លាស់ប្តូរទៅលើមួយនីមួយសាខាជាមួយសារ commit បញ្ជាក់បរិយាយ ហើយបង្កើត pull requests ដើម្បីរួមបញ្ចូលការផ្លាស់ប្តូរមកវិញ main។ បើកមុខងារ GitHub ដូចជា Issues, Discussions និងរៀបចំល្វាឃហ្វ្លូ GitHub Actions ធ្វើតេស្តស្វ័យប្រវត្តិ។ + +## ការងារ + +បេសកកម្មរបស់អ្នក ប្រសិនបើអ្នកជ្រើសរើសទទួលយកវា៖ បញ្ចប់វគ្គសិក្សា [Introduction to GitHub](https://github.com/skills/introduction-to-github) នៅលើ GitHub Skills។ វគ្គសិក្សាអន្តរកម្មនេះនឹងអនុញ្ញាតឱ្យអ្នកហាត់ត្រូវបានក្នុងបរិយាកាសដែលមានការណែនាំគ្រប់ជំហាន និងមានសុវត្ថិភាព។ បន្ថែមលើនេះ អ្នកនឹងទទួលបានបដាដ៏ត្រជាក់ក្លាដោយពេលសម្រេចប្រាក់សម្រាប់វគ្គនេះ! 🏅 + +**មានផ្លូវចង់ទទួលការប្រឈមបន្តទៀត?** +- រៀបចំការផ្ទៀងផ្ទាត់ SSH សម្រាប់គណនី GitHub របស់អ្នក (មិនចាំបាច់មានពាក្យសំងាត់ទៀតទេ!) +- សាកល្បងប្រើ GitHub CLI សម្រាប់ប្រតិបត្តិការ Git ប្រចាំថ្ងៃរបស់អ្នក +- បង្កើត repo រួមជាមួយ workflow GitHub Actions +- ស្វែងរក GitHub Codespaces ដោយបើក repo នេះនៅក្នុងកម្មវិធីគ្រប់គ្រងមេឌាននៅលើពពក + +--- + +## 🚀 រតនភាពជំនាញ GitHub របស់អ្នក + +### ⚡ **អ្វីដែលអ្នកអាចធ្វើបានក្នុង 5 នាទីក្រោយ** +- [ ] ផ្ដល់ផ្កាយ repo នេះ និងគម្រោងផ្សេងទៀត 3 ដែលអ្នកចាប់អារម្មណ៍ +- [ ] នៅតែបើកការផ្ទៀងផ្ទាត់ពីរជាន់លើគណនី GitHub របស់អ្នក +- [ ] បង្កើត README សាមញ្ញសម្រាប់ repo ដំបូងរបស់អ្នក +- [ ] តាមដានអ្នកអភិវឌ្ឍន៍ 5 នាក់ដែលការងាររបស់ពួកគេគួរឲ្យចាប់អារម្មណ៍ + +### 🎯 **អ្វីដែលអ្នកអាចសម្រេចបានក្នុង​មួយម៉ោងនេះ** +- [ ] បញ្ចប់សំណួរប្រលងក្រោយមេរៀន និងពិចារណា​ពី​ដំណើរការរបស់អ្នកនៅ GitHub +- [ ] រៀបចំកូនសោ SSH សម្រាប់ការផ្ទៀងផ្ទាត់គណនី GitHub ដោយគ្មានពាក្យសម្ងាត់ +- [ ] បង្កើត commit មួយដ៏មានអត្ថន័យដំបូង ជាមួយសារ commit ល្អ +- [ ] ស្វែងយល់ផ្ទាំង "Explore" របស់ GitHub ដើម្បីស្វែងរកគម្រោងរំលេច +- [ ] ហាត់ប្រាណ fork repo និងធ្វើការផ្លាស់ប្តូរតូចមួយ + +### 📅 **ដំណើរអភិវឌ្ឍ GitHub រយៈពេលមួយសប្តាហ៍** +- [ ] បញ្ចប់វគ្គ GitHub Skills (Introduction to GitHub, Markdown) +- [ ] ធ្វើលើ pull request ដំបូងទៅគម្រោង open source +- [ ] រៀបចំតំបន់ GitHub Pages សម្រាប់បង្ហាញការងារ +- [ ] ចូលរួមក្នុង GitHub Discussions លើគម្រោងដែលអ្នកចាប់អារម្មណ៍ +- [ ] បង្កើត repo ជាមួយស្តង់ដារសហគមน์ត្រឹមត្រូវ (README, អាជ្ញាប័ណ្ណលើកនេះ) +- [ ] សាកល្បង GitHub Codespaces សម្រាប់ការអភិវឌ្ឍនៅលើពពក + +### 🌟 **បម្លែងរៀងរាល់ខែរបស់អ្នក** +- [ ] ចូលរួមក្នុងគម្រោង open source 3 គម្រោងផ្សេងៗ +- [ ] ជួយណែនាំអ្នកថ្មីក្នុង GitHub (បង់ពន្ធទៅមុខ!) +- [ ] រៀបចំល្វាឃហ្វ្លូស្វ័យប្រវត្តជាមួយ GitHub Actions +- [ ] បង្កើតបណ្ណាល័យបង្ហាញពីការចូលរួម GitHub របស់អ្នក +- [ ] ចូលរួម Hacktoberfest ឬព្រឹត្តិការណ៍សហគមន៍ដូចគ្នា +- [ ] ក្លាយជាអ្នកថែរក្សាគម្រោងរបស់ខ្លួនដែលអ្នកដទៃចូលរួម + +### 🎓 **ការត្រួតពិនិត្យជំនាញ GitHub ចុងក្រោយ** + +**អបអរសាទរពីជំហានដែលអ្នកបានឈានដល់៖** +- អ្វីទៅជា​អ្វីដែលអ្នកចូលចិត្តបំផុតអំពីការប្រើ GitHub? +- មុខងារសហការណ៍ណាមួយដែលធ្វើឲ្យអ្នករំភើបបំផុត? +- តើអ្នកមានទំនុកចិត្តប៉ុណ្ណានៅក្នុងការចូលរួម open source ឥឡូវនេះ? +- គម្រោងដំបូងដែលអ្នកចង់ចូលរួមជាមួយគឺអ្វី? + +```mermaid +journey + title គ្រឿងដំណើរជំនឿចំពោះ GitHub របស់អ្នក + section ថ្ងៃនេះ + Nervous: 3: You + Curious: 4: You + Excited: 5: You + section សប្តាហ៍នេះ + Practicing: 4: You + Contributing: 5: You + Connecting: 5: You + section ខែក្រោយ + Collaborating: 5: You + Leading: 5: You + Inspiring Others: 5: You +``` +> 🌍 **សូមស្វាគមន៍ចូលរឿងសហគមន៍អភិវឌ្ឍន៍ពិភពលោក!** ពេលនេះអ្នកមានឧបករណ៍ក្នុងការសហការជាមួយអ្នកអភិវឌ្ឍន៍រាប់លាននាក់នៅជុំវិញពិភពលោក។ ការចូលរួមដំបូងរបស់អ្នកប្រហែលជាតូចតាចខ្លះ ប៉ុន្តែចងចាំថា - គម្រោងចាំបាច់ open source មួយៗបានចាប់ផ្តើមពីសារដំបូងរបស់នរណាម្នាក់។ សំនួរមិនមែនថាអ្នកនឹងធ្វើឥទ្ធិពលបាននោះទេ ប៉ុន្តែគម្រោងណាដែលបែបបង្អួតពីទស្សនៈរបស់អ្នកជាលើកដំបូងហើយ! 🚀 + +ចងចាំ៖ អ្នកជំនាញគ្រប់រូបធ្លាប់ជាអ្នកចាប់ផ្តើមម្នាក់។ អ្នកអាចធ្វើបាន! 💪 + +--- + + +**បរិច្ចាគ**៖ +ឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ នៅពេលដែលយើងព្យាយាមឱ្យមានភាពត្រឹមត្រូវ សូមយកចិត្តទុកដាក់ថាការបកប្រែដោយស្វ័យប្រវត្តិនេះអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមនៅក្នុងភាសាតំណើរដើមគួរត្រូវបានគិតថាជាឆ្នាំកំណត់ដែលមានអំណាច។ សម្រាប់ព័ត៌មានសំខាន់ យើងផ្តល់អនុសាសន៍ឱ្យប្រើការបកប្រែដោយមនុស្សវិជ្ជាជីវៈ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកប្រែខុសដែលកើតមានពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។ + \ No newline at end of file diff --git a/translations/km/1-getting-started-lessons/3-accessibility/README.md b/translations/km/1-getting-started-lessons/3-accessibility/README.md new file mode 100644 index 000000000..ae50b510e --- /dev/null +++ b/translations/km/1-getting-started-lessons/3-accessibility/README.md @@ -0,0 +1,1492 @@ +# បង្កើតទំព័របណ្ដាញដែលអាចចូលប្រើបាន + +![អំពីភាពអាចចូលប្រើបានទាំងអស់](../../../../translated_images/km/webdev101-a11y.8ef3025c858d897a.webp) +> ស្កេឆ្នតដោយ [Tomomi Imura](https://twitter.com/girlie_mac) + +```mermaid +journey + title ជំនួយការសិក្សាអាចចូលរួមរបស់អ្នក + section មូលដ្ឋាន + ការយល់ដឹងអំពីអ្នកប្រើប្រាស់: 5: You + ឧបករណ៍សាកល្បង: 4: You + PRINCIPES POUR: 5: You + section បង្កើតជំនាញ + Semantic HTML: 4: You + ការរចនាទិដ្ឋភាព: 5: You + បច្ចេកទេស ARIA: 4: You + section អនុវត្តន៍ជំនាញ + ការបញ្ជូនតាមក្រចក: 5: You + ការចូលរួមគំរូ: 4: You + ការសាកល្បងពិភពលោកពិត: 5: You +``` +## សំណួរប្រលងមុនមេរៀន +[សំណួរប្រលងមុនមេរៀន](https://ff-quizzes.netlify.app/web/) + +> អំណាចនៃបណ្តាញគឺនៅក្នុងភាពទូលំទូលាយរបស់វា ការចូលដំណើរការដោយមនុស្សគ្រប់រូបដោយមិនគិតពីជំងឺពិសេសណាមួយ គឺជាផ្នែកសំខាន់មួយ។ +> +> \- លោក 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 [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)។ + +## យល់ដឹងពីបច្ចេកវិទ្យាជំនួយ + +មុនពេលយើងចាប់ផ្តើមកូដ មកយកពេលខ្លីដើម្បីយល់ពីរបៀបដែលមនុស្សដែលមានសមត្ថភាពខុសៗគ្នាត្រូវប្រឈមមុខនឹងបណ្ដាញ។ នេះមិនមែនគ្រាន់តែជាទ្រឹស្តីទេ—ការយល់ដឹងពីរបៀបក្នុងការរុករកពិភពលោកពិតប្រាកដទាំងនេះ នឹងធ្វើឱ្យអ្នកក្លាយជា អ្នកអភិវឌ្ឍន៍ល្អប្រសើរជាងមុន! + +បច្ចេកវិទ្យាជំនួយគឺជាឧបករណ៍អស្ចារ្យដែលជួយមនុស្សដែលមានជំងឺពិសេសក្នុងការប្រើប្រាស់គេហទំព័របែបដែលប្រហែលជាអ្នកអាចភ្ញាក់ផ្អើល។ ប្រសិនបើអ្នកយល់ឃើញរបៀបដែលបច្ចេកវិទ្យានេះដំណើរការ ការបង្កើតបទពិសោធន៍គេហទំព័រដែលអាចចូលប្រើបានក្លាយជារឿងងាយស្រួលពិតប្រាកដ។ ប្រហែលដូចជាកំពុងរៀនឃើញកូដរបស់អ្នកតាមភ្នែករបស់អ្នកដទៃម្នាក់។ + +### អ្នកអានអេក្រង់ + +[Screen readers](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) (ឥតគិតថ្លៃ និងប្រភពបើកចំហ) + +**របៀបដែលអ្នកអានអេក្រង់រុករកមាតិកាគេហទំព័រ៖** + +អ្នកអានអេក្រង់ផ្តល់នូវវិធីសាស្ត្ររុករកច្រើនដែលធ្វើឱ្យការរុករកមានប្រសិទ្ធភាពសម្រាប់អ្នកប្រើប្រាស់ដែលមានបទពិសោធន៍៖ +- **អានតាមលំដាប់**: អានមាតិកាដោយចាប់ពីលើទៅក្រោម ដូចជាកំហូរសៀវភៅ +- **រុករកតាម Landmarks**: លោតរវាងផ្នែកផ្សេងៗនៃទំព័រ (header, nav, main, footer) +- **រុករកតាម​លេខ​សម្គាល់សារមន្ទីរ**: លោតរវាងចំណងជើង ដើម្បីយល់ពីរចនាសម្ព័ន្ធទំព័រ +- **បញ្ជីតំណភ្ជាប់**: បង្កើតបញ្ជីទាំងអស់នៃតំណភ្ជាប់សម្រាប់ចូលប្រើរហ័ស +- **គ្រប់គ្រងទម្រង់**: រុករកដោយផ្ទាល់រវាងប្រអប់បញ្ចូល និងប៊ូតុង + +> 💡 **នេះជារឿងដែលធ្វើឱ្យខ្ញុំភ្ញាក់ផ្អើល**៖ ៦៨% នៃអ្នកប្រើប្រាស់អ្នកអានអេក្រង់ រុករកសំខាន់ដោយផ្អែកលើចំណងជើង ([WebAIM Survey](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, Space, និងសញ្ញាកាំបិតតុក្កតា +2. **តេស្តអ្នកអានអេក្រង់**៖ បើក NVDA, VoiceOver, ឬ Narrator ហើយរុករកនៅពេលភ្នែកបិទ +3. **តេស្តការបញ្ចូលរូបភាពចំរុះទំហំ**៖ តេស្តនៅកំរិត ២០០% និង ៤០០% +4. **ផ្ទៀងផ្ទាត់ការប្រៀបធៀបពណ៌**៖ ពិនិត្យអត្ថបទ និងរចនាសម្ព័ន្ធអន្តរក្រាលទាំងអស់ +5. **តេស្តសញ្ញាសំគាល់ការផ្តោត**៖ ប្រាកដថាធាតុអន្តរក្រាលទាំងអស់មានស្ថានភាពផ្តោតច្បាស់លាស់ + +✅ **ចាប់ផ្តើមជាមួយ Lighthouse**៖ បើក DevTools របស់អ្នក អនុវត្តការត្រួតពិនិត្យភាពអាចចូលប្រើដោយ Lighthouse ហើយប្រើលទ្ធផលដើម្បីមើលកន្លែងដែលត្រូវផ្តោតសម្រាប់តេស្តដោយដៃ។ + +### ឧបករណ៍បន្ថែមទេស៍នឹងបន្ធូរទំហំ + +អ្នកស្គាល់ហើយថាឥលូវនេះខ្លះមនុស្សប្រើជម្រោះដៃដើម្បីបក្សទំហំអត្ថបទនៅលើទូរស័ព្ទនៅពេលអត្ថបទតូចពេក ឬហើរមើលអេក្រង់កុំព្យូទ័រយួរដៃនៅពេលពន្លឺខ្លាំងមែនទេ? អ្នកប្រើជាច្រើនពេញចិត្តជាមួយឧបករណ៍បន្ថែមទេស៍ដើម្បីធ្វើអោយមាតិកាអាចអានបានជារៀងរាល់ថ្ងៃ។ នេះរួមបញ្ចូលមនុស្សដែលមើលមិនច្បាស់ អ្នកចាស់ៗ និងមនុស្សណាដែលបានព្យាយាមអានគេហទំព័រនៅក្រៅផ្ទះ។ + +បច្ចេកវិទ្យាបន្ថែមទេស៍ទំនើបបានឈានដល់កម្រិតលើសពីការធ្វើអោយវារីមធំទេ។ ការយល់ដឹងពីរបៀបដែលឧបករណ៍ទាំងនេះដំណើរការ នឹងជួយអ្នកបង្កើតរចនាប័ទ្មឆ្លាតវៃដែលនៅតែដំណើរការល្អ និងគួរឱ្យចាប់អារម្មណ៍នៅកម្រិតបន្ថែមទេស៍ណាមួយ។ + +**សមត្ថភាពបន្ថែមទេស៍របស់កម្មវិធីរុករកទំនើប:** +- **បន្ថែមទេស៍ទំព័រ**: បង្កើតអត្ថបទទាំងមូលដោយអត្រាពាក់កណ្តាល (អត្ថបទ រូបភាព រចនាសម្ព័ន្ធ) - វាជាវិធីដែលចូលចិត្តប្រើ +- **បន្ថែមទេស៍អត្ថបទតែ១**: ពង្រីកទំហំអក្សរផ្ទាល់ខ្លួនដោយរក្សាទម្រង់ដើម +- **ប៉ិនទឹកដៃ​បន្ថែមទេស៍**: ជំនួយរូបមន្តលើទូរស័ព្ទដៃសម្រាប់បន្ថែមទេស៍បណ្ដោះអាសន្ន +- **ការគាំទ្ររុករក**: រុករកទំនើបទាំងអស់គាំទ្រការបន្ថែមទេស៍រហូតដល់ ៥០០% ដោយមិនបំផ្លាញមុខងារ + +**កម្មវិធីបន្ថែមទេស៍ផ្នែកម៉ាស៊ីន:** +- **Windows**: [Magnifier](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**: [Zoom](https://www.apple.com/accessibility/mac/vision/) (ដំណើរការរួចជាមួយលក្ខណៈពិសេសខ្ពស់) + +> ⚠️ **ការយកចិត្តទុកដាក់រចនា**៖ WCAG ទាមទារថាមាតិកាត្រូវនៅមានមុខងារដោយសារត្រូវបានបន្ថែមទេស៍ទៅ ២០០%។ នៅកម្រិតនេះ ការរុករកបញ្ចេញតឹងតែងតែតិច និងធាតុអន្តរក្រាលទាំងអស់ត្រូវនៅអាចចូលប្រើបាន។ + +✅ **សាកល្បងរចនាប័ទ្មឆ្លាតវៃរបស់អ្នក**៖ បន្ថែមទេស៍រុករករបស់អ្នកទៅ ២០០% និង ៤០០%។ តើរចនារបស់អ្នកអាចបត់បែនបានជាដំណោះស្រាយល្អដែរឬ? តើអ្នកនៅតែអាចចូលប្រើមុខងារទាំងអស់បានដោយមិនចាំបាច់រុករកពេកទេ? + +## ឧបករណ៍តេស្ថភាពអាចចូលប្រើបានទំនើប + +ឥឡូវនេះអ្នកយល់ដឹងពីរបៀបដែលមនុស្សរុករកបណ្ដាញជាមួយបច្ចេកវិទ្យាជំនួយហើយ មកមើលឧបករណ៍ដែលជួយអ្នកបង្កើតនិងតេស្តគេហទំព័រដែលអាចចូលប្រើបាន។ + +គិតវាដូចជា៖ ឧបករណ៍ស្វ័យប្រវត្តិល្អឥតខ្ចោះសម្រាប់ចាប់បញ្ហាផ្ទាល់មុខ (ដូចជាអត្ថបទ alt ខ្វះ) ខណៈពេលដែលការតេស្តដោយដៃជួយអ្នកធានាថាគេហទំព័ររបស់អ្នកមានអារម្មណ៍ល្អក្នុងពិភពពិត។ រួមគ្នា ពួកគេផ្តល់សំណល់ទំនុកចិត្តថាគេហទំព័ររបស់អ្នកដំណើរការសម្រាប់មនុស្សគ្រប់រូប។ + +### តេស្តការប្រៀបធៀបពណ៌ + +មានដំណឹងល្អមួយ៖ ការប្រៀបធៀបពណ៌គឺជាបញ្ហាទិដ្ឋភាពអាចចូលប្រើបានធំបំផុតមួយ ប៉ុន្តែវាក៏ជារឿងងាយស្រួលក្នុងការជួសជុលផងដែរ។ ការប្រៀបធៀបល្អយ៉ាងខ្លាំងមានអត្ថប្រយោជន៍សម្រាប់មនុស្សគ្រប់រូប—ចាប់ពីអ្នកមានបញ្ហាអំពីចក្ខុទៅដល់អ្នកព្យាយាមអានទូរស័ព្ទនៅឆ្នេរមាត់សមុទ្រ។ + +**លក្ខខណ្ឌប្រៀបធៀប WCAG៖** + +| មុខងារ​អត្ថបទ | WCAG AA (អប្បបរមា) | WCAG AAA (ពង្រឹង) | +|-----------|-------------------|---------------------| +| **អត្ថបទធម្មតា** (ក្រោម 18pt) | 4.5:1 អត្រាប្រៀបធៀប | 7:1 អត្រាប្រៀបធៀប | +| **អត្ថបទធំ** (18pt+ ឬ 14pt+ ដិត) | 3:1 អត្រាប្រៀបធៀប | 4.5:1 អត្រាប្រៀបធៀប | +| **កម្មវិធី UI** (ប៊ូតុង, រង្វង់បែបផ្សារ) | 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 + ផ្ទាំង Accessibility +- **Firefox**: Accessibility Inspector រួមជាមួយទិដ្ឋភាពចំរុះ +- **Safari**: Audit tab នៅក្នុង Web Inspector ជាមួយបទបង្ហាញ VoiceOver + +**ផ្នែកបន្ថែមសម្រាប់ការតេស្តដែលជាអាជីព:** +- [axe DevTools](https://www.deque.com/axe/devtools/) - ការតេស្តស្វ័យប្រវត្តិដែលមានស្តង់ដារឡើងវិញ +- [WAVE](https://wave.webaim.org/extension/) - មតិបញ្ជាក់ជាមួយការបង្ហាញកំហុស +- [Accessibility Insights](https://accessibilityinsights.io/) - កម្មវិធីតេស្តទូលំទូលាយរបស់ Microsoft + +**បញ្ជា និងបញ្ចូលក្នុង CI/CD:** +- [axe-core](https://github.com/dequelabs/axe-core) - បណ្ណាល័យ JavaScript សម្រាប់តេស្តស្វ័យប្រវត្តិ +- [Pa11y](https://pa11y.org/) - ឧបករណ៍តេស្តភាពអាចចូលប្រើពីបញ្ជា +- [Lighthouse CI](https://github.com/GoogleChrome/lighthouse-ci) - ពិន្ទុភាពអាចចូលប្រើដោយស្វ័យប្រវត្តិ + +> 🎯 **គោលបំណងតេស្ត**៖ មានគោលបំណងទទួលបានពិន្ទុភាពអាចចូលប្រើបាន ៩៥+ ពី Lighthouse ជា​គោលជំនួយរបស់អ្នក។ ចូរចាំថា ឧបករណ៍ស្វ័យប្រវត្តិចាប់បញ្ហាបានប្រហែល ៣០-៤០% នៃបញ្ហា — ការតេស្តដោយដៃនៅតែមានសារៈសំខាន់! + +### 🧠 **ការតេស្តជំនាញ៖ រៀបចំរកបញ្ហា?** + +**មកមើលថាតើអ្នកមានអារម្មណ៍យ៉ាងដូចម្តេចចំពោះការតេស្តភាពអាចចូលប្រើបាន៖** +- វិធីសាស្ត្រតេស្តណាដែលមើលទៅសមស្របបំផុតសម្រាប់អ្នកពេលនេះ? +- តើអ្នកអាចស្របតាមរុករកតែជាមួយក្តារចុចបានមួយថ្ងៃឬ? +- តើមានឧបសគ្គអ្វីមួយដែលអ្នកមានបទពិសោធន៍ផ្ទាល់លើបណ្ដាញដែលទាក់ទងសិទ្ធិចូលប្រើបាន? + +```mermaid +pie title "បញ្ហាប្រកបដោយភាពអាចក្នុងការចូលទៅកាន់បានដែលត្រូវបានចាប់យោលដោយវិធីផ្សេងៗ" + "ឧបករណ៍ស្វ័យប្រវត្តិ" : 35 + "ការតេស្តដោយដៃ" : 40 + "មតិយោបល់ពីអ្នកប្រើ" : 25 +``` +> **កម្លាំងបង្កើនទំនុកចិត្ត**៖ អ្នកតេស្តភាពអាចចូលប្រើជំនាញពីរបៀបនេះជាជំនួយ។ អ្នកកំពុងរៀននូវអនុវត្តស្តង់ដារអាជីព! + +## ការបង្កើតភាពអាចចូលប្រើបានពីគ្រឹះដំបូង + +គន្លងជោគជ័យក្នុងការធ្វើឱ្យមានភាពអាចចូលប្រើវាជា ការបង្កើតវា អំពីគ្រឹះរបស់អ្នកចាប់ពីថ្ងៃទីមួយ។ ខ្ញុំដឹងថាវាជាការផឹកពិបាកក្នុងការរៀនថា "ខ្ញុំនឹងបន្ថែមភាពអាចចូលប្រើនៅពេលក្រោយ" ប៉ុន្តែវាដូចជាការបន្ថែមជណ្តើរឡើងដូចជារឿងនៃផ្ទះដែលបានសាងសង់រួចមកហើយ។ អាចធ្វើបាន? បាទ។ ងាយស្រួល? មិនមែនទេ។ + +គិតពីភាពអាចចូលប្រើបានដូចជាការរៀបចំប្លង់ផ្ទះ—វាងាយស្រួលក្នុងការរួមបញ្ចូលការចូលប្រើរទេះចរក្នុងផែនការសង់សួនច្បារដំបូងជាងការត្រូវតែចាក់ជណ្តើរបន្ថែមនៅពេលក្រោយ។ + +### គោលការណ៍ POUR៖ គ្រឹះភាពអាចចូលប្រើបានរបស់អ្នក + +ស្តង់ដារដាក់ទំព័រជួរមាតិកាអាចចូលប្រើបាន (WCAG) បានស្តារឡើងនៅលើគោលការណ៍មូលដ្ឋានបួនដែលហៅថា 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 +``` +**🔍 ដ៏អាចមើលបាន**៖ ព័ត៌មានត្រូវតែបង្ហាញបាននៅក្នុងរបៀបដែលអ្នកប្រើអាចយល់បានតាមការប្រើសញ្ញាផ្សេងៗរបស់ពួកគេ + +- ផ្តល់ជម្រើសអក្សរជំនួសសម្រាប់មាតិកាដែលមិនមែនអត្ថបទ (រូបភាព វីដេអូ សំឡេង) +- ការប្រៀបធៀបពណ៌គ្រប់គ្រាន់សម្រាប់អត្ថបទនិងសមាសភាព UI ទាំងអស់ +- ផ្តល់អត្ថបទបង្ហាញ និងអត្ថបទបកប្រែសម្រាប់មាតិកាមេឌៀ +- រចនាមាតិកាឱ្យនៅអាចដំណើរការបានពេលបន្ថែមទេស៍រហូតដល់ ២០០% +- ប្រើលក្ខណៈសញ្ញាច្រើន (មិនត្រឹមតែពណ៌) ដើម្បីបង្ហាញព័ត៌មាន + +**🎮 អាចប្រតិបត្តិការ**៖ អនុវត្តរួម UI គ្រប់រូបត្រូវអាចប្រើបានតាមវិធីបញ្ចូលមានស្រាប់ + +- ធ្វើអោយមុខងារទាំងអស់អាចចូលប្រើបានតាមរយៈរុករកដោយក្តារចុច +- ផ្តល់ពេលគ្រប់គ្រាន់ចំពោះអ្នកប្រើឱ្យអាននិងអន្តរាគមន៍ជាមួយមាតិកា +- ជៀសវាងមាតិកាដែលបណ្តាលឲ្យមានសញ្ញាអស់បែបកាយវិការ ឬរោគវេស្ទីប្យុល +- ជួយអ្នកប្រើទៅរុករកបានយ៉ាងមានប្រសិទ្ធភាព ជាមួយរចនាសម្ព័ន្ធច្បាស់លាស់និងសញ្ញាសំគាល់ +- ត្រួតពិនិត្យថាធាតុអន្តរក្រាលមានទំហំគោលដៅគ្រប់គ្រាន់ (ចាប់ពី ៤៤pxឡើង) + +**📖 យល់ដឹងបាន**៖ ព័ត៌មាននិងការបញ្ជារ UI ត្រូវតែច្បាស់លាស់និងងាយយល់ + +- ប្រើភាសាច្បាស់ សាមញ្ញដែលសមរម្យសម្រាប់អ្នកដំណើរការ +- ធ្វើឲ្យមាតិកាបង្ហាញនិងដំណើរការដោយវិធីអាច្យកត្រូវបានទំនង និងថេរ +- ផ្តល់ការណែនាំច្បាស់លាស់ និងសារកំហុសសម្រាប់ការបញ្ចូលអ្នកប្រើ +- ជួយអ្នកប្រើយល់និងកែប្រែកំហុសនៅក្នុងទម្រង់ +- រៀបចំមាតិកាឲ្យមានលំដាប់អាន និងហេតុផល + +**💪 ត្រាស់ទ្រាំ**៖ មាតិកាត្រូវតែដំណើរការយ៉ាងទុកចិត្តនៅលើបច្ចេកវិទ្យាផ្សេងគ្នានិងឧបករណ៍ជំនួយ +- **ប្រើ HTML ដែលមានតម្លាភាព និងមានអត្ថន័យជាគន្លងដើមរបស់អ្នក** +- **ធានាការចូលគ្នាជាមួយបច្ចេកវិទ្យាជំនួយបច្ចុប្បន្ន និងអនាគត** +- **អនុវត្តតាមស្តង់ដារ និងអនុវត្តការប្រកបដោយល្អសម្រាប់ markup** +- **សាកល្បងឆ្លងកាត់កម្មវិធីរុករក ផ្លាតហ្វតផ្លត និងឧបករណ៍ជំនួយផ្សេងៗ** +- **រៀបចំមាតិកា ដើម្បីឱ្យវាអាចធ្លាក់ចុះយ៉ាងទំនេរចិត្ត ប្រញាប់ពេលមុខងារខ្ពស់មិនគាំទ្រ** + +### 🎯 **ត្រួតពិនិត្យ PRINCIPLES POUR៖ ដើម្បីឱ្យវាចំរូង** + +**ការកាន់ត្រង់រហ័សលើមូលដ្ឋាន៖** +- តើអ្នកអាចគិតពីមុខងារបណ្តាញដែលបរាជ័យក្នុង PRINCIPLES 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] +``` +> **ចងចាំ**៖ ចាប់ផ្តើមជាមួយការកែលម្អដែលមានឥទ្ធិពលខ្ពស់និងពិបាកតិច។ Semantic HTML និងអត្ថបទ alt ផ្ដល់ឱ្យអ្នកនូវការកែលម្អ ចូលដល់បានយោគយល់បំផុតក្នុងការអនុវត្តឥតមានការខិតខំ! + +## ការបង្កើតរចនាប័ទ្មវិស្វកម្មដែលចូលដល់បាន + +ការរចនាវិស្វកម្មល្អ និងការចូលដល់បានដំណើរការចំហន់ទំហឹងគ្នា។ ពេលអ្នករចនាជាមួយការចូលដល់បានក្នុងចិត្ត អ្នកជាច្រើនបានរកឃើញថា ការដាក់បំណុលទាំងនេះនាំឲ្យមានដំណោះស្រាយស្អាត និងទំនើប ដែលមានអត្ថប្រយោជន៍សម្រាប់អ្នកប្រើប្រាស់ទាំងអស់។ + +មកពិនិត្យពីរបៀបបង្កើតរចនាប័ទ្មមើលទៅស្អាតដែលធ្វើការសម្រាប់គ្រប់គ្នា មិនគិតពីសមត្ថភាពមើលស្រួលរបស់ពួកគេ ឬស្ថានភាពដែលពួកគេចំពោះមុខពេលមើលមាតិការបស់អ្នក។ + +### រចនាប័ទ្ម ពណ៌ និងវិធីសាស្ត្រចូលដល់បាន + +ពណ៌មានអំណាចក្នុងការទំនាក់ទំនង ប៉ុន្តែលើកលែងតែវាជាវិធីតែមួយក្នុងការបញ្ជាក់ព័ត៌មានសំខាន់ៗ។ ការរចនាឆ្លាស់កាត់ពីពណ៌បង្កើតបទពិសោធន៍ដែលមានស្ថិតិច្រើន និងបញ្ចូលគ្នា ដែលអាចដំណើរការនៅស្ថានភាពតែមួយច្រើន។ + +**រចនាសម្រាប់ភាពខុសគ្នានៃការមើលពណ៌៖** + +ប្រហែល 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 ព្យួរប្រឆាំងជាមួយធាតុជុំវិញ +- **ទទឹង**៖ ត្រង់ 2 ពិច ហើយវិលជុំវិញធាតុទាំងមូល +- **ភាពមានលក្ខណៈជាប់ទ្រាំ**៖ គួរតែបន្តឲ្យមិនលេចធ្លាយរហូតដល់ផ្តោតផ្លាស់ទីទៅកន្លែងផ្សេង +- **ភាពបុគ្គលិកភាព**៖ ត្រូវមានភាពខុសគ្នាច្បាស់ពីសភាព UI ផ្សេងៗ + +> 💡 **គំនិតរចនា៖** សញ្ញាប្តោតល្អជាញឹកញាប់ប្រើរួមគ្នានៃរូបរាង, ស្លាបប្រឆាំងប្រអប់, និងការផ្លាស់ប្ដូរពណ៌ ដើម្បីធានាថា វាពិតជាខ្វះខាតនៅលើផ្ទៃខាងក្រោយ និងបរិបទផ្សេងៗ។ + +✅ **ពិនិត្យវាយតម្លៃសញ្ញាប្តោត**៖ ចូលតាមទំព័រទៅតាម Tab ហើយកត់កំណត់ថាតើធាតុណាដែលមានសញ្ញាដែលច្បាស់លាស់។ តើមានធាតុណាដែលមិនងាយសម្គាល់ ឬខ្វះដោយសេរីទាំងសោះ? + +### Semantic HTML៖ មូលដ្ឋាននៃការចូលដល់បាន + +Semantic HTML គឺដូចជាការផ្ដល់ប្រព័ន្ធ GPS សម្រាប់បច្ចេកវិទ្យាជំនួយក្នុងគេហទំព័ររបស់អ្នក។ ពេលដែលអ្នកប្រើធាតុ HTML ដែលត្រឹមត្រូវសម្រាប់គោលបំណងរបស់ពួកវា អ្នកកំពុងផ្ដល់ដំណឹងឲ្យកម្មវិធីអានអេក្រង់ ក្ចណ្ដាលក្តារ និងឧបករណ៍ផ្សេងៗជាមួយផែនទីលម្អិតជួយឲ្យអ្នកប្រើប្រាស់រុករកប្រសើរឡើង។ + +នេះជាសេចក្ដីប្រៀបធៀបទំលាប់សម្រាប់ខ្ញុំ៖ semantic HTML ជាគុណភាពខុសគ្នារវាងបណ្ណាល័យដែលមានការរៀបចំល្អមានចំណាត់ថ្នាក់ច្បាស់លាស់ និងសញ្ញាជំនួយធ្វើឲ្យមនុស្សទៅរកបានយ៉ាងងាយស្រួល ទល់នឹងឃ្លាំងស្ករពូជ ដែលសៀវភៅត្រូវដាក់ចោលគ្មានលំដាប់ណា។ ទាំងពីរតំបន់មានសៀវភៅដូចគ្នា តែអ្នកចង់ព្យាយាមស្វែងរកអ្វីមួយនៅណាមួយ? + +```mermaid +flowchart TD + A[🏠 ឯកសារ HTML] --> B[📰 ក្បាលទំព័រ] + A --> C[🧭 មឺនុយ] + A --> D[📄 មុខ] + A --> E[📋 ជើងទំព័រ] + + B --> B1[h1: ឈ្មោះគេហទំព័រ
រូបតំណាង & ហ្សីនប៊្រេន] + C --> C1[ul: មឺនុយរុករក
តំណភ្ជាប់សំខាន់ៗ] + D --> D1[អត្ថបទ: ខ្លឹមសារ
ផ្នែក: ផ្នែករង] + D --> D2[ជំហៀង: ផ្នែកខាងបាន
ខ្លឹមសារពាក់ព័ន្ធ] + E --> E1[មឺនុយ: តំណភ្ជាប់ជើងទំព័រ
ព័ត៌មានសិទ្ធិបានរក្សា] + + 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...

+
+
+ + +
+ + +``` + +**ហេតុអ្វីបានជា semantic HTML ផ្លាស់ប្ដូរការចូលដល់បាន៖** + +| ធាតុ Semantic | គោលបំណង | အားប្រយោជន៍ Screen Reader | +|-----------------|----------|-------------------------| +| `
` | ចំណងជើងទំព័រ ឬផ្នែក | "Banner landmark" - ជំនាន់រហ័សទៅផ្នែកលើ | +| `