From f6c403cc80d8dd76f6a2dbd9ed1a27caba10bc4a Mon Sep 17 00:00:00 2001 From: Sboonny Date: Sun, 22 Jan 2023 08:11:54 +0000 Subject: [PATCH] feat: new feature! --- .github/workflows/codeql-analysis.yml | 6 +- .../workflows/crowdin-download.client-ui.yml | 2 +- .../workflows/crowdin-download.curriculum.yml | 4 +- .github/workflows/crowdin-download.docs.yml | 2 +- .../workflows/crowdin-upload.client-ui.yml | 2 +- .../workflows/crowdin-upload.curriculum.yml | 2 +- .github/workflows/crowdin-upload.docs.yml | 2 +- .github/workflows/e2e-mobile.yml | 6 +- .github/workflows/e2e-third-party.yml | 6 +- .github/workflows/e2e-web.yml | 16 +- .github/workflows/i18n-validate-builds.yml | 4 +- .github/workflows/i18n-validate-prs.yml | 4 +- .github/workflows/node.js-find-unused.yml | 4 +- .github/workflows/node.js-tests-upcoming.yml | 8 +- .github/workflows/node.js-tests.yml | 16 +- .gitignore | 4 + .prettierignore | 4 + api-server/src/server/boot/settings.js | 6 - client/gatsby-node.js | 44 +- client/i18n/locales/arabic/intro.json | 124 +- client/i18n/locales/arabic/translations.json | 44 +- .../locales/chinese-traditional/intro.json | 6 +- .../chinese-traditional/motivation.json | 951 ++++++------- .../chinese-traditional/translations.json | 14 +- client/i18n/locales/chinese/intro.json | 6 +- client/i18n/locales/chinese/motivation.json | 951 ++++++------- client/i18n/locales/chinese/translations.json | 14 +- client/i18n/locales/english/intro.json | 6 +- client/i18n/locales/english/translations.json | 13 +- client/i18n/locales/espanol/intro.json | 6 +- client/i18n/locales/espanol/translations.json | 14 +- client/i18n/locales/german/intro.json | 6 +- client/i18n/locales/german/translations.json | 14 +- client/i18n/locales/italian/intro.json | 6 +- client/i18n/locales/italian/translations.json | 16 +- client/i18n/locales/japanese/intro.json | 6 +- .../i18n/locales/japanese/translations.json | 24 +- client/i18n/locales/portuguese/intro.json | 6 +- .../i18n/locales/portuguese/translations.json | 14 +- client/i18n/locales/ukrainian/intro.json | 6 +- .../i18n/locales/ukrainian/translations.json | 14 +- client/package.json | 19 +- client/src/analytics/index.ts | 25 + client/src/analytics/index.tsx | 15 - .../client-only-routes/show-certification.tsx | 8 +- .../client-only-routes/show-project-links.tsx | 1 + .../src/components/Donation/donate-form.tsx | 15 +- .../components/Donation/donation-modal.tsx | 14 +- .../Donation/donation-text-components.tsx | 10 +- client/src/components/Donation/donation.css | 6 + .../src/components/Donation/paypal-button.tsx | 5 +- .../components/Donation/stripe-card-form.tsx | 6 +- .../Header/components/nav-links.tsx | 2 +- .../Header/components/universal-nav.css | 24 +- .../components/app-mount-notifier.test.tsx | 1 - .../__snapshots__/loader.test.tsx.snap | 6 + client/src/components/helpers/loader.css | 2 + client/src/components/helpers/loader.tsx | 38 +- .../src/components/layouts/certification.tsx | 10 +- client/src/components/layouts/default.tsx | 21 +- client/src/components/layouts/rtl-layout.css | 22 +- .../profile/components/certifications.tsx | 4 +- .../profile/components/time-line.test.tsx | 9 +- .../profile/components/time-line.tsx | 5 +- .../search/searchBar/searchbar-base.css | 11 +- .../components/search/searchBar/searchbar.css | 40 +- client/src/components/settings/about.tsx | 2 + .../src/components/settings/certification.js | 6 +- .../settings/certification.test.tsx | 8 +- .../solution-display-widget/index.tsx | 177 ++- .../solution-display-widget.css | 3 + client/src/pages/donate.tsx | 20 +- client/src/pages/learn.tsx | 10 +- client/src/redux/action-types.js | 1 - client/src/redux/actions.js | 4 - client/src/redux/donation-saga.js | 17 +- client/src/redux/donation-saga.test.js | 24 +- client/src/redux/fetch-user-saga.js | 9 +- client/src/redux/ga-saga.js | 79 +- client/src/redux/ga-saga.test.js | 15 +- client/src/redux/index.js | 4 +- client/src/redux/prop-types.ts | 79 +- client/src/redux/save-challenge-saga.js | 2 +- client/src/redux/selectors.js | 11 +- client/src/redux/types.ts | 14 - client/src/resources/cert-and-project-map.ts | 2 +- .../templates/Challenges/classic/editor.tsx | 11 +- .../Challenges/classic/lower-jaw.tsx | 4 +- .../Challenges/classic/mobile-layout.tsx | 1 - .../Challenges/components/ResetModal.tsx | 2 +- .../components/completion-modal.tsx | 4 +- .../Challenges/components/help-modal.tsx | 6 +- .../Challenges/components/shortcuts-modal.tsx | 2 +- .../Challenges/components/tool-panel.tsx | 2 +- .../Challenges/components/video-modal.tsx | 6 +- client/src/templates/Challenges/odin/Show.tsx | 427 ++++++ client/src/templates/Challenges/odin/show.css | 28 + .../Challenges/projects/tool-panel.tsx | 2 +- .../Challenges/rechallenge/transformers.js | 3 +- .../Challenges/redux/action-types.js | 1 - .../src/templates/Challenges/redux/actions.js | 1 - .../Challenges/redux/completion-epic.js | 1 + .../redux/current-challenge-saga.js | 4 +- .../redux/execute-challenge-saga.js | 4 +- .../templates/Challenges/redux/selectors.js | 1 - .../src/templates/Challenges/utils/build.ts | 2 +- .../Challenges/{video/show.css => video.css} | 0 .../src/templates/Challenges/video/Show.tsx | 2 +- .../Introduction/components/block.tsx | 16 +- .../components/cert-challenge.tsx | 7 +- .../Introduction/components/challenges.tsx | 30 +- client/src/utils/A-B-tester.test.ts | 32 - client/src/utils/A-B-tester.ts | 21 - client/src/utils/path-parsers.ts | 3 - client/src/utils/tone/index.ts | 12 +- client/utils/challenge-types.js | 16 +- client/utils/gatsby/challenge-page-creator.js | 8 +- client/utils/help-category-map.json | 1 + config/analytics-settings.js | 7 +- config/knip/knip.dev.json | 27 - config/knip/knip.json | 28 - .../meta.json | 76 +- .../_meta/the-odin-project/meta.json | 124 ++ ...nd-development-libraries-certification.yml | 4 +- ...thms-and-data-structures-certification.yml | 10 +- .../legacy-front-end-certification.yml | 6 +- .../legacy-full-stack-certification.yml | 10 +- ...ty-and-quality-assurance-certification.yml | 2 +- .../responsive-web-design-certification.yml | 6 +- ...-meaning-by-using-descriptive-link-text.md | 4 +- ...adjust-the-hover-state-of-an-anchor-tag.md | 4 +- ...fill-in-the-blank-with-placeholder-text.md | 2 +- ...-to-external-pages-with-anchor-elements.md | 8 +- .../turn-an-image-into-a-link.md | 2 +- .../build-a-personal-portfolio-webpage.md | 2 +- .../build-a-product-landing-page.md | 2 +- .../convert-celsius-to-fahrenheit.md | 2 +- ...-arrays-contents-using-bracket-notation.md | 6 +- ...ss-property-names-with-bracket-notation.md | 2 +- ...d-key-value-pairs-to-javascript-objects.md | 2 +- ...create-complex-multi-dimensional-arrays.md | 6 +- ...odify-an-object-nested-within-an-object.md | 2 +- ...-an-array-to-store-a-collection-of-data.md | 2 +- .../access-array-data-with-indexes.md | 2 +- ...s-multi-dimensional-arrays-with-indexes.md | 6 +- .../accessing-nested-arrays.md | 4 +- ...object-properties-with-bracket-notation.md | 10 +- ...ing-object-properties-with-dot-notation.md | 2 +- ...essing-object-properties-with-variables.md | 6 +- ...ng-the-value-of-one-variable-to-another.md | 6 +- .../comment-your-javascript-code.md | 6 +- .../comparison-with-the-equality-operator.md | 2 +- .../count-backwards-with-a-for-loop.md | 2 +- .../declare-javascript-variables.md | 12 +- .../declare-string-variables.md | 10 +- ...ete-properties-from-a-javascript-object.md | 2 +- .../escape-sequences-in-strings.md | 14 +- ...rences-between-the-var-and-let-keywords.md | 18 +- .../find-the-length-of-a-string.md | 8 +- .../global-scope-and-functions.md | 4 +- .../global-vs.-local-scope-in-functions.md | 10 +- ...-variables-with-the-assignment-operator.md | 4 +- .../iterate-with-javascript-for-loops.md | 4 +- .../local-scope-and-functions.md | 10 +- .../modify-array-data-with-indexes.md | 2 +- .../quoting-strings-with-single-quotes.md | 8 +- .../basic-javascript/record-collection.md | 4 +- .../return-early-pattern-for-functions.md | 2 +- ...rom-many-options-with-switch-statements.md | 8 +- ...ing-values-with-the-assignment-operator.md | 4 +- ...one-number-from-another-with-javascript.md | 8 +- .../understanding-boolean-values.md | 2 +- ...rstanding-case-sensitivity-in-variables.md | 4 +- ...ndefined-value-returned-from-a-function.md | 4 +- .../understanding-uninitialized-variables.md | 4 +- .../updating-object-properties.md | 4 +- ...to-find-the-first-character-in-a-string.md | 6 +- ...-to-find-the-last-character-in-a-string.md | 6 +- ...n-to-find-the-nth-character-in-a-string.md | 8 +- ...d-the-nth-to-last-character-in-a-string.md | 4 +- ...-multiple-conditional-ternary-operators.md | 2 +- .../use-recursion-to-create-a-countdown.md | 2 +- ...-recursion-to-create-a-range-of-numbers.md | 2 +- ...mixed-usage-of-single-and-double-quotes.md | 10 +- ...-parentheses-brackets-braces-and-quotes.md | 4 +- ...t-operator-instead-of-equality-operator.md | 2 +- ...pare-scopes-of-the-var-and-let-keywords.md | 12 +- ...plete-a-promise-with-resolve-and-reject.md | 2 +- ...-an-export-fallback-with-export-default.md | 2 +- .../create-strings-using-template-literals.md | 6 +- .../es6/reuse-javascript-code-using-import.md | 4 +- ...ns-to-write-concise-anonymous-functions.md | 2 +- ...ad-operator-to-evaluate-arrays-in-place.md | 2 +- ...rations-using-object-property-shorthand.md | 4 +- ...de-effects-using-functional-programming.md | 12 +- .../learn-about-functional-programming.md | 2 +- ...avoid-external-dependence-in-a-function.md | 2 +- ...actor-global-variables-out-of-functions.md | 4 +- ...-an-array-using-slice-instead-of-splice.md | 2 +- ...ray-without-changing-the-original-array.md | 16 +- ...part-of-an-array-using-the-slice-method.md | 2 +- ...nd-the-hazards-of-using-imperative-code.md | 2 +- ...ap-method-to-extract-data-from-an-array.md | 2 +- .../drop-it.md | 2 +- .../search-and-replace.md | 10 +- .../steamroller.md | 2 +- .../caesars-cipher.md | 2 +- .../cash-register.md | 18 +- .../palindrome-checker.md | 2 +- .../roman-numeral-converter.md | 2 +- .../telephone-number-validator.md | 2 +- .../inherit-behaviors-from-a-supertype.md | 4 +- .../iterate-over-all-properties.md | 2 +- ...or-property-when-changing-the-prototype.md | 2 +- ...reset-an-inherited-constructor-property.md | 2 +- .../understand-own-properties.md | 2 +- ...iately-invoked-function-expression-iife.md | 4 +- ...n-object-from-being-modified-externally.md | 4 +- .../regular-expressions/extract-matches.md | 2 +- .../ignore-case-while-matching.md | 2 +- ...ral-string-with-different-possibilities.md | 20 +- .../match-ending-string-patterns.md | 4 +- .../match-literal-strings.md | 10 +- ...e-character-with-multiple-possibilities.md | 4 +- .../build-a-drum-machine.md | 2 +- .../build-a-javascript-calculator.md | 2 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 28 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-an-html-file.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- ...e-of-any-node.js-project-or-npm-package.md | 2 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../data-analysis-example-a.md | 4 +- .../data-analysis-example-b.md | 4 +- .../data-cleaning-and-visualizations.md | 4 +- .../data-cleaning-with-dataframes.md | 4 +- .../jupyter-notebooks-cells.md | 4 +- ...-notebooks-importing-and-exporting-data.md | 4 +- .../numpy-algebra-and-size.md | 4 +- .../numpy-introduction-a.md | 4 +- .../numpy-introduction-b.md | 4 +- .../numpy-operations.md | 4 +- ...onal-selection-and-modifying-dataframes.md | 4 +- .../pandas-creating-columns.md | 4 +- .../python-functions-and-collections.md | 4 +- .../python-introduction.md | 4 +- .../python-iteration-and-modules.md | 4 +- .../reading-data-csv-and-txt.md | 4 +- .../reading-data-from-databases.md | 4 +- .../reading-data-introduction.md | 4 +- .../sea-level-predictor.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 5 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../build-a-personal-portfolio-webpage.md | 2 +- .../build-a-product-landing-page.md | 2 +- .../build-a-survey-form.md | 6 +- .../build-a-technical-documentation-page.md | 8 +- .../build-a-tribute-page.md | 6 +- .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../60fab9f17fa294054b74228c.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 40 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 144 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 154 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 154 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../caesars-cipher.md | 2 +- .../cash-register.md | 18 +- .../palindrome-checker.md | 2 +- .../roman-numeral-converter.md | 2 +- .../telephone-number-validator.md | 2 +- .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...one-number-from-another-with-javascript.md | 6 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 4 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- .../use-the-.env-file.md | 4 +- ...e-of-any-node.js-project-or-npm-package.md | 2 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 5 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dc17d3bf86c76b9248c6eb4.md | 2 +- .../5dc2385ff86c76b9248c6eb7.md | 2 +- .../5dc23991f86c76b9248c6eb8.md | 2 +- .../5dfa22d1b521be39a3de7be0.md | 2 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../62dabe2ef403a12d5d295273.md | 2 +- .../60fab9f17fa294054b74228c.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 42 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 146 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 156 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 156 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...one-number-from-another-with-javascript.md | 6 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 4 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- .../use-the-.env-file.md | 4 +- ...e-of-any-node.js-project-or-npm-package.md | 2 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 5 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dc17d3bf86c76b9248c6eb4.md | 2 +- .../5dc2385ff86c76b9248c6eb7.md | 2 +- .../5dc23991f86c76b9248c6eb8.md | 2 +- .../5dfa22d1b521be39a3de7be0.md | 2 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../62dabe2ef403a12d5d295273.md | 2 +- .../60fab9f17fa294054b74228c.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 42 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 146 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 156 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 156 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...one-number-from-another-with-javascript.md | 4 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 4 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- ...e-of-any-node.js-project-or-npm-package.md | 2 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../sea-level-predictor.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 5 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 53 + .../elements-and-tags-question-b.md | 49 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 47 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 58 + .../links-and-images-question-c.md | 59 + .../links-and-images-question-d.md | 111 ++ .../links-and-images-question-e.md | 97 ++ .../links-and-images-question-f.md | 93 ++ .../links-and-images-question-g.md | 93 ++ .../links-and-images-question-h.md | 97 ++ .../project-create-a-recipe-page.md | 207 +++ ...d-ordered-and-unordered-list-question-a.md | 64 + ...d-ordered-and-unordered-list-question-b.md | 44 + ...d-ordered-and-unordered-list-question-c.md | 44 + .../working-with-text-question-a.md | 59 + .../working-with-text-question-b.md | 39 + .../working-with-text-question-c.md | 46 + .../working-with-text-question-d.md | 38 + .../working-with-text-question-e.md | 65 + .../working-with-text-question-f.md | 66 + .../working-with-text-question-g.md | 48 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 38 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5c1cb7575c7551ed8a40.md | 116 -- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6a7d4ba8037bc086c2c7.md | 127 -- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 142 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 154 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 152 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...one-number-from-another-with-javascript.md | 4 +- ...st-parameter-to-reassign-array-elements.md | 6 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 4 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- .../use-the-.env-file.md | 4 +- ...e-of-any-node.js-project-or-npm-package.md | 22 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../sea-level-predictor.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 5 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 42 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 146 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 156 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 156 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...one-number-from-another-with-javascript.md | 4 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 4 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- ...e-of-any-node.js-project-or-npm-package.md | 2 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../sea-level-predictor.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 5 +- .../problem-1-multiples-of-3-and-5.md | 2 +- ...problem-103-special-subset-sums-optimum.md | 2 +- .../problem-110-diophantine-reciprocals-ii.md | 10 +- .../problem-111-primes-with-runs.md | 36 +- .../problem-112-bouncy-numbers.md | 4 +- .../problem-113-non-bouncy-numbers.md | 10 +- ...oblem-114-counting-block-combinations-i.md | 12 +- ...blem-115-counting-block-combinations-ii.md | 18 +- .../problem-116-red-green-or-blue-tiles.md | 16 +- .../problem-117-red-green-and-blue-tiles.md | 10 +- .../problem-118-pandigital-prime-sets.md | 6 +- .../problem-119-digit-power-sum.md | 10 +- .../problem-120-square-remainders.md | 6 +- .../problem-121-disc-game-prize-fund.md | 10 +- .../problem-122-efficient-exponentiation.md | 10 +- .../problem-123-prime-square-remainders.md | 8 +- .../problem-124-ordered-radicals.md | 4 +- .../problem-125-palindromic-sums.md | 14 +- .../problem-126-cuboid-layers.md | 14 +- .../project-euler/problem-127-abc-hits.md | 12 +- .../problem-128-hexagonal-tile-differences.md | 12 +- .../problem-129-repunit-divisibility.md | 12 +- ...-composites-with-prime-repunit-property.md | 12 +- .../problem-131-prime-cube-partnership.md | 10 +- .../problem-132-large-repunit-factors.md | 10 +- .../problem-133-repunit-nonfactors.md | 10 +- .../problem-134-prime-pair-connection.md | 10 +- .../problem-135-same-differences.md | 10 +- .../problem-136-singleton-difference.md | 10 +- .../problem-137-fibonacci-golden-nuggets.md | 10 +- ...problem-138-special-isosceles-triangles.md | 12 +- ...em-157-solving-the-diophantine-equation.md | 2 +- ...-zeros-of-a-function-of-three-variables.md | 2 +- .../problem-2-even-fibonacci-numbers.md | 2 +- .../problem-21-amicable-numbers.md | 14 +- .../project-euler/problem-22-names-scores.md | 12 +- .../problem-23-non-abundant-sums.md | 14 +- .../problem-24-lexicographic-permutations.md | 18 +- .../problem-25-1000-digit-fibonacci-number.md | 22 +- .../problem-26-reciprocal-cycles.md | 20 +- .../problem-27-quadratic-primes.md | 26 +- .../problem-28-number-spiral-diagonals.md | 24 +- .../problem-29-distinct-powers.md | 16 +- .../problem-30-digit-n-powers.md | 16 +- .../project-euler/problem-31-coin-sums.md | 18 +- .../problem-32-pandigital-products.md | 20 +- ...em-341-golombs-self-describing-sequence.md | 2 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 38 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 142 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 154 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 152 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...one-number-from-another-with-javascript.md | 4 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 4 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- ...e-of-any-node.js-project-or-npm-package.md | 2 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 3 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../60fab9f17fa294054b74228c.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 38 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 142 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 154 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 152 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...one-number-from-another-with-javascript.md | 4 +- .../exercise-tracker.md | 58 +- .../file-metadata-microservice.md | 20 +- .../request-header-parser-microservice.md | 18 +- .../timestamp-microservice.md | 28 +- .../url-shortener-microservice.md | 20 +- ...t-query-parameter-input-from-the-client.md | 4 +- .../meet-the-node-console.md | 22 +- .../serve-json-on-a-specific-route.md | 2 +- .../use-the-.env-file.md | 4 +- ...e-of-any-node.js-project-or-npm-package.md | 22 +- .../install-and-set-up-mongoose.md | 24 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 10 +- .../american-british-translator.md | 66 +- .../issue-tracker.md | 16 +- .../metric-imperial-converter.md | 20 +- .../personal-library.md | 14 +- .../sudoku-solver.md | 18 +- .../sea-level-predictor.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 5 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 42 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 146 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 156 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 156 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...one-number-from-another-with-javascript.md | 4 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 4 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- ...e-of-any-node.js-project-or-npm-package.md | 2 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 3 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../60fab9f17fa294054b74228c.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 38 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 142 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 154 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 154 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- ...ad-only-variable-with-the-const-keyword.md | 24 +- .../decrement-a-number-with-javascript.md | 4 +- .../escaping-literal-quotes-in-strings.md | 14 +- .../basic-javascript/golf-code.md | 10 +- .../increment-a-number-with-javascript.md | 12 +- ...-variables-with-the-assignment-operator.md | 10 +- .../introducing-else-if-statements.md | 12 +- .../introducing-else-statements.md | 10 +- .../iterate-odd-numbers-with-a-for-loop.md | 12 +- ...terate-through-an-array-with-a-for-loop.md | 12 +- ...terate-with-javascript-do...while-loops.md | 18 +- .../iterate-with-javascript-for-loops.md | 26 +- .../iterate-with-javascript-while-loops.md | 12 +- .../local-scope-and-functions.md | 10 +- .../logical-order-in-if-else-statements.md | 14 +- .../manipulate-arrays-with-pop.md | 14 +- .../manipulate-arrays-with-push.md | 10 +- .../manipulate-arrays-with-shift.md | 14 +- .../manipulate-arrays-with-unshift.md | 6 +- .../manipulating-complex-objects.md | 24 +- .../modify-array-data-with-indexes.md | 12 +- ...-identical-options-in-switch-statements.md | 14 +- .../multiply-two-decimals-with-javascript.md | 2 +- .../nest-one-array-within-another-array.md | 8 +- .../basic-javascript/nesting-for-loops.md | 8 +- ...sing-values-to-functions-with-arguments.md | 16 +- .../practice-comparing-different-values.md | 14 +- .../basic-javascript/profile-lookup.md | 10 +- .../quoting-strings-with-single-quotes.md | 20 +- .../basic-javascript/record-collection.md | 30 +- .../replace-loops-using-recursion.md | 14 +- .../replacing-if-else-chains-with-switch.md | 14 +- ...urn-a-value-from-a-function-with-return.md | 14 +- .../return-early-pattern-for-functions.md | 28 +- ...returning-boolean-values-from-functions.md | 16 +- ...rom-many-options-with-switch-statements.md | 20 +- .../basic-javascript/shopping-list.md | 6 +- .../basic-javascript/stand-in-line.md | 18 +- ...in-one-variable-using-javascript-arrays.md | 10 +- ...ing-values-with-the-assignment-operator.md | 10 +- ...one-number-from-another-with-javascript.md | 12 +- .../testing-objects-for-properties.md | 10 +- .../understand-string-immutability.md | 12 +- .../understanding-boolean-values.md | 10 +- ...rstanding-case-sensitivity-in-variables.md | 22 +- ...ndefined-value-returned-from-a-function.md | 16 +- .../understanding-uninitialized-variables.md | 12 +- .../updating-object-properties.md | 10 +- ...to-find-the-first-character-in-a-string.md | 18 +- ...-to-find-the-last-character-in-a-string.md | 16 +- ...n-to-find-the-nth-character-in-a-string.md | 16 +- ...d-the-nth-to-last-character-in-a-string.md | 18 +- ...se-conditional-logic-with-if-statements.md | 24 +- ...-multiple-conditional-ternary-operators.md | 14 +- .../use-recursion-to-create-a-countdown.md | 24 +- ...-recursion-to-create-a-range-of-numbers.md | 16 +- .../use-the-conditional-ternary-operator.md | 18 +- .../use-the-parseint-function-with-a-radix.md | 18 +- .../use-the-parseint-function.md | 16 +- .../using-objects-for-lookups.md | 12 +- .../basic-javascript/word-blanks.md | 18 +- ...rite-reusable-javascript-with-functions.md | 14 +- ...pare-scopes-of-the-var-and-let-keywords.md | 26 +- .../mutate-an-array-declared-with-const.md | 24 +- ...f-an-array-using-concat-instead-of-push.md | 18 +- ...ramming-to-convert-strings-to-url-slugs.md | 26 +- ...de-effects-using-functional-programming.md | 22 +- ...ray-into-a-string-using-the-join-method.md | 20 +- ...bine-two-arrays-using-the-concat-method.md | 10 +- .../implement-map-on-a-prototype.md | 18 +- ...lement-the-filter-method-on-a-prototype.md | 14 +- ...ion-to-currying-and-partial-application.md | 10 +- .../learn-about-functional-programming.md | 14 +- ...avoid-external-dependence-in-a-function.md | 6 +- ...actor-global-variables-out-of-functions.md | 4 +- ...-an-array-using-slice-instead-of-splice.md | 6 +- ...ray-without-changing-the-original-array.md | 4 +- ...part-of-an-array-using-the-slice-method.md | 2 +- ...ay-alphabetically-using-the-sort-method.md | 2 +- ...er-or-reduce-to-solve-a-complex-problem.md | 6 +- ...ry-element-in-an-array-meets-a-criteria.md | 2 +- ...ap-method-to-extract-data-from-an-array.md | 2 +- ...ny-elements-in-an-array-meet-a-criteria.md | 10 +- .../exercise-tracker.md | 8 +- .../file-metadata-microservice.md | 2 +- .../request-header-parser-microservice.md | 2 +- .../timestamp-microservice.md | 4 +- .../url-shortener-microservice.md | 2 +- .../meet-the-node-console.md | 2 +- .../serve-json-on-a-specific-route.md | 2 +- ...e-of-any-node.js-project-or-npm-package.md | 2 +- .../install-and-set-up-mongoose.md | 2 +- .../set-up-a-template-engine.md | 2 +- .../learn-how-javascript-assertions-work.md | 2 +- .../american-british-translator.md | 2 +- .../issue-tracker.md | 2 +- .../metric-imperial-converter.md | 2 +- .../personal-library.md | 2 +- .../sudoku-solver.md | 2 +- .../anonymous-message-board.md | 2 +- .../secure-real-time-multiplayer-game.md | 2 +- .../stock-price-checker.md | 2 +- .../install-and-require-helmet.md | 2 +- .../algorithms/implement-binary-search.md | 5 +- .../build-a-nightlife-coordination-app.md | 2 +- .../take-home-projects/build-a-voting-app.md | 2 +- ...build-an-image-search-abstraction-layer.md | 2 +- .../chart-the-stock-market.md | 2 +- .../elements-and-tags-question-a.md | 54 + .../elements-and-tags-question-b.md | 50 + .../html-boilerplate-question-a.md | 55 + .../html-boilerplate-question-b.md | 47 + .../html-boilerplate-question-c.md | 66 + .../html-boilerplate-question-d.md | 48 + .../introduction-to-html-css-question-a.md | 42 + .../introduction-to-html-css-question-b.md | 37 + .../introduction-to-html-css-question-c.md | 34 + .../introduction-to-html-css-question-d.md | 35 + .../links-and-images-question-a.md | 66 + .../links-and-images-question-b.md | 55 + .../links-and-images-question-c.md | 56 + .../links-and-images-question-d.md | 112 ++ .../links-and-images-question-e.md | 98 ++ .../links-and-images-question-f.md | 94 ++ .../links-and-images-question-g.md | 94 ++ .../links-and-images-question-h.md | 98 ++ .../project-create-a-recipe-page.md | 204 +++ ...d-ordered-and-unordered-list-question-a.md | 65 + ...d-ordered-and-unordered-list-question-b.md | 45 + ...d-ordered-and-unordered-list-question-c.md | 45 + .../working-with-text-question-a.md | 60 + .../working-with-text-question-b.md | 40 + .../working-with-text-question-c.md | 47 + .../working-with-text-question-d.md | 39 + .../working-with-text-question-e.md | 66 + .../working-with-text-question-f.md | 67 + .../working-with-text-question-g.md | 49 + .../6196d1ac33c68d27dcda5796.md | 16 +- .../619d229b0e542520cd91c685.md | 16 +- .../619d2d4e80400325ff89664a.md | 10 +- .../619d2ebc81ba81271460850d.md | 9 +- .../619d32c7fa21f32aaa91d499.md | 11 +- .../619d333b738e3c2b5d58b095.md | 11 +- .../619d337765b9f02c10e93722.md | 22 +- .../5d822fd413a79914d39e98f0.md | 4 +- .../5dfa2407b521be39a3de7be1.md | 2 +- .../60fab9f17fa294054b74228c.md | 2 +- .../620179bc0a6a2358c72b90ad.md | 2 +- .../615f2abbe7d18d49a1e0e1c8.md | 14 +- .../615f2d4150fe0d4cbd0f2628.md | 16 +- .../615f34948891834dd77655a6.md | 18 +- .../615f34ecc1091b4fd5a8a484.md | 20 +- .../615f357957e370510f21ea16.md | 24 +- .../615f378014c2da526a109c81.md | 24 +- .../615f38279e5c3d53692ea441.md | 24 +- .../615f38cabc64e3556f98cc1a.md | 28 +- .../615f3949f58e12577dcefb00.md | 28 +- .../615f39d7da41b15851fa3fb9.md | 28 +- .../615f3b091162165948e1cb33.md | 28 +- .../615f3cafd794015aa9547a6d.md | 28 +- .../615f3d9e59db4b5b8e960762.md | 28 +- .../615f3e1b7233ee5c7595771f.md | 28 +- .../615f3e4af8008c5d494d3afe.md | 28 +- .../615f3ed16592445e57941aec.md | 28 +- .../615f405b89a7ec5f8e2d11f4.md | 30 +- .../615f40b01f680e608d360ed4.md | 30 +- .../615f4172e9eec061d6456221.md | 30 +- .../615f41c979787462e76dab90.md | 30 +- .../615f423cf65d5864132a0956.md | 30 +- .../615f42a021625f656101ef93.md | 38 +- .../615f4bfb9de4a16703b56eb6.md | 48 +- .../615f4ce9d877b668417c0c42.md | 36 +- .../615f4dde9d72e3694cb9ee3b.md | 40 +- .../615f4ec58334106a4170c2a8.md | 46 +- .../615f4f9e4a40566b776a8f38.md | 60 +- .../615f50473cc0196c6dd3892a.md | 54 +- .../615f51257a8a516d80b6c743.md | 52 +- .../615f51e4e5b24a6e80eccce1.md | 78 +- .../615f522dea4f776f64dc3e91.md | 60 +- .../615f5486b8fd4b71633f69b0.md | 87 +- .../615f575b50b91e72af079480.md | 97 +- .../615f5af373a68e744a3c5a76.md | 85 +- .../615f5fd85d0062761f288364.md | 83 +- .../615f61338c8ca176d6445574.md | 87 +- .../615f666ac5edea782feb7e75.md | 91 +- .../615f671b6d1919792745aa5d.md | 102 +- .../615f6823d0815b7a991f2a75.md | 106 +- .../615f6b2d164f81809efd9bdc.md | 131 +- .../615f6cc778f7698258467596.md | 118 +- .../615f6fddaac1e083502d3e6a.md | 106 +- .../615f70077a4ff98424236c1e.md | 100 +- .../615f72a872354a850d4f533e.md | 100 +- .../615f74a71f1e498619e38ee8.md | 109 +- .../615f7ad94380408d971d14f6.md | 102 +- .../615f7bc680f7168ea01ebf99.md | 111 +- .../615f7c71eab8218f846e4503.md | 133 +- .../615f7d489a581590d1350288.md | 115 +- .../615f7de4487b64919bb4aa5e.md | 142 +- .../615f7e7281626a92bbd62da8.md | 148 +- .../615f7ecb09de9a938ef94756.md | 154 ++- .../615f7fa959ab75948f96a0d6.md | 131 +- .../615f808d85793195b0f53be9.md | 135 +- .../615f829d07b18f96f6f6684b.md | 133 +- .../615f83ef928ec9982b785b6a.md | 135 +- .../615f84f246e8ba98e3cd97be.md | 154 ++- .../615f887466db4ba14b5342cc.md | 147 +- .../615f89e055040ba294719d2f.md | 152 ++- .../615f8bfe0f30a1a3c340356b.md | 163 ++- .../615f8f1223601fa546e93f31.md | 156 ++- .../615f905fbd1017a65ca224eb.md | 149 ++- .../615f94786869e1a7fec54375.md | 144 +- .../615f951dff9317a900ef683f.md | 284 ++-- .../635bde33c91c80540eae239b.md | 153 +++ .../6395d33ab5d91bf317107c48.md | 117 ++ .../6396e33fe478dd264ebbf278.md | 135 ++ .../62a3c8bf3980c14c438d2aed.md | 2 +- .../62a8b0b5053f16111b0b6b5f.md | 2 +- .../62a8b6536156c51500739b41.md | 2 +- .../62a8c151b23bf21bc7c4fcba.md | 2 +- .../62a8c89e4272512d44fc1c66.md | 2 +- curriculum/getChallenges.js | 20 +- curriculum/package.json | 2 +- curriculum/schema/challengeSchema.js | 3 +- .../e2e/default/{landing.js => landing.ts} | 36 +- .../{failed-updates.js => failed-updates.ts} | 20 +- ...rtProject.js => multifile-cert-project.ts} | 0 .../challenges/{multifile.js => multifile.ts} | 0 ...{project-preview.js => project-preview.ts} | 0 .../{intro-page.js => intro-page.ts} | 0 .../{editor.js => editor.ts} | 0 .../{footer.js => footer.ts} | 0 .../{helpButton.js => help-button.ts} | 0 ...page-default.js => donate-page-default.ts} | 0 .../e2e/default/learn/{index.js => index.ts} | 18 +- .../{breadcrumbs.js => breadcrumbs.ts} | 0 .../basic-css/{index.js => index.ts} | 0 .../{donate-page.js => donate-page.ts} | 0 docs/_sidebar.md | 1 + docs/_theme.css | 9 + docs/authors-analytics-manual.md | 27 + docs/how-to-add-cypress-tests.md | 8 +- docs/i18n/chinese-traditional/_sidebar.md | 1 + .../authors-analytics-manual.md | 27 + .../how-to-add-cypress-tests.md | 8 +- docs/i18n/chinese/_sidebar.md | 1 + docs/i18n/chinese/authors-analytics-manual.md | 27 + docs/i18n/chinese/how-to-add-cypress-tests.md | 8 +- docs/i18n/espanol/_sidebar.md | 1 + docs/i18n/espanol/authors-analytics-manual.md | 27 + docs/i18n/espanol/how-to-add-cypress-tests.md | 8 +- docs/i18n/german/_sidebar.md | 1 + docs/i18n/german/authors-analytics-manual.md | 27 + docs/i18n/german/how-to-add-cypress-tests.md | 8 +- docs/i18n/italian/_sidebar.md | 1 + docs/i18n/italian/authors-analytics-manual.md | 27 + docs/i18n/italian/codebase-best-practices.md | 12 +- docs/i18n/italian/how-to-add-cypress-tests.md | 8 +- docs/i18n/italian/user-token-workflow.md | 4 +- docs/i18n/japanese/_sidebar.md | 1 + .../i18n/japanese/authors-analytics-manual.md | 27 + .../i18n/japanese/how-to-add-cypress-tests.md | 8 +- docs/i18n/portuguese/_sidebar.md | 1 + .../portuguese/authors-analytics-manual.md | 27 + .../portuguese/codebase-best-practices.md | 12 +- .../portuguese/how-to-add-cypress-tests.md | 8 +- docs/i18n/portuguese/user-token-workflow.md | 4 +- docs/i18n/ukrainian/FAQ.md | 16 +- docs/i18n/ukrainian/_sidebar.md | 33 +- .../ukrainian/authors-analytics-manual.md | 27 + .../i18n/ukrainian/codebase-best-practices.md | 68 +- .../ukrainian/how-to-add-cypress-tests.md | 8 +- .../how-to-contribute-to-the-codebase.md | 6 +- .../ukrainian/how-to-open-a-pull-request.md | 82 +- docs/i18n/ukrainian/index.md | 2 +- docs/i18n/ukrainian/moderator-handbook.md | 10 +- docs/i18n/ukrainian/user-token-workflow.md | 4 +- docs/images/crowdin/context.png | Bin 64349 -> 43816 bytes docs/images/crowdin/pre-translate1.png | Bin 68472 -> 48832 bytes docs/images/crowdin/pre-translate2.png | Bin 3427 -> 2667 bytes docs/images/crowdin/pre-translate3.png | Bin 35970 -> 25092 bytes docs/images/crowdin/tag-hover.png | Bin 23131 -> 21155 bytes .../google-analytics/filter-by-author.png | Bin 0 -> 418593 bytes .../google-analytics/search-by-language.png | Bin 0 -> 410206 bytes knip.jsonc | 42 + package-lock.json | 1187 ++++++++++------- package.json | 16 +- tools/challenge-editor/client/package.json | 2 +- tools/challenge-helper-scripts/package.json | 2 +- .../index.acceptance.test.js.snap | 8 + tools/challenge-parser/parser/index.js | 2 + .../parser/plugins/add-assignment.js | 24 + .../parser/plugins/add-video-question.js | 3 +- tools/crowdin/package.json | 2 +- tools/scripts/build/download-trending.ts | 4 +- .../scripts/build/schema/trending-schema.ts | 4 +- tools/ui-components/package.json | 4 +- utils/get-lines.js | 15 - .../{get-lines.test.js => get-lines.test.ts} | 2 +- utils/get-lines.ts | 10 + utils/validate.js | 32 - utils/{validate.test.js => validate.test.ts} | 10 +- utils/validate.ts | 23 + 1853 files changed, 58792 insertions(+), 27401 deletions(-) create mode 100644 client/src/analytics/index.ts delete mode 100644 client/src/analytics/index.tsx create mode 100644 client/src/components/solution-display-widget/solution-display-widget.css create mode 100644 client/src/templates/Challenges/odin/Show.tsx create mode 100644 client/src/templates/Challenges/odin/show.css rename client/src/templates/Challenges/{video/show.css => video.css} (100%) delete mode 100644 client/src/utils/A-B-tester.test.ts delete mode 100644 client/src/utils/A-B-tester.ts delete mode 100644 config/knip/knip.dev.json delete mode 100644 config/knip/knip.json create mode 100644 curriculum/challenges/_meta/the-odin-project/meta.json create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/arabic/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/arabic/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/arabic/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/chinese-traditional/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/chinese-traditional/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/chinese/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/chinese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/chinese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/chinese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/english/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md delete mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f5c1cb7575c7551ed8a40.md delete mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/615f6a7d4ba8037bc086c2c7.md create mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/english/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/espanol/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/espanol/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/german/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/german/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/italian/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/italian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/japanese/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/japanese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/portuguese/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/portuguese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/portuguese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/portuguese/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-a.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-b.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/understand-ordered-and-unordered-list-question-c.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/working-with-text-question-a.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/working-with-text-question-b.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/working-with-text-question-c.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/working-with-text-question-d.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/working-with-text-question-e.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/working-with-text-question-f.md create mode 100644 curriculum/challenges/ukrainian/10-coding-interview-prep/the-odin-project/working-with-text-question-g.md create mode 100644 curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/635bde33c91c80540eae239b.md create mode 100644 curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6395d33ab5d91bf317107c48.md create mode 100644 curriculum/challenges/ukrainian/14-responsive-web-design-22/learn-typography-by-building-a-nutrition-label/6396e33fe478dd264ebbf278.md rename cypress/e2e/default/{landing.js => landing.ts} (64%) rename cypress/e2e/default/learn/challenges/{failed-updates.js => failed-updates.ts} (72%) rename cypress/e2e/default/learn/challenges/{multifileCertProject.js => multifile-cert-project.ts} (100%) rename cypress/e2e/default/learn/challenges/{multifile.js => multifile.ts} (100%) rename cypress/e2e/default/learn/challenges/{project-preview.js => project-preview.ts} (100%) rename cypress/e2e/default/learn/coding-interview-prep/{intro-page.js => intro-page.ts} (100%) rename cypress/e2e/default/learn/common-components/{editor.js => editor.ts} (100%) rename cypress/e2e/default/learn/common-components/{footer.js => footer.ts} (100%) rename cypress/e2e/default/learn/common-components/{helpButton.js => help-button.ts} (100%) rename cypress/e2e/default/learn/donate/{donate-page-default.js => donate-page-default.ts} (100%) rename cypress/e2e/default/learn/{index.js => index.ts} (85%) rename cypress/e2e/default/learn/redirects/{breadcrumbs.js => breadcrumbs.ts} (100%) rename cypress/e2e/default/learn/responsive-web-design/basic-css/{index.js => index.ts} (100%) rename cypress/e2e/third-party/{donate-page.js => donate-page.ts} (100%) create mode 100644 docs/authors-analytics-manual.md create mode 100644 docs/i18n/chinese-traditional/authors-analytics-manual.md create mode 100644 docs/i18n/chinese/authors-analytics-manual.md create mode 100644 docs/i18n/espanol/authors-analytics-manual.md create mode 100644 docs/i18n/german/authors-analytics-manual.md create mode 100644 docs/i18n/italian/authors-analytics-manual.md create mode 100644 docs/i18n/japanese/authors-analytics-manual.md create mode 100644 docs/i18n/portuguese/authors-analytics-manual.md create mode 100644 docs/i18n/ukrainian/authors-analytics-manual.md create mode 100644 docs/images/google-analytics/filter-by-author.png create mode 100644 docs/images/google-analytics/search-by-language.png create mode 100644 knip.jsonc create mode 100644 tools/challenge-parser/parser/plugins/add-assignment.js rename client/i18n/schema/trendingSchema.js => tools/scripts/build/schema/trending-schema.ts (97%) delete mode 100644 utils/get-lines.js rename utils/{get-lines.test.js => get-lines.test.ts} (95%) create mode 100644 utils/get-lines.ts delete mode 100644 utils/validate.js rename utils/{validate.test.js => validate.test.ts} (90%) create mode 100644 utils/validate.ts diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6c92972b222..8531fc188cd 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -30,10 +30,10 @@ jobs: language: ['javascript'] steps: - name: Checkout repository - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Setup CodeQL - uses: github/codeql-action/init@959cbb7472c4d4ad70cdfe6f4976053fe48ab394 # v2 + uses: github/codeql-action/init@a34ca99b4610d924e04c68db79e503e1f79f9f02 # v2 with: languages: ${{ matrix.language }} - name: Perform Analysis - uses: github/codeql-action/analyze@959cbb7472c4d4ad70cdfe6f4976053fe48ab394 # v2 + uses: github/codeql-action/analyze@a34ca99b4610d924e04c68db79e503e1f79f9f02 # v2 diff --git a/.github/workflows/crowdin-download.client-ui.yml b/.github/workflows/crowdin-download.client-ui.yml index d78018159b6..eb9348bb696 100644 --- a/.github/workflows/crowdin-download.client-ui.yml +++ b/.github/workflows/crowdin-download.client-ui.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 with: token: ${{ secrets.CROWDIN_CAMPERBOT_PAT }} diff --git a/.github/workflows/crowdin-download.curriculum.yml b/.github/workflows/crowdin-download.curriculum.yml index 4ea86058734..c5281ff351d 100644 --- a/.github/workflows/crowdin-download.curriculum.yml +++ b/.github/workflows/crowdin-download.curriculum.yml @@ -22,7 +22,7 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 with: token: ${{ secrets.CROWDIN_CAMPERBOT_PAT }} @@ -278,7 +278,7 @@ jobs: # All languages should go ABOVE this. # - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/crowdin-download.docs.yml b/.github/workflows/crowdin-download.docs.yml index 94896d1de3d..5008a30123d 100644 --- a/.github/workflows/crowdin-download.docs.yml +++ b/.github/workflows/crowdin-download.docs.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 with: token: ${{ secrets.CROWDIN_CAMPERBOT_PAT }} diff --git a/.github/workflows/crowdin-upload.client-ui.yml b/.github/workflows/crowdin-upload.client-ui.yml index 716ecd5c87b..c1157d32433 100644 --- a/.github/workflows/crowdin-upload.client-ui.yml +++ b/.github/workflows/crowdin-upload.client-ui.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Generate Crowdin Config uses: freecodecamp/crowdin-action@main diff --git a/.github/workflows/crowdin-upload.curriculum.yml b/.github/workflows/crowdin-upload.curriculum.yml index 2a04581adca..3f1cd1c3eab 100644 --- a/.github/workflows/crowdin-upload.curriculum.yml +++ b/.github/workflows/crowdin-upload.curriculum.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Generate Crowdin Config uses: freecodecamp/crowdin-action@main diff --git a/.github/workflows/crowdin-upload.docs.yml b/.github/workflows/crowdin-upload.docs.yml index ec443ac4725..c7eaf0ff98b 100644 --- a/.github/workflows/crowdin-upload.docs.yml +++ b/.github/workflows/crowdin-upload.docs.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Generate Crowdin Config uses: freecodecamp/crowdin-action@main diff --git a/.github/workflows/e2e-mobile.yml b/.github/workflows/e2e-mobile.yml index a1cd7ebd63c..0fac7e65a62 100644 --- a/.github/workflows/e2e-mobile.yml +++ b/.github/workflows/e2e-mobile.yml @@ -20,16 +20,16 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Checkout mobile - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 with: repository: freeCodeCamp/mobile path: mobile - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/e2e-third-party.yml b/.github/workflows/e2e-third-party.yml index b6b35b5d86b..cad46e58e03 100644 --- a/.github/workflows/e2e-third-party.yml +++ b/.github/workflows/e2e-third-party.yml @@ -29,16 +29,16 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Checkout client-config - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 with: repository: freeCodeCamp/client-config path: client-config - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/e2e-web.yml b/.github/workflows/e2e-web.yml index c20ece5c601..891c6ce59f3 100644 --- a/.github/workflows/e2e-web.yml +++ b/.github/workflows/e2e-web.yml @@ -22,16 +22,16 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Checkout client-config - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 with: repository: freeCodeCamp/client-config path: client-config - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} @@ -51,13 +51,13 @@ jobs: run: tar -cf client-artifact.tar client/public - name: Upload Client Artifact - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # tag=v3 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 with: name: client-artifact path: client-artifact.tar - name: Upload Webpack Stats - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # tag=v3 + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce # v3 with: name: webpack-stats path: client/public/stats.json @@ -96,9 +96,9 @@ jobs: echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - - uses: actions/download-artifact@9782bd6a9848b53b110e712e20e42d89988822b7 # tag=v3 + - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a # v3 with: name: client-artifact @@ -116,7 +116,7 @@ jobs: sudo ln -s /opt/firefox/firefox /usr/bin/firefox - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/i18n-validate-builds.yml b/.github/workflows/i18n-validate-builds.yml index a5f56716080..f27e7dc4787 100644 --- a/.github/workflows/i18n-validate-builds.yml +++ b/.github/workflows/i18n-validate-builds.yml @@ -14,10 +14,10 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' diff --git a/.github/workflows/i18n-validate-prs.yml b/.github/workflows/i18n-validate-prs.yml index 92afb6ee388..bd438a2f0e9 100644 --- a/.github/workflows/i18n-validate-prs.yml +++ b/.github/workflows/i18n-validate-prs.yml @@ -16,10 +16,10 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} cache: 'npm' diff --git a/.github/workflows/node.js-find-unused.yml b/.github/workflows/node.js-find-unused.yml index a0bde535061..bf0d19978aa 100644 --- a/.github/workflows/node.js-find-unused.yml +++ b/.github/workflows/node.js-find-unused.yml @@ -21,10 +21,10 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/node.js-tests-upcoming.yml b/.github/workflows/node.js-tests-upcoming.yml index 1fd303ad918..a12d2165b13 100644 --- a/.github/workflows/node.js-tests-upcoming.yml +++ b/.github/workflows/node.js-tests-upcoming.yml @@ -26,10 +26,10 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} @@ -61,10 +61,10 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} diff --git a/.github/workflows/node.js-tests.yml b/.github/workflows/node.js-tests.yml index d32a1ace337..c434960e7b4 100644 --- a/.github/workflows/node.js-tests.yml +++ b/.github/workflows/node.js-tests.yml @@ -24,7 +24,7 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Check number of lockfiles run: | @@ -35,7 +35,7 @@ jobs: fi - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} @@ -69,10 +69,10 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} @@ -103,10 +103,10 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} @@ -139,10 +139,10 @@ jobs: steps: - name: Checkout Source Files - uses: actions/checkout@755da8c3cf115ac066823e79a1e1788f8940201b # v3 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3 - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3 + uses: actions/setup-node@64ed1c7eab4cce3362f8c340dee64e5eaeef8f7c # v3 with: node-version: ${{ matrix.node-version }} diff --git a/.gitignore b/.gitignore index d6cd819d4d8..ee0f7c63a7a 100644 --- a/.gitignore +++ b/.gitignore @@ -174,6 +174,10 @@ utils/block-nameify.test.js utils/slugs.js utils/slugs.test.js utils/index.js +utils/get-lines.js +utils/get-lines.test.js +utils/validate.js +utils/validate.test.js ### vim ### # Swap diff --git a/.prettierignore b/.prettierignore index 5270c577f42..1eaa453cf7a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -16,6 +16,10 @@ utils/block-nameify.test.js utils/slugs.js utils/slugs.test.js utils/index.js +utils/get-lines.js +utils/get-lines.test.js +utils/validate.js +utils/validate.test.js **/package-lock.json web/.next curriculum-server/data/curriculum.json diff --git a/api-server/src/server/boot/settings.js b/api-server/src/server/boot/settings.js index d1a4b4006cf..e93f32dff83 100644 --- a/api-server/src/server/boot/settings.js +++ b/api-server/src/server/boot/settings.js @@ -281,12 +281,6 @@ function handleInvalidUpdate(res) { function updateUserFlag(req, res, next) { const { user, body: update } = req; const allowedKeys = [ - 'theme', - 'sound', - 'keyboardShortcuts', - 'isHonest', - 'portfolio', - 'sendQuincyEmail', 'isGithub', 'isLinkedIn', 'isTwitter', diff --git a/client/gatsby-node.js b/client/gatsby-node.js index 736fa2ff580..9e5b6d15772 100644 --- a/client/gatsby-node.js +++ b/client/gatsby-node.js @@ -270,6 +270,8 @@ exports.onCreatePage = async ({ page, actions }) => { } }; +// Take care to QA the challenges when modifying this. It has broken certain +// types of challenge in the past. exports.createSchemaCustomization = ({ actions }) => { const { createTypes } = actions; const typeDefs = ` @@ -280,6 +282,7 @@ exports.createSchemaCustomization = ({ actions }) => { challengeFiles: [FileContents] notes: String url: String + assignments: [String] } type FileContents { fileKey: String @@ -293,44 +296,3 @@ exports.createSchemaCustomization = ({ actions }) => { `; createTypes(typeDefs); }; - -// TODO: this broke the React challenges, not sure why, but I'll investigate -// further and reimplement if it's possible and necessary (Oliver) -// I'm still not sure why, but the above schema seems to work. -// Typically the schema can be inferred, but not when some challenges are -// skipped (at time of writing the Chinese only has responsive web design), so -// this makes the missing fields explicit. -// exports.createSchemaCustomization = ({ actions }) => { -// const { createTypes } = actions; -// const typeDefs = ` -// type ChallengeNode implements Node { -// question: Question -// videoId: String -// required: ExternalFile -// files: ChallengeFile -// } -// type Question { -// text: String -// answers: [String] -// solution: Int -// } -// type ChallengeFile { -// indexhtml: FileContents -// indexjs: FileContents -// indexjsx: FileContents -// } -// type ExternalFile { -// link: String -// src: String -// } -// type FileContents { -// key: String -// ext: String -// name: String -// contents: String -// head: String -// tail: String -// } -// `; -// createTypes(typeDefs); -// }; diff --git a/client/i18n/locales/arabic/intro.json b/client/i18n/locales/arabic/intro.json index ebab7f6ea65..8e7bce332bb 100644 --- a/client/i18n/locales/arabic/intro.json +++ b/client/i18n/locales/arabic/intro.json @@ -3,23 +3,23 @@ "title": "تراث تصميم مواقع الويب المتجاوبة", "intro": [ "في شهادة تصميم الويب المستجيب هذه، ستتعلم اللغات التي يستخدمها المطورين لبناء صفحات الويب: HTML (Hypertext Markup Language) للمحتوى، و CSS (Cascading Style Sheets) للتصميم.", - "أولاً، سوف تقوم ببناء تطبيق صورة القطة لتعلم أساسيات HTML و CSS. لاحقاً، سوف تتعلم التقنيات الحديثة مثل متغيرات CSS عن طريق بناء بطريق، وأفضل الممارسات في اتاحة الوصول (accessibility) عن طريق بناء نموذج ويب.", - "أخيراً، سوف تتعلم كيف تنشئ صفحات ويب تستجيب لأحجام الشاشات المختلفة من خلال بناء بطاقة تويتر باستخدام Flexbox، وتخطيط معقد لمدونة باستخدام CSS Grid." + "أولاً، سوف تبني تطبيق صورة قطة لتتعلم أساسيات HTML و CSS. لاحقاً، سوف تتعلم التقنيات الحديثة مثل متغيرات CSS عن طريق بناء بِطْرِيق، وأفضل الممارسات في إتاحة الوصول (accessibility) عن طريق بناء نموذج ويب.", + "أخيراً، سوف تتعلم كيف تنشئ صفحات ويب تستجيب لأحجام الشاشات المختلفة عندما تبني بطاقة تويتر باستخدام Flexbox، وتخطيط معقد لمدونة باستخدام CSS Grid." ], - "note": "ملاحظة: بعض إضافات المتصفح, مثل Ad-blockers وإضافات الوضع الليلي قد تتصادم مع نتائج الاختبارات, إذا واجهت مشاكل, ننصحك بتعطيل الإضافات التي قد تؤثر أو تعدل على مخطط الصفحات, أثناء حضورك للدورة.", + "note": "ملاحظة: بعض إضافات المتصفح, مثل Ad-blockers وإضافات الوضع الليلي قد تتصادم مع نتائج الاختبارات, إذا واجهت مشكلات, ننصحك بتعطيل الإضافات التي قد تؤثر أو تعدل على مخطط الصفحات في أثناء حضورك للدورة.", "blocks": { "basic-html-and-html5": { "title": "أساسيات HTML و HTML5", "intro": [ - "HTML هي لغة ترميز تستخدم سياق خاص أو رموز لوصف الهيكل الخاص بصفحة الويب للمتصفح، عناصر HTML عادة لديها وسم فتح واغلاق تحيط المحتوى وتضيف معنى له. على سبيل المثال، عناصر مختلفة بامكانها وصف النص كعنوان أو فقرة أو عنصر من قائمة.", - "في هذه الدورة، ستبني تطبيق صورة القطة لتعلم بعض من أكثر عناصر الـ HTML شيوعاً، كتل البناء لأي صفحة على الويب." + "HTML هي لغة ترميز تستخدم سياق خاص أو رموز لوصف الهيكل الخاص بصفحة الويب للمتصفح، عناصر HTML عادة لديها علامة فتح وإغلاق تحيط المحتوى وتضيف معنى له. على سبيل المثال، عناصر مختلفة بإمكانها وصف النص كعنوان أو فَقَرة أو عنصر من قائمة.", + "في هذه الدورة، ستبني تطبيق صورة القطة لتتعلم بعض من أكثر عناصر لغة HTML شيوعاً، وهي كتل البناء لأي صفحة على الويب." ] }, "basic-css": { "title": "أساسيات CSS", "intro": [ - "CSS أو Cascading Style Sheets تخبر المتصفح كيف يعرض النص والعناصر الأخرى التي قمت بكتابتها في ملف الـ HTML، مع CSS تستطيع التحكم باللون والخط والحجم والمسافة والكثير من الأوجه المختلفة لعناصر HTML.", - "الآن بعد أن وصفت بنية تطبيق صورة القطة الخاص بك، أضف له بعض التصاميم باستخدام CSS." + "CSS أو Cascading Style Sheets تخبر المتصفح كيف يعرض النص والعناصر الأخرى الذي قمت بكتابتها في مِلَفّ HTML. و بواسطة CSS تستطيع التحكم باللون والخط والحجم والمسافة والكثير من الأوجه المختلفة لعناصر HTML.", + "الآن بعد أن وصفت بنية تطبيق صورة القطة الخاصة بك، أضف له بعض التصاميم باستخدام CSS." ] }, "applied-visual-design": { @@ -32,7 +32,7 @@ "applied-accessibility": { "title": "امكانية الوصول المطبقة", "intro": [ - "في تطوير المواقع، اماكنية الوصول تشير إلى محتوى ويب وواجهة مستخدم يمكن فهمها والتنقل بها والتفاعل معها من قبل جمهور عريض. هذا يتضمن أشخاص مصابين بإعاقات بصرية أو سمعية أو حركية أو ادراكية.", + "في تطوير المواقع، إماكنية الوصول تشير إلى محتوى ويب وواجهة مستخدم (UI - User Interface) يمكن فهمها والتنقل بها والتفاعل معها من قبل جَمهور عريض. هذا يتضمن أشخاص مصابين بإعاقات بصرية أو سمعية أو حركية أو إدراكية.", "في هذه الدورة، ستتعلم أفضل الممارسات لبناء صفحات الويب التي يمكن للجميع الوصول إليها وفهمها." ] }, @@ -76,80 +76,80 @@ "note": "ملاحظة: بعض إضافات المتصفح, مثل Ad-blockers وإضافات الوضع الليلي قد تتصادم مع نتائج الاختبارات, إذا واجهت مشاكل, ننصحك بتعطيل الإضافات التي قد تؤثر أو تعدل على مخطط الصفحات, أثناء حضورك للدورة.", "blocks": { "build-a-tribute-page-project": { - "title": "صفحة الإشادة", + "title": "صفحة الثناء", "intro": [ "هذا هو أحد المشاريع المطلوبة للحصول على شهادتك.", - "في هذا المشروع، سوف تقوم ببناء صفحة ثناء لموضوع من اختيارك سواء كان الموضوع من وحي خيالك أو حقيقي." + "في هذا المشروع، سوف تنشئ صفحة إثناء لموضوع من اختيارك سواء كان الموضوع من وحي خيالك أو حقيقي." ] }, "build-a-personal-portfolio-webpage-project": { - "title": "صفحه الويب لعرض نموذجات الأعمال الشخصية", + "title": "معرضا لأعمالك الخاصة", "intro": [ - "هذا هو أحد المشاريع المطلوبة للحصول على شهادتك.", - "في هذا المشروع، سوف تقوم ببناء صفحة ويب لعرض نماذج الاعمال الشخصية الخاصة بك." + "هذا هو أحد المشروعات المطلوبة للحصول على شهادتك.", + "في هذا المشروع، سوف تتشئ صفحة ويب معرضا لأعمالك الخاصة." ] }, "build-a-product-landing-page-project": { - "title": "صفحة الهبوط للمنتج", + "title": "صفحة لعرض المنتج", "intro": [ - "هذا هو أحد المشاريع المطلوبة للحصول على شهادتك.", - "في هذا المشروع، سوف تقوم ببناء صفحة هبوط لمنتج من اختيارك للتسويق له." + "هذا هو أحد المشروعات المطلوبة للحصول على شهادتك.", + "في هذا المشروع، ستنشئ صفحة لعرض المنتج من اختيارك للتسويق له." ] }, "build-a-survey-form-project": { "title": "نموذج استطلاع رأي", "intro": [ - "هذا هو أحد المشاريع المطلوبة للحصول على شهادتك.", - "في هذا المشروع، سوف تقوم ببناء نموذج الدراسة الاستقصائية لجمع بيانات من المستخدمين." + "هذا هو أحد المشروعات المطلوبة للحصول على شهادتك.", + "في هذا المشروع، سوف تنشئ نموذج استطلاع رأي لجمع بيانات من مستخدميك." ] }, "build-a-technical-documentation-page-project": { - "title": "صفحة الوثائق التقنية", + "title": "صفحة التوثيق التقنية", "intro": [ - "هذا هو أحد المشاريع المطلوبة للحصول على شهادتك.", - "في هذا المشروع، ستنشئ صفحة التوثيق التقني لتكون بمثابة تعليمات أو مرجع لموضوع ما." + "هذا هو أحد المشروعات المطلوبة للحصول على شهادتك.", + "في هذا المشروع، ستنشئ صفحة نموذج استطلاع رأي لتقوم مقام التعليمات أو المرجع لموضوع ما." ] }, "learn-html-by-building-a-cat-photo-app": { "title": "تعلم HTML عن طريق بناء تطبيق صورة القطة", "intro": [ "تعطي وسوم HTML صفحة الويب هيكلها. يمكنك استخدام وسوم HTML لإضافة الصور والأزرار والعناصر الأخرى إلى صفحة الويب الخاصة بك.", - "في هذه الدورة، ستتعلم وسوم HTML الأكثر شيوعاً عن طريق بناء تطبيقك لصورة القطة." + "في هذه الدورة، ستتعلم وسوم HTML الأكثر شيوعاً عن طريق بناء تطبيقك صورة القطة." ] }, "learn-basic-css-by-building-a-cafe-menu": { "title": "تعلم اساسيات CSS عن طريق بناء قائمة مقهى", "intro": [ - "CSS يخبر المتصفح كيفية عرض صفحة الويب الخاصة بك. يمكنك استخدام CSS لتعيين اللون والخطوط والحجم والجوانب الأخرى لعناصر HTML.", - "في هذه الدورة، سوف تتعلم CSS عن طريق تصميم صفحة قائمة لصفحة ويب لمقهي." + "يخبر CSS المتصفح كيف تعرض صفحتك الويب. يمكنك استخدام CSS لتعيين اللون والخطوط والحجم والجوانب الأخرى لعناصر HTML.", + "في هذه الدورة، سوف تتعلم CSS عن طريق تصميم صفحة قائمة لصفحة ويب لمقهى." ] }, "learn-the-css-box-model-by-building-a-rothko-painting": { "title": "تعلم CSS Box Model عن طريق بناء رسم لـRothko", "intro": [ - "كل عنصر من عناصر HTML هو صندوق خاص به - مع مساحته الخاصة وحدوده. وهذا يسمى نموذج Box Model.", - "في هذه الدورة، ستستخدم CSS و Box Model لإنشاء قطع فنية مستطيلة على نمط Rothko-الخاص بك." + "كل عنصر من عناصر HTML هو صندوقه - مع مساحته الخاصة وحدوده. وهذا يسمى نموذج الصندوق Box Model.", + "في هذه الدورة، ستستخدم CSS و Box Model لإنشاء قطع فنية مستطيلة على تصممك لوحة روثكو." ] }, "learn-css-variables-by-building-a-city-skyline": { - "title": "تعلم متغيرات CSS عن طريق بناء خط افق المدينة", + "title": "تعلم متغيرات CSS عن طريق أنشئ ناطحة السحاب بالمدينة", "intro": [ - "تساعدك متغيرات CSS على تنظيم الأنماط الخاصة بك وإعادة استخدامها.", - "في هذه الدورة، ستبني خط افق المدينة. ستتعلم كيفية تهيئة متغيرات CSS حتى تتمكن من إعادة استخدامها كلما أردت." + "تساعدك متغيرات CSS على تنظيم تصميماتك وإعادة استخدامها.", + "في هذه الدورة، ستبني ناطحة سحب بالمدينة. ستتعلم كيفية إعداد متغيرات CSS حتى تتمكن من إعادة استخدامها كلما أردت." ] }, "learn-html-forms-by-building-a-registration-form": { - "title": "تعلم نماذج HTML عن طريق بناء نموذج تسجيل", + "title": "تعلم نموذجات HTML عن طريق بناء نموذج تسجيل", "intro": [ - "يمكنك استخدام نماذج HTML لجمع المعلومات من الأشخاص الذين يزورون صفحة الويب الخاصة بك.", + "يمكنك استخدام نموذجات HTML لجمع المعلومات من الأشخاص الذين يزورون صفحتك الويب.", "في هذه الدورة، ستتعلم نماذج HTML عن طريق بناء صفحة التسجيل. ستتعلم كيفية التحكم في أنواع البيانات التي يمكن للناس كتابتها في النموذج، وبعض أدوات CSS الجديدة لتصميم صفحتك." ] }, "learn-accessibility-by-building-a-quiz": { - "title": "تعلم إمكانية الوصول Accessibility عن طريق بناء اختبار", + "title": "تعلم تسهيل المنال Accessibility عن طريق بناء اختبار", "intro": [ - "إمكانية الوصول تجعل صفحة الويب الخاصة بك سهلة الاستخدام لجميع الناس - حتى الأشخاص ذوي الإعاقة.", - "في هذه الدورة، ستبني صفحة ويب لاختبار. ستتعلم أدوات الوصول مثل اختصارات لوحة المفاتيح، سمات ARIA وأفضل الممارسات في التصميم." + "الاهتمام بتسهيل المنال إلى صفحتك الويب سهلة الاستخدام لجميع الناس - حتى الأشخاص ذوي الإعاقة.", + "في هذه الدورة، ستبني صفحة ويب لاختبار. ستتعلم أدوات تسهل المنال مثل اختصارات لوحة المفاتيح، سمات ARIA وأفضل الممارسات في التصميم." ] }, "learn-intermediate-css-by-building-a-picasso-painting": { @@ -159,31 +159,31 @@ ] }, "learn-responsive-web-design-by-building-a-piano": { - "title": "تعلم تصميم الويب المتجاوب Responsive Web Design عن طريق بناء بيانو", + "title": "تعلم تصميم الويب المستجيب Responsive Web Design عن طريق بناء بيانو", "intro": [ - "التصميم المستجيب يخبر صفحة الويب الخاصة بك كيف ينبغي أن تبدو على شاشات مختلفة الحجم.", + "يخبر التصميم المستجيب صفحتك الويب كيف ينبغي أن تبدو على شاشات مختلفة الحجم.", "في هذه الدورة، ستستخدم CSS والتصميم المستجيب لبرمجة وبناء بيانو. كما ستتعلم المزيد عن media queries و pseudo selectors." ] }, "learn-css-flexbox-by-building-a-photo-gallery": { "title": "تعلم CSS Flexbox من خلال بناء معرض للصور", "intro": [ - "يساعدك Flexbox في تصميم صفحة الويب الخاصة بك بحيث تبدو جيدة على أي حجم شاشة.", + "يساعدك Flexbox في تصميم صفحتك الويب بحيث تبدو جيدة على أي حجم شاشة.", "في هذه الدورة، ستستخدم Flexbox لإنشاء موقع ويب مستجيب Responsive لمعرض صور." ] }, "learn-css-grid-by-building-a-magazine": { "title": "تعلم CSS Grid عن طريق بناء مجلة", "intro": [ - "تمنحك CSS Grid التحكم في صفوف وأعمدة تصميم صفحة الويب الخاصة بك.", + "تمنحك CSS Grid التحكم في صفوف وأعمدة تصميم صفحتك الويب.", "في هذه الدورة، ستقوم ببناء مقال في مجلة. ستتعلم كيفية استخدام CSS Grid، بما في ذلك مفاهيم مثل صفوف الشبكة Grid rows وأعمدة الشبكة Grid columns." ] }, "learn-typography-by-building-a-nutrition-label": { "title": "تعلم الطباعة Typography عن طريق بناء علامة التغذية", "intro": [ - "التيبوغرافي هو فن تصميم النص الخاص بك ليكون سهل القراءة ويناسب الغرض منه.", - "في هذه الدورة، ستستخدم typography لإنشاء صفحة ويب لتسمية التغذية. ستتعلم كيفية تغيير نمط النص، وتعديل ارتفاع الخط line-height، و تغيير وضع position نصك باستخدام CSS." + "إن تشكيل الخط فن لتصميم نصك ليسهل قراءة ويلائم غرضه.", + "في هذه الدورة، ستستخدم typography لإنشاء صفحة ويب لتسمية التغذية. ستتعلم كيفية تغيير تشكيل النص، وتعديل ارتفاع الخط line-height، و تغيير وضع position نصك باستخدام CSS." ] }, "learn-css-transforms-by-building-a-penguin": { @@ -204,7 +204,7 @@ "title": "تعلم المزيد عن Selectors Pseudo في CSS عن طريق بناء كشف ميزانية", "intro": [ "يمكنك استخدام CSS pseudo selectors لتغيير عناصر HTML محددة.", - "في هذه الدورة ، ستبني ميزانية عامة باستخدام pseudo selectors. سوف تتعلم كيفية تغيير نمط عنصر ما عندما تحوم فوقه بالماوس الخاص بك، وتفعيل أحداث أخرى على صفحة الويب الخاصة بك." + "في هذه الدورة، ستبني ميزانية عامة باستخدام المنتقات الزائفة pseudo selectors. سوف تتعلم كيفية تغيير تصميم عنصر ما عندما تحوم فوقه بماوسك، وتفعيل أحداث أخرى على صفحتك الويب." ] }, "learn-css-colors-by-building-a-set-of-colored-markers": { @@ -219,7 +219,7 @@ "javascript-algorithms-and-data-structures": { "title": "الخوارزميات وهياكل البيانات في JavaScript", "intro": [ - "في حين أن HTML و CSS يتحكمان في محتوى الصفحة وتصميم الصفحة، يستخدم Javascript لجعلها تفاعلية. في شهادة الخوارزميات وهياكل البيانات في JavaScript، ستتعلم أساسيات JavaScript بما في ذلك المتغيرات variables, والقوائم arrays, والكائنات Objects والحلقات Loops, والوظائف functions.", + "في حين أن HTML و CSS يتحكمان في محتوى الصفحة وتصميم الصفحة، يستخدم Javascript لجعلها تفاعلية. في شهادة الخوارزميات وهياكل البيانات في JavaScript، ستتعلم أساسيات JavaScript بما في ذلك المتغيرات variables, والقوائم arrays, والكائنات objects والحلقات loops, والوظائف functions.", "بمجرد أن يكون لديك الأساسيات، ستطبق تلك المعرفة عن طريق إنشاء خوارزميات للتلاعب بالسلاسل strings، تحديد الأعداد، بل وحساب مدار محطة الفضاء الدولية.", "في هذا المشوار ستتعلم أيضًا أسلوبين أو نموذجين مهمين للبرمجة: البرمجة كائنية التوجه (OOP) ، والبرمجة الوظيفية (FP)." ], @@ -229,7 +229,7 @@ "title": "أساسيات JavaScript", "intro": [ "إن JavaScript لغة برمجة يمكنك استخدامها لجعل صفحات الويب تفاعلية. إنها إحدى التكنولوجيات الأساسية للويب، إلى جانب HTML و CSS، وهي مدعومة بجميع المتصفحات الحديثة.", - "في هذه الدورة، ستتعلم مفاهيم البرمجة الأساسية في Javascript. ستبدأ بهياكل البيانات الأساسية مثل الأرقام والنصوص. ثم سوف تتعلم العمل مع الكائنات والقائمات والوظائف والحلقات والشروط وتعبيرات if/else وأكثر من ذلك." + "في هذه الدورة، ستتعلم مفاهيم البرمجة الأساسية في Javascript. ستبدأ بهياكل البيانات الأساسية مثل الأرقام والنصوص. ثم سوف تتعلم العمل مع الكائنات والقوائم والوظائف والحلقات والشروط وتعبيرات if/else وأكثر من ذلك." ] }, "es6": { @@ -241,9 +241,9 @@ ] }, "regular-expressions": { - "title": "التعبيرات العادية Regular Expressions", + "title": "العبارات العادية Regular Expressions", "intro": [ - "التعبيرات العادية Regular expressions، غالباً ما تسمي \"regex\" أو \"regexp\"، هي أنماط تساعد المبرمجين على المطابقة والبحث واستبدال النص. التعابير العادية قوية جداً، ولكن يمكن أن يكون من الصعب قراءتها لأنها تستخدم رموز خاصة لعمل مطابقات أكثر تعقيداً ومرونة.", + "العبارات العادية Regular expressions، غالباً ما تسمي \"regex\" أو \"regexp\"، هي أنماط تساعد المبرمجين على المطابقة والبحث واستبدال النص. التعابير العادية قوية جداً، ولكن يمكن أن يكون من الصعب قراءتها لأنها تستخدم رموز خاصة لعمل مطابقات أكثر تعقيداً ومرونة.", "في هذه الدورة، ستتعلم كيفية استخدام الرموز الخاصة، التقاط المجموعات، النظرات الإيجابية والسلبية، وتقنيات أخرى لمطابقة أي نص تريده." ] }, @@ -258,8 +258,8 @@ "basic-data-structures": { "title": "هياكل البيانات الأساسية", "intro": [ - "يمكن تخزين البيانات والوصول إليها بعدة طرق. أنت تعرف بالفعل بعض هياكل بيانات javascript الشائعة - المصفوفات والكائنات.", - "في هذه الدورة لهياكل البيانات الأساسية، ستتعلم المزيد عن الاختلافات بين المصفوفات والكائنات، وعن كيفية استخدامها في أوضاع مختلفة. سوف تتعلم أيضاً كيفية استخدام أساليب Javascript المفيدة مثل splice() و Object.keys() للوصول إلى البيانات والتلاعب بها." + "يمكن تخزين البيانات والوصول إليها بعدة طرق. أنت تعرف بالفعل بعض هياكل بيانات javascript الشائعة - القوائم والكائنات.", + "في هذه الدورة لهياكل البيانات الأساسية، ستتعلم المزيد عن الاختلافات بين القوائم والكائنات، وعن كيفية استخدامها في أوضاع مختلفة. سوف تتعلم أيضاً كيفية استخدام أساليب Javascript المفيدة مثل splice() و Object.keys() للوصول إلى البيانات والتلاعب بها." ] }, "basic-algorithm-scripting": { @@ -267,7 +267,7 @@ "intro": [ "الخوارزمية هي سلسلة من التعليمات خطوة بخطوة تصف كيفية القيام بشيء ما.", "يساعدك تفكيك المشكلة إلى أجزاء أصغر والتفكير بعناية حول كيفية حل كل جزء علي حدي بواسطة الكود البرمجي على كتابة خوارزميات اكثر فاعلية.", - "في هذه الدورة، ستتعلم أساسيات التفكير الخوارزمي عن طريق كتابة الخوارزميات التي تفعل كل شيء من تحويل درجات الحرارة إلى التعامل مع المصفوفات ثنائية الأبعاد 2D arrays المعقدة." + "في هذه الدورة، ستتعلم أساسيات التفكير الخوارزمي عن طريق كتابة خوارزميات تفعل كل شيء من تحويل درجات الحرارة إلى التعامل مع القوائم ثنائية الأبعاد 2D arrays المعقدة." ] }, "object-oriented-programming": { @@ -280,7 +280,7 @@ "functional-programming": { "title": "البرمجة الوظيفية Functional Programming", "intro": [ - "البرمجة الوظيفية هي نهج شائع آخر لتطوير البرمجيات. في البرمجة الوظيفية، يتم تنظيم الكود في وظائف أصغر وأساسية يمكن الجمع بينها لبناء برامج معقدة.", + "إن البرمجة الوظيفية نهج شائع آخر لتطوير البرمجيات. في البرمجة الوظيفية، ينظم الكود في وظائف أصغر وأساسية يمكن الجمع بينها لبناء برامج معقدة.", "في هذه الدورة، ستتعلم المفاهيم الأساسية للبرمجة الوظيفية بما في تلك الوظيفة العادية، كيفية تجنب الطفرات وكيفية كتابة كود أنظف مع أساليب مثل .map() و .filter()." ] }, @@ -305,23 +305,23 @@ "note": "", "blocks": { "build-a-caesars-cipher-project": { - "title": "بناء مشروع Caesars Cipher", + "title": "بناء مشروع شفرة قيصر", "intro": ["", ""] }, "build-a-cash-register-project": { - "title": "بناء مشروع Cash Register", + "title": "بناء مشروع مكنة لتسجيل النقود", "intro": ["", ""] }, "build-a-palindrome-checker-project": { - "title": "بناء مشروع Palindrome Checker", + "title": "أنشئ مشروع مدقق لمعاكس المقطع النصي", "intro": ["", ""] }, "build-a-roman-numeral-converter-project": { - "title": "بناء مشروع Roman Numeral Converter", + "title": "أنشئ مشروع محول للأرقام الرومانية", "intro": ["", ""] }, "build-a-telephone-number-validator-project": { - "title": "بناء مشروع Telephone Number Validator", + "title": "بناء مشروع مدقق الأرقام الهواتف", "intro": ["", ""] }, "learn-basic-javascript-by-building-a-role-playing-game": { @@ -372,7 +372,7 @@ "react": { "title": "React", "intro": [ - "React هي مكتبة شائعة من مكتبات JavaScript لبناء واجهة مستخدم قابلة لإعادة البناء اعتماداً على المكون لصفحات الويب أو التطبيقات.", + "إن React مكتبة شائعة من مكتبات JavaScript لبناء واجهة مستخدم قابلة لإعادة البناء اعتماداً على المكون لصفحات الويب أو التطبيقات.", "يجمع React بين الـ HTML ووظائف الـ JavaScript في لغة ترميز خاصة به تدعى JSX. كما أن React يجعل من السهل إدارة تدفق البيانات في التطبيق.", "في هذه الدورة ، ستتعلم كيفية إنشاء مكونات مختلفة من React وإدارة البيانات في شكل State و Props و استخدام أساليب دورة الحياة المختلفة مثل componentDidMount، وأكثر من ذلك بكثير." ] @@ -389,13 +389,13 @@ "title": "React and Redux", "intro": [ "كثيرا ما يُشار إلى React و Redux معاً، ولسبب وجيه. المطور الذي أنشأ Redux كان مطور لـ React و اراد أن يسهل مشاركة البيانات عبر المكونات المختلفة.", - "الآن بعد أن عرفت كيفية إدارة تدفق البيانات المشتركة مع Redux، حان الوقت للجمع بين تلك المعرفة و React. في دورات React و Redux، ستبني مكون React وتتعلم كيفية إدارة الحالة state محلياً على مستوى المكون. وعبر التطبيق باكمله مع Redux." + "الآن بعد أن عرفت كيفية إدارة تدفق البيانات المشتركة مع Redux، حان الوقت للجمع بين تلك المعرفة و React. في دورات React و Redux، ستبني مكون React وتتعلم كيفية إدارة الحالة state محلياً على مستوى المكون. وعبر التطبيق برمته مع Redux." ] }, "front-end-development-libraries-projects": { "title": "مشاريع مكتبات تطوير واجهة المستخدم", "intro": [ - "حان الوقت لوضع مهاراتك في مكتبات تطوير واجهات المستخدم للاختبار، استخدم Bootstrap, jQuery, Sass, React و Redux لبناء 5 مشاريع لتختبر كل ما تعلمته حتى هذه النقطة.", + "حان الوقت لوضع مهاراتك في مكتبات تطوير واجهات المستخدم للاختبار. استخدم Bootstrap, و jQuery, و Sass, و React, و Redux لبناء 5 مشروعات لتختبر ما تعلمته حتى هذه النقطة.", "أكمل جميع المشاريع الخمسة، وستحصل على شهادة في مكتبات تطوير واجهة المستخدم." ] } @@ -551,9 +551,9 @@ "back-end-development-and-apis": { "title": "تطوير الواجهات الخلفية للمواقع و واجهات برمجة التطبيقات - Back End Development and APIs", "intro": [ - "حتى هذه النقطة، لقد استخدمت JavaScript فقط في الواجهة الأمامية لإضافة تفاعل إلى صفحة، أو حل تحديات الخوارزميات، أو بناء SPA. ولكن يمكن أيضاً استخدام JavaScript في الواجهة الخلفية back end، أو الخادم، لبناء تطبيقات ويب بأكملها.", + "حتى هذه النقطة، لقد استخدمت JavaScript فقط في الواجهة الأمامية لإضافة تفاعل إلى صفحة، أو حل تحديات الخوارزميات، أو بناء SPA. ولكن يمكن أيضاً استخدام JavaScript في الواجهة الخلفية back end، أو السيرفر، لبناء تطبيقات ويب برمتها.", "واليوم، فإن إحدى الطرق الشائعة لبناء التطبيقات هي من خلال الخدمات المصّغرة microservices، وهي تطبيقات صغيرة ومحددة تعمل معاً لتشًكل وحدة اكبر.", - "في شهادة واجهة برمجة التطبيقات والـAPIs، ستتعلم كيفية انشاء تطبيقات back end جاهزة باستخدام Node.js و npm. سوف تقوم أيضا ببناء تطبيقات ويب باستخدام إطار Express وبناء microservice لـ People Finder باستخدام MongoDB ومكتبة Mongoose." + "في شهادة تطوير واجهات الBack End و الAPIs، سوف تتعلم كيف تنشئ تطبيقات back end باستخدام Node.js و npm. سوف تقوم أيضا ببناء تطبيقات الويب باستخدام إطار العمل Express، و بناء microservice لإيجاد الأفراد باستخدام MongoDB ومكتبة Mongoose." ], "note": "", "blocks": { @@ -584,7 +584,7 @@ "back-end-development-and-apis-projects": { "title": "مشاريع تطوير الواجهات الخلفية للمواقع و واجهات برمجة التطبيقات APIs", "intro": [ - "لقد عملت مع واجهة برمجة التطبيقات APIs من قبل، ولكن الآن بعد أن عرفت npm، وNode, Express، وMongoDB وMongoose، حان الوقت لبناء API بنفسك، بالاعتماد على كل ما تعلمته حتى هذه النقطة لإنشاء 5 خدمات مصغّرة microservices مختلفة، وهي تطبيقات أصغر محدودة النطاق.", + "لقد عملت مع واجهة برمجة التطبيقات APIs من قبل، ولكن الآن بعد أن عرفت npm، و Node, و Express، و MongoDB، و Mongoose، حان الوقت لبناء API بنفسك، بالاعتماد على ما تعلمته حتى هذه النقطة لإنشاء 5 خدمات مصغّرة microservices مختلفة، وهي تطبيقات أصغر محدودة النطاق.", "بعد إنشاء هذه البرمجيات، سيكون لديك 5 APIs رائعة للخدمات الصغرى يمكنك عرضها للأصدقاء والعائلة وأصحاب العمل المحتملين، وستحصل أيضًا على شهادة تطوير الواجهة الخلفية وواجهات برمجة التطبيقات." ] } @@ -778,6 +778,10 @@ "أسناد: Rosetta Code" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "مشروع Euler", "intro": [ diff --git a/client/i18n/locales/arabic/translations.json b/client/i18n/locales/arabic/translations.json index ca702a9f893..f2a89f3cd4f 100644 --- a/client/i18n/locales/arabic/translations.json +++ b/client/i18n/locales/arabic/translations.json @@ -11,6 +11,7 @@ "view": "عرض", "view-code": "أظهار الكود", "view-project": "إظهار المشروع", + "view-cert-title": "عرض {{certTitle}}", "show-cert": "عرض الشهادة", "claim-cert": "المطالبة بالشهادة", "save-progress": "حفظ التقدم", @@ -52,7 +53,7 @@ "check-code": "تيقن من كودك (Ctrl + Enter)", "check-code-2": "تيقن من كودك", "reset": "إعادة ضبط", - "reset-code": "أعد جميع الكود ألى حالتهم الأولية", + "reset-step": "إعادة الخطوة إلى حالتها الأولية", "help": "مساعدة", "get-help": "الحصول على المساعدة", "watch-video": "شاهد الفيديو", @@ -157,7 +158,8 @@ "honesty": "سياسة الصدق الأكاديمي", "internet": "حضورك على الإنترنت", "portfolio": "إعدادات المحفظة", - "privacy": "إعدادات الخصوصية" + "privacy": "إعدادات الخصوصية", + "personal-info": "Personal Information" }, "danger": { "heading": "منطقة الخطر", @@ -272,6 +274,7 @@ "add-subtitles": "المساعدة في تحسين أو إضافة ترجمات", "wrong-answer": "عذراً، هذه ليست الإجابة الصحيحة. قم بالمحاولة مرة أخرى؟", "check-answer": "انقر على الزر أدناه للتحقق من إجابتك.", + "assignment-not-complete": "Please finish the assignments", "solution-link": "رابط الحل", "github-link": "رابط Github", "submit-and-go": "أرسل وانتقل إلى التحدي التالي", @@ -339,6 +342,7 @@ "title": "ادعم مؤسستنا الخيرية", "processing": "نحن نقوم بمعالجة تبرعك.", "redirecting": "جارٍ إعادة توجيهك...", + "thanks": "شكرا على التبرع", "thank-you": "شكراً لكونك داعماً.", "additional": "يمكنك تقديم تبرع إضافي لمرة واحدة بأي مبلغ باستخدام هذا الرابط: <0>{{url}}", "help-more": "ساعدنا على القيام بالمزيد", @@ -462,7 +466,8 @@ "iframe-preview": "معاينة {{title}}", "iframe-alert": "عادة هذا الرابط من شأنه أن يجلبك إلى موقع آخر! إنه يعمل. هذا رابط: {{externalLink}}", "iframe-form-submit-alert": "عادة سيتم تقديم هذا النموذج! إنه يعمل. سيتم إرسال هذا إلى: {{externalLink}}", - "document-notfound": "لم يوجد المستند" + "document-notfound": "لم يوجد المستند", + "slow-load-msg": "يبدو أن هذا يستغرق وقتاً أطول من المعتاد، الرجاء محاولة تحديث الصفحة." }, "icons": { "gold-cup": "كأس الذهب", @@ -507,7 +512,8 @@ "step": "الخطوة", "steps": "الخطوات", "steps-for": "خطوات {{blockTitle}}", - "code-example": "{{codeName}} مثال على الكود" + "code-example": "{{codeName}} مثال على الكود", + "opens-new-window": "فتح في نافذة جديدة" }, "flash": { "honest-first": "للمطالبة بشهادة ، يجب عليك أولاً قبول سياسة الصدق الأكاديمي الخاصة بنا", @@ -604,10 +610,10 @@ "source": "المصدر", "footnote": "إذا كنت تشك في أن أيا من هذه المشاريع ينتهك <2>سياسة الأمانة الأكاديمية، يرجى <5>إبلاغ فريقنا بهذا .", "title": { - "Build a Personal Portfolio Webpage": "قم ببناء مشروع صفحة ويب لعرض نماذج الاعمال الشخصية", + "Build a Personal Portfolio Webpage": "أنشئ معرضا لأعمالك الخاصة", "Build a Random Quote Machine": "بناء آلة عرض اقتباسات عشوائية", "Build a 25 + 5 Clock": "بناء ساعة 25 + 5", - "Build a JavaScript Calculator": "بناء حاسبة بإستخدام JavaScript", + "Build a JavaScript Calculator": "بناء آلة حاسبة باستخدام JavaScript", "Show the Local Weather": "إظهار الطقس المحلي", "Use the TwitchTV JSON API": "استخدام TwitchTV JSON API", "Stylize Stories on Camper News": "نسق قصص على أخبار Camper", @@ -641,14 +647,14 @@ "Anonymous Message Board": "لوحة الرسائل المجهولة", "Build a Tribute Page": "بناء مشروع صفحة الثناء", "Build a Survey Form": "بناء مشروع نموذج الدراسة الاستقصائية", - "Build a Product Landing Page": "بناء صفحة هبوط لمنتج", + "Build a Product Landing Page": "أنشئ صفحة لعرض المنتج", "Build a Technical Documentation Page": "بناء مشروع صفحة التوثيق التقني", "Palindrome Checker": "مدقق باليندروم", "Roman Numeral Converter": "تحويل الأرقام الرومانية", "Caesars Cipher": "Caesars Cipher", "Telephone Number Validator": "مدقق رقم الهاتف", "Cash Register": "سجل النقدية", - "Build a Drum Machine": "بناء آلة الدرامز", + "Build a Drum Machine": "أنشئ آلة الطبول", "Visualize Data with a Choropleth Map": "التصوير المرئي للبيانات باستخدام خريطة التمثيل اللوني", "Visualize Data with a Treemap Diagram": "التصوير المرئي للبيانات باستخدام الخريطة الشجرية", "Exercise Tracker": "متعقب التمارين", @@ -701,19 +707,19 @@ "data-analysis-with-python-v7": "شهادة تحليل البيانات باستخدام Python", "Information Security": "أمن المعلومات", "information-security-v7": "شهادة امن المعلومات", - "Machine Learning with Python": "Machine Learning with Python", - "machine-learning-with-python-v7": "Machine Learning with Python Certification", - "Legacy Front End": "Legacy Front End", - "legacy-front-end": "Front End Certification", - "Legacy Back End": "Legacy Back End", - "legacy-back-end": "Back End Certification", - "Legacy Data Visualization": "Legacy Data Visualization", - "legacy-data-visualization": "Data Visualization Certification", + "Machine Learning with Python": "تعلم الآلة باستخدام Python", + "machine-learning-with-python-v7": "مشاريع تعلم الآله باستخدام Python", + "Legacy Front End": "الواجهة الأمامية التراثية", + "legacy-front-end": "شهادة الواجهة الأمامية التراثية", + "Legacy Back End": "الواجهة الخلفية التراثية", + "legacy-back-end": "شهادة الواجهة الخلفية التراثية", + "Legacy Data Visualization": "التصوير المرئي للبيانات التراثي", + "legacy-data-visualization": "شهادة التصوير المرئي للبيانات", "Legacy Information Security and Quality Assurance": "أمن المعلومات وشهادة ضمان الجودة التراثية", "information-security-and-quality-assurance": "شهادة أمن المعلومات وشهادة ضمان الجودة", - "Legacy Full Stack Certification": "Legacy Full Stack Certification", - "Legacy Full Stack": "Legacy Full Stack", - "full-stack": "Full Stack Certification" + "Legacy Full Stack Certification": "شهادة الشامل الخلفية التراثية", + "Legacy Full Stack": "الشامل الخلفية التراثية", + "full-stack": "شهادة الشامل الخلفية" } }, "certification-card": { diff --git a/client/i18n/locales/chinese-traditional/intro.json b/client/i18n/locales/chinese-traditional/intro.json index cf1d7d84510..8cc8822a4e6 100644 --- a/client/i18n/locales/chinese-traditional/intro.json +++ b/client/i18n/locales/chinese-traditional/intro.json @@ -553,7 +553,7 @@ "intro": [ "在這之前,你只是在前端使用 JavaScript 來給頁面添加交互、解決算法挑戰,或構建一個 SPA(單頁應用程序)。但 JavaScript 也可以用於後端或者服務器來構建整個 web 應用程序。", "今天,構建應用軟件的廣受歡迎的方法之一是微服務,這些微服務是一種小型模塊化的應用,能夠共同形成一個更大的整體。", - "在後端開發和 APIs 認證中,你將學習如何使用 Node.js 和 npm(Node 包管理工具)來寫後端。你還將使用 Express 框架構建 web 應用程序,並使用 MongoDB 和 Mongoose 庫構建一個 People Finder 微服務。" + "In the Back End Development and APIs Certification, you'll learn how to write back end apps with Node.js and npm. You'll also build web applications with the Express framework, and build a People Finder microservice with MongoDB and the Mongoose library." ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "屬性:Rosetta 代碼" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "歐拉計劃", "intro": [ diff --git a/client/i18n/locales/chinese-traditional/motivation.json b/client/i18n/locales/chinese-traditional/motivation.json index d65a69bb268..12eb62efeed 100644 --- a/client/i18n/locales/chinese-traditional/motivation.json +++ b/client/i18n/locales/chinese-traditional/motivation.json @@ -1,819 +1,856 @@ { "compliments": [ - "Over the top!", - "Down the rabbit hole we go!", - "Bring that rain!", - "Target acquired.", - "Feel that need for speed!", - "You've got guts!", - "We have liftoff!", - "To infinity and beyond!", - "Encore!", - "Onward!", - "Challenge destroyed!", - "It's on like Donkey Kong!", - "Power level? It's over 9000!", - "Coding spree!", - "Code long and prosper.", - "The crowd goes wild!", - "One for the Guinness book!", - "Flawless victory!", - "Most efficient!", - "You've got the touch!", - "You're on fire!", - "The town is now red!", - "To the nines!", - "To the Batmobile!", - "Pull out all the stops!", - "You're a wizard, Harry!", - "You're an all-star!", - "Way to go!", - "Outta sight!", - "You're crushing it!", - "What sorcery is this?", - "The world rejoices!", - "That's the way it's done!", - "You rock!", - "Woo-hoo!", - "We knew you could do it!", - "Hyper Combo Finish!", - "Nothing but net!", - "Boom-shakalaka!", - "You're a shooting star!", - "You're unstoppable!", - "Way cool!", - "Walk on that sunshine!", - "Keep on trucking!", - "Off the charts!", - "There is no spoon!", - "Cranked it up to 11!", - "Escape velocity reached!", - "You make this look easy!", - "Passed with flying colors!", - "You've got this!", - "Happy, happy, joy, joy!", - "Tomorrow, the world!", - "Your powers combined!", - "It's alive. It's alive!", - "Sonic Boom!", - "Here's looking at you, Code!", - "Ride like the wind!", - "Legen - wait for it - dary!", - "Ludicrous Speed! Go!", - "Most triumphant!", - "One loop to rule them all!", - "By the power of Grayskull!", - "You did it!", - "Storm that castle!", - "Face-melting guitar solo!", - "Checkmate!", - "Bodacious!", - "Tubular!", - "You're outta sight!", - "Keep calm and code on!", - "Even sad panda smiles!", - "Even grumpy cat approves!", - "Kool Aid Man says oh yeah!", - "Bullseye!", - "Far out!", - "You're heating up!", - "Standing ovation!", - "Nice one!", - "All right!", - "Hasta la vista, challenge!", - "Terminated.", - "Off the hook!", - "Thundercats, Hooo!", - "Shiver me timbers!", - "Raise the roof!", - "Bingo!", - "Even Honey Badger cares!", - "Helm, Warp Nine. Engage!", - "Gotta code 'em all!", - "Spool up the FTL drive!", - "Cool beans!", - "They're in another castle.", - "Power UP!", - "Pikachu chooses you!", - "I gotta have more cowbell.", - "Gotta go fast!", - "Yippee!", - "Cowabunga!", - "Moon Prism Power!", - "Plus Ultra!" + "太棒了!", + "我們跳進兔子洞!", + "雨下吧!", + "獲取目標。", + "體驗極速快感!", + "你有膽量!", + "我們升空了!", + "飛向無限!", + "再來一次!", + "向前進!", + "挑戰被摧毀!", + "重磅如同大金剛!", + "戰鬥力?超過 9000!", + "編碼狂潮!", + "編碼不息,繁榮昌盛。", + "人羣變得瘋狂!", + "一個吉尼斯世界紀錄!", + "完勝!", + "最高效率!", + "你有手感了!", + "你正在燃燒!", + "滿城春色!", + "完美!", + "上蝙蝠車!", + "全力以赴!", + "你是個巫師,哈利!", + "你是全明星隊員!", + "幹得好!", + "棒極了!", + "你太出色了!", + "這是什麼魔法?", + "世界歡欣鼓舞!", + "難題就是這樣搞定的!", + "你真棒!", + "嗚呼!", + "我們就知道你能行!", + "超級組合終結!", + "空心球!", + "炸彈-沙卡拉卡!", + "你是一顆流星!", + "你勢不可擋!", + "太酷了!", + "走在那陽光下!", + "堅持下去!", + "水平爆表!", + "勺子並不存在!", + "調到最大音量!", + "達到逃逸速度!", + "你讓這看起來很簡單!", + "以優異的成績通過!", + "你能行!", + "開心,開心,快樂,快樂!", + "明天,征服世界!", + "你的全部力量!", + "它活了。它活了!", + "索尼克音爆!", + "看着你呢,代碼!", + "疾馳如風!", + "傳——奇!", + "離譜的速度!出發!", + "高奏凱歌!", + "用一個循環來統治它們!", + "憑藉灰殼堡的神力!", + "你做到了!", + "衝進城堡!", + "蕩人心魄的吉他獨奏!", + "完全擊敗!", + "大有膽識!", + "厲害!", + "你真強啊!", + "保持冷靜,繼續編碼!", + "即使是悲傷的熊貓也會微笑!", + "即使脾氣暴躁的貓也同意!", + "如此感覺無以倫比。", + "正中靶心!", + "前衛!", + "燃燒吧,小宇宙!", + "起立鼓掌!", + "不錯!", + "好啊!", + "回見,挑戰!", + "終結了。", + "脫身!", + "霹靂貓顯神威!", + "讓我五體投地!", + "大顯身手!", + "答對了!", + "連蜜獾都在乎!", + "掌舵,第九曲速。啓動!", + "必須全部編碼!", + "發動超光速引擎!", + "酷豆子!", + "她們在另一個城堡裏。", + "加電!", + "皮卡丘選擇了你!", + "我要再多點牛鈴。", + "得快點!", + "了不起!", + "卡瓦邦嘎!", + "月亮棱鏡能量!", + "超越極致!", + "米爾豪斯一切都會好起來的!" ], "motivationalQuotes": [ { - "quote": "Whatever you are, be a good one.", - "author": "Abraham Lincoln" + "quote": "不管你是誰,做個好人。", + "author": "亞伯拉罕·林肯" }, { - "quote": "A change in perspective is worth 80 IQ points.", - "author": "Alan Kay" + "quote": "換一個角度看問題值80點智商。", + "author": "艾倫·凱" }, { - "quote": "The best way to predict the future is to invent it.", - "author": "Alan Kay" + "quote": "預測未來的最好方法是創造未來。", + "author": "艾倫·凱" }, { - "quote": "The future is not laid out on a track. It is something that we can decide, and to the extent that we do not violate any known laws of the universe, we can probably make it work the way that we want to.", - "author": "Alan Kay" + "quote": "未來不是在軌道上規劃的。這是我們可以決定的事情,只要我們不違反任何已知的宇宙法則,我們就可以讓它按我們想要的方式運行。", + "author": "艾倫·凱" }, { - "quote": "We can only see a short distance ahead, but we can see plenty there that needs to be done.", - "author": "Alan Turing" + "quote": "我們只能看到前面很短的距離,但我們可以看到有很多事情需要做。", + "author": "艾倫·圖靈" }, { - "quote": "In the depth of winter, I finally learned that within me there lay an invincible summer.", - "author": "Albert Camus" + "quote": "隆冬時節,我終於明白,我的內心深處有一個不可戰勝的夏天。", + "author": "阿爾伯特·加繆" }, { - "quote": "A person who never made a mistake never tried anything new.", - "author": "Albert Einstein" + "quote": "從不犯錯的人從不嘗試新事物。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "Creativity is intelligence having fun.", - "author": "Albert Einstein" + "quote": "創造力是智力的樂趣。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "I have no special talents. I am only passionately curious.", - "author": "Albert Einstein" + "quote": "我沒有什麼特別的才能。我只是非常好奇。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "Life is like riding a bicycle. To keep your balance, you must keep moving.", - "author": "Albert Einstein" + "quote": "生活就像騎自行車。爲了保持平衡,你必須繼續前進。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "Make everything as simple as possible, but not simpler.", - "author": "Albert Einstein" + "quote": "事情應該力求簡單,但不能過於簡單。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "Never memorize something that you can look up.", - "author": "Albert Einstein" + "quote": "絕不要去記那些你能夠查得到的東西。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "Once we accept our limits, we go beyond them.", - "author": "Albert Einstein" + "quote": "一旦我們接受了自己的極限,我們就超越了它們。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "Play is the highest form of research.", - "author": "Albert Einstein" + "quote": "玩耍是研究的最高形式。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "We cannot solve our problems with the same thinking we used when we created them.", - "author": "Albert Einstein" + "quote": "我們不能用我們創造問題時的思維來解決問題。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "Wisdom is not a product of schooling but of the lifelong attempt to acquire it.", - "author": "Albert Einstein" + "quote": "智慧不是學校教育的產物,而是終身學習的產物。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "Your imagination is your preview of life's coming attractions.", - "author": "Albert Einstein" + "quote": "你的想像是你人生的預覽。", + "author": "阿爾伯特·愛因斯坦" }, { - "quote": "There is only one corner of the universe you can be certain of improving, and that's your own self.", - "author": "Aldous Huxley" + "quote": "宇宙中只有一個角落是你可以切實改進的,那就是你自己。", + "author": "奧爾德斯·赫胥黎" }, { - "quote": "The most common way people give up their power is by thinking they don't have any.", - "author": "Alice Walker" + "quote": "我感謝我的奮鬥,因爲沒有它,我就不會偶然發現自己的力量。", + "author": "亞歷克斯·艾爾" }, { - "quote": "Follow your inner moonlight. Don't hide the madness.", - "author": "Allen Ginsberg" + "quote": "人們放棄權力最常見的方式是認爲自己沒有權力。", + "author": "艾麗絲·沃克" }, { - "quote": "The most difficult thing is the decision to act. The rest is merely tenacity.", - "author": "Amelia Earhart" + "quote": "跟隨你內心的月光。別掩飾自己的瘋狂。", + "author": "艾倫·金斯伯格" }, { - "quote": "Life shrinks or expands in proportion with one's courage.", - "author": "Anaïs Nin" + "quote": "最困難的是決定採取行動。剩下的只是堅韌。", + "author": "阿梅莉亞·埃爾哈特" }, { - "quote": "Weeks of programming can save you hours of planning.", - "author": "Unknown" + "quote": "生命的縮小或擴大與一個人的勇氣成正比。", + "author": "阿奈斯·寧" }, { - "quote": "Quality is not an act, it is a habit.", - "author": "Aristotle" + "quote": "數週的編程可以節省你數小時的計劃。", + "author": "佚名" }, { - "quote": "Start where you are. Use what you have. Do what you can.", - "author": "Arthur Ashe" + "quote": "質量不是一種行爲,而是一種習慣。", + "author": "亞里士多德" }, { - "quote": "Nothing is impossible, the word itself says \"I'm possible\"!", - "author": "Audrey Hepburn" + "quote": "從現在開始。利用你所擁有的。盡你所能。", + "author": "亞瑟·阿什" }, { - "quote": "Every strike brings me closer to the next home run.", - "author": "Babe Ruth" + "quote": "沒有什麼是不可能的,連這個詞本身都說“不,可能”!", + "author": "奧黛麗·赫本" }, { - "quote": "By failing to prepare, you are preparing to fail.", - "author": "Benjamin Franklin" + "quote": "每一擊都讓我離下一個本壘打越來越近。", + "author": "貝比·魯斯" }, { - "quote": "Tell me and I forget. Teach me and I remember. Involve me and I learn.", - "author": "Benjamin Franklin" + "quote": "如果你沒有做好準備,你就是在準備失敗。", + "author": "本傑明·富蘭克林" }, { - "quote": "Well done is better than well said.", - "author": "Benjamin Franklin" + "quote": "告訴我,我會忘記。教我,我會記住。讓我參與,我會學習。", + "author": "本傑明·富蘭克林" }, { - "quote": "There are no short cuts to any place worth going.", - "author": "Beverly Sills" + "quote": "說得好不如做得好。", + "author": "本傑明·富蘭克林" }, { - "quote": "Controlling complexity is the essence of computer programming.", - "author": "Brian Kernighan" + "quote": "任何值得去的地方都沒有捷徑。", + "author": "貝弗利·希爾斯" }, { - "quote": "I fear not the man who has practiced 10,000 kicks once, but I fear the man who has practiced one kick 10,000 times.", - "author": "Bruce Lee" + "quote": "控制複雜性是計算機編程的本質。", + "author": "布萊恩·科尼漢" }, { - "quote": "There are far, far better things ahead than any we leave behind.", - "author": "C.S. Lewis" + "quote": "我不怕遇到練習過一萬種腿法的對手,但害怕遇到只將一種腿法練習一萬次的強敵。", + "author": "李小龍" }, { - "quote": "We are what we believe we are.", - "author": "C.S. Lewis" + "quote": "比起遺落在過去的,未來還有更加美好的在等待着我們。", + "author": "C.S. 路易斯" }, { - "quote": "With the possible exception of the equator, everything begins somewhere.", - "author": "C.S. Lewis" + "quote": "我們就是我們所相信的自己。", + "author": "C.S. 路易斯" }, { - "quote": "You are never too old to set another goal, or to dream a new dream.", - "author": "C.S. Lewis" + "quote": "可能除了赤道以外,一切都從某處開始。", + "author": "C.S. 路易斯" }, { - "quote": "Somewhere, something incredible is waiting to be known.", - "author": "Carl Sagan" + "quote": "無論年紀多大,你都可以設立新目標或擁有新夢想。", + "author": "C.S. 路易斯" }, { - "quote": "If you're not making mistakes, then you're not making decisions.", - "author": "Catherine Cook" + "quote": "在某個地方,一些不可思議的事物正在等你去發現。", + "author": "卡爾·薩根" }, { - "quote": "Find what you love and let it kill you.", - "author": "Charles Bukowski" + "quote": "當你有夢想時,你必須抓住它,永不放棄。", + "author": "卡羅爾·伯內特" }, { - "quote": "What matters most is how well you walk through the fire.", - "author": "Charles Bukowski" + "quote": "如果你沒有犯錯誤,那麼你就沒有做決定。", + "author": "凱瑟琳·庫克" }, { - "quote": "It is not the strongest of the species that survive, nor the most intelligent, but the one most responsive to change.", - "author": "Charles Darwin" + "quote": "愛我所愛,至死方休。", + "author": "查爾斯·布考斯基" }, { - "quote": "Life is 10% what happens to you and 90% how you react to it.", - "author": "Charles R. Swindoll" + "quote": "最重要的是你能否赴湯蹈火。", + "author": "查爾斯·布考斯基" }, { - "quote": "You will do foolish things, but do them with enthusiasm.", - "author": "Colette" + "quote": "生存下來的不是最強壯的物種,也不是最聰明的物種,而是最能適應變化的物種。", + "author": "查爾斯·達爾文" }, { - "quote": "It does not matter how slowly you go as long as you do not stop.", - "author": "Confucius" + "quote": "細節不僅是細節,而且決定了設計。", + "author": "查爾斯·伊姆斯" }, { - "quote": "Real knowledge is to know the extent of one's ignorance.", - "author": "Confucius" + "quote": "創造力不僅僅是與衆不同。任何人都可以做到怪誕不經,這很簡單。難的是像巴赫那樣簡單。使簡單的,非常簡單,這就是創造力。", + "author": "查爾斯·明格斯" }, { - "quote": "The past cannot be changed. The future is yet in your power.", - "author": "Confucius" + "quote": "生活的 10% 是發生在你身上的事,90% 是你對它的反應。", + "author": "查爾斯·R·斯溫多爾" }, { - "quote": "Looking at code you wrote more than two weeks ago is like looking at code you are seeing for the first time.", - "author": "Dan Hurvitz" + "quote": "你不免會做傻事,但熱烈地、衷心地投入做吧。", + "author": "科萊特" }, { - "quote": "Someday is not a day of the week.", - "author": "Denise Brennan-Nelson" + "quote": "譬如爲山,未成一簣,止,吾止也。譬如平地,雖覆一簣,進,吾往也。", + "author": "孔子" }, { - "quote": "UNIX is simple. It just takes a genius to understand its simplicity.", - "author": "Dennis Ritchie" + "quote": "知之爲知之,不知爲不知,是知也。", + "author": "孔子" }, { - "quote": "Computers are good at following instructions, but not at reading your mind.", - "author": "Donald Knuth" + "quote": "往昔不可諫,來者猶可追。", + "author": "孔子" }, { - "quote": "A good programmer is someone who always looks both ways before crossing a one-way street.", - "author": "Doug Linder" + "quote": "看着自己兩個多星期前編寫的代碼就像第一次看到這代碼一樣。", + "author": "丹·赫維茨" }, { - "quote": "Tough times never last, but tough people do.", - "author": "Dr. Robert Schuller" + "quote": "“總有一天”不是一週中的一天。", + "author": "丹尼斯·布倫南-納爾遜" }, { - "quote": "If things start happening, don't worry, don't stew, just go right along and you'll start happening too.", - "author": "Dr. Seuss" + "quote": "UNIX很簡單。不過只有天才才能理解它的簡單性。", + "author": "丹尼斯·裏奇" }, { - "quote": "Do not go gentle into that good night. Rage, rage against the dying of the light.", - "author": "Dylan Thomas" + "quote": "在我看來,要想見彩虹,就得忍受風雨!", + "author": "多莉·帕頓" }, { - "quote": "The question of whether computers can think is like the question of whether submarines can swim.", - "author": "E.W. Dijkstra" + "quote": "計算機善於遵循指令,但不善於理解你的思維。", + "author": "唐納德·克努特" }, { - "quote": "Any code of your own that you haven't looked at for six or more months might as well have been written by someone else.", - "author": "Eagleson's Law" + "quote": "優秀的程序員總是在過單行道之前兩邊都看一下。", + "author": "道格·林德" }, { - "quote": "Do one thing every day that scares you.", - "author": "Eleanor Roosevelt" + "quote": "創造力是狂野的頭腦和訓練有素的眼睛。", + "author": "多蘿西·帕克" }, { - "quote": "With the new day comes new strength and new thoughts.", - "author": "Eleanor Roosevelt" + "quote": "艱苦的時光終將過去,堅強的人們必將苦盡甘來。", + "author": "羅伯特·舒勒博士" }, { - "quote": "You must do the things you think you cannot do.", - "author": "Eleanor Roosevelt" + "quote": "如果事情開始發生,不要發愁,不要擔憂,只要一直走下去,你也會開始發生的。", + "author": "蘇斯博士" }, { - "quote": "Light tomorrow with today.", - "author": "Elizabeth Barrett Browning" + "quote": "不要溫和地走進那良夜。怒斥,怒斥光明的消逝。", + "author": "狄蘭·托馬斯" }, { - "quote": "Forever is composed of nows.", - "author": "Emily Dickinson" + "quote": "計算機能否思考的問題就像潛艇能否游泳的問題一樣。", + "author": "E·W·迪科斯徹" }, { - "quote": "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.", - "author": "Eric Raymond" + "quote": "自己寫的代碼,只要有六個月沒有看過,就像是別人寫的一樣。", + "author": "伊格爾森定律" }, { - "quote": "If you don't risk anything, you risk even more.", - "author": "Erica Jong" + "quote": "每天做一件讓你害怕的事。", + "author": "埃莉諾·羅斯福" }, { - "quote": "The world breaks everyone, and afterward, many are strong at the broken places.", - "author": "Ernest Hemingway" + "quote": "新的一天帶來了新的力量和新的思想。", + "author": "埃莉諾·羅斯福" }, { - "quote": "There is nothing noble in being superior to your fellow man; true nobility is being superior to your former self.", - "author": "Ernest Hemingway" + "quote": "你必須做你自己認爲做不到的事。", + "author": "埃莉諾·羅斯福" }, { - "quote": "Never confuse a single defeat with a final defeat.", - "author": "F. Scott Fitzgerald" + "quote": "用今天照亮明天。", + "author": "伊麗莎白·巴雷特·布朗寧" }, { - "quote": "I attribute my success to this - I never gave or took any excuse.", - "author": "Florence Nightingale" + "quote": "如果你的夢想沒有嚇到你,那是因爲你夢想得還不夠大。", + "author": "愛倫·約翰森·希爾麗夫" }, { - "quote": "The best revenge is massive success.", - "author": "Frank Sinatra" + "quote": "永遠是由現在組成的。", + "author": "艾米莉·狄金森" }, { - "quote": "The only limit to our realization of tomorrow, will be our doubts of today.", - "author": "Franklin D. Roosevelt" + "quote": "計算機科學教育不能使任何人成爲專家程序員,正如學習畫筆和顏料無法讓人成爲繪畫專家一樣。", + "author": "埃裏克·雷蒙德" }, { - "quote": "Right or wrong, it's very pleasant to break something from time to time.", - "author": "Fyodor Dostoevsky" + "quote": "如果你不冒任何風險,你的風險就更大。", + "author": "艾瑞卡·瓊" }, { - "quote": "The harder I work, the luckier I get.", - "author": "Gary Player" + "quote": "生活總是讓我們遍體鱗傷,但到後來,那些受傷的地方會變得更堅強。", + "author": "厄內斯特·海明威" }, { - "quote": "Giving up is the only sure way to fail.", - "author": "Gena Showalter" + "quote": "優於別人,並不高貴,真正的高貴應該是優於過去的自己。", + "author": "厄內斯特·海明威" }, { - "quote": "The only truly secure system is one that is powered off, cast in a block of concrete and sealed in a lead-lined room with armed guards.", - "author": "Gene Spafford" + "quote": "永遠不要將一次失敗與最終失敗混淆。", + "author": "F. 斯科特·菲茨傑拉德" }, { - "quote": "A life spent making mistakes is not only more honorable, but more useful than a life spent doing nothing.", - "author": "George Bernard Shaw" + "quote": "我將我的成功歸功於此——我從不找,也不接受任何藉口。", + "author": "弗洛倫斯·南丁格爾" }, { - "quote": "First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack.", - "author": "George Carrette" + "quote": "最好的報復是巨大的成功。", + "author": "弗蘭克·西納特拉" }, { - "quote": "Discovering the unexpected is more important than confirming the known.", - "author": "George Box" + "quote": "我們實現明天的唯一限制是我們對今天的懷疑。", + "author": "富蘭克林·羅斯福" }, { - "quote": "We only see what we know.", - "author": "Goethe" + "quote": "不管是對是錯,時不時弄壞點東西是一件非常愉快的事情。", + "author": "陀思妥耶夫斯基" }, { - "quote": "Without hard work, nothing grows but weeds.", - "author": "Gordon B. Hinckley" + "quote": "我越努力,就越幸運。", + "author": "蓋瑞·普萊爾" }, { - "quote": "The function of good software is to make the complex appear to be simple.", - "author": "Grady Booch" + "quote": "放棄是失敗的唯一可靠途徑。", + "author": "吉娜·肖沃爾特" }, { - "quote": "When you know that you're capable of dealing with whatever comes, you have the only security the world has to offer.", - "author": "Harry Browne" + "quote": "唯一真正安全的系統是斷了電、澆鑄在混凝土塊中、並密封在有武裝警衛的鉛襯房間內的系統。", + "author": "金·斯帕福德" }, { - "quote": "Pain is inevitable. Suffering is optional.", - "author": "Haruki Murakami" + "quote": "一生犯錯誤不僅比一生無所事事更光榮,而且更有用。", + "author": "蕭伯納" }, { - "quote": "Optimism is the faith that leads to achievement. Nothing can be done without hope and confidence.", - "author": "Helen Keller" + "quote": "首先學會計算機科學和所有的理論。 然後發展出一個編程風格。之後便要忘掉所有這些,自由地編碼。", + "author": "喬治·卡雷特" }, { - "quote": "The price of anything is the amount of life you exchange for it.", - "author": "Henry David Thoreau" + "quote": "發現意想不到的比確認已知的更重要。", + "author": "喬治·博克斯" }, { - "quote": "Whether you think you can or think you can't, you're right.", - "author": "Henry Ford" + "quote": "我們只能看到自己所知的。", + "author": "歌德" }, { - "quote": "The most exciting phrase to hear in science, the one that heralds discoveries, is not 'Eureka!' but 'Now that's funny…'", - "author": "Isaac Asimov" + "quote": "不努力耕耘,只會長出雜草。", + "author": "戈登·B·欣克利" }, { - "quote": "We are all failures. At least the best of us are.", - "author": "J.M. Barrie" + "quote": "好的軟件的功能就是化繁爲簡。", + "author": "格雷迪·布奇" }, { - "quote": "You can't wait for inspiration. You have to go after it with a club.", - "author": "Jack London" + "quote": "當你知道自己有能力應對任何事情時,你就擁有了世界所能提供的唯一安全感。", + "author": "哈利·布朗" }, { - "quote": "Don't wish it were easier, wish you were better.", - "author": "Jim Rohn" + "quote": "痛苦不可避免,但可以選擇是否受苦。", + "author": "村上春樹" }, { - "quote": "By seeking and blundering we learn.", - "author": "Johann Wolfgang von Goethe" + "quote": "樂觀是導致成就的信念。沒有希望和信心,就什麼都做不了。", + "author": "海倫·凱勒" }, { - "quote": "Knowing is not enough; we must apply. Wishing is not enough; we must do.", - "author": "Johann Wolfgang von Goethe" + "quote": "任何東西的價格都等於你用多少生命去換取它。", + "author": "亨利·大衛·梭羅" }, { - "quote": "We first make our habits, then our habits make us.", - "author": "John Dryden" + "quote": "不管你認爲你能還是不能,你都是對的。", + "author": "亨利·福特" }, { - "quote": "The power of imagination makes us infinite.", - "author": "John Muir" + "quote": "在科學中聽到的最令人興奮的短語,即預示着發現的短語,不是“找到了!” 而是“這很有趣……”", + "author": "艾薩克·阿西莫夫" }, { - "quote": "May you live every day of your life.", - "author": "Jonathan Swift" + "quote": "你所做的會有影響。你必須決定你想要做出什麼樣的改變。", + "author": "簡·古道爾" }, { - "quote": "Perseverance is failing 19 times and succeeding the 20th.", - "author": "Julie Andrews" + "quote": "我們都是失敗者。至少我們中最好的人是。", + "author": "J.M.巴里" }, { - "quote": "The work of today is the history of tomorrow, and we are its makers.", - "author": "Juliette Gordon Low" + "quote": "你不能等待靈感。你必須提着木棒去追求它。", + "author": "傑克·倫敦" }, { - "quote": "If you reveal your secrets to the wind, you should not blame the wind for revealing them to the trees.", - "author": "Kahlil Gibran" + "quote": "不要希望事情更容易,希望你更有能力。", + "author": "吉姆·羅恩" }, { - "quote": "Optimism is an occupational hazard of programming; feedback is the treatment.", - "author": "Kent Beck" + "quote": "我們通過尋找和犯錯誤來學習。", + "author": "約翰·沃爾夫岡·馮·歌德" }, { - "quote": "Opportunity does not knock, it presents itself when you beat down the door.", - "author": "Kyle Chandler" + "quote": "知道是不夠的;我們必須應用。希望是不夠的;我們必須行動。", + "author": "約翰·沃爾夫岡·馮·歌德" }, { - "quote": "To iterate is human, to recurse divine.", - "author": "Peter Deutsch" + "quote": "我們先養成習慣,然後習慣造就我們。", + "author": "約翰·德萊登" }, { - "quote": "A good traveler has no fixed plans and is not intent on arriving.", - "author": "Lao Tzu" + "quote": "想象力使我們無限。", + "author": "約翰·繆爾" }, { - "quote": "An ant on the move does more than a dozing ox.", - "author": "Lao Tzu" + "quote": "願你過好每一天。", + "author": "喬納森·斯威夫特" }, { - "quote": "Do the difficult things while they are easy and do the great things while they are small. A journey of a thousand miles must begin with a single step.", - "author": "Lao Tzu" + "quote": "堅持就是前 19 次失敗,第 20 次成功。", + "author": "朱莉·安德魯斯" }, { - "quote": "That's the thing about people who think they hate computers. What they really hate is lousy programmers.", - "author": "Larry Niven" + "quote": "今天的工作就是明天的歷史,我們是它的創造者。", + "author": "朱麗葉·戈登·洛" }, { - "quote": "It had long since come to my attention that people of accomplishment rarely sat back and let things happen to them. They went out and happened to things.", - "author": "Leonardo da Vinci" + "quote": "如果你向風泄露了你的祕密,你不應該責怪風將它們泄露給樹木。", + "author": "紀伯倫" }, { - "quote": "If you're any good at all, you know you can be better.", - "author": "Lindsay Buckingham" + "quote": "樂觀是編程的職業病;反饋就是治療。", + "author": "肯特·貝克" }, { - "quote": "If people never did silly things, nothing intelligent would ever get done.", - "author": "Ludwig Wittgenstein" + "quote": "機會不會敲門,它會在你敲門的時候出現。", + "author": "凱爾·錢德勒" }, { - "quote": "You only live once, but if you do it right, once is enough.", - "author": "Mae West" + "quote": "迭代的是人,遞歸的是神。", + "author": "彼得·多伊奇" }, { - "quote": "Live as if you were to die tomorrow. Learn as if you were to live forever.", - "author": "Mahatma Gandhi" + "quote": "善行無轍跡,善言無瑕謫。", + "author": "老子" }, { - "quote": "Strength does not come from physical capacity. It comes from an indomitable will.", - "author": "Mahatma Gandhi" + "quote": "合抱之木,生於毫末;九層之臺,起於累土;千里之行,始於足下。", + "author": "老子" }, { - "quote": "One person's 'paranoia' is another person's 'engineering redundancy'.", - "author": "Marcus J. Ranum" + "quote": "那些認爲自己討厭電腦的人就是這樣。他們真正討厭的是糟糕的程序員。", + "author": "拉里·尼文" }, { - "quote": "Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less.", - "author": "Marie Curie" + "quote": "我早就發現,成功的人很少坐以待斃,讓事情發生在他們身上。他們出去主動去做事。", + "author": "達芬奇" }, { - "quote": "If you have everything under control, you're not moving fast enough.", - "author": "Mario Andretti" + "quote": "如果你有一點才能,你就會知道你還可以做得更好。", + "author": "林賽·白金漢" }, { - "quote": "Education: the path from cocky ignorance to miserable uncertainty.", - "author": "Mark Twain" + "quote": "如果人們從不做傻事,就什麼都不會做得聰明。", + "author": "路德維希·維特根斯坦" }, { - "quote": "It ain't what you don't know that gets you into trouble. It's what you know for sure that just ain't so.", - "author": "Mark Twain" + "quote": "人只活一次,但若活得其所一次已足夠。", + "author": "梅·韋斯特" }, { - "quote": "The secret of getting ahead is getting started.", - "author": "Mark Twain" + "quote": "像明天就要死一樣生活,像永遠活着一樣學習。", + "author": "聖雄甘地" }, { - "quote": "The two most important days in your life are the day you are born and the day you find out why.", - "author": "Mark Twain" + "quote": "力量不是來自身體能力。它來自不屈不撓的意志。", + "author": "聖雄甘地" }, { - "quote": "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails.", - "author": "Mark Twain" + "quote": "一個人的“偏執狂”是另一個人的“工程冗餘”。", + "author": "馬庫斯·拉納姆" }, { - "quote": "Any fool can write code that a computer can understand. Good programmers write code that humans can understand.", - "author": "Martin Fowler" + "quote": "生活中沒有什麼可怕的,只有需要理解的。現在是時候多去理解,這樣我們就會少一些恐懼。", + "author": "瑪麗·居里" }, { - "quote": "I know, somehow, that only when it is dark enough can you see the stars.", - "author": "Martin Luther King Jr." + "quote": "如果一切都在你的掌控之中,那麼你的行動還不夠快。", + "author": "馬里奧·安德雷蒂" }, { - "quote": "It is never too late to be what you might have been.", - "author": "Mary Anne Evans" + "quote": "教育:從自大的無知到悲慘的不確定性的道路。", + "author": "馬克·吐溫" }, { - "quote": "Nothing will work unless you do.", - "author": "Maya Angelou" + "quote": "讓你陷入麻煩的不是你不知道的東西,而是你確信的、其實並不是真的東西。", + "author": "馬克·吐溫" }, { - "quote": "We delight in the beauty of the butterfly, but rarely admit the changes it has gone through to achieve that beauty.", - "author": "Maya Angelou" + "quote": "取得成功的祕訣就是開始。", + "author": "馬克·吐溫" }, { - "quote": "We may encounter many defeats, but we must not be defeated.", - "author": "Maya Angelou" + "quote": "你生命中最重要的兩天是你出生的那一天和你找到意義的那一天。", + "author": "馬克·吐溫" }, { - "quote": "Everybody has talent, but ability takes hard work.", - "author": "Michael Jordan" + "quote": "二十年後,你會因自己沒做的事情而更加失望,而不是做過的事情。所以,請解開繩索,駛離安全的港灣,揚帆起航吧。", + "author": "馬克·吐溫" }, { - "quote": "I've missed more than 9,000 shots during my career. I've lost almost 300 games. 26 times, I've been trusted to take the game winning shot and missed. I've failed over and over and over again in my life. And that is why I succeed.", - "author": "Michael Jordan" + "quote": "任何傻瓜都可以編寫計算機可以理解的代碼。優秀的程序員編寫人類可以理解的代碼。", + "author": "馬丁·福勒" }, { - "quote": "Impossible is just a big word thrown around by small men who find it easier to live in the world they've been given than to explore the power they have to change it. Impossible is not a fact. It's an opinion. Impossible is not a declaration. It's a dare. Impossible is potential. Impossible is temporary. Impossible is nothing.", - "author": "Muhammad Ali" + "quote": "我知道,不知何故,只有當天足夠黑時,你才能看到星星。", + "author": "馬丁·路德·金" }, { - "quote": "A winner is a dreamer who never gives up.", - "author": "Nelson Mandela" + "quote": "永遠不會太晚去成爲你可能成爲的人。", + "author": "瑪麗·安妮·埃文斯" }, { - "quote": "It always seems impossible until it's done.", - "author": "Nelson Mandela" + "quote": "除非你行動起來,否則什麼都不會改變。", + "author": "瑪雅·安傑洛" }, { - "quote": "Failure will never overtake me if my determination to succeed is strong enough.", - "author": "Og Mandino" + "quote": "你無法用盡創造力。使用得越多,就會有越多。", + "author": "瑪雅·安傑洛" }, { - "quote": "I am not young enough to know everything.", - "author": "Oscar Wilde" + "quote": "我們喜歡蝴蝶的美麗,但很少承認它爲實現這種美麗所經歷的變化。", + "author": "瑪雅·安傑洛" }, { - "quote": "There is only one thing that makes a dream impossible to achieve: the fear of failure.", - "author": "Paulo Coelho" + "quote": "我們可能會遇到很多失敗,但我們絕不能被擊敗。", + "author": "瑪雅·安傑洛" }, { - "quote": "Never go to bed mad. Stay up and fight.", - "author": "Phyllis Diller" + "quote": "每個人都有天賦,但能力需要努力。", + "author": "邁克爾·喬丹" }, { - "quote": "You can't cross the sea merely by standing and staring at the water.", - "author": "Rabindranath Tagore" + "quote": "在我的職業生涯中,我錯過了 9000 多次投籃。我輸掉了近 300 場比賽。26 次,我被信任去投決勝一投,但都沒有命中。我一次又一次地失敗。但正因如此,我才獲得了成功。", + "author": "邁克爾·喬丹" }, { - "quote": "The only person you are destined to become is the person you decide to be.", - "author": "Ralph Waldo Emerson" + "quote": "“不可能”只是小人物們輕易拋出的大詞,他們寧願留在自己被賦予的世界裏,也不願探索自己改變它的力量。“不可能”不是事實,而是意見。“不可能”不是宣言,而是挑戰。“不可能”是潛力。“不可能”是暫時的。“不可能”什麼也不是。", + "author": "穆罕默德·阿里" }, { - "quote": "What you do speaks so loudly that I cannot hear what you say.", - "author": "Ralph Waldo Emerson" + "quote": "勝利者是永不放棄的夢想家。", + "author": "納爾遜·曼德拉" }, { - "quote": "People who are crazy enough to think they can change the world, are the ones who do.", - "author": "Rob Siltanen" + "quote": "看起來總是不可能,直到它被做到。", + "author": "納爾遜·曼德拉" }, { - "quote": "The best way out is always through.", - "author": "Robert Frost" + "quote": "如果我成功的決心足夠堅定,失敗永遠不會壓倒我。", + "author": "奧格·曼狄諾" }, { - "quote": "Today's accomplishments were yesterday's impossibilities.", - "author": "Robert H. Schuller" + "quote": "我還不夠年輕,不可能瞭解所有的事情。", + "author": "奧斯卡·王爾德" }, { - "quote": "Don't be satisfied with stories, how things have gone with others. Unfold your own myth.", - "author": "Rumi" + "quote": "只有一件事使夢想無法實現:對失敗的恐懼。", + "author": "保羅·柯艾略" }, { - "quote": "Forget safety. Live where you fear to live. Destroy your reputation. Be notorious.", - "author": "Rumi" + "quote": "光是站着看水是無法渡海的。", + "author": "羅賓德拉納特·泰戈爾" }, { - "quote": "Sell your cleverness and buy bewilderment.", - "author": "Rumi" + "quote": "你註定要成爲的唯一的人,就是你決定成爲的人。", + "author": "拉爾夫·沃爾多·愛默生" }, { - "quote": "The cure for pain is in the pain.", - "author": "Rumi" + "quote": "你的所作所爲聲音很大,我聽不見你在說什麼。", + "author": "拉爾夫·沃爾多·愛默生" }, { - "quote": "Have no fear of perfection - you'll never reach it.", - "author": "Salvador Dalí" + "quote": "那些足夠瘋狂以爲自己可以改變世界的人,纔是真正改變世界的人。", + "author": "羅伯·西塔寧" }, { - "quote": "Don't watch the clock. Do what it does. Keep going.", - "author": "Sam Levenson" + "quote": "最好的出路是有始有終。", + "author": "羅伯特·弗羅斯特" }, { - "quote": "Ever Tried. Ever failed. No matter. Try again. Fail again. Fail better.", - "author": "Samuel Beckett" + "quote": "今天的成就是昨天的不可能。", + "author": "羅伯特·舒樂" }, { - "quote": "The more you know, the more you realize you know nothing.", - "author": "Socrates" + "quote": "不要滿足於故事,不要滿足於別人的經歷。揭開你自己的神話。", + "author": "魯米" }, { - "quote": "The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge.", - "author": "Stephen Hawking" + "quote": "忘掉安全感,到你所害怕的地方去生活。摧毀你的名聲,做一個聲名狼藉的人。", + "author": "魯米" }, { - "quote": "The universe doesn't allow perfection.", - "author": "Stephen Hawking" + "quote": "賣掉你的聰明,買下困惑。", + "author": "魯米" }, { - "quote": "Whether you want to uncover the secrets of the universe, or you want to pursue a career in the 21st century, basic computer programming is an essential skill to learn.", - "author": "Stephen Hawking" + "quote": "治療疼痛的方法是在疼痛中。", + "author": "魯米" }, { - "quote": "The scariest moment is always just before you start.", - "author": "Stephen King" + "quote": "不要害怕完美——你永遠達不到完美。", + "author": "薩爾瓦多·達利" }, { - "quote": "You can, you should, and if you're brave enough to start, you will.", - "author": "Stephen King" + "quote": "不要看時鐘。做它做的事情。繼續前進。", + "author": "山姆·李文生" }, { - "quote": "Arise, Awake and Stop not until the goal is reached.", - "author": "Swami Vivekananda" + "quote": "曾經嘗試過。曾經失敗過。沒關係。再嘗試一次。再失敗一次。做得更好。", + "author": "塞繆爾·貝克特" }, { - "quote": "It is said that your life flashes before your eyes just before you die. That is true, it's called Life.", - "author": "Terry Pratchett" + "quote": "你知道的越多,你就越發現你什麼都不知道。", + "author": "蘇格拉底" }, { - "quote": "Believe you can and you're halfway there.", - "author": "Theodore Roosevelt" + "quote": "知識最大的敵人不是無知,而是知識的幻覺。", + "author": "史蒂芬·霍金" }, { - "quote": "I have not failed. I've just found 10,000 ways that won't work.", - "author": "Thomas A. Edison" + "quote": "宇宙不允許完美。", + "author": "史蒂芬·霍金" }, { - "quote": "Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.", - "author": "Thomas A. Edison" + "quote": "無論你是想揭開宇宙的祕密,還是想在 21 世紀謀求職業,基礎計算機編程是必學的技能。", + "author": "史蒂芬·霍金" }, { - "quote": "The harder the conflict, the more glorious the triumph.", - "author": "Thomas Paine" + "quote": "最可怕的時刻總是在你開始之前。", + "author": "史蒂芬.金" }, { - "quote": "The Web as I envisaged it, we have not seen it yet. The future is still so much bigger than the past.", - "author": "Tim Berners-Lee" + "quote": "你可以,你應該,如果你有足夠的勇氣開始,你會的。", + "author": "史蒂芬.金" }, { - "quote": "Failure is the condiment that gives success its flavor.", - "author": "Truman Capote" + "quote": "起牀,醒來,直到達到目標才停下來。", + "author": "斯瓦米·維韋卡南達" }, { - "quote": "Those who says it cannot be done should not interrupt the person doing it.", - "author": "Unknown" + "quote": "據說,就在你死之前,你的生命在你眼前閃過。沒錯,這就是所謂的生活。", + "author": "泰瑞·普萊契" }, { - "quote": "Even if you fall on your face, you're still moving forward.", - "author": "Victor Kiam" + "quote": "相信你可以,你就成功了一半。", + "author": "西奧多·羅斯福" }, { - "quote": "It's not whether you get knocked down, it's whether you get up.", - "author": "Vince Lombardi" + "quote": "我沒有失敗。我只是找到了一萬種行不通的方法。", + "author": "愛迪生" }, { - "quote": "I dream my painting and I paint my dream.", - "author": "Vincent van Gogh" + "quote": "我們最大的弱點在於放棄。最確定的成功方法永遠是再試一次。", + "author": "愛迪生" }, { - "quote": "Let us cultivate our garden.", - "author": "Voltaire" + "quote": "衝突越激烈,勝利就越光榮。", + "author": "托馬斯·潘恩" }, { - "quote": "Aim for the moon. If you miss, you may hit a star.", - "author": "W. Clement Stone" + "quote": "我所設想的網絡,我們還沒有看到。未來仍然比過去要大得多。", + "author": "蒂姆·伯納斯-李" }, { - "quote": "The way to get started is to quit talking and begin doing.", - "author": "Walt Disney" + "quote": "失敗是給成功增添風味的調味品。", + "author": "杜魯門·卡波特" }, { - "quote": "You miss 100% of the shots you don't take.", - "author": "Wayne Gretzky" + "quote": "那些說這是不可能的人,不應該打斷正在做這件事的人。", + "author": "佚名" }, { - "quote": "Don't let yesterday take up too much of today.", - "author": "Will Rogers" + "quote": "用不同的眼光看待平常的事物。", + "author": "維科·馬吉斯泰蒂" }, { - "quote": "Even if you're on the right track, you'll get run over if you just sit there.", - "author": "Will Rogers" + "quote": "即使你摔倒在地,你仍然在前進。", + "author": "維克托·基亞姆" }, { - "quote": "Do not wait to strike till the iron is hot; but make it hot by striking.", - "author": "William Butler Yeats" + "quote": "重要的不是你是否被擊倒,而是你是否爬起來。", + "author": "文斯·隆巴迪" }, { - "quote": "You cannot swim for new horizons until you have courage to lose sight of the shore.", - "author": "William Faulkner" + "quote": "我夢想我的畫,我畫我的夢。", + "author": "文森特·梵高" }, { - "quote": "Be not afraid of greatness. Some are born great, some achieve greatness, and others have greatness thrust upon them.", - "author": "William Shakespeare" + "quote": "偉大的事情是由一系列小事情匯聚而成的。", + "author": "文森特·梵高" }, { - "quote": "We know what we are, but not what we may be.", - "author": "William Shakespeare" + "quote": "讓我們耕種我們的花園。", + "author": "伏爾泰" }, { - "quote": "In theory there is no difference between theory and practice. In practice there is.", - "author": "Yogi Berra" + "quote": "瞄準月亮。如果你錯失目標,你可能會擊中一顆恆星。", + "author": "克萊門特·斯通" }, { - "quote": "You can see a lot by just looking.", - "author": "Yogi Berra" + "quote": "開始的方法是停止說話,開始行動。", + "author": "沃爾特·迪斯尼" }, { - "quote": "There is no elevator to success, you have to take the stairs.", - "author": "Zig Ziglar" + "quote": "你不嘗試的話,就有 100% 的機會失敗。", + "author": "韋恩·格雷茨基" }, { - "quote": "You don't have to be great to start, but you have to start to be great.", - "author": "Zig Ziglar" + "quote": "不要讓昨天佔據太多的今天。", + "author": "威爾·羅傑斯" + }, + { + "quote": "即使你是在正確的路上,如果你只是坐在那裏,你也會被撞倒。", + "author": "威爾·羅傑斯" + }, + { + "quote": "不要等鐵熱了再打;要用敲打使它變熱。", + "author": "威廉·巴特勒·葉芝" + }, + { + "quote": "除非你有勇氣離開海岸,否則你無法遊向新的地平線。", + "author": "威廉·福克納" + }, + { + "quote": "不要害怕偉大。 有些人天生偉大,有些人成就偉大,而另一些人則被推向偉大。", + "author": "威廉·莎士比亞" + }, + { + "quote": "我們知道我們是什麼,但不知道我們可能成爲什麼。", + "author": "威廉·莎士比亞" + }, + { + "quote": "從理論上講,理論和實踐之間沒有區別。在實踐中是有的。", + "author": "約吉·貝拉" + }, + { + "quote": "通過看,你就可以覺察到很多東西。", + "author": "約吉·貝拉" + }, + { + "quote": "成功沒有電梯,你必須走樓梯。", + "author": "齊格·齊格勒" + }, + { + "quote": "你不一定要很偉大才能開始,但你必須開始才能變得偉大。", + "author": "齊格·齊格勒" } ] } diff --git a/client/i18n/locales/chinese-traditional/translations.json b/client/i18n/locales/chinese-traditional/translations.json index 68a3d3706e5..643c5b0bc15 100644 --- a/client/i18n/locales/chinese-traditional/translations.json +++ b/client/i18n/locales/chinese-traditional/translations.json @@ -11,6 +11,7 @@ "view": "查看", "view-code": "查看代碼", "view-project": "查看項目", + "view-cert-title": "View {{certTitle}}", "show-cert": "顯示認證", "claim-cert": "申請認證", "save-progress": "保存進度", @@ -52,7 +53,7 @@ "check-code": "檢查您的代碼 (Ctrl + Enter)", "check-code-2": "檢查你的代碼", "reset": "重置", - "reset-code": "重置所有代碼", + "reset-step": "Reset This Step", "help": "幫助", "get-help": "獲得幫助", "watch-video": "觀看視頻", @@ -157,7 +158,8 @@ "honesty": "學術誠信條例", "internet": "你在各平臺的賬號", "portfolio": "作品集設置", - "privacy": "隱私設置" + "privacy": "隱私設置", + "personal-info": "Personal Information" }, "danger": { "heading": "危險區域", @@ -272,6 +274,7 @@ "add-subtitles": "幫助我們完善或添加字幕", "wrong-answer": "抱歉,這個答案不正確。再試一次?", "check-answer": "點擊下方按鈕,查看你的答案。", + "assignment-not-complete": "Please finish the assignments", "solution-link": "解決方案鏈接", "github-link": "GitHub 鏈接", "submit-and-go": "提交併訪問下一個挑戰", @@ -339,6 +342,7 @@ "title": "支持我們的慈善組織", "processing": "我們正在處理你的捐款。", "redirecting": "重新引導中...", + "thanks": "Thanks for donating", "thank-you": "謝謝你成爲我們的支持者。", "additional": "你可以使用這個鏈接 <0>{{url}} 額外進行一次性捐款:", "help-more": "幫助我們做更多", @@ -462,7 +466,8 @@ "iframe-preview": "{{title}} 預覽", "iframe-alert": "通常,此鏈接會將你帶到另一個網站!一切正常,這個鏈接指向:{{externalLink}}。", "iframe-form-submit-alert": "通常這個表單將被提交!工作正常,這將被提交到:{{externalLink}}", - "document-notfound": "找不到文件" + "document-notfound": "找不到文件", + "slow-load-msg": "Looks like this is taking longer than usual, please try refreshing the page." }, "icons": { "gold-cup": "金獎盃", @@ -507,7 +512,8 @@ "step": "步驟", "steps": "步驟", "steps-for": "{{blockTitle}} 的步驟", - "code-example": "{{codeName}} 代碼示例" + "code-example": "{{codeName}} 代碼示例", + "opens-new-window": "Opens in new window" }, "flash": { "honest-first": "申請認證之前,你必須先接受我們的《學術誠信條例》", diff --git a/client/i18n/locales/chinese/intro.json b/client/i18n/locales/chinese/intro.json index bf8b57ea863..a6d7caaafa7 100644 --- a/client/i18n/locales/chinese/intro.json +++ b/client/i18n/locales/chinese/intro.json @@ -553,7 +553,7 @@ "intro": [ "在这之前,你只是在前端使用 JavaScript 来给页面添加交互、解决算法挑战,或构建一个 SPA(单页应用程序)。但 JavaScript 也可以用于后端或者服务器来构建整个 web 应用程序。", "今天,构建应用软件的广受欢迎的方法之一是微服务,这些微服务是一种小型模块化的应用,能够共同形成一个更大的整体。", - "在后端开发和 APIs 认证中,你将学习如何使用 Node.js 和 npm(Node 包管理工具)来写后端。你还将使用 Express 框架构建 web 应用程序,并使用 MongoDB 和 Mongoose 库构建一个 People Finder 微服务。" + "In the Back End Development and APIs Certification, you'll learn how to write back end apps with Node.js and npm. You'll also build web applications with the Express framework, and build a People Finder microservice with MongoDB and the Mongoose library." ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "属性:Rosetta 代码" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "欧拉计划", "intro": [ diff --git a/client/i18n/locales/chinese/motivation.json b/client/i18n/locales/chinese/motivation.json index d65a69bb268..43aba58e9b9 100644 --- a/client/i18n/locales/chinese/motivation.json +++ b/client/i18n/locales/chinese/motivation.json @@ -1,819 +1,856 @@ { "compliments": [ - "Over the top!", - "Down the rabbit hole we go!", - "Bring that rain!", - "Target acquired.", - "Feel that need for speed!", - "You've got guts!", - "We have liftoff!", - "To infinity and beyond!", - "Encore!", - "Onward!", - "Challenge destroyed!", - "It's on like Donkey Kong!", - "Power level? It's over 9000!", - "Coding spree!", - "Code long and prosper.", - "The crowd goes wild!", - "One for the Guinness book!", - "Flawless victory!", - "Most efficient!", - "You've got the touch!", - "You're on fire!", - "The town is now red!", - "To the nines!", - "To the Batmobile!", - "Pull out all the stops!", - "You're a wizard, Harry!", - "You're an all-star!", - "Way to go!", - "Outta sight!", - "You're crushing it!", - "What sorcery is this?", - "The world rejoices!", - "That's the way it's done!", - "You rock!", - "Woo-hoo!", - "We knew you could do it!", - "Hyper Combo Finish!", - "Nothing but net!", - "Boom-shakalaka!", - "You're a shooting star!", - "You're unstoppable!", - "Way cool!", - "Walk on that sunshine!", - "Keep on trucking!", - "Off the charts!", - "There is no spoon!", - "Cranked it up to 11!", - "Escape velocity reached!", - "You make this look easy!", - "Passed with flying colors!", - "You've got this!", - "Happy, happy, joy, joy!", - "Tomorrow, the world!", - "Your powers combined!", - "It's alive. It's alive!", - "Sonic Boom!", - "Here's looking at you, Code!", - "Ride like the wind!", - "Legen - wait for it - dary!", - "Ludicrous Speed! Go!", - "Most triumphant!", - "One loop to rule them all!", - "By the power of Grayskull!", - "You did it!", - "Storm that castle!", - "Face-melting guitar solo!", - "Checkmate!", - "Bodacious!", - "Tubular!", - "You're outta sight!", - "Keep calm and code on!", - "Even sad panda smiles!", - "Even grumpy cat approves!", - "Kool Aid Man says oh yeah!", - "Bullseye!", - "Far out!", - "You're heating up!", - "Standing ovation!", - "Nice one!", - "All right!", - "Hasta la vista, challenge!", - "Terminated.", - "Off the hook!", - "Thundercats, Hooo!", - "Shiver me timbers!", - "Raise the roof!", - "Bingo!", - "Even Honey Badger cares!", - "Helm, Warp Nine. Engage!", - "Gotta code 'em all!", - "Spool up the FTL drive!", - "Cool beans!", - "They're in another castle.", - "Power UP!", - "Pikachu chooses you!", - "I gotta have more cowbell.", - "Gotta go fast!", - "Yippee!", - "Cowabunga!", - "Moon Prism Power!", - "Plus Ultra!" + "太棒了!", + "我们跳进兔子洞!", + "雨下吧!", + "获取目标。", + "体验极速快感!", + "你有胆量!", + "我们升空了!", + "飞向无限!", + "再来一次!", + "向前进!", + "挑战被摧毁!", + "重磅如同大金刚!", + "战斗力?超过 9000!", + "编码狂潮!", + "编码不息,繁荣昌盛。", + "人群变得疯狂!", + "一个吉尼斯世界纪录!", + "完胜!", + "最高效率!", + "你有手感了!", + "你正在燃烧!", + "满城春色!", + "完美!", + "上蝙蝠车!", + "全力以赴!", + "你是个巫师,哈利!", + "你是全明星队员!", + "干得好!", + "棒极了!", + "你太出色了!", + "这是什么魔法?", + "世界欢欣鼓舞!", + "难题就是这样搞定的!", + "你真棒!", + "呜呼!", + "我们就知道你能行!", + "超级组合终结!", + "空心球!", + "炸弹-沙卡拉卡!", + "你是一颗流星!", + "你势不可挡!", + "太酷了!", + "走在那阳光下!", + "坚持下去!", + "水平爆表!", + "勺子并不存在!", + "调到最大音量!", + "达到逃逸速度!", + "你让这看起来很简单!", + "以优异的成绩通过!", + "你能行!", + "开心,开心,快乐,快乐!", + "明天,征服世界!", + "你的全部力量!", + "它活了。它活了!", + "索尼克音爆!", + "看着你呢,代码!", + "疾驰如风!", + "传——奇!", + "离谱的速度!出发!", + "高奏凯歌!", + "用一个循环来统治它们!", + "凭借灰壳堡的神力!", + "你做到了!", + "冲进城堡!", + "荡人心魄的吉他独奏!", + "完全击败!", + "大有胆识!", + "厉害!", + "你真强啊!", + "保持冷静,继续编码!", + "即使是悲伤的熊猫也会微笑!", + "即使脾气暴躁的猫也同意!", + "如此感觉无以伦比。", + "正中靶心!", + "前卫!", + "燃烧吧,小宇宙!", + "起立鼓掌!", + "不错!", + "好啊!", + "回见,挑战!", + "终结了。", + "脱身!", + "霹雳猫显神威!", + "让我五体投地!", + "大显身手!", + "答对了!", + "连蜜獾都在乎!", + "掌舵,第九曲速。启动!", + "必须全部编码!", + "发动超光速引擎!", + "酷豆子!", + "她们在另一个城堡里。", + "加电!", + "皮卡丘选择了你!", + "我要再多点牛铃。", + "得快点!", + "了不起!", + "卡瓦邦嘎!", + "月亮棱镜能量!", + "超越极致!", + "米尔豪斯一切都会好起来的!" ], "motivationalQuotes": [ { - "quote": "Whatever you are, be a good one.", - "author": "Abraham Lincoln" + "quote": "不管你是谁,做个好人。", + "author": "亚伯拉罕·林肯" }, { - "quote": "A change in perspective is worth 80 IQ points.", - "author": "Alan Kay" + "quote": "换一个角度看问题值80点智商。", + "author": "艾伦·凯" }, { - "quote": "The best way to predict the future is to invent it.", - "author": "Alan Kay" + "quote": "预测未来的最好方法是创造未来。", + "author": "艾伦·凯" }, { - "quote": "The future is not laid out on a track. It is something that we can decide, and to the extent that we do not violate any known laws of the universe, we can probably make it work the way that we want to.", - "author": "Alan Kay" + "quote": "未来不是在轨道上规划的。这是我们可以决定的事情,只要我们不违反任何已知的宇宙法则,我们就可以让它按我们想要的方式运行。", + "author": "艾伦·凯" }, { - "quote": "We can only see a short distance ahead, but we can see plenty there that needs to be done.", - "author": "Alan Turing" + "quote": "我们只能看到前面很短的距离,但我们可以看到有很多事情需要做。", + "author": "艾伦·图灵" }, { - "quote": "In the depth of winter, I finally learned that within me there lay an invincible summer.", - "author": "Albert Camus" + "quote": "隆冬时节,我终于明白,我的内心深处有一个不可战胜的夏天。", + "author": "阿尔伯特·加缪" }, { - "quote": "A person who never made a mistake never tried anything new.", - "author": "Albert Einstein" + "quote": "从不犯错的人从不尝试新事物。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "Creativity is intelligence having fun.", - "author": "Albert Einstein" + "quote": "创造力是智力的乐趣。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "I have no special talents. I am only passionately curious.", - "author": "Albert Einstein" + "quote": "我没有什么特别的才能。我只是非常好奇。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "Life is like riding a bicycle. To keep your balance, you must keep moving.", - "author": "Albert Einstein" + "quote": "生活就像骑自行车。为了保持平衡,你必须继续前进。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "Make everything as simple as possible, but not simpler.", - "author": "Albert Einstein" + "quote": "事情应该力求简单,但不能过于简单。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "Never memorize something that you can look up.", - "author": "Albert Einstein" + "quote": "绝不要去记那些你能够查得到的东西。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "Once we accept our limits, we go beyond them.", - "author": "Albert Einstein" + "quote": "一旦我们接受了自己的极限,我们就超越了它们。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "Play is the highest form of research.", - "author": "Albert Einstein" + "quote": "玩耍是研究的最高形式。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "We cannot solve our problems with the same thinking we used when we created them.", - "author": "Albert Einstein" + "quote": "我们不能用我们创造问题时的思维来解决问题。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "Wisdom is not a product of schooling but of the lifelong attempt to acquire it.", - "author": "Albert Einstein" + "quote": "智慧不是学校教育的产物,而是终身学习的产物。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "Your imagination is your preview of life's coming attractions.", - "author": "Albert Einstein" + "quote": "你的想像是你人生的预览。", + "author": "阿尔伯特·爱因斯坦" }, { - "quote": "There is only one corner of the universe you can be certain of improving, and that's your own self.", - "author": "Aldous Huxley" + "quote": "宇宙中只有一个角落是你可以切实改进的,那就是你自己。", + "author": "奥尔德斯·赫胥黎" }, { - "quote": "The most common way people give up their power is by thinking they don't have any.", - "author": "Alice Walker" + "quote": "我感谢我的奋斗,因为没有它,我就不会偶然发现自己的力量。", + "author": "亚历克斯·艾尔" }, { - "quote": "Follow your inner moonlight. Don't hide the madness.", - "author": "Allen Ginsberg" + "quote": "人们放弃权力最常见的方式是认为自己没有权力。", + "author": "艾丽丝·沃克" }, { - "quote": "The most difficult thing is the decision to act. The rest is merely tenacity.", - "author": "Amelia Earhart" + "quote": "跟随你内心的月光。别掩饰自己的疯狂。", + "author": "艾伦·金斯伯格" }, { - "quote": "Life shrinks or expands in proportion with one's courage.", - "author": "Anaïs Nin" + "quote": "最困难的是决定采取行动。剩下的只是坚韧。", + "author": "阿梅莉亚·埃尔哈特" }, { - "quote": "Weeks of programming can save you hours of planning.", - "author": "Unknown" + "quote": "生命的缩小或扩大与一个人的勇气成正比。", + "author": "阿奈斯·宁" }, { - "quote": "Quality is not an act, it is a habit.", - "author": "Aristotle" + "quote": "数周的编程可以节省你数小时的计划。", + "author": "佚名" }, { - "quote": "Start where you are. Use what you have. Do what you can.", - "author": "Arthur Ashe" + "quote": "质量不是一种行为,而是一种习惯。", + "author": "亚里士多德" }, { - "quote": "Nothing is impossible, the word itself says \"I'm possible\"!", - "author": "Audrey Hepburn" + "quote": "从现在开始。利用你所拥有的。尽你所能。", + "author": "亚瑟·阿什" }, { - "quote": "Every strike brings me closer to the next home run.", - "author": "Babe Ruth" + "quote": "没有什么是不可能的,连这个词本身都说“不,可能”!", + "author": "奥黛丽·赫本" }, { - "quote": "By failing to prepare, you are preparing to fail.", - "author": "Benjamin Franklin" + "quote": "每一击都让我离下一个本垒打越来越近。", + "author": "贝比·鲁斯" }, { - "quote": "Tell me and I forget. Teach me and I remember. Involve me and I learn.", - "author": "Benjamin Franklin" + "quote": "如果你没有做好准备,你就是在准备失败。", + "author": "本杰明·富兰克林" }, { - "quote": "Well done is better than well said.", - "author": "Benjamin Franklin" + "quote": "告诉我,我会忘记。教我,我会记住。让我参与,我会学习。", + "author": "本杰明·富兰克林" }, { - "quote": "There are no short cuts to any place worth going.", - "author": "Beverly Sills" + "quote": "说得好不如做得好。", + "author": "本杰明·富兰克林" }, { - "quote": "Controlling complexity is the essence of computer programming.", - "author": "Brian Kernighan" + "quote": "任何值得去的地方都没有捷径。", + "author": "贝弗利·希尔斯" }, { - "quote": "I fear not the man who has practiced 10,000 kicks once, but I fear the man who has practiced one kick 10,000 times.", - "author": "Bruce Lee" + "quote": "控制复杂性是计算机编程的本质。", + "author": "布莱恩·科尼汉" }, { - "quote": "There are far, far better things ahead than any we leave behind.", - "author": "C.S. Lewis" + "quote": "我不怕遇到练习过一万种腿法的对手,但害怕遇到只将一种腿法练习一万次的强敌。", + "author": "李小龙" }, { - "quote": "We are what we believe we are.", - "author": "C.S. Lewis" + "quote": "比起遗落在过去的,未来还有更加美好的在等待着我们。", + "author": "C.S. 路易斯" }, { - "quote": "With the possible exception of the equator, everything begins somewhere.", - "author": "C.S. Lewis" + "quote": "我们就是我们所相信的自己。", + "author": "C.S. 路易斯" }, { - "quote": "You are never too old to set another goal, or to dream a new dream.", - "author": "C.S. Lewis" + "quote": "可能除了赤道以外,一切都从某处开始。", + "author": "C.S. 路易斯" }, { - "quote": "Somewhere, something incredible is waiting to be known.", - "author": "Carl Sagan" + "quote": "无论年纪多大,你都可以设立新目标或拥有新梦想。", + "author": "C.S. 路易斯" }, { - "quote": "If you're not making mistakes, then you're not making decisions.", - "author": "Catherine Cook" + "quote": "在某个地方,一些不可思议的事物正在等你去发现。", + "author": "卡尔·萨根" }, { - "quote": "Find what you love and let it kill you.", - "author": "Charles Bukowski" + "quote": "当你有梦想时,你必须抓住它,永不放弃。", + "author": "卡罗尔·伯内特" }, { - "quote": "What matters most is how well you walk through the fire.", - "author": "Charles Bukowski" + "quote": "如果你没有犯错误,那么你就没有做决定。", + "author": "凯瑟琳·库克" }, { - "quote": "It is not the strongest of the species that survive, nor the most intelligent, but the one most responsive to change.", - "author": "Charles Darwin" + "quote": "爱我所爱,至死方休。", + "author": "查尔斯·布考斯基" }, { - "quote": "Life is 10% what happens to you and 90% how you react to it.", - "author": "Charles R. Swindoll" + "quote": "最重要的是你能否赴汤蹈火。", + "author": "查尔斯·布考斯基" }, { - "quote": "You will do foolish things, but do them with enthusiasm.", - "author": "Colette" + "quote": "生存下来的不是最强壮的物种,也不是最聪明的物种,而是最能适应变化的物种。", + "author": "查尔斯·达尔文" }, { - "quote": "It does not matter how slowly you go as long as you do not stop.", - "author": "Confucius" + "quote": "细节不仅是细节,而且决定了设计。", + "author": "查尔斯·伊姆斯" }, { - "quote": "Real knowledge is to know the extent of one's ignorance.", - "author": "Confucius" + "quote": "创造力不仅仅是与众不同。任何人都可以做到怪诞不经,这很简单。难的是像巴赫那样简单。使简单的,非常简单,这就是创造力。", + "author": "查尔斯·明格斯" }, { - "quote": "The past cannot be changed. The future is yet in your power.", - "author": "Confucius" + "quote": "生活的 10% 是发生在你身上的事,90% 是你对它的反应。", + "author": "查尔斯·R·斯温多尔" }, { - "quote": "Looking at code you wrote more than two weeks ago is like looking at code you are seeing for the first time.", - "author": "Dan Hurvitz" + "quote": "你不免会做傻事,但热烈地、衷心地投入做吧。", + "author": "科莱特" }, { - "quote": "Someday is not a day of the week.", - "author": "Denise Brennan-Nelson" + "quote": "譬如为山,未成一篑,止,吾止也。譬如平地,虽覆一篑,进,吾往也。", + "author": "孔子" }, { - "quote": "UNIX is simple. It just takes a genius to understand its simplicity.", - "author": "Dennis Ritchie" + "quote": "知之为知之,不知为不知,是知也。", + "author": "孔子" }, { - "quote": "Computers are good at following instructions, but not at reading your mind.", - "author": "Donald Knuth" + "quote": "往昔不可谏,来者犹可追。", + "author": "孔子" }, { - "quote": "A good programmer is someone who always looks both ways before crossing a one-way street.", - "author": "Doug Linder" + "quote": "看着自己两个多星期前编写的代码就像第一次看到这代码一样。", + "author": "丹·赫维茨" }, { - "quote": "Tough times never last, but tough people do.", - "author": "Dr. Robert Schuller" + "quote": "“总有一天”不是一周中的一天。", + "author": "丹尼斯·布伦南-纳尔逊" }, { - "quote": "If things start happening, don't worry, don't stew, just go right along and you'll start happening too.", - "author": "Dr. Seuss" + "quote": "UNIX很简单。不过只有天才才能理解它的简单性。", + "author": "丹尼斯·里奇" }, { - "quote": "Do not go gentle into that good night. Rage, rage against the dying of the light.", - "author": "Dylan Thomas" + "quote": "在我看来,要想见彩虹,就得忍受风雨!", + "author": "多莉·帕顿" }, { - "quote": "The question of whether computers can think is like the question of whether submarines can swim.", - "author": "E.W. Dijkstra" + "quote": "计算机善于遵循指令,但不善于理解你的思维。", + "author": "唐纳德·克努特" }, { - "quote": "Any code of your own that you haven't looked at for six or more months might as well have been written by someone else.", - "author": "Eagleson's Law" + "quote": "优秀的程序员总是在过单行道之前两边都看一下。", + "author": "道格·林德" }, { - "quote": "Do one thing every day that scares you.", - "author": "Eleanor Roosevelt" + "quote": "创造力是狂野的头脑和训练有素的眼睛。", + "author": "多萝西·帕克" }, { - "quote": "With the new day comes new strength and new thoughts.", - "author": "Eleanor Roosevelt" + "quote": "艰苦的时光终将过去,坚强的人们必将苦尽甘来。", + "author": "罗伯特·舒勒博士" }, { - "quote": "You must do the things you think you cannot do.", - "author": "Eleanor Roosevelt" + "quote": "如果事情开始发生,不要发愁,不要担忧,只要一直走下去,你也会开始发生的。", + "author": "苏斯博士" }, { - "quote": "Light tomorrow with today.", - "author": "Elizabeth Barrett Browning" + "quote": "不要温和地走进那良夜。怒斥,怒斥光明的消逝。", + "author": "狄兰·托马斯" }, { - "quote": "Forever is composed of nows.", - "author": "Emily Dickinson" + "quote": "计算机能否思考的问题就像潜艇能否游泳的问题一样。", + "author": "E·W·迪科斯彻" }, { - "quote": "Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.", - "author": "Eric Raymond" + "quote": "自己写的代码,只要有六个月没有看过,就像是别人写的一样。", + "author": "伊格尔森定律" }, { - "quote": "If you don't risk anything, you risk even more.", - "author": "Erica Jong" + "quote": "每天做一件让你害怕的事。", + "author": "埃莉诺·罗斯福" }, { - "quote": "The world breaks everyone, and afterward, many are strong at the broken places.", - "author": "Ernest Hemingway" + "quote": "新的一天带来了新的力量和新的思想。", + "author": "埃莉诺·罗斯福" }, { - "quote": "There is nothing noble in being superior to your fellow man; true nobility is being superior to your former self.", - "author": "Ernest Hemingway" + "quote": "你必须做你自己认为做不到的事。", + "author": "埃莉诺·罗斯福" }, { - "quote": "Never confuse a single defeat with a final defeat.", - "author": "F. Scott Fitzgerald" + "quote": "用今天照亮明天。", + "author": "伊丽莎白·巴雷特·布朗宁" }, { - "quote": "I attribute my success to this - I never gave or took any excuse.", - "author": "Florence Nightingale" + "quote": "如果你的梦想没有吓到你,那是因为你梦想得还不够大。", + "author": "爱伦·约翰森·希尔丽夫" }, { - "quote": "The best revenge is massive success.", - "author": "Frank Sinatra" + "quote": "永远是由现在组成的。", + "author": "艾米莉·狄金森" }, { - "quote": "The only limit to our realization of tomorrow, will be our doubts of today.", - "author": "Franklin D. Roosevelt" + "quote": "计算机科学教育不能使任何人成为专家程序员,正如学习画笔和颜料无法让人成为绘画专家一样。", + "author": "埃里克·雷蒙德" }, { - "quote": "Right or wrong, it's very pleasant to break something from time to time.", - "author": "Fyodor Dostoevsky" + "quote": "如果你不冒任何风险,你的风险就更大。", + "author": "艾瑞卡·琼" }, { - "quote": "The harder I work, the luckier I get.", - "author": "Gary Player" + "quote": "生活总是让我们遍体鳞伤,但到后来,那些受伤的地方会变得更坚强。", + "author": "厄内斯特·海明威" }, { - "quote": "Giving up is the only sure way to fail.", - "author": "Gena Showalter" + "quote": "优于别人,并不高贵,真正的高贵应该是优于过去的自己。", + "author": "厄内斯特·海明威" }, { - "quote": "The only truly secure system is one that is powered off, cast in a block of concrete and sealed in a lead-lined room with armed guards.", - "author": "Gene Spafford" + "quote": "永远不要将一次失败与最终失败混淆。", + "author": "F. 斯科特·菲茨杰拉德" }, { - "quote": "A life spent making mistakes is not only more honorable, but more useful than a life spent doing nothing.", - "author": "George Bernard Shaw" + "quote": "我将我的成功归功于此——我从不找,也不接受任何借口。", + "author": "弗洛伦斯·南丁格尔" }, { - "quote": "First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack.", - "author": "George Carrette" + "quote": "最好的报复是巨大的成功。", + "author": "弗兰克·西纳特拉" }, { - "quote": "Discovering the unexpected is more important than confirming the known.", - "author": "George Box" + "quote": "我们实现明天的唯一限制是我们对今天的怀疑。", + "author": "富兰克林·罗斯福" }, { - "quote": "We only see what we know.", - "author": "Goethe" + "quote": "不管是对是错,时不时弄坏点东西是一件非常愉快的事情。", + "author": "陀思妥耶夫斯基" }, { - "quote": "Without hard work, nothing grows but weeds.", - "author": "Gordon B. Hinckley" + "quote": "我越努力,就越幸运。", + "author": "盖瑞·普莱尔" }, { - "quote": "The function of good software is to make the complex appear to be simple.", - "author": "Grady Booch" + "quote": "放弃是失败的唯一可靠途径。", + "author": "吉娜·肖沃尔特" }, { - "quote": "When you know that you're capable of dealing with whatever comes, you have the only security the world has to offer.", - "author": "Harry Browne" + "quote": "唯一真正安全的系统是断了电、浇铸在混凝土块中、并密封在有武装警卫的铅衬房间内的系统。", + "author": "金·斯帕福德" }, { - "quote": "Pain is inevitable. Suffering is optional.", - "author": "Haruki Murakami" + "quote": "一生犯错误不仅比一生无所事事更光荣,而且更有用。", + "author": "萧伯纳" }, { - "quote": "Optimism is the faith that leads to achievement. Nothing can be done without hope and confidence.", - "author": "Helen Keller" + "quote": "首先学会计算机科学和所有的理论。 然后发展出一个编程风格。之后便要忘掉所有这些,自由地编码。", + "author": "乔治·卡雷特" }, { - "quote": "The price of anything is the amount of life you exchange for it.", - "author": "Henry David Thoreau" + "quote": "发现意想不到的比确认已知的更重要。", + "author": "乔治·博克斯" }, { - "quote": "Whether you think you can or think you can't, you're right.", - "author": "Henry Ford" + "quote": "我们只能看到自己所知的。", + "author": "歌德" }, { - "quote": "The most exciting phrase to hear in science, the one that heralds discoveries, is not 'Eureka!' but 'Now that's funny…'", - "author": "Isaac Asimov" + "quote": "不努力耕耘,只会长出杂草。", + "author": "戈登·B·欣克利" }, { - "quote": "We are all failures. At least the best of us are.", - "author": "J.M. Barrie" + "quote": "好的软件的功能就是化繁为简。", + "author": "格雷迪·布奇" }, { - "quote": "You can't wait for inspiration. You have to go after it with a club.", - "author": "Jack London" + "quote": "当你知道自己有能力应对任何事情时,你就拥有了世界所能提供的唯一安全感。", + "author": "哈利·布朗" }, { - "quote": "Don't wish it were easier, wish you were better.", - "author": "Jim Rohn" + "quote": "痛苦不可避免,但可以选择是否受苦。", + "author": "村上春树" }, { - "quote": "By seeking and blundering we learn.", - "author": "Johann Wolfgang von Goethe" + "quote": "乐观是导致成就的信念。没有希望和信心,就什么都做不了。", + "author": "海伦·凯勒" }, { - "quote": "Knowing is not enough; we must apply. Wishing is not enough; we must do.", - "author": "Johann Wolfgang von Goethe" + "quote": "任何东西的价格都等于你用多少生命去换取它。", + "author": "亨利·大卫·梭罗" }, { - "quote": "We first make our habits, then our habits make us.", - "author": "John Dryden" + "quote": "不管你认为你能还是不能,你都是对的。", + "author": "亨利·福特" }, { - "quote": "The power of imagination makes us infinite.", - "author": "John Muir" + "quote": "在科学中听到的最令人兴奋的短语,即预示着发现的短语,不是“找到了!” 而是“这很有趣……”", + "author": "艾萨克·阿西莫夫" }, { - "quote": "May you live every day of your life.", - "author": "Jonathan Swift" + "quote": "你所做的会有影响。你必须决定你想要做出什么样的改变。", + "author": "简·古道尔" }, { - "quote": "Perseverance is failing 19 times and succeeding the 20th.", - "author": "Julie Andrews" + "quote": "我们都是失败者。至少我们中最好的人是。", + "author": "J.M.巴里" }, { - "quote": "The work of today is the history of tomorrow, and we are its makers.", - "author": "Juliette Gordon Low" + "quote": "你不能等待灵感。你必须提着木棒去追求它。", + "author": "杰克·伦敦" }, { - "quote": "If you reveal your secrets to the wind, you should not blame the wind for revealing them to the trees.", - "author": "Kahlil Gibran" + "quote": "不要希望事情更容易,希望你更有能力。", + "author": "吉姆·罗恩" }, { - "quote": "Optimism is an occupational hazard of programming; feedback is the treatment.", - "author": "Kent Beck" + "quote": "我们通过寻找和犯错误来学习。", + "author": "约翰·沃尔夫冈·冯·歌德" }, { - "quote": "Opportunity does not knock, it presents itself when you beat down the door.", - "author": "Kyle Chandler" + "quote": "知道是不够的;我们必须应用。希望是不够的;我们必须行动。", + "author": "约翰·沃尔夫冈·冯·歌德" }, { - "quote": "To iterate is human, to recurse divine.", - "author": "Peter Deutsch" + "quote": "我们先养成习惯,然后习惯造就我们。", + "author": "约翰·德莱登" }, { - "quote": "A good traveler has no fixed plans and is not intent on arriving.", - "author": "Lao Tzu" + "quote": "想象力使我们无限。", + "author": "约翰·缪尔" }, { - "quote": "An ant on the move does more than a dozing ox.", - "author": "Lao Tzu" + "quote": "愿你过好每一天。", + "author": "乔纳森·斯威夫特" }, { - "quote": "Do the difficult things while they are easy and do the great things while they are small. A journey of a thousand miles must begin with a single step.", - "author": "Lao Tzu" + "quote": "坚持就是前 19 次失败,第 20 次成功。", + "author": "朱莉·安德鲁斯" }, { - "quote": "That's the thing about people who think they hate computers. What they really hate is lousy programmers.", - "author": "Larry Niven" + "quote": "今天的工作就是明天的历史,我们是它的创造者。", + "author": "朱丽叶·戈登·洛" }, { - "quote": "It had long since come to my attention that people of accomplishment rarely sat back and let things happen to them. They went out and happened to things.", - "author": "Leonardo da Vinci" + "quote": "如果你向风泄露了你的秘密,你不应该责怪风将它们泄露给树木。", + "author": "纪伯伦" }, { - "quote": "If you're any good at all, you know you can be better.", - "author": "Lindsay Buckingham" + "quote": "乐观是编程的职业病;反馈就是治疗。", + "author": "肯特·贝克" }, { - "quote": "If people never did silly things, nothing intelligent would ever get done.", - "author": "Ludwig Wittgenstein" + "quote": "机会不会敲门,它会在你敲门的时候出现。", + "author": "凯尔·钱德勒" }, { - "quote": "You only live once, but if you do it right, once is enough.", - "author": "Mae West" + "quote": "迭代的是人,递归的是神。", + "author": "彼得·多伊奇" }, { - "quote": "Live as if you were to die tomorrow. Learn as if you were to live forever.", - "author": "Mahatma Gandhi" + "quote": "善行无辙迹,善言无瑕谪。", + "author": "老子" }, { - "quote": "Strength does not come from physical capacity. It comes from an indomitable will.", - "author": "Mahatma Gandhi" + "quote": "合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。", + "author": "老子" }, { - "quote": "One person's 'paranoia' is another person's 'engineering redundancy'.", - "author": "Marcus J. Ranum" + "quote": "那些认为自己讨厌电脑的人就是这样。他们真正讨厌的是糟糕的程序员。", + "author": "拉里·尼文" }, { - "quote": "Nothing in life is to be feared, it is only to be understood. Now is the time to understand more, so that we may fear less.", - "author": "Marie Curie" + "quote": "我早就发现,成功的人很少坐以待毙,让事情发生在他们身上。他们出去主动去做事。", + "author": "达芬奇" }, { - "quote": "If you have everything under control, you're not moving fast enough.", - "author": "Mario Andretti" + "quote": "如果你有一点才能,你就会知道你还可以做得更好。", + "author": "林赛·白金汉" }, { - "quote": "Education: the path from cocky ignorance to miserable uncertainty.", - "author": "Mark Twain" + "quote": "如果人们从不做傻事,就什么都不会做得聪明。", + "author": "路德维希·维特根斯坦" }, { - "quote": "It ain't what you don't know that gets you into trouble. It's what you know for sure that just ain't so.", - "author": "Mark Twain" + "quote": "人只活一次,但若活得其所一次已足够。", + "author": "梅·韦斯特" }, { - "quote": "The secret of getting ahead is getting started.", - "author": "Mark Twain" + "quote": "像明天就要死一样生活,像永远活着一样学习。", + "author": "圣雄甘地" }, { - "quote": "The two most important days in your life are the day you are born and the day you find out why.", - "author": "Mark Twain" + "quote": "力量不是来自身体能力。它来自不屈不挠的意志。", + "author": "圣雄甘地" }, { - "quote": "Twenty years from now you will be more disappointed by the things that you didn't do than by the ones you did do. So throw off the bowlines. Sail away from the safe harbor. Catch the trade winds in your sails.", - "author": "Mark Twain" + "quote": "一个人的“偏执狂”是另一个人的“工程冗余”。", + "author": "马库斯·拉纳姆" }, { - "quote": "Any fool can write code that a computer can understand. Good programmers write code that humans can understand.", - "author": "Martin Fowler" + "quote": "生活中没有什么可怕的,只有需要理解的。现在是时候多去理解,这样我们就会少一些恐惧。", + "author": "玛丽·居里" }, { - "quote": "I know, somehow, that only when it is dark enough can you see the stars.", - "author": "Martin Luther King Jr." + "quote": "如果一切都在你的掌控之中,那么你的行动还不够快。", + "author": "马里奥·安德雷蒂" }, { - "quote": "It is never too late to be what you might have been.", - "author": "Mary Anne Evans" + "quote": "教育:从自大的无知到悲惨的不确定性的道路。", + "author": "马克·吐温" }, { - "quote": "Nothing will work unless you do.", - "author": "Maya Angelou" + "quote": "让你陷入麻烦的不是你不知道的东西,而是你确信的、其实并不是真的东西。", + "author": "马克·吐温" }, { - "quote": "We delight in the beauty of the butterfly, but rarely admit the changes it has gone through to achieve that beauty.", - "author": "Maya Angelou" + "quote": "取得成功的秘诀就是开始。", + "author": "马克·吐温" }, { - "quote": "We may encounter many defeats, but we must not be defeated.", - "author": "Maya Angelou" + "quote": "你生命中最重要的两天是你出生的那一天和你找到意义的那一天。", + "author": "马克·吐温" }, { - "quote": "Everybody has talent, but ability takes hard work.", - "author": "Michael Jordan" + "quote": "二十年后,你会因自己没做的事情而更加失望,而不是做过的事情。所以,请解开绳索,驶离安全的港湾,扬帆起航吧。", + "author": "马克·吐温" }, { - "quote": "I've missed more than 9,000 shots during my career. I've lost almost 300 games. 26 times, I've been trusted to take the game winning shot and missed. I've failed over and over and over again in my life. And that is why I succeed.", - "author": "Michael Jordan" + "quote": "任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员编写人类可以理解的代码。", + "author": "马丁·福勒" }, { - "quote": "Impossible is just a big word thrown around by small men who find it easier to live in the world they've been given than to explore the power they have to change it. Impossible is not a fact. It's an opinion. Impossible is not a declaration. It's a dare. Impossible is potential. Impossible is temporary. Impossible is nothing.", - "author": "Muhammad Ali" + "quote": "我知道,不知何故,只有当天足够黑时,你才能看到星星。", + "author": "马丁·路德·金" }, { - "quote": "A winner is a dreamer who never gives up.", - "author": "Nelson Mandela" + "quote": "永远不会太晚去成为你可能成为的人。", + "author": "玛丽·安妮·埃文斯" }, { - "quote": "It always seems impossible until it's done.", - "author": "Nelson Mandela" + "quote": "除非你行动起来,否则什么都不会改变。", + "author": "玛雅·安杰洛" }, { - "quote": "Failure will never overtake me if my determination to succeed is strong enough.", - "author": "Og Mandino" + "quote": "你无法用尽创造力。使用得越多,就会有越多。", + "author": "玛雅·安杰洛" }, { - "quote": "I am not young enough to know everything.", - "author": "Oscar Wilde" + "quote": "我们喜欢蝴蝶的美丽,但很少承认它为实现这种美丽所经历的变化。", + "author": "玛雅·安杰洛" }, { - "quote": "There is only one thing that makes a dream impossible to achieve: the fear of failure.", - "author": "Paulo Coelho" + "quote": "我们可能会遇到很多失败,但我们绝不能被击败。", + "author": "玛雅·安杰洛" }, { - "quote": "Never go to bed mad. Stay up and fight.", - "author": "Phyllis Diller" + "quote": "每个人都有天赋,但能力需要努力。", + "author": "迈克尔·乔丹" }, { - "quote": "You can't cross the sea merely by standing and staring at the water.", - "author": "Rabindranath Tagore" + "quote": "在我的职业生涯中,我错过了 9000 多次投篮。我输掉了近 300 场比赛。26 次,我被信任去投决胜一投,但都没有命中。我一次又一次地失败。但正因如此,我才获得了成功。", + "author": "迈克尔·乔丹" }, { - "quote": "The only person you are destined to become is the person you decide to be.", - "author": "Ralph Waldo Emerson" + "quote": "“不可能”只是小人物们轻易抛出的大词,他们宁愿留在自己被赋予的世界里,也不愿探索自己改变它的力量。“不可能”不是事实,而是意见。“不可能”不是宣言,而是挑战。“不可能”是潜力。“不可能”是暂时的。“不可能”什么也不是。", + "author": "穆罕默德·阿里" }, { - "quote": "What you do speaks so loudly that I cannot hear what you say.", - "author": "Ralph Waldo Emerson" + "quote": "胜利者是永不放弃的梦想家。", + "author": "纳尔逊·曼德拉" }, { - "quote": "People who are crazy enough to think they can change the world, are the ones who do.", - "author": "Rob Siltanen" + "quote": "看起来总是不可能,直到它被做到。", + "author": "纳尔逊·曼德拉" }, { - "quote": "The best way out is always through.", - "author": "Robert Frost" + "quote": "如果我成功的决心足够坚定,失败永远不会压倒我。", + "author": "奥格·曼狄诺" }, { - "quote": "Today's accomplishments were yesterday's impossibilities.", - "author": "Robert H. Schuller" + "quote": "我还不够年轻,不可能了解所有的事情。", + "author": "奥斯卡·王尔德" }, { - "quote": "Don't be satisfied with stories, how things have gone with others. Unfold your own myth.", - "author": "Rumi" + "quote": "只有一件事使梦想无法实现:对失败的恐惧。", + "author": "保罗·柯艾略" }, { - "quote": "Forget safety. Live where you fear to live. Destroy your reputation. Be notorious.", - "author": "Rumi" + "quote": "光是站着看水是无法渡海的。", + "author": "罗宾德拉纳特·泰戈尔" }, { - "quote": "Sell your cleverness and buy bewilderment.", - "author": "Rumi" + "quote": "你注定要成为的唯一的人,就是你决定成为的人。", + "author": "拉尔夫·沃尔多·爱默生" }, { - "quote": "The cure for pain is in the pain.", - "author": "Rumi" + "quote": "你的所作所为声音很大,我听不见你在说什么。", + "author": "拉尔夫·沃尔多·爱默生" }, { - "quote": "Have no fear of perfection - you'll never reach it.", - "author": "Salvador Dalí" + "quote": "那些足够疯狂以为自己可以改变世界的人,才是真正改变世界的人。", + "author": "罗伯·西塔宁" }, { - "quote": "Don't watch the clock. Do what it does. Keep going.", - "author": "Sam Levenson" + "quote": "最好的出路是有始有终。", + "author": "罗伯特·弗罗斯特" }, { - "quote": "Ever Tried. Ever failed. No matter. Try again. Fail again. Fail better.", - "author": "Samuel Beckett" + "quote": "今天的成就是昨天的不可能。", + "author": "罗伯特·舒乐" }, { - "quote": "The more you know, the more you realize you know nothing.", - "author": "Socrates" + "quote": "不要满足于故事,不要满足于别人的经历。揭开你自己的神话。", + "author": "鲁米" }, { - "quote": "The greatest enemy of knowledge is not ignorance, it is the illusion of knowledge.", - "author": "Stephen Hawking" + "quote": "忘掉安全感,到你所害怕的地方去生活。摧毁你的名声,做一个声名狼藉的人。", + "author": "鲁米" }, { - "quote": "The universe doesn't allow perfection.", - "author": "Stephen Hawking" + "quote": "卖掉你的聪明,买下困惑。", + "author": "鲁米" }, { - "quote": "Whether you want to uncover the secrets of the universe, or you want to pursue a career in the 21st century, basic computer programming is an essential skill to learn.", - "author": "Stephen Hawking" + "quote": "治疗疼痛的方法是在疼痛中。", + "author": "鲁米" }, { - "quote": "The scariest moment is always just before you start.", - "author": "Stephen King" + "quote": "不要害怕完美——你永远达不到完美。", + "author": "萨尔瓦多·达利" }, { - "quote": "You can, you should, and if you're brave enough to start, you will.", - "author": "Stephen King" + "quote": "不要看时钟。做它做的事情。继续前进。", + "author": "山姆·李文生" }, { - "quote": "Arise, Awake and Stop not until the goal is reached.", - "author": "Swami Vivekananda" + "quote": "曾经尝试过。曾经失败过。没关系。再尝试一次。再失败一次。做得更好。", + "author": "塞缪尔·贝克特" }, { - "quote": "It is said that your life flashes before your eyes just before you die. That is true, it's called Life.", - "author": "Terry Pratchett" + "quote": "你知道的越多,你就越发现你什么都不知道。", + "author": "苏格拉底" }, { - "quote": "Believe you can and you're halfway there.", - "author": "Theodore Roosevelt" + "quote": "知识最大的敌人不是无知,而是知识的幻觉。", + "author": "史蒂芬·霍金" }, { - "quote": "I have not failed. I've just found 10,000 ways that won't work.", - "author": "Thomas A. Edison" + "quote": "宇宙不允许完美。", + "author": "史蒂芬·霍金" }, { - "quote": "Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.", - "author": "Thomas A. Edison" + "quote": "无论你是想揭开宇宙的秘密,还是想在 21 世纪谋求职业,基础计算机编程是必学的技能。", + "author": "史蒂芬·霍金" }, { - "quote": "The harder the conflict, the more glorious the triumph.", - "author": "Thomas Paine" + "quote": "最可怕的时刻总是在你开始之前。", + "author": "史蒂芬.金" }, { - "quote": "The Web as I envisaged it, we have not seen it yet. The future is still so much bigger than the past.", - "author": "Tim Berners-Lee" + "quote": "你可以,你应该,如果你有足够的勇气开始,你会的。", + "author": "史蒂芬.金" }, { - "quote": "Failure is the condiment that gives success its flavor.", - "author": "Truman Capote" + "quote": "起床,醒来,直到达到目标才停下来。", + "author": "斯瓦米·维韦卡南达" }, { - "quote": "Those who says it cannot be done should not interrupt the person doing it.", - "author": "Unknown" + "quote": "据说,就在你死之前,你的生命在你眼前闪过。没错,这就是所谓的生活。", + "author": "泰瑞·普莱契" }, { - "quote": "Even if you fall on your face, you're still moving forward.", - "author": "Victor Kiam" + "quote": "相信你可以,你就成功了一半。", + "author": "西奥多·罗斯福" }, { - "quote": "It's not whether you get knocked down, it's whether you get up.", - "author": "Vince Lombardi" + "quote": "我没有失败。我只是找到了一万种行不通的方法。", + "author": "爱迪生" }, { - "quote": "I dream my painting and I paint my dream.", - "author": "Vincent van Gogh" + "quote": "我们最大的弱点在于放弃。最确定的成功方法永远是再试一次。", + "author": "爱迪生" }, { - "quote": "Let us cultivate our garden.", - "author": "Voltaire" + "quote": "冲突越激烈,胜利就越光荣。", + "author": "托马斯·潘恩" }, { - "quote": "Aim for the moon. If you miss, you may hit a star.", - "author": "W. Clement Stone" + "quote": "我所设想的网络,我们还没有看到。未来仍然比过去要大得多。", + "author": "蒂姆·伯纳斯-李" }, { - "quote": "The way to get started is to quit talking and begin doing.", - "author": "Walt Disney" + "quote": "失败是给成功增添风味的调味品。", + "author": "杜鲁门·卡波特" }, { - "quote": "You miss 100% of the shots you don't take.", - "author": "Wayne Gretzky" + "quote": "那些说这是不可能的人,不应该打断正在做这件事的人。", + "author": "佚名" }, { - "quote": "Don't let yesterday take up too much of today.", - "author": "Will Rogers" + "quote": "用不同的眼光看待平常的事物。", + "author": "维科·马吉斯泰蒂" }, { - "quote": "Even if you're on the right track, you'll get run over if you just sit there.", - "author": "Will Rogers" + "quote": "即使你摔倒在地,你仍然在前进。", + "author": "维克托·基亚姆" }, { - "quote": "Do not wait to strike till the iron is hot; but make it hot by striking.", - "author": "William Butler Yeats" + "quote": "重要的不是你是否被击倒,而是你是否爬起来。", + "author": "文斯·隆巴迪" }, { - "quote": "You cannot swim for new horizons until you have courage to lose sight of the shore.", - "author": "William Faulkner" + "quote": "我梦想我的画,我画我的梦。", + "author": "文森特·梵高" }, { - "quote": "Be not afraid of greatness. Some are born great, some achieve greatness, and others have greatness thrust upon them.", - "author": "William Shakespeare" + "quote": "伟大的事情是由一系列小事情汇聚而成的。", + "author": "文森特·梵高" }, { - "quote": "We know what we are, but not what we may be.", - "author": "William Shakespeare" + "quote": "让我们耕种我们的花园。", + "author": "伏尔泰" }, { - "quote": "In theory there is no difference between theory and practice. In practice there is.", - "author": "Yogi Berra" + "quote": "瞄准月亮。如果你错失目标,你可能会击中一颗恒星。", + "author": "克莱门特·斯通" }, { - "quote": "You can see a lot by just looking.", - "author": "Yogi Berra" + "quote": "开始的方法是停止说话,开始行动。", + "author": "沃尔特·迪斯尼" }, { - "quote": "There is no elevator to success, you have to take the stairs.", - "author": "Zig Ziglar" + "quote": "你不尝试的话,就有 100% 的机会失败。", + "author": "韦恩·格雷茨基" }, { - "quote": "You don't have to be great to start, but you have to start to be great.", - "author": "Zig Ziglar" + "quote": "不要让昨天占据太多的今天。", + "author": "威尔·罗杰斯" + }, + { + "quote": "即使你是在正确的路上,如果你只是坐在那里,你也会被撞倒。", + "author": "威尔·罗杰斯" + }, + { + "quote": "不要等铁热了再打;要用敲打使它变热。", + "author": "威廉·巴特勒·叶芝" + }, + { + "quote": "除非你有勇气离开海岸,否则你无法游向新的地平线。", + "author": "威廉·福克纳" + }, + { + "quote": "不要害怕伟大。 有些人天生伟大,有些人成就伟大,而另一些人则被推向伟大。", + "author": "威廉·莎士比亚" + }, + { + "quote": "我们知道我们是什么,但不知道我们可能成为什么。", + "author": "威廉·莎士比亚" + }, + { + "quote": "从理论上讲,理论和实践之间没有区别。在实践中是有的。", + "author": "约吉·贝拉" + }, + { + "quote": "通过看,你就可以觉察到很多东西。", + "author": "约吉·贝拉" + }, + { + "quote": "成功没有电梯,你必须走楼梯。", + "author": "齐格·齐格勒" + }, + { + "quote": "你不一定要很伟大才能开始,但你必须开始才能变得伟大。", + "author": "齐格·齐格勒" } ] } diff --git a/client/i18n/locales/chinese/translations.json b/client/i18n/locales/chinese/translations.json index 967982d023f..91cf2f1c245 100644 --- a/client/i18n/locales/chinese/translations.json +++ b/client/i18n/locales/chinese/translations.json @@ -11,6 +11,7 @@ "view": "查看", "view-code": "查看代码", "view-project": "查看项目", + "view-cert-title": "View {{certTitle}}", "show-cert": "显示认证", "claim-cert": "申请认证", "save-progress": "保存进度", @@ -52,7 +53,7 @@ "check-code": "检查您的代码 (Ctrl + Enter)", "check-code-2": "检查你的代码", "reset": "重置", - "reset-code": "重置所有代码", + "reset-step": "Reset This Step", "help": "帮助", "get-help": "获得帮助", "watch-video": "观看视频", @@ -157,7 +158,8 @@ "honesty": "学术诚信条例", "internet": "你在各平台的账号", "portfolio": "作品集设置", - "privacy": "隐私设置" + "privacy": "隐私设置", + "personal-info": "Personal Information" }, "danger": { "heading": "危险区域", @@ -272,6 +274,7 @@ "add-subtitles": "帮助我们完善或添加字幕", "wrong-answer": "抱歉,这个答案不正确。再试一次?", "check-answer": "点击下方按钮,查看你的答案。", + "assignment-not-complete": "Please finish the assignments", "solution-link": "解决方案链接", "github-link": "GitHub 链接", "submit-and-go": "提交并访问下一个挑战", @@ -339,6 +342,7 @@ "title": "支持我们的慈善组织", "processing": "我们正在处理你的捐款。", "redirecting": "重新引导中...", + "thanks": "Thanks for donating", "thank-you": "谢谢你成为我们的支持者。", "additional": "你可以使用这个链接 <0>{{url}} 额外进行一次性捐款:", "help-more": "帮助我们做更多", @@ -462,7 +466,8 @@ "iframe-preview": "{{title}} 预览", "iframe-alert": "通常,此链接会将你带到另一个网站!一切正常,这个链接指向:{{externalLink}}。", "iframe-form-submit-alert": "通常这个表单将被提交!工作正常,这将被提交到:{{externalLink}}", - "document-notfound": "找不到文件" + "document-notfound": "找不到文件", + "slow-load-msg": "Looks like this is taking longer than usual, please try refreshing the page." }, "icons": { "gold-cup": "金奖杯", @@ -507,7 +512,8 @@ "step": "步骤", "steps": "步骤", "steps-for": "{{blockTitle}} 的步骤", - "code-example": "{{codeName}} 代码示例" + "code-example": "{{codeName}} 代码示例", + "opens-new-window": "Opens in new window" }, "flash": { "honest-first": "申请认证之前,你必须先接受我们的《学术诚信条例》", diff --git a/client/i18n/locales/english/intro.json b/client/i18n/locales/english/intro.json index f6f66d32d27..dd6e626afdb 100644 --- a/client/i18n/locales/english/intro.json +++ b/client/i18n/locales/english/intro.json @@ -553,7 +553,7 @@ "intro": [ "Until this point, you've only used JavaScript on the front end to add interactivity to a page, solve algorithm challenges, or build an SPA. But JavaScript can also be used on the back end, or server, to build entire web applications.", "Today, one of the popular ways to build applications is through microservices, which are small, modular applications that work together to form a larger whole.", - "In the Back End Development and APIs Certification, you'll learn how to write back end apps with Node.js and npm (Node Package Manager). You'll also build web applications with the Express framework, and build a People Finder microservice with MongoDB and the Mongoose library." + "In the Back End Development and APIs Certification, you'll learn how to write back end apps with Node.js and npm. You'll also build web applications with the Express framework, and build a People Finder microservice with MongoDB and the Mongoose library." ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "Attribute: Rosetta Code" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "Project Euler", "intro": [ diff --git a/client/i18n/locales/english/translations.json b/client/i18n/locales/english/translations.json index afee76b2d58..165fa0c6146 100644 --- a/client/i18n/locales/english/translations.json +++ b/client/i18n/locales/english/translations.json @@ -11,6 +11,7 @@ "view": "View", "view-code": "View Code", "view-project": "View Project", + "view-cert-title": "View {{certTitle}}", "show-cert": "Show Certification", "claim-cert": "Claim Certification", "save-progress": "Save Progress", @@ -52,7 +53,7 @@ "check-code": "Check Your Code (Ctrl + Enter)", "check-code-2": "Check Your Code", "reset": "Reset", - "reset-code": "Reset All Code", + "reset-step": "Reset This Step", "help": "Help", "get-help": "Get Help", "watch-video": "Watch a Video", @@ -157,7 +158,8 @@ "honesty": "Academic Honesty Policy", "internet": "Your Internet Presence", "portfolio": "Portfolio Settings", - "privacy": "Privacy Settings" + "privacy": "Privacy Settings", + "personal-info": "Personal Information" }, "danger": { "heading": "Danger Zone", @@ -272,6 +274,7 @@ "add-subtitles": "Help improve or add subtitles", "wrong-answer": "Sorry, that's not the right answer. Give it another try?", "check-answer": "Click the button below to check your answer.", + "assignment-not-complete": "Please finish the assignments", "solution-link": "Solution Link", "github-link": "GitHub Link", "submit-and-go": "Submit and go to my next challenge", @@ -463,7 +466,8 @@ "iframe-preview": "{{title}} preview", "iframe-alert": "Normally this link would bring you to another website! It works. This is a link to: {{externalLink}}", "iframe-form-submit-alert": "Normally this form would be submitted! It works. This will be submitted to: {{externalLink}}", - "document-notfound": "document not found" + "document-notfound": "document not found", + "slow-load-msg": "Looks like this is taking longer than usual, please try refreshing the page." }, "icons": { "gold-cup": "Gold Cup", @@ -508,7 +512,8 @@ "step": "Step", "steps": "Steps", "steps-for": "Steps for {{blockTitle}}", - "code-example": "{{codeName}} code example" + "code-example": "{{codeName}} code example", + "opens-new-window": "Opens in new window" }, "flash": { "honest-first": "To claim a certification, you must first accept our academic honesty policy", diff --git a/client/i18n/locales/espanol/intro.json b/client/i18n/locales/espanol/intro.json index 938a114868e..c4aab96d457 100644 --- a/client/i18n/locales/espanol/intro.json +++ b/client/i18n/locales/espanol/intro.json @@ -553,7 +553,7 @@ "intro": [ "Hasta este punto, solo has usado JavaScript en la parte de front-end para agregar interactividad a una página, resolver los desafíos de algoritmos o construir un SPA. Pero JavaScript también se puede utilizar en el back-end, o servidor, para construir aplicaciones web completas.", "Hoy en día, una de las formas populares para construir aplicaciones es a través de microservicios, que son pequeñas aplicaciones modulares que trabajan juntas para formar una aplicación más grande.", - "En la Certificación Desarrollo de Back End y APIs, aprenderás cómo escribir aplicaciones de back-end con Node.js y npm (Node Package Manager). También construirás aplicaciones web con el framework Express, y un microservicio \"People Finder\" con MongoDB y la biblioteca Mongoose." + "In the Back End Development and APIs Certification, you'll learn how to write back end apps with Node.js and npm. You'll also build web applications with the Express framework, and build a People Finder microservice with MongoDB and the Mongoose library." ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "Atributo: Código Rosetta" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "Project Euler", "intro": [ diff --git a/client/i18n/locales/espanol/translations.json b/client/i18n/locales/espanol/translations.json index 7d706029cd4..121d851d193 100644 --- a/client/i18n/locales/espanol/translations.json +++ b/client/i18n/locales/espanol/translations.json @@ -11,6 +11,7 @@ "view": "Ver", "view-code": "Mostrar Código", "view-project": "Mostrar Proyecto", + "view-cert-title": "View {{certTitle}}", "show-cert": "Mostrar certificación", "claim-cert": "Solicitar certificación", "save-progress": "Guardar progreso", @@ -52,7 +53,7 @@ "check-code": "Comprueba tu código (Ctrl + Enter)", "check-code-2": "Comprueba tu código", "reset": "Restablecer", - "reset-code": "Restablecer todo el código", + "reset-step": "Reset This Step", "help": "Ayuda", "get-help": "Obtener ayuda", "watch-video": "Ver un Video", @@ -157,7 +158,8 @@ "honesty": "Política de Honestidad Académica", "internet": "Tu presencia en Internet", "portfolio": "Ajustes de portafolio", - "privacy": "Ajustes de privacidad" + "privacy": "Ajustes de privacidad", + "personal-info": "Personal Information" }, "danger": { "heading": "Zona de peligro", @@ -272,6 +274,7 @@ "add-subtitles": "Ayudar a mejorar o agregar subtítulos", "wrong-answer": "Lo siento, esa no es la respuesta correcta. ¡Vuelve a intentarlo!", "check-answer": "Haz clic en el botón de abajo para verificar tu respuesta.", + "assignment-not-complete": "Please finish the assignments", "solution-link": "Enlace a la solución", "github-link": "Enlace de GitHub", "submit-and-go": "Enviar y pasar a mi siguiente desafío", @@ -339,6 +342,7 @@ "title": "Support our charity", "processing": "Estamos procesando tu donación.", "redirecting": "Redirigiendo...", + "thanks": "Thanks for donating", "thank-you": "Gracias por tu apoyo.", "additional": "Puede hacer una donación adicional única de cualquier monto utilizando este enlace: <0>{{url}}", "help-more": "Ayúdanos a hacer más", @@ -462,7 +466,8 @@ "iframe-preview": "{{title}} Vista previa", "iframe-alert": "¡Normalmente este link te llevaría a otro sitio web! Funciona. Este es un enlace a: {{externalLink}}", "iframe-form-submit-alert": "¡Normalmente, se enviaría este formulario! Funciona. Esto se enviará a: {{externalLink}}", - "document-notfound": "documento no encontrado" + "document-notfound": "documento no encontrado", + "slow-load-msg": "Looks like this is taking longer than usual, please try refreshing the page." }, "icons": { "gold-cup": "Copa de Oro", @@ -507,7 +512,8 @@ "step": "Paso", "steps": "Pasos", "steps-for": "Pasos para {{blockTitle}}", - "code-example": "ejemplo de código de {{codeName}}" + "code-example": "ejemplo de código de {{codeName}}", + "opens-new-window": "Opens in new window" }, "flash": { "honest-first": "Para reclamar una certificación, primero debes aceptar nuestra política de honestidad académica.", diff --git a/client/i18n/locales/german/intro.json b/client/i18n/locales/german/intro.json index c7337e2d451..2c100257f3b 100644 --- a/client/i18n/locales/german/intro.json +++ b/client/i18n/locales/german/intro.json @@ -553,7 +553,7 @@ "intro": [ "Bis zu diesem Punkt hast du JavaScript nur im Front-End verwendet, um einer Seite Interaktivität hinzuzufügen, Aufgaben mit Algorithmen zu lösen oder eine SPA zu bauen. Aber JavaScript kann auch im Back-End, also auf dem Server, verwendet werden, um ganze Webanwendungen zu erstellen.", "Heutzutage ist eine der beliebtesten Arten, Anwendungen zu erstellen, Microservices. Das sind kleine, modulare Anwendungen, die zusammenarbeiten und ein größeres Ganzes bilden.", - "In der Zertifizierung für Back-End-Entwicklung und APIs lernst du, wie du Back-End-Apps mit Node.js und npm (Node Package Manager) schreibst. Du wirst auch Webanwendungen mit dem Express-Framework erstellen und einen Personensuche-Microservice mit MongoDB und der Mongoose-Bibliothek bauen." + "In the Back End Development and APIs Certification, you'll learn how to write back end apps with Node.js and npm. You'll also build web applications with the Express framework, and build a People Finder microservice with MongoDB and the Mongoose library." ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "Attribut: Rosetta Code" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "Projekt Euler", "intro": [ diff --git a/client/i18n/locales/german/translations.json b/client/i18n/locales/german/translations.json index fc9518f3983..cb6f8aa2da9 100644 --- a/client/i18n/locales/german/translations.json +++ b/client/i18n/locales/german/translations.json @@ -11,6 +11,7 @@ "view": "Anzeigen", "view-code": "Code anschauen", "view-project": "Projekt anschauen", + "view-cert-title": "View {{certTitle}}", "show-cert": "Zertifikat anzeigen", "claim-cert": "Zertifizierung anfordern", "save-progress": "Fortschritt speichern", @@ -52,7 +53,7 @@ "check-code": "Überprüfe deinen Code (Strg + Enter)", "check-code-2": "Prüfe deinen Code", "reset": "Zurücksetzen", - "reset-code": "Den Quellcode zurücksetzen", + "reset-step": "Reset This Step", "help": "Hilfe", "get-help": "Hilfe bekommen", "watch-video": "Ein Video ansehen", @@ -157,7 +158,8 @@ "honesty": "Akademischer Ehrlichkeitskodex", "internet": "Dein Internetauftritt", "portfolio": "Portfolio-Einstellungen", - "privacy": "Privatsphäre-Einstellungen" + "privacy": "Privatsphäre-Einstellungen", + "personal-info": "Personal Information" }, "danger": { "heading": "Gefahrenzone", @@ -272,6 +274,7 @@ "add-subtitles": "Hilf mit Untertitel hinzuzufügen oder zu verbessern", "wrong-answer": "Sorry, das ist nicht die richtige Antwort. Möchtest du noch einen Anlauf wagen?", "check-answer": "Klick unten auf den Button, um deine Antwort zu überprüfen.", + "assignment-not-complete": "Please finish the assignments", "solution-link": "Lösungs-Link", "github-link": "GitHub Link", "submit-and-go": "Absenden und zur nächsten Herausforderung gehen", @@ -339,6 +342,7 @@ "title": "Support our charity", "processing": "Wir bearbeiten deine Spende.", "redirecting": "Weiterleiten...", + "thanks": "Thanks for donating", "thank-you": "Vielen Dank für deine Unterstützung.", "additional": "Du kannst eine zusätzliche einmalige Spende in beliebiger Höhe über diesen Link tätigen: <0>{{url}}", "help-more": "Hilf uns, mehr zu tun", @@ -462,7 +466,8 @@ "iframe-preview": "{{title}} Vorschau", "iframe-alert": "Normalerweise würde dieser Link dich auf eine andere Website führen! Er funktioniert. Dies ist ein Link zu: {{externalLink}}", "iframe-form-submit-alert": "Normalerweise würde dieses Formular übermittelt werden! Es funktioniert. Dies wird übermittelt an: {{externalLink}}", - "document-notfound": "Dokument wurde nicht gefunden" + "document-notfound": "Dokument wurde nicht gefunden", + "slow-load-msg": "Looks like this is taking longer than usual, please try refreshing the page." }, "icons": { "gold-cup": "Goldpokal", @@ -507,7 +512,8 @@ "step": "Schritt", "steps": "Schritte", "steps-for": "Schritte für {{blockTitle}}", - "code-example": "{{codeName}} code example" + "code-example": "{{codeName}} code example", + "opens-new-window": "Opens in new window" }, "flash": { "honest-first": "Um eine Zertifizierung zu erlangen, musst du zunächst unsere Richtlinie zur akademischen Ehrlichkeit akzeptieren", diff --git a/client/i18n/locales/italian/intro.json b/client/i18n/locales/italian/intro.json index 8145eb32773..ea8ec10c6ef 100644 --- a/client/i18n/locales/italian/intro.json +++ b/client/i18n/locales/italian/intro.json @@ -553,7 +553,7 @@ "intro": [ "Fino a questo punto, hai usato solo JavaScript sul front-end per aggiungere interattività a una pagina, risolvere sfide algoritmiche o costruire una Single Page Application. Ma JavaScript può essere utilizzato anche nel backend (cioè lato server), per costruire intere applicazioni web.", "Oggi, uno dei modi più popolari per costruire applicazioni è attraverso i microservizi, che sono piccole applicazioni modulari che lavorano insieme per formare qualcosa di più grande.", - "Nella Certificazione Sviluppo Back End e API, imparerai a scrivere app per il backend con Node.js e npm (Node Package Manager). Costruirai anche applicazioni web con il framework Express, e costruirai un microservizio Trova Persone con MongoDB e la libreria Mongoose." + "Nella Certificazione Sviluppo Back End e API, imparerai a scrivere app per il backend con Node.js e npm. Costruirai anche applicazioni web con il framework Express, e costruirai un microservizio Trova Persone con MongoDB e la libreria Mongoose." ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "Fonte: Codice Rosetta" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "Progetto Eulero", "intro": [ diff --git a/client/i18n/locales/italian/translations.json b/client/i18n/locales/italian/translations.json index 3a5a9a7bbcb..1ef85aff2f3 100644 --- a/client/i18n/locales/italian/translations.json +++ b/client/i18n/locales/italian/translations.json @@ -11,6 +11,7 @@ "view": "Visualizza", "view-code": "Visualizza il Codice", "view-project": "Visualizza il Progetto", + "view-cert-title": "Visualizza {{certTitle}}", "show-cert": "Mostra la Certificazione", "claim-cert": "Richiedi la Certificazione", "save-progress": "Salva l'avanzamento", @@ -52,7 +53,7 @@ "check-code": "Verifica il tuo codice (Ctrl + Invio)", "check-code-2": "Verifica il tuo codice", "reset": "Resetta", - "reset-code": "Resetta tutto il codice", + "reset-step": "Resetta questo step", "help": "Guida", "get-help": "Ottieni Aiuto", "watch-video": "Guarda un video", @@ -80,7 +81,7 @@ "big-heading-1": "Impara a programmare — gratis.", "big-heading-2": "Costruisci progetti.", "big-heading-3": "Ottieni certificazioni.", - "h2-heading": "Dal 2014, più di 40.000 laureati di freeCodeCamp.org hanno ottenuto posti di lavoro presso aziende tecnologiche, tra cui:", + "h2-heading": "Dal 2014, più di 40.000 studenti di freeCodeCamp.org hanno ottenuto posti di lavoro presso aziende tecnologiche, tra cui:", "hero-img-description": "Studenti di un gruppo di studio locale di freeCodeCamp in Corea del Sud.", "as-seen-in": "Hanno parlato di noi:", "testimonials": { @@ -157,7 +158,8 @@ "honesty": "Politica di Onestà Accademica", "internet": "La Tua presenza su Internet", "portfolio": "Impostazioni Portfolio", - "privacy": "Impostazioni Privacy" + "privacy": "Impostazioni Privacy", + "personal-info": "Personal Information" }, "danger": { "heading": "Zona di Pericolo", @@ -272,6 +274,7 @@ "add-subtitles": "Aiuta a migliorare o aggiungi sottotitoli", "wrong-answer": "Siamo spiacenti, non è la risposta giusta. Vuoi riprovare?", "check-answer": "Fai clic sul pulsante qui sotto per controllare la tua risposta.", + "assignment-not-complete": "Please finish the assignments", "solution-link": "Link alla soluzione", "github-link": "Link GitHub", "submit-and-go": "Invia e vai alla prossima sfida", @@ -339,6 +342,7 @@ "title": "Supporta il nostro ente", "processing": "Stiamo elaborando la tua donazione.", "redirecting": "Reindirizzamento...", + "thanks": "Grazie per la donazione", "thank-you": "Grazie per essere un sostenitore.", "additional": "Puoi effettuare una donazione una tantum aggiuntiva di qualsiasi importo utilizzando questo link: <0>{{url}}", "help-more": "Aiutaci a fare di più", @@ -462,7 +466,8 @@ "iframe-preview": "Anteprima {{title}}", "iframe-alert": "Solitamente questo link ti porterebbe su un altro sito web! Funziona. Questo è un link per {{externalLink}}", "iframe-form-submit-alert": "Normalmente questo modulo sarebbe stato inviato! Funziona. Sarà inviato a: {{externalLink}}", - "document-notfound": "documento non trovato" + "document-notfound": "documento non trovato", + "slow-load-msg": "Sembra che sia necessario più tempo del solito, per favore prova ad aggiornare la pagina." }, "icons": { "gold-cup": "Coppa d'Oro", @@ -507,7 +512,8 @@ "step": "Step", "steps": "Step", "steps-for": "Step per {{blockTitle}}", - "code-example": "{{codeName}} esempio di codice" + "code-example": "{{codeName}} esempio di codice", + "opens-new-window": "Apri in una nuova finestra" }, "flash": { "honest-first": "Per richiedere una certificazione, è necessario prima accettare la nostra politica di onestà accademica", diff --git a/client/i18n/locales/japanese/intro.json b/client/i18n/locales/japanese/intro.json index 3331222240a..1238c190923 100644 --- a/client/i18n/locales/japanese/intro.json +++ b/client/i18n/locales/japanese/intro.json @@ -553,7 +553,7 @@ "intro": [ "ここまでは、JavaScript をフロントエンドで使用して、ページに対話性を加えたり、アルゴリズムチャレンジを解決したり、SPA を構築したりしてきました。しかし JavaScript は、バックエンド (サーバー) でも使用でき、ウェブアプリケーション全体を構築することができます。", "現在、アプリケーションを構築する一般的な方法の一つはマイクロサービスを使用する方法です。これは、小さなモジュール式のアプリケーションを組み合わせて、より大きな全体を形成する方法です。", - "バックエンド開発と API 認定講座では、Node.js と npm (Node Package Manager) を使用してバックエンドアプリを記述する方法を学習します。また、Express フレームワークでウェブアプリケーションを構築し、そして MongoDB と Mongoose ライブラリで People Finder マイクロサービスを構築します。" + "バックエンド開発と API 認定講座では、Node.js と npm を使用してバックエンドアプリを記述する方法を学習します。Express フレームワークでウェブアプリケーションを構築し、MongoDB と Mongoose ライブラリで People Finder マイクロサービスを構築します。" ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "作: Rosetta Code" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "プロジェクト・オイラー", "intro": [ diff --git a/client/i18n/locales/japanese/translations.json b/client/i18n/locales/japanese/translations.json index 00b9053b9c4..6564dca5525 100644 --- a/client/i18n/locales/japanese/translations.json +++ b/client/i18n/locales/japanese/translations.json @@ -11,6 +11,7 @@ "view": "表示", "view-code": "コードを表示", "view-project": "プロジェクトを表示", + "view-cert-title": "{{certTitle}}を表示", "show-cert": "認定証を表示", "claim-cert": "認定証を取得", "save-progress": "進行状況を保存", @@ -52,7 +53,7 @@ "check-code": "コードをチェック (Ctrl + Enter)", "check-code-2": "コードをチェック", "reset": "リセット", - "reset-code": "全てのコードをリセット", + "reset-step": "Reset This Step", "help": "ヘルプ", "get-help": "助けを求める", "watch-video": "動画を見る", @@ -157,7 +158,8 @@ "honesty": "学問的誠実性ポリシー", "internet": "他サービスのリンク", "portfolio": "ポートフォリオ設定", - "privacy": "プライバシー設定" + "privacy": "プライバシー設定", + "personal-info": "Personal Information" }, "danger": { "heading": "危険な操作", @@ -272,6 +274,7 @@ "add-subtitles": "字幕の改善や追加を支援する", "wrong-answer": "残念、正しい答えではありません。もう一度挑戦してみましょう。", "check-answer": "以下のボタンをクリックして解答を確認してください。", + "assignment-not-complete": "Please finish the assignments", "solution-link": "回答のリンク", "github-link": "GitHub のリンク", "submit-and-go": "提出して次のチャレンジに進む", @@ -339,6 +342,7 @@ "title": "当団体への支援", "processing": "いただいた寄付を処理中です。", "redirecting": "リダイレクト中...", + "thanks": "寄付ありがとうございます", "thank-you": "サポーターとなってくださり、ありがとうございます。", "additional": "任意の金額を、追加で 1 回ずつご寄付いただけるリンクはこちら: <0>{{url}}", "help-more": "私たちのさらなる活動をご支援ください", @@ -375,8 +379,8 @@ "need-help": "現在または過去の寄付についてお困りでしょうか?", "forward-receipt": "寄付の領収書のコピーを添えて、お問い合わせ内容を donors@freecodecamp.org までお送りください。", "efficiency": "freeCodeCamp は非常に効率的な、教育分野の慈善団体です。", - "why-donate-1": "freeCodeCamp にご寄付いただくことにより、新しい技能を学習して家族を支えようとしている人々を助けることに繋がります。", - "why-donate-2": "また、あなた自身の技術スキルを高めるための、学習リソースの作成を支援することにもなります。", + "why-donate-1": "freeCodeCamp への寄付を通して、新しい技能を習得して家計を支えようと努力している人々を支援できます。", + "why-donate-2": "また、あなた自身の技術スキルを高める学習リソースの作成を支援することにもなります。", "bigger-donation": "より多くの金額による一回の寄付や、小切手の送付、または他の方法をお考えでしょうか?", "other-ways": "<0>当団体の使命を支援する方法 は他にも多数ございます。", "failed-pay": "処理が完了しませんでした。再度お試しください。", @@ -462,7 +466,8 @@ "iframe-preview": "{{title}} のプレビュー", "iframe-alert": "このリンクは通常の環境では他のウェブサイトを開きます。正しく動作しています。これは {{externalLink}} へのリンクです。", "iframe-form-submit-alert": "通常はこれでフォームが送信されます。正しく動作しています。フォームは {{externalLink}} へ送信されます。", - "document-notfound": "ドキュメントが見つかりませんでした" + "document-notfound": "ドキュメントが見つかりませんでした", + "slow-load-msg": "通常より処理に時間がかかっているようです。ページの再読み込みをお試しください。" }, "icons": { "gold-cup": "ゴールドカップ", @@ -477,7 +482,7 @@ "hint": "ヒント", "heart": "ハート", "initial": "初期状態", - "input-reset": "Clear search terms", + "input-reset": "検索キーワードをクリア", "info": "導入情報", "spacer": "スペーサー", "toggle": "トグルチェックマーク", @@ -507,7 +512,8 @@ "step": "ステップ", "steps": "ステップ一覧", "steps-for": "「{{blockTitle}}」のステップ一覧", - "code-example": "{{codeName}} のコード例" + "code-example": "{{codeName}} のコード例", + "opens-new-window": "新しいウィンドウで開く" }, "flash": { "honest-first": "認定証を請求するには、まず学問的誠実性ポリシーに同意する必要があります。", @@ -708,7 +714,7 @@ "Legacy Back End": "(レガシー) バックエンド", "legacy-back-end": "バックエンド認定証", "Legacy Data Visualization": "(レガシー) データ可視化", - "legacy-data-visualization": "Data Visualization Certification", + "legacy-data-visualization": "データ可視化認定証", "Legacy Information Security and Quality Assurance": "(レガシー) 情報セキュリティと品質保証認定証", "information-security-and-quality-assurance": "情報セキュリティと品質保証認定証", "Legacy Full Stack Certification": "(レガシー) フルスタック認定証", @@ -769,7 +775,7 @@ }, "signout": { "heading": "アカウントからサインアウト", - "p1": "注意: サインアウト後は進行状況が保存されません。", + "p1": "注意: サインアウト状態では進行状況が保存されません。", "p2": "この操作では、このデバイスおよびブラウザーセッションのみを対象にサインアウトされます。サインアウトしてよろしいですか?", "certain": "はい、サインアウトします", "nevermind": "いいえ、サインアウトしません" diff --git a/client/i18n/locales/portuguese/intro.json b/client/i18n/locales/portuguese/intro.json index e6e28507998..f0e6bc8c734 100644 --- a/client/i18n/locales/portuguese/intro.json +++ b/client/i18n/locales/portuguese/intro.json @@ -553,7 +553,7 @@ "intro": [ "Até esse ponto, você usou JavaScript apenas no front-end para adicionar interatividade a uma página, resolver desafios de algoritmos ou construir uma SPA. Mas o JavaScript também pode ser usado no back-end, ou servidor, para construir aplicações web inteiras.", "Hoje em dia, uma das formas populares de se criar aplicações é através do uso de microsserviços, que são pequenas aplicações modulares que trabalham em conjunto para formar uma aplicação maior inteira.", - "Na certificação de APIs e desenvolvimento de back-end, você aprenderá a escrever aplicações de back-end com o Node.js e o npm (Node Package Manager). Você também vai construir aplicações web com o framework Express e criará um microsserviço de localização de pessoas com o MongoDB e com a biblioteca Mongoose." + "Na certificação de APIs e desenvolvimento de back-end, você aprenderá a escrever aplicações de back-end com o Node.js e o npm. Você também vai construir aplicações web com o framework Express e criará um microsserviço de localização de pessoas com o MongoDB e com a biblioteca Mongoose." ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "Attribute: Rosetta Code" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "Projeto Euler", "intro": [ diff --git a/client/i18n/locales/portuguese/translations.json b/client/i18n/locales/portuguese/translations.json index debb22e2fb3..6ab7599a83c 100644 --- a/client/i18n/locales/portuguese/translations.json +++ b/client/i18n/locales/portuguese/translations.json @@ -11,6 +11,7 @@ "view": "Visualizar", "view-code": "Ver código", "view-project": "Ver o projeto", + "view-cert-title": "Ver {{certTitle}}", "show-cert": "Exibir certificado", "claim-cert": "Solicitar certificação", "save-progress": "Salvar progresso", @@ -52,7 +53,7 @@ "check-code": "Verifique seu código (Ctrl + Enter)", "check-code-2": "Verifique seu código", "reset": "Redefinir", - "reset-code": "Redefinir todo o código", + "reset-step": "Reiniciar este passo", "help": "Ajuda", "get-help": "Obter ajuda", "watch-video": "Assistir a um vídeo", @@ -157,7 +158,8 @@ "honesty": "Política de honestidade acadêmica", "internet": "Sua presença na internet", "portfolio": "Configurações do portfólio", - "privacy": "Configurações de privacidade" + "privacy": "Configurações de privacidade", + "personal-info": "Personal Information" }, "danger": { "heading": "Zona de perigo", @@ -272,6 +274,7 @@ "add-subtitles": "Ajudar a melhorar ou adicionar legendas", "wrong-answer": "Desculpe, essa não é a resposta correta. Quer tentar novamente?", "check-answer": "Clique no botão abaixo para verificar sua resposta.", + "assignment-not-complete": "Please finish the assignments", "solution-link": "Link da solução", "github-link": "Link do GitHub", "submit-and-go": "Enviar e ir para o meu próximo desafio", @@ -339,6 +342,7 @@ "title": "Ajude nossa instituição", "processing": "Estamos processando a sua doação.", "redirecting": "Redirecionando...", + "thanks": "Agradecemos por sua doação", "thank-you": "Obrigado pelo seu apoio.", "additional": "Você pode fazer uma doação adicional de qualquer valor usando este link: <0>{{url}}", "help-more": "Ajude-nos a fazer mais", @@ -462,7 +466,8 @@ "iframe-preview": "Visualização de {{title}}", "iframe-alert": "Normalmente, este link levaria você para outro site da web! Funciona. Esse é um link para: {{externalLink}}", "iframe-form-submit-alert": "Normalmente, esse formulário seria enviado! Funciona. Ele será enviado para: {{externalLink}}", - "document-notfound": "documento não encontrado" + "document-notfound": "documento não encontrado", + "slow-load-msg": "Parece que está demorando mais do que o normal. Tente atualizar a página." }, "icons": { "gold-cup": "Taça de ouro", @@ -507,7 +512,8 @@ "step": "Passo", "steps": "Passos", "steps-for": "Passos para {{blockTitle}}", - "code-example": "Exemplo de código de {{codeName}}" + "code-example": "Exemplo de código de {{codeName}}", + "opens-new-window": "Abre em uma nova janela" }, "flash": { "honest-first": "Para solicitar uma certificação, você precisa primeiro aceitar nossa política de honestidade acadêmica", diff --git a/client/i18n/locales/ukrainian/intro.json b/client/i18n/locales/ukrainian/intro.json index b725c1a96c7..8dfc2308bb9 100644 --- a/client/i18n/locales/ukrainian/intro.json +++ b/client/i18n/locales/ukrainian/intro.json @@ -553,7 +553,7 @@ "intro": [ "До цього моменту ви використовували JavaScript тільки для фронтенду, аби зробити вебсторінку інтерактивнішою, розв'язати завдання з алгоритмами, або створити SPA. Але JavaScript можна використовувати й в бекенд, або на сервері, для створення цілих вебзастосунків.", "Сьогодні один із найпопулярніших способів створення застосунків – за допомогою мікросервісів, маленьких модульних застосунків, які разом формують єдине ціле.", - "У сертифікації «Розробка Back End та API» ви навчитеся писати бекенд програми за допомогою Node.js та npm (Node Package Manager). Також, ви створите вебзастосунок за допомогою фреймворку Express та мікросервіс для пошуку людей за допомогою MongoDB і Mongoose library." + "У сертифікації «Розробка Back End та API» ви навчитеся писати бекенд програми за допомогою Node.js та npm. Ви також створите вебзастосунок за допомогою фреймворку Express та мікросервіс для пошуку людей за допомогою MongoDB і бібліотеки Mongoose." ], "note": "", "blocks": { @@ -778,6 +778,10 @@ "Атрибут: Rosetta Code" ] }, + "the-odin-project": { + "title": "The Odin Project", + "intro": ["A description is to be determined"] + }, "project-euler": { "title": "Проєкт «Ейлер»", "intro": [ diff --git a/client/i18n/locales/ukrainian/translations.json b/client/i18n/locales/ukrainian/translations.json index 2b906fac215..a6a44d0b8f4 100644 --- a/client/i18n/locales/ukrainian/translations.json +++ b/client/i18n/locales/ukrainian/translations.json @@ -11,6 +11,7 @@ "view": "Перегляд", "view-code": "Переглянути код", "view-project": "Переглянути проєкт", + "view-cert-title": "Переглянути {{certTitle}}", "show-cert": "Показати сертифікацію", "claim-cert": "Отримати сертифікацію", "save-progress": "Зберегти прогрес", @@ -52,7 +53,7 @@ "check-code": "Перевірити код (Ctrl + Enter)", "check-code-2": "Перевірити код", "reset": "Скинути", - "reset-code": "Скинути весь код", + "reset-step": "Скинути цей крок", "help": "Допомога", "get-help": "Отримати допомогу", "watch-video": "Подивитися відео", @@ -157,7 +158,8 @@ "honesty": "Політика академічної доброчесності", "internet": "Ваші соціальні мережі", "portfolio": "Налаштування портфоліо", - "privacy": "Налаштування конфіденційності" + "privacy": "Налаштування конфіденційності", + "personal-info": "Personal Information" }, "danger": { "heading": "Небезпечна зона", @@ -272,6 +274,7 @@ "add-subtitles": "Допомогти покращити або додати субтитри", "wrong-answer": "Нам шкода, але це неправильна відповідь. Спробуєте ще раз?", "check-answer": "Натисніть кнопку нижче, щоб перевірити свою відповідь.", + "assignment-not-complete": "Please finish the assignments", "solution-link": "Посилання на рішення", "github-link": "Посилання на GitHub", "submit-and-go": "Відправити та перейти до мого наступного завдання", @@ -339,6 +342,7 @@ "title": "Підтримайте нашу організацію", "processing": "Ми опрацьовуємо ваш внесок.", "redirecting": "Переадресація...", + "thanks": "Дякуємо за внесок", "thank-you": "Дякуємо за вашу підтримку.", "additional": "Ви можете зробити додатковий одноразовий внесок на будь-яку суму за цим посиланням: <0>{{url}}", "help-more": "Допоможіть нам розвиватися", @@ -462,7 +466,8 @@ "iframe-preview": "Передперегляд {{title}}", "iframe-alert": "Зазвичай це посилання перенесло б вас на інший вебсайт! Воно працює. Це посилання на: {{externalLink}}", "iframe-form-submit-alert": "Зазвичай ця форма буде відправлена! Вона буде відправлена на: {{externalLink}}", - "document-notfound": "документ не знайдено" + "document-notfound": "документ не знайдено", + "slow-load-msg": "Схоже, це займає більше часу, ніж зазвичай. Будь ласка, спробуйте оновити сторінку." }, "icons": { "gold-cup": "Золотий кубок", @@ -507,7 +512,8 @@ "step": "Крок", "steps": "Кроки", "steps-for": "Кроки для {{blockTitle}}", - "code-example": "Приклад коду {{codeName}}" + "code-example": "Приклад коду {{codeName}}", + "opens-new-window": "Відкривається у новому вікні" }, "flash": { "honest-first": "Щоб отримати сертифікацію, ви повинні спочатку прийняти нашу політику академічної доброчесності", diff --git a/client/package.json b/client/package.json index 70667dc73e3..59974c2b79b 100644 --- a/client/package.json +++ b/client/package.json @@ -38,7 +38,7 @@ "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.20.2", "@babel/preset-react": "7.18.6", - "@babel/standalone": "7.20.11", + "@babel/standalone": "7.20.12", "@fortawesome/fontawesome-svg-core": "6.2.1", "@fortawesome/free-brands-svg-icons": "6.2.1", "@fortawesome/free-solid-svg-icons": "6.2.1", @@ -52,7 +52,7 @@ "@loadable/component": "5.15.2", "@reach/router": "1.3.4", "@sentry/gatsby": "6.19.7", - "@stripe/react-stripe-js": "1.16.1", + "@stripe/react-stripe-js": "1.16.3", "@stripe/stripe-js": "1.46.0", "@types/react-scrollable-anchor": "0.6.1", "algoliasearch": "4.14.3", @@ -67,9 +67,10 @@ "date-fns": "2.27.0", "enzyme": "3.11.0", "enzyme-adapter-react-16": "1.15.7", - "final-form": "4.20.7", + "final-form": "4.20.8", "gatsby": "3.15.0", "gatsby-cli": "3.15.0", + "gatsby-link": "3.15.0", "gatsby-plugin-advanced-sitemap": "2.1.0", "gatsby-plugin-create-client-paths": "3.15.0", "gatsby-plugin-manifest": "3.15.0", @@ -87,7 +88,7 @@ "nanoid": "3.3.4", "normalize-url": "4.5.1", "path-browserify": "1.0.1", - "postcss": "8.4.20", + "postcss": "8.4.21", "prismjs": "1.29.0", "process": "0.11.10", "prop-types": "15.8.1", @@ -96,11 +97,12 @@ "react": "16.14.0", "react-dom": "16.14.0", "react-final-form": "6.5.9", - "react-ga": "3.3.1", + "react-gtm-module": "2.0.11", "react-helmet": "6.1.0", "react-hotkeys": "2.0.0", "react-i18next": "11.18.6", - "react-instantsearch-dom": "6.38.1", + "react-instantsearch-core": "6.38.3", + "react-instantsearch-dom": "6.38.3", "react-lazy-load": "3.1.14", "react-monaco-editor": "0.40.0", "react-redux": "5.1.2", @@ -131,10 +133,11 @@ }, "devDependencies": { "@babel/types": "7.20.7", - "@codesee/babel-plugin-instrument": "0.470.0", - "@codesee/tracker": "0.470.0", + "@codesee/babel-plugin-instrument": "0.479.0", + "@codesee/tracker": "0.479.0", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "12.1.5", + "@types/react-gtm-module": "2.0.1", "autoprefixer": "10.4.13", "babel-plugin-transform-imports": "2.0.0", "chokidar": "3.5.3", diff --git a/client/src/analytics/index.ts b/client/src/analytics/index.ts new file mode 100644 index 00000000000..32a21405122 --- /dev/null +++ b/client/src/analytics/index.ts @@ -0,0 +1,25 @@ +import TagManager from 'react-gtm-module'; + +import { + devAnalyticsId, + prodAnalyticsId, + prodAnalyticsESId +} from '../../../config/analytics-settings'; + +import envData from '../../../config/env.json'; + +const { deploymentEnv, clientLocale } = envData; + +const analyticsIDSelector = () => { + if (deploymentEnv === 'staging') return devAnalyticsId; + else if (clientLocale === 'espanol') return prodAnalyticsESId; + else return prodAnalyticsId; +}; + +const gtmId = analyticsIDSelector(); + +if (typeof document !== `undefined`) { + TagManager.initialize({ gtmId }); +} + +export default TagManager; diff --git a/client/src/analytics/index.tsx b/client/src/analytics/index.tsx deleted file mode 100644 index 79791770228..00000000000 --- a/client/src/analytics/index.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import ReactGA from 'react-ga'; -import { - devAnalyticsId, - prodAnalyticsId -} from '../../../config/analytics-settings'; -import envData from '../../../config/env.json'; - -const { deploymentEnv } = envData; - -const analyticsId = - deploymentEnv === 'staging' ? devAnalyticsId : prodAnalyticsId; - -ReactGA.initialize(analyticsId); - -export default ReactGA; diff --git a/client/src/client-only-routes/show-certification.tsx b/client/src/client-only-routes/show-certification.tsx index eeaeebbea55..6ac89c242ed 100644 --- a/client/src/client-only-routes/show-certification.tsx +++ b/client/src/client-only-routes/show-certification.tsx @@ -155,12 +155,8 @@ const ShowCertification = (props: ShowCertificationProps): JSX.Element => { ) { setIsDonationDisplayed(true); executeGA({ - type: 'event', - data: { - category: 'Donation View', - action: 'Displayed Certificate Donation', - nonInteraction: true - } + event: 'donationview', + action: 'Displayed Certificate Donation' }); } // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/client/src/client-only-routes/show-project-links.tsx b/client/src/client-only-routes/show-project-links.tsx index 30df99a8843..94d8a603759 100644 --- a/client/src/client-only-routes/show-project-links.tsx +++ b/client/src/client-only-routes/show-project-links.tsx @@ -83,6 +83,7 @@ const ShowProjectLinks = (props: ShowProjectLinksProps): JSX.Element => { string; theme: Themes; updateDonationFormState: (state: DonationApprovalData) => unknown; - isVariantA: boolean; paymentContext: PaymentContext; }; @@ -97,22 +95,19 @@ const mapStateToProps = createSelector( isDonatingSelector, donationFormStateSelector, userSelector, - isVariantASelector, ( showLoading: DonateFormProps['showLoading'], isSignedIn: DonateFormProps['isSignedIn'], isDonating: DonateFormProps['isDonating'], donationFormState: DonateFormState, - { email, theme }: { email: string; theme: Themes }, - isVariantA: boolean + { email, theme }: { email: string; theme: Themes } ) => ({ isSignedIn, isDonating, showLoading, donationFormState, email, - theme, - isVariantA + theme }) ); @@ -280,8 +275,7 @@ class DonateForm extends Component { t, isMinimalForm, isSignedIn, - isDonating, - isVariantA + isDonating } = this.props; const priorityTheme = defaultTheme ? defaultTheme : theme; const isOneTime = donationDuration === 'one-time'; @@ -335,7 +329,6 @@ class DonateForm extends Component { processing={processing} t={t} theme={priorityTheme} - isVariantA={isVariantA} /> )} diff --git a/client/src/components/Donation/donation-modal.tsx b/client/src/components/Donation/donation-modal.tsx index 0b3c97465e4..04d5f2e4efb 100644 --- a/client/src/components/Donation/donation-modal.tsx +++ b/client/src/components/Donation/donation-modal.tsx @@ -66,16 +66,12 @@ function DonateModal({ useEffect(() => { if (show) { void playTone('donation'); - executeGA({ type: 'modal', data: '/donation-modal' }); + executeGA({ event: 'pageview', pagePath: '/donation-modal' }); executeGA({ - type: 'event', - data: { - category: 'Donation View', - action: `Displayed ${ - recentlyClaimedBlock ? 'block' : 'progress' - } donation modal`, - nonInteraction: true - } + event: 'donationview', + action: `Displayed ${ + recentlyClaimedBlock ? 'Block' : 'Progress' + } Donation Modal` }); } }, [show, recentlyClaimedBlock, executeGA]); diff --git a/client/src/components/Donation/donation-text-components.tsx b/client/src/components/Donation/donation-text-components.tsx index 8df1792ca2f..208f989ccfd 100644 --- a/client/src/components/Donation/donation-text-components.tsx +++ b/client/src/components/Donation/donation-text-components.tsx @@ -47,11 +47,13 @@ const FaqItem = ( const [isExpanded, setExpanded] = useState(false); return (
- {isExpanded && ( <> diff --git a/client/src/components/Donation/donation.css b/client/src/components/Donation/donation.css index da4c037fff6..2bb6675f6e1 100644 --- a/client/src/components/Donation/donation.css +++ b/client/src/components/Donation/donation.css @@ -526,6 +526,12 @@ a.patreon-button:hover { margin-inline-start: 0.25em; } +.faq-item h3 { + font-size: 1rem; + line-height: 1.5; + margin: 0; +} + .faq-item div { width: 100%; padding: 10px 15px; diff --git a/client/src/components/Donation/paypal-button.tsx b/client/src/components/Donation/paypal-button.tsx index e6b3167e82f..3e54d4fd119 100644 --- a/client/src/components/Donation/paypal-button.tsx +++ b/client/src/components/Donation/paypal-button.tsx @@ -59,10 +59,7 @@ const { deploymentEnv: 'staging' | 'live'; }; -export class PaypalButton extends Component< - PaypalButtonProps, - PaypalButtonState -> { +class PaypalButton extends Component { static displayName = 'PaypalButton'; state: PaypalButtonState = { amount: defaultDonation.donationAmount, diff --git a/client/src/components/Donation/stripe-card-form.tsx b/client/src/components/Donation/stripe-card-form.tsx index 683c118480a..f10ac62de70 100644 --- a/client/src/components/Donation/stripe-card-form.tsx +++ b/client/src/components/Donation/stripe-card-form.tsx @@ -17,7 +17,6 @@ import { PaymentProvider } from '../../../../config/donation-settings'; import envData from '../../../../config/env.json'; import { Themes } from '../settings/theme'; import { DonationApprovalData, PostPayment } from './types'; -import SecurityLockIcon from './security-lock-icon'; const { stripePublicKey }: { stripePublicKey: string | null } = envData; @@ -27,7 +26,6 @@ interface FormPropTypes { t: (label: string) => string; theme: Themes; processing: boolean; - isVariantA: boolean; } interface Element { @@ -43,8 +41,7 @@ const StripeCardForm = ({ t, onDonationStateChange, postPayment, - processing, - isVariantA + processing }: FormPropTypes): JSX.Element => { const [isSubmissionValid, setSubmissionValidity] = useState(true); const [isTokenizing, setTokenizing] = useState(false); @@ -166,7 +163,6 @@ const StripeCardForm = ({ disabled={!stripe || !elements || isSubmitting} type='submit' > - {!isVariantA && } {t('buttons.donate')} diff --git a/client/src/components/Header/components/nav-links.tsx b/client/src/components/Header/components/nav-links.tsx index dc9bd246338..3de9d1c1063 100644 --- a/client/src/components/Header/components/nav-links.tsx +++ b/client/src/components/Header/components/nav-links.tsx @@ -65,7 +65,7 @@ const mapDispatchToProps = { openSignoutModal }; -export class NavLinks extends Component { +class NavLinks extends Component { static displayName: string; langButtonRef: React.RefObject; firstLangOptionRef: React.RefObject; diff --git a/client/src/components/Header/components/universal-nav.css b/client/src/components/Header/components/universal-nav.css index 709432a5eca..83d8dec691c 100644 --- a/client/src/components/Header/components/universal-nav.css +++ b/client/src/components/Header/components/universal-nav.css @@ -449,9 +449,7 @@ button.nav-link[aria-disabled='true'] { } .universal-nav-right .fcc_searchBar .ais-SearchBox-form { - width: 100vw; max-width: unset; - padding: 0 15px; } /* In mobile layout, prevent search input from hanging around if the @@ -472,12 +470,9 @@ button.nav-link[aria-disabled='true'] { display: none; } -.universal-nav-right .ais-SearchBox-input { +.universal-nav-right .ais-SearchBox-form { width: calc(100vw - 17rem); -} - -.universal-nav-right .ais-SearchBox-reset { - right: 291px; + margin-inline-start: 15px; } .universal-nav-right .fcc_searchBar .ais-Hits { @@ -485,6 +480,9 @@ button.nav-link[aria-disabled='true'] { } .ais-SearchBox-input:focus { + box-sizing: content-box; + margin-inline-start: -30px; + padding-inline: 35px; outline: 3px solid var(--blue-mid); } @@ -523,8 +521,6 @@ button.nav-link[aria-disabled='true'] { } .fcc_searchBar .ais-SearchBox-form { - display: flex; - justify-content: flex-end; max-width: calc(100vw - 350px); } @@ -553,21 +549,13 @@ button.nav-link[aria-disabled='true'] { } .universal-nav-right .fcc_searchBar .ais-SearchBox-form { - width: 100%; + width: calc(100% - 30px); } .display-menu { max-height: calc(100vh - var(--header-height) * 2); } - .universal-nav-right .ais-SearchBox-input { - width: calc(100vw - 30px); - } - - .universal-nav-right .ais-SearchBox-reset { - right: 15px; - } - .universal-nav-right .fcc_searchBar .ais-Hits { width: calc(100% - 30px); } diff --git a/client/src/components/app-mount-notifier.test.tsx b/client/src/components/app-mount-notifier.test.tsx index 78c83e1ba8b..94121daba6c 100644 --- a/client/src/components/app-mount-notifier.test.tsx +++ b/client/src/components/app-mount-notifier.test.tsx @@ -8,7 +8,6 @@ import i18nTestConfig from '../../i18n/config-for-tests'; import { createStore } from '../redux/createStore'; import AppMountNotifier from './app-mount-notifier'; -jest.mock('react-ga'); jest.unmock('react-i18next'); type Language = keyof typeof i18nextCodes; diff --git a/client/src/components/helpers/__snapshots__/loader.test.tsx.snap b/client/src/components/helpers/__snapshots__/loader.test.tsx.snap index 6dab24a5651..d754d42ea67 100644 --- a/client/src/components/helpers/__snapshots__/loader.test.tsx.snap +++ b/client/src/components/helpers/__snapshots__/loader.test.tsx.snap @@ -14,6 +14,12 @@ exports[` matches the fullScreen render snapshot 1`] = `
+
+

+ misc.slow-load-msg +

`; diff --git a/client/src/components/helpers/loader.css b/client/src/components/helpers/loader.css index 5acf705bd85..2182772d777 100644 --- a/client/src/components/helpers/loader.css +++ b/client/src/components/helpers/loader.css @@ -2,8 +2,10 @@ height: 100%; width: 100%; display: flex; + flex-direction: column; justify-content: center; align-items: center; + gap: 1em; } .fcc-loader .sk-spinner, diff --git a/client/src/components/helpers/loader.tsx b/client/src/components/helpers/loader.tsx index 9e5aa9b2aa4..dd265c19e56 100644 --- a/client/src/components/helpers/loader.tsx +++ b/client/src/components/helpers/loader.tsx @@ -1,27 +1,49 @@ import React, { useState, useEffect } from 'react'; +import { useTranslation } from 'react-i18next'; import Spinner from 'react-spinkit'; import './loader.css'; interface LoaderProps { fullScreen?: boolean; - timeout?: number; + loaderDelay?: number; + messageDelay?: number; } -function Loader({ fullScreen, timeout }: LoaderProps): JSX.Element { - const [showSpinner, setShowSpinner] = useState(!timeout); +function Loader({ + fullScreen, + loaderDelay, + messageDelay +}: LoaderProps): JSX.Element { + const { t } = useTranslation(); + + const [showSpinner, setShowSpinner] = useState(!loaderDelay); + const [showMessage, setShowMessage] = useState(!messageDelay); useEffect(() => { - let timerId: ReturnType; - if (!showSpinner) { - timerId = setTimeout(() => setShowSpinner(true), timeout); + if (loaderDelay) { + const timerId = setTimeout(() => setShowSpinner(true), loaderDelay); + return () => clearTimeout(timerId); } - return () => clearTimeout(timerId); - }, [setShowSpinner, showSpinner, timeout]); + }, [loaderDelay]); + + useEffect(() => { + if (messageDelay) { + const timerId = setTimeout(() => setShowMessage(true), messageDelay); + return () => clearTimeout(timerId); + } + }, [messageDelay]); + return (
{showSpinner && } + {showMessage && fullScreen && ( + <> +
+

{t('misc.slow-load-msg')}

+ + )}
); } diff --git a/client/src/components/layouts/certification.tsx b/client/src/components/layouts/certification.tsx index 74e13244146..2469b0c2d77 100644 --- a/client/src/components/layouts/certification.tsx +++ b/client/src/components/layouts/certification.tsx @@ -3,12 +3,11 @@ import Helmet from 'react-helmet'; import { connect } from 'react-redux'; import { createSelector } from 'reselect'; -import { fetchUser, executeGA } from '../../redux/actions'; +import { fetchUser } from '../../redux/actions'; import { isSignedInSelector } from '../../redux/selectors'; interface CertificationProps { children?: React.ReactNode; - executeGA?: (args: { type: string; data: string }) => void; fetchUser: () => void; isSignedIn?: boolean; pathname: string; @@ -18,18 +17,15 @@ const mapStateToProps = createSelector(isSignedInSelector, isSignedIn => ({ isSignedIn })); -const mapDispatchToProps = { fetchUser, executeGA }; +const mapDispatchToProps = { fetchUser }; class CertificationLayout extends Component { static displayName = 'CertificationLayout'; componentDidMount() { - const { isSignedIn, fetchUser, pathname } = this.props; + const { isSignedIn, fetchUser } = this.props; if (!isSignedIn) { fetchUser(); } - if (this.props.executeGA) { - this.props.executeGA({ type: 'page', data: pathname }); - } } render(): JSX.Element { diff --git a/client/src/components/layouts/default.tsx b/client/src/components/layouts/default.tsx index db1d1712575..071611f499d 100644 --- a/client/src/components/layouts/default.tsx +++ b/client/src/components/layouts/default.tsx @@ -1,6 +1,7 @@ import React, { Component, ReactNode } from 'react'; import Helmet from 'react-helmet'; import { TFunction, withTranslation } from 'react-i18next'; +// import TagManager from 'react-gtm-module'; import { connect } from 'react-redux'; import { bindActionCreators, Dispatch } from 'redux'; import { createSelector } from 'reselect'; @@ -16,8 +17,7 @@ import { isBrowser } from '../../../utils'; import { fetchUser, onlineStatusChange, - serverStatusChange, - executeGA + serverStatusChange } from '../../redux/actions'; import { isSignedInSelector, @@ -76,8 +76,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => fetchUser, removeFlashMessage, onlineStatusChange, - serverStatusChange, - executeGA + serverStatusChange }, dispatch ); @@ -105,24 +104,14 @@ class DefaultLayout extends Component { static displayName = 'DefaultLayout'; componentDidMount() { - const { isSignedIn, fetchUser, pathname, executeGA } = this.props; + const { isSignedIn, fetchUser } = this.props; if (!isSignedIn) { fetchUser(); } - executeGA({ type: 'page', data: pathname }); - window.addEventListener('online', this.updateOnlineStatus); window.addEventListener('offline', this.updateOnlineStatus); } - componentDidUpdate(prevProps: DefaultLayoutProps) { - const { pathname, executeGA } = this.props; - const { pathname: prevPathname } = prevProps; - if (pathname !== prevPathname) { - executeGA({ type: 'page', data: pathname }); - } - } - componentWillUnmount() { window.removeEventListener('online', this.updateOnlineStatus); window.removeEventListener('offline', this.updateOnlineStatus); @@ -157,7 +146,7 @@ class DefaultLayout extends Component { const useSystemTheme = fetchState.complete && isSignedIn === false; if (fetchState.pending) { - return ; + return ; } return ( diff --git a/client/src/components/layouts/rtl-layout.css b/client/src/components/layouts/rtl-layout.css index 89d33283e61..5c6d1e82b23 100644 --- a/client/src/components/layouts/rtl-layout.css +++ b/client/src/components/layouts/rtl-layout.css @@ -1,3 +1,11 @@ +/* +Increase the spacing in paragraphs +*/ + +[dir='rtl'] p { + line-height: 2rem; +} + /* breadcrumbs section */ @@ -90,7 +98,7 @@ the "not" and "is" selector is used to stop it from affecting other section and external fontawesome link icon */ -[dir='rtl'] .nav-link > svg, +[dir='rtl'] .nav-link > .fa-up-right-from-square, [dir='rtl'] td a[target='_blank'] > svg { transform: rotate(270deg); } @@ -100,7 +108,7 @@ universal-nav-bar and menu secion */ -@media (min-width: 767.5px) { +@media (min-width: 601px) { [dir='rtl'] .nav-list { right: auto; left: 0; @@ -112,6 +120,16 @@ and menu secion left: inherit; right: 17px; } + + [dir='rtl'] .fcc_searchBar .ais-Hits { + left: auto; + right: 15px; + } + + [dir='rtl'] .universal-nav-right .fcc_searchBar { + left: auto; + right: 0; + } } /* had to change overflow, because it clips the first words of the english articles */ diff --git a/client/src/components/profile/components/certifications.tsx b/client/src/components/profile/components/certifications.tsx index 1ce96539054..2f92efa0404 100644 --- a/client/src/components/profile/components/certifications.tsx +++ b/client/src/components/profile/components/certifications.tsx @@ -55,7 +55,9 @@ function CertButton({ username, cert }: CertButtonProps): JSX.Element { to={`/certification/${username}/${cert.certSlug}`} data-cy='claimed-certification' > - View {t(`certification.title.${cert.certSlug}`)} + {t('buttons.view-cert-title', { + certTitle: t(`certification.title.${cert.certSlug}`) + })} diff --git a/client/src/components/profile/components/time-line.test.tsx b/client/src/components/profile/components/time-line.test.tsx index 6256c9e7314..5d0dd9a1da1 100644 --- a/client/src/components/profile/components/time-line.test.tsx +++ b/client/src/components/profile/components/time-line.test.tsx @@ -7,7 +7,6 @@ import { render, screen } from '../../../../utils/test-utils'; import { createStore } from '../../../redux/createStore'; import TimeLine from './time-line'; -jest.mock('react-ga'); const store = createStore(); beforeEach(() => { @@ -57,7 +56,9 @@ describe('', () => { it('Render button when only solution is present', () => { // @ts-expect-error render(, store); - const showViewButton = screen.getByRole('link', { name: 'buttons.view' }); + const showViewButton = screen.getByRole('link', { + name: 'buttons.view settings.labels.solution-for (aria.opens-new-window)' + }); expect(showViewButton).toHaveAttribute( 'href', 'https://github.com/freeCodeCamp/freeCodeCamp' @@ -84,7 +85,9 @@ describe('', () => { // @ts-expect-error render(, store); - const viewButtons = screen.getAllByRole('button', { name: 'buttons.view' }); + const viewButtons = screen.getAllByRole('button', { + name: 'buttons.view settings.labels.solution-for' + }); viewButtons.forEach(button => { expect(button).toBeInTheDocument(); }); diff --git a/client/src/components/profile/components/time-line.tsx b/client/src/components/profile/components/time-line.tsx index 9dcdb48934b..b9c19a0d426 100644 --- a/client/src/components/profile/components/time-line.tsx +++ b/client/src/components/profile/components/time-line.tsx @@ -103,12 +103,15 @@ function TimelineInner({ function renderViewButton( completedChallenge: CompletedChallenge ): React.ReactNode { + const { id } = completedChallenge; + const projectTitle = idToNameMap.get(id)?.challengeTitle || ''; return ( viewSolution(completedChallenge)} showProjectPreview={() => viewProject(completedChallenge)} - displayContext={'timeline'} + displayContext='timeline' > ); } diff --git a/client/src/components/search/searchBar/searchbar-base.css b/client/src/components/search/searchBar/searchbar-base.css index 55d00a90b47..cda535b090c 100644 --- a/client/src/components/search/searchBar/searchbar-base.css +++ b/client/src/components/search/searchBar/searchbar-base.css @@ -614,7 +614,6 @@ a[class^='ais-'] { } .ais-SearchBox-submit, .ais-SearchBox-reset { - position: absolute; -webkit-appearance: none; -moz-appearance: none; appearance: none; @@ -623,15 +622,7 @@ a[class^='ais-'] { height: 20px; } .ais-SearchBox-reset { - right: 0; -} -.ais-SearchBox-resetIcon, -.ais-SearchBox-loadingIcon { - position: absolute; - top: 50%; - left: 50%; - -webkit-transform: translateX(-50%) translateY(-50%); - transform: translateX(-50%) translateY(-50%); + margin-inline-start: 10px; } .ais-SearchBox-submitIcon path, .ais-SearchBox-resetIcon path { diff --git a/client/src/components/search/searchBar/searchbar.css b/client/src/components/search/searchBar/searchbar.css index a8c47f6cacc..f4ac394d740 100644 --- a/client/src/components/search/searchBar/searchbar.css +++ b/client/src/components/search/searchBar/searchbar.css @@ -14,16 +14,15 @@ } .ais-SearchBox-input { - padding: 0 10px; + padding-block: 0; + padding-inline-start: 5px; font-size: 18px; display: inline-block; - margin-top: 6px; height: 26px; } .ais-SearchBox-submit, .ais-SearchBox-reset { - margin-top: 6px; height: 26px; width: 26px; background-color: var(--gray-75); @@ -33,6 +32,10 @@ padding-inline: 3px; } +.ais-SearchBox-reset { + padding-block: 0 2px; +} + .fcc_searchBar .ais-SearchBox-input, .fcc_searchBar .ais-Hits { z-index: 100; @@ -40,10 +43,6 @@ color: var(--gray-00); } -.fcc_searchBar .ais-SearchBox-input { - padding-inline: 2em; -} - .fcc_searchBar .ais-Hits { left: 15px; } @@ -125,15 +124,26 @@ and arrow keys */ font-weight: 300; } -.ais-SearchBox-input { - width: calc(100vw - 350px); +.fcc_searchBar .ais-SearchBox-form { + display: grid; + grid-template-columns: 26px auto 36px; + grid-template-areas: 'submit input reset'; + margin-bottom: 0; + gap: 0.25em; + margin-top: 6px; + background-color: var(--gray-75); } -.fcc_searchBar .ais-SearchBox-form { - margin-bottom: 0; - display: flex; - flex-direction: row-reverse; - gap: 0.25em; +.ais-SearchBox-input { + grid-area: input; +} + +.ais-SearchBox-submit { + grid-area: submit; +} + +.ais-SearchBox-reset { + grid-area: reset; } @media (min-width: 981px) { @@ -152,8 +162,6 @@ and arrow keys */ left: 0px; } .fcc_searchBar .ais-SearchBox-form { - display: flex; - justify-content: flex-end; top: auto; } } diff --git a/client/src/components/settings/about.tsx b/client/src/components/settings/about.tsx index 61f5ff7d96c..d18a777d9a1 100644 --- a/client/src/components/settings/about.tsx +++ b/client/src/components/settings/about.tsx @@ -15,6 +15,7 @@ import SoundSettings from './sound'; import ThemeSettings, { Themes } from './theme'; import UsernameSettings from './username'; import KeyboardShortcutsSettings from './keyboard-shortcuts'; +import SectionHeader from './section-header'; type FormValues = { name: string; @@ -212,6 +213,7 @@ class AboutSettings extends Component {

+ {t('settings.headings.personal-info')}
diff --git a/client/src/components/settings/certification.js b/client/src/components/settings/certification.js index a44724bdf09..2e81f4cf4be 100644 --- a/client/src/components/settings/certification.js +++ b/client/src/components/settings/certification.js @@ -213,9 +213,10 @@ export class CertificationSettings extends Component { ); }; @@ -285,7 +286,8 @@ export class CertificationSettings extends Component { data-cy={`btn-for-${certSlug}`} onClick={createClickHandler(certSlug)} > - {isCert ? t('buttons.show-cert') : t('buttons.claim-cert')} + {isCert ? t('buttons.show-cert') : t('buttons.claim-cert')}{' '} + {certName} diff --git a/client/src/components/settings/certification.test.tsx b/client/src/components/settings/certification.test.tsx index de7969d34a6..195b64dd920 100644 --- a/client/src/components/settings/certification.test.tsx +++ b/client/src/components/settings/certification.test.tsx @@ -20,7 +20,7 @@ describe('', () => { expect( screen.getByRole('link', { - name: 'buttons.show-cert' + name: /^buttons.show-cert\s+\S+/ }) ).toHaveAttribute( 'href', @@ -33,7 +33,7 @@ describe('', () => { renderWithRedux(); const allClaimedCerts = screen.getAllByRole('link', { - name: 'buttons.show-cert' + name: /^buttons.show-cert\s+\S+/ }); allClaimedCerts.forEach(cert => { @@ -49,7 +49,7 @@ describe('', () => { renderWithRedux(); const allClaimedCerts = screen.getAllByRole('link', { - name: 'buttons.show-cert' + name: /^buttons.show-cert\s+\S+/ }); allClaimedCerts.forEach(cert => { @@ -65,7 +65,7 @@ describe('', () => { expect( screen.getByRole('link', { - name: 'buttons.view' + name: 'buttons.view settings.labels.solution-for (aria.opens-new-window)' }) ).toHaveAttribute('href', 'https://github.com/freeCodeCamp/freeCodeCamp'); }); diff --git a/client/src/components/solution-display-widget/index.tsx b/client/src/components/solution-display-widget/index.tsx index 4ba1a5aa581..50694807034 100644 --- a/client/src/components/solution-display-widget/index.tsx +++ b/client/src/components/solution-display-widget/index.tsx @@ -1,17 +1,15 @@ import { faExternalLinkAlt } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { - Button, - DropdownButton, - MenuItem -} from '@freecodecamp/react-bootstrap'; +import { Button, Dropdown, MenuItem } from '@freecodecamp/react-bootstrap'; import React from 'react'; import { useTranslation } from 'react-i18next'; import { CompletedChallenge } from '../../redux/prop-types'; import { getSolutionDisplayType } from '../../utils/solution-display-type'; +import './solution-display-widget.css'; interface Props { completedChallenge: CompletedChallenge; dataCy?: string; + projectTitle: string; showUserCode: () => void; showProjectPreview?: () => void; displayContext: 'timeline' | 'settings' | 'certification'; @@ -20,6 +18,7 @@ interface Props { export function SolutionDisplayWidget({ completedChallenge, dataCy, + projectTitle, showUserCode, showProjectPreview, displayContext @@ -29,37 +28,48 @@ export function SolutionDisplayWidget({ const viewText = t('buttons.view'); const viewCode = t('buttons.view-code'); const viewProject = t('buttons.view-project'); - + // We need to add a random number for dropdown button id's since there may be + // two dropdowns for the same project on the page. + const randomIdSuffix = Math.floor(Math.random() * 1_000_000); const ShowFilesSolutionForCertification = ( ); const ShowProjectAndGithubLinkForCertification = ( - - - {t('certification.project.solution')} - - - {t('certification.project.source')} - - + + + {viewText}{' '} + + {t('settings.labels.solution-for', { projectTitle })} + + + + + {t('certification.project.solution')} + ({t('aria.opens-new-window')}) + + + + {t('certification.project.source')} + ({t('aria.opens-new-window')}) + + + + ); const ShowProjectLinkForCertification = ( ); const MissingSolutionComponentForCertification = ( @@ -81,57 +96,67 @@ export function SolutionDisplayWidget({ bsStyle='primary' className='btn-invert' data-cy={dataCy} - id={`btn-for-${id}`} onClick={showUserCode} > - {viewText} + {viewText}{' '} + + {t('settings.labels.solution-for', { projectTitle })} + ); const ShowMultifileProjectSolution = (
- - - {viewCode} - - - {viewProject} - - + + + {viewText}{' '} + + {t('settings.labels.solution-for', { projectTitle })} + + + + + {viewCode} + + + {viewProject} + + +
); const ShowProjectAndGithubLinks = (
- - - {t('buttons.frontend')} - - - {t('buttons.backend')} - - + + + {viewText}{' '} + + {t('settings.labels.solution-for', { projectTitle })} + + + + + {t('buttons.frontend')}{' '} + ({t('aria.opens-new-window')}) + + + + {t('buttons.backend')}{' '} + ({t('aria.opens-new-window')}) + + + +
); const ShowProjectLink = ( @@ -140,11 +165,15 @@ export function SolutionDisplayWidget({ bsStyle='primary' className='btn-invert' href={solution} - id={`btn-for-${id}`} rel='noopener noreferrer' target='_blank' > - {viewText} + {viewText}{' '} + + {t('settings.labels.solution-for', { projectTitle })} ( + {t('aria.opens-new-window')}) + + ); const MissingSolutionComponent = diff --git a/client/src/components/solution-display-widget/solution-display-widget.css b/client/src/components/solution-display-widget/solution-display-widget.css new file mode 100644 index 00000000000..4bff674e523 --- /dev/null +++ b/client/src/components/solution-display-widget/solution-display-widget.css @@ -0,0 +1,3 @@ +.solutions-dropdown a[role='menuitem'] { + text-decoration: none; +} diff --git a/client/src/pages/donate.tsx b/client/src/pages/donate.tsx index c2991783c09..20834631b7a 100644 --- a/client/src/pages/donate.tsx +++ b/client/src/pages/donate.tsx @@ -22,14 +22,10 @@ import { signInLoadingSelector, userSelector } from '../redux/selectors'; import { PaymentContext } from '../../../config/donation-settings'; export interface ExecuteGaArg { - type: string; - data: { - category: string; - action: string; - nonInteraction?: boolean; - label?: string; - value?: number; - }; + event: string; + action: string; + duration?: string; + amount?: number; } interface DonatePageProps { executeGA: (arg: ExecuteGaArg) => void; @@ -59,12 +55,8 @@ function DonatePage({ }: DonatePageProps) { useEffect(() => { executeGA({ - type: 'event', - data: { - category: 'Donation View', - action: `Displayed donate page`, - nonInteraction: true - } + event: 'donationview', + action: `Displayed Donate Page` }); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); diff --git a/client/src/pages/learn.tsx b/client/src/pages/learn.tsx index b5345639891..0ae210ae9fd 100644 --- a/client/src/pages/learn.tsx +++ b/client/src/pages/learn.tsx @@ -11,6 +11,7 @@ import Intro from '../components/Intro'; import Map from '../components/Map'; import { Spacer } from '../components/helpers'; import LearnLayout from '../components/layouts/learn'; +import { defaultDonation } from '../../../config/donation-settings'; import { isSignedInSelector, userSelector, @@ -82,11 +83,10 @@ function LearnPage({ const onDonationAlertClick = () => { executeGA({ - type: 'event', - data: { - category: 'Donation Related', - action: `learn donation alert click` - } + event: 'donationrelated', + action: `Learn Donation Alert Click`, + duration: defaultDonation.donationDuration, + amount: defaultDonation.donationAmount }); }; return ( diff --git a/client/src/redux/action-types.js b/client/src/redux/action-types.js index 1b487225651..7aa77c37257 100644 --- a/client/src/redux/action-types.js +++ b/client/src/redux/action-types.js @@ -23,7 +23,6 @@ export const actionTypes = createTypes( 'showCodeAlly', 'submitComplete', 'updateComplete', - 'updateCurrentChallengeId', 'updateFailed', 'updateDonationFormState', 'updateUserToken', diff --git a/client/src/redux/actions.js b/client/src/redux/actions.js index 47a3d923eed..43c1d3923b9 100644 --- a/client/src/redux/actions.js +++ b/client/src/redux/actions.js @@ -90,9 +90,5 @@ export const hideCodeAlly = createAction(actionTypes.hideCodeAlly); export const showCodeAlly = createAction(actionTypes.showCodeAlly); export const tryToShowCodeAlly = createAction(actionTypes.tryToShowCodeAlly); -export const updateCurrentChallengeId = createAction( - actionTypes.updateCurrentChallengeId -); - export const closeSignoutModal = createAction(actionTypes.closeSignoutModal); export const openSignoutModal = createAction(actionTypes.openSignoutModal); diff --git a/client/src/redux/donation-saga.js b/client/src/redux/donation-saga.js index 564698bccea..245f3cf7940 100644 --- a/client/src/redux/donation-saga.js +++ b/client/src/redux/donation-saga.js @@ -103,16 +103,13 @@ export function* postChargeSaga({ } yield put( executeGA({ - type: 'event', - data: { - category: - paymentProvider === PaymentProvider.Patreon - ? 'Donation Related' - : 'Donation', - action: stringifyDonationEvents(paymentContext, paymentProvider), - label: duration, - value: amount - } + event: + paymentProvider === PaymentProvider.Patreon + ? 'donationrelated' + : 'donation', + action: stringifyDonationEvents(paymentContext, paymentProvider), + duration, + amount }) ); } catch (error) { diff --git a/client/src/redux/donation-saga.test.js b/client/src/redux/donation-saga.test.js index c093a432845..d7fa3de10a6 100644 --- a/client/src/redux/donation-saga.test.js +++ b/client/src/redux/donation-saga.test.js @@ -22,13 +22,10 @@ const postChargeDataMock = { }; const analyticsDataMock = { - type: 'event', - data: { - category: 'Donation', - action: 'Donate Page Stripe Payment Submission', - label: 'monthly', - value: '500' - } + event: 'donation', + action: 'Donate Page Stripe Payment Submission', + duration: 'monthly', + amount: '500' }; describe('donation-saga', () => { @@ -48,7 +45,7 @@ describe('donation-saga', () => { }; const stripeCardAnalyticsDataMock = analyticsDataMock; - stripeCardAnalyticsDataMock.data.action = + stripeCardAnalyticsDataMock.action = 'Donate Page Stripe Card Payment Submission'; const { paymentMethodId, amount, duration } = stripeCardDataMock.payload; @@ -68,8 +65,7 @@ describe('donation-saga', () => { }; const paypalAnalyticsDataMock = analyticsDataMock; - paypalAnalyticsDataMock.data.action = - 'Donate Page Paypal Payment Submission'; + paypalAnalyticsDataMock.action = 'Donate Page Paypal Payment Submission'; const storeMock = { app: { @@ -94,8 +90,7 @@ describe('donation-saga', () => { }; const paypalAnalyticsDataMock = analyticsDataMock; - paypalAnalyticsDataMock.data.action = - 'Donate Page Paypal Payment Submission'; + paypalAnalyticsDataMock.action = 'Donate Page Paypal Payment Submission'; const storeMock = { app: {} @@ -117,9 +112,8 @@ describe('donation-saga', () => { }; const patreonAnalyticsDataMock = analyticsDataMock; - patreonAnalyticsDataMock.data.action = - 'Donate Page Patreon Payment Redirection'; - patreonAnalyticsDataMock.data.category = 'Donation Related'; + patreonAnalyticsDataMock.action = 'Donate Page Patreon Payment Redirection'; + patreonAnalyticsDataMock.event = 'donationrelated'; return expectSaga(postChargeSaga, patreonDataMock) .not.call.fn(addDonation) .not.call.fn(postChargeStripeCard) diff --git a/client/src/redux/fetch-user-saga.js b/client/src/redux/fetch-user-saga.js index 6e9dadac818..20b4d65ddae 100644 --- a/client/src/redux/fetch-user-saga.js +++ b/client/src/redux/fetch-user-saga.js @@ -1,5 +1,5 @@ import { call, put, takeEvery } from 'redux-saga/effects'; - +import store from 'store'; import { getSessionUser, getUserProfile } from '../utils/ajax'; import { fetchProfileForUserComplete, @@ -19,6 +19,13 @@ function* fetchSessionUser() { data: { user = {}, result = '', sessionMeta = {} } } = yield call(getSessionUser); const appUser = user[result] || {}; + + const [userId] = Object.keys(user); + + const sound = user[userId].sound; + + store.set('fcc-sound', sound); + yield put( fetchUserComplete({ user: appUser, username: result, sessionMeta }) ); diff --git a/client/src/redux/ga-saga.js b/client/src/redux/ga-saga.js index 9b94094a516..98ef478479e 100644 --- a/client/src/redux/ga-saga.js +++ b/client/src/redux/ga-saga.js @@ -1,57 +1,34 @@ -/* eslint-disable camelcase */ -import { all, call, select, takeEvery } from 'redux-saga/effects'; +import { all, call, takeEvery } from 'redux-saga/effects'; +import TagManager from '../analytics'; -import { aBTestConfig } from '../../../config/donation-settings'; -import ga from '../analytics'; -import { emailToABVariant } from '../utils/A-B-tester'; -import { - completedChallengesSelector, - completionCountSelector, - emailSelector, - recentlyClaimedBlockSelector -} from './selectors'; - -const GaTypes = { event: ga.event, page: ga.pageview, modal: ga.modalview }; - -function* callGaType({ payload: { type, data } }) { - if ( - type === 'event' && - data.category.toLowerCase().includes('donation') && - aBTestConfig.isTesting - ) { - const email = yield select(emailSelector); - - // a b test results are only reported when user is signed in and has email - if (email) { - const completedChallengeTotal = yield select(completedChallengesSelector); - const completedChallengeSession = yield select(completionCountSelector); - let viewType = null; - - // set the modal type - if (data.action.toLowerCase().includes('modal')) { - const recentlyClaimedBlock = yield select(recentlyClaimedBlockSelector); - viewType = recentlyClaimedBlock ? 'block' : 'progress'; +function* callGaType({ + payload: { action, duration, amount, event, pagePath } +}) { + if (event === 'pageview') { + yield call(TagManager.dataLayer, { + dataLayer: { + event, + pagePath } - - const customDimensions = { - // URL; - dimension1: window.location.href, - // Challenges_Completed_Session - dimension2: completedChallengeSession, - // Challenges_Completed_Total - dimension3: completedChallengeTotal.length, - // Test_Type - dimension4: aBTestConfig.type, - // Test_Variation - dimension5: emailToABVariant(email).isVariantA ? 'A' : 'B', - // View_Type - dimension6: viewType - }; - ga.set(customDimensions); - } + }); + } else if (event === 'donationview') { + yield call(TagManager.dataLayer, { + dataLayer: { + event, + action + } + }); + } else { + // donation and donationrelated + yield call(TagManager.dataLayer, { + dataLayer: { + event, + action, + duration, + amount + } + }); } - - yield call(GaTypes[type], data); } export function* createGaSaga(types) { diff --git a/client/src/redux/ga-saga.test.js b/client/src/redux/ga-saga.test.js index 47c7026caa1..7911349727e 100644 --- a/client/src/redux/ga-saga.test.js +++ b/client/src/redux/ga-saga.test.js @@ -1,24 +1,21 @@ import { expectSaga } from 'redux-saga-test-plan'; -import ga from '../analytics'; +import TagManager from '../analytics'; import { actionTypes } from './action-types'; import { createGaSaga } from './ga-saga'; - jest.mock('../analytics'); describe('ga-saga', () => { it('calls GA after executeGA action', () => { - const GaTypes = { event: ga.event, page: ga.pageview, modal: ga.modalview }; const mockEventPayload = { - type: 'event', - data: { - category: 'Map Challenge Click', - action: '/learn' - } + action: 'Learn Donation Alert Click', + amount: 500, + duration: 'month', + event: 'donationrelated' }; return ( expectSaga(createGaSaga, actionTypes) // Assert that the `call` with expected paramater will eventually happen. - .call(GaTypes.event, mockEventPayload.data) + .call(TagManager.dataLayer, { dataLayer: mockEventPayload }) // Dispatch any actions that the saga will `take`. .dispatch({ type: actionTypes.executeGA, payload: mockEventPayload }) diff --git a/client/src/redux/index.js b/client/src/redux/index.js index b520e2c03c9..9dbaf84a81e 100644 --- a/client/src/redux/index.js +++ b/client/src/redux/index.js @@ -23,7 +23,7 @@ import { createShowCertSaga } from './show-cert-saga'; import updateCompleteEpic from './update-complete-epic'; import { createUserTokenSaga } from './user-token-saga'; -export const defaultFetchState = { +const defaultFetchState = { pending: true, complete: false, errored: false, @@ -41,7 +41,7 @@ export const defaultDonationFormState = { } }; -export const initialState = { +const initialState = { appUsername: '', recentlyClaimedBlock: null, canRequestProgressDonation: true, diff --git a/client/src/redux/prop-types.ts b/client/src/redux/prop-types.ts index aed72b85469..d1c9565fe2c 100644 --- a/client/src/redux/prop-types.ts +++ b/client/src/redux/prop-types.ts @@ -1,78 +1,8 @@ -import PropTypes from 'prop-types'; import { HandlerProps } from 'react-reflex'; import { SuperBlocks } from '../../../config/certification-settings'; import { Themes } from '../components/settings/theme'; import { certMap } from '../resources/cert-and-project-map'; -export const UserPropType = PropTypes.shape({ - about: PropTypes.string, - completedChallenges: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.string, - solution: PropTypes.string, - githubLink: PropTypes.string, - challengeType: PropTypes.number, - completedDate: PropTypes.number, - challengeFiles: PropTypes.array - }) - ), - email: PropTypes.string, - githubProfile: PropTypes.string, - is2018DataVisCert: PropTypes.bool, - isApisMicroservicesCert: PropTypes.bool, - isBackEndCert: PropTypes.bool, - isDataVisCert: PropTypes.bool, - isEmailVerified: PropTypes.bool, - isFrontEndCert: PropTypes.bool, - isFrontEndLibsCert: PropTypes.bool, - isFullStackCert: PropTypes.bool, - isHonest: PropTypes.bool, - isInfosecQaCert: PropTypes.bool, - isQaCertV7: PropTypes.bool, - isInfosecCertV7: PropTypes.bool, - isJsAlgoDataStructCert: PropTypes.bool, - isRelationalDatabaseCertV8: PropTypes.bool, - isRespWebDesignCert: PropTypes.bool, - isSciCompPyCertV7: PropTypes.bool, - isDataAnalysisPyCertV7: PropTypes.bool, - isMachineLearningPyCertV7: PropTypes.bool, - linkedin: PropTypes.string, - location: PropTypes.string, - name: PropTypes.string, - picture: PropTypes.string, - points: PropTypes.number, - portfolio: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.string.isRequired, - title: PropTypes.string, - url: PropTypes.string, - image: PropTypes.string, - description: PropTypes.string - }) - ), - savedChallenges: PropTypes.arrayOf( - PropTypes.shape({ - id: PropTypes.string, - challengeFiles: PropTypes.array - }) - ), - sendQuincyEmail: PropTypes.bool, - sound: PropTypes.bool, - theme: PropTypes.string, - keyboardShortcuts: PropTypes.bool, - twitter: PropTypes.string, - username: PropTypes.string, - website: PropTypes.string -}); - -export const CurrentCertsPropType = PropTypes.arrayOf( - PropTypes.shape({ - show: PropTypes.bool, - title: PropTypes.string, - certSlug: PropTypes.string - }) -); - export type Steps = { isHonest?: boolean; currentCerts?: Array; @@ -96,7 +26,7 @@ export type MarkdownRemark = { superBlock: SuperBlocks; // TODO: make enum like superBlock certification: string; - title: typeof certMap[number]['title']; + title: (typeof certMap)[number]['title']; }; headings: [ { @@ -117,7 +47,11 @@ export type MarkdownRemark = { }; }; -type Question = { text: string; answers: string[]; solution: number }; +type Question = { + text: string; + answers: string[]; + solution: number; +}; type Fields = { slug: string; blockName: string; tests: Test[] }; type Required = { link: string; @@ -185,6 +119,7 @@ export type ChallengeNode = { isPrivate: boolean; order: number; question: Question; + assignments: string[]; required: Required[]; solutions: { [T in FileKey]: FileKeyChallenge; diff --git a/client/src/redux/save-challenge-saga.js b/client/src/redux/save-challenge-saga.js index be0ad140992..4c109abe4e7 100644 --- a/client/src/redux/save-challenge-saga.js +++ b/client/src/redux/save-challenge-saga.js @@ -17,7 +17,7 @@ import { import { saveChallengeComplete } from './actions'; import { savedChallengesSelector } from './selectors'; -export function* saveChallengeSaga() { +function* saveChallengeSaga() { const { id, challengeType } = yield select(challengeMetaSelector); const { challengeFiles } = yield select(challengeDataSelector); const savedChallenges = yield select(savedChallengesSelector); diff --git a/client/src/redux/selectors.js b/client/src/redux/selectors.js index e9a561d6067..9faca5b8eab 100644 --- a/client/src/redux/selectors.js +++ b/client/src/redux/selectors.js @@ -1,5 +1,4 @@ import { SuperBlocks } from '../../../config/certification-settings'; -import { emailToABVariant } from '../utils/A-B-tester'; import { ns as MainApp } from './action-types'; export const savedChallengesSelector = state => @@ -13,13 +12,7 @@ export const currentChallengeIdSelector = state => state[MainApp].currentChallengeId; export const emailSelector = state => userSelector(state).email; -export const isVariantASelector = state => { - const email = emailSelector(state); - // if the user is not signed in and the user info is not available. - // always return A the control variant - if (!email) return true; - return emailToABVariant(email).isVariantA; -}; + export const isDonatingSelector = state => userSelector(state).isDonating; export const isOnlineSelector = state => state[MainApp].isOnline; export const isServerOnlineSelector = state => state[MainApp].isServerOnline; @@ -217,5 +210,3 @@ export const userSelector = state => { return state[MainApp].user[username] || {}; }; - -export const sessionMetaSelector = state => state[MainApp].sessionMeta; diff --git a/client/src/redux/types.ts b/client/src/redux/types.ts index 0c56a1c4bd0..0288b1363b5 100644 --- a/client/src/redux/types.ts +++ b/client/src/redux/types.ts @@ -49,17 +49,3 @@ interface DefaultDonationFormState { success: boolean; error: null | string; } - -export const defaultFetchState = { - pending: true, - complete: false, - errored: false, - error: null -}; - -export const defaultDonationFormState = { - redirecting: false, - processing: false, - success: false, - error: '' -}; diff --git a/client/src/resources/cert-and-project-map.ts b/client/src/resources/cert-and-project-map.ts index 4e24655923a..a2f1772e698 100644 --- a/client/src/resources/cert-and-project-map.ts +++ b/client/src/resources/cert-and-project-map.ts @@ -727,7 +727,7 @@ function getJavaScriptAlgoPath(project: string) { } const titles = certMap.map(({ title }) => title); -type Title = typeof titles[number]; +type Title = (typeof titles)[number]; const legacyProjectMap: Partial> = {}; const projectMap: Partial> = {}; diff --git a/client/src/templates/Challenges/classic/editor.tsx b/client/src/templates/Challenges/classic/editor.tsx index e2e0c4ab33d..e3d63e528f0 100644 --- a/client/src/templates/Challenges/classic/editor.tsx +++ b/client/src/templates/Challenges/classic/editor.tsx @@ -1203,10 +1203,15 @@ const Editor = (props: EditorProps): JSX.Element => { }); } - const { theme } = props; - const editorTheme = theme === Themes.Night ? 'vs-dark-custom' : 'vs-custom'; + const { isSignedIn, theme } = props; + const preferDarkScheme = window.matchMedia( + '(prefers-color-scheme: dark)' + ).matches; + const isDarkTheme = + theme === Themes.Night || (preferDarkScheme && !isSignedIn); + const editorTheme = isDarkTheme ? 'vs-dark-custom' : 'vs-custom'; return ( - }> + }> )} void; - executeGA: (attributes: { type: string; data: string }) => void; + executeGA: (attributes: { event: string; pagePath: string }) => void; isOpen?: boolean; t: (attribute: string) => string; videoUrl?: string; @@ -28,7 +28,7 @@ const mapDispatchToProps = (dispatch: Dispatch) => dispatch ); -export function VideoModal({ +function VideoModal({ closeVideoModal, executeGA, isOpen, @@ -36,7 +36,7 @@ export function VideoModal({ videoUrl }: VideoModalProps): JSX.Element { if (isOpen) { - executeGA({ type: 'modal', data: '/completion-modal' }); + executeGA({ event: 'pageview', pagePath: '/completion-modal' }); } return ( diff --git a/client/src/templates/Challenges/odin/Show.tsx b/client/src/templates/Challenges/odin/Show.tsx new file mode 100644 index 00000000000..a57cd86fac2 --- /dev/null +++ b/client/src/templates/Challenges/odin/Show.tsx @@ -0,0 +1,427 @@ +// Package Utilities +import { Button, Grid, Col, Row } from '@freecodecamp/react-bootstrap'; +import { graphql } from 'gatsby'; +import React, { Component } from 'react'; +import Helmet from 'react-helmet'; +import { ObserveKeys } from 'react-hotkeys'; +import { TFunction, withTranslation } from 'react-i18next'; +import { connect } from 'react-redux'; +import { bindActionCreators } from 'redux'; +import type { Dispatch } from 'redux'; +import { createSelector } from 'reselect'; + +// Local Utilities +import Loader from '../../../components/helpers/loader'; +import Spacer from '../../../components/helpers/spacer'; +import LearnLayout from '../../../components/layouts/learn'; +import { ChallengeNode, ChallengeMeta } from '../../../redux/prop-types'; +import Hotkeys from '../components/Hotkeys'; +import VideoPlayer from '../components/VideoPlayer'; +import ChallengeTitle from '../components/challenge-title'; +import CompletionModal from '../components/completion-modal'; +import PrismFormatted from '../components/prism-formatted'; +import { + challengeMounted, + updateChallengeMeta, + openModal, + updateSolutionFormValues +} from '../redux/actions'; +import { isChallengeCompletedSelector } from '../redux/selectors'; + +// Styles +import './show.css'; +import '../video.css'; + +// Redux Setup +const mapStateToProps = createSelector( + isChallengeCompletedSelector, + (isChallengeCompleted: boolean) => ({ + isChallengeCompleted + }) +); +const mapDispatchToProps = (dispatch: Dispatch) => + bindActionCreators( + { + updateChallengeMeta, + challengeMounted, + updateSolutionFormValues, + openCompletionModal: () => openModal('completion') + }, + dispatch + ); + +// Types +interface ShowOdinProps { + challengeMounted: (arg0: string) => void; + data: { challengeNode: ChallengeNode }; + description: string; + isChallengeCompleted: boolean; + openCompletionModal: () => void; + pageContext: { + challengeMeta: ChallengeMeta; + }; + t: TFunction; + updateChallengeMeta: (arg0: ChallengeMeta) => void; + updateSolutionFormValues: () => void; +} + +interface ShowOdinState { + subtitles: string; + downloadURL: string | null; + selectedOption: number | null; + answer: number; + isWrongAnswer: boolean; + assignmentsCompleted: number; + allAssignmentsCompleted: boolean; + videoIsLoaded: boolean; +} + +// Component +class ShowOdin extends Component { + static displayName: string; + private _container: HTMLElement | null | undefined; + + constructor(props: ShowOdinProps) { + super(props); + this.state = { + subtitles: '', + downloadURL: null, + selectedOption: null, + answer: 1, + isWrongAnswer: false, + assignmentsCompleted: 0, + allAssignmentsCompleted: false, + videoIsLoaded: false + }; + + this.handleSubmit = this.handleSubmit.bind(this); + } + + componentDidMount(): void { + const { + challengeMounted, + data: { + challengeNode: { + challenge: { title, challengeType, helpCategory } + } + }, + pageContext: { challengeMeta }, + updateChallengeMeta + } = this.props; + updateChallengeMeta({ + ...challengeMeta, + title, + challengeType, + helpCategory + }); + challengeMounted(challengeMeta.id); + this._container?.focus(); + } + + componentDidUpdate(prevProps: ShowOdinProps): void { + const { + data: { + challengeNode: { + challenge: { title: prevTitle } + } + } + } = prevProps; + const { + challengeMounted, + data: { + challengeNode: { + challenge: { title: currentTitle, challengeType, helpCategory } + } + }, + pageContext: { challengeMeta }, + updateChallengeMeta + } = this.props; + if (prevTitle !== currentTitle) { + updateChallengeMeta({ + ...challengeMeta, + title: currentTitle, + challengeType, + helpCategory + }); + challengeMounted(challengeMeta.id); + } + } + + handleSubmit( + solution: number, + openCompletionModal: () => void, + assignments: string[] + ) { + const hasAssignments = assignments[0] != ''; + const completed = this.state.allAssignmentsCompleted; + const isCorrect = solution - 1 === this.state.selectedOption; + + if (isCorrect) { + this.setState({ + isWrongAnswer: false + }); + if (!hasAssignments || completed) openCompletionModal(); + } else { + this.setState({ + isWrongAnswer: true + }); + } + } + + handleOptionChange = ( + changeEvent: React.ChangeEvent + ): void => { + this.setState({ + isWrongAnswer: false, + selectedOption: parseInt(changeEvent.target.value, 10) + }); + }; + + handleAssignmentChange = ( + event: React.ChangeEvent, + totalAssignments: number + ): void => { + const assignmentsCompleted = event.target.checked + ? this.state.assignmentsCompleted + 1 + : this.state.assignmentsCompleted - 1; + const allAssignmentsCompleted = totalAssignments === assignmentsCompleted; + + this.setState({ + assignmentsCompleted, + allAssignmentsCompleted + }); + }; + + onVideoLoad = () => { + this.setState({ + videoIsLoaded: true + }); + }; + + render() { + const { + data: { + challengeNode: { + challenge: { + fields: { blockName }, + title, + description, + superBlock, + certification, + block, + translationPending, + videoId, + videoLocaleIds, + bilibiliIds, + question: { text, answers, solution }, + assignments + } + } + }, + openCompletionModal, + pageContext: { + challengeMeta: { nextChallengePath, prevChallengePath } + }, + t, + isChallengeCompleted + } = this.props; + + const blockNameTitle = `${t( + `intro:${superBlock}.blocks.${block}.title` + )} - ${title}`; + return ( + { + this.handleSubmit(solution, openCompletionModal, assignments); + }} + innerRef={(c: HTMLElement | null) => (this._container = c)} + nextChallengePath={nextChallengePath} + prevChallengePath={prevChallengePath} + > + + + + + + + {title} + + + +
+ {!this.state.videoIsLoaded ? ( +
+ +
+ ) : null} + +
+ + +

{title}

+ + + + {assignments[0] != '' && ( + <> +

Assignments

+
+ {assignments.map((assignment, index) => ( + + ))} +
{' '} + + )} + +

Question

+ +
+ {answers.map((option, index) => ( + + ))} +
+
+ +
+ {this.state.isWrongAnswer && ( + {t('learn.wrong-answer')} + )} + {!this.state.allAssignmentsCompleted && + assignments.length > 0 && ( + <> +
+ {t('learn.assignment-not-complete')} + + )} +
+ + + + + +
+
+
+
+ ); + } +} + +ShowOdin.displayName = 'ShowOdin'; + +export default connect( + mapStateToProps, + mapDispatchToProps +)(withTranslation()(ShowOdin)); + +export const query = graphql` + query TheOdinProject($slug: String!) { + challengeNode(challenge: { fields: { slug: { eq: $slug } } }) { + challenge { + videoId + videoLocaleIds { + espanol + italian + portuguese + } + bilibiliIds { + aid + bvid + cid + } + title + description + challengeType + helpCategory + superBlock + certification + block + fields { + blockName + slug + } + question { + text + answers + solution + } + translationPending + assignments + } + } + } +`; diff --git a/client/src/templates/Challenges/odin/show.css b/client/src/templates/Challenges/odin/show.css new file mode 100644 index 00000000000..c0357a51862 --- /dev/null +++ b/client/src/templates/Challenges/odin/show.css @@ -0,0 +1,28 @@ +input[type='checkbox'] { + display: grid; + place-content: center; + -webkit-appearance: none; + appearance: none; + background-color: #fff; + min-width: 1.15em; + min-height: 1.15em; + max-width: 1.15em; + max-height: 1.15em; + margin-right: 15px; + border: 2px solid black; + border-radius: 0.15em; + transform: translateY(-0.075em); +} + +input[type='checkbox']::before { + content: ''; + width: 0.65em; + height: 0.65em; + transform: scale(0); + transition: 120ms transform ease-in-out; + box-shadow: inset 1em 1em black; +} + +input[type='checkbox']:checked::before { + transform: scale(1); +} diff --git a/client/src/templates/Challenges/projects/tool-panel.tsx b/client/src/templates/Challenges/projects/tool-panel.tsx index 7cb402a04e5..46a1e3cb820 100644 --- a/client/src/templates/Challenges/projects/tool-panel.tsx +++ b/client/src/templates/Challenges/projects/tool-panel.tsx @@ -24,7 +24,7 @@ interface ToolPanelProps { t: TFunction; } -export function ToolPanel({ +function ToolPanel({ guideUrl, openHelpModal, t diff --git a/client/src/templates/Challenges/rechallenge/transformers.js b/client/src/templates/Challenges/rechallenge/transformers.js index 4abd8943a2e..ddc5ba1f7c1 100644 --- a/client/src/templates/Challenges/rechallenge/transformers.js +++ b/client/src/templates/Challenges/rechallenge/transformers.js @@ -99,9 +99,8 @@ const testJS = matchesProperty('ext', 'js'); const testJSX = matchesProperty('ext', 'jsx'); const testHTML = matchesProperty('ext', 'html'); const testHTML$JS$JSX = overSome(testHTML, testJS, testJSX); -export const testJS$JSX = overSome(testJS, testJSX); -export const replaceNBSP = cond([ +const replaceNBSP = cond([ [ testHTML$JS$JSX, partial(transformContents, contents => contents.replace(NBSPReg, ' ')) diff --git a/client/src/templates/Challenges/redux/action-types.js b/client/src/templates/Challenges/redux/action-types.js index caa4b98f5a0..9e2137bab75 100644 --- a/client/src/templates/Challenges/redux/action-types.js +++ b/client/src/templates/Challenges/redux/action-types.js @@ -14,7 +14,6 @@ export const actionTypes = createTypes( 'updateConsole', 'updateChallengeMeta', 'updateFile', - 'updateJSEnabled', 'updateSolutionFormValues', 'updateSuccessMessage', 'updateTests', diff --git a/client/src/templates/Challenges/redux/actions.js b/client/src/templates/Challenges/redux/actions.js index 5a488306546..8c8577dd8a6 100644 --- a/client/src/templates/Challenges/redux/actions.js +++ b/client/src/templates/Challenges/redux/actions.js @@ -31,7 +31,6 @@ export const updateChallengeMeta = createAction( export const updateFile = createAction(actionTypes.updateFile); export const updateConsole = createAction(actionTypes.updateConsole); export const updateLogs = createAction(actionTypes.updateLogs); -export const updateJSEnabled = createAction(actionTypes.updateJSEnabled); export const updateSolutionFormValues = createAction( actionTypes.updateSolutionFormValues ); diff --git a/client/src/templates/Challenges/redux/completion-epic.js b/client/src/templates/Challenges/redux/completion-epic.js index 337cd9f96e7..c9314cf09a0 100644 --- a/client/src/templates/Challenges/redux/completion-epic.js +++ b/client/src/templates/Challenges/redux/completion-epic.js @@ -62,6 +62,7 @@ function submitModern(type, state) { const tests = challengeTestsSelector(state); if ( challengeType === 11 || + challengeType === 15 || (tests.length > 0 && tests.every(test => test.pass && !test.err)) ) { if (type === actionTypes.checkChallenge) { diff --git a/client/src/templates/Challenges/redux/current-challenge-saga.js b/client/src/templates/Challenges/redux/current-challenge-saga.js index eb78a2f09f4..9e07be593b7 100644 --- a/client/src/templates/Challenges/redux/current-challenge-saga.js +++ b/client/src/templates/Challenges/redux/current-challenge-saga.js @@ -5,7 +5,7 @@ import { randomCompliment } from '../../../utils/get-words'; import { CURRENT_CHALLENGE_KEY } from './action-types'; import { updateSuccessMessage } from './actions'; -export function* currentChallengeSaga({ payload: id }) { +function* currentChallengeSaga({ payload: id }) { yield store.set(CURRENT_CHALLENGE_KEY, id); // // Temporarily removed to reduce calls to database // // will need to re-import things at the top @@ -26,7 +26,7 @@ export function* currentChallengeSaga({ payload: id }) { // } } -export function* updateSuccessMessageSaga() { +function* updateSuccessMessageSaga() { yield put(updateSuccessMessage(randomCompliment())); } diff --git a/client/src/templates/Challenges/redux/execute-challenge-saga.js b/client/src/templates/Challenges/redux/execute-challenge-saga.js index 4f009dd991d..f7449133fdb 100644 --- a/client/src/templates/Challenges/redux/execute-challenge-saga.js +++ b/client/src/templates/Challenges/redux/execute-challenge-saga.js @@ -57,7 +57,7 @@ import { const previewTimeout = 2500; // when 'run tests' is clicked, do this first -export function* executeCancellableChallengeSaga(payload) { +function* executeCancellableChallengeSaga(payload) { const { challengeType, id } = yield select(challengeMetaSelector); const { challengeFiles } = yield select(challengeDataSelector); @@ -84,7 +84,7 @@ export function* executeCancellableChallengeSaga(payload) { yield cancel(task); } -export function* executeChallengeSaga({ payload }) { +function* executeChallengeSaga({ payload }) { const isBuildEnabled = yield select(isBuildEnabledSelector); if (!isBuildEnabled) { return; diff --git a/client/src/templates/Challenges/redux/selectors.js b/client/src/templates/Challenges/redux/selectors.js index a5f9296223b..12d30ff54b4 100644 --- a/client/src/templates/Challenges/redux/selectors.js +++ b/client/src/templates/Challenges/redux/selectors.js @@ -2,7 +2,6 @@ import { challengeTypes } from '../../../../utils/challenge-types'; import { completedChallengesSelector } from '../../../redux/selectors'; import { ns } from './action-types'; -export const currentTabSelector = state => state[ns].currentTab; export const challengeFilesSelector = state => state[ns].challengeFiles; export const challengeMetaSelector = state => state[ns].challengeMeta; export const challengeTestsSelector = state => state[ns].challengeTests; diff --git a/client/src/templates/Challenges/utils/build.ts b/client/src/templates/Challenges/utils/build.ts index b902c8b635d..81d04296ab2 100644 --- a/client/src/templates/Challenges/utils/build.ts +++ b/client/src/templates/Challenges/utils/build.ts @@ -250,7 +250,7 @@ export function buildJSChallenge( } } -export function buildBackendChallenge({ url }: BuildChallengeData) { +function buildBackendChallenge({ url }: BuildChallengeData) { return { challengeType: challengeTypes.backend, build: concatHtml({ required: frameRunner }), diff --git a/client/src/templates/Challenges/video/show.css b/client/src/templates/Challenges/video.css similarity index 100% rename from client/src/templates/Challenges/video/show.css rename to client/src/templates/Challenges/video.css diff --git a/client/src/templates/Challenges/video/Show.tsx b/client/src/templates/Challenges/video/Show.tsx index 0f2d866c62a..db5cc4bbffb 100644 --- a/client/src/templates/Challenges/video/Show.tsx +++ b/client/src/templates/Challenges/video/Show.tsx @@ -30,7 +30,7 @@ import { import { isChallengeCompletedSelector } from '../redux/selectors'; // Styles -import './show.css'; +import '../video.css'; // Redux Setup const mapStateToProps = createSelector( diff --git a/client/src/templates/Introduction/components/block.tsx b/client/src/templates/Introduction/components/block.tsx index 30e4501ceb1..b1649130bd4 100644 --- a/client/src/templates/Introduction/components/block.tsx +++ b/client/src/templates/Introduction/components/block.tsx @@ -13,7 +13,6 @@ import DropDown from '../../../assets/icons/dropdown'; import GreenNotCompleted from '../../../assets/icons/green-not-completed'; import GreenPass from '../../../assets/icons/green-pass'; import { Link, Spacer } from '../../../components/helpers'; -import { executeGA } from '../../../redux/actions'; import { completedChallengesSelector } from '../../../redux/selectors'; import { ChallengeNode, CompletedChallenge } from '../../../redux/prop-types'; import { playTone } from '../../../utils/tone'; @@ -45,20 +44,18 @@ const mapStateToProps = ( }; const mapDispatchToProps = (dispatch: Dispatch) => - bindActionCreators({ toggleBlock, executeGA }, dispatch); + bindActionCreators({ toggleBlock }, dispatch); interface BlockProps { blockDashedName: string; challenges: ChallengeNode[]; completedChallengeIds: string[]; - executeGA: typeof executeGA; isExpanded: boolean; superBlock: SuperBlocks; t: TFunction; toggleBlock: typeof toggleBlock; } - -export class Block extends Component { +class Block extends Component { static displayName: string; constructor(props: BlockProps) { super(props); @@ -67,15 +64,8 @@ export class Block extends Component { } handleBlockClick(): void { - const { blockDashedName, toggleBlock, executeGA } = this.props; + const { blockDashedName, toggleBlock } = this.props; void playTone('block-toggle'); - executeGA({ - type: 'event', - data: { - category: 'Map Block Click', - action: blockDashedName - } - }); toggleBlock(blockDashedName); } diff --git a/client/src/templates/Introduction/components/cert-challenge.tsx b/client/src/templates/Introduction/components/cert-challenge.tsx index 58f57e949ef..ab5445713c6 100644 --- a/client/src/templates/Introduction/components/cert-challenge.tsx +++ b/client/src/templates/Introduction/components/cert-challenge.tsx @@ -34,7 +34,7 @@ interface CertChallengeProps { currentCerts: Steps['currentCerts']; superBlock: SuperBlocks; t: TFunction; - title: typeof certMap[number]['title']; + title: (typeof certMap)[number]['title']; user: User; verifyCert: typeof verifyCert; } @@ -130,7 +130,8 @@ const CertChallenge = ({ > {isCertified && userLoaded ? t('buttons.show-cert') - : t('buttons.go-to-settings')} + : t('buttons.go-to-settings')}{' '} + {title} )}
@@ -139,8 +140,6 @@ const CertChallenge = ({ CertChallenge.displayName = 'CertChallenge'; -export { CertChallenge }; - export default connect( mapStateToProps, mapDispatchToProps diff --git a/client/src/templates/Introduction/components/challenges.tsx b/client/src/templates/Introduction/components/challenges.tsx index 6686cf863f7..0e28ae01529 100644 --- a/client/src/templates/Introduction/components/challenges.tsx +++ b/client/src/templates/Introduction/components/challenges.tsx @@ -9,7 +9,6 @@ import GreenNotCompleted from '../../../assets/icons/green-not-completed'; import GreenPass from '../../../assets/icons/green-pass'; import { executeGA } from '../../../redux/actions'; import { SuperBlocks } from '../../../../../config/certification-settings'; -import { ExecuteGaArg } from '../../../pages/donate'; import { ChallengeWithCompletedNode } from '../../../redux/prop-types'; import { isNewJsCert, isNewRespCert } from '../../../utils/is-a-cert'; @@ -18,7 +17,6 @@ const mapDispatchToProps = (dispatch: Dispatch) => interface Challenges { challengesWithCompleted: ChallengeWithCompletedNode[]; - executeGA: (payload: ExecuteGaArg) => void; isProjectBlock: boolean; superBlock: SuperBlocks; blockTitle?: string | null; @@ -26,20 +24,11 @@ interface Challenges { function Challenges({ challengesWithCompleted, - executeGA, isProjectBlock, superBlock, blockTitle }: Challenges): JSX.Element { const { t } = useTranslation(); - const handleChallengeClick = (slug: string) => - executeGA({ - type: 'event', - data: { - category: 'Map Challenge Click', - action: slug - } - }); const renderCheckMark = (isCompleted: boolean) => isCompleted ? : ; @@ -60,9 +49,6 @@ function Challenges({
- handleChallengeClick(firstIncompleteChallenge.fields.slug) - } to={firstIncompleteChallenge.fields.slug} > {!isChallengeStarted @@ -88,7 +74,6 @@ function Challenges({ > {!isProjectBlock ? ( handleChallengeClick(challenge.fields.slug)} to={challenge.fields.slug} className={`map-grid-item ${ +challenge.isCompleted ? 'challenge-completed' : '' @@ -103,10 +88,7 @@ function Challenges({ ) : ( - handleChallengeClick(challenge.fields.slug)} - to={challenge.fields.slug} - > + {challenge.title} {renderCheckMark(challenge.isCompleted)} @@ -129,20 +111,14 @@ function Challenges({ key={'map-challenge' + challenge.fields.slug} > {!isProjectBlock ? ( - handleChallengeClick(challenge.fields.slug)} - to={challenge.fields.slug} - > + {renderCheckMark(challenge.isCompleted)} {challenge.title} ) : ( - handleChallengeClick(challenge.fields.slug)} - to={challenge.fields.slug} - > + {challenge.title} {renderCheckMark(challenge.isCompleted)} diff --git a/client/src/utils/A-B-tester.test.ts b/client/src/utils/A-B-tester.test.ts deleted file mode 100644 index df932ff6abd..00000000000 --- a/client/src/utils/A-B-tester.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import faker from 'faker'; -import { emailToABVariant } from './A-B-tester'; - -describe('client/src is-email-variation-a', () => { - it('Consistently returns the same result for the same input', () => { - const preSavedResult = { - hash: '23e3cacb302b0c759531faa8b414b23709c26029', - isVariantA: true, - hashInt: 2 - }; - const result = emailToABVariant('foo@freecodecamp.org'); - expect(result).toEqual(preSavedResult); - }); - it('Distributes A and B variations equaly for 100K random emails', () => { - let A = 0; - let B = 0; - const sampleSize = 100000; - faker.seed(123); - - for (let i = 0; i < sampleSize; i++) { - if (emailToABVariant(faker.internet.email()).isVariantA) A++; - else B++; - } - - const isBucketWellDistributed = (variant: number): boolean => - variant > 0.99 * (sampleSize / 2); - - expect(isBucketWellDistributed(A) && isBucketWellDistributed(B)).toEqual( - true - ); - }); -}); diff --git a/client/src/utils/A-B-tester.ts b/client/src/utils/A-B-tester.ts deleted file mode 100644 index d78141ebad8..00000000000 --- a/client/src/utils/A-B-tester.ts +++ /dev/null @@ -1,21 +0,0 @@ -import sha1 from 'sha-1'; - -// This function turns an email to a hash and decides if it should be -// an A or B variant for A/B testing - -export function emailToABVariant(email: string): { - hash: string; - isVariantA: boolean; - hashInt: number; -} { - // turn the email into a number - const hash: string = sha1(email); - const hashInt = parseInt(hash.slice(0, 1), 16); - // turn the number to A or B variant - const isVariantA = hashInt % 2 === 0; - return { - hash, - isVariantA, - hashInt - }; -} diff --git a/client/src/utils/path-parsers.ts b/client/src/utils/path-parsers.ts index 587606f409c..11f23e452db 100644 --- a/client/src/utils/path-parsers.ts +++ b/client/src/utils/path-parsers.ts @@ -31,6 +31,3 @@ export const isLocationSuperBlock = ( ): boolean => { return /^\/learn\/[\w-]+\/$/.test(location?.pathname ?? ''); }; - -const pathParsers = { isLanding, isChallenge }; -export default pathParsers; diff --git a/client/src/utils/tone/index.ts b/client/src/utils/tone/index.ts index e146073809e..103ea6c46d2 100644 --- a/client/src/utils/tone/index.ts +++ b/client/src/utils/tone/index.ts @@ -62,20 +62,16 @@ type ToneStates = keyof typeof toneUrls; export async function playTone(state: ToneStates): Promise { const playSound = !!store.get('fcc-sound'); if (playSound && toneUrls[state]) { - const tone = await import('tone'); + const Tone = await import('tone'); - if (tone.context.state !== 'running') { - tone.context.resume().catch(err => { - console.error('Error resuming audio context', err); - }); - } - const player = new tone.Player(toneUrls[state]).toDestination(); + const player = new Tone.Player(toneUrls[state]).toDestination(); const storedVolume = (store.get('soundVolume') as number) ?? 50; const calculateDecibel = -60 * (1 - storedVolume / 100); player.volume.value = calculateDecibel; - player.autostart = true; + await Tone.loaded(); + player.start(); } } diff --git a/client/utils/challenge-types.js b/client/utils/challenge-types.js index 5cbc1d59f66..d0c665e1ade 100644 --- a/client/utils/challenge-types.js +++ b/client/utils/challenge-types.js @@ -14,6 +14,7 @@ const video = 11; const codeAllyPractice = 12; const codeAllyCert = 13; const multifileCertProject = 14; +const theOdinProject = 15; // individual exports exports.backend = backend; @@ -38,7 +39,8 @@ exports.challengeTypes = { video, codeAllyPractice, codeAllyCert, - multifileCertProject + multifileCertProject, + theOdinProject }; exports.isFinalProject = challengeType => { @@ -60,12 +62,6 @@ exports.isCodeAllyPractice = challengeType => { return challengeType === codeAllyPractice; }; -// turn challengeType to file ext -exports.pathsMap = { - [html]: 'html', - [js]: 'js', - [jsProject]: 'js' -}; // determine the component view for each challenge exports.viewTypes = { [html]: 'classic', @@ -81,7 +77,8 @@ exports.viewTypes = { [video]: 'video', [codeAllyPractice]: 'codeAlly', [codeAllyCert]: 'codeAlly', - [multifileCertProject]: 'classic' + [multifileCertProject]: 'classic', + [theOdinProject]: 'odin' }; // determine the type of submit function to use for the challenge on completion @@ -103,7 +100,8 @@ exports.submitTypes = { [modern]: 'tests', [video]: 'tests', [codeAllyCert]: 'project.frontEnd', - [multifileCertProject]: 'tests' + [multifileCertProject]: 'tests', + [theOdinProject]: 'tests' }; // determine which help forum questions should be posted to diff --git a/client/utils/gatsby/challenge-page-creator.js b/client/utils/gatsby/challenge-page-creator.js index bcc334f56ec..13fdefe5116 100644 --- a/client/utils/gatsby/challenge-page-creator.js +++ b/client/utils/gatsby/challenge-page-creator.js @@ -32,13 +32,19 @@ const video = path.resolve( '../../src/templates/Challenges/video/Show.tsx' ); +const odin = path.resolve( + __dirname, + '../../src/templates/Challenges/odin/Show.tsx' +); + const views = { backend, classic, modern: classic, frontend, video, - codeAlly + codeAlly, + odin // quiz: Quiz }; diff --git a/client/utils/help-category-map.json b/client/utils/help-category-map.json index 2452d3146bb..0a7f4eac9d0 100644 --- a/client/utils/help-category-map.json +++ b/client/utils/help-category-map.json @@ -42,6 +42,7 @@ "algorithms": "JavaScript", "data-structures": "JavaScript", "take-home-projects": "JavaScript", + "the-odin-project": "JavaScript", "rosetta-code": "JavaScript", "project-euler": "JavaScript", "scientific-computing-with-python": "Python", diff --git a/config/analytics-settings.js b/config/analytics-settings.js index 106725cc3b6..68f63dba39b 100644 --- a/config/analytics-settings.js +++ b/config/analytics-settings.js @@ -1,2 +1,5 @@ -exports.prodAnalyticsId = 'UA-55446531-10'; -exports.devAnalyticsId = 'UA-55446531-19'; +exports.prodAnalyticsId = 'GTM-57R6KJM'; +exports.devAnalyticsId = 'GTM-WSS47LM'; + +// this id includes a stream for the spanish learn platform +exports.prodAnalyticsESId = 'GTM-KCS6GSD'; diff --git a/config/knip/knip.dev.json b/config/knip/knip.dev.json deleted file mode 100644 index 7970a93f047..00000000000 --- a/config/knip/knip.dev.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "client":{ - "dev": true, - "exclude": ["dependencies"], - "entryFiles": [ - "gatsby-*.js", - "src/pages/*.tsx", - "src/templates/Challenges/**/{s,S}how.tsx", - "src/templates/Introduction/**/{intro,super-block-intro}.tsx", - "src/**/*.test.{js,ts,tsx}" - ], - "projectFiles": [ - "src/**/*.{js,ts,tsx}", - "!static/misc/*.js", - "!i18n/schema-validation.ts", - "!plugins/**", - "!postcss.config.js", - "!src/client/frame-runner.ts", - "!src/client/workers/**", - "!webpack-workers.js", - "!**/i18n/config-for-tests.ts", - "!**/__mocks__/**", - "!**/__fixtures/**", - "!**/node_modules/**" - ] - } -} diff --git a/config/knip/knip.json b/config/knip/knip.json deleted file mode 100644 index cdb79eb4b6c..00000000000 --- a/config/knip/knip.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "client":{ - "exclude": ["dependencies"], - "entryFiles": [ - "gatsby-*.js", - "src/html.tsx", - "src/pages/*.tsx", - "src/templates/Challenges/**/{s,S}how.tsx", - "src/templates/Introduction/**/{intro,super-block-intro}.tsx" - ], - "projectFiles": [ - "**/*.{js,ts,tsx}", - "!static/misc/*.js", - "!i18n/schema-validation.ts", - "!plugins/**", - "!postcss.config.js", - "!src/client/frame-runner.ts", - "!src/client/workers/**", - "!webpack-workers.js", - "!**/*.test.{js,ts,tsx}", - "!**/i18n/config-for-tests.ts", - "!**/__mocks__/**", - "!**/__fixtures/**", - "!**/node_modules/**", - "!**/*.d.ts" - ] - } -} diff --git a/curriculum/challenges/_meta/learn-typography-by-building-a-nutrition-label/meta.json b/curriculum/challenges/_meta/learn-typography-by-building-a-nutrition-label/meta.json index cf0d7d963a4..a647ab21730 100644 --- a/curriculum/challenges/_meta/learn-typography-by-building-a-nutrition-label/meta.json +++ b/curriculum/challenges/_meta/learn-typography-by-building-a-nutrition-label/meta.json @@ -135,144 +135,148 @@ "Step 31" ], [ - "615f5486b8fd4b71633f69b0", + "6395d33ab5d91bf317107c48", "Step 32" ], [ - "615f575b50b91e72af079480", + "615f5486b8fd4b71633f69b0", "Step 33" ], [ - "615f5af373a68e744a3c5a76", + "6396e33fe478dd264ebbf278", "Step 34" ], [ - "615f5c1cb7575c7551ed8a40", + "615f575b50b91e72af079480", "Step 35" ], [ - "615f5fd85d0062761f288364", + "615f5af373a68e744a3c5a76", "Step 36" ], [ - "615f61338c8ca176d6445574", + "615f5fd85d0062761f288364", "Step 37" ], [ - "615f666ac5edea782feb7e75", + "615f61338c8ca176d6445574", "Step 38" ], [ - "615f671b6d1919792745aa5d", + "615f666ac5edea782feb7e75", "Step 39" ], [ - "615f6823d0815b7a991f2a75", + "615f671b6d1919792745aa5d", "Step 40" ], [ - "615f6a7d4ba8037bc086c2c7", + "635bde33c91c80540eae239b", "Step 41" ], [ - "615f6b2d164f81809efd9bdc", + "615f6823d0815b7a991f2a75", "Step 42" ], [ - "615f6cc778f7698258467596", + "615f6b2d164f81809efd9bdc", "Step 43" ], [ - "615f6fddaac1e083502d3e6a", + "615f6cc778f7698258467596", "Step 44" ], [ - "615f70077a4ff98424236c1e", + "615f6fddaac1e083502d3e6a", "Step 45" ], [ - "615f72a872354a850d4f533e", + "615f70077a4ff98424236c1e", "Step 46" ], [ - "615f74a71f1e498619e38ee8", + "615f72a872354a850d4f533e", "Step 47" ], [ - "615f7ad94380408d971d14f6", + "615f74a71f1e498619e38ee8", "Step 48" ], [ - "615f7bc680f7168ea01ebf99", + "615f7ad94380408d971d14f6", "Step 49" ], [ - "615f7c71eab8218f846e4503", + "615f7bc680f7168ea01ebf99", "Step 50" ], [ - "615f7d489a581590d1350288", + "615f7c71eab8218f846e4503", "Step 51" ], [ - "615f7de4487b64919bb4aa5e", + "615f7d489a581590d1350288", "Step 52" ], [ - "615f7e7281626a92bbd62da8", + "615f7de4487b64919bb4aa5e", "Step 53" ], [ - "615f7ecb09de9a938ef94756", + "615f7e7281626a92bbd62da8", "Step 54" ], [ - "615f7fa959ab75948f96a0d6", + "615f7ecb09de9a938ef94756", "Step 55" ], [ - "615f808d85793195b0f53be9", + "615f7fa959ab75948f96a0d6", "Step 56" ], [ - "615f829d07b18f96f6f6684b", + "615f808d85793195b0f53be9", "Step 57" ], [ - "615f83ef928ec9982b785b6a", + "615f829d07b18f96f6f6684b", "Step 58" ], [ - "615f84f246e8ba98e3cd97be", + "615f83ef928ec9982b785b6a", "Step 59" ], [ - "615f887466db4ba14b5342cc", + "615f84f246e8ba98e3cd97be", "Step 60" ], [ - "615f89e055040ba294719d2f", + "615f887466db4ba14b5342cc", "Step 61" ], [ - "615f8bfe0f30a1a3c340356b", + "615f89e055040ba294719d2f", "Step 62" ], [ - "615f8f1223601fa546e93f31", + "615f8bfe0f30a1a3c340356b", "Step 63" ], [ - "615f905fbd1017a65ca224eb", + "615f8f1223601fa546e93f31", "Step 64" ], [ - "615f94786869e1a7fec54375", + "615f905fbd1017a65ca224eb", "Step 65" ], [ - "615f951dff9317a900ef683f", + "615f94786869e1a7fec54375", "Step 66" + ], + [ + "615f951dff9317a900ef683f", + "Step 67" ] ] -} +} \ No newline at end of file diff --git a/curriculum/challenges/_meta/the-odin-project/meta.json b/curriculum/challenges/_meta/the-odin-project/meta.json new file mode 100644 index 00000000000..a3f85b99c98 --- /dev/null +++ b/curriculum/challenges/_meta/the-odin-project/meta.json @@ -0,0 +1,124 @@ +{ + "name": "The Odin Project", + "isUpcomingChange": true, + "dashedName": "the-odin-project", + "order": 5, + "time": "", + "template": "", + "required": [], + "superBlock": "coding-interview-prep", + "challengeOrder": [ + [ + "6374f208de18c50e48ba767b", + "Introduction To HTML and CSS Question A" + ], + [ + "6376327e2724a688c04636e3", + "Introduction To HTML and CSS Question B" + ], + [ + "637633162724a688c04636e4", + "Introduction To HTML and CSS Question C" + ], + [ + "637633672724a688c04636e5", + "Introduction To HTML and CSS Question D" + ], + [ + "637f4e0e72c65bc8e73dfe1e", + "Elements and Tags Question A" + ], + [ + "637f4e1672c65bc8e73dfe1f", + "Elements and Tags Question B" + ], + [ + "637f4e1c72c65bc8e73dfe20", + "HTML Boilerplate Question A" + ], + [ + "637f4e2872c65bc8e73dfe21", + "HTML Boilerplate Question B" + ], + [ + "637f4e2f72c65bc8e73dfe22", + "HTML Boilerplate Question C" + ], + [ + "637f4e3672c65bc8e73dfe23", + "HTML Boilerplate Question D" + ], + [ + "637f4e5872c65bc8e73dfe27", + "Working With Text Question A" + ], + [ + "637f4e5f72c65bc8e73dfe28", + "Working With Text Question B" + ], + [ + "637f4e6672c65bc8e73dfe29", + "Working With Text Question C" + ], + [ + "637f4e6e72c65bc8e73dfe2a", + "Working With Text Question D" + ], + [ + "637f4e7972c65bc8e73dfe2b", + "Working With Text Question E" + ], + [ + "637f4e8072c65bc8e73dfe2c", + "Working With Text Question F" + ], + [ + "637f4e8772c65bc8e73dfe2d", + "Working With Text Question G" + ], + [ + "637f4e3e72c65bc8e73dfe24", + "Understand Ordered and Unordered List Question A" + ], + [ + "637f4e4672c65bc8e73dfe25", + "Understand Ordered and Unordered List Question B" + ], + [ + "637f4e5172c65bc8e73dfe26", + "Understand ordered and Unordered List Question C" + ], + [ + "637f704072c65bc8e73dfe36", + "Links and Images Question A" + ], + [ + "637f703572c65bc8e73dfe35", + "Links and Images Question B" + ], + [ + "637f703072c65bc8e73dfe34", + "Links and Images Question C" + ], + [ + "637f702872c65bc8e73dfe33", + "Links and Images Question D" + ], + [ "637f702372c65bc8e73dfe32", + "Links and Images Question E" + ], + [ "637f701c72c65bc8e73dfe31", + "Links and Images Question F" + ], + [ "637f701572c65bc8e73dfe30", + "Links and Images Question G" + ], + [ "637f700b72c65bc8e73dfe2f", + "Links and Images Question D" + ], + [ + "6391d1a4f7ac71efd0621380", + "Build a Recipe Page Project" + ] + ] +} \ No newline at end of file diff --git a/curriculum/challenges/arabic/00-certifications/front-end-development-libraries-certification/front-end-development-libraries-certification.yml b/curriculum/challenges/arabic/00-certifications/front-end-development-libraries-certification/front-end-development-libraries-certification.yml index e00138af76c..b65e0f5cbfe 100644 --- a/curriculum/challenges/arabic/00-certifications/front-end-development-libraries-certification/front-end-development-libraries-certification.yml +++ b/curriculum/challenges/arabic/00-certifications/front-end-development-libraries-certification/front-end-development-libraries-certification.yml @@ -13,10 +13,10 @@ tests: title: بناء عارض Markdown - id: 587d7dbc367417b2b2512bae - title: بناء آلة الدرامز + title: أنشئ آلة الطبول - id: bd7158d8c442eddfaeb5bd17 - title: بناء آلة حاسبة بإستخدام JavaScript + title: ابن آلة حاسبة باستخدام JavaScript - id: bd7158d8c442eddfaeb5bd0f title: بناء ساعة 25 + 5 diff --git a/curriculum/challenges/arabic/00-certifications/javascript-algorithms-and-data-structures-certification/javascript-algorithms-and-data-structures-certification.yml b/curriculum/challenges/arabic/00-certifications/javascript-algorithms-and-data-structures-certification/javascript-algorithms-and-data-structures-certification.yml index 3349d7cd478..dbfa713d1db 100644 --- a/curriculum/challenges/arabic/00-certifications/javascript-algorithms-and-data-structures-certification/javascript-algorithms-and-data-structures-certification.yml +++ b/curriculum/challenges/arabic/00-certifications/javascript-algorithms-and-data-structures-certification/javascript-algorithms-and-data-structures-certification.yml @@ -7,16 +7,16 @@ isPrivate: true tests: - id: aaa48de84e1ecc7c742e1124 - title: فاحص الـ Palindrome + title: مدقق لمعاكس المقطع النصي - id: a7f4d8f2483413a6ce226cac - title: محول الأرقام الرومانية + title: محول للأرقام الرومانية - id: 56533eb9ac21ba0edf2244e2 - title: شفرة قيصر (Caesars Cipher) + title: شفرة قيصر - id: aff0395860f5d3034dc0bfc9 - title: مدقق رقم الهاتف + title: مدقق لرقم الهاتف - id: aa2e6f85cab2ab736c9a9b24 - title: ماكينة تسجيل المدفوعات النقدية + title: مكنة لتسجيل النقود diff --git a/curriculum/challenges/arabic/00-certifications/legacy-front-end-certification/legacy-front-end-certification.yml b/curriculum/challenges/arabic/00-certifications/legacy-front-end-certification/legacy-front-end-certification.yml index 41c89333ec8..25e29896e5d 100644 --- a/curriculum/challenges/arabic/00-certifications/legacy-front-end-certification/legacy-front-end-certification.yml +++ b/curriculum/challenges/arabic/00-certifications/legacy-front-end-certification/legacy-front-end-certification.yml @@ -1,13 +1,13 @@ --- id: 561add10cb82ac38a17513be -title: شهادة الواجهة الأمامية القديمة +title: شهادة الواجهة الأمامية التراثية certification: legacy-front-end challengeType: 7 isPrivate: true tests: - id: bd7158d8c242eddfaeb5bd13 - title: قم ببناء صفحة ويب لعرض نماذج الأعمال الشخصية + title: أنشئ معرضا لأعمالك الخاصة - id: bd7158d8c442eddfaeb5bd13 title: قم ببناء آلة عرض اقتباسات عشوائية @@ -16,7 +16,7 @@ tests: title: قم ببناء ساعة 25 + 5 - id: bd7158d8c442eddfaeb5bd17 - title: بناء آلة حاسبة بإستخدام JavaScript + title: بناء آلة حاسبة باستخدام JavaScript - id: bd7158d8c442eddfaeb5bd10 title: إظهار الطقس المحلي diff --git a/curriculum/challenges/arabic/00-certifications/legacy-full-stack-certification/legacy-full-stack-certification.yml b/curriculum/challenges/arabic/00-certifications/legacy-full-stack-certification/legacy-full-stack-certification.yml index e9ca5686706..d22c82b228b 100644 --- a/curriculum/challenges/arabic/00-certifications/legacy-full-stack-certification/legacy-full-stack-certification.yml +++ b/curriculum/challenges/arabic/00-certifications/legacy-full-stack-certification/legacy-full-stack-certification.yml @@ -1,6 +1,6 @@ --- id: 561add10cb82ac38a17213bd -title: شهادة الـ Full Stack القديمة +title: شهادة الـ Full Stack التراثية certification: legacy-full-stack challengeType: 7 isPrivate: true @@ -13,13 +13,13 @@ tests: title: شهادة الخوارزميات وهياكل البيانات في JavaScript - id: 561acd10cb82ac38a17513bc - title: شهادة مكتبات تطوير واجهة المستخدم (Front End Libraries) + title: شهادة مكتبات Front End - id: 5a553ca864b52e1d8bceea14 - title: شهادة Data Visualization + title: شهادة التصور المرئي للبيانات - id: 561add10cb82ac38a17523bc - title: شهادة API's and Microservice + title: شهادة واجهة برمجة التطبيقات (API) والخدمات المصغّرة - id: 561add10cb82ac38a17213bc - title: شهادة أمن المعلومات القديمة وشهادة ضمان الجودة + title: شهادة أمن المعلومات التراثية وشهادة ضمان الجودة diff --git a/curriculum/challenges/arabic/00-certifications/legacy-information-security-and-quality-assurance-certification/legacy-information-security-and-quality-assurance-certification.yml b/curriculum/challenges/arabic/00-certifications/legacy-information-security-and-quality-assurance-certification/legacy-information-security-and-quality-assurance-certification.yml index 66f533142b3..60777ae9607 100644 --- a/curriculum/challenges/arabic/00-certifications/legacy-information-security-and-quality-assurance-certification/legacy-information-security-and-quality-assurance-certification.yml +++ b/curriculum/challenges/arabic/00-certifications/legacy-information-security-and-quality-assurance-certification/legacy-information-security-and-quality-assurance-certification.yml @@ -1,6 +1,6 @@ --- id: 561add10cb82ac38a17213bc -title: شهادة أمن المعلومات القديمة وشهادة ضمان الجودة +title: شهادة أمن المعلومات التراثية وشهادة ضمان الجودة certification: legacy-information-security-and-quality-assurance challengeType: 7 isPrivate: true diff --git a/curriculum/challenges/arabic/00-certifications/responsive-web-design-certification/responsive-web-design-certification.yml b/curriculum/challenges/arabic/00-certifications/responsive-web-design-certification/responsive-web-design-certification.yml index 341301ba269..e8e2df55dc5 100644 --- a/curriculum/challenges/arabic/00-certifications/responsive-web-design-certification/responsive-web-design-certification.yml +++ b/curriculum/challenges/arabic/00-certifications/responsive-web-design-certification/responsive-web-design-certification.yml @@ -7,7 +7,7 @@ isPrivate: true tests: - id: bd7158d8c442eddfaeb5bd18 - title: بناء صفحة تحية + title: أنشئ مشروع صفحة الثناء - id: 587d78af367417b2b2512b03 title: بناء نموذج استطلاع رأي @@ -16,7 +16,7 @@ tests: title: بناء الصفحة الرئيسة لمنتج - id: 587d78b0367417b2b2512b05 - title: أنشئ صفحة التوثيق الفني + title: أنشئ صفحة التوثيق التقنية - id: bd7158d8c242eddfaeb5bd13 - title: قم ببناء مشروع صفحة ويب لعرض نماذج الاعمال الشخصية + title: أنشئ معرضا لأعمالك الخاصة diff --git a/curriculum/challenges/arabic/01-responsive-web-design/applied-accessibility/give-links-meaning-by-using-descriptive-link-text.md b/curriculum/challenges/arabic/01-responsive-web-design/applied-accessibility/give-links-meaning-by-using-descriptive-link-text.md index 91ab935f674..f282a55ad02 100644 --- a/curriculum/challenges/arabic/01-responsive-web-design/applied-accessibility/give-links-meaning-by-using-descriptive-link-text.md +++ b/curriculum/challenges/arabic/01-responsive-web-design/applied-accessibility/give-links-meaning-by-using-descriptive-link-text.md @@ -11,11 +11,11 @@ dashedName: give-links-meaning-by-using-descriptive-link-text Screen reader users have various options for what type of content their device reads. These options include skipping to (or over) landmark elements, jumping to the main content, or getting a page summary from the headings. Another option is to only hear the links available on a page. -Screen readers do this by reading the link text, or what's between the anchor (`a`) tags. Having a list of "click here" or "read more" links isn't helpful. Instead, use brief but descriptive text within the `a` tags to provide more meaning for these users. +قارئ الشاشة يفعل ذلك بقراءة نص الرابط، أو ما بين علامات الرابط (`a`). Having a list of "click here" or "read more" links isn't helpful. Instead, use brief but descriptive text within the `a` tags to provide more meaning for these users. # --instructions-- -The link text that Camper Cat is using is not very descriptive without the surrounding context. Move the anchor (`a`) tags so they wrap around the text `information about batteries` instead of `Click here`. +The link text that Camper Cat is using is not very descriptive without the surrounding context. انقل علامات الرابط (`a`) بحيث تلتف حول النص `information about batteries` بدلاً من `Click here`. # --hints-- diff --git a/curriculum/challenges/arabic/01-responsive-web-design/applied-visual-design/adjust-the-hover-state-of-an-anchor-tag.md b/curriculum/challenges/arabic/01-responsive-web-design/applied-visual-design/adjust-the-hover-state-of-an-anchor-tag.md index 02f09a4e0b0..eba7cc36171 100644 --- a/curriculum/challenges/arabic/01-responsive-web-design/applied-visual-design/adjust-the-hover-state-of-an-anchor-tag.md +++ b/curriculum/challenges/arabic/01-responsive-web-design/applied-visual-design/adjust-the-hover-state-of-an-anchor-tag.md @@ -1,6 +1,6 @@ --- id: 587d781d367417b2b2512ac8 -title: Adjust the Hover State of an Anchor Tag +title: اضبط حالة التأشير بالحوم في علامة الرابط challengeType: 0 videoUrl: 'https://scrimba.com/c/cakRGcm' forumTopicId: 301035 @@ -25,7 +25,7 @@ The code editor has a CSS rule to style all `a` tags black. Add a rule so that w # --hints-- -يجب أن تبقى علامة الرابط `color` سوداء, أضف الفئة الزائفة `:hover` من قواعد CSS فقط. +علامة الرابط `color` يجب أن تبقى سوداء. فقط أضف قواعد CSS لدولة `:hover`. ```js assert($('a').css('color') == 'rgb(0, 0, 0)'); diff --git a/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/fill-in-the-blank-with-placeholder-text.md b/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/fill-in-the-blank-with-placeholder-text.md index b9a9509f8ea..e48285eea70 100644 --- a/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/fill-in-the-blank-with-placeholder-text.md +++ b/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/fill-in-the-blank-with-placeholder-text.md @@ -13,7 +13,7 @@ Web developers traditionally use lorem ipsum text as placeholder text Lorem ipsum text has been used as placeholder text by typesetters since the 16th century, and this tradition continues on the web. -Well, 5 centuries is long enough. Since we're building a CatPhotoApp, let's use something called "kitty ipsum" text. +Well, 5 centuries is long enough. بما أنك تنشئ برنامج CatPhotoApp، استخدم نص "kitty ipsum". # --instructions-- diff --git a/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/link-to-external-pages-with-anchor-elements.md b/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/link-to-external-pages-with-anchor-elements.md index 73a3eaed90b..b9d927d2707 100644 --- a/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/link-to-external-pages-with-anchor-elements.md +++ b/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/link-to-external-pages-with-anchor-elements.md @@ -1,6 +1,6 @@ --- id: bad87fee1348bd9aedf08816 -title: Link to External Pages with Anchor Elements +title: الربط بصفحات خارجية بواسطة العناصر Anchor challengeType: 0 videoUrl: 'https://scrimba.com/p/pVMPUv/c8EkncB' forumTopicId: 18226 @@ -11,7 +11,7 @@ dashedName: link-to-external-pages-with-anchor-elements You can use `a` (*anchor*) elements to link to content outside of your web page. -`a` elements need a destination web address called an `href` attribute. They also need anchor text. Here's an example: +عناصر `a` تتطلّب عنوان وب للوجهة يسمّى: `href`. وتتطلّب أيضا نصّ رابط anchor. Here's an example: ```html this links to freecodecamp.org @@ -21,11 +21,11 @@ Then your browser will display the text `this links to freecodecamp.org` as a li # --instructions-- -Create an `a` element that links to `https://www.freecatphotoapp.com` and has "cat photos" as its anchor text. +قم بإنشاء عنصر `a` الذي يربط بـ `https://www.freecatphotoapp.com` والذي يحتوي على "صور قطط" كنص الرابط. # --hints-- -Your `a` element should have the anchor text of `cat photos`. +يجب أن يحتوي عنصر `a` الخاص بك على نص الرابط `cat photos`. ```js assert(/cat photos/gi.test($('a').text())); diff --git a/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/turn-an-image-into-a-link.md b/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/turn-an-image-into-a-link.md index 94fd61e4930..5fd409a9ced 100644 --- a/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/turn-an-image-into-a-link.md +++ b/curriculum/challenges/arabic/01-responsive-web-design/basic-html-and-html5/turn-an-image-into-a-link.md @@ -21,7 +21,7 @@ Remember to use `#` as your `a` element's `href` property in order to turn it in # --instructions-- -Place the existing image element within an `a` (*anchor*) element. +ضع عنصر الصورة داخل عنصر `a` (*anchor*) الحالي. Once you've done this, hover over your image with your cursor. Your cursor's normal pointer should become the link clicking pointer. The photo is now a link. diff --git a/curriculum/challenges/arabic/01-responsive-web-design/responsive-web-design-projects/build-a-personal-portfolio-webpage.md b/curriculum/challenges/arabic/01-responsive-web-design/responsive-web-design-projects/build-a-personal-portfolio-webpage.md index afe98f114e4..4050a8f54d5 100644 --- a/curriculum/challenges/arabic/01-responsive-web-design/responsive-web-design-projects/build-a-personal-portfolio-webpage.md +++ b/curriculum/challenges/arabic/01-responsive-web-design/responsive-web-design-projects/build-a-personal-portfolio-webpage.md @@ -1,6 +1,6 @@ --- id: bd7158d8c242eddfaeb5bd13 -title: Build a Personal Portfolio Webpage +title: أنشئ معرضا لأعمالك الخاصة challengeType: 14 forumTopicId: 301143 dashedName: build-a-personal-portfolio-webpage diff --git a/curriculum/challenges/arabic/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md b/curriculum/challenges/arabic/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md index 1dbc840e0bb..a36f6c5daf1 100644 --- a/curriculum/challenges/arabic/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md +++ b/curriculum/challenges/arabic/01-responsive-web-design/responsive-web-design-projects/build-a-product-landing-page.md @@ -1,6 +1,6 @@ --- id: 587d78af367417b2b2512b04 -title: Build a Product Landing Page +title: أنشئ صفحة لعرض المنتج challengeType: 14 forumTopicId: 301144 dashedName: build-a-product-landing-page diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md index a4f5d5ea085..eb80337ecab 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-algorithm-scripting/convert-celsius-to-fahrenheit.md @@ -10,7 +10,7 @@ dashedName: convert-celsius-to-fahrenheit معادلة تحويل درجة الحرارة من الدرجة المئوية إلى درجة فهرنهايت هي: درجة الحرارة المئوية مضروبة في `9/5`, مضاف إليها `32`. -لديك المتغير `celsius` ويمثل درجة الحرارة المئوية. استخدم المتغير `fahrenheit` الذي سبق تعريفه وعيّن درجة حرارة فهرنهايت المعادلة لدرجة الحرارة المئوية المعطاة. استخدم المعادلة في السطر الأول، لتحويل درجة الحرارة المئوية إلى فهرنهايت. +لديك المتغير `celsius` ويمثل درجة الحرارة المئوية. استخدم المتغير `fahrenheit` الذي سبق أعلانه وعيّن درجة حرارة فهرنهايت المعادلة لدرجة الحرارة المئوية المعطاة. استخدم المعادلة في السطر الأول، لتحويل درجة الحرارة المئوية إلى فهرنهايت. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/access-an-arrays-contents-using-bracket-notation.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/access-an-arrays-contents-using-bracket-notation.md index 7b6010e1202..6c2adb2f176 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/access-an-arrays-contents-using-bracket-notation.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/access-an-arrays-contents-using-bracket-notation.md @@ -1,6 +1,6 @@ --- id: 5a661e0f1068aca922b3ef17 -title: الوصول إلى محتويات القائمة (Array) باستخدام رمز القوس (Bracket Notation) +title: الوصول إلى محتويات القائمة (Array) باستخدام علامات الأقواس (Bracket Notation) challengeType: 1 forumTopicId: 301149 dashedName: access-an-arrays-contents-using-bracket-notation @@ -16,7 +16,7 @@ dashedName: access-an-arrays-contents-using-bracket-notation let ourArray = ["a", "b", "c"]; ``` -في القائمة، يحتوي كل عنصر على ترتيب index. هذا الترتيب يتضاعف كموقع ذلك العنصر في القائمة، وكيف تشير إليه. ومع ذلك، من المهم ملاحظة أن القائمات JavaScript هي قائمات مترتبة من الصفر، بمعنى أن العنصر الأول للقائمة هو في الواقع في موضع ***صفر*** وليس الأول. من أجل استرجاع عنصر من قائمة يمكننا إرفاق ترتيب بين قوسين وإلحاقه إلى نهاية القائمة، أو أكثر شيوعاً، إلى متغير يشير إلى كائن من نوع قائمة. هذا معروف باسم رمز الاقواس bracket notation. على سبيل المثال، إذا أردنا استرداد `a` من `ourArray`و تعيينه إلى متغير، يمكننا أن نفعل ذلك بواسطة التعليمات البرمجية التالية: +في القائمة، يحتوي كل عنصر على ترتيب index. هذا الترتيب يتضاعف كموقع ذلك العنصر في القائمة، وكيف تشير إليه. ومع ذلك، من المهم ملاحظة أن القائمات JavaScript هي قائمات مترتبة من الصفر، بمعنى أن العنصر الأول للقائمة هو في الواقع في موضع ***صفر*** وليس الأول. من أجل استرجاع عنصر من قائمة يمكننا إرفاق ترتيب بين قوسين وإلحاقه إلى نهاية القائمة، أو أكثر شيوعاً، إلى متغير يشير إلى كائن من نوع قائمة. هذا معروف باسم علامات الأقواس bracket notation. على سبيل المثال، إذا أردنا استرداد `a` من `ourArray`و تعيينه إلى متغير، يمكننا أن نفعل ذلك بواسطة التعليمات البرمجية التالية: ```js let ourVariable = ourArray[0]; @@ -30,7 +30,7 @@ let ourVariable = ourArray[0]; ourArray[1] = "not b anymore"; ``` -باستخدام رمز الأقواس، قمنا الآن بإعادة تعيين العنصر في الترتيب 1 من السلسلة `b`، إلى `not b anymore`. الآن `ourArray` هو `["a", "not b anymore", "c"]`. +باستخدام علامات الأقواس، قمنا الآن بإعادة تعيين العنصر في الترتيب 1 من المقطع النصي `b`، إلى `not b anymore`. الآن `ourArray` هو `["a", "not b anymore", "c"]`. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/access-property-names-with-bracket-notation.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/access-property-names-with-bracket-notation.md index 194fd0634aa..4a3264ba55a 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/access-property-names-with-bracket-notation.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/access-property-names-with-bracket-notation.md @@ -8,7 +8,7 @@ dashedName: access-property-names-with-bracket-notation # --description-- -في تحدي الكائن الأول ذكرنا استخدام رمز القوس كوسيلة للوصول إلى قيم الخاصية باستخدام تقييم متغير. على سبيل المثال، تخيل أن كائن `foods` الخاص بنا يتم استخدامه في برنامَج لتسجيل النقود في محل تجارة. لدينا وظيفة ما و التي تعين `selectedFood` ونحن نريد التحقق من كائن `foods` للتأكد من وجود ذلك الطعام. وقد يبدو ذلك كالتالي: +في تحدي الكائن الأول ذكرنا استخدام علامات الأقواس كوسيلة للوصول إلى قيم الخاصية باستخدام تقييم متغير. على سبيل المثال، تخيل أن كائننا `foods` يستخدمه مكنة لتسجيل النقود في محل تجارة. لدينا وظيفة ما و التي تعين `selectedFood` ونحن نريد التحقق من كائن `foods` للتأكد من وجود ذلك الطعام. وقد يبدو ذلك كالتالي: ```js let selectedFood = getCurrentFood(scannedItem); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/add-key-value-pairs-to-javascript-objects.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/add-key-value-pairs-to-javascript-objects.md index a7f3d0e66ea..3a5ec8d77c0 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/add-key-value-pairs-to-javascript-objects.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/add-key-value-pairs-to-javascript-objects.md @@ -81,7 +81,7 @@ assert(foods.grapes === 35); assert(foods.strawberries === 27); ``` -يجب تعيين أزواج key-value باستخدام dot او bracket notation. +يجب تعيين أزواج key-value باستخدام dot او علامات الأقواس. ```js assert( diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md index 6dbf7852374..af68bb2ae75 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/create-complex-multi-dimensional-arrays.md @@ -8,7 +8,7 @@ dashedName: create-complex-multi-dimensional-arrays # --description-- -رائع! لقد تعلمت للتو طناً من المعلومات عن القوائم (arrays)! لقد كانت هذه النِّظْرة عامة عالية المستوى إلى حد ما، وهناك الكثير لتتعلمه حول العمل مع القائمات، التي سترى الكثير منها في الأقسام اللاحقة. ولكن قبل الانتقال إلى كائنات (Objects)، دعنا نلقي النِّظْرة أخرى ونرى كيف يمكن أن تصبح القوائم (arrays) أكثر تعقيدًا قليلاً مما رأيناه في التحديات السابقة. +رائع! لقد تعلمت للتو طناً من المعلومات عن القوائم (arrays)! لقد كانت هذه النِّظْرة عامة عالية المستوى إلى حد ما، وهناك الكثير لتتعلمه حول العمل مع القوائم، التي سترى الكثير منها في الأقسام اللاحقة. ولكن قبل الانتقال إلى كائنات (Objects)، دعنا نلقي النِّظْرة أخرى ونرى كيف يمكن أن تصبح القوائم (arrays) أكثر تعقيدًا قليلاً مما رأيناه في التحديات السابقة. واحدة من أقوى السمات عند التفكير في القوائم كهياكل للبيانات، هو أن القوائم يمكن أن تحتوي، أو حتى إن تكون مكونة بالكامل من قوائم أخرى. ورأيت القوائم التي تحتوي على قوائم في تحديات سابقة، ولكنها بسيطة إلى حد ما. ومع ذلك، فإن القوائم يمكن أن تحتوي على عمق لا حدود له من القوائم التي يمكن أن تحتوي على قوائم أخرى، لكل منها مستويات عشوائية من العمق وما إلى ذلك. بهذه الطريقة، يمكن للقائمة أن تصبح بسرعة هيكل بيانات معقد جداً، يعرف باسم عديد الأبعاد (multi-dimensional) أو قائمة متداخلة (nested array). انظر إلى المثال التالي: @@ -33,7 +33,7 @@ let nestedArray = [ قائمة `deep` متداخلة على مستويين عميقين. قوائم `deeper` بعمق 3 مستويات. قوائم `deepest` هي 4 مستويات، و `deepest-est?` هي 5 مستويات. -وفي حين أن هذا المثال قد يبدو متشابكا فإن هذا المستوى من التعقيد ليس مستغربا أو غير عادي عند التعامل مع كميات كبيرة من البيانات. ومع ذلك، لا يزال بإمكاننا الوصول بسهولة إلى أعمق مستويات قائمة بهذا التعقيد باستخدام رمز القوس: +وفي حين أن هذا المثال قد يبدو متشابكا فإن هذا المستوى من التعقيد ليس مستغربا أو غير عادي عند التعامل مع كميات كبيرة من البيانات. ومع ذلك، لا يزال بإمكاننا الوصول بسهولة إلى أعمق مستويات قائمة بهذا التعقيد علامات الأقواس: ```js console.log(nestedArray[2][1][0][0][0]); @@ -51,7 +51,7 @@ console.log(nestedArray[2][1][0][0][0]); # --instructions-- -لقد حددنا متغير `myNestedArray`، يساويا لقائمة. عدل `myNestedArray` باستخدام أي مجموعة من مقاطع نصية (strings)، و أرقام (numbers)، و حالات (booleans) لعناصر البيانات، بحيث يكون لديها على وجه التحديد خمس مستويات من العمق (تذكر، أن القائمة الخارجية هي المستوى 1). في مكان ما على المستوى الثالث ضف المقطع `deep`, وعلى المستوى الرابع ضف المقطع `deeper`, وعلى المستوى الخامس ضف المقطع `deepest`. +لقد أعلنا متغير `myNestedArray`، مساويا لقائمة. عدل `myNestedArray` باستخدام أي مجموعة من مقاطع نصية (strings)، و أرقام (numbers)، و حالات (booleans) لعناصر البيانات، بحيث يكون لديها على وجه التحديد خمس مستويات من العمق (تذكر، أن القائمة الخارجية هي المستوى 1). في مكان ما على المستوى الثالث ضف المقطع `deep`, وعلى المستوى الرابع ضف المقطع `deeper`, وعلى المستوى الخامس ضف المقطع `deepest`. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/modify-an-object-nested-within-an-object.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/modify-an-object-nested-within-an-object.md index f3a9f1376c7..8a43399533e 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/modify-an-object-nested-within-an-object.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/modify-an-object-nested-within-an-object.md @@ -58,7 +58,7 @@ assert('totalUsers' in userActivity.data && 'online' in userActivity.data); assert(userActivity.data.online === 45); ``` -يجب تعيين خاصية `online` باستخدام dot او bracket notation. +يجب تعيين خاصية `online` باستخدام dot او علامات الأقواس. ```js assert.strictEqual(code.search(/online: 45/), -1); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/use-an-array-to-store-a-collection-of-data.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/use-an-array-to-store-a-collection-of-data.md index ef3dbe392a7..6c7c2515bec 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/use-an-array-to-store-a-collection-of-data.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-data-structures/use-an-array-to-store-a-collection-of-data.md @@ -46,7 +46,7 @@ let complexArray = [ # --instructions-- -لقد حددنا متغير يسمى `yourArray`. أكمل البيان بتعيين array من 5 عناصر في الأقل في الطول لمتغير `yourArray`. يجب أن تحتوي array على stringواحد علي الأفل و number واحد و boolean واحد. +لقد أعلنا متغير يسمى `yourArray`. أكمل البيان بتعيين array من 5 عناصر في الأقل في الطول لمتغير `yourArray`. يجب أن تحتوي array على stringواحد علي الأفل و number واحد و boolean واحد. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/access-array-data-with-indexes.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/access-array-data-with-indexes.md index f7ec3c9a182..e396699f03a 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/access-array-data-with-indexes.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/access-array-data-with-indexes.md @@ -1,6 +1,6 @@ --- id: 56bbb991ad1ed5201cd392ca -title: الوصول إلى بيانات القائمة باستخدام الترتيب (Access Array Data with Indexes) +title: الوصول إلى بيانات القائمة باستخدام الترتيب challengeType: 1 videoUrl: 'https://scrimba.com/c/cBZQbTz' forumTopicId: 16158 diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md index b0449ba0401..3124db6d016 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/access-multi-dimensional-arrays-with-indexes.md @@ -1,6 +1,6 @@ --- id: 56592a60ddddeae28f7aa8e1 -title: الوصول إلى القائمات المتعددة الأبعاد باستخدام الترتيب (Access Multi-Dimensional Arrays With Indexes) +title: الوصول إلى القائمات المتعددة الأبعاد باستخدام الترتيب challengeType: 1 videoUrl: 'https://scrimba.com/c/ckND4Cq' forumTopicId: 16159 @@ -32,7 +32,7 @@ const element = arr[3][0][1]; # --instructions-- -باستخدام bracket notation، اختر عنصرا من `myArray` بحيث أن `myData` يساوي `8`. +اختر عنصرا من `myArray` باستخدام علامات الأقواس بحيث أن `myData` يساوي `8`. # --hints-- @@ -42,7 +42,7 @@ const element = arr[3][0][1]; assert(myData === 8); ``` -يجب أن تستخدم bracket notation لقراءة القيمة الصحيحة من `myArray`. +يجب أن تستخدم علامات الأقواس لقراءة القيمة الصحيحة من `myArray`. ```js assert(/myData=myArray\[2\]\[1\]/.test(__helpers.removeWhiteSpace(code))); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-nested-arrays.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-nested-arrays.md index 5e9191d2f49..622ba4ba131 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-nested-arrays.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-nested-arrays.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244cd -title: الوصول إلى القائمات المتداخلة (Accessing Nested Arrays) +title: الوصول إلى القائمات المتداخلة challengeType: 1 videoUrl: 'https://scrimba.com/c/cLeGDtZ' forumTopicId: 16160 @@ -41,7 +41,7 @@ ourPets[1].names[0]; # --instructions-- -باستخدام dot و bracket notation، وعيّن المتغير `secondTree` إلى العنصر الثاني في قائمة `trees` من object باسم `myPlants`. +استخدم dot و علامات الأقواس, لتعيّن المتغير `secondTree` إلى العنصر الثاني في قائمة `trees` من object باسم `myPlants`. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-bracket-notation.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-bracket-notation.md index 095d4fe8801..0d152807800 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-bracket-notation.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-bracket-notation.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244c8 -title: الوصول خصائص (Properties) الكائن (Object) بواسطة Bracket Notation +title: الوصول لخصائص (Properties) الكائن (Object) بواسطة استخدام dot و علامات الأقواس challengeType: 1 videoUrl: 'https://scrimba.com/c/cBvmEHP' forumTopicId: 16163 @@ -9,11 +9,11 @@ dashedName: accessing-object-properties-with-bracket-notation # --description-- -الطريقة الثانية للوصول إلى خصائص الكائن هي القوسان المعكوفان (`[]`). في حال إن خاصية الكائن الذي تحاول الوصول إليه يحتوي على مسافة في اسمه, سوف تحتاج إلى استخدام القوسان المعكوفان (bracket notation). +الطريقة الثانية للوصول إلى خصائص الكائن هي استخدام علامات الأقواس (`[]`). في حال إن خاصية الكائن الذي تحاول الوصول إليه يحتوي على مسافة في اسمه, سوف تحتاج إلى استخدام علامات الأقواس (bracket notation). على أية حال, فانه يمكنك أستخدام bracket notation على خصائص الكائن من دون مسافات. -هذا مثال على استخدام bracket notation لقراءة خاصية الكائن: +هذا مثال على استخدام علامات الأقواس لقراءة خاصية الكائن: ```js const myObj = { @@ -33,7 +33,7 @@ myObj["NoSpace"]; # --instructions-- -أقراء قيم خصائص `an entree` و `the drink` في `testObj` باستخدام القوسان المعكوفان وتعينهم إلى `entreeValue` و `drinkValue` على التوالي. +أقراء قيم خصائص `an entree` و `the drink` في `testObj` باستخدام علامات الأقواس وعينهم إلى `entreeValue` و `drinkValue` على التوالي. # --hints-- @@ -61,7 +61,7 @@ assert(typeof drinkValue === 'string'); assert(drinkValue === 'water'); ``` -يجب عليك أستخدام القوسان المعكوفان مرتين +يجب عليك أستخدام علامات الأقواس مرتين ```js assert(code.match(/testObj\s*?\[('|")[^'"]+\1\]/g).length > 1); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-dot-notation.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-dot-notation.md index 140c7560b18..431232abff1 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-dot-notation.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-dot-notation.md @@ -9,7 +9,7 @@ dashedName: accessing-object-properties-with-dot-notation # --description-- -هناك طريقتان للوصول إلى خصائص الكائن: نقطة التأشير (`.`) وتدوين الأقواس (`[]`)، على غرار القائمة. +هناك طريقتان للوصول إلى خصائص الكائن: نقطة التأشير (`.`) و علامات الأقواس (`[]`)، على غرار القائمة. ترميز النقطة هو ما تستخدمه عندما تعرف اسم الخاصية التي تحاول الوصول إليها مسبقاً. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-variables.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-variables.md index 37c8d3ad711..53bde20f3e3 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-variables.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/accessing-object-properties-with-variables.md @@ -9,7 +9,7 @@ dashedName: accessing-object-properties-with-variables # --description-- -وثمة استخدام آخر لترميز آلأقواس للوصول إلى الخصائص المخزنة كقيمة للمتغير. يمكن أن يكون هذا مفيداً جداً خلال تكرار خصائص الكائن أو عند الوصول إلى جدول البحث. +وثمة استخدام آخر لعلامات الأقواس للوصول إلى الخصائص المخزنة كقيمة للمتغير. يمكن أن يكون هذا مفيداً جداً خلال تكرار خصائص الكائن أو عند الوصول إلى جدول البحث. فيما يلي, مثال على استخدام متغير للوصول إلى خاصية ما: @@ -53,7 +53,7 @@ assert(typeof player === 'string'); assert(player === 'Montana'); ``` -يجب عليك استخدام ترميز ألأقواس للوصول إلى `testObj` +يجب عليك استخدام علامات الأقواس للوصول إلى `testObj` ```js assert(/testObj\s*?\[.*?\]/.test(code)); @@ -65,7 +65,7 @@ assert(/testObj\s*?\[.*?\]/.test(code)); assert(!code.match(/player\s*=\s*"|\'\s*Montana\s*"|\'\s*;/gi)); ``` -يجب أن تستخدم المتغير `playerNumber` في رمز القوس +يجب أن تستخدم المتغير `playerNumber` في علامات الأقواس ```js assert(/testObj\s*?\[\s*playerNumber\s*\]/.test(code)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/assigning-the-value-of-one-variable-to-another.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/assigning-the-value-of-one-variable-to-another.md index 534e1c7c510..d757a010d3a 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/assigning-the-value-of-one-variable-to-another.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/assigning-the-value-of-one-variable-to-another.md @@ -1,6 +1,6 @@ --- id: 5ee127a03c3b35dd45426493 -title: تعيين قيمة متغير إلى متغير آخر (Assigning the Value of One Variable to Another) +title: تعيين قيمة متغير إلى متغير آخر challengeType: 1 videoUrl: '' forumTopicId: 418265 @@ -9,7 +9,7 @@ dashedName: assigning-the-value-of-one-variable-to-another # --description-- -بعد تعيين قيمة إلى متغير باستخدام عملية تكليف (=)، يمكنك تعيين قيمة هذا المتغير إلى متغير آخر باستخدام عمليةتكليف (=) ذاتها. +بعد تعيين قيمة إلى متغير باستخدام مشغل التعيين (=)، يمكنك تعيين قيمة هذا المتغير إلى متغير آخر باستخدام مشغل التعيين (=) ذاتها. ```js var myVar; @@ -18,7 +18,7 @@ var myNum; myNum = myVar; ``` -ما ورد أعلنه يظهر تعريف المتغير `myVar` دون قيمة، ثم يخصص له قيمة `5`. بعد ذلك، يتم إعلان متغير آخر يدعى `myNum` دون قيمة. ثم يتم تعيين قيمة المتغير `myVar` (التي تساوي `5`) إلى المتغير `myNum`. الآن المتغير `myNum` لديه القيمة `5`. +ما ورد أعلى يعلن المتغير `myVar` دون قيمة، ثم يخصص له قيمة `5`. بعد ذلك، يتم إعلان متغير آخر يدعى `myNum` دون قيمة. ثم يتم تعيين قيمة المتغير `myVar` (التي تساوي `5`) إلى المتغير `myNum`. الآن المتغير `myNum` لديه القيمة `5`. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/comment-your-javascript-code.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/comment-your-javascript-code.md index 9e9f0282e7e..99b48c6e4c4 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/comment-your-javascript-code.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/comment-your-javascript-code.md @@ -1,6 +1,6 @@ --- id: bd7123c9c441eddfaeb4bdef -title: التعليق علي تعليماتك البرمجية في JavaScript +title: التعليق (Comment) في كودك من JavaScript challengeType: 1 removeComments: false videoUrl: 'https://scrimba.com/c/c7ynnTp' @@ -10,7 +10,7 @@ dashedName: comment-your-javascript-code # --description-- -التعليقات هي أسطر من التعليمات البرمجية التي سيتجاهلها JavaScript عمداً. التعليقات هي طريقة رائعة لترك الملاحظات لنفسك وللأشخاص الآخرين الذين سيحتاجون لاحقاً إلى معرفة ما تفعله تلك التعليمات البرمجية. +إن التعليقات أسطر من الكود التي سيتجاهلها JavaScript عمداً. إن التعليقات طريقة رائعة لترك الملاحظات لنفسك وللأشخاص الآخرين الذين سيحتاجون لاحقاً إلى معرفة ما يفعله ذلك الكود. هناك طريقتان لكتابة التعليقات في JavaScript: @@ -27,7 +27,7 @@ dashedName: comment-your-javascript-code multi-line comment */ ``` -**ملاحظة:** عند كتابة التعليمات البرمجية، يجب عليك إضافة تعليقات بانتظام لتوضيح وظيفة أجزاء من التعليمات البرمجية الخاص بك. التعليق الجيد يمكن أن يساعد على إيصال المغزى من التعليمات البرمجية الخاص بك - للآخرين *و* لنفسك في المستقبل. +**ملاحظة:** عند كتابة الكود، يجب عليك إضافة تعليقات بانتظام لتوضيح وظيفة أجزاء من كودك. التعليق الجيد يمكن أن يساعد على إيصال المغزى من كودك - للآخرين *و* لنفسك في المستقبل. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/comparison-with-the-equality-operator.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/comparison-with-the-equality-operator.md index ba99c3632e3..96d0c55b7ad 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/comparison-with-the-equality-operator.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/comparison-with-the-equality-operator.md @@ -22,7 +22,7 @@ function equalityTest(myVal) { } ``` -إذا كانت قيمة `myVal` تساوي `10`، عملية المساواة تعيد `true`، و بهذا سيتم تنفيذ التعليمات البرمجية في الأقواس، وستعيد الدالة `Equal`. وإلا فإن الوظيفة ستعيد `Not Equal`. لكي تقوم JavaScript بمقارنة نوعين مختلفين في ا نوع البيانات (على سبيل المثال، مقارنة بين نوع `numbers` و نوع `strings`)، يجب أن تحول احدمها إلى نوع الآخر. هذا يُعرف بالقسر النوع (Type Coercion). بمجرد فعل ذلك، يتمكن Javascript من المقارنة بين المصطلحات التالية: +إذا كانت قيمة `myVal` تساوي `10`، عملية المساواة تعيد `true`، و بهذا سيتم تنفيذ التعليمات البرمجية في الأقواس، وستعيد الوظيفة `Equal`. وإلا فإن الوظيفة ستعيد `Not Equal`. لكي تقوم JavaScript بمقارنة نوعين مختلفين في ا نوع البيانات (على سبيل المثال، مقارنة بين نوع `numbers` و نوع `strings`)، يجب أن تحول احدمها إلى نوع الآخر. هذا يُعرف بالقسر النوع (Type Coercion). بمجرد فعل ذلك، يتمكن Javascript من المقارنة بين المصطلحات التالية: ```js 1 == 1 // true diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/count-backwards-with-a-for-loop.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/count-backwards-with-a-for-loop.md index 8640a6e7e2e..98eb93fd0cb 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/count-backwards-with-a-for-loop.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/count-backwards-with-a-for-loop.md @@ -23,7 +23,7 @@ for (let i = 10; i > 0; i -= 2) { } ``` -سوف تحتوي `ourArray` الآن على `[10, 8, 6, 4, 2]`. غير التغيير البادئ (initialization) و التعبير الأخير (final expression) حتى نتمكن من العد إلى الوراء بمقدار اثنين لإنشاء قائمة (array) من الأعداد التنازلية الفردية. +سوف تحتوي `ourArray` الآن على `[10, 8, 6, 4, 2]`. غير التعبير البادئ (initialization) و التعبير الأخير (final expression) حتى نتمكن من العد إلى الوراء بمقدار اثنين لإنشاء قائمة (array) من الأعداد التنازلية الفردية. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/declare-javascript-variables.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/declare-javascript-variables.md index 15f138dc17b..c72cab26475 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/declare-javascript-variables.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/declare-javascript-variables.md @@ -1,6 +1,6 @@ --- id: bd7123c9c443eddfaeb5bdef -title: أعلان متغيرات في JavaScript +title: أعلان المتغيرات في JavaScript challengeType: 1 videoUrl: 'https://scrimba.com/c/cNanrHq' forumTopicId: 17556 @@ -9,21 +9,21 @@ dashedName: declare-javascript-variables # --description-- -في علوم الحاسب، تكون البيانات أي شيء ذو معني للحواسيب. يوفر JavaScript ثماني أنواع بيانات مختلفة و هي كالآتي `undefined`, و`null`, و`boolean`, و`string`, و`symbol`, و`bigint`, و`number`, و `object`. +في علم الحاسوب (computer science)، تكون البيانات أي شيء ذو معني للحاسوب. يوفر JavaScript ثماني أنواع بيانات مختلفة و هي كالآتي `undefined`, و`null`, و`boolean`, و`string`, و`symbol`, و`bigint`, و`number`, و `object`. -على سبيل المثال، تقوم الحاسوب بالتمييز بين الأرقام، مثل الرَّقَم `12` و `strings` مثل `"12"` و `"dog"` أو `"123 cats"`, وهي مجموعات من الرموز. يمكن للحواسيب عمليات رياضية على الأعداد، ولكن ليس على المقاطع النصية (strings). +على سبيل المثال، يقوم الحاسوب بالتمييز بين الأرقام، مثل الرَّقَم `12` و `strings` مثل `"12"` و `"dog"` أو `"123 cats"`, وهي مجموعات من الرموز. يمكن للحواسيب عمليات رياضية على الأعداد، ولكن ليس على المقاطع النصية (strings). -تسمح المتغيرات للحواسيب بتخزين البيانات ومعالجتها بطريقة ديناميكية. وهم يفعلون ذلك باستخدام "تسمية" للإشارة إلى البيانات بدلاً من استخدام البيانات نفسها. ويمكن تخزين أي نوع من أنواع البيانات الثمانية في متغير. +تسمح المتغيرات للحواسيب بتخزين البيانات ومعالجتها بطريقة ديناميكية. ويفعلوا ذلك باستخدام "المسمى" للإشارة إلى البيانات بدلاً من استخدام البيانات نفسها. ويمكن تخزين أي نوع من أنواع البيانات الثمانية في متغير. المتغيرات مشابهة للمتغيرات x و y التي تستخدمها في الرياضيات، مما يعني أنهم اسم بسيط لتمثيل البيانات التي نريد الرجوع إليها. وتختلف متغيرات الحاسوب عن المتغيرات الرياضية من حيث أنها تستطيع تخزين قيم مختلفة في أوقات مختلفة. -نحن نطلب من JavaScript إنشاء أو تعلن متغير عن طريق وضع الكلمة `var` أمامه، مثل ذلك: +نطلب من JavaScript إنشاء أو أعلان متغير عن طريق وضع الكلمة `var` أمامه، مثل ذلك: ```js var ourName; ``` -هذا ينشئ متغير يسمى `ourName`. في JavaScript تنهي التعبيرات باستخدام الفاصلة المنقوطة (;). أسماء المتغيرات يمكن أن تتكون من أرقام وحروف و `$` أو `_`، ولكن قد لا تحتوي على مسافات أو تبدأ برقم. +هذا ينشئ متغير يسمى `ourName`. في JavaScript, تنهي التعبيرات باستخدام الفاصلة المنقوطة (;). يمكن أن تتكون أسماء المتغيرات من أرقام وحروف و `$` أو `_`، ولكن قد لا تحتوي على مسافات أو تبدأ برقم. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/declare-string-variables.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/declare-string-variables.md index 7897e7bf9d5..94856f2d23b 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/declare-string-variables.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/declare-string-variables.md @@ -1,6 +1,6 @@ --- id: bd7123c9c444eddfaeb5bdef -title: إعلان متغيرات المقاطع نصية (Declare String Variables) +title: إعلان متغيرات المقاطع النصية challengeType: 1 videoUrl: 'https://scrimba.com/c/c2QvWU6' forumTopicId: 17557 @@ -21,15 +21,15 @@ var myName; var myName = "your name"; ``` -`"your name"` يسمي مقطع حرفي. المقطع النصي أو مقطع هي مقطع تتكون من رمز أو أكثر، مرفقين في علامات اقتباس (Quotes) مفردة أو مزدوجة. +يسمي`"your name"` المقطع موضوعي. يتكون المقطع الموضوعي أو المقطع النصي من رمز أو رموز، مرفقين في علامات اقتباس (quotes) مفردة أو مزدوجة. # --instructions-- -إنشاء متغيرين مقطعين جديدين: `myFirstName` و `myLastName` وعيين قيم الاسم الأول والاسم الأخير على التوالي. +إنشاء متغيرين مقطعين جديدين: وعين `myFirstName` و `myLastName` بقيم اسمك والاسم عائلتك على التوالي. # --hints-- -يجب أن يحتوي مقطع `myFirstName` على حرف واحد في الأقل. +يجب أن يحتوي مقطع `myFirstName` على رمز واحد في الأقل. ```js assert( @@ -47,7 +47,7 @@ assert( ); ``` -يجب أن يحتوي مقطع `myLastName` على حرف واحد في الأقل. +يجب أن يحتوي مقطع `myLastName` على رمز واحد في الأقل. ```js assert( diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/delete-properties-from-a-javascript-object.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/delete-properties-from-a-javascript-object.md index 985e3c80dde..1a4f25f7689 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/delete-properties-from-a-javascript-object.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/delete-properties-from-a-javascript-object.md @@ -42,7 +42,7 @@ delete ourDog.bark; # --instructions-- -احذف خاصية `tails` من `myDog`. يمكنك استخدام النقطة (dot) أو الأقواس المربعة (bracket notation). +احذف خاصية `tails` من `myDog`. يمكنك استخدام النقطة (dot) أو علامات الأقواس (bracket notation). # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/escape-sequences-in-strings.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/escape-sequences-in-strings.md index 53a1021b42f..f327967b92a 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/escape-sequences-in-strings.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/escape-sequences-in-strings.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244b6 -title: تسلسلات الهروب في المقاطع (Escape Sequences in Strings) +title: تسلسلات الإخراج في المقاطع النصية challengeType: 1 videoUrl: 'https://scrimba.com/c/cvmqRh6' forumTopicId: 17567 @@ -9,26 +9,26 @@ dashedName: escape-sequences-in-strings # --description-- -الاقتباسات (Quotes) ليست الرموز الوحيدة التي يمكن أن تكتب باحتياليه داخل المقطع (string). وهناك سببان لاستخدام رموز احتيالية (escaping characters): +الاقتباسات (Quotes) ليست الرموز الوحيدة التي يمكن أن تكتب مخرَّجة داخل المقطع النصي (string). وهناك سببان لاستخدام رموز احتيالية (escaping characters): 1. للسماح لك باستخدام الرموز التي قد لا تتمكن من استخدامها، مثل سطر جديد (newline). -2. للسماح لك بتمثيل الاقتباسات (Quotes) متعددة في مقطع دون أن يسيء JavaScript فهم ما تعنيه. +2. للسماح لك بتمثيل الاقتباسات (Quotes) متعددة في مقطع نصي دون أن يسيء JavaScript فهم ما تعنيه. وقد تعلمنا ذلك في التحدي السابق.
الكودالناتج
\'single quote
\"double quote
\\backslash
\nnewline
\ttab
\rcarriage return
\bword boundary
\fform feed
-*لاحظ أن يجب أن تكون الخط المائل (backslash) نفسه أحتيالي (escaped) ليتم عرضها كخط مائل backslash.* +*لاحظ أن يجب أن يكون الخط المائل (backslash) نفسه يخرَّج (escaped) ليتم عرضه كخط مائل backslash.* # --instructions-- -عيّن الأسطر الثلاثة التالية من النص في المتغير `myStr` الوحيد باستخدام تسلسل احتيالي (escape sequences). +عيّن الأسطر الثلاثة التالية من النص في المتغير `myStr` الوحيد باستخدام تسلسل التخريج (escape sequences).
FirstLine
    \SecondLine
ThirdLine
-سوف تحتاج إلى استخدام تسلسل احتيالي لإدراج الرموز الخاصة (special characters) بشكل صحيح. ستحتاج أيضًا إلى اتباع التباعد كما هو موضح أعلاه، دون مسافات بين التسلسل الاحتيالي escape sequences أو الكلمات. +سوف تحتاج إلى استخدام تسلسل تخريج لإدراج الرموز الخاصة (special characters) بشكل صحيح. ستحتاج أيضًا إلى اتباع التباعد كما هو موضح أعلاه، دون مسافات بين تسلسل التخريج escape sequences أو الكلمات. -**ملاحظة:** يتم الحصول على التباعد (indentation) في `SecondLine` باستخدام رمز التحايل الشريط (tab escape character) وليس المسافة الفارغة (space). +**ملاحظة:** يتم الحصول على التباعد (indentation) في `SecondLine` باستخدام رمز التخريح الشريط (tab escape character) وليس المسافة الفارغة (space). # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/explore-differences-between-the-var-and-let-keywords.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/explore-differences-between-the-var-and-let-keywords.md index e45b50e28cc..38ee1bca4fb 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/explore-differences-between-the-var-and-let-keywords.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/explore-differences-between-the-var-and-let-keywords.md @@ -1,6 +1,6 @@ --- id: 587d7b87367417b2b2512b3f -title: استكشاف الاختلافات بين كلمتين var و let +title: استكشاف الاختلافات بين المصطلحين var و let challengeType: 1 forumTopicId: 301202 dashedName: explore-differences-between-the-var-and-let-keywords @@ -8,7 +8,7 @@ dashedName: explore-differences-between-the-var-and-let-keywords # --description-- -واحدة من أكبر مشكلات مع إعلان المتغيرات باستخدام كلمة `var` هي أنه يمكنك بسهولة تغيير الإعلانات للمتغيرات السابقة: +واحدة من أكبر المشكلات في إعلان المتغيرات بكلمة `var` هي أنه يمكنك بسهولة إلغاء الإعلانات السابقة للمتغيرات: ```js var camper = "James"; @@ -16,11 +16,11 @@ var camper = "David"; console.log(camper); ``` -في الكود أعلاه، أعلن متغير `camper` بقيمة `James` في الأصل، وغير بعد ذلك ليصبح `David`. ثم يعرض وحدة التحكم المقطع (string) الآتي `David`. +في الكود أعلاه، أعطى متغير `camper` قيمة `James` في الإعلان الأصلي، ثم ألغيَ عند إعادة إعلانه ليصبح `David`. ولذلك يعرض الكونسول (console) المقطع النصي (string) الآتي `David`. -في تطبيق صغير، قد لا تواجه هذا النوع من المشاكل. لكن كلما أصبح الكود الخاص بك أكبر، قد تغير المتغير عن طريق الخطأ الذي لم تكن تنوي تغييره. ولأذن هذا السلوك لا يوقع خطأ، يصبح البحث عن الأخطاء وإصلاحها أكثر صعوبة. +في تطبيق صغير، قد لا تواجه هذه المشكلة. لكن إذا أصبح الكود الخاص بك أكبر، قد تلغي متغير دون وعي. ولأن هذا السلوك لا يوقع خطأ، يصبح البحث عن الأخطاء وإصلاحها أكثر صعوبة. -تم تقديم كلمة `let` في ES6، وهو تحديث رئيس JavaScript، لحل هذه المشكلة المحتملة باستخدام `var`. ستتعرف إلى ميزات ES6 الأخرى في التحديات اللاحقة. +تم تقديم كلمة `let` في ES6، وهو تحديث رئيسي في الجافاسكريبت (JavaScript)، لحل هذه المشكلة المحتملة باستخدام `var`. ستتعرف على ميزات ES6 الأخرى في التحديات اللاحقة. إذا استبدلت `var` إلى `let` في الكود أعلاه، فإنه يؤدي إلى خطأ: @@ -29,13 +29,13 @@ let camper = "James"; let camper = "David"; ``` -يمكن رؤية الخطأ في وحدة تحكم المتصفح الخاص بك. +يمكن رؤية الخطأ في الكونسول (console) المتصفح الخاص بك. لذلك على خلاف `var`، عندما تستعمل `let`، يمكن إعلان متغير بنفس الاسم مرة واحدة فقط. # --instructions-- -حديث الكود بحيث يستخدم فقط كلمة `let`. +حدِّث الكود بحيث يستخدم فقط كلمة `let`. # --hints-- @@ -45,13 +45,13 @@ let camper = "David"; assert.notMatch(code, /var/g); ``` -يجب أن تساوي `catName` المقطع (string) الآتي `Oliver`. +يجب أن تساوي `catName` المقطع النصي الآتي `Oliver`. ```js assert.equal(catName, 'Oliver'); ``` -يجب أن تساوي `catSound` المقطع (string) الآتي `Meow!` +يجب أن تساوي `catSound` المقطع النصي الآتي `Meow!` ```js assert.equal(catSound, 'Meow!'); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/find-the-length-of-a-string.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/find-the-length-of-a-string.md index 141ba2afc0c..b2faae6839a 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/find-the-length-of-a-string.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/find-the-length-of-a-string.md @@ -1,6 +1,6 @@ --- id: bd7123c9c448eddfaeb5bdef -title: العثور على طول مقطع نصي (Find the Length of a String) +title: العثور عن عدد الرموز أو الطول لمقطع نصي challengeType: 1 videoUrl: 'https://scrimba.com/c/cvmqEAd' forumTopicId: 18182 @@ -9,7 +9,7 @@ dashedName: find-the-length-of-a-string # --description-- -يمكنك العثور على قيمة طول `String` بكتابة `.length` بعد متغير المقطع (string) أو المقطع النصي (string literal). +يمكنك العثور على الطول أو عدد الرموز في `String` بكتابة `.length` بعد متغير المقطع النصي أو بعد مقطع حرفي (string literal). ```js console.log("Alan Peter".length); @@ -17,11 +17,11 @@ console.log("Alan Peter".length); سوف يتم عرض القيمة `10` في وحدة التحكم. لاحظ أن رمز المسافة بين "Alan" و "Peter" يتم حسابه أيضا. -على سبيل المثال، إذا أنشئت متغير `const firstName = "Ada"`، يمكننا معرفة طول المقطع (string) الآتي `Ada` باستخدام `firstName.length`. +على سبيل المثال، إذا أنشئت متغير `const firstName = "Ada"`، يمكننا معرفة طول المقطع النصي (string) الآتي `Ada` باستخدام `firstName.length`. # --instructions-- -استخدم خاصية `.length` لتعيين `lastNameLength` إلى عدد الأحرف في `lastName`. +استخدم خاصية `.length` لتعيين `lastNameLength` إلى عدد الرموز في `lastName`. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md index 922ffb963ce..d9ddc87a327 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/global-scope-and-functions.md @@ -9,9 +9,9 @@ dashedName: global-scope-and-functions # --description-- -في JavaScript، يشير النطاق إلى رؤية المتغيرات. يكون إلى المتغيرات التي تم تعريفها خارج الوظيفة نطاق يسمي شامل. وهذا يعني أنه يمكن رؤيتها في كل مكان في التعليمات البرمجية JavaScript الخاص بك. +في JavaScript، يشير النطاق إلى رؤية المتغيرات. يكون إلى المتغيرات التي تم تعريفها خارج الوظيفة مجال شامل (Global scope). وهذا يعني أنه يمكن رؤيتها في كل مكان في التعليمات البرمجية JavaScript الخاص بك. -تعلن المتغيرات دون استخدام المصطلحات الآتية `let` أو `const` وتنشئ تلقائيًا في نطاق `global`. هذا يمكن أن يؤدي إلى عواقب غير مقصودة في مكان آخر من التعليمات البرمجية الخاص بك أو عند تشغيل الوظيفة مرة أخرى. يجب عليك دائماً إعلان متغيراتك باستخدام `let` أو `const`. +تعلن المتغيرات دون استخدام المصطلحات الآتية `let` أو `const` وتنشئ تلقائيًا في مجال شامل `global`. هذا يمكن أن يؤدي إلى عواقب غير مقصودة في مكان آخر من التعليمات البرمجية الخاص بك أو عند تشغيل الوظيفة مرة أخرى. يجب عليك دائماً إعلان متغيراتك باستخدام `let` أو `const`. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/global-vs.-local-scope-in-functions.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/global-vs.-local-scope-in-functions.md index efc9557e8b7..b62dab7e6d0 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/global-vs.-local-scope-in-functions.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/global-vs.-local-scope-in-functions.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244c0 -title: النطاق العام مقابل النطاق المحلي في الوظائف (Global vs. Local Scope in Functions) +title: المجال الشامل مقابل النطاق المحدد في الوظائف challengeType: 1 videoUrl: 'https://scrimba.com/c/c2QwKH2' forumTopicId: 18194 @@ -9,7 +9,7 @@ dashedName: global-vs--local-scope-in-functions # --description-- -من الممكن الحصول على متغيرات محالية (Local) و عامة (Global) بنفس الاسم. عندما تقوم ذلك، يكون المتغير المحالي (local) له الأسبقية على المتغير العام (global). +من الممكن الحصول على متغيرات محدودة (local) و شاملة (global) بنفس الاسم. عندما تقوم ذلك، يكون المتغير المحدود (local) له الأسبقية على المتغير الشامل (global). وفي هذا المثال: @@ -22,15 +22,15 @@ function myFun() { } ``` -سوف تنتج الوظيفة `myFun` السلسلة `Head` لأن النسخة المحالية (local) من المتغير موجودة. +سوف تنتج الوظيفة `myFun` المقطع النصي `Head` لأن النسخة المحدودة (local) من المتغير موجودة. # --instructions-- -أضف متغير محالي (local) إلى وظيفة `myOutfit` لتجاوز قيمة `outerWear` بالمقطع `sweater`. +أضف متغير محدود (local) إلى وظيفة `myOutfit` لتجاوز قيمة `outerWear` بالمقطع النصي `sweater`. # --hints-- -لا يجب عليك تغيير قيمة العام (global) الآتي `outerWear`. +لا يجب عليك تغيير قيمة المتغير الشامل (global) الآتي `outerWear`. ```js assert(outerWear === 'T-Shirt'); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/initializing-variables-with-the-assignment-operator.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/initializing-variables-with-the-assignment-operator.md index 7400e13c985..6a1b80fc4f9 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/initializing-variables-with-the-assignment-operator.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/initializing-variables-with-the-assignment-operator.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244a9 -title: تهيئة المتغيرات باستخدام مشغل التعيين (Initializing Variables with the Assignment Operator) +title: تهيئة المتغيرات باستخدام مشغل التعيين challengeType: 1 videoUrl: 'https://scrimba.com/c/cWJ4Bfb' forumTopicId: 301171 @@ -19,7 +19,7 @@ var myVar = 0; # --instructions-- -عرّف متغير `a` باستخدام `var` و عيّن له قيمة `9`. +أعلن متغير `a` باستخدام `var` و هيئ له قيمة `9`. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-for-loops.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-for-loops.md index bce01c3e9ef..6f9323f4a62 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-for-loops.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/iterate-with-javascript-for-loops.md @@ -15,9 +15,9 @@ dashedName: iterate-with-javascript-for-loops تعريف حلَقات For مع ثلاث عبارات اختيارية تفصل بينها الفاصلات المنقوطة (semicolons): -`for (a; b; c)`، حيث ان `a` هي عبارة التهيئة، `b` هي عبارة الشرط، و `c` هي العبارة النهائية. +`for (a; b; c)`، حيث ان `a` هي تعبير التهيئة، `b` هي تعبير الشرط، و `c` هي العبارة النهائية. -يتم تنفيذ عبارة التهيئة مرة واحدة فقط قبل بَدْء الحلقة. يستخدم عادة لتحديد وإعداد متغير الحلقة الخاص بك. +يتم تنفيذ عبارة التهيئة مرة واحدة فقط قبل بَدْء الحلقة. يستخدم عادة لإعلان وإعداد متغير الحلقة الخاص بك. يتم تقييم عبارة الشرط في بداية كل حلقة وسوف يستمر مادام أنه يقيّم إلى `true`. عندما يكون الشرط `false` في بداية الحلقة سوف تتوقف الحلقة عن التنفيذ. هذا يعني أن إذا بدأ الشرط كزائف (false)، لن تنفذ الحلقة (loop) الخاصة بك أبدا. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/local-scope-and-functions.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/local-scope-and-functions.md index 7cfaff9aad8..e5a2570a887 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/local-scope-and-functions.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/local-scope-and-functions.md @@ -9,9 +9,9 @@ dashedName: local-scope-and-functions # --description-- -المتغيرات التي المعلنا داخل وظيفة (function)، وكذلك الوسائط (parameters) للوظيفة لديها نطاق و يكون محلي (local). وهذا يعني أنها لا تبد مرئية إلا في إطار الوظيفة. +المتغيرات التي أعلنة داخل وظيفة (function)، وكذلك الوسائط (parameters) للوظيفة لديها مجال محدود (local). وهذا يعني أنها لا تبد مرئية إلا في إطار الوظيفة. -هذه وظيفة `myTest` مع متغير محلي يسمى `loc`. +هذه وظيفة `myTest` مع متغير محدود يسمى `loc`. ```js function myTest() { @@ -27,13 +27,13 @@ console.log(loc); # --instructions-- -يحتوي المحرر على اثنين `console.log` لمساعدتك على رؤية ما يحدث. تحقق من وحدة التحكم خلال كتابة الكود لترى كيف يتغير. اعلن متغير محلي اسمه `myVar` داخل `myLocalScope` وفعّل الاختبارات. +يحتوي المحرر على اثنين `console.log` لمساعدتك على رؤية ما يحدث. تحقق من وحدة التحكم خلال كتابة الكود لترى كيف يتغير. اعلن متغير محدود اسمه `myVar` داخل `myLocalScope` وفعّل الاختبارات. **ملاحظة:** وحدة التحكم ستظل تعرض `ReferenceError: myVar is not defined`، ولكن هذا لن يتسبب في فشل الاختبارات. # --hints-- -لا ينبغي أن يحتوي الكود على متغير عام يدعي `myVar`. +لا ينبغي أن يحتوي الكود على متغير شامل يدعي `myVar`. ```js function declared() { @@ -43,7 +43,7 @@ function declared() { assert.throws(declared, ReferenceError); ``` -يجب عليك إضافة متغير محلي يدعي `myVar`. +يجب عليك إضافة متغير محدود يدعي `myVar`. ```js assert( diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/modify-array-data-with-indexes.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/modify-array-data-with-indexes.md index dfa6cf54e9b..59938a84f1b 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/modify-array-data-with-indexes.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/modify-array-data-with-indexes.md @@ -9,7 +9,7 @@ dashedName: modify-array-data-with-indexes # --description-- -على عكس المقاطع، عناصر القائمة هي قابلة للتغيير ويمكن تغييرها بحرية، حتى لو تم تعريف القائمة بواسطة `const`. +على عكس المقاطع النصية، عناصر القائمة هي قابلة للتغيير (mutable) ويمكن تغييرها بحرية، حتى لو تم تعريف القائمة بواسطة `const`. **مثال** diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/quoting-strings-with-single-quotes.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/quoting-strings-with-single-quotes.md index fc86bbac9ec..ab7db64af61 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/quoting-strings-with-single-quotes.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/quoting-strings-with-single-quotes.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244b4 -title: اقتباس مقاطع بعلامات اقتباس منفردة (Quoting Strings with Single Quotes) +title: اقتباس مقاطع بعلامات اقتباس منفردة challengeType: 1 videoUrl: 'https://scrimba.com/c/cbQmnhM' forumTopicId: 18260 @@ -31,15 +31,15 @@ const badStr = 'Finn responds, "Let's go!"'; هنا `badStr` سوف تسبب بخطأ. -في goodStr أعلاه، يمكنك استخدام أي من علامات الاقتباس بأمان باستخدام الخط المائل (backslash) الآتية `\` كرمز متحايل (escape character). +في goodStr أعلاه، يمكنك استخدام أي من علامات الاقتباس بأمان باستخدام الخط المائل (backslash) الآتية `\` كرمز التخريج (escape character). **ملاحظة:** يجب عدم الخلط بين الخط المائل (blackslash) الآتية `\` والخط المائل للأمام (forward slash) الآتية `/`. إنهم لا يفعلون الشيء نفسه. # --instructions-- -غيّر المقطع المقدم إلى مقطع مع اقتباسات فردية في البداية والنهاية وبدون رموز متحايلة (escape characters). +غيّر المقطع المقدم إلى مقطع مع اقتباسات فردية في البداية والنهاية وبدون رموز التخريج (escape characters). -الآن، العلامة `` في المقطع تستخدم اقتباسات مزدوجة في كل مكان. سوف تحتاج إلى تغيير الاقتباسات الخارجية إلى اقتباسات فردية حتى تتمكن من إزالة الرموز متحايلة (escape characters). +الآن، العلامة `` في المقطع تستخدم اقتباسات مزدوجة في كل مكان. سوف تحتاج إلى تغيير الاقتباسات الخارجية إلى اقتباسات فردية حتى تتمكن من إزالة رموز التخريج (escape characters). # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/record-collection.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/record-collection.md index d305f50923e..5c5aa16eb7c 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/record-collection.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/record-collection.md @@ -8,9 +8,9 @@ dashedName: record-collection # --description-- -لديك object literal يمثل جزءا من مجموعة سجلات موسيقية الخاصة بك. يحتوي كل سجل على رقم معرف فريد يعدّ الهُوِيَّة والعديد من الخصائص الأخرى. ليست كل السجلات لديها معلومات كاملة. +لديك حروف الكائن التي تمثل جزء من مجموعة سجلاتك الموسيقية. يحتوي كل سجل على رقم معرف فريد يعدّ الهُوِيَّة والعديد من الخصائص الأخرى. ليست كل السجلات لديها معلومات كاملة. -أنت تبدأ بالوظيفة `updateRecords` التي تأخذ object literal يدعي `records`، يحتوي على مجموعة ألبومات موسيقية. و `id`, و `prop` (مثل `artist` أو `tracks`)، و `value`. أكمل الوظيفة باستخدام القواعد أدناه لتعديل الكائن الممرر إلى الوظيفة. +أنت تبدأ بالوظيفة `updateRecords` التي تأخذ الكائن حرفي يدعي `records`، يحتوي على مجموعة ألبومات موسيقية. و `id`, و `prop` (مثل `artist` أو `tracks`)، و `value`. أكمل الوظيفة باستخدام القواعد أدناه لتعديل الكائن الممرر إلى الوظيفة. - الوظيفة الخاص بك يجب أن يرجع دائما كائن مجموعة السجلات بِرُمَّته. - إذا كان `prop` ليس `tracks` و `value` ليس مقطع فارغ، حديث أو تعيين `prop` السجلات إلى `value`. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md index 83f0157139c..7aec83fa65f 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/return-early-pattern-for-functions.md @@ -29,7 +29,7 @@ myFun(); عدّل الوظيفة `abTest` بحيث إذا كان `a` أو `b` أقل من `0` ستنتج الوظيفة قيمة `undefined` فوراً. **تلميح** -تذكر أن تكون undefined كلمة وليست مقتطع. +تذكر أن تكون undefined مصطلح وليست مقطع نصي. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/selecting-from-many-options-with-switch-statements.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/selecting-from-many-options-with-switch-statements.md index d81cc2da545..6daec49af61 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/selecting-from-many-options-with-switch-statements.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/selecting-from-many-options-with-switch-statements.md @@ -36,25 +36,25 @@ switch (lowercaseLetter) { # --hints-- -`caseInSwitch(1)` يجب أن يكون له قيمة السلسلة (string) النصية `alpha` +`caseInSwitch(1)` يجب أن يكون له قيمة المقطع (string) النصي `alpha` ```js assert(caseInSwitch(1) === 'alpha'); ``` -`caseInSwitch(2)` يجب أن يكون له قيمة السلسلة (string) النصية `beta` +`caseInSwitch(2)` يجب أن يكون له قيمة المقطع (string) النصي `beta` ```js assert(caseInSwitch(2) === 'beta'); ``` -`caseInSwitch(3)` يجب أن يكون له قيمة السلسلة (string) النصية `gamma` +`caseInSwitch(3)` يجب أن يكون له قيمة المقطع (string) النصي `gamma` ```js assert(caseInSwitch(3) === 'gamma'); ``` -`caseInSwitch(4)` يجب أن يكون له قيمة السلسلة (string) النصية `delta` +`caseInSwitch(4)` يجب أن يكون له قيمة المقطع (string) النصي `delta` ```js assert(caseInSwitch(4) === 'delta'); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator.md index e0180d01f20..2502ed5accb 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/storing-values-with-the-assignment-operator.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244a8 -title: تخزين القيم مع مشغل التعيين (Storing Values with the Assignment Operator) +title: تخزين القيم مع مشغل التعيين (=) challengeType: 1 videoUrl: 'https://scrimba.com/c/cEanysE' forumTopicId: 18310 @@ -17,7 +17,7 @@ myVariable = 5; هذا يعين `Number` بقيمة `5` إلى `myVariable`. -إذا كانت هناك أي حسابات إلى يمين مشغل `=`، يتم أداء هذه حسابات قبل تعيين القيمة إلى المتغير الموجود على يسار المشغل. +إذا كانت هناك أي حسابات إلى يمين مشغل `=`، يتم أداء هذه الحسابات قبل تعيين القيمة إلى المتغير الموجود على يسار المشغل. ```js var myVar; diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/subtract-one-number-from-another-with-javascript.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/subtract-one-number-from-another-with-javascript.md index 9614b3609db..5656103ee81 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/subtract-one-number-from-another-with-javascript.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/subtract-one-number-from-another-with-javascript.md @@ -1,6 +1,6 @@ --- id: cf1111c1c11feddfaeb4bdef -title: طرح رقم من الآخر باستخدام JavaScript +title: طرح رَقَم من رَقَم آخر باستخدام JavaScript challengeType: 1 videoUrl: 'https://scrimba.com/c/cP3yQtk' forumTopicId: 18314 @@ -9,7 +9,7 @@ dashedName: subtract-one-number-from-another-with-javascript # --description-- -يمكننا أيضا أن نطرح رقما من الآخر. +يمكننا أيضا أن نطرح رقما من رقما آخر. يستخدم JavaScript رمز `-` للطرح. @@ -26,13 +26,13 @@ const myVar = 12 - 6; # --hints-- -يجب أن يساوي `difference` قيمة 12. +يجب أن يساوى المتغير `difference` لقيمة `12`. ```js assert(difference === 12); ``` -يجب عليك طرح رَقَم واحد فقط من 45. +يجب أن تطرح رَقَم واحد فقط من `45`. ```js assert(/difference=45-33;?/.test(__helpers.removeWhiteSpace(code))); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-boolean-values.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-boolean-values.md index 5df0a28bef3..b3220d4f94d 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-boolean-values.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-boolean-values.md @@ -1,6 +1,6 @@ --- id: bd7123c9c441eddfaeb5bdef -title: فهم الحالات المنطقية (Understanding Boolean Values) +title: فهم الحالات المنطقية challengeType: 1 videoUrl: 'https://scrimba.com/c/c9Me8t4' forumTopicId: 301176 diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-case-sensitivity-in-variables.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-case-sensitivity-in-variables.md index 1ba75aab9cd..29ec1dd4870 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-case-sensitivity-in-variables.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-case-sensitivity-in-variables.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244ab -title: فهم حساسية الحالة الحروف في المتغيرات (Understanding Case Sensitivity in Variables) +title: فهم حساسية الحالة الحروف في المتغيرات challengeType: 1 videoUrl: 'https://scrimba.com/c/cd6GDcD' forumTopicId: 18334 @@ -39,7 +39,7 @@ var thisVariableNameIsSoLong; assert(typeof studlyCapVar !== 'undefined' && studlyCapVar === 10); ``` -يجب أن يتم تعريف`properCamelCase` وأن تكون له قيمة `A String` بنوع مقطع. +يجب أن يتم تعريف`properCamelCase` وأن تكون له قيمة المقطع النصي `A String`. ```js assert( diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-undefined-value-returned-from-a-function.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-undefined-value-returned-from-a-function.md index bb19d74f0ba..0c6866e2ffe 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-undefined-value-returned-from-a-function.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-undefined-value-returned-from-a-function.md @@ -1,6 +1,6 @@ --- id: 598e8944f009e646fc236146 -title: فهم القيم غير المحددة المرتجعة من الوظيفة (Understanding Undefined Value returned from a Function) +title: فهم القيم غير المحددة المرتجعة من الوظيفة challengeType: 1 videoUrl: 'https://scrimba.com/c/ce2p7cL' forumTopicId: 301177 @@ -23,7 +23,7 @@ function addSum(num) { addSum(3); ``` -تكون `addSum` وظيفة دون `return`. سيغير وظيفة المتغير `sum` العالمي الآتي, ولكن تكون القيمة المرتجعة للوظيفة `undefined`. +تكون `addSum` وظيفة دون `return`. ستغير الوظيفة المتغير الشامل `sum`، ولكن تكون القيمة المرتجعة للوظيفة `undefined`. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md index acc2aeea56c..d29ad8efa70 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/understanding-uninitialized-variables.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244aa -title: فهم المتغيرات غير المهيأة (Understanding Uninitialized Variables) +title: فهم المتغيرات غير المهيأة challengeType: 1 videoUrl: 'https://scrimba.com/c/cBa2JAL' forumTopicId: 18335 @@ -9,7 +9,7 @@ dashedName: understanding-uninitialized-variables # --description-- -عند الإعلان المتغيرات في JavaScript، يكون لها قيمة أولية وهي `undefined`. إذا قمت بعملية رياضية على متغير `undefined` ستكون نتيجتك `NaN` مما يعني "Not a Number" إي "ليس رقما". إذا ربط مقطع مع متغير `undefined`، فستحصل على مقطع بقيمة `undefined`. +عند إعلان المتغيرات في JavaScript، يكون لها قيمة أولية وهي `undefined`. إذا قمت بعملية رياضية على متغير قيمته `undefined` ستكون نتيجتك `NaN` مما يعني "Not a Number" إي "ليس رقما". إذا ربط مقطع نصي مع متغير `undefined`، فستحصل على مقطع نصي بقيمة `undefined`. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/updating-object-properties.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/updating-object-properties.md index 4bd3ae7b170..9c4f3faf517 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/updating-object-properties.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/updating-object-properties.md @@ -9,7 +9,7 @@ dashedName: updating-object-properties # --description-- -بعد إنشاء كائن JavaScript، يمكنك تحديث خصائصه في أي وقت كما يمكنك تحديث أي متغير آخر. يمكنك استخدام أي من تدوين النِّقَاط أو تدوين الأقواس المعكوفان (dot or bracket notation). +بعد إنشاء كائن JavaScript، يمكنك تحديث خصائصه في أي وقت كما يمكنك تحديث أي متغير آخر. يمكنك استخدام أي من رمز النقطة أو علامات الأقواس (dot or bracket notation). على سبيل المثال، دعونا ننظر إلى `ourDog`: @@ -26,7 +26,7 @@ const ourDog = { # --instructions-- -حدث خاصية اسم الكائن `myDog`. غيّر اسمه من `Coder` إلى `Happy Coder`. يمكنك استخدام أي من تدوين النِّقَاط أو تدوين الأقواس المعكوفان (dot or bracket notation). +حدث خاصية اسم الكائن `myDog`. غيّر اسمه من `Coder` إلى `Happy Coder`. يمكنك استخدام أي من رمز النقطة أو علامات الأقواس (dot or bracket notation). # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-first-character-in-a-string.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-first-character-in-a-string.md index a28608ed664..46e3b43b08e 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-first-character-in-a-string.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-first-character-in-a-string.md @@ -1,6 +1,6 @@ --- id: bd7123c9c549eddfaeb5bdef -title: استخدم رمز الاقواس للعثور على اول حرف في مقطع (Use Bracket Notation to Find the First Character in a String) +title: استخدم علامات الأقواس للعثور على اول حرف في مقطع challengeType: 1 videoUrl: 'https://scrimba.com/c/ca8JwhW' forumTopicId: 18341 @@ -9,7 +9,7 @@ dashedName: use-bracket-notation-to-find-the-first-character-in-a-string # --description-- -القوسان المعكوفان هي طريقة للحصول على رمز في ترتيب معين داخل المقطع. +القوسان المعكوفان هي طريقة للحصول على رمز في ترتيب معين داخل مقطع نصي. معظم لغات البرمجة الحديثة، مثل JavaScript، لا تبدأ في العد من 1 كما يفعل البشر. إنهم يبدؤون عند الصفر. يشار إلى هذا بالترتيب مبني على الصفر. @@ -38,7 +38,7 @@ const firstLetter = firstName[0]; assert(firstLetterOfLastName === 'L'); ``` -يجب عليك استخدام رمز الأقواس المعكوفان. +يجب عليك استخدام علامات الأقواس. ```js assert(code.match(/firstLetterOfLastName\s*=\s*lastName\s*\[\s*\d\s*\]/)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-last-character-in-a-string.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-last-character-in-a-string.md index 12d33734835..229a4c6c1f3 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-last-character-in-a-string.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-last-character-in-a-string.md @@ -1,6 +1,6 @@ --- id: bd7123c9c451eddfaeb5bdef -title: استخدم رمز آلأقواس (Bracket Notation) للعثور على آخر حرف في سلسلة (String) +title: استخدم علامات الأقواس (Bracket Notation) للعثور على آخر حرف في مقطع نصي (String) challengeType: 1 videoUrl: 'https://scrimba.com/c/cBZQGcv' forumTopicId: 18342 @@ -9,7 +9,7 @@ dashedName: use-bracket-notation-to-find-the-last-character-in-a-string # --description-- -للحصول على آخر حرف من سلسلة (String)، يمكنك طرح واحد من طول السلسلة (String). +للحصول على آخر حرف من المقطع النصي (String)، يمكنك طرح واحد من طوله. على سبيل المثال، إذا `const firstName = "Ada"`، يمكنك الحصول على قيمة الحرف الأخير من السلسلة باستخدام `firstName[firstName.length - 1]`. @@ -24,7 +24,7 @@ const lastLetter = firstName[firstName.length - 1]; # --instructions-- -استخدم رمز الأقواس للعثور على الحرف الأخير في المتغير `lastName`. +استخدم علامات الأقواس للعثور على الحرف الأخير في المتغير `lastName`. **تلميح:** حاول النظر إلى المثال أعلاه إذا كنت عالق. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-nth-character-in-a-string.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-nth-character-in-a-string.md index df2d282fa50..2090c7ed513 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-nth-character-in-a-string.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-nth-character-in-a-string.md @@ -1,6 +1,6 @@ --- id: bd7123c9c450eddfaeb5bdef -title: استخدم رمز آلأقواس المعكوفان للعثور على حرف معين في مقطع +title: استخدم علامات الأقواس للعثور على حرف معين في مقطع challengeType: 1 videoUrl: 'https://scrimba.com/c/cWPVJua' forumTopicId: 18343 @@ -9,7 +9,7 @@ dashedName: use-bracket-notation-to-find-the-nth-character-in-a-string # --description-- -يمكنك أيضًا استخدام رمز الأقواس المعكوفان للحصول على الحرف في مواقع أخرى داخل مقطع. +يمكنك أيضًا استخدام علامات الأقواس للحصول على الحرف في مواقع أخرى داخل مقطع. تذكر أن أجهزة الكمبيوتر تبدأ في العد في `0`، لذا فإن الحرف الأول هو في الواقع الحرف صفر. @@ -24,7 +24,7 @@ const secondLetterOfFirstName = firstName[1]; # --instructions-- -دعونا نحاول تعيين `thirdLetterOfLastName` مساوية للحرف الثالث من متغير `lastName` باستخدام رمز آلأقواس المعكوفان. +دعونا نحاول تعيين `thirdLetterOfLastName` مساوية للحرف الثالث من متغير `lastName` باستخدام علامات الأقواس. **تلميح:** حاول النظر إلى المثال أعلاه إذا كنت عالق. @@ -36,7 +36,7 @@ const secondLetterOfFirstName = firstName[1]; assert(thirdLetterOfLastName === 'v'); ``` -يجب عليك استخدام رمز آلأقواس المعكوفان. +يجب عليك استخدام علامات الأقواس. ```js assert(code.match(/thirdLetterOfLastName\s*=\s*lastName\s*\[\s*\d\s*\]/)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-nth-to-last-character-in-a-string.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-nth-to-last-character-in-a-string.md index d1054668e31..1c74d73de88 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-nth-to-last-character-in-a-string.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-bracket-notation-to-find-the-nth-to-last-character-in-a-string.md @@ -1,6 +1,6 @@ --- id: bd7123c9c452eddfaeb5bdef -title: استخدم رمز آلأقواس المعكوفان للعثور على حرف معين قبل الأخر في مقطع +title: استخدم علامات الأقواس للعثور على رمز معين قبل الأخر في المقطع النصي challengeType: 1 videoUrl: 'https://scrimba.com/c/cw4vkh9' forumTopicId: 18344 @@ -24,7 +24,7 @@ const thirdToLastLetter = firstName[firstName.length - 3]; # --instructions-- -استخدم رمز آلأقواس المعكوفان للعثور على الحرف الثاني إلى الأخير في مقطع `lastName`. +استخدم علامات الأقواس للعثور على الحرف الثاني إلى الأخير في مقطع `lastName`. **تلميح:** حاول النظر إلى المثال أعلاه إذا كنت عالق. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-multiple-conditional-ternary-operators.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-multiple-conditional-ternary-operators.md index 4253e56fa1a..c092d0dc54d 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-multiple-conditional-ternary-operators.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-multiple-conditional-ternary-operators.md @@ -37,7 +37,7 @@ function findGreaterOrEqual(a, b) { } ``` -ويعدّ من أفضل الممارسات تشكيل متعهدين شرطيين متعددين، بحيث يكون كل شرط على خط منفصل، كما هو مبين أعلاه. استخدام عدة مشغلين مشروطين دون إهدار مناسب قد يجعل من الصعب قراءة التعليمات البرمجية الخاصة بك. على سبيل المثال: +ويعدّ من أفضل الممارسات تشكيل متعهدين شرطيين متعددين، بحيث يكون كل شرط على خط منفصل، كما هو مبين أعلاه. استخدام عدة مشغلين مشروطين دون إهدار مناسب قد يجعل من الصعب قراءة الكود الخاص بك. على سبيل المثال: ```js function findGreaterOrEqual(a, b) { diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md index 73a20dc54bb..83e94e1dbc6 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-countdown.md @@ -71,7 +71,7 @@ assert( ); ``` -لا ينبغي استخدام المتغيرات العالمية (Global variables) للتخزين المؤقت القائمة (array). +لا ينبغي استخدام المتغيرات الشاملة (Global variables) للتخزين المؤقت للقائمة (array). ```js countdown(1) diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers.md index 924c8b46b5b..833632939db 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/basic-javascript/use-recursion-to-create-a-range-of-numbers.md @@ -56,7 +56,7 @@ assert.deepStrictEqual(rangeOfNumbers(6, 9), [6, 7, 8, 9]); assert.deepStrictEqual(rangeOfNumbers(4, 4), [4]); ``` -لا ينبغي استخدام المتغيرات العالمية (Global variables) للتخزين المؤقت القائمة (array). +لا ينبغي استخدام المتغيرات الشاملة (Global variables) للتخزين المؤقت للقائمة (array). ```js rangeOfNumbers(1, 3) diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-mixed-usage-of-single-and-double-quotes.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-mixed-usage-of-single-and-double-quotes.md index cb9774663ee..d465c870265 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-mixed-usage-of-single-and-double-quotes.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-mixed-usage-of-single-and-double-quotes.md @@ -1,6 +1,6 @@ --- id: 587d7b84367417b2b2512b37 -title: إدراك الاستخدام المختلط لعلامات التنصيص الفردية والزوجية (Catch Mixed Usage of Single and Double Quotes) +title: إدراك الاستخدام المختلط لعلامات التنصيص الفردية والزوجية challengeType: 1 forumTopicId: 301188 dashedName: catch-mixed-usage-of-single-and-double-quotes @@ -10,7 +10,7 @@ dashedName: catch-mixed-usage-of-single-and-double-quotes يسمح JavaScript باستخدام كلا علامات التنصيص، الفردية (`'`) والزوجية (`"`) لإعلان المقطع النصي (string). انتقاء أحد الخيارين هو تفضيل شخصي، مع بعض الاستثناءات. -وجدود الخيارين مجدٍ عندما يحوي المقطع اختصارات أو نص آخر داخل علامات تنصيص. فقط كن حذراً من إغلاق المقطع مبكراً، مما يسبب خطأ في تركيب الجملة. +وجدود الخيارين مجدٍ عندما يحوي المقطع النصي اختصارات أو نص آخر داخل علامات تنصيص. فقط كن حذراً من إغلاق المقطع مبكراً، مما يسبب خطأ في تركيب الجملة. فيما يلي بعض الأمثلة على خلط علامات التنصيص: @@ -22,7 +22,7 @@ const uhOhGroucho = 'I've had a perfectly wonderful evening, but this wasn't it. أما الاثنان الأولان فهما صحيحان، ولكن الثالث غير صحيح. -وبطبيعة الحال، لا بأس من الاستمرار على نوع واحد من علامات التنصيص. يمكنك التعامل مع علامات التنصيص داخل المقطع باستخدام رمز التحايل (`\`): +وبطبيعة الحال، لا بأس من الاستمرار على نوع واحد من علامات التنصيص. يمكنك التعامل مع علامات التنصيص داخل المقطع النصي باستخدام رمز التخريج (`\`): ```js const allSameQuotes = 'I\'ve had a perfectly wonderful evening, but this wasn\'t it.'; @@ -30,11 +30,11 @@ const allSameQuotes = 'I\'ve had a perfectly wonderful evening, but this wasn\'t # --instructions-- -أصلح المقطع بحيث يستخدم علامات تنصيص مختلفة لقيمة `href` أو تحايل على علامات التنصيص الموجودة. حافظ على علامات التنصيص المزدوجة حول المقطع كُلََّه. +أصلح المقطع النصي بحيث يستخدم علامات تنصيص مختلفة لقيمة `href` أو أخرج علامات التنصيص الموجودة. حافظ على علامات التنصيص المزدوجة حول المقطع كُلََّه. # --hints-- -يجب أن يصلح الكود الخاص بك علامات التنصيص حول قيمة `href` وهي `#Home` إما بتغييرها أو معالجتها برمز التحايل (\). +يجب أن يصلح الكود الخاص بك علامات التنصيص حول قيمة `href` وهي `#Home` إما بتغييرها أو معالجتها برمز التخريج (\). ```js assert(code.match(//g)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-unclosed-parentheses-brackets-braces-and-quotes.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-unclosed-parentheses-brackets-braces-and-quotes.md index 78f9424726d..5f122ece22f 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-unclosed-parentheses-brackets-braces-and-quotes.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-unclosed-parentheses-brackets-braces-and-quotes.md @@ -1,6 +1,6 @@ --- id: 587d7b84367417b2b2512b36 -title: 'التقاط الاقواس و الاقتباسات الغير مغلقة (Catch Unclosed Parentheses, Brackets, Braces and Quotes)' +title: 'التقاط الاقواس و الاقتباسات الغير مغلقة' challengeType: 1 forumTopicId: 301190 dashedName: catch-unclosed-parentheses-brackets-braces-and-quotes @@ -8,7 +8,7 @@ dashedName: catch-unclosed-parentheses-brackets-braces-and-quotes # --description-- -يجب أن تكون على علم بخطأ آخر في بناء الجملة, هو أن جميع الأقواس الافتتاحية، والأقواس المعقوفة، والاقتباسات تحتوي على زوج إقفال. يحدث نسيان قطعة ما عندما تحرير كود موجود وإدخال عناصر بأحد أنواع الأزواج. أيضًا، كن حذرًا عند دمج مجموعة الكود في أخري، مثل إضافة وظيفة تعيد التفعيل كحجة إلى طريقة. +يجب أن تكون على علم بخطأ آخر في بناء الجملة, هو أن جميع الأقواس الافتتاحية، والأقواس المعكوفة، والاقتباسات تحتوي على زوج إقفال. يحدث نسيان قطعة ما عندما تحرير كود موجود وإدخال عناصر بأحد أنواع الأزواج. أيضًا، كن حذرًا عند دمج مجموعة الكود في أخري، مثل إضافة وظيفة تعيد التفعيل كحجة إلى طريقة. إحدى الطرق لتجنب هذا الخطأ هي بمجرد كتابة الرمز الافتتاحي، قم على الفور بكتابة رمز الإغلاق، ثم قم بتحريك المؤشر مرة أخرى بينهما، ثم استمر في البرمجة. لحسن الحظ، فإن معظم برامج تحرير الكود الحديثة تولد النصف الثاني من الزوج تلقائيًا. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-use-of-assignment-operator-instead-of-equality-operator.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-use-of-assignment-operator-instead-of-equality-operator.md index ca6cc699cf2..b5237232346 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-use-of-assignment-operator-instead-of-equality-operator.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/debugging/catch-use-of-assignment-operator-instead-of-equality-operator.md @@ -10,7 +10,7 @@ dashedName: catch-use-of-assignment-operator-instead-of-equality-operator البرامج المتفرعة، أي تلك الذي تقوم بأشياء مختلفة إذا تم الوفاء بشروط معينة، تعتمد على بيانات `if`, و `else if`, و `else` في JavaScript. يأخذ الشرط أحيانًا شكل اختبار ما إذا كانت النتيجة مساوية لقيمة. -هذا المنطق ينطق (باللغة الإنجليزية، على الأقل) كـ "... if x equals y, then" الذي يمكن ترجمته حرفيا إلى كود باستخدام `=` أو مشغل التعيين. هذا يؤدي إلى جعل برنامجك يعمل بشكل غير متوقع. +هذا المنطق ينطق (باللغة الإنجليزية، على الأقل) كـ "... if x equals y, then" الذي يمكن ترجمته حرفية إلى كود باستخدام `=` أو مشغل التعيين. هذا يؤدي إلى جعل برنامجك يعمل بشكل غير متوقع. كما تم تغطيته في التحديات السابقة، يقوم مشغل التعيين (`=`) في JavaScript بإسناد قيمة إلى اسم متغير. و يقوم المشغلون `==` و `===` بالتحقق من المساواة (الثلاثية `===` تتحقق من المساواة الصارمة بمعنى أن كل من القيمة والنوع يطبقان). diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md index 97c526e1997..31f80c53dc6 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/compare-scopes-of-the-var-and-let-keywords.md @@ -10,7 +10,7 @@ dashedName: compare-scopes-of-the-var-and-let-keywords إذا كانت `let` غير مألوف، تحقق هذا التحدي عن أختلاف بين كلمة (let) وكلمة (var). -عندما تعلن متغير باستخدام كلمة `var`، يتم الإعلان عنه عالميًا (declared globally)، أو محليًا (locally) إذا تم الإعلان عنه داخل وظيفة (function). +عندما تعلن متغير باستخدام كلمة `var`، يكون للمتغير مجال شامل (global scope)، أو إذا تم الإعلان عنه داخل وظيفة (function) فمجاله محدد (local scope). كلمة `let` تتصرف بالمثل، ولكن مع بعض الميزات الإضافية. عندما تعلن متغير باستخدام `let` داخل الكتلة أو تعبير أو عبارة، فنطاق المتغير يقتصر على تلك الكتلة (block) أو التعبير (statement) أو العبارة (expression). @@ -27,7 +27,7 @@ console.log(i); هنا ستعرض وحدة التحكم القيم `[0, 1, 2]` و `3`. -مع كلمة `var`، يتم الإعلان عن `i` عالميا. لذلك عندما يتم تنفيذ `i++`، فإنه يحدث المتغير العالمي. وهذا الكود مماثل لما يلي: +مع كلمة `var`، يتم الإعلان الشامل عن `i`. لذلك عندما يتم تنفيذ `i++`، فإنه يحدث المتغير الشامل. وهذا الكود مماثل لما يلي: ```js var numArray = []; @@ -41,7 +41,7 @@ console.log(i); هنا ستعرض وحدة التحكم القيم `[0, 1, 2]` و `3`. -هذا السلوك سوف يسبب مشكلات إذا كنت تريد إنشاء وظيفة وتخزينها لاستخدامها لاحقاً داخل حلقة `for` تستخدم متغير `i`. هذا لأن الوظيفة المخزنة سوف تشير دائما إلى قيمة متغير `i` العالمي المحدث. +هذا السلوك سوف يسبب مشكلات إذا كنت تريد إنشاء وظيفة وتخزينها لاستخدامها لاحقاً داخل حلقة `for` تستخدم متغير `i`. هذا لأن الوظيفة المخزنة سوف تشير دائما إلى قيمة متغير `i` الشامل المحدث. ```js var printNumTwo; @@ -57,7 +57,7 @@ console.log(printNumTwo()); هنا ستعرض وحدة التحكم القيمة `3`. -كما تري، `printNumTwo()` يطبع 3 وليس 2. هذا لأن القيمة التي تم تعيينها إلى `i` تم تحديثها و `printNumTwo()` يرجع القيمة `i` العالمية وليس القيمة التي احتواها `i` عندما تم إنشاء الوظيفة في حلقة التكرار. لا تتبع كلمة `let` هذا السلوك: +كما تري، `printNumTwo()` يطبع 3 وليس 2. هذا لأن القيمة التي تم تعيينها إلى `i` تم تحديثها و `printNumTwo()` يرجع القيمة الشاملة `i` وليس القيمة التي احتواها `i` عندما تم إنشاء الوظيفة في حلقة التكرار. لا تتبع كلمة `let` هذا السلوك: ```js let printNumTwo; @@ -74,7 +74,7 @@ console.log(i); هنا ستعرض وحدة التحكم القيمة `2`، وخطأ `i is not defined`. -`i` غير معرف لأنه لم يتم إعلانه في النطاق العالمي (global scope). تم الإعلان عنه فقط ضمن حلقة `for`. أنتج `printNumTwo()` القيمة الصحيحة لأن ثلاث متغيرات `i` مختلفة مع قيم فريدة (0, 1, و 2) تم إنشاؤها بواسطة `let` داخل كود الحلقة التكرارية. +`i` غير معروف لأنه لم يتم إعلانه في المجال الشامل (global scope). تم الإعلان عنه فقط ضمن حلقة `for`. أنتج `printNumTwo()` القيمة الصحيحة لأن ثلاث متغيرات `i` مختلفة مع قيم فريدة (0, 1, و 2) تم إنشاؤها بواسطة `let` داخل كود الحلقة التكرارية. # --instructions-- @@ -90,7 +90,7 @@ console.log(i); assert(!code.match(/var/g)); ``` -المتغير `i` المعلن عنه في `if` يجب أن يساوي المقطع `block scope`. +المتغير `i` المعلن عنه في `if` يجب أن يساوي المقطع النصي `block scope`. ```js assert(code.match(/(i\s*=\s*).*\s*.*\s*.*\1('|")block\s*scope\2/g)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/complete-a-promise-with-resolve-and-reject.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/complete-a-promise-with-resolve-and-reject.md index dc36332f1b1..489ce5d4552 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/complete-a-promise-with-resolve-and-reject.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/complete-a-promise-with-resolve-and-reject.md @@ -24,7 +24,7 @@ const myPromise = new Promise((resolve, reject) => { # --instructions-- -اجعل كائن promise يتعامل مع النجاح والفشل. إذا كان `responseFromServer` صحيحاً `true`، ففعيل طريقة `resolve` لإكمال كائن promise بنجاح. مرر `resolve` إلى سلسلة (string) نصية بقيمة `We got the data`. إذا كانت حالة `responseFromServer` بنوع `false`، استخدم طريقة `reject` كبديل و مررها المقطع النصي (string) الآتي: `Data not received`. +اجعل كائن promise يتعامل مع النجاح والفشل. إذا كان `responseFromServer` صحيحاً `true`، ففعيل طريقة `resolve` لإكمال كائن promise بنجاح. مرر `resolve` مقطع نصي بقيمة `We got the data`. إذا كانت حالة `responseFromServer` بقيمة `false`، استخدم طريقة `reject` كبديل و مررها المقطع النصي (string) الآتي: `Data not received`. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/create-an-export-fallback-with-export-default.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/create-an-export-fallback-with-export-default.md index 8ea2178925a..dbe392ddf58 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/create-an-export-fallback-with-export-default.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/create-an-export-fallback-with-export-default.md @@ -30,7 +30,7 @@ export default function(x, y) { # --instructions-- -الدالة التالية يجب أن تكون القيمة الاحتياطية للـ module. الرجاء إضافة الكود اللازم للقيام بذلك. +الوظيفة التالية يجب أن تكون القيمة الاحتياطية للـ module. الرجاء إضافة الكود اللازم للقيام بذلك. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/create-strings-using-template-literals.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/create-strings-using-template-literals.md index 8231fc497e4..7888fc820cc 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/create-strings-using-template-literals.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/create-strings-using-template-literals.md @@ -1,6 +1,6 @@ --- id: 587d7b8a367417b2b2512b4e -title: Create Strings using Template Literals +title: إنشاء المقاطع النصية باستخدام قوالب النصوص challengeType: 1 forumTopicId: 301200 dashedName: create-strings-using-template-literals @@ -28,7 +28,7 @@ console.log(greeting); ستعرض وحدة التحكم السلاسل `Hello, my name is Zodiac Hasbro!` و `I am 56 years old.`. -لقد حدث الكثير من الأشياء هنا. أولاً، يستخدم المثال الـ backticks الآتية (`` ` ``)، وليس علامات الاقتباس (`'` أو `"`) لاحتواء الـ string. ثانياً، لاحظ أن الـ string متعدد الأسطر في كل من الكود والناتج. هذا يوفر من إدخال `\n` داخل الـ strings. بناء الجملة `${variable}` المستخدم أعلاه هو placeholder. بشكل أساسي، لن تضطر إلى استخدام التسلسل مع عامل التشغيل `+` بعد الآن. لإضافة متغيرات إلى الـ strings، فقط قم بإسقاط المتغير في template string و حاوطه بـ `${` و `}`. وبالمثل، يمكنك تضمين عبارات أخرى في الـ string literal، على سبيل المثال `${a + b}`. هذه الطريقة الجديدة لإنشاء الـ strings تمنحك المزيد من المرونة لإنشاء strings قوية. +لقد حدث الكثير من الأشياء هنا. أولاً، يستخدم المثال الـ backticks الآتية (`` ` ``)، وليس علامات الاقتباس (`'` أو `"`) لاحتواء المقطع النصي. ثانياً، لاحظ أن الـ string متعدد الأسطر في كل من الكود والناتج. هذا يوفر من إدخال `\n` داخل الـ strings. بناء الجملة `${variable}` المستخدم أعلاه هو placeholder. بشكل أساسي، لن تضطر إلى استخدام التسلسل مع عامل التشغيل `+` بعد الآن. لإضافة متغيرات إلى الـ strings، فقط قم بإسقاط المتغير في template string و حاوطه بـ `${` و `}`. وبالمثل، يمكنك تضمين عبارات أخرى في الـ string literal، على سبيل المثال `${a + b}`. هذه الطريقة الجديدة لإنشاء الـ strings تمنحك المزيد من المرونة لإنشاء strings قوية. # --instructions-- @@ -66,7 +66,7 @@ assert( ); ``` -وينبغي استخدام Template strings و expression interpolation. +وينبغي استخدام template strings و expression interpolation. ```js (getUserInput) => assert(getUserInput('index').match(/(`.*\${.*}.*`)/)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/reuse-javascript-code-using-import.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/reuse-javascript-code-using-import.md index b82f70a7ae6..9736be2f19e 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/reuse-javascript-code-using-import.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/reuse-javascript-code-using-import.md @@ -14,7 +14,7 @@ dashedName: reuse-javascript-code-using-import import { add } from './math_functions.js'; ``` -هنا ، `import` سوف تجد `add` في `math_functions.js`، قم باستيراد هذه الدالة فقط لاستخدامها، وتجاهل البقية. الكود `./` يخبر الـ import بالبحث عن ملف `math_functions.js` في نفس المجلد مثل الملف الحالي. مسار الملف النسبي (`./`) وملحق الملف (`.js`) مطلوبين عند استخدام الاستيراد بهذه الطريقة. +هنا ، `import` سوف تجد `add` في `math_functions.js`، قم باستيراد هذه الوظيفة فقط لاستخدامها، وتجاهل البقية. الكود `./` يخبر الـ import بالبحث عن ملف `math_functions.js` في نفس المجلد مثل الملف الحالي. مسار الملف النسبي (`./`) وملحق الملف (`.js`) مطلوبين عند استخدام الاستيراد بهذه الطريقة. يمكنك استيراد أكثر من عنصر واحد من الملف عن طريق إضافته في بيان `import` مثل هذا: @@ -24,7 +24,7 @@ import { add, subtract } from './math_functions.js'; # --instructions-- -أضف بيان `import` المناسب الذي سيسمح للملف الحالي باستخدام الدوال `uppercaseString` و `lowercaseString` التي قمت بتصديرها في الدرس السابق. هذه الدوال موجودة في ملف يسمى `string_functions.js`، وهو في نفس المجلد مثل الملف الحالي. +أضف بيان `import` المناسب الذي سيسمح للملف الحالي باستخدام الوظائف `uppercaseString` و `lowercaseString` التي قمت بتصديرها في الدرس السابق. هذه الوظائف موجودة في ملف يسمى `string_functions.js`، وهو في نفس المجلد مثل الملف الحالي. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/use-arrow-functions-to-write-concise-anonymous-functions.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/use-arrow-functions-to-write-concise-anonymous-functions.md index 0f42e31706b..09e37c61eaa 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/use-arrow-functions-to-write-concise-anonymous-functions.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/use-arrow-functions-to-write-concise-anonymous-functions.md @@ -1,6 +1,6 @@ --- id: 587d7b87367417b2b2512b43 -title: استخدام Arrow Functions لكتابة الدوال المجهولة الموجزة (Use Arrow Functions to Write Concise Anonymous Functions) +title: استخدام Arrow Functions لكتابة الوظائف المجهولة الموجزة challengeType: 1 forumTopicId: 301211 dashedName: use-arrow-functions-to-write-concise-anonymous-functions diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/use-the-spread-operator-to-evaluate-arrays-in-place.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/use-the-spread-operator-to-evaluate-arrays-in-place.md index 86753be22b5..8fb930aa580 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/use-the-spread-operator-to-evaluate-arrays-in-place.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/use-the-spread-operator-to-evaluate-arrays-in-place.md @@ -8,7 +8,7 @@ dashedName: use-the-spread-operator-to-evaluate-arrays-in-place # --description-- -يقدم ES6 مشغل الانتشار (spread operator)، الذي يسمح لنا بتوسيع القوائم (arrays) وغيرها من التعبيرات في الأماكن التي يتوقع أن تكون فيها وسائط (parameters) أو عناصر متعددة. +يقدم ES6 مشغل الانتشار (spread operator)، الذي يسمح لنا بتوسيع القوائم (arrays) وغيرها من العبارات في الأماكن التي يتوقع أن تكون فيها وسائط (parameters) أو عناصر متعددة. كود ES5 أدناه يستخدم `apply()` لحساب القيمة القصوى في الـ array: diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/write-concise-object-literal-declarations-using-object-property-shorthand.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/write-concise-object-literal-declarations-using-object-property-shorthand.md index dc73482bf70..34f8eb6c31b 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/write-concise-object-literal-declarations-using-object-property-shorthand.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/write-concise-object-literal-declarations-using-object-property-shorthand.md @@ -8,7 +8,7 @@ dashedName: write-concise-object-literal-declarations-using-object-property-shor # --description-- -يضيف ES6 بعض الدعم اللطيف لتعريف الـ objects بسهولة. +يضيف ES6 بعض الدعم اللطيف لتعريف الكائنات بسهولة. ضع في اعتبارك الكود التالي: @@ -27,7 +27,7 @@ const getMousePosition = (x, y) => ({ x, y }); # --instructions-- -قم باستخدام خاصية الـ object القصير مع object literals لإنشاء وإرجاع object بخصائص `name` و `age` و `gender`. +استخدم خاصية الكائن المختصرة مع حروف الكائن لإنشاء كائن بخصائص `name`, و `age`, و `gender`. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/avoid-mutations-and-side-effects-using-functional-programming.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/avoid-mutations-and-side-effects-using-functional-programming.md index de8bd07cca8..f4ecfcd7f32 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/avoid-mutations-and-side-effects-using-functional-programming.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/avoid-mutations-and-side-effects-using-functional-programming.md @@ -8,13 +8,13 @@ dashedName: avoid-mutations-and-side-effects-using-functional-programming # --description-- -إذا لم تكتشف ذلك سلفًا، المشكلة في التحدي السابق كانت مع استدعاء `splice` في وظيفة `tabClose()`. لسوء الحظ، يغير `splice` القائمة (array) الأصلية عند تفعيل الوظيفة، لذا ففي التفعيل الثاني لها استخدمت القائمة (array) المعدلة، وأعطت نتائج غير متوقعة. +إذا لم تكتشف ذلك سلفًا، المشكلة في التحدي السابق كانت مع استدعاء `splice` في وظيفة `tabClose()`. لسوء الحظ، `splice` يغير القائمة (array) الأصلية التي فُعِل عليها، لذا التفعيل الثاني له استخدم القائمة (array) المعدلة، وأعطى نتائج غير متوقعة. -هذا مثال صغير لنمط أكبر بكثير- يمكنك تفعيل وظيفة (function) للتأثير على متغير (variable)، أو قائمة (array)، أو كائن(object)، وتغير الوظيفة المتغير أو شيء ما في الكائن. +هذا مثال صغير لنمط أكبر بكثير- يمكنك تفعيل وظيفة (function) للتأثير على متغير (variable)، أو قائمة (array)، أو كائن (object). وتغير الوظيفة المتغير أو شيء ما في الكائن. -وأحد المبادئ الأساسية للبرمجة الوظيفية هو عدم تغيير الأشياء. التغييرات تؤدي إلى أعطال. من الأسهل منع الأعطال علما بأن وظائفك (functions) لا تغير أي شيء، بما في ذلك معطيات (arguments) الوظيفة أو أي متغير (variable) عام. +وأحد المبادئ الأساسية للبرمجة الوظيفية هو عدم تغيير الأشياء. التغييرات تؤدي إلى أعطال. من الأسهل منع الأعطال علما بأن وظائفك (functions) لا تغير أي شيء، بما في ذلك معطيات (arguments) الوظيفة أو أي متغير (variable) شامل. -المثال السابق لم يكن به أي عمليات معقدة ولكن طريقة (method) مسمى `splice` غيرت القائمة (array) الأصلية، وأسفرت عن حدوث خطأ. +المثال السابق لم يكن به أي عمليات معقدة ولكن `splice` غيرت القائمة (array) الأصلية، وأسفرت عن حدوث خطأ. تذكر أنه في البرمجة الوظيفية، تغيير الأشياء يسمى طفرة mutation، وتسمى النتيجة تأثير جانبي side effect. من الناحية المثالية، يجب أن تكون الوظيفة خالصة (pure function)، مما يعني أنها لا تسبب أي تأثيرات جانبية. @@ -22,7 +22,7 @@ dashedName: avoid-mutations-and-side-effects-using-functional-programming # --instructions-- -اكتب الكود للوظيفة `incrementer` حتي تنتج قيمة المتغير العام `fixedValue` بعد زيادة قيمته بواحد. +اكتب الكود للوظيفة `incrementer` حتي تنتج قيمة المتغير الشامل `fixedValue` بعد زيادة قيمته بواحد. # --hints-- @@ -40,7 +40,7 @@ const __newValue = incrementer(); assert(__newValue === 5); ``` -يجب أن تنتج الوظيفة `incrementer` قيمة استناداً إلى قيمة المتغير العام `fixedValue`. +يجب أن تنتج الوظيفة `incrementer` قيمة استناداً إلى قيمة المتغير الشامل `fixedValue`. ```js (function () { diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/learn-about-functional-programming.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/learn-about-functional-programming.md index 67c15cc6680..cb50314acba 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/learn-about-functional-programming.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/learn-about-functional-programming.md @@ -12,7 +12,7 @@ dashedName: learn-about-functional-programming تتعلق البرمجة الوظيفية (Functional) بما يلي: -1) وظائف منعزلة (Isolated functions) - لا تعتمد على حالة البرنامَج، الذي يشمل المتغيرات العامة (global) القابلة للتغيير +1) وظائف منعزلة (Isolated functions) - لا تعتمد على حالة البرنامَج، الذي يشمل المتغيرات الشاملة (global) القابلة للتغيير 2) الوظائف الخالصة (Pure functions) - نفس الإدخال يعطي دائمًا نفس الإخراج diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/pass-arguments-to-avoid-external-dependence-in-a-function.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/pass-arguments-to-avoid-external-dependence-in-a-function.md index cb28c538ff1..2ac83581024 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/pass-arguments-to-avoid-external-dependence-in-a-function.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/pass-arguments-to-avoid-external-dependence-in-a-function.md @@ -10,7 +10,7 @@ dashedName: pass-arguments-to-avoid-external-dependence-in-a-function التحدي الأخير كان يقترب خطوة من مبادئ الـ functional programming، ولكن لا يزال هناك شيء مفقود. -لم نقم بتغيير قيمة المتغير الـ global، ولكن الدالة `incrementer` لن تعمل بدون وجود المتغير الـ global و هو `fixedValue`، هناك. +لم نقم بتغيير قيمة المتغير الشامل (global)، ولكن الوظيفة `incrementer` لن تعمل بدون وجود المتغير الـشامل و هو `fixedValue`، هناك. وهناك مبدأ آخر للبرمجة الوظيفية (functional programming) وهو إعلان تبعياتك (dependencies) بشكل صريح. هذا يعني إذا كان الـ function يعتمد على متغير أو object موجود، قم بتمرير هذا المتغير أو الـ object مباشرة إلى الـ function كـ argument. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/refactor-global-variables-out-of-functions.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/refactor-global-variables-out-of-functions.md index 1a272d05998..eb8a48ed65b 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/refactor-global-variables-out-of-functions.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/refactor-global-variables-out-of-functions.md @@ -1,6 +1,6 @@ --- id: 587d7b8f367417b2b2512b60 -title: تعديل المتغيرات العالمية (Global Variables) لأخراجهم من الوظائف (Functions) +title: تعديل المتغيرات الشاملة (Global Variables) لأخراجهم من الوظائف (Functions) challengeType: 1 forumTopicId: 301235 dashedName: refactor-global-variables-out-of-functions @@ -12,7 +12,7 @@ dashedName: refactor-global-variables-out-of-functions 1) لا تغير متغير (variable) أو كائن (object) - أنشئ متغيرات و كائنات (objects) جديدة و منشئا من الوظيفة (function) إذا لزم الأمر. تلميح: باستخدام شيء مثل `const newArr = arrVar`، حيث `arrVar` هو array، سوف يقوم ببساطة بإنشاء مرجع إلى المتغير الحالي وليس نسخة. لذا فإن تغيير قيمة في `newArr` سيغير القيمة في `arrVar`. -2) إعلان وسائط الوظيفة (function parameters) - يعتمد حسابات داخل الوظيفة (function) فقط على المعطيات (arguments) التي تمر إلى الوظيفة (function)، ولا تعتمد على أي كائن (object) أو متغير (variable) عام (global). +2) أعلن وسائط الوظيفة (function parameters) - تعتمد الحسابات داخل الوظيفة (function) فقط على المعطيات (arguments) التي تعطى إلى الوظيفة (function)، ولا تعتمد على أي كائن (object) أو متغير (variable) شامل (global). إن إضافة واحد إلى رقما ليس مثيراً جداً، ولكن يمكننا تطبيق هذه المبادئ عند العمل مع arrays أو objects أكثر تعقيداً. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/remove-elements-from-an-array-using-slice-instead-of-splice.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/remove-elements-from-an-array-using-slice-instead-of-splice.md index 8c811a875a6..39f2c35a806 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/remove-elements-from-an-array-using-slice-instead-of-splice.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/remove-elements-from-an-array-using-slice-instead-of-splice.md @@ -21,7 +21,7 @@ cities.splice(3, 1); # --instructions-- -أعّد كتابة الوظيفة `nonMutatingSplice` باستخدام `slice` بدلاً من `splice`. يجب أن يقصر طول مصفوفة `cities` المقدمة على 3، ويعيد array جديدة تحتوي على العناصر الثلاثة الأولى فقط. +أعّد كتابة الوظيفة `nonMutatingSplice` باستخدام `slice` بدلاً من `splice`. يجب أن يقصر طول القائمة `cities` المقدمة على 3، ويعيد array جديدة تحتوي على العناصر الثلاثة الأولى فقط. لا تغيّر القائمة (array) الأصلية المقدمة للوظيفة (function). diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/return-a-sorted-array-without-changing-the-original-array.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/return-a-sorted-array-without-changing-the-original-array.md index cc07df5eb51..5be68a28d76 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/return-a-sorted-array-without-changing-the-original-array.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/return-a-sorted-array-without-changing-the-original-array.md @@ -1,6 +1,6 @@ --- id: 587d7da9367417b2b2512b6a -title: Return a Sorted Array Without Changing the Original Array +title: أرجع قائمة مفرزة دون تغير القائمة الأصلية challengeType: 1 forumTopicId: 301237 dashedName: return-a-sorted-array-without-changing-the-original-array @@ -8,15 +8,15 @@ dashedName: return-a-sorted-array-without-changing-the-original-array # --description-- -التأثير الجانبي لـ `sort` هو أنه يغير ترتيب العناصر في ال array الأصلية. وبعبارة أخرى، فإنه يغير ال array في مكانها. إحدى الطرق لتجنب ذلك هي أن تقوم أولاً بلزق array فارغة إلى ال array التي يتم فرزها (تذكر أن `slice` و `concat` تعيد array جديدة)، ثم قم بتشغيل `sort`. +التأثير الجانبي لطريقة `sort` هو أنخها تغير ترتيب العناصر في القائمة (array) الأصلية. وبعبارة أخرى، فإنه يغير ال array في مكانها. إحدى الطرق لتجنب ذلك هي أن تقوم أولاً بلزق array فارغة إلى ال array التي يتم فرزها (تذكر أن `slice` و `concat` تعيد array جديدة)، ثم قم بتشغيل `sort`. # --instructions-- -استخدم `sort` في الدالة `nonMutatingSort` لفرز عناصر array بالترتيب التصاعدي. يجب أن تعيد الدالة array جديدا، وليس تغيير متغير `globalArray`. +استخدم `sort` في الوظيفة `nonMutatingSort` لفرز عناصر array بالترتيب التصاعدي. يجب أن تعيد الوظيفة array جديدا، وليس تغيِّر متغير `globalArray`. # --hints-- -يجب أن يستخدم الكود الخاص بك دالة `sort`. +يجب أن يستخدم الكود الخاص بك طريقة `sort`. ```js assert(nonMutatingSort.toString().match(/\.sort/g)); @@ -37,26 +37,26 @@ assert( ); ``` -`nonMutatingSort(globalArray)` لا ينبغي أن تكون hard coded. +`nonMutatingSort(globalArray)` لا ينبغي أن تكون قيمها مثبتة (hard-coded). ```js assert(!nonMutatingSort.toString().match(/\[.*?[23569].*?\]/gs)); ``` -وينبغي أن تعيد الدالة array جديدا، وليس ال array التي تمرر إليها. +وينبغي أن تعيد الوظيفة array جديدا، وليس ال array التي أعطت ها. ```js assert(nonMutatingSort(globalArray) !== globalArray); ``` -`nonMutatingSort([1, 30, 4, 21, 100000])` يجب ان يعيد `[1, 4, 21, 30, 100000]`. +`nonMutatingSort([1, 30, 4, 21, 100000])` يجب ان تعيد `[1, 4, 21, 30, 100000]`. ```js assert(JSON.stringify(nonMutatingSort([1, 30, 4, 21, 100000])) === JSON.stringify([1, 4, 21, 30, 100000])) ``` -`nonMutatingSort([140000, 104, 99])` يجب ان يعيد `[99, 104, 140000]`. +`nonMutatingSort([140000, 104, 99])` يجب ان تعيد `[99, 104, 140000]`. ```js assert(JSON.stringify(nonMutatingSort([140000, 104, 99])) === diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/return-part-of-an-array-using-the-slice-method.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/return-part-of-an-array-using-the-slice-method.md index 8880fc4cc50..e4377dd2e60 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/return-part-of-an-array-using-the-slice-method.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/return-part-of-an-array-using-the-slice-method.md @@ -21,7 +21,7 @@ const newArray = arr.slice(1, 3); # --instructions-- -استخدم طريقة `slice` في `sliceArray` لإرجاع جزء من مصفوفة `anim` بالنظر إلى مؤشري `beginSlice` و `endSlice`. يجب أن تعيد الدالة array. +استخدم طريقة `slice` في `sliceArray` لإرجاع جزء من مصفوفة `anim` بالنظر إلى مؤشري `beginSlice` و `endSlice`. يجب أن تعيد الوظيفة array. # --hints-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/understand-the-hazards-of-using-imperative-code.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/understand-the-hazards-of-using-imperative-code.md index 928431bbc65..ae98f8e66c9 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/understand-the-hazards-of-using-imperative-code.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/understand-the-hazards-of-using-imperative-code.md @@ -12,7 +12,7 @@ Functional programming هي عادة جيدة. إنها تجعل الكود ال في اللغة الإنجليزية (والعديد من اللغات الأخرى) ، يتم استخدام صيغة الأمر لإعطاء الأوامر. وبالمثل ، فإن أسلوب الأمر في البرمجة هو الذي يعطي الكمبيوتر مجموعة من العبارات لأداء مهمة ما. -غالبًا ما تغير البيانات حالة البرنامج ، مثل تحديث المتغيرات العالمية(global variables). المثال الكلاسيكي هو كتابة حلقة `for` تعطي توجيهات دقيقة للتكرار على فهارس ال array. +غالبًا ما تغير البيانات حالة البرنامج ، مثل تحديث المتغيرات الشاملة (global variables). المثال الكلاسيكي هو كتابة حلقة `for` تعطي توجيهات دقيقة للتكرار على فهارس ال array. في المقابل، تكون البرمجة الوظيفية (functional programming) من أشكال البرمجة المعلنة (declarative programming). أنت تخبر الكمبيوتر بما تريد فعله عن طريق استدعاء method أو function. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/use-the-map-method-to-extract-data-from-an-array.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/use-the-map-method-to-extract-data-from-an-array.md index e9f557ab118..82e08157c9b 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/use-the-map-method-to-extract-data-from-an-array.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/use-the-map-method-to-extract-data-from-an-array.md @@ -12,7 +12,7 @@ dashedName: use-the-map-method-to-extract-data-from-an-array هذه هي البداية فقط. وكما يوحي اسمها، فإن ال functional programming تتمحور حول نظرية ال functions. -سيكون من المنطقي أن تكون قادرًا على تمريرها كـ arguments ل functions أخرى ، وإرجاع function من function أخر. تعتبر الدوال first class objects في جافا سكريبت، مما يعني أنه يمكن استخدامها مثل أي object آخر. يمكن حفظها في المتغيرات، أو تخزينها في object ما، أو تمريرها كـ function arguments. +سيكون من المنطقي أن تكون قادرًا على تمريرها كـ arguments ل functions أخرى ، وإرجاع function من function أخر. تعتبر الوظائف first class objects في جافا سكريبت، مما يعني أنه يمكن استخدامها مثل أي object آخر. يمكن حفظها في المتغيرات، أو تخزينها في object ما، أو تمريرها كـ function arguments. دعونا نبدأ ببعض الـ array functions البسيطة، التي هي methods على ال array object prototype. في هذا التمرين نحن ننظر إلى `Array.prototype.map()`أو ببساطة `map`. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/drop-it.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/drop-it.md index 06b9b57d7db..399c4bd1bac 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/drop-it.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/drop-it.md @@ -8,7 +8,7 @@ dashedName: drop-it # --description-- -بالنظر إلى المصفوفة `arr` ، كرر وأزل كل عنصر بدءًا من العنصر الأول (الفهرس 0) حتى تعرض الدالة `func` القيمة `true` عندما يتم تمرير العنصر المتكرر من خلالها. +بالنظر إلى المصفوفة `arr` ، كرر وأزل كل عنصر بدءًا من العنصر الأول (الفهرس 0) حتى تعرض الوظيفة `func` القيمة `true` عندما يتم تمرير العنصر المتكرر من خلالها. ثم ارجع بقية ال array بمجرد استيفاء الشرط، وإلا ، يجب إرجاع `arr` كـ array فارغة. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/search-and-replace.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/search-and-replace.md index 81a214a4046..095966de95d 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/search-and-replace.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/search-and-replace.md @@ -20,7 +20,7 @@ dashedName: search-and-replace # --hints-- -`myReplace("Let us go to the store", "store", "mall")` يجب أن يعيد السلسلة النصية `Let us go to the mall`. +`myReplace("Let us go to the store", "store", "mall")` يجب أن يعيد المقطع النصي `Let us go to the mall`. ```js assert.deepEqual( @@ -29,7 +29,7 @@ assert.deepEqual( ); ``` -`myReplace("He is Sleeping on the couch", "Sleeping", "sitting")` يجب أن يعيد السلسلة النصية `He is Sitting on the couch`. +`myReplace("He is Sleeping on the couch", "Sleeping", "sitting")` يجب أن يعيد المقطع النصي `He is Sitting on the couch`. ```js assert.deepEqual( @@ -38,7 +38,7 @@ assert.deepEqual( ); ``` -`myReplace("I think we should look up there", "up", "Down")` يجب أن يعيد السلسلة النصية `I think we should look down there`. +`myReplace("I think we should look up there", "up", "Down")` يجب أن يعيد المقطع النصي `I think we should look down there`. ```js assert.deepEqual( @@ -47,7 +47,7 @@ assert.deepEqual( ); ``` -`myReplace("This has a spellngi error", "spellngi", "spelling")` يجب أن يعيد السلسلة النصية `This has a spelling error`. +`myReplace("This has a spellngi error", "spellngi", "spelling")` يجب أن يعيد المقطع النصي `This has a spelling error`. ```js assert.deepEqual( @@ -56,7 +56,7 @@ assert.deepEqual( ); ``` -`myReplace("His name is Tom", "Tom", "john")` يجب أن يعيد السلسلة النصية `His name is John`. +`myReplace("His name is Tom", "Tom", "john")` يجب أن يعيد المقطع النصي `His name is John`. ```js assert.deepEqual( diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/steamroller.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/steamroller.md index 47943c19594..8dd6d0dcc28 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/steamroller.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/intermediate-algorithm-scripting/steamroller.md @@ -36,7 +36,7 @@ assert.deepEqual(steamrollArray([1, [], [3, [[4]]]]), [1, 3, 4]); assert.deepEqual(steamrollArray([1, {}, [3, [[4]]]]), [1, {}, 3, 4]); ``` -يجب ألا يستخدم الحل الخاص بك الدوال `Array.prototype.flat()` أو `Array.prototype.flatMap()`. +يجب ألا يستخدم الحل الخاص بك الوظائف `Array.prototype.flat()` أو `Array.prototype.flatMap()`. ```js assert(!code.match(/\.\s*flat\s*\(/) && !code.match(/\.\s*flatMap\s*\(/)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md index 99d520c10a2..92b5a944b3d 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/caesars-cipher.md @@ -1,6 +1,6 @@ --- id: 56533eb9ac21ba0edf2244e2 -title: Caesars Cipher +title: شفرة قيصر challengeType: 5 forumTopicId: 16003 dashedName: caesars-cipher diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/cash-register.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/cash-register.md index b0b6a4a3b6d..e1bee22eedd 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/cash-register.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/cash-register.md @@ -1,6 +1,6 @@ --- id: aa2e6f85cab2ab736c9a9b24 -title: Cash Register +title: مكنة لتسجيل النقود challengeType: 5 forumTopicId: 16012 dashedName: cash-register @@ -8,11 +8,11 @@ dashedName: cash-register # --description-- -قم بتصميم دالة درج تسجيل المدفوعات `checkCashRegister()` التي تقبل سعر الشراء كـ argument أولى (`price`)، و الدفع كـ argument ثانية (`cash`) ، و cash-in-drawer اي النقود في الدرج (`cid`) كـ argument ثالثة. +صمم وظيفة درج لتسجيل النقود `checkCashRegister()` التي تقبل سعر الشراء كمعطى أولى (`price`)، و الدفع كمعطى ثاني (`cash`)، و cash-in-drawer أي النقود في الدرج (`cid`) كمعطى ثالث. `cid` عبارة عن array ثنائية الأبعاد للعملة المتاحة. -يجب أن تقوم دالة `checkCashRegister()` دائما بإرجاع object يحتوي على key الـ `status` و key الـ `change`. +يجب أن تقوم وظيفة `checkCashRegister()` دائما بإنتاج كائن يحتوي على الهوية (key) المسمى `status` و الهوية `change`. قم بإرجاع `{status: "INSUFFICIENT_FUNDS", change: []}` إذا كان cash-in-drawer أقل من الباقي المستحق، أو إذا كنت لا تستطيع إرجاع الباقي بالضبط. @@ -40,7 +40,7 @@ dashedName: cash-register # --hints-- -`checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` يجب ان يرجع object. +يجب أن ينتج `checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` كائن. ```js assert.deepEqual( @@ -61,7 +61,7 @@ assert.deepEqual( ); ``` -`checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` يجب ان يرجع `{status: "OPEN", change: [["QUARTER", 0.5]]}`. +يجب أن ينتج `checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` كائن `{status: "OPEN", change: [["QUARTER", 0.5]]}`. ```js assert.deepEqual( @@ -80,7 +80,7 @@ assert.deepEqual( ); ``` -`checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` يجب ان يرجع `{status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}`. +يجب أن ينتج `checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])` كائن `{status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}`. ```js assert.deepEqual( @@ -110,7 +110,7 @@ assert.deepEqual( ); ``` -`checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` يجب ان يرجع `{status: "INSUFFICIENT_FUNDS", change: []}`. +يجب أن ينتج `checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` كائن `{status: "INSUFFICIENT_FUNDS", change: []}`. ```js assert.deepEqual( @@ -129,7 +129,7 @@ assert.deepEqual( ); ``` -`checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` يجب ان يرجع `{status: "INSUFFICIENT_FUNDS", change: []}`. +يجب أن ينتج `checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` كائن `{status: "INSUFFICIENT_FUNDS", change: []}`. ```js assert.deepEqual( @@ -148,7 +148,7 @@ assert.deepEqual( ); ``` -`checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` يجب ان يرجع `{status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}`. +يجب أن ينتج `checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])` كائن `{status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}`. ```js assert.deepEqual( diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/palindrome-checker.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/palindrome-checker.md index 6d07135f341..3fd98aeadf1 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/palindrome-checker.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/palindrome-checker.md @@ -1,6 +1,6 @@ --- id: aaa48de84e1ecc7c742e1124 -title: Palindrome Checker +title: مدقق لمعاكس المقطع النصي challengeType: 5 forumTopicId: 16004 dashedName: palindrome-checker diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md index cae6e022074..425b47c65b7 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/roman-numeral-converter.md @@ -1,6 +1,6 @@ --- id: a7f4d8f2483413a6ce226cac -title: Roman Numeral Converter +title: محول للأرقام الرومانية challengeType: 5 forumTopicId: 16044 dashedName: roman-numeral-converter diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md index 2101560a450..a744f7215c4 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/telephone-number-validator.md @@ -1,6 +1,6 @@ --- id: aff0395860f5d3034dc0bfc9 -title: Telephone Number Validator +title: مدقق الأرقام الهواتف challengeType: 5 forumTopicId: 16090 dashedName: telephone-number-validator diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/inherit-behaviors-from-a-supertype.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/inherit-behaviors-from-a-supertype.md index 107f5f942bf..65e3159bfb7 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/inherit-behaviors-from-a-supertype.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/inherit-behaviors-from-a-supertype.md @@ -44,13 +44,13 @@ animal instanceof Animal; # --hints-- -يجب تعريف متغير `duck`. +يجب إعلان متغير `duck`. ```js assert(typeof duck !== 'undefined'); ``` -يجب تعريف متغير `beagle`. +يجب إعلان متغير `beagle`. ```js assert(typeof beagle !== 'undefined'); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/iterate-over-all-properties.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/iterate-over-all-properties.md index 23edd5b7dcc..90230752779 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/iterate-over-all-properties.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/iterate-over-all-properties.md @@ -58,7 +58,7 @@ assert.deepEqual(ownProps, ['name']); assert.deepEqual(prototypeProps, ['numLegs']); ``` -يجب عليك حل هذا التحدي دون استخدام الدالة المدمجة في `Object.keys()`. +يجب عليك حل هذا التحدي دون استخدام الوظيفة المدمجة في `Object.keys()`. ```js assert(!/\Object.keys/.test(code)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/remember-to-set-the-constructor-property-when-changing-the-prototype.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/remember-to-set-the-constructor-property-when-changing-the-prototype.md index bc5d837e36b..5d8ca6f86be 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/remember-to-set-the-constructor-property-when-changing-the-prototype.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/remember-to-set-the-constructor-property-when-changing-the-prototype.md @@ -16,7 +16,7 @@ duck.constructor === Object; duck instanceof Bird; ``` -بالترتيب، سيتم تقييم هذه التعبيرات إلى `false`، و `true`، و `true`. +بالترتيب، سيتم تقييم هذه العبارات إلى `false`، و `true`، و `true`. لإصلاح هذا، عندما يتم تعيين prototype يدوياً إلى كائن جديد، تذكر أن تحدد خاصية `constructor`: diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/reset-an-inherited-constructor-property.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/reset-an-inherited-constructor-property.md index 4cc528aec6d..d74a6e690eb 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/reset-an-inherited-constructor-property.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/reset-an-inherited-constructor-property.md @@ -1,6 +1,6 @@ --- id: 587d7db1367417b2b2512b86 -title: إعادة تعيين خاصية موروثة (Reset an Inherited Constructor Property) +title: إعادة تعيين خاصية موروثة challengeType: 1 forumTopicId: 301324 dashedName: reset-an-inherited-constructor-property diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/understand-own-properties.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/understand-own-properties.md index 007005a1373..5a49dc2ece6 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/understand-own-properties.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/understand-own-properties.md @@ -54,7 +54,7 @@ assert(ownProps.indexOf('name') !== -1 && ownProps.indexOf('numLegs') !== -1); assert(!/Object(\.keys|\[(['"`])keys\2\])/.test(code)); ``` -يجب عليك حل هذا التحدي بدون hardcoding مصفوفة `ownProps`. +يجب عليك حل هذا التحدي بدون إدخال قيم مثبتة (hard-coding) في قائمة `ownProps`. ```js assert( diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/understand-the-immediately-invoked-function-expression-iife.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/understand-the-immediately-invoked-function-expression-iife.md index ac6b4a27acb..71e6d45c26f 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/understand-the-immediately-invoked-function-expression-iife.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/understand-the-immediately-invoked-function-expression-iife.md @@ -22,7 +22,7 @@ dashedName: understand-the-immediately-invoked-function-expression-iife # --instructions-- -أعد كتابة الدالة `makeNest` وأزيل استدعائها بحيث أنها تصبح anonymous immediately invoked function expression (IIFE). +أعد كتابة الوظيفة `makeNest` وأزيل استدعائها بحيث أنها تصبح anonymous immediately invoked function expression (IIFE). # --hints-- @@ -32,7 +32,7 @@ dashedName: understand-the-immediately-invoked-function-expression-iife assert(/\((function|\(\))(=>|\(\)){?/.test(code.replace(/\s/g, ''))); ``` -يجب أن يكون ال function الخاص بك بين قوسين في نهاية التعبير لاستدعائه على الفور. +يجب أن يكون ال function الخاص بك بين قوسين في نهاية العبارة لاستدعائه على الفور. ```js assert(/\(.*(\)\(|\}\(\))\)/.test(code.replace(/[\s;]/g, ''))); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/use-closure-to-protect-properties-within-an-object-from-being-modified-externally.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/use-closure-to-protect-properties-within-an-object-from-being-modified-externally.md index 17eb731e904..29c1ceb7889 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/use-closure-to-protect-properties-within-an-object-from-being-modified-externally.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/object-oriented-programming/use-closure-to-protect-properties-within-an-object-from-being-modified-externally.md @@ -18,7 +18,7 @@ bird.name = "Duffy"; لذلك، يمكن لأي جزء من الكود الخاص بك تغيير اسم `bird` بسهولة إلى أي قيمة. فكروا في أشياء مثل كلمات المرور والحسابات المصرفية التي يسهل تغييرها من قبل أي جزء من الكود الخاص بك. وهذا يمكن أن يسبب الكثير من المشاكل. -وأبسط طريقة لجعل هذه الخاصية العامة، خاصة، هي عن طريق إنشاء متغير داخل الـ constructor function. وهذا يغير نطاق ذلك المتغير بحيث يكون ضمن الـ constructor function علي عكس أن يكون متاحا بشكل global. وبهذه الطريقة، لا يمكن الوصول إلى المتغير وتغييره إلا بواسطة method تكون أيضا ضمن الـ constructor function. +وأبسط طريقة لجعل هذه الخاصية العامة، خاصة، هي عن طريق إنشاء متغير داخل الـ constructor function. وهذا يغير مجال ذلك المتغير بحيث يكون ضمن الـ constructor function علي عكس أن يكون متاحا بشكل شامل (global). وبهذه الطريقة، لا يمكن الوصول إلى المتغير وتغييره إلا بواسطة method تكون أيضا ضمن الـ constructor function. ```js function Bird() { @@ -32,7 +32,7 @@ let ducky = new Bird(); ducky.getHatchedEggCount(); ``` -هنا `getHatchedEggCount` هي method مميزة، لأنها لديها حق الوصول إلى المتغير الخاص `hatchedEgg`. هذا ممكن لإن `hatchedEgg` أعلنت في نفس السياق مثل `getHatchedEggCount`. في جافا سكريبت، الدالة دائما لها حق الوصول إلى السياق الذي تم إنشاؤها فيه. هذا يسمى `closure`. +هنا `getHatchedEggCount` هي method مميزة، لأنها لديها حق الوصول إلى المتغير الخاص `hatchedEgg`. هذا ممكن لإن `hatchedEgg` أعلنت في نفس السياق مثل `getHatchedEggCount`. في جافا سكريبت، الوظيفة دائما لها حق الوصول إلى السياق الذي تم إنشاؤها فيه. هذا يسمى `closure`. # --instructions-- diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/extract-matches.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/extract-matches.md index 1c334275991..0d4377c890d 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/extract-matches.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/extract-matches.md @@ -10,7 +10,7 @@ dashedName: extract-matches حتى الآن، كنت تتحقق فقط من وجود أو عدم وجود نمط داخل string. يمكنك أيضا استخراج المطابقات الفعلية التي وجدتها باستخدام دالة `.match()`. -لاستخدام دالة `.match()` ، قم بتطبيق الدالة على string ومرر بداخلها الـ regex في الأقواس. +لاستخدام وظيفة `.match()` ، قم بتطبيق الوظيفة على string ومرر بداخلها الـ regex في الأقواس. إليك مثال: diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/ignore-case-while-matching.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/ignore-case-while-matching.md index 2569210eee0..8e323e3c892 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/ignore-case-while-matching.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/ignore-case-while-matching.md @@ -8,7 +8,7 @@ dashedName: ignore-case-while-matching # --description-- -حتى الآن، لقد نظرتم إلى regex للقيام بمطابقة حرفية من الـ strings. ولكن في بعض الأحيان قد ترغب في مطابقة الاختلافات في الحالة. +حتى الآن، لقد نظرت إلى regex للتطابق المقاطع النصية حرفيًا. ولكن في بعض الأحيان قد ترغب في مطابقة الاختلافات في الحالة. Case و هي الحالة (او في بعض الاحيان letter case) هي الفرق بين uppercase letters و lowercase letters اي الاحرف الكبيرة و الاحرف الصغيرة. أمثلة للحروف الكبيرة هي `A` و `B` و `C`. أمثلة للحروف الصغيرة هي `a` و `b` و `c`. diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-a-literal-string-with-different-possibilities.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-a-literal-string-with-different-possibilities.md index 2ea80cd2c00..1bf8d52fc8e 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-a-literal-string-with-different-possibilities.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-a-literal-string-with-different-possibilities.md @@ -1,6 +1,6 @@ --- id: 587d7db4367417b2b2512b90 -title: طابق سلسلة حرفية (Literal String) مع احتمالات مختلفة +title: طابق مقطع نصي حرفي (Literal String) مع احتمالات مختلفة challengeType: 1 forumTopicId: 301345 dashedName: match-a-literal-string-with-different-possibilities @@ -8,9 +8,9 @@ dashedName: match-a-literal-string-with-different-possibilities # --description-- -باستخدام regexes مثل `/coding/`، يمكنك البحث عن النمط `coding` في سلسلة (string) أخرى. +باستخدام regexes مثل `/coding/`، يمكنك البحث عن النمط `coding` في مقطع نصي أخر. -هذا جيد للبحث عن سلسلة (string) واحدة، لكنه يقتصر على نمط واحد فقط. يمكنك البحث عن أنماط متعددة باستخدام `alternation` أو رمز `OR` التالي: `|`. +هذا جيد للبحث في مقطع نصي (string) واحد، لكنه يقتصر على نمط واحد فقط. يمكنك البحث عن أنماط متعددة باستخدام `alternation` أو رمز `OR` التالي: `|`. هذا المشغل يطابق الأنماط قبله أو بعده. على سبيل المثال، إذا كنت ترغب في مطابقة السلاسل (strings) باسم `yes` أو `no`، تريد regex إن يكون `/yes|no/`. @@ -22,49 +22,49 @@ dashedName: match-a-literal-string-with-different-possibilities # --hints-- -الـ regex الآتي `petRegex` يجب أن يرجع `true` للسلسلة `John has a pet dog.` +نمطـ regex الآتي `petRegex` يجب أن يرجع `true` للمقطع النصي `John has a pet dog.` ```js petRegex.lastIndex = 0; assert(petRegex.test('John has a pet dog.')); ``` -الـ regexا لآتي `petRegex` يجب أن يرجع `false` للسلسلة `Emma has a pet rock.` +نمط regex الآتي `petRegex` يجب أن يرجع `false` للمقطع النصي `Emma has a pet rock.` ```js petRegex.lastIndex = 0; assert(!petRegex.test('Emma has a pet rock.')); ``` -الـ regex الآتي `petRegex` يجب أن يرجع `true` للسلسلة `Emma has a pet bird.` +نمط regex الآتي `petRegex` يجب أن يرجع `true` للمقطع النصي `Emma has a pet bird.` ```js petRegex.lastIndex = 0; assert(petRegex.test('Emma has a pet bird.')); ``` -الـ regex الآتي `petRegex` يجب أن يرجع `true` للسلسلة `Liz has a pet cat.` +نمطـ regex الآتي `petRegex` يجب أن يرجع `true` للمقطع النصي `Liz has a pet cat.` ```js petRegex.lastIndex = 0; assert(petRegex.test('Liz has a pet cat.')); ``` -الـ regex الآتي `petRegex` يجب أن يرجع `false` للسلسلة `Kara has a pet dolphin.` +نمط regex الآتي `petRegex` يجب أن يرجع `false` للمقطع النصي `Kara has a pet dolphin.` ```js petRegex.lastIndex = 0; assert(!petRegex.test('Kara has a pet dolphin.')); ``` -الـ regex الآتي `petRegex` يجب أن يرجع `true` للسلسلة `Alice has a pet fish.` +نمط regex الآتي `petRegex` يجب أن يرجع `true` للمقطع النصي `Alice has a pet fish.` ```js petRegex.lastIndex = 0; assert(petRegex.test('Alice has a pet fish.')); ``` -الـ regex الآتي `petRegex` يجب أن يرجع `false` للسلسلة `Jimmy has a pet computer.` +نمط regex الآتي `petRegex` يجب أن يرجع `false` للمقطع النصي `Jimmy has a pet computer.` ```js petRegex.lastIndex = 0; diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-ending-string-patterns.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-ending-string-patterns.md index 097801f8194..4d927880c4d 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-ending-string-patterns.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-ending-string-patterns.md @@ -24,11 +24,11 @@ storyRegex.test(noEnding); # --instructions-- -استخدم رمز الدولار (`$`) لمطابقة السلسلة `caboose` في نهاية السلسة `caboose`. +استخدم رمز الدولار (`$`) لمطابقة المقطع النصي `caboose` في نهاية `caboose`. # --hints-- -يجب عليك البحث عن `caboose` باستخدام علامة الدولار `$` في الـ regex. +يجب عليك البحث عن `caboose` باستخدام علامة الدولار `$` في نمط regex. ```js assert(lastRegex.source == 'caboose$'); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-literal-strings.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-literal-strings.md index 12e58822420..fb762fe43fc 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-literal-strings.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-literal-strings.md @@ -1,6 +1,6 @@ --- id: 587d7db3367417b2b2512b8f -title: مطابقة السلاسل النصية (Match Literal Strings) +title: مطابقة النصوص الحرفية challengeType: 1 forumTopicId: 301355 dashedName: match-literal-strings @@ -8,7 +8,7 @@ dashedName: match-literal-strings # --description-- -في التحدي الأخير، بحثت عن كلمة `Hello` باستخدام regular expression الاتي `/Hello/`. هذا regex يبحث عن مطابقة حرفية في string الآتي `Hello`. إليك مثال آخر يبحث عن مطابقة حرفية في string الآتي `Kevin`: +في التحدي الأخير، بحثت عن كلمة `Hello` باستخدام regular expression الاتي `/Hello/`. هذا regex يبحث عن مطابقة حرفية في المقطع النصي الآتي `Hello`. إليك مثال آخر يبحث عن مطابقة حرفية في المقطع النصي الآتي `Kevin`: ```js let testStr = "Hello, my name is Kevin."; @@ -31,11 +31,11 @@ wrongRegex.test(testStr); # --instructions-- -أكمل regex الأتي `waldoRegex` للعثور على `"Waldo"` في السلسلة (string) النصية `waldoIsHiding` مع مطابقة حرفية. +أكمل regex الأتي `waldoRegex` للعثور على `"Waldo"` في المقطع (string) النصية `waldoIsHiding` مع مطابقة حرفية. # --hints-- -إن regex الخاص بك `waldoRegex` يجب أن يجد string الآتي `Waldo` +إن regex الخاص بك `waldoRegex` يجب أن يجد المقطع النصي الآتي `Waldo` ```js waldoRegex.lastIndex = 0; @@ -49,7 +49,7 @@ waldoRegex.lastIndex = 0; assert(!waldoRegex.test('Somewhere is hiding in this text.')); ``` -يجب عليك إجراء مطابقة حرفية للسلسلة (string) النصية باستخدام regex الخاص بك. +يجب عليك إجراء مطابقة حرفية للمقطع النصية (string) باستخدام regex الخاص بك. ```js assert(!/\/.*\/i/.test(code)); diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-single-character-with-multiple-possibilities.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-single-character-with-multiple-possibilities.md index b8c50b627d7..cf5d9ef796c 100644 --- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-single-character-with-multiple-possibilities.md +++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/regular-expressions/match-single-character-with-multiple-possibilities.md @@ -8,7 +8,7 @@ dashedName: match-single-character-with-multiple-possibilities # --description-- -تعلمت كيفية مطابقة الأنماط الحرفية (`/literal/`) و wildcard character (`/./`). هذه هي أقصى درجات التعبيرات النمطية، حيث يجد احدهم التطابقات الدقيقة والآخر يطابق كل شيء. وهناك خيارات تمثل توازنا بين الطرفين. +تعلمت كيفية مطابقة الأنماط الحرفية (`/literal/`) و wildcard character (`/./`). هذه هي أقصى درجات العبارات النمطية، حيث يجد احدهم التطابقات الدقيقة والآخر يطابق كل شيء. وهناك خيارات تمثل توازنا بين الطرفين. يمكنك البحث عن نمط حرفي مع بعض المرونة باستخدام character classes. تتيح لك Character classes تعريف مجموعة من الأحرف التي ترغب في تطابقها عن طريق وضعها داخل الأقواس المربعة (`[` و `]`). @@ -30,7 +30,7 @@ bogStr.match(bgRegex); # --instructions-- -استخدم character class مع حروف (`a`, `e`, `i`, `o`, `u`) في regex الخاص بك `vowelRegex` للعثور على جميع الـ vowels في السلسلة `quoteSample`. +استخدم character class مع حروف (`a`, `e`, `i`, `o`, `u`) في regex الخاص بك `vowelRegex` للعثور على جميع الـ vowels في المقطع النصي `quoteSample`. **ملاحظة**: تأكد من مطابقة الـ vowels الكبيرة و الصغيرة. diff --git a/curriculum/challenges/arabic/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md b/curriculum/challenges/arabic/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md index 9047a682546..d113b307ab5 100644 --- a/curriculum/challenges/arabic/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md +++ b/curriculum/challenges/arabic/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-drum-machine.md @@ -1,6 +1,6 @@ --- id: 587d7dbc367417b2b2512bae -title: أنشئ Drum Machine +title: أنشئ آلة الطبول challengeType: 3 forumTopicId: 301370 dashedName: build-a-drum-machine diff --git a/curriculum/challenges/arabic/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-javascript-calculator.md b/curriculum/challenges/arabic/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-javascript-calculator.md index 97c68f2113b..119c29cdf6c 100644 --- a/curriculum/challenges/arabic/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-javascript-calculator.md +++ b/curriculum/challenges/arabic/03-front-end-development-libraries/front-end-development-libraries-projects/build-a-javascript-calculator.md @@ -1,6 +1,6 @@ --- id: bd7158d8c442eddfaeb5bd17 -title: أنشئ حاسبة باستخدام JavaScript +title: بناء آلة حاسبة باستخدام JavaScript challengeType: 3 forumTopicId: 301371 dashedName: build-a-javascript-calculator diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md index 8f25970f37a..e706395eb64 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/exercise-tracker.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- @@ -411,7 +411,7 @@ The `description` property of any object in the `log` array that is returned fro ```js async(getUserInput) => { const url = getUserInput('url'); - const res = await fetch(url + '/api/users/', { + const res = await fetch(url + '/api/users', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -458,7 +458,7 @@ The `duration` property of any object in the `log` array that is returned from ` ```js async(getUserInput) => { const url = getUserInput('url'); - const res = await fetch(url + '/api/users/', { + const res = await fetch(url + '/api/users', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -505,7 +505,7 @@ The `date` property of any object in the `log` array that is returned from `GET ```js async(getUserInput) => { const url = getUserInput('url'); - const res = await fetch(url + '/api/users/', { + const res = await fetch(url + '/api/users', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md index e4a5775b2d2..dc47c463bb3 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/request-header-parser-microservice.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/request-header-parser-microservice.md index 5e4903c1937..9fcfc56b3ef 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/request-header-parser-microservice.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/request-header-parser-microservice.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --hints-- diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md index 6554ee0ff4b..053c4671344 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/timestamp-microservice.md @@ -8,25 +8,25 @@ dashedName: timestamp-microservice # --description-- -Build a full stack JavaScript app that is functionally similar to this: https://timestamp-microservice.freecodecamp.rocks. Working on this project will involve you writing your code using one of the following methods: +Build a full stack JavaScript app that is functionally similar to this: https://timestamp-microservice.freecodecamp.rocks. سوف يقوم يلزمك العمل على هذا المشروع بكتابة كود باستخدام إحدى الطرق التالية: -- Clone this GitHub repo and complete your project locally. -- Use our Replit starter project to complete your project. -- Use a site builder of your choice to complete the project. Be sure to incorporate all the files from our GitHub repo. +- أستنسخ هذا مستودع من GitHub واكمل مشروعك محلياً. +- استخدم مشروعنا المبدئي في Replit لإكمال مشروعك. +- استخدم أي منشئ لموقع لإكمال المشروع. تأكد من دمج جميع الملفات من مستودعنا في GitHub في مشروعك. -If you use Replit, follow these steps to set up the project: +إذا كنت تستخدم Replit، اتبع هذه الخطوات لإعداد المشروع: -- Start by importing the project on Replit. -- Next, you will see a `.replit` window. -- Select `Use run command` and click the `Done` button. +- ابدأ باستيراد (import) المشروع على Replit. +- بعد ذلك، سترى نافذة `.replit`. +- اختار `Use run command` وانقر على زر `Done`. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. ثم أرسل عنوان (URL) إليه في خانة "رابط الحل". وإن أردت تستطيع أيضًا إرسال رابط لكود المصدر لمشروعك في الخانة "رابط Github". -**Note:** Time zones conversion is not a purpose of this project, so assume all sent valid dates will be parsed with `new Date()` as GMT dates. +**ملاحظة:** ليس الغرض من هذا المشروع تحويل المناطق الزمنية، لذلك افترض إن جميع التواريخ الصحيحة المرسلة ستحلل بواسطة `new Date()` كتواريخ GMT. # --hints-- -You should provide your own project, not the example URL. +يجب عليك تقديم URL لمشروعك، وليس عنوان المثال. ```js (getUserInput) => { @@ -36,7 +36,7 @@ You should provide your own project, not the example URL. }; ``` -A request to `/api/:date?` with a valid date should return a JSON object with a `unix` key that is a Unix timestamp of the input date in milliseconds (as type Number) +يجب أن ينتج كائن JSON عند طلب `/api/:date?` التاريخ الصحيح بهوية (key) المسمى `unix` الذي يكون طابع زمني Unix من تاريخ المدخل بالمللي ثانية (كرقم) ```js (getUserInput) => @@ -54,7 +54,7 @@ A request to `/api/:date?` with a valid date should return a JSON object with a ); ``` -A request to `/api/:date?` with a valid date should return a JSON object with a `utc` key that is a string of the input date in the format: `Thu, 01 Jan 1970 00:00:00 GMT` +يجب أن ينتج عند كائن JSON طلب `/api/:date?` مع تاريخ صحيح مع هوية `utc` وتكون قيمته مقطع نصي من تاريخ المدخل. وينسق مثل: `Thu, 01 Jan 1970 00:00:00 GMT` ```js (getUserInput) => @@ -106,7 +106,7 @@ Your project can handle dates that can be successfully parsed by `new Date(date_ ); ``` -If the input date string is invalid, the api returns an object having the structure `{ error : "Invalid Date" }` +If the input date string is invalid, the API returns an object having the structure `{ error : "Invalid Date" }` ```js (getUserInput) => diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md index b3531c2adde..58cf09e170e 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/back-end-development-and-apis-projects/url-shortener-microservice.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md index 7a1e893fe24..3d0fd252f7f 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. During the development process, it is important to be able to check what’s going on in your code. diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/serve-an-html-file.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/serve-an-html-file.md index 1d618673227..b15f95ac820 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/serve-an-html-file.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/serve-an-html-file.md @@ -8,7 +8,7 @@ dashedName: serve-an-html-file # --description-- -You can respond to requests with a file using the `res.sendFile(path)` method. You can put it inside the `app.get('/', ...)` route handler. Behind the scenes, this method will set the appropriate headers to instruct your browser on how to handle the file you want to send, according to its type. Then it will read and send the file. This method needs an absolute file path. We recommend you to use the Node global variable `__dirname` to calculate the path like this: +You can respond to requests with a file using the `res.sendFile(path)` method. You can put it inside the `app.get('/', ...)` route handler. خلف الكواليس، ستضبط تلك الطريقة العناوين المناسبة لترشد متصفحك عن كيفية التعامل مع الملف الذي تريد إرساله، وفقًا لنوعه. Then it will read and send the file. This method needs an absolute file path. We recommend you to use the Node global variable `__dirname` to calculate the path like this: ```js absolutePath = __dirname + relativePath/file.ext diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/serve-json-on-a-specific-route.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/serve-json-on-a-specific-route.md index 1e977061c7c..91adaf364a0 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/serve-json-on-a-specific-route.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/basic-node-and-express/serve-json-on-a-specific-route.md @@ -18,7 +18,7 @@ Serve the object `{"message": "Hello json"}` as a response, in JSON format, to G # --hints-- -The endpoint `/json` should serve the json object `{"message": "Hello json"}` +The endpoint `/json` should serve the JSON object `{"message": "Hello json"}` ```js (getUserInput) => diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/managing-packages-with-npm/how-to-use-package.json-the-core-of-any-node.js-project-or-npm-package.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/managing-packages-with-npm/how-to-use-package.json-the-core-of-any-node.js-project-or-npm-package.md index c3085c6b7e7..252f7b168fe 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/managing-packages-with-npm/how-to-use-package.json-the-core-of-any-node.js-project-or-npm-package.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/managing-packages-with-npm/how-to-use-package.json-the-core-of-any-node.js-project-or-npm-package.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. The `package.json` file is the center of any Node.js project or npm package. It stores information about your project, similar to how the <head> section of an HTML document describes the content of a webpage. It consists of a single JSON object where information is stored in key-value pairs. There are only two required fields; "name" and "version", but it’s good practice to provide additional information about your project that could be useful to future users or maintainers. diff --git a/curriculum/challenges/arabic/05-back-end-development-and-apis/mongodb-and-mongoose/install-and-set-up-mongoose.md b/curriculum/challenges/arabic/05-back-end-development-and-apis/mongodb-and-mongoose/install-and-set-up-mongoose.md index e85618c8dc8..19e240e2b58 100644 --- a/curriculum/challenges/arabic/05-back-end-development-and-apis/mongodb-and-mongoose/install-and-set-up-mongoose.md +++ b/curriculum/challenges/arabic/05-back-end-development-and-apis/mongodb-and-mongoose/install-and-set-up-mongoose.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. In this challenge, you will set up a MongoDB Atlas database and import the required packages to connect to it. diff --git a/curriculum/challenges/arabic/06-quality-assurance/advanced-node-and-express/set-up-a-template-engine.md b/curriculum/challenges/arabic/06-quality-assurance/advanced-node-and-express/set-up-a-template-engine.md index 21fe152c135..e14beb131fc 100644 --- a/curriculum/challenges/arabic/06-quality-assurance/advanced-node-and-express/set-up-a-template-engine.md +++ b/curriculum/challenges/arabic/06-quality-assurance/advanced-node-and-express/set-up-a-template-engine.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. A template engine enables you to use static template files (such as those written in *Pug*) in your app. At runtime, the template engine replaces variables in a template file with actual values which can be supplied by your server. Then it transforms the template into a static HTML file that is sent to the client. This approach makes it easier to design an HTML page and allows for displaying variables on the page without needing to make an API call from the client. diff --git a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-and-testing-with-chai/learn-how-javascript-assertions-work.md b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-and-testing-with-chai/learn-how-javascript-assertions-work.md index 23b56148e88..c3021aaf31e 100644 --- a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-and-testing-with-chai/learn-how-javascript-assertions-work.md +++ b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-and-testing-with-chai/learn-how-javascript-assertions-work.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/american-british-translator.md b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/american-british-translator.md index 7ebf38ca39d..06069d9be10 100644 --- a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/american-british-translator.md +++ b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/american-british-translator.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/issue-tracker.md b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/issue-tracker.md index 58acba61876..15d2437574f 100644 --- a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/issue-tracker.md +++ b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/issue-tracker.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md index f847638bba4..90e2329e195 100644 --- a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md +++ b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/metric-imperial-converter.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/personal-library.md b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/personal-library.md index 31b48ccb37b..a6abf77e231 100644 --- a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/personal-library.md +++ b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/personal-library.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/sudoku-solver.md b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/sudoku-solver.md index 096971fa4d1..ee1c337c9f5 100644 --- a/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/sudoku-solver.md +++ b/curriculum/challenges/arabic/06-quality-assurance/quality-assurance-projects/sudoku-solver.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-a.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-a.md index 5af2ffef9af..b8303dfe789 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-a.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-a.md @@ -16,8 +16,8 @@ dashedName: data-analysis-example-a More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks على GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-b.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-b.md index 19441c3cd45..68d4726de00 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-b.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-analysis-example-b.md @@ -16,8 +16,8 @@ dashedName: data-analysis-example-b More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks على GitHub +- كيفية فتح Notebook من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-and-visualizations.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-and-visualizations.md index 340cd5351d6..3d0c996789f 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-and-visualizations.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-and-visualizations.md @@ -16,8 +16,8 @@ dashedName: data-cleaning-and-visualizations More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks على GitHub +- كيفية فتح Notebook من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-with-dataframes.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-with-dataframes.md index e1a58cfd19c..3f009dadd5a 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-with-dataframes.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/data-cleaning-with-dataframes.md @@ -16,8 +16,8 @@ dashedName: data-cleaning-with-dataframes More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks على GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-cells.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-cells.md index d266151844d..869c74f4398 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-cells.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-cells.md @@ -16,8 +16,8 @@ dashedName: jupyter-notebooks-cells More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح (Notebook) من (GitHub) باستخدام (Google Colab). # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-importing-and-exporting-data.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-importing-and-exporting-data.md index be927727e87..343133d911e 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-importing-and-exporting-data.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/jupyter-notebooks-importing-and-exporting-data.md @@ -16,8 +16,8 @@ dashedName: jupyter-notebooks-importing-and-exporting-data More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebook من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-algebra-and-size.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-algebra-and-size.md index d6292da8d5c..a68eef03d86 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-algebra-and-size.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-algebra-and-size.md @@ -16,8 +16,8 @@ dashedName: numpy-algebra-and-size More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-a.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-a.md index d9f980b8ae1..9f450d3f069 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-a.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-a.md @@ -16,8 +16,8 @@ dashedName: numpy-introduction-a More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-b.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-b.md index f76d5bf6d1c..f0fc8bcb21b 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-b.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-introduction-b.md @@ -16,8 +16,8 @@ dashedName: numpy-introduction-b More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-operations.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-operations.md index 166ee7c6d05..c5132c8e507 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-operations.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/numpy-operations.md @@ -16,8 +16,8 @@ dashedName: numpy-operations More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/pandas-conditional-selection-and-modifying-dataframes.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/pandas-conditional-selection-and-modifying-dataframes.md index d16b2a8235f..5c358d257b8 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/pandas-conditional-selection-and-modifying-dataframes.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/pandas-conditional-selection-and-modifying-dataframes.md @@ -16,8 +16,8 @@ dashedName: pandas-conditional-selection-and-modifying-dataframes More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebook من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/pandas-creating-columns.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/pandas-creating-columns.md index c9bd03fcb63..0c78b59b512 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/pandas-creating-columns.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/pandas-creating-columns.md @@ -16,8 +16,8 @@ dashedName: pandas-creating-columns More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح (Notebook) من (GitHub) باستخدام (Google Colab). # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-functions-and-collections.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-functions-and-collections.md index fdce91d05f7..0ce305f71c1 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-functions-and-collections.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-functions-and-collections.md @@ -16,8 +16,8 @@ dashedName: python-functions-and-collections More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-introduction.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-introduction.md index 8bd079a0a4f..7b932c803e3 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-introduction.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-introduction.md @@ -16,8 +16,8 @@ dashedName: python-introduction More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-iteration-and-modules.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-iteration-and-modules.md index fddbd3b10c9..0fc48fb2801 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-iteration-and-modules.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/python-iteration-and-modules.md @@ -16,8 +16,8 @@ dashedName: python-iteration-and-modules More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-csv-and-txt.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-csv-and-txt.md index 0291043e715..4c84ec0dc74 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-csv-and-txt.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-csv-and-txt.md @@ -16,8 +16,8 @@ dashedName: reading-data-csv-and-txt More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-from-databases.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-from-databases.md index 21186179430..f6578128629 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-from-databases.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-from-databases.md @@ -16,8 +16,8 @@ dashedName: reading-data-from-databases More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-introduction.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-introduction.md index 2822287ab61..1c067111e1b 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-introduction.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-course/reading-data-introduction.md @@ -16,8 +16,8 @@ dashedName: reading-data-introduction More resources: -- Notebooks on GitHub -- How to open Notebooks from GitHub using Google Colab. +- Notebooks في GitHub +- كيفية فتح Notebooks من GitHub باستخدام Google Colab. # --question-- diff --git a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md index 6e50f9b861a..3b3ad3a4b1f 100644 --- a/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md +++ b/curriculum/challenges/arabic/08-data-analysis-with-python/data-analysis-with-python-projects/sea-level-predictor.md @@ -28,7 +28,7 @@ You will analyze a dataset of the global average sea level change since 1880. Yo Use the data to complete the following tasks: - Use Pandas to import the data from `epa-sea-level.csv`. -- Use matplotlib to create a scatter plot using the `Year` column as the x-axis and the `CSIRO Adjusted Sea Level` column as the y-axix. +- Use matplotlib to create a scatter plot using the `Year` column as the x-axis and the `CSIRO Adjusted Sea Level` column as the y-axis. - Use the `linregress` function from `scipy.stats` to get the slope and y-intercept of the line of best fit. Plot the line of best fit over the top of the scatter plot. Make the line go through the year 2050 to predict the sea level rise in 2050. - Plot a new line of best fit just using the data from year 2000 through the most recent year in the dataset. Make the line also go through the year 2050 to predict the sea level rise in 2050 if the rate of rise continues as it has since the year 2000. - The x label should be `Year`, the y label should be `Sea Level (inches)`, and the title should be `Rise in Sea Level`. diff --git a/curriculum/challenges/arabic/09-information-security/information-security-projects/anonymous-message-board.md b/curriculum/challenges/arabic/09-information-security/information-security-projects/anonymous-message-board.md index b34a819caaa..f219e784a77 100644 --- a/curriculum/challenges/arabic/09-information-security/information-security-projects/anonymous-message-board.md +++ b/curriculum/challenges/arabic/09-information-security/information-security-projects/anonymous-message-board.md @@ -22,7 +22,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/09-information-security/information-security-projects/secure-real-time-multiplayer-game.md b/curriculum/challenges/arabic/09-information-security/information-security-projects/secure-real-time-multiplayer-game.md index ae8a2cc7f90..361ebe837ea 100644 --- a/curriculum/challenges/arabic/09-information-security/information-security-projects/secure-real-time-multiplayer-game.md +++ b/curriculum/challenges/arabic/09-information-security/information-security-projects/secure-real-time-multiplayer-game.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/09-information-security/information-security-projects/stock-price-checker.md b/curriculum/challenges/arabic/09-information-security/information-security-projects/stock-price-checker.md index afa2e0cb78c..08b61006de7 100644 --- a/curriculum/challenges/arabic/09-information-security/information-security-projects/stock-price-checker.md +++ b/curriculum/challenges/arabic/09-information-security/information-security-projects/stock-price-checker.md @@ -24,7 +24,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --instructions-- diff --git a/curriculum/challenges/arabic/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md b/curriculum/challenges/arabic/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md index aa629a3d144..172f70d0c97 100644 --- a/curriculum/challenges/arabic/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md +++ b/curriculum/challenges/arabic/09-information-security/information-security-with-helmetjs/install-and-require-helmet.md @@ -20,7 +20,7 @@ If you use Replit, follow these steps to set up the project: - Next, you will see a `.replit` window. - Select `Use run command` and click the `Done` button. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Helmet helps you secure your Express apps by setting various HTTP headers. diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/algorithms/implement-binary-search.md b/curriculum/challenges/arabic/10-coding-interview-prep/algorithms/implement-binary-search.md index bd2e8306ee1..caa2c40514c 100644 --- a/curriculum/challenges/arabic/10-coding-interview-prep/algorithms/implement-binary-search.md +++ b/curriculum/challenges/arabic/10-coding-interview-prep/algorithms/implement-binary-search.md @@ -10,9 +10,10 @@ dashedName: implement-binary-search Binary search is an **O(log(n))** efficiency algorithm for searching a sorted array to find an element. It operates using the following steps: -1. Find the middle `value` of a sorted array. If `value == target` return (found it!). +1. Find the middle `value` of a sorted array. If `value == target` return `true` (The value has been found and the search is complete). 1. If middle `value < target`, search right half of array in next compare. 1. If middle `value > target`, search left half of array in next compare. +1. If after searching the whole array the value is not present, return `false` (The array has been searched and the value is not in the array). As you can see, you are successively halving an array, which gives you the log(n) efficiency. For this challenge, we want you to show your work - how you got to the target value... the path you took! @@ -20,7 +21,7 @@ As you can see, you are successively halving an array, which gives you the log(n Write a function `binarySearch` that implements the binary search algorithm on an array, returning the path you took (each middle value comparison) to find the target in an array. -The function takes a sorted array of integers and a target value as input. It returns an array containing (in-order) the middle value you found at each halving of the original array until you found the target value. The target value should be the last element of the returned array. If value not is found, return the string `Value Not Found`. +The function takes a sorted array of integers and a target value as input. It returns an array containing (in-order) the middle value you found at each halving of the original array until you found the target value. The target value should be the last element of the returned array. If the value is not found, return the string `Value Not Found`. For example, `binarySearch([1,2,3,4,5,6,7], 5)` would return `[4,6,5]`. diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-a-nightlife-coordination-app.md b/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-a-nightlife-coordination-app.md index 8dd028cc0c2..c75478c71af 100644 --- a/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-a-nightlife-coordination-app.md +++ b/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-a-nightlife-coordination-app.md @@ -22,7 +22,7 @@ Here are the specific user stories you should implement for this project: **Hint:** Try using the Yelp API to find venues in the cities your users search for. If you use Yelp's API, be sure to mention so in your app. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --solutions-- diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-a-voting-app.md b/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-a-voting-app.md index c5e1f8c05dd..e70b3566764 100644 --- a/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-a-voting-app.md +++ b/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-a-voting-app.md @@ -28,7 +28,7 @@ Here are the specific user stories you should implement for this project: **User Story:** As an authenticated user, if you don't like the options on a poll, you can create a new option. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --solutions-- diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-an-image-search-abstraction-layer.md b/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-an-image-search-abstraction-layer.md index 47cee2ababe..4c4540d7fce 100644 --- a/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-an-image-search-abstraction-layer.md +++ b/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/build-an-image-search-abstraction-layer.md @@ -18,7 +18,7 @@ Here are the specific user stories you should implement for this project: **User Story:** You can get a list of the most recently submitted search strings. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --solutions-- diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/chart-the-stock-market.md b/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/chart-the-stock-market.md index a5562365284..c43de0dbaef 100644 --- a/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/chart-the-stock-market.md +++ b/curriculum/challenges/arabic/10-coding-interview-prep/take-home-projects/chart-the-stock-market.md @@ -20,7 +20,7 @@ Here are the specific user stories you should implement for this project: **User Story:** You can see changes in real-time when any other user adds or removes a stock. For this you will need to use Web Sockets. -When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the `Solution Link` field. Optionally, also submit a link to your project's source code in the `GitHub Link` field. +When you are done, make sure a working demo of your project is hosted somewhere public. Then submit the URL to it in the Solution Link field. Optionally, also submit a link to your project's source code in the GitHub Link field. # --solutions-- diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md new file mode 100644 index 00000000000..f4b05b12871 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/elements-and-tags-question-a.md @@ -0,0 +1,54 @@ +--- +id: 637f4e0e72c65bc8e73dfe1e +videoId: LGQuIIv2RVA +title: Elements and Tags Question A +challengeType: 15 +dashedName: elements-and-tags-question-a +--- + +# --description-- + +Almost all elements on an HTML page are just pieces of content wrapped in opening and closing HTML tags. + +Opening tags tell the browser this is the start of an HTML element. They are comprised of a keyword enclosed in angle brackets `<>`. For example, an opening paragraph tag looks like this: `

`. + +Closing tags tell the browser where an element ends. They are almost the same as opening tags; the only difference is that they have a forward slash before the keyword. For example, a closing paragraph tag looks like this: `

`. + +A full paragraph element looks like this: + +element diagram + +You can think of elements as containers for content. The opening and closing tags tell the browser what content the element contains. The browser can then use that information to determine how it should interpret and format the content. + +There are some HTML elements that do not have a closing tag. These elements often look like this: `
` or ``, but some can also be used without the closing forward slash such as `
` or ``. These are known as self-closing tags or empty elements because they don’t wrap any content. You will encounter a few of these in later lessons, but for the most part, elements will have both opening and closing tags. + +HTML has a vast list of predefined tags that you can use to create all kinds of different elements. It is important to use the correct tags for content. Using the correct tags can have a big impact on two aspects of your sites: how they are ranked in search engines; and how accessible they are to users who rely on assistive technologies, like screen readers, to use the internet. + +Using the correct elements for content is called semantic HTML. You will explore this in much more depth later on in the curriculum. + +# --question-- + +## --assignment-- + +Watch Kevin Powell’s [Introduction to HTML video](https://www.youtube.com/watch?v=LGQuIIv2RVA&list=PL4-IK0AVhVjM0xE0K2uZRvsM7LkIhsPT-) + +## --text-- + +What are HTML tags? + +## --answers-- + +HTML tags tell the browser what content an element contains. + +--- + +HTML tags tell the browser when to load its content. + +--- + +HTML tags tell the browser what content the next element contains. + + +## --video-solution-- + +1 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md new file mode 100644 index 00000000000..9e8720616fb --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/elements-and-tags-question-b.md @@ -0,0 +1,50 @@ +--- +id: 637f4e1672c65bc8e73dfe1f +videoId: LGQuIIv2RVA +title: Elements and Tags Question B +challengeType: 15 +dashedName: elements-and-tags-question-b +--- + +# --description-- + +Almost all elements on an HTML page are just pieces of content wrapped in opening and closing HTML tags. + +Opening tags tell the browser this is the start of an HTML element. They are comprised of a keyword enclosed in angle brackets <>. For example, an opening paragraph tag looks like this: `

`. + +Closing tags tell the browser where an element ends. They are almost the same as opening tags; the only difference is that they have a forward slash before the keyword. For example, a closing paragraph tag looks like this: `

`. + +A full paragraph element looks like this: + +element diagram + +You can think of elements as containers for content. The opening and closing tags tell the browser what content the element contains. The browser can then use that information to determine how it should interpret and format the content. + +There are some HTML elements that do not have a closing tag. These elements often look like this: `
` or ``, but some can also be used without the closing forward slash such as `
` or ``. These are known as self-closing tags or empty elements because they don’t wrap any content. You will encounter a few of these in later lessons, but for the most part, elements will have both opening and closing tags. + +HTML has a vast list of predefined tags that you can use to create all kinds of different elements. It is important to use the correct tags for content. Using the correct tags can have a big impact on two aspects of your sites: how they are ranked in search engines; and how accessible they are to users who rely on assistive technologies, like screen readers, to use the internet. + +Using the correct elements for content is called semantic HTML. You will explore this in much more depth later on in the curriculum. + +# --question-- + +## --text-- + +What are the three parts of most HTML elements? + +## --answers-- + +An opening tag, self closing tag, and content. + +--- + +An opening tag, closing tag, and content. + +--- + +An opening tag, closing tag, and attribute. + + +## --video-solution-- + +2 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md new file mode 100644 index 00000000000..d563ebf0ac3 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-a.md @@ -0,0 +1,55 @@ +--- +id: 637f4e1c72c65bc8e73dfe20 +videoId: V8UAEoOvqFg +title: HTML Boilerplate Question A +challengeType: 15 +dashedName: html-boilerplate-question-a +--- + +# --description-- + +To demonstrate an HTML boilerplate, you first need an HTML file to work with. + +Create a new folder on your computer and name it `html-boilerplate`. Within that folder create a new file and name it `index.html`. + +You’re probably already familiar with a lot of different types of files, for example doc, pdf, and image files. + +To let the computer know you want to create an HTML file, you need to append the filename with the `.html` extension as you have done when creating the `index.html` file. + +It is worth noting that you named your HTML file index. You should always name the HTML file that will contain the homepage of your websites `index.html`. This is because web servers will by default look for an index.html page when users land on your websites - and not having one will cause big problems. + +## The DOCTYPE + +Every HTML page starts with a doctype declaration. The doctype’s purpose is to tell the browser what version of HTML it should use to render the document. The latest version of HTML is HTML5, and the doctype for that version is simply ``. + +The doctypes for older versions of HTML were a bit more complicated. For example, this is the doctype declaration for HTML4: + +```html + +``` + +However, you probably won’t ever want to be using an older version of HTML, and so you’ll always use ``. + +Open the `index.html` file created earlier in your text editor and add `` to the very first line. + +# --question-- +## --text-- + +What is the purpose of the `DOCTYPE` declaration? + +## --answers-- + +It tells the browser which version of HTML to use to render the document. + +--- + +It tells the browser that this document uses JavaScript. + +--- + +It tells the browser the title of the document. + + +## --video-solution-- + +1 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md new file mode 100644 index 00000000000..7a528432239 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-b.md @@ -0,0 +1,47 @@ +--- +id: 637f4e2872c65bc8e73dfe21 +videoId: V8UAEoOvqFg +title: HTML Boilerplate Question B +challengeType: 15 +dashedName: html-boilerplate-question-b +--- + +# --description-- + +After you declare the doctype, you need to provide an `` element. This is what’s known as the root element of the document, meaning that every other element in the document will be a descendant of it. + +This becomes more important later on when you learn about manipulating HTML with JavaScript. For now, just know that the `html` element should be included on every HTML document. + +Back in the `index.html` file, let’s add the `` element by typing out its opening and closing tags, like so: + +```html + + + +``` + +## What is the lang attribute? +`lang` specifies the language of the text content in that element. This attribute is primarily used for improving accessibility of the webpage. It allows assistive technologies, for example screen readers, to adapt according to the language and invoke correct pronunciation. + +# --question-- + +## --text-- + +What is the `html` element? + +## --answers-- + +It is the root element in the document and tells the browser which version of HTML it should use. + +--- + +It is the root element in the document and all other elements should descend from it. + +--- + +It is the root element in the document and all other elements should come after it. + + +## --video-solution-- + +2 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md new file mode 100644 index 00000000000..76ceb2841e5 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-c.md @@ -0,0 +1,66 @@ +--- +id: 637f4e2f72c65bc8e73dfe22 +videoId: LGQuIIv2RVA +title: HTML Boilerplate Question C +challengeType: 15 +dashedName: html-boilerplate-question-c +--- + +# --description-- + +The `` element is where you put important meta-information about your webpages, and stuff required for your webpages to render correctly in the browser. Inside the ``, you should not use any element that displays content on the webpage. + +## The Charset Meta Element +You should always have the `meta` tag for the charset encoding of the webpage in the head element: ``. + +Setting the encoding is very important because it ensures that the webpage will display special symbols and characters from different languages correctly in the browser. + +## Title Element +Another element you should always include in the head of an HTML document is the `title` element: + +```html +My First Webpage +``` + +The `title` element is used to give webpages a human-readable title which is displayed in your webpage’s browser tab. + +If you didn’t include a `title` element, the webpage’s title would default to its file name. In your case that would be `index.html`, which isn’t very meaningful for users; this would make it very difficult to find your webpage if the user has many browser tabs open. + +There are many more elements that can go within the `head` of an HTML document. However, for now it’s only crucial to know about the two elements you have covered here. You will introduce more elements that go into the `head` throughout the rest of the curriculum. + +Back in `index.html` file, let’s add a `head` element with a `charset` `meta` element and a `title` within it. The head element goes within the HTML element and should always be the first element under the opening `` tag: + + +```html + + + + + + My First Webpage + + +``` + +# --question-- + +## --text-- + +What is the purpose of the `head` element? + +## --answers-- + +The `head` element is used to display all elements that are displayed on the webpage. + +--- + +The `head` element is used to display important information about your webpage and is used to render web pages correctly with `meta` elements. + +--- + +The `head` element is used to display the header content on top of the webpage. + + +## --video-solution-- + +2 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md new file mode 100644 index 00000000000..302b6a95d44 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/html-boilerplate-question-d.md @@ -0,0 +1,48 @@ +--- +id: 637f4e3672c65bc8e73dfe23 +videoId: V8UAEoOvqFg +title: HTML Boilerplate Question D +challengeType: 15 +dashedName: html-boilerplate-question-d +--- + +# --description-- + +The final element needed to complete the HTML boilerplate is the `` element. This is where all the content that will be displayed to users will go - the text, images, lists, links, and so on. + +To complete the boilerplate, add a `body` element to the `index.html` file. The `body` element also goes within the `html` element and is always below the `head` element, like so: + +# --question-- + +## --assignment-- + +Watch and follow along to Kevin Powell’s brilliant Building your first web page video above. + +--- + +Build some muscle memory by deleting the contents of the `index.html` file and trying to write out all the boilerplate again from memory. Don’t worry if you have to peek at the lesson content the first few times if you get stuck. Just keep going until you can do it a couple of times from memory. + +--- + +Run your boilerplate through this [HTML validator](https://www.freeformatter.com/html-validator.html). Validators ensure your markup is correct and are an excellent learning tool, as they provide feedback on syntax errors you may be making often and aren’t aware of, such as missing closing tags and extra spaces in your HTML. + +## --text-- + +What is the purpose of the `body` element? + +## --answers-- + +This is where all important information about the webpage is displayed such as the `title` and `meta` tags. + +--- + +This is where you tell the browser how to render the webpage correctly. + +--- + +This is where all content will be displayed on the page such images, text, and links. + + +## --video-solution-- + +3 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md new file mode 100644 index 00000000000..aa20f137e89 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-a.md @@ -0,0 +1,42 @@ +--- +id: 6374f208de18c50e48ba767b +videoId: LGQuIIv2RVA +title: Introduction To HTML and CSS Question A +challengeType: 15 +dashedName: introduction-to-html-and-css-question-a +--- + +# --description-- + +HTML and CSS are two languages that work together to create everything that you see when you look at something on the internet. HTML is the raw data that a webpage is built out of. All the text, links, cards, lists, and buttons are created in HTML. CSS is what adds style to those plain elements. HTML puts information on a webpage, and CSS positions that information, gives it color, changes the font, and makes it look great! + +Many helpful resources out there keep referring to HTML and CSS as programming languages, but if you want to get technical, labeling them as such is not quite accurate. This is because they are only concerned with presenting information. They are not used to program logic. JavaScript, which you will learn in the next section, is a programming language because it’s used to make webpages do things. Yet, there is quite a lot you can do with just HTML and CSS, and you will definitely need them both. Throughout our curriculum, the following lessons focus on giving you the tools you need to succeed once you reach JavaScript content. + +# --question-- + +## --assignment-- + +Read the HTML vs CSS vs JavaScript article. It is a quick overview of the relationships between HTML, CSS, and JavaScript. + +## --text-- + +Which of the following statements is true? + +## --answers-- + +CSS is used to create the basic structure of a webpage, and HTML is used to add style. + +--- + +HTML is used to create the basic structure of a webpage, and CSS is used to add style. + +--- + +HTML and CSS are used to add style to a webpage, and JavaScript is used to create the basic structure. + + +## --video-solution-- + +2 + + diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md new file mode 100644 index 00000000000..cd9cf900330 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-b.md @@ -0,0 +1,37 @@ +--- +id: 6376327e2724a688c04636e3 +videoId: LGQuIIv2RVA +title: Introduction To HTML and CSS Question B +challengeType: 15 +dashedName: introduction-to-html-and-css-question-b +--- + +# --description-- + + +HTML and CSS are two languages that work together to create everything that you see when you look at something on the internet. HTML is the raw data that a webpage is built out of. All the text, links, cards, lists, and buttons are created in HTML. CSS is what adds style to those plain elements. HTML puts information on a webpage, and CSS positions that information, gives it color, changes the font, and makes it look great! + +Many helpful resources out there keep referring to HTML and CSS as programming languages, but if you want to get technical, labeling them as such is not quite accurate. This is because they are only concerned with presenting information. They are not used to program logic. JavaScript, which you will learn in the next section, is a programming language because it’s used to make webpages do things. Yet, there is quite a lot you can do with just HTML and CSS, and you will definitely need them both. Throughout our curriculum, the following lessons focus on giving you the tools you need to succeed once you reach JavaScript content. + +# --question-- + +## --text-- + +Between HTML and CSS, which should you use to add paragraphs of text on a webpage? + +## --answers-- + +CSS + +--- + +JavaScript + +--- + +HTML + + +## --video-solution-- + +3 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md new file mode 100644 index 00000000000..eb759394680 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-c.md @@ -0,0 +1,34 @@ +--- +id: 637633162724a688c04636e4 +videoId: LGQuIIv2RVA +title: Introduction To HTML and CSS Question C +challengeType: 15 +dashedName: introduction-to-html-and-css-question-c +--- + +# --description-- + +HTML and CSS are two languages that work together to create everything that you see when you look at something on the internet. HTML is the raw data that a webpage is built out of. All the text, links, cards, lists, and buttons are created in HTML. CSS is what adds style to those plain elements. HTML puts information on a webpage, and CSS positions that information, gives it color, changes the font, and makes it look great! + +Many helpful resources out there keep referring to HTML and CSS as programming languages, but if you want to get technical, labeling them as such is not quite accurate. This is because they are only concerned with presenting information. They are not used to program logic. JavaScript, which you will learn in the next section, is a programming language because it’s used to make webpages do things. Yet, there is quite a lot you can do with just HTML and CSS, and you will definitely need them both. Throughout our curriculum, the following lessons focus on giving you the tools you need to succeed once you reach JavaScript content. +# --question-- + +## --text-- + +Between HTML and CSS, which should you use to change the font and background color of a button? + +## --answers-- + +You should use CSS to change the background color and font of a button. + +--- + +You should use JavaScript to change the background color and font of a button. + +--- + +You should use HTML to change the background color and font of a button. + +## --video-solution-- + +1 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md new file mode 100644 index 00000000000..9e9ee049b75 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/introduction-to-html-css-question-d.md @@ -0,0 +1,35 @@ +--- +id: 637633672724a688c04636e5 +videoId: LGQuIIv2RVA +title: Introduction To HTML and CSS Question D +challengeType: 15 +dashedName: introduction-to-html-and-css-question-d +--- + +# --description-- + +HTML and CSS are two languages that work together to create everything that you see when you look at something on the internet. HTML is the raw data that a webpage is built out of. All the text, links, cards, lists, and buttons are created in HTML. CSS is what adds style to those plain elements. HTML puts information on a webpage, and CSS positions that information, gives it color, changes the font, and makes it look great! + +Many helpful resources out there keep referring to HTML and CSS as programming languages, but if you want to get technical, labeling them as such is not quite accurate. This is because they are only concerned with presenting information. They are not used to program logic. JavaScript, which you will learn in the next section, is a programming language because it’s used to make webpages do things. Yet, there is quite a lot you can do with just HTML and CSS, and you will definitely need them both. Throughout our curriculum, the following lessons focus on giving you the tools you need to succeed once you reach JavaScript content. + +# --question-- + +## --text-- + +What is the difference between HTML, CSS, and JavaScript? + +## --answers-- + +HTML is for creating interactive elements, CSS is for the look and feel, and JavaScript is for creating the structure of a webpage. + +--- + +CSS is for the look and feel, JavaScript is for creating interactive elements, and HTML is for creating the structure of a webpage. + +--- + +JavaScript is for the look and feel, CSS is for creating the structure, and HTML is for creating interactive elements of a webpage. + +## --video-solution-- + +2 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md new file mode 100644 index 00000000000..b4d237448f3 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-a.md @@ -0,0 +1,66 @@ +--- +id: 637f704072c65bc8e73dfe36 +videoId: tsEQgGjSmkM +title: Links and Images Question A +challengeType: 15 +dashedName: links-and-images-question-a +--- + +# --description-- + +To get some practice using links and images throughout this lesson you need an HTML project to work with. + +- Create a new directory named `odin-links-and-images`. + +- Within that directory, create a new file named `index.html`. + +- Fill in the usual HTML boilerplate. + +- Finally, add the following `h1` to the `body`: `

Homepage

` + +## Anchor Elements +To create a link in HTML, you use the anchor element. An anchor element is defined by wrapping the text or another HTML element you want to be a link with an `` tag. Add the following to the `body` of the `index.html` page you created and open it in the browser: + +```html +click me +``` + +You may have noticed that clicking this link doesn’t do anything. This is because an anchor tag on its own won’t know where you want to link to. You have to tell it a destination to go to. You do this by using an HTML attribute. + +An HTML attribute gives additional information to an HTML element and always goes in the element’s opening tag. An attribute is usually made up of two parts: a name, and a value; however, not all attributes require a value. In your case, you need to add a `href` (hyperlink reference) attribute to the opening anchor tag. The value of the `href` attribute is the destination you want your link to go to. + +Add the following `href` attribute to the anchor element you created previously and try clicking it again, don’t forget to refresh the browser so the new changes can be applied. + +```html +click me +``` + +By default, any text wrapped with an anchor tag without a `href` attribute will look like plain text. If the `href` attribute is present, the browser will give the text a blue color and underline it to signify it is a link. + +It’s worth noting you can use anchor tags to link to any kind of resource on the internet, not just other HTML documents. You can link to videos, pdf files, images, and so on, but for the most part, you will be linking to other HTML documents. + +# --question-- + +## --assignment-- + +Watch Kevin Powell’s HTML Links video above. + +## --text-- + +What HTML tag is used to create a link? + +## --answers-- + +`` + +--- + +`

` + +--- + +`

    ` + +## --video-solution-- + +1 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md new file mode 100644 index 00000000000..164fb01214f --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-b.md @@ -0,0 +1,55 @@ +--- +id: 637f703572c65bc8e73dfe35 +videoId: tsEQgGjSmkM +title: Links and Images Question B +challengeType: 15 +dashedName: links-and-images-question-b +--- + +# --description-- + +To get some practice using links and images throughout this lesson you need an HTML project to work with. + +- Create a new directory named odin-links-and-images. + +- Within that directory, create a new file named index.html. + +- Fill in the usual HTML boilerplate. + +- finally, add the following h1 to the body: `

    Homepage

    ` + +## Anchor Elements +To create a link in HTML, you use the anchor element. An anchor element is defined by wrapping the text or another HTML element you want to be a link with an `
    ` tag. Add the following to the body of the index.html page you created and open it in the browser: + +```html +click me +``` + +You may have noticed that clicking this link doesn’t do anything. This is because an anchor tag on its own won’t know where you want to link to. You have to tell it a destination to go to. You do this by using an HTML attribute. An HTML attribute gives additional information to an HTML element and always goes in the element’s opening tag. An attribute is usually made up of two parts: a name, and a value; however, not all attributes require a value. In your case, you need to add a href (hyperlink reference) attribute to the opening anchor tag. The value of the href attribute is the destination you want your link to go to. Add the following href attribute to the anchor element you created previously and try clicking it again, don’t forget to refresh the browser so the new changes can be applied. + +```html +click me +``` + +By default, any text wrapped with an anchor tag without a `href` attribute will look like plain text. If the `href` attribute is present, the browser will give the text a blue color and underline it to signify it is a link. It’s worth noting you can use anchor tags to link to any kind of resource on the internet, not just other HTML documents. You can link to videos, pdf files, images, and so on, but for the most part, you will be linking to other HTML documents. + +# --question-- +## --text-- + +What is an attribute? +## --answers-- + +An HTML attribute gives additional information to an HTML element and always goes in the element’s closing tag. + +--- + +An HTML attribute is used to tell the browser what the element contains. + +--- + +An HTML attribute gives additional information to an HTML element and always goes in the element’s opening tag. + + +## --video-solution-- + +3 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md new file mode 100644 index 00000000000..c8a3913d77e --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-c.md @@ -0,0 +1,56 @@ +--- +id: 637f703072c65bc8e73dfe34 +videoId: tsEQgGjSmkM +title: Links and Images Question C +challengeType: 15 +dashedName: links-and-images-question-c +--- + +# --description-- + +To get some practice using links and images throughout this lesson you need an HTML project to work with. + +- Create a new directory named odin-links-and-images. + +- Within that directory, create a new file named index.html. + +- Fill in the usual HTML boilerplate. + +- finally, add the following h1 to the body: `

    Homepage

    ` + +## Anchor Elements +To create a link in HTML, you use the anchor element. An anchor element is defined by wrapping the text or another HTML element you want to be a link with an `` tag. Add the following to the body of the index.html page you created and open it in the browser: + +```html +click me +``` + +You may have noticed that clicking this link doesn’t do anything. This is because an anchor tag on its own won’t know where you want to link to. You have to tell it a destination to go to. You do this by using an HTML attribute. An HTML attribute gives additional information to an HTML element and always goes in the element’s opening tag. An attribute is usually made up of two parts: a name, and a value; however, not all attributes require a value. In your case, you need to add a href (hyperlink reference) attribute to the opening anchor tag. The value of the href attribute is the destination you want your link to go to. Add the following href attribute to the anchor element you created previously and try clicking it again, don’t forget to refresh the browser so the new changes can be applied. + +```html +click me +``` + +By default, any text wrapped with an anchor tag without a `href` attribute will look like plain text. If the `href` attribute is present, the browser will give the text a blue color and underline it to signify it is a link. It’s worth noting you can use anchor tags to link to any kind of resource on the internet, not just other HTML documents. You can link to videos, pdf files, images, and so on, but for the most part, you will be linking to other HTML documents. + +# --question-- + +## --text-- + +What attribute tells links where to go to? + +## --answers-- + +`src` + +--- + +`href` + +--- + +`link` + +## --video-solution-- + +2 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md new file mode 100644 index 00000000000..2b6a665eb87 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-d.md @@ -0,0 +1,112 @@ +--- +id: 637f702872c65bc8e73dfe33 +videoId: ta3Oxx7Yqbo +title: Links and Images Question D +challengeType: 15 +dashedName: links-and-images-question-d +--- + +# --description-- + + +Generally, there are two kinds of links you will create: + +- Links to pages on other websites on the internet + +- Links to pages located on your own websites + + +## Absolute Links +Links to pages on other websites on the internet are called absolute links. A typical absolute link will be made up of the following parts: `protocol://domain/path`. An absolute link will always contain the protocol and domain of the destination. + +You’ve already seen an absolute link in action. The link you created to The Odin Project’s About page earlier was an absolute link as it contains the protocol and domain. + +`https://www.theodinproject.com/about` + +## Relative Links +Links to other pages within your own website are called relative links. Relative links do not include the domain name, since it is another page on the same site, it assumes the domain name will be the same as the page you created the link on. + +Relative links only include the file path to the other page, relative to the page you are creating the link on. This is quite abstract, let’s see this in action using an example. + +Within the `odin-links-and-images` directory, create another HTML file named `about.html` and paste the following code into it: + +```html + + + + + Odin Links and Images + + + +

    About Page

    + + +``` + +Back in the index page, add the following anchor element to create a link to the about page: + +```html + +

    Homepage

    + click me + + About + +``` + +Open the index file in a browser and click on the about link to make sure it is all wired together correctly. Clicking the link should go to the about page you just created. + +This works because the index and about page are in the same directory. That means you can simply use its name (`about.html`) as the link’s href value. + +But you will usually want to organize your website directories a little better. Normally you would only have the `index.html` at the root directory and all other HTML files in their own directory. + +Create a directory named `pages` within the `odin-links-and-images` directory and move the `about.html` file into this new directory. + +Refresh the index page in the browser and then click on the about link. It will now be broken. This is because the location of the about page file has changed. + +To fix this, you just need to update the about link `href` value to include the `pages/` directory since that is the new location of the about file relative to the index file. + +```html + +

    Homepage

    + About + +``` + +Refresh the index page in the browser and try clicking the about link again, it should now be back in working order. + +In many cases, this will work just fine; however, you can still run into unexpected issues with this approach. Prepending `./` before the link will in most cases prevent such issues. By adding `./` you are specifying to your code that it should start looking for the file/directory relative to the **current** directory. + +```html + +

    Homepage

    + About + +``` + +# --question-- + +## --assignment-- + +Watch Kevin Powell’s HTML File Structure video above. + +## --text-- + +What is the difference between an absolute and a relative link? + +## --answers-- + +An absolute link is a link to another page on the current website. A relative link is a link to another website. + +--- + +An absolute link is a link to another website. A relative link is a link another page on the current website. + +--- + +There is no difference between absolute and relative links. + +## --video-solution-- + +2 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md new file mode 100644 index 00000000000..a935ae3262a --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-e.md @@ -0,0 +1,98 @@ +--- +id: 637f702372c65bc8e73dfe32 +videoId: 0xoztJCHpbQ +title: Links and Images Question E +challengeType: 15 +dashedName: links-and-images-question-e +--- + +# --description-- + +Websites would be fairly boring if they could only display text. Luckily HTML provides a wide variety of elements for displaying all sorts of different media. The most widely used of these is the image element. + +To display an image in HTML you use the `` element. Unlike the other elements you have encountered, the `` element is self-closing. Empty, self-closing HTML elements do not need a closing tag. + +Instead of wrapping content with an opening and closing tag, it embeds an image into the page using a `src` attribute which tells the browser where the image file is located. The `src` attribute works much like the `href` attribute for anchor tags. It can embed an image using both absolute and relative paths. + +For example, using an absolute path you can display an image located on The Odin Project site: + + + +To use images that you have on your own websites, you can use a relative path. + +- Create a new directory named `images` within the `odin-links-and-images` project. + +- Next, download [this image](https://unsplash.com/photos/Mv9hjnEUHR4/download?force=true&w=640) and move it into the `images` directory you just created. + +- Rename the image to `dog.jpg`. + +Finally add the image to the `index.html` file: + +```html + +

    Homepage

    + click me + + About + + + +``` + +Save the `index.html` file and open it in a browser to view Charles in all his glory. + + +## Parent Directories + +What if you want to use the dog image in the about page? You would first have to go up one level out of the pages directory into its parent directory so you could then access the images directory. + +To go to the parent directory you need to use two dots in the relative filepath like this: `../.` Let’s see this in action, within the body of the `about.html` file, add the following image below the heading you added earlier: + +```html + +``` + +To break this down: + +- First, you are going to the parent directory of the pages directory which is `odin-links-and-images`. + +- Then, from the parent directory, you can go into the `images` directory. + +- Finally, you can access the `dog.jpg` file. + +Using the metaphor we used earlier, using `../` in a filepath is kind of like stepping out from the room you are currently in to the main hallway so you can go to another room. + +## `Alt` attribute + +Besides the `src` attribute, every image element should also have an `alt` (alternative text) attribute. + +The `alt` attribute is used to describe an image. It will be used in place of the image if it cannot be loaded. It is also used with screen readers to describe what the image is to visually impaired users. + +This is how the The Odin Project logo example you used earlier looks with an `alt` attribute included: + + +# --question-- + +## --assignment-- + +Watch Kevin Powell’s HTML Images Video above. + +## --text-- + +Which tag is used to display an image? + +## --answers-- + +`` + +--- + +`` + +--- + +`` + +## --video-solution-- + +3 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md new file mode 100644 index 00000000000..ba4eb809e5d --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-f.md @@ -0,0 +1,94 @@ +--- +id: 637f701c72c65bc8e73dfe31 +videoId: 0xoztJCHpbQ +title: Links and Images Question F +challengeType: 15 +dashedName: links-and-images-question-f +--- + +# --description-- + +Websites would be fairly boring if they could only display text. Luckily HTML provides a wide variety of elements for displaying all sorts of different media. The most widely used of these is the image element. + +To display an image in HTML you use the `` element. Unlike the other elements you have encountered, the `` element is self-closing. Empty, self-closing HTML elements do not need a closing tag. + +Instead of wrapping content with an opening and closing tag, it embeds an image into the page using a src attribute which tells the browser where the image file is located. The src attribute works much like the href attribute for anchor tags. It can embed an image using both absolute and relative paths. + +For example, using an absolute path you can display an image located on The Odin Project site: + + + +To use images that you have on your own websites, you can use a relative path. + +- Create a new directory named `images` within the `odin-links-and-images` project. + +- Next, download [this image](https://unsplash.com/photos/Mv9hjnEUHR4/download?force=true&w=640) and move it into the images directory you just created. + +- Rename the image to `dog.jpg`. + +Finally add the image to the `index.html` file: + +```html + +

    Homepage

    +
    click me + + About + + + +``` + +Save the `index.html` file and open it in a browser to view Charles in all his glory. + + +## Parent Directories + +What if you want to use the dog image in the about page? You would first have to go up one level out of the pages directory into its parent directory so you could then access the images directory. + +To go to the parent directory you need to use two dots in the relative filepath like this: `../.` Let’s see this in action, within the body of the `about.html` file, add the following image below the heading you added earlier: + +```html + +``` + +To break this down: + +- First, you are going to the parent directory of the pages directory which is `odin-links-and-images`. + +- Then, from the parent directory, you can go into the `images` directory. + +- Finally, you can access the `dog.jpg` file. + +Using the metaphor we used earlier, using `../` in a filepath is kind of like stepping out from the room you are currently in to the main hallway so you can go to another room. + +## Alt attribute + +Besides the src attribute, every image element should also have an alt (alternative text) attribute. + +The alt attribute is used to describe an image. It will be used in place of the image if it cannot be loaded. It is also used with screen readers to describe what the image is to visually impaired users. + +This is how the The Odin Project logo example you used earlier looks with an alt attribute included: + + +# --question-- + +## --text-- + +What two attributes do images always need to have? + +## --answers-- + +`href` and `alt` + +--- + +`name` and `href` + +--- + +`alt` and `src` + +## --video-solution-- + +3 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md new file mode 100644 index 00000000000..d1a6fcd4406 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-g.md @@ -0,0 +1,94 @@ +--- +id: 637f701572c65bc8e73dfe30 +videoId: 0xoztJCHpbQ +title: Links and Images Question G +challengeType: 15 +dashedName: links-and-images-question-g +--- + +# --description-- + +Websites would be fairly boring if they could only display text. Luckily HTML provides a wide variety of elements for displaying all sorts of different media. The most widely used of these is the image element. + +To display an image in HTML you use the `` element. Unlike the other elements you have encountered, the `` element is self-closing. Empty, self-closing HTML elements do not need a closing tag. + +Instead of wrapping content with an opening and closing tag, it embeds an image into the page using a src attribute which tells the browser where the image file is located. The src attribute works much like the href attribute for anchor tags. It can embed an image using both absolute and relative paths. + +For example, using an absolute path you can display an image located on The Odin Project site: + + + +To use images that you have on your own websites, you can use a relative path. + +- Create a new directory named `images` within the `odin-links-and-images` project. + +- Next, download [this image](https://unsplash.com/photos/Mv9hjnEUHR4/download?force=true&w=640) and move it into the images directory you just created. + +- Rename the image to `dog.jpg`. + +Finally add the image to the `index.html` file: + +```html + +

    Homepage

    + click me + + About + + + +``` + +Save the `index.html` file and open it in a browser to view Charles in all his glory. + + +## Parent Directories + +What if you want to use the dog image in the about page? You would first have to go up one level out of the pages directory into its parent directory so you could then access the images directory. + +To go to the parent directory you need to use two dots in the relative filepath like this: `../.` Let’s see this in action, within the body of the `about.html` file, add the following image below the heading you added earlier: + +```html + +``` + +To break this down: + +- First, you are going to the parent directory of the pages directory which is `odin-links-and-images`. + +- Then, from the parent directory, you can go into the `images` directory. + +- Finally, you can access the `dog.jpg` file. + +Using the metaphor we used earlier, using `../` in a filepath is kind of like stepping out from the room you are currently in to the main hallway so you can go to another room. + +## Alt attribute + +Besides the src attribute, every image element should also have an alt (alternative text) attribute. + +The alt attribute is used to describe an image. It will be used in place of the image if it cannot be loaded. It is also used with screen readers to describe what the image is to visually impaired users. + +This is how the The Odin Project logo example you used earlier looks with an alt attribute included: + + +# --question-- + +## --text-- + +How do you access a parent directory in a filepath? + +## --answers-- + +`../` + +--- + +`./` + +--- + +`.../` + +## --video-solution-- + +1 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md new file mode 100644 index 00000000000..cfd73fcfbc1 --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/links-and-images-question-h.md @@ -0,0 +1,98 @@ +--- +id: 637f700b72c65bc8e73dfe2f +videoId: 0xoztJCHpbQ +title: Links and Images Question H +challengeType: 15 +dashedName: links-and-images-question-h +--- + +# --description-- + +Websites would be fairly boring if they could only display text. Luckily HTML provides a wide variety of elements for displaying all sorts of different media. The most widely used of these is the image element. + +To display an image in HTML you use the `` element. Unlike the other elements you have encountered, the `` element is self-closing. Empty, self-closing HTML elements do not need a closing tag. + +Instead of wrapping content with an opening and closing tag, it embeds an image into the page using a src attribute which tells the browser where the image file is located. The src attribute works much like the href attribute for anchor tags. It can embed an image using both absolute and relative paths. + +For example, using an absolute path you can display an image located on The Odin Project site: + + + +To use images that you have on your own websites, you can use a relative path. + +- Create a new directory named `images` within the `odin-links-and-images` project. + +- Next, download [this image](https://unsplash.com/photos/Mv9hjnEUHR4/download?force=true&w=640) and move it into the images directory you just created. + +- Rename the image to `dog.jpg`. + +Finally add the image to the `index.html` file: + +```html + +

    Homepage

    + click me + + About + + + +``` + +Save the `index.html` file and open it in a browser to view Charles in all his glory. + + +## Parent Directories + +What if you want to use the dog image in the about page? You would first have to go up one level out of the pages directory into its parent directory so you could then access the images directory. + +To go to the parent directory you need to use two dots in the relative filepath like this: `../.` Let’s see this in action, within the body of the `about.html` file, add the following image below the heading you added earlier: + +```html + +``` + +To break this down: + +- First, you are going to the parent directory of the pages directory which is `odin-links-and-images`. + +- Then, from the parent directory, you can go into the `images` directory. + +- Finally, you can access the `dog.jpg` file. + +Using the metaphor we used earlier, using `../` in a filepath is kind of like stepping out from the room you are currently in to the main hallway so you can go to another room. + +## Alt attribute + +Besides the src attribute, every image element should also have an alt (alternative text) attribute. + +The alt attribute is used to describe an image. It will be used in place of the image if it cannot be loaded. It is also used with screen readers to describe what the image is to visually impaired users. + +This is how the The Odin Project logo example you used earlier looks with an alt attribute included: + + +# --question-- + +## --assignment-- + +Read about the four main image formats that can be used on the web. + +## --text-- + +What are the four main image formats that you can use for images on the web? + +## --answers-- + +TIFF, GIF, PNG, and SVG. + +--- + +JPG, PNG, GIF, and SVG. + +--- + +JPG, PDF, SVG, and GIF. + +## --video-solution-- + +2 diff --git a/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md new file mode 100644 index 00000000000..657a3f6e32d --- /dev/null +++ b/curriculum/challenges/arabic/10-coding-interview-prep/the-odin-project/project-create-a-recipe-page.md @@ -0,0 +1,204 @@ +--- +id: 6391d1a4f7ac71efd0621380 +title: Build a Recipe Page Project +challengeType: 14 +dashedName: project-create-a-recipe-page +--- + +# --description-- + +The website will consist of a main index page which will have links to a few recipes. The website won’t look very pretty by the time you’ve finished. + +**User Stories:** + +1. Your recipe page should contain a `DOCTYPE` tag. +1. Your recipe page should include an `html` element with a `head` and `body` element as children. +1. You should have a `title` element within the `head` element with the text `The Odin Recipes`. +1. You should see an `h1` element that has the text `Creamy Chocolate Fudge`. +1. You should see an image with the url `*placeholder-fcc-cdn*` with a fitting `alt` text. +1. There should be an `h2` element with the text `Description` under the image. +1. You should see a couple of paragraphs under `Description` that describe the recipe. +1. There should be an `h2` element with the text `Ingredients` +1. Under the `Ingredients` heading there should be an unordered list with the ingredients needed for the recipe. +1. Under the list of ingredients add another heading called `Steps`. +1. You should see an ordered list with a couple of steps needed to complete the recipe. +1. Under the steps there should be an `h2` element with the text `More Recipes` +1. You should see a couple of links to other recipes inside an unordered list which has a couple of list items with anchor elements within. +1. These anchor elements should have `href` attribute with the value set to `#` + +# --hints-- + +You should have a `DOCTYPE` tag. + +```js +assert(code.match(//gi)); +``` + +You should have a `html` element with `head` and `body` element. + +```js +const html = document.querySelectorAll('html')[0]; +const head = document.querySelectorAll('html > head')[0]; +const body = document.querySelectorAll('html > body')[0]; + +assert(html && head && body); +``` + +You should have a `title` element within the `head` element that contains the text `The Odin Recipes`. + +```js +assert(document.querySelectorAll('HEAD > TITLE')[0].innerText == 'The Odin Recipes'); +``` + +You should have a `h1` element within your `body` element that contains the text `Creamy Chocolate Fudge`. + +```js +assert(document.querySelectorAll('BODY > H1')[0].innerText == 'Creamy Chocolate Fudge'); +``` + +You should have an image with the url `*placeholder-fcc-cdn*` with an `alt` attribute that has a fitting text. + +```js +const img = document.querySelectorAll('IMG')[0]; + +assert(img && img.alt !='' && img.src === 'https://i.imgur.com/p0J5baJ.jpg') +``` + +You should have an `h2` element with the text `Description`. + +```js +const h2 = document.querySelectorAll('H2')[0]; + +assert(h2.innerText == 'Description'); +``` + +You should have at least two `p` elements describing the recipe. + +```js +const paragraphs = document.querySelectorAll('P'); + +assert(paragraphs.length > 1); +``` + +You should have an `h2` element with the text `Ingredients`. + +```js +const h2 = document.querySelectorAll('H2')[1]; + +assert(h2.innerText == 'Ingredients'); +``` + +You should have an unordered list `