diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index c05c3287a32..76bb6dddb86 100644
--- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ multiplier(4, 2);
يجب عليك استبدال كلمة `var`.
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` يجب أن يكون متغير ثابت (باستخدام `const`).
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` يجب أن تكون arrow function مع معلمين (two parameters)
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
لا ينبغي استخدام كلمة `function`.
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index 0f8981ffebf..3f66bc968e6 100644
--- a/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/arabic/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ dashedName: implement-map-on-a-prototype
يجب أن يساوي `[23, 65, 98, 5, 13].myMap(item => item * 2)` قيمة `[46, 130, 196, 10, 26]`.
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-يجب أن ينتج `[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` قائمة `[1, 2, 5, 2, 1]`.
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index c8a90480e67..a3e2c5fbf65 100644
--- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ multiplier(4, 2);
應替換 `var` 關鍵詞。
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` 應該是一個常量(使用`const`)。
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` 應該是一個帶有兩個參數的箭頭函數。
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
不能使用 `function` 關鍵字。
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index 9c2812b0520..9a686cacf01 100644
--- a/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/chinese-traditional/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ dashedName: implement-map-on-a-prototype
`[23, 65, 98, 5, 13].myMap(item => item * 2)` 應該等於 `[46, 130, 196, 10, 26]`。
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-`[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index f16e49c0240..21bcf782ffb 100644
--- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ multiplier(4, 2);
应替换 `var` 关键词。
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` 应该是一个常量(使用`const`)。
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` 应该是一个带有两个参数的箭头函数。
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
不能使用 `function` 关键字。
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index 93d338d3d19..02a39f88ab0 100644
--- a/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/chinese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ dashedName: implement-map-on-a-prototype
`[23, 65, 98, 5, 13].myMap(item => item * 2)` 应该等于 `[46, 130, 196, 10, 26]`。
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-`[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index 09578baf5fe..d247fe83f98 100644
--- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ Reescribe la función `myConcat` que añade el contenido de `arr2` a `arr1` para
Debes reemplazar la palabra clave `var`.
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` debe ser una variable constante (utilizando `const`).
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` debe ser una función de flecha con dos parámetros
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
La palabra clave `function` no debe ser usada.
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index 2a3a1478c2a..80dd65f1a93 100644
--- a/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/espanol/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ Escribe tu propio `Array.prototype.myMap()`, el cual debe comportarse exactament
`[23, 65, 98, 5, 13].myMap(item => item * 2)` debe ser igual a: `[46, 130, 196, 10, 26]`.
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-`[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` debe devolver `[1, 2, 5, 2, 1]`.
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md
index 9329293302b..7faba95dab6 100644
--- a/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md
+++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/back-end-development-and-apis-projects/file-metadata-microservice.md
@@ -14,21 +14,21 @@ Crea una aplicación full stack de JavaScript que sea funcionalmente similar a e
- Usa este proyecto inicial de Replit para completar tu proyecto.
- Utiliza un constructor de sitios de tu elección para completar el proyecto. Asegúrate de incorporar todos los archivos de nuestro repositorio de GitHub.
-If you use Replit, follow these steps to set up the project:
+Si usas Replit, sigue estos pasos para configurar el proyecto:
-- Start by importing the project on Replit.
-- Next, you will see a `.replit` window.
-- Select `Use run command` and click the `Done` button.
+- Empieza importando el proyecto en Replit.
+- Siguiente, verás una ventana `.replit`.
+- Selecciona `Use run command` y haz clic en el botón `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.
+Cuando hayas acabado, asegúrate de que un demo funcional de tu proyecto, este alojado en algún sitio público. Luego envía la URL a la misma en el campo `Solution Link`. Opcionalmente, también envía un enlace para el código fuente de tu proyecto en el campo `GitHub Link`.
# --instructions--
-**HINT:** You can use the `multer` npm package to handle file uploading.
+**NOTA:** Puedes usar el paquete npm `multer` para gestionar la carga de archivos.
# --hints--
-You should provide your own project, not the example URL.
+Debes proporcionar tu propio proyecto, no la URL del ejemplo.
```js
(getUserInput) => {
@@ -40,7 +40,7 @@ You should provide your own project, not the example URL.
};
```
-You can submit a form that includes a file upload.
+Puedes enviar un formulario que incluya una carga de archivo.
```js
async (getUserInput) => {
@@ -51,7 +51,7 @@ async (getUserInput) => {
};
```
-The form file input field has the `name` attribute set to `upfile`.
+El campo de entrada del archivo de formulario tiene el atributo `name` establecido en `upfile`.
```js
async (getUserInput) => {
diff --git a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md
index 3a16b667555..2e7b2ce10a5 100644
--- a/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md
+++ b/curriculum/challenges/espanol/05-back-end-development-and-apis/basic-node-and-express/meet-the-node-console.md
@@ -22,19 +22,19 @@ Si usas Replit, sigue los siguientes pasos para configurar el proyecto:
Cuando hayas acabado, asegúrate de que un demo funcional del proyecto, este alojado en algún sitio público. Envía esa URL mediante el campo `Solution Link`.
-During the development process, it is important to be able to check what’s going on in your code.
+Durante el proceso de desarrollo, es importante poder comprobar lo que ocurre en el código.
-Node is just a JavaScript environment. Like client side JavaScript, you can use the console to display useful debug information. On your local machine, you would see console output in a terminal. On Replit, a terminal is open in the right pane by default.
+Node es solo un entorno JavaScript. Al igual que el JavaScript del lado cliente, puedes hacer uso de la consola para mostrar información útil para la depuración. En tu máquina, varía la salida de la consola en un terminal. En Replit, por defecto hay un terminal abierto en el panel de la derecha.
-We recommend to keep the terminal open while working at these challenges. By reading the output in the terminal, you can see any errors that may occur.
+Recomendamos mantener abierto el terminal mientras desarrolles estos retos. Al leer el resultado en el terminal, puedes ver cualquier error que pueda producirse.
# --instructions--
-Modify the `myApp.js` file to log "Hello World" to the console.
+Modifica el archivo `myApp.js` para que registre "Hello World" en la consola.
# --hints--
-`"Hello World"` should be in the console
+`"Hello World"` debe aparecer en la consola
```js
(getUserInput) =>
diff --git a/curriculum/challenges/german/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/german/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index eafccf47413..80d42229c84 100644
--- a/curriculum/challenges/german/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/german/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ Schreibe die Funktion `myConcat`, die den Inhalt von `arr2` an `arr1` anhängt,
Du solltest das Schlüsselwort `var` ersetzen.
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` sollte eine konstante Variable sein (durch Verwendung von `const`).
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` sollte eine Pfeilfunktion mit zwei Parametern sein
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
Das Schlüsselwort `function` sollte nicht verwendet werden.
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/german/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/german/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index 8a779a9f8dd..3ab05a77c44 100644
--- a/curriculum/challenges/german/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/german/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ Schreibe dein eigenes `Array.prototype.myMap()`, welches sich genau wie `Array.p
`[23, 65, 98, 5, 13].myMap(item => item * 2)` should equal `[46, 130, 196, 10, 26]`.
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-`[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index af7c1854b38..0a21cc15686 100644
--- a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ Riscrivi la funzione `myConcat` che concatena i contenuti di `arr2` a quelli di
Dovresti sostituire la parola chiave `var`.
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` dovrebbe essere una variabile costante (usando `const`).
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` dovrebbe essere una funzione freccia con due parametri
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
La parola chiave `function` non dovrebbe essere usata.
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index fde41216e82..7abf3cd3092 100644
--- a/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/italian/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ Scrivi il tuo `Array.prototype.myMap()`, che dovrebbe comportarsi esattamente co
`[23, 65, 98, 5, 13].myMap(item => item * 2)` dovrebbe essere uguale a `[46, 130, 196, 10, 26]`.
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-`[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` dovrebbe restituire `[1, 2, 5, 2, 1]`.
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/italian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md b/curriculum/challenges/italian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
index 5dae976f3cb..5cb6be705b7 100644
--- a/curriculum/challenges/italian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
+++ b/curriculum/challenges/italian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
@@ -30,7 +30,7 @@ bcrypt.compare(myPlaintextPassword, hash, (err, res) => {
});
```
-Aggiungilo alla tua funzione di hash esistente (dal momento che devi attendere che l'hash venga completato prima di chiamare la funzione di confronto) dopo aver registrato l'hash e il log 'res' completati nella console durante il confronto. You should see in the console a hash, and then 'true' is printed! If you change 'myPlaintextPassword' in the compare function to 'someOtherPlaintextPassword', then it should say false.
+Aggiungilo alla tua funzione di hash esistente (dal momento che devi attendere che l'hash venga completato prima di chiamare la funzione di confronto) dopo aver registrato l'hash e il log 'res' completati nella console durante il confronto. Dovresti vedere nella console una password crittografata, e poi viene stampato 'true'! Se cambi 'myPlaintextPassword' nella funzione di confronto con 'someOtherPlaintextPassword', allora dovrebbe restituire false.
```js
bcrypt.hash('passw0rd!', 13, (err, hash) => {
diff --git a/curriculum/challenges/italian/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md b/curriculum/challenges/italian/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
index 08b4de439d4..009e3e7b2bb 100644
--- a/curriculum/challenges/italian/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
+++ b/curriculum/challenges/italian/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
@@ -10,7 +10,7 @@ dashedName: set-a-content-security-policy-with-helmet-contentsecuritypolicy
Come promemoria, questo progetto verrà costruito a partire dalla seguente bozza su Replit, o clonato da GitHub.
-Questa sfida mette in evidenza una promettente nuova difesa che può ridurre significativamente il rischio e l'impatto di molti tipi di attacchi nei browser moderni. Impostando e configurando una Content Security Policy (CSP - Politica di Sicurezza dei Contenuti) puoi impedire l'iniezione di cose indesiderate nella tua pagina. Questo proteggerà la tua app da vulnerabilità XSS, tracciamento indesiderato, frame dannosi e molto altro ancora. La CSP funziona definendo un elenco di sorgenti di contenuto attendibili. Puoi configurarlo per ogni tipo di risorsa di cui una pagina web potrebbe aver bisogno (script, fogli di stile, stili di caratteri, frame, media così via…). Ci sono più direttive disponibili, quindi il proprietario di un sito web può avere un controllo granulare. Vedi HTML 5 Rocks, KeyCDN per maggiori dettagli. Unfortunately CSP is unsupported by older browsers.
+Questa sfida mette in evidenza una promettente nuova difesa che può ridurre significativamente il rischio e l'impatto di molti tipi di attacchi nei browser moderni. Impostando e configurando una Content Security Policy (CSP - Politica di Sicurezza dei Contenuti) puoi impedire l'iniezione di cose indesiderate nella tua pagina. Questo proteggerà la tua app da vulnerabilità XSS, tracciamento indesiderato, frame dannosi e molto altro ancora. La CSP funziona definendo un elenco di sorgenti di contenuto attendibili. Puoi configurarlo per ogni tipo di risorsa di cui una pagina web potrebbe aver bisogno (script, fogli di stile, stili di caratteri, frame, media così via…). Ci sono più direttive disponibili, quindi il proprietario di un sito web può avere un controllo granulare. Vedi HTML 5 Rocks, KeyCDN per maggiori dettagli. Purtroppo CSP non è supportata dai vecchi browser.
Per impostazione predefinita, le direttive sono largamente aperte, quindi è importante impostare la direttiva defaultSrc come ripiego. Helmet supporta sia lo stile di denominazione defaultSrc che default-src. La direttiva di riserva si applica alla maggior parte delle direttive non specificate.
diff --git a/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index d91f2396498..c4527aa57fd 100644
--- a/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ multiplier(4, 2);
`var` キーワードを置き換える必要があります。
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` は (`const` を使用して宣言した) 定数変数である必要があります。
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` は、2 つのパラメーターを持つアロー関数にする必要があります。
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
`function` キーワードは使用しないでください。
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index 5f141911ac1..70a9495f08b 100644
--- a/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/japanese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ dashedName: implement-map-on-a-prototype
`[23, 65, 98, 5, 13].myMap(item => item * 2)` は `[46, 130, 196, 10, 26]` と等しくなければなりません。
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-`[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` は `[1, 2, 5, 2, 1]` を返す必要があります。
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index 208bc7b21b9..cbbe8e0f25f 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ Reescreva a função `myConcat` que anexa conteúdo de `arr2` para `arr1` para q
Você deve substituir a palavra-chave `var`.
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` deve ser uma variável constante (usando `const`).
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` deve ser uma arrow function com dois parâmetros
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
A palavra-chave `function` não deve ser usada.
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index 7524f4413aa..c65d01aa0b0 100644
--- a/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/portuguese/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ Escreva o seu próprio `Array.prototype.myMap()` e faça com que ele se comporte
`[23, 65, 98, 5, 13].myMap(item => item * 2)` deve ser igual a `[46, 130, 196, 10, 26]`.
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-`[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` deve retornar `[1, 2, 5, 2, 1]`.
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/portuguese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md b/curriculum/challenges/portuguese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
index 3cf12707edc..2d21b5a018f 100644
--- a/curriculum/challenges/portuguese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
+++ b/curriculum/challenges/portuguese/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
@@ -30,7 +30,7 @@ bcrypt.compare(myPlaintextPassword, hash, (err, res) => {
});
```
-Adicione isso à sua função de hash existente (já que você precisa esperar que o hash termine antes de chamar a função de comparação) depois de registrar o hash completo e registra 'res' para o console dentro da comparação. You should see in the console a hash, and then 'true' is printed! If you change 'myPlaintextPassword' in the compare function to 'someOtherPlaintextPassword', then it should say false.
+Adicione isso à sua função de hash existente (já que você precisa esperar que o hash termine antes de chamar a função de comparação) depois de registrar o hash completo e registra 'res' para o console dentro da comparação. Você deve ver um hash no console e a palavra 'true' é impressa! Se você mudar 'myPlaintextPassword' na função de comparação para 'qualquerOutraSenha', então ela deve dizer false.
```js
bcrypt.hash('passw0rd!', 13, (err, hash) => {
diff --git a/curriculum/challenges/portuguese/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md b/curriculum/challenges/portuguese/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
index 5328a1b652e..f65cd415ef3 100644
--- a/curriculum/challenges/portuguese/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
+++ b/curriculum/challenges/portuguese/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
@@ -10,7 +10,7 @@ dashedName: set-a-content-security-policy-with-helmet-contentsecuritypolicy
Lembrando que este projeto está sendo construído a partir do Replit, ou pode ser clonado no GitHub.
-Este desafio destaca um novo defensor promissor que pode reduzir significativamente o risco e o impacto de muitos tipos de ataques em navegadores modernos. Ao definir e configurar uma política de segurança de conteúdo, você pode evitar a injeção de qualquer coisa indesejada na sua página. Isso protegerá seu aplicativo de vulnerabilidades de XSS, rastreamento indesejado, frames maliciosos e muito mais. O CSP funciona definindo uma lista permitida de fontes de conteúdo confiáveis. Você pode configurá-las para cada tipo de recurso que uma página da web pode precisar (scripts, stylesheets, fontes, frames, mídia e assim por diante…). Há várias diretivas disponíveis. Por isso, o proprietário do site pode ter um controle granular. Veja HTML 5 Rocks, KeyCDN para mais detalhes. Unfortunately CSP is unsupported by older browsers.
+Este desafio destaca um novo defensor promissor que pode reduzir significativamente o risco e o impacto de muitos tipos de ataques em navegadores modernos. Ao definir e configurar uma política de segurança de conteúdo, você pode evitar a injeção de qualquer coisa indesejada na sua página. Isso protegerá seu aplicativo de vulnerabilidades de XSS, rastreamento indesejado, frames maliciosos e muito mais. O CSP funciona definindo uma lista permitida de fontes de conteúdo confiáveis. Você pode configurá-las para cada tipo de recurso que uma página da web pode precisar (scripts, stylesheets, fontes, frames, mídia e assim por diante…). Há várias diretivas disponíveis. Por isso, o proprietário do site pode ter um controle granular. Veja HTML 5 Rocks, KeyCDN para mais detalhes. Infelizmente, o CSP não é suportado por navegadores mais antigos.
Por padrão, as diretivas são abertas. Por isso, é importante definir a diretiva defaultSrc como regra. O helmet suporta estilos de nomeação defaultSrc e default-src. A regra aplica-se à maior parte das diretivas não especificadas.
diff --git a/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md b/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
index 9a081e7931d..f2aa0fecf03 100644
--- a/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
+++ b/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/es6/write-arrow-functions-with-parameters.md
@@ -41,13 +41,13 @@ multiplier(4, 2);
Вам слід замінити ключове слово `var`.
```js
-(getUserInput) => assert(!getUserInput('index').match(/var/g));
+assert.notMatch(code, /var/g);
```
`myConcat` має бути постійною змінною (використовуйте `const`).
```js
-(getUserInput) => assert(getUserInput('index').match(/const\s+myConcat/g));
+assert.match(code, /const\s+myConcat/g);
```
`myConcat` має бути функцією з 2 параметрами
@@ -68,7 +68,7 @@ assert.deepEqual(myConcat([1, 2], [3, 4, 5]), [1, 2, 3, 4, 5]);
Не використовуйте ключове слово `function`.
```js
-(getUserInput) => assert(!getUserInput('index').match(/function/g));
+assert.notMatch(code, /function/g);
```
# --seed--
diff --git a/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md b/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
index 9438f9f93c4..b6e7652b82f 100644
--- a/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
+++ b/curriculum/challenges/ukrainian/02-javascript-algorithms-and-data-structures/functional-programming/implement-map-on-a-prototype.md
@@ -23,7 +23,7 @@ dashedName: implement-map-on-a-prototype
`[23, 65, 98, 5, 13].myMap(item => item * 2)` should equal `[46, 130, 196, 10, 26]`.
```js
-const _test_s = [46, 130, 196, 10, 13];
+const _test_s = [23, 65, 98, 5, 13];
const _callback = item => item * 2;
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
@@ -36,7 +36,7 @@ const _callback = element => element.toUpperCase();
assert(JSON.stringify(_test_s.map(_callback)) === JSON.stringify(_test_s.myMap(_callback)));
```
-`[1, 1, 2, 5, 2].myMap((element, index, array) => array[i + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
+`[1, 1, 2, 5, 2].myMap((element, index, array) => array[index + 1] || array[0])` should return `[1, 2, 5, 2, 1]`.
```js
const _test_s = [1, 1, 2, 5, 2];
diff --git a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/communicate-by-emitting.md b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/communicate-by-emitting.md
index e94d1606e56..05944312d97 100644
--- a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/communicate-by-emitting.md
+++ b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/communicate-by-emitting.md
@@ -1,6 +1,6 @@
---
id: 589fc831f9fc0f352b528e75
-title: Спілкування за допомогою Emitting
+title: Комунікація за допомогою видачі
challengeType: 2
forumTopicId: 301550
dashedName: communicate-by-emitting
@@ -8,27 +8,27 @@ dashedName: communicate-by-emitting
# --description--
-Emit — найпоширеніший спосіб спілкування, яким ви будете користуватись. Коли ви висвічуєте (emit) щось зі сервера до 'io', ви надсилаєте назву події й дані всім під'єднаним сокетам. Хорошим прикладом цієї концепції було б висвітлення (emitting) поточного рахунку під'єднаних користувачів щоразу коли під'єднується новий користувач!
+Видача – найпоширеніший спосіб спілкування, яким ви будете користуватись. Коли ви видаєте щось зі сервера до «io», ви надсилаєте назву події та дані всім приєднаним сокетам. Хорошим прикладом цієї концепції є видача поточної кількості приєднаних користувачів щоразу, коли приєднується новий користувач!
-Почніть із додавання змінної, щоб відстежувати користувачів, безпосередньо перед тим місцем, де ви зараз слухаєте зв'язки.
+Почніть із додавання змінної, щоб відстежувати користувачів, одразу перед тим місцем, де ви зараз слухаєте приєднання.
```js
let currentUsers = 0;
```
-Тепер, коли хтось приєднується, ви повинні збільшити рахунок перш ніж висвітити його. Отже, ви додаєте інкремент в межах слухача підключення.
+Тепер, коли хтось приєднується, ви повинні збільшити кількість, перш ніж видати її. Тому вам потрібно буде додати інкремент в межах слухача приєднання.
```js
++currentUsers;
```
-Врешті, після збільшення рахунку, ви повинні висвітити подію (все ще в слухачі підключення). Ця подія повинна мати назву "user count", а дані — просто `currentUsers`.
+Після збільшення кількості ви повинні видати подію (досі в слухачі приєднання). Ця подія повинна мати назву «user count», а дані – просто `currentUsers`.
```js
io.emit('user count', currentUsers);
```
-Тепер ви можете застосувати цей спосіб для вашого клієнта, аби він міг прослухати цю подію! Подібно до прослуховування з'єднання на сервері, ви будете використовувати ключове слово `on`.
+Тепер ви можете застосувати цей спосіб для свого клієнта, щоб він міг прослухати цю подію! Подібно до прослуховування приєднання на сервері, ви будете використовувати ключове слово `on`.
```js
socket.on('user count', function(data) {
@@ -36,13 +36,13 @@ socket.on('user count', function(data) {
});
```
-Тепер спробуйте завантажити ваш додаток, автентифікуватись і ви повинні побачити на консолі клієнта '1', яка показує поточну кількість користувачів! Спробуйте завантажити більше клієнтів і автентифікуйтеся, щоб побачити, як число зростає.
+Тепер спробуйте завантажити свою програму, автентифікуватись і ви повинні побачити на консолі клієнта «1», що показує поточну кількість користувачів! Спробуйте завантажити більше клієнтів і автентифікуйтеся, щоб побачити, як число зростає.
Відправте свою сторінку коли впевнились, що все правильно. Якщо виникають помилки, ви можете переглянути проєкт, виконаний до цього етапу.
# --hints--
-`currentUsers` should be defined.
+`currentUsers` повинні бути визначеними.
```js
async (getUserInput) => {
@@ -57,7 +57,7 @@ async (getUserInput) => {
}
```
-Сервер має висвічувати поточний рахунок користувачів в кожному новому зв'язку.
+Сервер повинен видавати поточну кількість користувачів при кожному приєднанні.
```js
async (getUserInput) => {
@@ -72,7 +72,7 @@ async (getUserInput) => {
}
```
-Your client should be listening for `'user count'` event.
+Ваш клієнт повинен прослухати подію `'user count'`.
```js
async (getUserInput) => {
diff --git a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/how-to-use-passport-strategies.md b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/how-to-use-passport-strategies.md
index d56070a3832..986caef97f0 100644
--- a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/how-to-use-passport-strategies.md
+++ b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/how-to-use-passport-strategies.md
@@ -8,23 +8,23 @@ dashedName: how-to-use-passport-strategies
# --description--
-In the `index.pug` file supplied, there is a login form. It is hidden because of the inline JavaScript `if showLogin` with the form indented after it.
+У заданому файлі `index.pug` є форма авторизації. Її приховано через вбудований JavaScript `if showLogin` з відступленою формою після.
-In the `res.render` for that page, add a new variable to the object, `showLogin: true`. When you refresh your page, you should then see the form! This form is set up to **POST** on `/login`. So, this is where you should set up to accept the POST request and authenticate the user.
+У `res.render` для цієї сторінки додайте нову змінну до об'єкта `showLogin: true`. Коли ви оновите сторінку, ви повинні побачити форму! Ця форма налаштована, щоб надіслати запит **POST** до `/login`. Тут ви повинні налаштувати прийом запиту POST та автентифікацію користувача.
-For this challenge, you should add the route `/login` to accept a POST request. To authenticate on this route, you need to add a middleware to do so before then sending a response. This is done by just passing another argument with the middleware before with your response. The middleware to use is `passport.authenticate('local')`.
+Для цього завдання потрібно додати маршрут `/login`, щоб прийняти запит POST. Для автентифікації на цьому маршруті потрібно додати проміжне програмне забезпечення перед надсиланням відповіді. Для цього потрібно передати інший аргумент разом із проміжним ПЗ перед відповіддю. Потрібно використати наступне проміжне ПЗ: `passport.authenticate('local')`.
-`passport.authenticate` can also take some options as an argument such as `{ failureRedirect: '/' }` which is incredibly useful, so be sure to add that in as well. Add a response after using the middleware (which will only be called if the authentication middleware passes) that redirects the user to `/profile`. Add that route, as well, and make it render the view `profile.pug`.
+`passport.authenticate` також може приймати деякі опції, як-от аргумент `{ failureRedirect: '/' }`, який є неймовірно корисними, тому не забудьте додати його. Додайте відповідь після використання проміжного ПЗ (її буде викликано лише при дійсному проміжному ПЗ), що переадресовує користувача до `/profile`. Додайте також цей маршрут і зробіть так, щоб він зображав перегляд `profile.pug`.
-If the authentication was successful, the user object will be saved in `req.user`.
+Якщо автентифікація була успішною, то об'єкта-користувача буде збережено в `req.user`.
-At this point, if you enter a username and password in the form, it should redirect to the home page `/`, and the console of your server should display `'User {USERNAME} attempted to log in.'`, since we currently cannot login a user who isn't registered.
+Якщо ви введете ім'я користувача і пароль у форму, ви будете переадресовані на головну сторінку `/`, а на консолі вашого серверу з'явиться `'User {USERNAME} attempted to log in.'`, оскільки наразі ми не можемо увійти в обліковий запис користувача, який не зареєстрований.
Відправте свою сторінку коли впевнились, що все правильно. Якщо виникають помилки, ви можете переглянути проєкт, виконаний до цього етапу.
# --hints--
-All steps should be correctly implemented in `server.js`.
+Усі кроки повинні бути правильно реалізовані в `server.js`.
```js
async (getUserInput) => {
@@ -49,7 +49,7 @@ async (getUserInput) => {
}
```
-A POST request to `/login` should correctly redirect to `/`.
+Запит POST до `/login` повинен правильно перенаправляти до `/`.
```js
async (getUserInput) => {
diff --git a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implement-the-serialization-of-a-passport-user.md b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implement-the-serialization-of-a-passport-user.md
index 63a239dbaf8..4c1c3e1a825 100644
--- a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implement-the-serialization-of-a-passport-user.md
+++ b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implement-the-serialization-of-a-passport-user.md
@@ -1,6 +1,6 @@
---
id: 5895f70cf9fc0f352b528e67
-title: Впровадження Серіалізації Користувача у Паспорт
+title: Реалізація серіалізації користувача Passport
challengeType: 2
forumTopicId: 301556
dashedName: implement-the-serialization-of-a-passport-user
@@ -8,11 +8,11 @@ dashedName: implement-the-serialization-of-a-passport-user
# --description--
-You are not loading an actual user object since the database is not set up. Connect to the database once, when you start the server, and keep a persistent connection for the full life-cycle of the app. To do this, add your database's connection string (for example: `mongodb+srv://:@cluster0-jvwxi.mongodb.net/?retryWrites=true&w=majority`) to the environment variable `MONGO_URI`. Це використовується у файлі `connection.js`.
+Ви не завантажуєте самого об’єкта-користувача, оскільки базу даних не налаштовано. Приєднайтеся до бази даних під час запуску сервера та зберігайте постійне з’єднання протягом життєвого циклу програми. Щоб зробити це, додайте рядок приєднання своєї бази даних (наприклад: `mongodb+srv://:@cluster0-jvwxi.mongodb.net/?retryWrites=true&w=majority`) до змінної середовища `MONGO_URI`. Це використовується у файлі `connection.js`.
-*If you are having issues setting up a free database on MongoDB Atlas, check out this tutorial.*
+*Якщо у вас виникли проблеми з налаштуванням безоплатної бази даних на MongoDB Atlas, див. цю публікацію.*
-Now you want to connect to your database, then start listening for requests. The purpose of this is to not allow requests before your database is connected or if there is a database error. To accomplish this, encompass your serialization and app routes in the following code:
+Тепер вам потрібно приєднатися до своєї бази даних, а потім почати слухати запити. Основна мета цього – це заборонити запити до того, як ваша база даних буде підключена або якщо у неї виникне помилка. Для цього потрібно оточити свою серіалізацію та маршрути програми наступним кодом:
```javascript
myDB(async client => {
@@ -44,7 +44,7 @@ myDB(async client => {
# --hints--
-Повинно бути присутнім з'єднання з базою даних.
+Приєднання до бази даних повинне бути присутнім.
```js
async (getUserInput) => {
@@ -59,7 +59,7 @@ async (getUserInput) => {
}
```
-Тепер десеріалізація повинна виконуватися правильно у БД, а `done(null, null)` повинна викликатися із `doc`.
+Десеріалізація повинна правильно використовувати базу даних та `done(null, null)` повинен викликатись з `doc`.
```js
async (getUserInput) => {
diff --git a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
index ebff4b3ed36..3647d881cf2 100644
--- a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
+++ b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-ii.md
@@ -8,13 +8,13 @@ dashedName: implementation-of-social-authentication-ii
# --description--
-Остання частина налаштування автентифікації GitHub – це створення самої стратегії. `passport-github@~1.1.0` has already been added as a dependency, so require it in your `auth.js` file as `GithubStrategy` like this: `const GitHubStrategy = require('passport-github').Strategy;`. Не забудьте викликати та налаштовувати `dotenv` для використання змінних середовища.
+Остання частина налаштування автентифікації GitHub – це створення самої стратегії. `passport-github@~1.1.0` вже додано як залежність, тому вимагайте його у своєму файлі `auth.js` як `GithubStrategy`, ось так: `const GitHubStrategy = require('passport-github').Strategy;`. Не забудьте вимагати та налаштувати `dotenv` для використання змінних середовища.
-Щоб налаштувати стратегію GitHub, ви повинні сказати Passport використовувати примірник `GitHubStrategy`, який приймає 2 аргументи: об'єкт (який містить `clientID`, `clientSecret` та `callbackURL`) та функцію, яку слід викликати після успішної автентифікації користувача, яка визначатиме, чи є користувач новим і які поля спочатку зберегти в об’єкті бази даних користувача. Це типово для багатьох стратегій, але деяким може знадобитися більше інформації, як зазначено в цій конкретній стратегії GitHub README. Наприклад, так Google вимагає *scope*, що визначає, яку інформацію просить повернути ваш запит, і просить користувача надати дозвіл на такий доступ.
+Щоб налаштувати стратегію GitHub, ви повинні сказати Passport використовувати екземпляр `GitHubStrategy`, який приймає 2 аргументи: об'єкт (який містить `clientID`, `clientSecret` та `callbackURL`) і функцію, яку потрібно викликати після успішної автентифікації користувача, яка визначатиме, чи є користувач новим і які поля спочатку зберегти у базі даних користувача. Це типово для багатьох стратегій, але деяким може знадобитися більше інформації, як зазначено в README цієї конкретної стратегії GitHub. Наприклад, Google вимагає *контекст*, що допомагає визначити, яку інформацію просить повернути ваш запит, і просить користувача надати дозвіл на такий доступ.
-The current strategy you are implementing authenticates users using a GitHub account and OAuth 2.0 tokens. The client ID and secret obtained when creating an application are supplied as options when creating the strategy. The strategy also requires a `verify` callback, which receives the access token and optional refresh token, as well as `profile` which contains the authenticated user's GitHub profile. The `verify` callback must call `cb` providing a user to complete authentication.
+Поточна стратегія, яку ви реалізовуєте, автентифікує користувачів за допомогою облікового запису на GitHub та токенів OAuth 2.0. ID та секрет клієнта, отримані під час створення програми, надаються як параметри під час створення стратегії. Стратегія також вимагає зворотного виклику `verify`, який отримує токен доступу та додатковий токен оновлення, а також `profile`, який містить профіль автентифікованого користувача на GitHub. Зворотний виклик `verify` повинен викликати `cb`, надаючи користувача для завершення автентифікації.
-Here's how your new strategy should look at this point:
+Ось так повинна виглядати ваша нова стратегія на цьому етапі:
```js
passport.use(new GitHubStrategy({
@@ -29,13 +29,13 @@ passport.use(new GitHubStrategy({
));
```
-Your authentication won't be successful yet, and it will actually throw an error without the database logic and callback, but it should log your GitHub profile to your console if you try it!
+Наразі ваша автентифікація не буде успішною, і насправді буде помилка без логіки бази даних та зворотного виклику, але на консолі повинен з'явитись ваш профіль на GitHub, якщо спробуєте!
Відправте свою сторінку коли впевнились, що все правильно. Якщо виникають помилки, ви можете переглянути проєкт, виконаний до цього етапу.
# --hints--
-passport-github dependency should be added.
+Потрібно додати залежність passport-github.
```js
async (getUserInput) => {
@@ -65,7 +65,7 @@ async (getUserInput) => {
}
```
-GitHub strategy should be setup correctly thus far.
+Стратегію GitHub потрібно правильно налаштувати.
```js
async (getUserInput) => {
diff --git a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-iii.md b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-iii.md
index b5f8a240ce0..ca47c42124f 100644
--- a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-iii.md
+++ b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication-iii.md
@@ -8,7 +8,7 @@ dashedName: implementation-of-social-authentication-iii
# --description--
-Кінцева частина стратегії керує профілем поверненим з GitHub. Якщо існує об'єкт бази даних користувача, необхідно його завантажити. У разі відсутності, потрібно його створити. Потім заповнюємо поля профілю і повертаємо об'єкт користувача. У межах кожного профілю GitHub надає нам унікальний *id*, який можна використовувати для пошуку для того, щоб серіалізувати користувача (уже реалізовано). Нижче наведено приклад реалізації, який ви можете використовувати у вашому проєкті - це відбувається завдяки функції, яка є другим аргументом для нової стратегії, нижче де `console.log(profile);` наразі є:
+Фінальна частина стратегії обробляє профіль, повернений з GitHub. Нам потрібно завантажити базу даних користувача, якщо вона існує (або створити, якщо її немає), та заповнити поля профілю, а потім повернути об’єкт користувача. У межах кожного профілю GitHub надає нам унікальний *id*, який можна використовувати для того, щоб знайти та серіалізувати користувача (уже реалізовано). Нижче наведено приклад реалізації, який ви можете використати у своєму проєкті. Він входить до функції, яка є другим аргументом для нової стратегії, одразу під місцем, де `console.log(profile);` наразі такий:
```js
myDataBase.findOneAndUpdate(
@@ -39,9 +39,9 @@ myDataBase.findOneAndUpdate(
);
```
-`findOneAndUpdate` дозволяє шукати та оновлювати об'єкт. У разі, якщо об'єкта не існує, його вставлять та зроблять доступним для функції зворотнього зв'язку. У цьому прикладі, ми завжди встановлюємо `last_login`, збільшуємо `login_count` на `1` та після додавання нового об'єкту (користувача) лише заповнюємо більшість полів. Зверніть увагу на використання значень за замовчуванням. Іноді повернений профіль не міститиме усієї інформації або ж користувач зробить її приватною. У такому випадку, ви його обробляєте задля уникнення помилки.
+`findOneAndUpdate` дозволяє шукати та оновлювати об'єкт. Якщо об'єкта не існує, його вставлять та зроблять доступним для функції зворотнього зв'язку. У цьому прикладі ми завжди встановлюємо `last_login`, збільшуємо `login_count` на `1` та заповнюємо більшість полів після додавання нового об'єкта (користувача). Зверніть увагу на використання значень за замовчуванням. Іноді повернений профіль не міститиме усієї інформації або ж користувач зробить її приватною. У такому випадку ви його обробляєте, щоб уникнути помилки.
-You should be able to login to your app now. Try it!
+Тепер ви можете увійти у свій додаток. Спробуйте!
Відправте свою сторінку коли впевнились, що все правильно. Якщо виникають помилки, ви можете переглянути проєкт, виконаний до цього етапу.
diff --git a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication.md b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication.md
index 1d7688c7a0c..8f39b7f0600 100644
--- a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication.md
+++ b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/implementation-of-social-authentication.md
@@ -8,21 +8,21 @@ dashedName: implementation-of-social-authentication
# --description--
-Основний шлях автентифікації відстежуватиметься у вашому застосунку:
+Цей тип автентифікації буде дотримуватись наступного шляху:
-1. User clicks a button or link sending them to your route to authenticate using a specific strategy (e.g. GitHub).
-2. Ваш маршрут `passport.authenticate('github')` перенаправляє їх на GitHub.
-3. Сторінка, на яку користувач заходить, на GitHub, дозволяє йому увійти в систему, якщо він ще не зробив це. It then asks them to approve access to their profile from your app.
-4. The user is then returned to your app at a specific callback url with their profile if they are approved.
-5. Тепер вони аутентифіковані, і ваш застосунок перевірить, чи це постійний профіль, або збереже його у вашій базі даних, якщо це не так.
+1. Користувач натискає кнопку або посилання, надсилаючи їх на ваш маршрут, щоб автентифікуватись за допомогою визначеної стратегії (наприклад, GitHub).
+2. Ваш шлях викликає `passport.authenticate('github')`, перенаправляючи користувача на GitHub.
+3. Сторінка на GitHub, яку відвідує користувач, дозволяє увійти в систему, якщо він досі не зробив цього. Потім система просить користувача підтвердити доступ до свого профілю з вашої програми.
+4. Потім користувач повертається до вашої програми за url-адресою зворотного виклику зі своїм профілем, якщо він схвалений.
+5. Тепер користувач автентифікований, і ваша програма перевірить, чи це постійний профіль, або збереже його у вашій базі даних, якщо це не так.
-Стратегії з OAuth потребують, щоб ви мали принаймні *Client ID* та *Client Secret*, так сервіс перевірить, від кого надходить запит автентифікації та чи є він дійсним. Вони отримані з сайту, з яким ви намагаєтеся здійснити автентифікацію, наприклад, з сайту GitHub і вони є унікальними для вашого застосунку **ВОНИ НЕ Є ДЛЯ ЗАГАЛЬНОГО ДОСТУПУ** і ніколи не повинні бути завантажені в публічне сховище або написані безпосередньо у вашому коді. Поширеною практикою є розміщення їх у файлі `.env` і посилання на них таким чином: `process.env.GITHUB_CLIENT_ID`. For this challenge you are going to use the GitHub strategy.
+Стратегії з OAuth вимагають, щоб ви мали принаймні *ID клієнта* та *секрет клієнта*; так сервіс перевірить, від кого надходить запит автентифікації та чи є він дійсним. Вони отримані з сайту, за допомогою якого ви намагаєтеся здійснити автентифікацію, наприклад, з сайту GitHub, та вони є унікальними для вашої програми. **ВОНИ НЕ ДЛЯ ПУБЛІЧНОГО ДОСТУПУ** і ніколи не можуть бути завантаженими в публічному репозиторії або написаними у вашому коді. Їх часто зберігають у файлі `.env` та посилаються на них таким чином: `process.env.GITHUB_CLIENT_ID`. Для вирішення цього завдання ви будете використовувати стратегію GitHub.
-Follow these instructions to obtain your *Client ID and Secret* from GitHub. Set the homepage URL to your Replit homepage (**not the project code's URL**), and set the callback URL to the same homepage URL with `/auth/github/callback` appended to the end. Save the client ID and your client secret in your project's `.env` file as `GITHUB_CLIENT_ID` and `GITHUB_CLIENT_SECRET`.
+Дотримуйтесь цих інструкцій, щоб отримати *ID та секрет клієнта* з GitHub. Встановіть URL-адресу головної сторінки на свою головну сторінку Replit (**а не URL-адресу коду проєкту**), і встановіть URL-адресу зворотного виклику на ту саму URL-адресу головної сторінки, додавши `/auth/github/callback` вкінці. Збережіть ID та секрет клієнта у своєму файлі проєкту `.env` як `GITHUB_CLIENT_ID` та `GITHUB_CLIENT_SECRET`.
-In your `routes.js` file, add `showSocialAuth: true` to the homepage route, after `showRegistration: true`. Now, create 2 routes accepting GET requests: `/auth/github` and `/auth/github/callback`. The first should only call passport to authenticate `'github'`. The second should call passport to authenticate `'github'` with a failure redirect to `/`, and then if that is successful redirect to `/profile` (similar to your last project).
+У своєму файлі `routes.js` додайте `showSocialAuth: true` до маршруту головної сторінки після `showRegistration: true`. Тепер створіть 2 маршрути, які прийматимуть запити GET: `/auth/github` та `/auth/github/callback`. Перший повинен лише викликати паспорт для автентифікації `'github'`. Другий повинен викликати паспорт для автентифікації `'github'` з помилкою переадресації на `/`, а потім, якщо вдалося, переадресувати на `/profile` (подібно до вашого останнього проєкту).
-An example of how `/auth/github/callback` should look is similar to how you handled a normal login:
+Приклад `/auth/github/callback` схожий до того, як ви обробляли звичайний вхід в обліковий запис:
```js
app.route('/login')
@@ -35,7 +35,7 @@ app.route('/login')
# --hints--
-Route `/auth/github` should be correct.
+Маршрут `/auth/github` повинен бути правильним.
```js
async (getUserInput) => {
@@ -66,7 +66,7 @@ async (getUserInput) => {
}
```
-Route `/auth/github/callback` should be correct.
+Маршрут `/auth/github/callback` повинен бути правильним.
```js
async (getUserInput) => {
diff --git a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/logging-a-user-out.md b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/logging-a-user-out.md
index fa74e425f7e..5e254f37a6f 100644
--- a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/logging-a-user-out.md
+++ b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/logging-a-user-out.md
@@ -8,9 +8,9 @@ dashedName: logging-a-user-out
# --description--
-Логіка logout легко створюється. The route should just unauthenticate the user, and redirect to the home page instead of rendering any view.
+Створити логіку виходу з облікового запису легко. Маршрут має лише скасувати автентифікацію користувача та переадресувати на головну сторінку замість візуалізації будь-якого перегляду.
-In passport, unauthenticating a user is as easy as just calling `req.logout()` before redirecting. Add this `/logout` route to do that:
+Скасувати автентифікацію користувача через Passport так само легко, як викликати `req.logout()` перед переадресацією. Додайте такий маршрут `/logout`, щоб зробити це:
```js
app.route('/logout')
@@ -20,7 +20,7 @@ app.route('/logout')
});
```
-You may have noticed that you are not handling missing pages (404). Поширений спосіб обробки цієї помилки у Node є наступне проміжне програмне забезпечення. Додайте це після всіх інших маршрутів:
+Мабуть, ви помітили, що не обробляєте відсутні вебсторінки (404). Поширеним способом обробки цієї помилки у Node є наступне проміжне програмне забезпечення. Додайте його після всіх інших маршрутів:
```js
app.use((req, res, next) => {
@@ -34,7 +34,7 @@ app.use((req, res, next) => {
# --hints--
-`req.logout()` should be called in your `/logout` route.
+`req.logout()` потрібно викликати у маршруті `/logout`.
```js
async (getUserInput) => {
@@ -49,7 +49,7 @@ async (getUserInput) => {
}
```
-`/logout` should redirect to the home page.
+`/logout` повинен переадресовувати на головну сторінку.
```js
async (getUserInput) => {
diff --git a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md
index 4a8f283ecf7..dc2d134104a 100644
--- a/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md
+++ b/curriculum/challenges/ukrainian/06-quality-assurance/advanced-node-and-express/set-up-the-environment.md
@@ -8,20 +8,20 @@ dashedName: set-up-the-environment
# --description--
-Наступні завдання використовуватимуть файл `chat.pug`. Отже, у файлі `routes.js` додайте шлях GET, вказавши на `/chat`, що використовує `ensureAuthenticated` і відображає `chat.pug`, передаючи `{ user: req.user }` як аргумент до відповіді. Тепер змініть існуючий шлях `/auth/github/callback`, щоб встановити `req.session.user_id = req.user.id`, і перенаправте до `/chat`.
+Наступні завдання використовуватимуть файл `chat.pug`. Отже, у файлі `routes.js` додайте маршрут GET, вказуючи на `/chat`, що використовує `ensureAuthenticated` та відображає `chat.pug`, передаючи `{ user: req.user }` як аргумент до відповіді. Тепер змініть наявний маршрут `/auth/github/callback`, щоб встановити `req.session.user_id = req.user.id`, та перенаправте до `/chat`.
-`socket.io@~2.3.0` has already been added as a dependency, so require/instantiate it in your server as follows with `http` (comes built-in with Nodejs):
+`socket.io@~2.3.0` вже додано як залежність, тому вимагайте/встановіть його на свій сервер наступним чином з `http` (вбудований з Nodejs):
```javascript
const http = require('http').createServer(app);
const io = require('socket.io')(http);
```
-Тепер, коли сервер *http* встановлений в *експрес застосунку*, чекайте відповіді від сервера *http*. Змініть рядок `app.listen` на `http.listen`.
+Тепер, коли сервер *http* встановлений у *програмі express*, вам потрібно послухати сервер *http*. Змініть рядок з `app.listen` на `http.listen`.
-Спершу необхідно прослухати нове з'єднання від клієнта. Ключове слово on робить лише це — прослуховує конкретну подію. It requires 2 arguments: a string containing the title of the event that's emitted, and a function with which the data is passed through. In the case of our connection listener, use `socket` to define the data in the second argument. Сокет (socket) – це підключений індивідуальний клієнт.
+Спершу необхідно прослухати нове приєднання від клієнта. Ключове слово on робить якраз це: слухає конкретну подію. Воно вимагає 2 аргументи: рядок, що містить заголовок події, яка видається, і функція, через яку проходять дані. У випадку нашого слухача приєднання використайте `socket`, щоб визначити дані в другому аргументі. Сокет – це приєднаний індивідуальний клієнт.
-Щоб прослухати підключення до вашого сервера, додайте до вашого підключення бази даних наступне:
+Щоб прослухати приєднання до свого сервера, додайте до приєднання бази даних наступне:
```javascript
io.on('connection', socket => {
@@ -29,18 +29,18 @@ io.on('connection', socket => {
});
```
-Тепер, щоб клієнт під'єднався, вам треба просто додати до вашого `client.js`, що завантажується сторінкою після автентифікації, наступне:
+Тепер, щоб клієнт приєднався, вам потрібно просто додати до свого `client.js`, що завантажується сторінкою після автентифікації, наступне:
```js
/*global io*/
let socket = io();
```
-Цей коментар замовчує помилку, яку ви б зазвичай бачили, оскільки 'io' не визначено в файлі. You have already added a reliable CDN to the Socket.IO library on the page in `chat.pug`.
+Цей коментар замовчує помилку, яку ви б зазвичай бачили, оскільки у файлі не визначено «io». Ви вже додали надійний CDN до бібліотеки Socket.IO на сторінці у `chat.pug`.
-Now try loading up your app and authenticate and you should see in your server console `A user has connected`.
+Тепер спробуйте завантажити свою програму і автентифікуватись, і на консолі серверу ви побачите `A user has connected`.
-**Примітка:**`io()` працює лише тоді коли підключений до сокета, який знаходиться на тому ж url/сервері. Щоб підключитись до зовнішнього сокета, який знаходиться в іншому місці, скористайтесь `io.connect('URL');`.
+**Примітка:** `io()` працює лише при приєднанні до сокета, який знаходиться на тому ж url/сервері. Щоб підключитись до зовнішнього сокета, який знаходиться в іншому місці, скористайтесь `io.connect('URL');`.
Відправте свою сторінку коли впевнились, що все правильно. Якщо виникають помилки, ви можете переглянути проєкт, виконаний до цього етапу.
@@ -61,7 +61,7 @@ async (getUserInput) => {
}
```
-Ви маєте правильно запросити й встановити `http` як `http`.
+Ви повинні правильно вимагати та встановити `http` як `http`.
```js
async (getUserInput) => {
@@ -76,7 +76,7 @@ async (getUserInput) => {
}
```
-Ви маєте правильно запросити й встановити `socket.io` як `io`.
+Ви повинні правильно вимагати та встановити `socket.io` як `io`.
```js
async (getUserInput) => {
@@ -91,7 +91,7 @@ async (getUserInput) => {
}
```
-Socket.IO має прослуховувати з'єднання.
+Socket.IO повинен слухати приєднання.
```js
async (getUserInput) => {
@@ -106,7 +106,7 @@ async (getUserInput) => {
}
```
-Клієнт має бути підключеним до вашого сервера.
+Клієнт повинен приєднуватись до вашого сервера.
```js
async (getUserInput) => {
diff --git a/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md b/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
index d7a09d67d1f..10b4dfe509f 100644
--- a/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
+++ b/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/hash-and-compare-passwords-asynchronously.md
@@ -30,7 +30,7 @@ bcrypt.compare(myPlaintextPassword, hash, (err, res) => {
});
```
-Додайте це до своєї наявної хеш-функції (оскільки вам потрібно дочекатися завершення хешу перед викликом функції порівняння) після того, як ви записали повний хеш та ввели «res» на консоль в межах порівняння. You should see in the console a hash, and then 'true' is printed! If you change 'myPlaintextPassword' in the compare function to 'someOtherPlaintextPassword', then it should say false.
+Додайте це до своєї наявної хеш-функції (оскільки вам потрібно дочекатися завершення хешу перед викликом функції порівняння) після того, як ви записали повний хеш та ввели «res» на консоль в межах порівняння. На консолі з'являться хеш, а потім «true»! Якщо ви зміните «myPlaintextPassword» у функції порівняння на «someOtherPlaintextPassword», то з'явиться «false».
```js
bcrypt.hash('passw0rd!', 13, (err, hash) => {
diff --git a/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md b/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
index c428cc9c1a3..2a027de26d0 100644
--- a/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
+++ b/curriculum/challenges/ukrainian/09-information-security/information-security-with-helmetjs/set-a-content-security-policy-with-helmet.contentsecuritypolicy.md
@@ -10,7 +10,7 @@ dashedName: set-a-content-security-policy-with-helmet-contentsecuritypolicy
Нагадуємо, що цей проєкт створюється на основі наступного стартового проєкту на Replit або клонований з GitHub.
-Це завдання фокусується на новому перспективному захисті, за допомогою якого можна значно скоротити ризик та вплив багатьох атак в сучасних браузерах. Встановлюючи та налаштовуючи політику безпеки вмісту, ви можете запобігти проникненню всього небажаного на вашу сторінку. Це захистить ваш додаток від вразливостей XSS, небажаного відстеження, шкідливих фреймів та багато іншого. CSP працює шляхом визначення дозволеного списку джерел контенту, яким довіряють. Ви можете налаштувати їх для кожного типу ресурсів, які можуть знадобитися на вебсторінці (алгоритми, таблиці стилів, шрифти, фрейми, медіа тощо...). Існує декілька доступних директив, тому власники вебсайтів можуть мати повний контроль. Для більш детальної інформації, див. HTML 5 Rocks, KeyCDN. Unfortunately CSP is unsupported by older browsers.
+Це завдання фокусується на новому перспективному захисті, за допомогою якого можна значно скоротити ризик та вплив багатьох атак в сучасних браузерах. Встановлюючи та налаштовуючи політику безпеки вмісту, ви можете запобігти проникненню всього небажаного на вашу сторінку. Це захистить ваш додаток від вразливостей XSS, небажаного відстеження, шкідливих фреймів та багато іншого. CSP працює шляхом визначення дозволеного списку джерел контенту, яким довіряють. Ви можете налаштувати їх для кожного типу ресурсів, які можуть знадобитися на вебсторінці (алгоритми, таблиці стилів, шрифти, фрейми, медіа тощо...). Існує декілька доступних директив, тому власники вебсайтів можуть мати повний контроль. Для більш детальної інформації, див. HTML 5 Rocks, KeyCDN. На жаль, CSP не підтримується старішими браузерами.
Директиви знаходяться у загальному доступі за замовчуванням, тому важливо встановити директиву defaultSrc як резервну. Helmet підтримує такі стилі іменування, як defaultSrc та default-src. Резервний варіант застосовується для більшості невизначених директив.