` è vuoto, il che significa che nulla verrà mostrato sullo schermo finché non aggiungiamo del contenuto. Gli diamo anche un `id` in modo da poterlo recuperare facilmente con JavaScript.
+Questo elemento `
` è vuoto, il che significa che nulla verrà mostrato sullo schermo fino a quando non aggiungiamo del contenuto. Gli diamo anche un `id` per poterlo recuperare facilmente con JavaScript.
Torna al file `app.js` e crea una nuova funzione helper `updateElement`:
@@ -156,7 +156,7 @@ function updateElement(id, text) {
}
```
-Questa è piuttosto semplice: dato un *id* di un elemento e un *testo*, aggiornerà il contenuto testuale dell'elemento DOM con l'`id` corrispondente. Usiamo questo metodo al posto del precedente messaggio di errore nella funzione `login`:
+Questa funzione è piuttosto semplice: dato un *id* dell'elemento e un *testo*, aggiornerà il contenuto testuale dell'elemento DOM con l'`id` corrispondente. Utilizziamo questo metodo al posto del precedente messaggio di errore nella funzione `login`:
```js
if (data.error) {
@@ -164,11 +164,11 @@ if (data.error) {
}
```
-Ora, se provi ad accedere con un account non valido, dovresti vedere qualcosa del genere:
+Ora, se provi a effettuare il login con un account non valido, dovresti vedere qualcosa del genere:

-Ora abbiamo un testo di errore che appare visivamente, ma se lo provi con un lettore di schermo noterai che non viene annunciato nulla. Per fare in modo che il testo aggiunto dinamicamente a una pagina venga annunciato dai lettori di schermo, sarà necessario utilizzare qualcosa chiamato [Live Region](https://developer.mozilla.org/docs/Web/Accessibility/ARIA/ARIA_Live_Regions). Qui utilizzeremo un tipo specifico di live region chiamato alert:
+Ora abbiamo un testo di errore che appare visivamente, ma se lo provi con un lettore di schermo noterai che nulla viene annunciato. Per fare in modo che il testo aggiunto dinamicamente a una pagina venga annunciato dai lettori di schermo, sarà necessario utilizzare qualcosa chiamato [Live Region](https://developer.mozilla.org/docs/Web/Accessibility/ARIA/ARIA_Live_Regions). Qui utilizzeremo un tipo specifico di live region chiamato alert:
```html
@@ -176,11 +176,11 @@ Ora abbiamo un testo di errore che appare visivamente, ma se lo provi con un let
Implementa lo stesso comportamento per gli errori della funzione `register` (non dimenticare di aggiornare l'HTML).
-## Mostrare informazioni nel dashboard
+## Mostrare informazioni sulla dashboard
-Utilizzando le stesse tecniche appena viste, ci occuperemo anche di mostrare le informazioni dell'account nella pagina del dashboard.
+Utilizzando le stesse tecniche appena viste, ci occuperemo anche di mostrare le informazioni dell'account sulla pagina della dashboard.
-Questo è come appare un oggetto account ricevuto dal server:
+Questo è l'aspetto di un oggetto account ricevuto dal server:
```json
{
@@ -214,9 +214,9 @@ Aggiungeremo anche una nuova sezione appena sotto per mostrare la descrizione de
```
-✅ Poiché la descrizione dell'account funziona come un titolo per il contenuto sottostante, è marcata semanticamente come un'intestazione. Scopri di più su come [la struttura delle intestazioni](https://www.nomensa.com/blog/2017/how-structure-headings-web-accessibility) sia importante per l'accessibilità e osserva criticamente la pagina per determinare cos'altro potrebbe essere un'intestazione.
+✅ Poiché la descrizione dell'account funziona come un titolo per il contenuto sottostante, è contrassegnata semanticamente come intestazione. Scopri di più su come [la struttura delle intestazioni](https://www.nomensa.com/blog/2017/how-structure-headings-web-accessibility) sia importante per l'accessibilità e osserva criticamente la pagina per determinare cos'altro potrebbe essere un'intestazione.
-Successivamente, creeremo una nuova funzione in `app.js` per riempire i segnaposto:
+Successivamente, creeremo una nuova funzione in `app.js` per riempire il segnaposto:
```js
function updateDashboard() {
@@ -234,7 +234,7 @@ Per prima cosa, verifichiamo di avere i dati dell'account necessari prima di pro
> Per rendere la visualizzazione del saldo più gradevole, utilizziamo il metodo [`toFixed(2)`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed) per forzare la visualizzazione del valore con 2 cifre decimali.
-Ora dobbiamo chiamare la nostra funzione `updateDashboard()` ogni volta che il dashboard viene caricato. Se hai già completato l'[esercizio della lezione 1](../1-template-route/assignment.md), questo dovrebbe essere semplice, altrimenti puoi utilizzare la seguente implementazione.
+Ora dobbiamo chiamare la nostra funzione `updateDashboard()` ogni volta che la dashboard viene caricata. Se hai già completato l'[assegnazione della lezione 1](../1-template-route/assignment.md) questo dovrebbe essere semplice, altrimenti puoi utilizzare la seguente implementazione.
Aggiungi questo codice alla fine della funzione `updateRoute()`:
@@ -253,9 +253,9 @@ const routes = {
};
```
-Con questa modifica, ogni volta che la pagina del dashboard viene mostrata, viene chiamata la funzione `updateDashboard()`. Dopo un login, dovresti quindi essere in grado di vedere il saldo dell'account, la valuta e la descrizione.
+Con questa modifica, ogni volta che la pagina della dashboard viene mostrata, viene chiamata la funzione `updateDashboard()`. Dopo un login, dovresti quindi essere in grado di vedere il saldo dell'account, la valuta e la descrizione.
-## Creare righe di tabella dinamicamente con template HTML
+## Creare righe della tabella dinamicamente con template HTML
Nella [prima lezione](../1-template-route/README.md) abbiamo utilizzato template HTML insieme al metodo [`appendChild()`](https://developer.mozilla.org/docs/Web/API/Node/appendChild) per implementare la navigazione nella nostra app. I template possono anche essere più piccoli e utilizzati per popolare dinamicamente parti ripetitive di una pagina.
@@ -275,9 +275,9 @@ Aggiungi un nuovo template nel `` dell'HTML:
```
-Questo template rappresenta una singola riga di tabella, con le 3 colonne che vogliamo popolare: *data*, *oggetto* e *importo* di una transazione.
+Questo template rappresenta una singola riga della tabella, con le 3 colonne che vogliamo popolare: *data*, *oggetto* e *importo* di una transazione.
-Poi, aggiungi questa proprietà `id` all'elemento `
` della tabella all'interno del template del dashboard per renderlo più facile da trovare utilizzando JavaScript:
+Poi, aggiungi questa proprietà `id` all'elemento ` ` della tabella all'interno del template della dashboard per renderlo più facile da trovare utilizzando JavaScript:
```html
@@ -297,7 +297,7 @@ function createTransactionRow(transaction) {
}
```
-Questa funzione fa esattamente ciò che il suo nome implica: utilizzando il template che abbiamo creato prima, crea una nuova riga di tabella e ne riempie i contenuti utilizzando i dati della transazione. La utilizzeremo nella nostra funzione `updateDashboard()` per popolare la tabella:
+Questa funzione fa esattamente ciò che il suo nome implica: utilizzando il template che abbiamo creato prima, crea una nuova riga della tabella e ne riempie i contenuti utilizzando i dati della transazione. Utilizzeremo questa funzione nella nostra `updateDashboard()` per popolare la tabella:
```js
const transactionsRows = document.createDocumentFragment();
@@ -308,9 +308,9 @@ for (const transaction of account.transactions) {
updateElement('transactions', transactionsRows);
```
-Qui utilizziamo il metodo [`document.createDocumentFragment()`](https://developer.mozilla.org/docs/Web/API/Document/createDocumentFragment) che crea un nuovo frammento DOM su cui possiamo lavorare, prima di attaccarlo finalmente alla nostra tabella HTML.
+Qui utilizziamo il metodo [`document.createDocumentFragment()`](https://developer.mozilla.org/docs/Web/API/Document/createDocumentFragment) che crea un nuovo frammento DOM su cui possiamo lavorare, prima di allegarlo finalmente alla nostra tabella HTML.
-C'è ancora una cosa che dobbiamo fare prima che questo codice possa funzionare, poiché la nostra funzione `updateElement()` attualmente supporta solo contenuti testuali. Cambiamo un po' il suo codice:
+C'è ancora una cosa che dobbiamo fare prima che questo codice possa funzionare, poiché la nostra funzione `updateElement()` attualmente supporta solo contenuti testuali. Modifichiamo un po' il suo codice:
```js
function updateElement(id, textOrNode) {
@@ -320,14 +320,14 @@ function updateElement(id, textOrNode) {
}
```
-Utilizziamo il metodo [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) poiché consente di allegare sia testo che [nodi DOM](https://developer.mozilla.org/docs/Web/API/Node) a un elemento genitore, perfetto per tutti i nostri casi d'uso.
+Utilizziamo il metodo [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) poiché consente di allegare sia testo che [Nodi DOM](https://developer.mozilla.org/docs/Web/API/Node) a un elemento padre, perfetto per tutti i nostri casi d'uso.
Se provi a utilizzare l'account `test` per accedere, ora dovresti vedere un elenco di transazioni nella dashboard 🎉.
---
## 🚀 Sfida
-Collaborate per far sì che la pagina della dashboard sembri una vera app bancaria. Se avete già stilizzato la vostra app, provate a utilizzare [media queries](https://developer.mozilla.org/docs/Web/CSS/Media_Queries) per creare un [design responsivo](https://developer.mozilla.org/docs/Web/Progressive_web_apps/Responsive/responsive_design_building_blocks) che funzioni bene sia su dispositivi desktop che mobili.
+Collaborate per far sì che la pagina della dashboard sembri una vera app bancaria. Se hai già stilizzato la tua app, prova a utilizzare [media queries](https://developer.mozilla.org/docs/Web/CSS/Media_Queries) per creare un [design responsivo](https://developer.mozilla.org/docs/Web/Progressive_web_apps/Responsive/responsive_design_building_blocks) che funzioni bene sia su dispositivi desktop che mobili.
Ecco un esempio di una pagina dashboard stilizzata:
@@ -341,5 +341,7 @@ Ecco un esempio di una pagina dashboard stilizzata:
[Refattorizza e commenta il tuo codice](assignment.md)
+---
+
**Disclaimer**:
-Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
+Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si consiglia una traduzione professionale eseguita da un traduttore umano. Non siamo responsabili per eventuali fraintendimenti o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
diff --git a/translations/it/7-bank-project/4-state-management/README.md b/translations/it/7-bank-project/4-state-management/README.md
index d30c13b4..c6a4acfa 100644
--- a/translations/it/7-bank-project/4-state-management/README.md
+++ b/translations/it/7-bank-project/4-state-management/README.md
@@ -1,27 +1,27 @@
-# Costruire un'app bancaria Parte 4: Concetti di gestione dello stato
+# Costruire un'App Bancaria Parte 4: Concetti di Gestione dello Stato
-## Quiz Pre-Lezione
+## Quiz Pre-Lettura
-[Quiz pre-lezione](https://ff-quizzes.netlify.app/web/quiz/47)
+[Quiz pre-lettura](https://ff-quizzes.netlify.app/web/quiz/47)
### Introduzione
-Man mano che un'applicazione web cresce, diventa una sfida tenere traccia di tutti i flussi di dati. Quale codice ottiene i dati, quale pagina li utilizza, dove e quando devono essere aggiornati... è facile finire con un codice disordinato e difficile da mantenere. Questo è particolarmente vero quando è necessario condividere dati tra diverse pagine della tua app, ad esempio i dati dell'utente. Il concetto di *gestione dello stato* è sempre esistito in tutti i tipi di programmi, ma poiché le app web continuano a crescere in complessità, è ora un punto chiave da considerare durante lo sviluppo.
+Man mano che un'applicazione web cresce, diventa una sfida tenere traccia di tutti i flussi di dati. Quale codice ottiene i dati, quale pagina li utilizza, dove e quando devono essere aggiornati... è facile finire con un codice disordinato e difficile da mantenere. Questo è particolarmente vero quando è necessario condividere dati tra diverse pagine della tua app, ad esempio i dati dell'utente. Il concetto di *gestione dello stato* è sempre esistito in tutti i tipi di programmi, ma con l'aumento della complessità delle app web è diventato un punto chiave da considerare durante lo sviluppo.
-In questa parte finale, esamineremo l'app che abbiamo costruito per ripensare a come viene gestito lo stato, consentendo il supporto per il refresh del browser in qualsiasi momento e la persistenza dei dati tra le sessioni utente.
+In questa parte finale, esamineremo l'app che abbiamo costruito per ripensare a come viene gestito lo stato, consentendo il supporto per l'aggiornamento del browser in qualsiasi momento e la persistenza dei dati tra le sessioni utente.
### Prerequisiti
-Devi aver completato la parte [data fetching](../3-data/README.md) dell'app web per questa lezione. Inoltre, devi installare [Node.js](https://nodejs.org) e [eseguire l'API del server](../api/README.md) localmente per gestire i dati dell'account.
+Devi aver completato la parte relativa al [recupero dei dati](../3-data/README.md) dell'app web per questa lezione. Inoltre, devi installare [Node.js](https://nodejs.org) e [eseguire l'API del server](../api/README.md) localmente per poter gestire i dati dell'account.
Puoi verificare che il server stia funzionando correttamente eseguendo questo comando in un terminale:
@@ -34,30 +34,30 @@ curl http://localhost:5000/api
## Ripensare la gestione dello stato
-Nella [lezione precedente](../3-data/README.md), abbiamo introdotto un concetto di base di stato nella nostra app con la variabile globale `account` che contiene i dati bancari dell'utente attualmente loggato. Tuttavia, la nostra implementazione attuale presenta alcune lacune. Prova a ricaricare la pagina quando sei sulla dashboard. Cosa succede?
+Nella [lezione precedente](../3-data/README.md), abbiamo introdotto un concetto di base di stato nella nostra app con la variabile globale `account` che contiene i dati bancari dell'utente attualmente connesso. Tuttavia, la nostra implementazione attuale presenta alcune lacune. Prova ad aggiornare la pagina quando sei nella dashboard. Cosa succede?
Ci sono 3 problemi con il codice attuale:
-- Lo stato non è persistente, poiché un refresh del browser ti riporta alla pagina di login.
-- Ci sono molte funzioni che modificano lo stato. Man mano che l'app cresce, può diventare difficile tracciare i cambiamenti ed è facile dimenticare di aggiornare qualcosa.
-- Lo stato non viene ripulito, quindi quando clicchi su *Logout* i dati dell'account sono ancora presenti anche se sei sulla pagina di login.
+- Lo stato non è persistente, poiché un aggiornamento del browser ti riporta alla pagina di login.
+- Ci sono più funzioni che modificano lo stato. Man mano che l'app cresce, può diventare difficile tenere traccia delle modifiche ed è facile dimenticare di aggiornare qualcosa.
+- Lo stato non viene ripulito, quindi quando clicchi su *Logout* i dati dell'account sono ancora presenti anche se sei nella pagina di login.
Potremmo aggiornare il nostro codice per affrontare questi problemi uno per uno, ma ciò creerebbe più duplicazione di codice e renderebbe l'app più complessa e difficile da mantenere. Oppure potremmo fermarci per qualche minuto e ripensare la nostra strategia.
-> Quali problemi stiamo cercando di risolvere realmente?
+> Quali problemi stiamo davvero cercando di risolvere qui?
-La [gestione dello stato](https://en.wikipedia.org/wiki/State_management) riguarda principalmente il trovare un buon approccio per risolvere questi due problemi particolari:
+La [gestione dello stato](https://en.wikipedia.org/wiki/State_management) riguarda il trovare un buon approccio per risolvere questi due problemi particolari:
- Come mantenere i flussi di dati in un'app comprensibili?
- Come mantenere i dati dello stato sempre sincronizzati con l'interfaccia utente (e viceversa)?
-Una volta affrontati questi problemi, qualsiasi altro problema che potresti avere potrebbe essere già risolto o diventare più facile da risolvere. Ci sono molti approcci possibili per risolvere questi problemi, ma utilizzeremo una soluzione comune che consiste nel **centralizzare i dati e i modi per modificarli**. I flussi di dati funzionerebbero così:
+Una volta affrontati questi problemi, qualsiasi altra questione potrebbe essere già risolta o diventare più facile da risolvere. Esistono molti approcci possibili per affrontare questi problemi, ma utilizzeremo una soluzione comune che consiste nel **centralizzare i dati e i modi per modificarli**. I flussi di dati funzionerebbero così:

-> Qui non tratteremo la parte in cui i dati aggiornano automaticamente la vista, poiché è legata a concetti più avanzati di [Programmazione Reattiva](https://en.wikipedia.org/wiki/Reactive_programming). È un buon argomento di approfondimento se sei interessato a un'immersione più profonda.
+> Qui non tratteremo la parte in cui i dati aggiornano automaticamente la vista, poiché è legata a concetti più avanzati di [Programmazione Reattiva](https://en.wikipedia.org/wiki/Reactive_programming). È un buon argomento di approfondimento se vuoi esplorare ulteriormente.
-✅ Esistono molte librerie con approcci diversi alla gestione dello stato, [Redux](https://redux.js.org) è una delle opzioni più popolari. Dai un'occhiata ai concetti e ai modelli utilizzati, poiché spesso è un buon modo per imparare quali problemi potenziali potresti affrontare in grandi app web e come possono essere risolti.
+✅ Esistono molte librerie con approcci diversi alla gestione dello stato, [Redux](https://redux.js.org) essendo una delle opzioni più popolari. Dai un'occhiata ai concetti e ai pattern utilizzati, poiché spesso è un buon modo per imparare quali problemi potresti affrontare nelle grandi app web e come possono essere risolti.
### Compito
@@ -75,7 +75,7 @@ let state = {
};
```
-L'idea è di *centralizzare* tutti i dati della nostra app in un unico oggetto stato. Per ora abbiamo solo `account` nello stato, quindi non cambia molto, ma crea una base per evoluzioni future.
+L'idea è di *centralizzare* tutti i dati della nostra app in un unico oggetto di stato. Per ora abbiamo solo `account` nello stato, quindi non cambia molto, ma crea una base per le evoluzioni future.
Dobbiamo anche aggiornare le funzioni che lo utilizzano. Nelle funzioni `register()` e `login()`, sostituisci `account = ...` con `state.account = ...`;
@@ -87,15 +87,15 @@ const account = state.account;
Questo refactoring di per sé non ha portato grandi miglioramenti, ma l'idea era di gettare le basi per i prossimi cambiamenti.
-## Tracciare i cambiamenti dei dati
+## Tracciare le modifiche ai dati
-Ora che abbiamo messo in atto l'oggetto `state` per memorizzare i nostri dati, il passo successivo è centralizzare gli aggiornamenti. L'obiettivo è rendere più facile tenere traccia di qualsiasi cambiamento e quando avvengono.
+Ora che abbiamo messo in atto l'oggetto `state` per memorizzare i nostri dati, il passo successivo è centralizzare gli aggiornamenti. L'obiettivo è rendere più facile tenere traccia di eventuali modifiche e quando avvengono.
-Per evitare che vengano apportate modifiche all'oggetto `state`, è anche una buona pratica considerarlo [*immutabile*](https://en.wikipedia.org/wiki/Immutable_object), il che significa che non può essere modificato affatto. Questo implica che devi creare un nuovo oggetto stato se vuoi cambiare qualcosa in esso. Facendo così, costruisci una protezione contro potenziali [effetti collaterali](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) indesiderati e apri possibilità per nuove funzionalità nella tua app, come implementare undo/redo, rendendo anche più facile il debug. Ad esempio, potresti registrare ogni cambiamento fatto allo stato e mantenere una cronologia dei cambiamenti per capire la fonte di un bug.
+Per evitare che vengano apportate modifiche all'oggetto `state`, è anche una buona pratica considerarlo [*immutabile*](https://en.wikipedia.org/wiki/Immutable_object), il che significa che non può essere modificato affatto. Significa anche che devi creare un nuovo oggetto di stato se vuoi cambiare qualcosa in esso. Facendo ciò, costruisci una protezione contro potenziali [effetti collaterali indesiderati](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) e apri possibilità per nuove funzionalità nella tua app, come implementare undo/redo, rendendo anche più facile il debug. Ad esempio, potresti registrare ogni modifica apportata allo stato e mantenere una cronologia delle modifiche per capire l'origine di un bug.
-In JavaScript, puoi usare [`Object.freeze()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) per creare una versione immutabile di un oggetto. Se provi a fare modifiche a un oggetto immutabile, verrà sollevata un'eccezione.
+In JavaScript, puoi utilizzare [`Object.freeze()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) per creare una versione immutabile di un oggetto. Se provi a modificare un oggetto immutabile, verrà generata un'eccezione.
-✅ Conosci la differenza tra un oggetto immutabile *superficiale* e uno *profondo*? Puoi leggerne [qui](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze).
+✅ Conosci la differenza tra un oggetto immutabile *superficiale* e uno *profondo*? Puoi leggerne di più [qui](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze).
### Compito
@@ -110,9 +110,9 @@ function updateState(property, newData) {
}
```
-In questa funzione, stiamo creando un nuovo oggetto stato e copiando i dati dallo stato precedente usando l'[*operatore spread (`...`)*](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals). Poi sovrascriviamo una particolare proprietà dell'oggetto stato con i nuovi dati usando la [notazione con parentesi](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties) `[property]` per l'assegnazione. Infine, blocchiamo l'oggetto per impedire modifiche usando `Object.freeze()`. Per ora abbiamo solo la proprietà `account` memorizzata nello stato, ma con questo approccio puoi aggiungere tutte le proprietà necessarie.
+In questa funzione, stiamo creando un nuovo oggetto di stato e copiando i dati dallo stato precedente utilizzando lo [*spread (`...`) operator*](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals). Poi sovrascriviamo una particolare proprietà dell'oggetto di stato con i nuovi dati utilizzando la [notazione a parentesi](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties) `[property]` per l'assegnazione. Infine, blocchiamo l'oggetto per impedire modifiche utilizzando `Object.freeze()`. Per ora abbiamo solo la proprietà `account` memorizzata nello stato, ma con questo approccio puoi aggiungere tutte le proprietà di cui hai bisogno.
-Aggiorneremo anche l'inizializzazione dello stato per assicurarci che lo stato iniziale sia bloccato:
+Aggiorneremo anche l'inizializzazione dello `state` per assicurarci che lo stato iniziale sia anch'esso bloccato:
```js
let state = Object.freeze({
@@ -145,9 +145,9 @@ function logout() {
In `updateDashboard()`, sostituisci il reindirizzamento `return navigate('/login');` con `return logout()`;
-Prova a registrare un nuovo account, disconnetterti e accedere di nuovo per verificare che tutto funzioni correttamente.
+Prova a registrare un nuovo account, a fare logout e a rientrare per verificare che tutto funzioni ancora correttamente.
-> Suggerimento: puoi dare un'occhiata a tutti i cambiamenti dello stato aggiungendo `console.log(state)` alla fine di `updateState()` e aprendo la console negli strumenti di sviluppo del browser.
+> Suggerimento: puoi dare un'occhiata a tutte le modifiche dello stato aggiungendo `console.log(state)` alla fine di `updateState()` e aprendo la console negli strumenti di sviluppo del browser.
## Persistenza dello stato
@@ -160,18 +160,18 @@ Quando vuoi persistere i dati nel browser, ci sono alcune domande importanti che
Esistono diversi modi per memorizzare informazioni all'interno di un'app web, a seconda di ciò che vuoi ottenere. Ad esempio, puoi utilizzare gli URL per memorizzare una query di ricerca e renderla condivisibile tra gli utenti. Puoi anche utilizzare i [cookie HTTP](https://developer.mozilla.org/docs/Web/HTTP/Cookies) se i dati devono essere condivisi con il server, come le informazioni di [autenticazione](https://en.wikipedia.org/wiki/Authentication).
-Un'altra opzione è utilizzare una delle molte API del browser per memorizzare i dati. Due di esse sono particolarmente interessanti:
+Un'altra opzione è utilizzare una delle tante API del browser per memorizzare i dati. Due di esse sono particolarmente interessanti:
-- [`localStorage`](https://developer.mozilla.org/docs/Web/API/Window/localStorage): un [Key/Value store](https://en.wikipedia.org/wiki/Key%E2%80%93value_database) che consente di persistere dati specifici per il sito web corrente tra diverse sessioni. I dati salvati in esso non scadono mai.
+- [`localStorage`](https://developer.mozilla.org/docs/Web/API/Window/localStorage): un [Key/Value store](https://en.wikipedia.org/wiki/Key%E2%80%93value_database) che consente di persistere i dati specifici del sito web corrente tra diverse sessioni. I dati salvati in esso non scadono mai.
- [`sessionStorage`](https://developer.mozilla.org/docs/Web/API/Window/sessionStorage): funziona allo stesso modo di `localStorage` tranne per il fatto che i dati memorizzati in esso vengono cancellati quando la sessione termina (quando il browser viene chiuso).
-Nota che entrambe queste API consentono solo di memorizzare [stringhe](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String). Se vuoi memorizzare oggetti complessi, dovrai serializzarli nel formato [JSON](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON) usando [`JSON.stringify()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify).
+Nota che entrambe queste API consentono solo di memorizzare [stringhe](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String). Se vuoi memorizzare oggetti complessi, dovrai serializzarli nel formato [JSON](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON) utilizzando [`JSON.stringify()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify).
-✅ Se vuoi creare un'app web che non funziona con un server, è anche possibile creare un database sul client utilizzando l'API [`IndexedDB`](https://developer.mozilla.org/docs/Web/API/IndexedDB_API). Questa opzione è riservata a casi d'uso avanzati o se hai bisogno di memorizzare una quantità significativa di dati, poiché è più complessa da utilizzare.
+✅ Se vuoi creare un'app web che non funziona con un server, è anche possibile creare un database sul client utilizzando l'API [`IndexedDB`](https://developer.mozilla.org/docs/Web/API/IndexedDB_API). Questa è riservata a casi d'uso avanzati o se hai bisogno di memorizzare una quantità significativa di dati, poiché è più complessa da utilizzare.
### Compito
-Vogliamo che i nostri utenti rimangano loggati fino a quando non cliccano esplicitamente sul pulsante *Logout*, quindi utilizzeremo `localStorage` per memorizzare i dati dell'account. Per prima cosa, definiamo una chiave che utilizzeremo per memorizzare i nostri dati.
+Vogliamo che i nostri utenti rimangano connessi fino a quando non cliccano esplicitamente sul pulsante *Logout*, quindi utilizzeremo `localStorage` per memorizzare i dati dell'account. Per prima cosa, definiamo una chiave che utilizzeremo per memorizzare i nostri dati.
```js
const storageKey = 'savedAccount';
@@ -185,7 +185,7 @@ localStorage.setItem(storageKey, JSON.stringify(state.account));
Con questo, i dati dell'account utente saranno persistenti e sempre aggiornati poiché abbiamo centralizzato in precedenza tutti gli aggiornamenti dello stato. È qui che iniziamo a beneficiare di tutti i nostri refactoring precedenti 🙂.
-Poiché i dati vengono salvati, dobbiamo anche occuparci di ripristinarli quando l'app viene caricata. Dato che inizieremo ad avere più codice di inizializzazione, potrebbe essere una buona idea creare una nuova funzione `init`, che includa anche il nostro codice precedente alla fine di `app.js`:
+Poiché i dati vengono salvati, dobbiamo anche occuparci di ripristinarli quando l'app viene caricata. Poiché inizieremo ad avere più codice di inizializzazione, potrebbe essere una buona idea creare una nuova funzione `init`, che includa anche il nostro codice precedente in fondo a `app.js`:
```js
function init() {
@@ -202,15 +202,15 @@ function init() {
init();
```
-Qui recuperiamo i dati salvati e, se ci sono, aggiorniamo lo stato di conseguenza. È importante farlo *prima* di aggiornare la route, poiché potrebbe esserci codice che si basa sullo stato durante l'aggiornamento della pagina.
+Qui recuperiamo i dati salvati e, se presenti, aggiorniamo lo stato di conseguenza. È importante farlo *prima* di aggiornare la rotta, poiché potrebbe esserci del codice che si basa sullo stato durante l'aggiornamento della pagina.
-Possiamo anche rendere la pagina *Dashboard* la pagina predefinita della nostra applicazione, poiché ora stiamo persistenziando i dati dell'account. Se non vengono trovati dati, la dashboard si occupa di reindirizzare alla pagina *Login* comunque. In `updateRoute()`, sostituisci il fallback `return navigate('/login');` con `return navigate('/dashboard');`.
+Possiamo anche rendere la pagina *Dashboard* la pagina predefinita della nostra applicazione, poiché ora stiamo persistendo i dati dell'account. Se non vengono trovati dati, la dashboard si occupa di reindirizzare alla pagina di *Login* comunque. In `updateRoute()`, sostituisci il fallback `return navigate('/login');` con `return navigate('/dashboard');`.
-Ora accedi all'app e prova a ricaricare la pagina. Dovresti rimanere sulla dashboard. Con questo aggiornamento abbiamo risolto tutti i nostri problemi iniziali...
+Ora accedi all'app e prova ad aggiornare la pagina. Dovresti rimanere sulla dashboard. Con questo aggiornamento abbiamo risolto tutti i nostri problemi iniziali...
## Aggiornare i dati
-...Ma potremmo anche averne creato uno nuovo. Oops!
+...Ma potremmo anche averne creato uno nuovo. Ops!
Vai alla dashboard utilizzando l'account `test`, quindi esegui questo comando su un terminale per creare una nuova transazione:
@@ -221,7 +221,7 @@ curl --request POST \
http://localhost:5000/api/accounts/test/transactions
```
-Prova a ricaricare la pagina della dashboard nel browser ora. Cosa succede? Vedi la nuova transazione?
+Prova ad aggiornare la pagina della dashboard nel browser ora. Cosa succede? Vedi la nuova transazione?
Lo stato è persistente indefinitamente grazie a `localStorage`, ma ciò significa anche che non viene mai aggiornato fino a quando non esci dall'app e accedi di nuovo!
@@ -247,7 +247,7 @@ async function updateAccountData() {
}
```
-Questo metodo verifica che siamo attualmente loggati e poi ricarica i dati dell'account dal server.
+Questo metodo verifica che siamo attualmente connessi, quindi ricarica i dati dell'account dal server.
Crea un'altra funzione chiamata `refresh`:
@@ -258,7 +258,7 @@ async function refresh() {
}
```
-Questa funzione aggiorna i dati dell'account e poi si occupa di aggiornare l'HTML della pagina dashboard. È ciò che dobbiamo chiamare quando la route della dashboard viene caricata. Aggiorna la definizione della route con:
+Questa aggiorna i dati dell'account, quindi si occupa di aggiornare l'HTML della pagina della dashboard. È ciò che dobbiamo chiamare quando la rotta della dashboard viene caricata. Aggiorna la definizione della rotta con:
```js
const routes = {
@@ -267,7 +267,7 @@ const routes = {
};
```
-Prova a ricaricare la dashboard ora, dovrebbe mostrare i dati dell'account aggiornati.
+Prova ad aggiornare la dashboard ora, dovrebbe mostrare i dati dell'account aggiornati.
---
@@ -277,16 +277,18 @@ Ora che ricarichiamo i dati dell'account ogni volta che la dashboard viene caric
Prova a lavorare insieme per modificare ciò che viene salvato e caricato da `localStorage` per includere solo ciò che è assolutamente necessario per il funzionamento dell'app.
-## Quiz Post-Lezione
-[Quiz post-lezione](https://ff-quizzes.netlify.app/web/quiz/48)
+## Quiz Post-Lettura
-## Compito
+[Quiz post-lettura](https://ff-quizzes.netlify.app/web/quiz/48)
+## Compito
[Implementa la finestra di dialogo "Aggiungi transazione"](assignment.md)
-Ecco un esempio del risultato dopo aver completato il compito:
+Ecco un esempio del risultato dopo aver completato l'assegnazione:
-
+
+
+---
-**Disclaimer (Avvertenza)**:
-Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
+**Disclaimer**:
+Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si consiglia una traduzione professionale eseguita da un traduttore umano. Non siamo responsabili per eventuali fraintendimenti o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
diff --git a/translations/it/8-code-editor/1-using-a-code-editor/README.md b/translations/it/8-code-editor/1-using-a-code-editor/README.md
index bc5bae5c..5fb06392 100644
--- a/translations/it/8-code-editor/1-using-a-code-editor/README.md
+++ b/translations/it/8-code-editor/1-using-a-code-editor/README.md
@@ -1,8 +1,8 @@
+
## Obiettivi di apprendimento
In questa lezione imparerai a:
@@ -33,7 +39,7 @@ Un editor di codice è uno strumento essenziale per scrivere programmi e collabo
Una volta caricato, dovrebbe apparire simile a questa immagine:
-
+
Ci sono tre sezioni principali, partendo da sinistra verso destra:
@@ -47,19 +53,19 @@ Quando inizi a creare o modificare codice, lo farai nell'area più grande a dest
## Aprire un repository GitHub
-La prima cosa che devi fare è aprire un repository GitHub. Ci sono diversi modi per aprire un repository. In questa sezione vedrai due modi diversi per aprire un repository e iniziare a lavorare sulle modifiche.
+La prima cosa di cui avrai bisogno è aprire un repository GitHub. Ci sono diversi modi per aprire un repository. In questa sezione vedrai due modi diversi per aprire un repository e iniziare a lavorare sulle modifiche.
### 1. Con l'editor
Utilizza l'editor stesso per aprire un repository remoto. Se vai su [VSCode.dev](https://vscode.dev), vedrai un pulsante _"Open Remote Repository"_:
-
+
-Puoi anche utilizzare il command palette. Il command palette è una casella di input dove puoi digitare qualsiasi parola che faccia parte di un comando o un'azione per trovare il comando giusto da eseguire. Usa il menu in alto a sinistra, seleziona _View_ e poi scegli _Command Palette_, oppure utilizza la seguente scorciatoia da tastiera: Ctrl-Shift-P (su MacOS sarebbe Command-Shift-P).
+Puoi anche utilizzare il command palette. Il command palette è una casella di input in cui puoi digitare qualsiasi parola che faccia parte di un comando o un'azione per trovare il comando giusto da eseguire. Usa il menu in alto a sinistra, quindi seleziona _View_ e poi scegli _Command Palette_, oppure utilizza la seguente scorciatoia da tastiera: Ctrl-Shift-P (su MacOS sarebbe Command-Shift-P).
-
+
-Una volta aperto il menu, digita _open remote repository_ e seleziona la prima opzione. Verranno mostrati diversi repository a cui partecipi o che hai aperto di recente. Puoi anche utilizzare un URL completo di GitHub per selezionarne uno. Usa il seguente URL e incollalo nella casella:
+Una volta aperto il menu, digita _open remote repository_ e seleziona la prima opzione. Verranno mostrati più repository a cui partecipi o che hai aperto di recente. Puoi anche utilizzare un URL completo di GitHub per selezionarne uno. Usa il seguente URL e incollalo nella casella:
```
https://github.com/microsoft/Web-Dev-For-Beginners
@@ -79,64 +85,64 @@ Una volta aperto il repository nel browser/vscode.dev, il passaggio successivo s
Puoi creare un file all'interno di una cartella esistente o nella directory/cartella principale. Per creare un nuovo file, apri una posizione/cartella in cui desideri salvare il file e seleziona l'icona _'Nuovo file ...'_ sulla barra delle attività _(a sinistra)_, assegnagli un nome e premi invio.
-
+
### 2. Modificare e salvare un file nel repository
Utilizzare vscode.dev è utile ogni volta che desideri apportare aggiornamenti rapidi al tuo progetto senza dover caricare alcun software localmente.
-Per aggiornare il tuo codice, clicca sull'icona 'Esplora risorse', situata anche sulla barra delle attività, per visualizzare i file e le cartelle nel repository.
+Per aggiornare il tuo codice, clicca sull'icona 'Esplora risorse', anch'essa situata sulla barra delle attività, per visualizzare i file e le cartelle nel repository.
Seleziona un file per aprirlo nell'area del codice, apporta le modifiche e salva.
-
+
Una volta terminato l'aggiornamento del progetto, seleziona l'icona _`source control`_ che contiene tutte le nuove modifiche apportate al tuo repository.
-Per visualizzare le modifiche apportate al progetto, seleziona il/i file nella cartella `Changes` nella barra delle attività espansa. Questo aprirà un 'Working Tree' per consentirti di vedere visivamente le modifiche apportate al file. Il rosso indica un'omissione al progetto, mentre il verde indica un'aggiunta.
+Per visualizzare le modifiche apportate al progetto, seleziona il/i file nella cartella `Changes` nella barra delle attività espansa. Questo aprirà un 'Working Tree' per visualizzare visivamente le modifiche apportate al file. Il rosso indica un'omissione al progetto, mentre il verde indica un'aggiunta.
-
+
Se sei soddisfatto delle modifiche apportate, passa con il mouse sulla cartella `Changes` e clicca sul pulsante `+` per mettere in stage le modifiche. Mettere in stage significa semplicemente preparare le modifiche per il commit su GitHub.
Se invece non sei soddisfatto di alcune modifiche e desideri annullarle, passa con il mouse sulla cartella `Changes` e seleziona l'icona `undo`.
-Poi, digita un `messaggio di commit` _(Una descrizione delle modifiche apportate al progetto)_, clicca sull'icona del `check` per effettuare il commit e inviare le modifiche.
+Quindi, digita un `messaggio di commit` _(Una descrizione delle modifiche apportate al progetto)_, clicca sull'icona di spunta per effettuare il commit e inviare le modifiche.
Una volta terminato il lavoro sul progetto, seleziona l'icona del `menu hamburger` in alto a sinistra per tornare al repository su github.com.
-
+
## Utilizzare le estensioni
Installare estensioni su VSCode ti consente di aggiungere nuove funzionalità e opzioni di personalizzazione all'ambiente di sviluppo del tuo editor per migliorare il flusso di lavoro. Queste estensioni ti aiutano anche ad aggiungere supporto per più linguaggi di programmazione e sono spesso estensioni generiche o basate su linguaggi specifici.
-Per sfogliare l'elenco di tutte le estensioni disponibili, clicca sull'icona _`Estensioni`_ sulla barra delle attività e inizia a digitare il nome dell'estensione nel campo di testo etichettato _'Search Extensions in Marketplace'_.
-Vedrai un elenco di estensioni, ognuna contenente **il nome dell'estensione, il nome del publisher, una descrizione di una frase, il numero di download** e **una valutazione con stelle**.
+Per sfogliare l'elenco di tutte le estensioni disponibili, clicca sull'icona _`Estensioni`_ sulla barra delle attività e inizia a digitare il nome dell'estensione nel campo di testo etichettato _'Cerca Estensioni nel Marketplace'_.
+Vedrai un elenco di estensioni, ognuna contenente **il nome dell'estensione, il nome del publisher, una descrizione di una frase, il numero di download** e **una valutazione a stelle**.
-
+
-Puoi anche visualizzare tutte le estensioni precedentemente installate espandendo la cartella _`Installed`_, le estensioni popolari utilizzate dalla maggior parte degli sviluppatori nella cartella _`Popular`_ e le estensioni consigliate per te, basate su utenti nello stesso workspace o sui file aperti di recente, nella cartella _`Recommended`_.
+Puoi anche visualizzare tutte le estensioni precedentemente installate espandendo la cartella _`Installed`_, le estensioni popolari utilizzate dalla maggior parte degli sviluppatori nella cartella _`Popular`_ e le estensioni consigliate per te, basate sugli utenti nello stesso workspace o sui file aperti di recente, nella cartella _`Recommended`_.
-
+
-### 1. Installare estensioni
+### 1. Installare Estensioni
-Per installare un'estensione, digita il nome dell'estensione nel campo di ricerca e cliccaci sopra per visualizzare ulteriori informazioni sull'estensione nell'area del codice una volta che appare nella barra delle attività espansa.
+Per installare un'estensione, digita il nome dell'estensione nel campo di ricerca e clicca su di essa per visualizzare ulteriori informazioni nell'area del codice una volta che appare nella barra delle attività espansa.
-Puoi cliccare sul _pulsante blu di installazione_ nella barra delle attività espansa per installarla oppure utilizzare il pulsante di installazione che appare nell'area del codice una volta selezionata l'estensione per caricare ulteriori informazioni.
+Puoi cliccare sul _pulsante blu Installa_ nella barra delle attività espansa per installarla o utilizzare il pulsante di installazione che appare nell'area del codice una volta selezionata l'estensione per caricare ulteriori informazioni.
-
+
-### 2. Personalizzare le estensioni
+### 2. Personalizzare Estensioni
-Dopo aver installato l'estensione, potresti doverne modificare il comportamento e personalizzarla in base alle tue preferenze. Per farlo, seleziona l'icona delle Estensioni e questa volta la tua estensione apparirà nella cartella _Installed_. Clicca sull'icona _**Gear**_ e naviga su _Extensions Setting_.
+Dopo aver installato l'estensione, potresti doverne modificare il comportamento e personalizzarla in base alle tue preferenze. Per farlo, seleziona l'icona delle Estensioni e questa volta la tua estensione apparirà nella cartella _Installed_, clicca sull'icona _**Gear**_ e naviga su _Extensions Setting_.
-
+
-### 3. Gestire le estensioni
+### 3. Gestire Estensioni
Dopo aver installato e utilizzato un'estensione, vscode.dev offre opzioni per gestirla in base a diverse esigenze. Ad esempio, potresti scegliere di:
-- **Disabilitare:** _(Disabiliti temporaneamente un'estensione quando non ne hai più bisogno ma non vuoi disinstallarla completamente)_
+- **Disabilitare:** _(Puoi disabilitare temporaneamente un'estensione quando non ne hai più bisogno ma non vuoi disinstallarla completamente)_
Seleziona l'estensione installata nella barra delle attività espansa > clicca sull'icona Gear > seleziona 'Disable' o 'Disable (Workspace)' **OPPURE** Apri l'estensione nell'area del codice e clicca sul pulsante blu Disable.
@@ -148,9 +154,11 @@ Dopo aver installato e utilizzato un'estensione, vscode.dev offre opzioni per ge
[Creare un sito web curriculum utilizzando vscode.dev](https://github.com/microsoft/Web-Dev-For-Beginners/blob/main/8-code-editor/1-using-a-code-editor/assignment.md)
-## Revisione e studio autonomo
+## Revisione e Studio Autonomo
Leggi di più su [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) e alcune delle sue altre funzionalità.
-**Disclaimer (Avvertenza)**:
-Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di tenere presente che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si consiglia una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali malintesi o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
+---
+
+**Disclaimer**:
+Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un esperto umano. Non siamo responsabili per eventuali fraintendimenti o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
diff --git a/translations/it/8-code-editor/1-using-a-code-editor/assignment.md b/translations/it/8-code-editor/1-using-a-code-editor/assignment.md
index ccd75daa..a6779a63 100644
--- a/translations/it/8-code-editor/1-using-a-code-editor/assignment.md
+++ b/translations/it/8-code-editor/1-using-a-code-editor/assignment.md
@@ -1,13 +1,13 @@
-# Crea un sito web per il curriculum usando vscode.dev
+# Crea un sito web per il tuo curriculum usando vscode.dev
_Quanto sarebbe fantastico se un recruiter ti chiedesse il curriculum e tu gli inviassi un URL?_ 😎
@@ -36,7 +36,7 @@ Dopo questo compito, imparerai a:
**Passaggio 1:** Crea un nuovo repository GitHub e assegnagli il nome `my-resume`
-**Passaggio 2:** Crea un file `index.html` nel tuo repository. Aggiungeremo almeno un file direttamente su github.com perché non puoi aprire un repository vuoto su vscode.dev.
+**Passaggio 2:** Crea un file `index.html` nel tuo repository. Aggiungeremo almeno un file direttamente su github.com perché non è possibile aprire un repository vuoto su vscode.dev.
Clicca sul link `creating a new file`, digita il nome `index.html` e seleziona il pulsante `Commit new file`.
@@ -130,8 +130,8 @@ https://github.com/your-username/my-resume
Nome dell'organizzazione | Mese di inizio – Mese di fine
- Compito 1 - Scrivi cosa hai fatto!
- Compito 2 - Scrivi cosa hai fatto!
+ Attività 1 - Scrivi cosa hai fatto!
+ Attività 2 - Scrivi cosa hai fatto!
Scrivi i risultati/impatti del tuo contributo
@@ -140,8 +140,8 @@ https://github.com/your-username/my-resume
Nome dell'organizzazione | Mese di inizio – Mese di fine
- Compito 1 - Scrivi cosa hai fatto!
- Compito 2 - Scrivi cosa hai fatto!
+ Attività 1 - Scrivi cosa hai fatto!
+ Attività 2 - Scrivi cosa hai fatto!
Scrivi i risultati/impatti del tuo contributo
@@ -238,7 +238,7 @@ Questo è ciò che vedrai sullo schermo dopo aver installato l'estensione.

-Se sei soddisfatto delle modifiche apportate, passa con il mouse sulla cartella `Changes` e clicca sul pulsante `+` per mettere in stage le modifiche.
+Se sei soddisfatto delle modifiche che hai apportato, passa con il mouse sulla cartella `Changes` e clicca sul pulsante `+` per mettere in stage le modifiche.
Digita un messaggio di commit _(Una descrizione delle modifiche apportate al progetto)_ e conferma le modifiche cliccando sul `check`. Una volta terminato il lavoro sul progetto, seleziona l'icona del menu hamburger in alto a sinistra per tornare al repository su GitHub.
@@ -253,9 +253,11 @@ Apri un repository remoto su cui hai i permessi per apportare modifiche e aggior
[Quiz post-lettura](https://ff-quizzes.netlify.app/web/quiz/4)
---->
-## Revisione & Studio Autonomo
+## Revisione e Studio Autonomo
Leggi di più su [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) e alcune delle sue altre funzionalità.
+---
+
**Disclaimer**:
-Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
+Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si raccomanda una traduzione professionale effettuata da un traduttore umano. Non siamo responsabili per eventuali incomprensioni o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
diff --git a/translations/it/9-chat-project/README.md b/translations/it/9-chat-project/README.md
new file mode 100644
index 00000000..7034f998
--- /dev/null
+++ b/translations/it/9-chat-project/README.md
@@ -0,0 +1,389 @@
+
+# Progetto Chat
+
+Questo progetto di chat mostra come costruire un Assistente Chat utilizzando i Modelli di GitHub.
+
+Ecco come appare il progetto finito:
+
+
+
+
+
+Un po' di contesto: costruire assistenti chat utilizzando l'AI generativa è un ottimo modo per iniziare a imparare sull'AI. In questa lezione imparerai a integrare l'AI generativa in un'app web. Iniziamo!
+
+## Connessione all'AI generativa
+
+Per il backend, utilizziamo i Modelli di GitHub. È un ottimo servizio che ti permette di usare l'AI gratuitamente. Vai al playground e prendi il codice corrispondente al linguaggio backend che hai scelto. Ecco come appare il [GitHub Models Playground](https://github.com/marketplace/models/azure-openai/gpt-4o-mini/playground).
+
+
+
+
+
+Come detto, seleziona la scheda "Code" e il runtime che preferisci.
+
+
+
+
+
+In questo caso selezioniamo Python, il che significa che scegliamo questo codice:
+
+```python
+"""Run this model in Python
+
+> pip install openai
+"""
+import os
+from openai import OpenAI
+
+# To authenticate with the model you will need to generate a personal access token (PAT) in your GitHub settings.
+# Create your PAT token by following instructions here: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
+client = OpenAI(
+ base_url="https://models.github.ai/inference",
+ api_key=os.environ["GITHUB_TOKEN"],
+)
+
+response = client.chat.completions.create(
+ messages=[
+ {
+ "role": "system",
+ "content": "",
+ },
+ {
+ "role": "user",
+ "content": "What is the capital of France?",
+ }
+ ],
+ model="openai/gpt-4o-mini",
+ temperature=1,
+ max_tokens=4096,
+ top_p=1
+)
+
+print(response.choices[0].message.content)
+```
+
+Puliamo un po' questo codice per renderlo riutilizzabile:
+
+```python
+def call_llm(prompt: str, system_message: str):
+ response = client.chat.completions.create(
+ messages=[
+ {
+ "role": "system",
+ "content": system_message,
+ },
+ {
+ "role": "user",
+ "content": prompt,
+ }
+ ],
+ model="openai/gpt-4o-mini",
+ temperature=1,
+ max_tokens=4096,
+ top_p=1
+ )
+
+ return response.choices[0].message.content
+```
+
+Con questa funzione `call_llm` possiamo ora prendere un prompt e un system prompt, e la funzione restituirà il risultato.
+
+### Personalizza l'Assistente AI
+
+Se vuoi personalizzare l'assistente AI, puoi specificare come vuoi che si comporti popolando il system prompt in questo modo:
+
+```python
+call_llm("Tell me about you", "You're Albert Einstein, you only know of things in the time you were alive")
+```
+
+## Esponilo tramite una Web API
+
+Perfetto, abbiamo completato la parte AI. Vediamo ora come possiamo integrarla in una Web API. Per la Web API, scegliamo di usare Flask, ma qualsiasi framework web andrà bene. Ecco il codice:
+
+```python
+# api.py
+from flask import Flask, request, jsonify
+from llm import call_llm
+from flask_cors import CORS
+
+app = Flask(__name__)
+CORS(app) # * example.com
+
+@app.route("/", methods=["GET"])
+def index():
+ return "Welcome to this API. Call POST /hello with 'message': 'my message' as JSON payload"
+
+
+@app.route("/hello", methods=["POST"])
+def hello():
+ # get message from request body { "message": "do this taks for me" }
+ data = request.get_json()
+ message = data.get("message", "")
+
+ response = call_llm(message, "You are a helpful assistant.")
+ return jsonify({
+ "response": response
+ })
+
+if __name__ == "__main__":
+ app.run(host="0.0.0.0", port=5000)
+```
+
+Qui creiamo un'API Flask e definiamo una route di default "/" e "/chat". Quest'ultima è pensata per essere utilizzata dal nostro frontend per inviare domande.
+
+Per integrare *llm.py*, ecco cosa dobbiamo fare:
+
+- Importare la funzione `call_llm`:
+
+ ```python
+ from llm import call_llm
+ from flask import Flask, request
+ ```
+
+- Chiamarla dalla route "/chat":
+
+ ```python
+ @app.route("/hello", methods=["POST"])
+ def hello():
+ # get message from request body { "message": "do this taks for me" }
+ data = request.get_json()
+ message = data.get("message", "")
+
+ response = call_llm(message, "You are a helpful assistant.")
+ return jsonify({
+ "response": response
+ })
+ ```
+
+ Qui analizziamo la richiesta in arrivo per recuperare la proprietà `message` dal corpo JSON. Successivamente chiamiamo l'LLM con questa chiamata:
+
+ ```python
+ response = call_llm(message, "You are a helpful assistant")
+
+ # return the response as JSON
+ return jsonify({
+ "response": response
+ })
+ ```
+
+Perfetto, ora abbiamo fatto ciò che serve.
+
+### Configura Cors
+
+Dobbiamo sottolineare che abbiamo configurato qualcosa come CORS, ovvero il cross-origin resource sharing. Questo significa che, poiché il nostro backend e frontend gireranno su porte diverse, dobbiamo permettere al frontend di chiamare il backend. C'è un pezzo di codice in *api.py* che lo configura:
+
+```python
+from flask_cors import CORS
+
+app = Flask(__name__)
+CORS(app) # * example.com
+```
+
+Al momento è configurato per consentire "*" (tutte le origini), il che è un po' insicuro. Dovremmo restringerlo quando andiamo in produzione.
+
+## Esegui il tuo progetto
+
+Ok, abbiamo *llm.py* e *api.py*. Come possiamo far funzionare tutto con un backend? Ci sono due cose da fare:
+
+- Installare le dipendenze:
+
+ ```sh
+ cd backend
+ python -m venv venv
+ source ./venv/bin/activate
+
+ pip install openai flask flask-cors openai
+ ```
+
+- Avviare l'API:
+
+ ```sh
+ python api.py
+ ```
+
+ Se stai usando Codespaces, devi andare su Ports nella parte inferiore dell'editor, fare clic destro su di esso, selezionare "Port Visibility" e scegliere "Public".
+
+### Lavora su un frontend
+
+Ora che abbiamo un'API funzionante, creiamo un frontend per questa. Un frontend minimo che miglioreremo passo dopo passo. Nella cartella *frontend*, crea quanto segue:
+
+```text
+backend/
+frontend/
+index.html
+app.js
+styles.css
+```
+
+Iniziamo con **index.html**:
+
+```html
+
+
+
+
+
+
+
+
+
+```
+
+Quanto sopra è il minimo indispensabile per supportare una finestra di chat, composta da una textarea dove verranno visualizzati i messaggi, un input per scrivere il messaggio e un pulsante per inviarlo al backend. Passiamo ora al JavaScript in *app.js*.
+
+**app.js**
+
+```js
+// app.js
+
+(function(){
+ // 1. set up elements
+ const messages = document.getElementById("messages");
+ const form = document.getElementById("form");
+ const input = document.getElementById("input");
+
+ const BASE_URL = "change this";
+ const API_ENDPOINT = `${BASE_URL}/hello`;
+
+ // 2. create a function that talks to our backend
+ async function callApi(text) {
+ const response = await fetch(API_ENDPOINT, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ message: text })
+ });
+ let json = await response.json();
+ return json.response;
+ }
+
+ // 3. add response to our textarea
+ function appendMessage(text, role) {
+ const el = document.createElement("div");
+ el.className = `message ${role}`;
+ el.innerHTML = text;
+ messages.appendChild(el);
+ }
+
+ // 4. listen to submit events
+ form.addEventListener("submit", async(e) => {
+ e.preventDefault();
+ // someone clicked the button in the form
+
+ // get input
+ const text = input.value.trim();
+
+ appendMessage(text, "user")
+
+ // reset it
+ input.value = '';
+
+ const reply = await callApi(text);
+
+ // add to messages
+ appendMessage(reply, "assistant");
+
+ })
+})();
+```
+
+Analizziamo il codice per sezioni:
+
+- 1) Qui otteniamo un riferimento a tutti gli elementi che utilizzeremo nel codice.
+- 2) In questa sezione, creiamo una funzione che utilizza il metodo integrato `fetch` per chiamare il nostro backend.
+- 3) `appendMessage` aiuta ad aggiungere le risposte e ciò che l'utente digita.
+- 4) Qui ascoltiamo l'evento di submit, leggiamo il campo di input, posizioniamo il messaggio dell'utente nella textarea, chiamiamo l'API e visualizziamo la risposta nella textarea.
+
+Passiamo ora allo stile. Qui puoi sbizzarrirti per farlo apparire come preferisci, ma ecco alcuni suggerimenti:
+
+**styles.css**
+
+```
+.message {
+ background: #222;
+ box-shadow: 0 0 0 10px orange;
+ padding: 10px:
+ margin: 5px;
+}
+
+.message.user {
+ background: blue;
+}
+
+.message.assistant {
+ background: grey;
+}
+```
+
+Con queste tre classi, puoi stilizzare i messaggi in modo diverso a seconda che provengano dall'assistente o dall'utente. Se vuoi ispirarti, dai un'occhiata alla cartella `solution/frontend/styles.css`.
+
+### Cambia Base Url
+
+C'è una cosa che non abbiamo impostato: `BASE_URL`. Questo non è noto finché il backend non è avviato. Per impostarlo:
+
+- Se esegui l'API localmente, dovrebbe essere qualcosa come `http://localhost:5000`.
+- Se esegui in Codespaces, dovrebbe essere qualcosa come "[name]app.github.dev".
+
+## Compito
+
+Crea la tua cartella *project* con il contenuto seguente:
+
+```text
+project/
+ frontend/
+ index.html
+ app.js
+ styles.css
+ backend/
+ api.py
+ llm.py
+```
+
+Copia il contenuto delle istruzioni sopra, ma sentiti libero di personalizzarlo come preferisci.
+
+## Soluzione
+
+[Soluzione](./solution/README.md)
+
+## Bonus
+
+Prova a cambiare la personalità dell'assistente AI. Quando chiami `call_llm` in *api.py*, puoi cambiare il secondo argomento come preferisci, ad esempio:
+
+```python
+call_llm(message, "You are Captain Picard")
+```
+
+Cambia anche il CSS e il testo come preferisci, quindi apporta modifiche a *index.html* e *styles.css*.
+
+## Riepilogo
+
+Ottimo, hai imparato da zero come creare un assistente personale utilizzando l'AI. Lo abbiamo fatto utilizzando i Modelli di GitHub, un backend in Python e un frontend in HTML, CSS e JavaScript.
+
+## Configurazione con Codespaces
+
+- Vai su: [Web Dev For Beginners repo](https://github.com/microsoft/Web-Dev-For-Beginners)
+- Crea da un template (assicurati di essere loggato su GitHub) nell'angolo in alto a destra:
+
+ 
+
+- Una volta nel tuo repository, crea un Codespace:
+
+ 
+
+ Questo avvierà un ambiente con cui puoi ora lavorare.
+
+---
+
+**Disclaimer**:
+Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche potrebbero contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si consiglia una traduzione professionale eseguita da un traduttore umano. Non siamo responsabili per eventuali fraintendimenti o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
diff --git a/translations/it/9-chat-project/solution/README.md b/translations/it/9-chat-project/solution/README.md
new file mode 100644
index 00000000..edca7d52
--- /dev/null
+++ b/translations/it/9-chat-project/solution/README.md
@@ -0,0 +1,55 @@
+
+# Esegui il codice
+
+## Configurazione
+
+Crea un ambiente virtuale
+
+```sh
+cd backend
+python -m venv venv
+source ./venv/bin/activate
+```
+
+## Installa le dipendenze
+
+```sh
+pip install openai flask flask-cors
+```
+
+## Avvia l'API
+
+```sh
+python api.py
+```
+
+## Avvia il frontend
+
+Assicurati di trovarti nella cartella del frontend
+
+Trova *app.js*, cambia `BASE_URL` con l'URL del tuo backend
+
+Eseguilo
+
+```
+npx http-server -p 8000
+```
+
+Prova a digitare un messaggio nella chat, dovresti vedere una risposta (a condizione che tu stia eseguendo questo in un Codespace o abbia configurato un token di accesso).
+
+## Configura il token di accesso (se non stai eseguendo questo in un Codespace)
+
+Consulta [Set up PAT](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)
+
+---
+
+**Disclaimer**:
+Questo documento è stato tradotto utilizzando il servizio di traduzione automatica [Co-op Translator](https://github.com/Azure/co-op-translator). Sebbene ci impegniamo per garantire l'accuratezza, si prega di notare che le traduzioni automatiche possono contenere errori o imprecisioni. Il documento originale nella sua lingua nativa dovrebbe essere considerato la fonte autorevole. Per informazioni critiche, si consiglia una traduzione professionale eseguita da un traduttore umano. Non siamo responsabili per eventuali fraintendimenti o interpretazioni errate derivanti dall'uso di questa traduzione.
\ No newline at end of file
diff --git a/translations/it/README.md b/translations/it/README.md
index 4a0f1951..954fce67 100644
--- a/translations/it/README.md
+++ b/translations/it/README.md
@@ -1,8 +1,8 @@
# 程式語言與工具介紹
-這堂課涵蓋了程式語言的基礎知識。這裡討論的主題適用於大多數現代程式語言。在「工具介紹」部分,你將學習到一些對開發者非常有幫助的軟體。
+本課程涵蓋程式語言的基礎知識。這裡討論的主題適用於當今大多數現代程式語言。在「工具介紹」部分,您將學習一些對開發者有幫助的實用軟體。
-
-> Sketchnote 作者:[Tomomi Imura](https://twitter.com/girlie_mac)
+
+> Sketchnote by [Tomomi Imura](https://twitter.com/girlie_mac)
-## 課前測驗
+## 課前測驗
[課前測驗](https://forms.office.com/r/dru4TE0U9n?origin=lprLink)
-## 課程介紹
+## 簡介
-在這堂課中,我們將討論:
+在本課程中,我們將討論:
- 什麼是程式設計?
- 程式語言的種類
- 程式的基本元素
-- 專業開發者常用的軟體與工具
+- 專業開發者常用的實用軟體與工具
-> 你可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/introduction-programming/?WT.mc_id=academic-77807-sagibbon) 上學習這堂課!
+> 您可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/introduction-programming/?WT.mc_id=academic-77807-sagibbon) 上學習本課程!
## 什麼是程式設計?
-程式設計(也稱為編碼)是為電腦或行動裝置等設備撰寫指令的過程。我們使用程式語言來撰寫這些指令,設備會解讀這些指令。這些指令集可能有不同的名稱,例如 *程式*、*電腦程式*、*應用程式(app)* 或 *執行檔* 等。
+程式設計(也稱為編碼)是為電腦或行動裝置等設備撰寫指令的過程。我們使用程式語言來撰寫這些指令,然後由設備解讀這些指令。這些指令集可能有不同的名稱,例如 *程式*、*電腦程式*、*應用程式 (app)* 或 *執行檔* 等。
-一個 *程式* 可以是任何用程式碼撰寫的東西;網站、遊戲和手機應用程式都是程式。雖然有可能在不撰寫程式碼的情況下創建程式,但其底層邏輯仍需由設備解讀,而這些邏輯很可能是用程式碼撰寫的。一個正在 *執行* 或 *運行* 程式碼的程式,就是在執行指令。你正在閱讀這堂課的設備正運行著一個程式,將內容顯示在你的螢幕上。
+*程式* 可以是任何用程式碼撰寫的東西,例如網站、遊戲和手機應用程式。雖然可以在不撰寫程式碼的情況下創建程式,但其底層邏輯仍需由設備解讀,而這些邏輯很可能是用程式碼撰寫的。一個正在 *執行* 或 *運行* 程式碼的程式正在執行指令。您正在閱讀本課程的設備正運行一個程式,將內容顯示在您的螢幕上。
-✅ 做點研究:誰被認為是世界上第一位電腦程式設計師?
+✅ 做一些研究:誰被認為是世界上第一位電腦程式設計師?
## 程式語言
-程式語言使開發者能夠為設備撰寫指令。設備只能理解二進位(1 和 0),但對於 *大多數* 開發者來說,這並不是一種高效的溝通方式。程式語言是人類與電腦之間的溝通工具。
+程式語言使開發者能夠為設備撰寫指令。設備只能理解二進位(1 和 0),而對於 *大多數* 開發者來說,這並不是一種高效的溝通方式。程式語言是人類與電腦之間的溝通工具。
-程式語言有不同的格式,可能用於不同的目的。例如,JavaScript 主要用於網頁應用程式,而 Bash 則主要用於操作系統。
+程式語言有不同的格式,可能用於不同的目的。例如,JavaScript 主要用於網頁應用程式,而 Bash 主要用於作業系統。
-*低階語言* 通常比 *高階語言* 需要更少的步驟來讓設備解讀指令。然而,高階語言因其可讀性和支援性而受到歡迎。JavaScript 就被認為是一種高階語言。
+*低階語言* 通常比 *高階語言* 需要更少的步驟來讓設備解讀指令。然而,高階語言因其可讀性和支援性而受到歡迎。JavaScript 被認為是一種高階語言。
以下程式碼展示了使用高階語言(JavaScript)與低階語言(ARM 組合語言)的差異。
@@ -83,132 +83,134 @@ back add r0,r1
end
```
-相信或不相信,*它們做的是同一件事*:列印出前 10 個斐波那契數列。
+相信或不相信,*它們都在做同一件事*:列印前 10 個 Fibonacci 數列。
-✅ 斐波那契數列的[定義](https://en.wikipedia.org/wiki/Fibonacci_number)是:每個數字是前兩個數字的總和,從 0 和 1 開始。前 10 個斐波那契數列的數字是 0, 1, 1, 2, 3, 5, 8, 13, 21 和 34。
+✅ Fibonacci 數列是 [定義](https://en.wikipedia.org/wiki/Fibonacci_number) 為一組數字,其中每個數字是前兩個數字的總和,從 0 和 1 開始。前 10 個 Fibonacci 數列為 0, 1, 1, 2, 3, 5, 8, 13, 21 和 34。
## 程式的基本元素
-程式中的單一指令稱為 *語句*,通常會有一個字符或行間距來標記指令的結束,稱為 *終止符*。不同語言的終止方式各不相同。
+程式中的單一指令稱為 *語句*,通常會有一個字符或行間距來標記指令的結束,稱為 *終止符*。程式如何終止因語言而異。
-程式中的語句可能依賴於使用者或其他地方提供的數據來執行指令。數據會影響程式的行為,因此程式語言提供了一種方法來暫時儲存數據,以便稍後使用,這些稱為 *變數*。變數是指令,指示設備將數據儲存在記憶體中。程式中的變數類似於代數中的變數,它們有唯一的名稱,其值可能隨時間改變。
+程式中的語句可能依賴用戶或其他地方提供的數據來執行指令。數據可以改變程式的行為,因此程式語言提供了一種臨時存儲數據的方法,以便稍後使用,這些稱為 *變數*。變數是指令,指示設備將數據存儲在其記憶體中。程式中的變數類似於代數中的變數,它們有一個唯一的名稱,其值可能會隨時間改變。
-有些語句可能不會被設備執行。這通常是開發者有意設計的,或者是因為意外錯誤而發生的。這種對應用程式的控制使其更加穩健和可維護。通常,這些控制的變化發生在某些條件滿足時。`if..else` 語句是現代程式設計中常用來控制程式運行的一種語句。
+有些語句可能不會被設備執行。這通常是開發者設計的結果,或者是意外錯誤導致的。這種對應用程式的控制使其更加穩健和可維護。通常,這些控制的變化發生在某些條件滿足時。現代程式設計中常用的一種語句是 `if..else` 語句。
-✅ 你將在後續課程中學到更多關於這種類型語句的知識。
+✅ 您將在後續課程中學習更多關於這種類型語句的內容。
## 工具介紹
[](https://youtube.com/watch?v=69WJeXGBdxg "工具介紹")
-> 🎥 點擊上方圖片觀看關於工具的影片
+> 🎥 點擊上方圖片觀看有關工具的影片
-在這部分,你將學習一些在開始專業開發旅程時可能非常有用的軟體。
+在本節中,您將學習一些在開始專業開發旅程時可能非常有用的軟體。
-**開發環境** 是開發者在撰寫軟體時經常使用的一組獨特工具和功能。其中一些工具是根據開發者的特定需求進行定制的,並可能隨著開發者的工作重點、個人項目或使用的程式語言而改變。開發環境就像開發者的指紋一樣獨特。
+**開發環境** 是開發者在撰寫軟體時經常使用的一組獨特工具和功能。其中一些工具已根據開發者的特定需求進行了自訂,並可能隨著開發者的工作重點、個人項目或使用不同程式語言而改變。開發環境如同開發者本身一樣獨特。
### 編輯器
-編輯器是軟體開發中最重要的工具之一。編輯器是你撰寫程式碼的地方,有時也是你運行程式碼的地方。
+編輯器是軟體開發中最重要的工具之一。編輯器是您撰寫程式碼的地方,有時也是您運行程式碼的地方。
-開發者依賴編輯器的原因包括:
+開發者依賴編輯器的幾個額外原因:
-- *除錯* 幫助逐行檢查程式碼,找出錯誤。有些編輯器具有除錯功能,可以針對特定程式語言進行定制和擴展。
-- *語法高亮* 為程式碼添加顏色和文字格式,使其更易於閱讀。大多數編輯器允許自定義語法高亮。
-- *擴展與整合* 是專為開發者設計的工具,這些工具並未內建於基礎編輯器中。例如,許多開發者會為程式碼添加文件說明,解釋其運作方式。他們可能會安裝拼寫檢查擴展來幫助發現文件中的拼寫錯誤。大多數擴展是針對特定編輯器設計的,而大多數編輯器都提供搜尋可用擴展的功能。
-- *自定義* 使開發者能夠創建符合自己需求的獨特開發環境。大多數編輯器都非常可定制,甚至允許開發者創建自定義擴展。
+- *除錯* 幫助逐行檢查程式碼,找出錯誤和問題。有些編輯器具有除錯功能;它們可以針對特定程式語言進行自訂和擴展。
+- *語法高亮* 為程式碼添加顏色和文字格式,使其更易於閱讀。大多數編輯器允許自訂語法高亮。
+- *擴展與整合* 是由開發者為開發者設計的專用工具。這些工具並未內建於基礎編輯器中。例如,許多開發者會為程式碼添加文件說明,解釋其工作原理。他們可能會安裝拼寫檢查擴展來幫助發現文件中的拼寫錯誤。大多數擴展是針對特定編輯器設計的,而大多數編輯器都提供搜尋可用擴展的功能。
+- *自訂* 使開發者能夠創建符合其需求的獨特開發環境。大多數編輯器都非常可自訂,並可能允許開發者創建自訂擴展。
#### 常見編輯器與網頁開發擴展
-- [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon)
- - [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
- - [Live Share](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare)
- - [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
-- [Atom](https://atom.io/)
- - [spell-check](https://atom.io/packages/spell-check)
- - [teletype](https://atom.io/packages/teletype)
- - [atom-beautify](https://atom.io/packages/atom-beautify)
-- [Sublimetext](https://www.sublimetext.com/)
- - [emmet](https://emmet.io/)
- - [SublimeLinter](http://www.sublimelinter.com/en/stable/)
+- [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon)
+ - [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
+ - [Live Share](https://marketplace.visualstudio.com/items?itemName=MS-vsliveshare.vsliveshare)
+ - [Prettier - Code formatter](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)
+- [Atom](https://atom.io/)
+ - [spell-check](https://atom.io/packages/spell-check)
+ - [teletype](https://atom.io/packages/teletype)
+ - [atom-beautify](https://atom.io/packages/atom-beautify)
+- [Sublimetext](https://www.sublimetext.com/)
+ - [emmet](https://emmet.io/)
+ - [SublimeLinter](http://www.sublimelinter.com/en/stable/)
### 瀏覽器
-另一個重要的工具是瀏覽器。網頁開發者依賴瀏覽器來檢視程式碼在網頁上的運行效果。瀏覽器還用於顯示在編輯器中撰寫的網頁的視覺元素,例如 HTML。
+另一個重要的工具是瀏覽器。網頁開發者依賴瀏覽器來查看其程式碼在網頁上的運行效果。瀏覽器還用於顯示在編輯器中撰寫的網頁元素,例如 HTML。
-許多瀏覽器內建 *開發者工具*(DevTools),這些工具包含一組有用的功能和資訊,幫助開發者收集和捕捉應用程式的重要資訊。例如:如果網頁出現錯誤,知道錯誤發生的時間可能會很有幫助。瀏覽器中的開發者工具可以配置以捕捉這些資訊。
+許多瀏覽器內建 *開發者工具*(DevTools),其中包含一組有用的功能和資訊,幫助開發者收集和捕捉有關其應用程式的重要資訊。例如:如果網頁出現錯誤,了解錯誤發生的時間有時會很有幫助。瀏覽器中的開發者工具可以配置以捕捉這些資訊。
#### 常見瀏覽器與開發者工具
-- [Edge](https://docs.microsoft.com/microsoft-edge/devtools-guide-chromium/?WT.mc_id=academic-77807-sagibbon)
-- [Chrome](https://developers.google.com/web/tools/chrome-devtools/)
-- [Firefox](https://developer.mozilla.org/docs/Tools)
+- [Edge](https://docs.microsoft.com/microsoft-edge/devtools-guide-chromium/?WT.mc_id=academic-77807-sagibbon)
+- [Chrome](https://developers.google.com/web/tools/chrome-devtools/)
+- [Firefox](https://developer.mozilla.org/docs/Tools)
### 命令列工具
-有些開發者偏好使用較少圖形化的界面來完成日常任務,並依賴命令列來實現這一點。撰寫程式碼需要大量的打字,有些開發者不希望打斷鍵盤上的工作流。他們會使用鍵盤快捷鍵在桌面窗口之間切換、處理不同的檔案並使用工具。雖然大多數任務可以用滑鼠完成,但使用命令列的一個好處是可以在不切換滑鼠和鍵盤的情況下完成許多操作。命令列的另一個好處是它們可以配置,並且可以儲存自定義配置,稍後更改,並導入到其他開發機器上。由於開發環境對每個開發者來說都是獨特的,有些人會完全避免使用命令列,有些人則完全依賴它,還有些人偏好兩者混合使用。
+有些開發者偏好使用較少圖形化的界面來完成日常任務,並依賴命令列來實現這一點。撰寫程式碼需要大量的打字工作,有些開發者偏好不打斷鍵盤上的工作流程。他們會使用鍵盤快捷鍵在桌面窗口之間切換、處理不同文件並使用工具。大多數任務可以用滑鼠完成,但使用命令列的一個好處是可以在不切換滑鼠和鍵盤的情況下完成許多操作。命令列的另一個好處是它們可以配置,您可以保存自訂配置,稍後更改,並將其匯入到其他開發機器中。由於開發環境對每個開發者來說都是獨特的,有些人會完全避免使用命令列,有些人會完全依賴它,而有些人則偏好兩者結合。
### 常見命令列選項
-命令列的選項會根據你使用的操作系統而有所不同。
+命令列選項會根據您使用的作業系統而有所不同。
-*💻 = 預裝於操作系統。*
+*💻 = 作業系統預裝。*
#### Windows
-- [Powershell](https://docs.microsoft.com/powershell/scripting/overview?view=powershell-7/?WT.mc_id=academic-77807-sagibbon) 💻
-- [Command Line](https://docs.microsoft.com/windows-server/administration/windows-commands/windows-commands/?WT.mc_id=academic-77807-sagibbon)(也稱為 CMD)💻
-- [Windows Terminal](https://docs.microsoft.com/windows/terminal/?WT.mc_id=academic-77807-sagibbon)
-- [mintty](https://mintty.github.io/)
+- [Powershell](https://docs.microsoft.com/powershell/scripting/overview?view=powershell-7/?WT.mc_id=academic-77807-sagibbon) 💻
+- [Command Line](https://docs.microsoft.com/windows-server/administration/windows-commands/windows-commands/?WT.mc_id=academic-77807-sagibbon)(也稱為 CMD)💻
+- [Windows Terminal](https://docs.microsoft.com/windows/terminal/?WT.mc_id=academic-77807-sagibbon)
+- [mintty](https://mintty.github.io/)
#### MacOS
-- [Terminal](https://support.apple.com/guide/terminal/open-or-quit-terminal-apd5265185d-f365-44cb-8b09-71a064a42125/mac) 💻
-- [iTerm](https://iterm2.com/)
-- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
+- [Terminal](https://support.apple.com/guide/terminal/open-or-quit-terminal-apd5265185d-f365-44cb-8b09-71a064a42125/mac) 💻
+- [iTerm](https://iterm2.com/)
+- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
#### Linux
-- [Bash](https://www.gnu.org/software/bash/manual/html_node/index.html) 💻
-- [KDE Konsole](https://docs.kde.org/trunk5/en/konsole/konsole/index.html)
-- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
+- [Bash](https://www.gnu.org/software/bash/manual/html_node/index.html) 💻
+- [KDE Konsole](https://docs.kde.org/trunk5/en/konsole/konsole/index.html)
+- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
#### 常見命令列工具
-- [Git](https://git-scm.com/)(💻 大多數操作系統預裝)
-- [NPM](https://www.npmjs.com/)
-- [Yarn](https://classic.yarnpkg.com/en/docs/cli/)
+- [Git](https://git-scm.com/) (💻 大多數作業系統預裝)
+- [NPM](https://www.npmjs.com/)
+- [Yarn](https://classic.yarnpkg.com/en/docs/cli/)
### 文件
-當開發者想學習新事物時,他們很可能會查閱文件以了解如何使用它。開發者經常依賴文件來指導他們正確使用工具和語言,並深入了解其運作方式。
+當開發者想學習新事物時,他們很可能會查閱文件以了解如何使用它。開發者經常依賴文件來指導他們正確使用工具和語言,並深入了解其工作原理。
-#### 常見的網頁開發文件
+#### 常見網頁開發文件
-- [Mozilla Developer Network (MDN)](https://developer.mozilla.org/docs/Web),由 [Firefox](https://www.mozilla.org/firefox/) 瀏覽器的發行商 Mozilla 提供
-- [Frontend Masters](https://frontendmasters.com/learn/)
-- [Web.dev](https://web.dev),由 [Chrome](https://www.google.com/chrome/) 的發行商 Google 提供
-- [Microsoft 的開發者文件](https://docs.microsoft.com/microsoft-edge/#microsoft-edge-for-developers),適用於 [Microsoft Edge](https://www.microsoft.com/edge)
-- [W3 Schools](https://www.w3schools.com/where_to_start.asp)
+- [Mozilla Developer Network (MDN)](https://developer.mozilla.org/docs/Web),由 [Firefox](https://www.mozilla.org/firefox/) 瀏覽器的發行商 Mozilla 提供
+- [Frontend Masters](https://frontendmasters.com/learn/)
+- [Web.dev](https://web.dev),由 [Chrome](https://www.google.com/chrome/) 的發行商 Google 提供
+- [Microsoft 的開發者文件](https://docs.microsoft.com/microsoft-edge/#microsoft-edge-for-developers),適用於 [Microsoft Edge](https://www.microsoft.com/edge)
+- [W3 Schools](https://www.w3schools.com/where_to_start.asp)
-✅ 做點研究:現在你已經了解了網頁開發者的基本環境,試著比較一下它與網頁設計師的環境有何不同。
+✅ 做一些研究:現在您已了解網頁開發者的環境,試著將其與網頁設計師的環境進行比較和對比。
---
## 🚀 挑戰
-比較一些程式語言。JavaScript 與 Java 有哪些獨特的特性?COBOL 與 Go 又有什麼不同?
+比較一些程式語言。JavaScript 與 Java 有哪些獨特特性?COBOL 與 Go 又如何?
-## 課後測驗
-[課後測驗](https://ff-quizzes.netlify.app/web/quiz/2)
+## 課後測驗
+[課後測驗](https://ff-quizzes.netlify.app/web/)
## 複習與自學
-研究一下程式設計師可用的不同語言。試著用一種語言寫一行程式碼,然後用另外兩種語言重寫它。你學到了什麼?
+學習程式設計師可用的不同語言。嘗試用一種語言寫一行程式碼,然後用另外兩種語言重寫它。您學到了什麼?
## 作業
[閱讀文件](assignment.md)
+---
+
**免責聲明**:
-本文檔使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/1-getting-started-lessons/2-github-basics/README.md b/translations/mo/1-getting-started-lessons/2-github-basics/README.md
index 47dfb239..bb5af868 100644
--- a/translations/mo/1-getting-started-lessons/2-github-basics/README.md
+++ b/translations/mo/1-getting-started-lessons/2-github-basics/README.md
@@ -1,21 +1,21 @@
# GitHub 簡介
-這節課涵蓋了 GitHub 的基礎知識,這是一個用來託管和管理程式碼變更的平台。
+這節課將介紹 GitHub 的基礎知識,這是一個用於託管和管理程式碼變更的平台。

> [Tomomi Imura](https://twitter.com/girlie_mac) 的手繪筆記
## 課前測驗
-[課前測驗](https://ff-quizzes.netlify.app/web/quiz/3)
+[課前測驗](https://ff-quizzes.netlify.app)
## 簡介
@@ -30,7 +30,7 @@ CO_OP_TRANSLATOR_METADATA:
在開始之前,你需要檢查是否已安裝 Git。在終端機中輸入:
`git --version`
-如果尚未安裝 Git,請[下載 Git](https://git-scm.com/downloads)。接著,在終端機中設定你的本地 Git 配置:
+如果未安裝 Git,請[下載 Git](https://git-scm.com/downloads)。接著,在終端機中設定你的本地 Git 配置:
* `git config --global user.name "your-name"`
* `git config --global user.email "your-email"`
@@ -39,23 +39,23 @@ CO_OP_TRANSLATOR_METADATA:
你還需要一個 GitHub 帳戶、一個程式碼編輯器(例如 Visual Studio Code),並打開你的終端機(或命令提示符)。
-前往 [github.com](https://github.com/) 註冊帳戶(如果尚未註冊),或者登入並填寫你的個人資料。
+前往 [github.com](https://github.com/) 註冊帳戶(如果尚未註冊),或者登入並完善你的個人資料。
-✅ GitHub 並不是世界上唯一的程式碼儲存庫,但它是最知名的。
+✅ GitHub 並不是世界上唯一的程式碼儲存庫;還有其他選擇,但 GitHub 是最知名的。
### 準備工作
-你需要在本地電腦(筆記型電腦或 PC)上準備一個包含程式碼專案的資料夾,還需要在 GitHub 上建立一個公開的儲存庫,這將作為如何為他人專案做出貢獻的示例。
+你需要在本地電腦(筆記本或 PC)上準備一個包含程式碼專案的資料夾,並在 GitHub 上建立一個公共儲存庫,這將作為如何為他人專案做出貢獻的示例。
---
## 程式碼管理
-假設你在本地有一個包含程式碼專案的資料夾,並希望開始使用 Git(版本控制系統)來追蹤你的進度。有些人將使用 Git 比喻為寫一封給未來自己的情書。當你在幾天、幾週甚至幾個月後閱讀你的提交訊息時,你將能回憶起為什麼做出某個決定,或者「回滾」某個變更——前提是你寫了好的「提交訊息」。
+假設你在本地有一個包含程式碼專案的資料夾,並希望開始使用 Git(版本控制系統)來追蹤你的進度。有些人將使用 Git 比喻為寫給未來自己的情書。當你在幾天、幾週甚至幾個月後閱讀你的提交訊息時,你將能回憶起為什麼做出某個決定,或者「回滾」某個變更——前提是你寫了好的「提交訊息」。
### 任務:建立儲存庫並提交程式碼
-> 查看影片
+> 查看影片
>
> [](https://www.youtube.com/watch?v=9R31OUPpxU4)
@@ -70,7 +70,7 @@ CO_OP_TRANSLATOR_METADATA:
cd [name of your folder]
```
-1. **初始化 Git 儲存庫**。在你的專案中輸入:
+1. **初始化一個 Git 儲存庫**。在你的專案中輸入:
```bash
git init
@@ -93,24 +93,24 @@ CO_OP_TRANSLATOR_METADATA:
modified: file2.txt
```
- 通常,`git status` 命令會告訴你哪些檔案已準備好被「儲存」到儲存庫中,或者有哪些檔案有變更需要持久化。
+ 通常,`git status` 命令會告訴你哪些檔案已準備好被 _儲存_ 到儲存庫中,或者有哪些檔案有變更需要持久化。
-1. **新增所有檔案進行追蹤**
- 這也稱為將檔案加入暫存區。
+1. **新增所有檔案以進行追蹤**
+ 這也稱為暫存檔案/將檔案新增到暫存區。
```bash
git add .
```
- `git add` 加上 `.` 參數表示將所有檔案和變更加入追蹤。
+ `git add` 加上 `.` 參數表示將所有檔案和變更新增到追蹤中。
-1. **選擇性新增檔案進行追蹤**
+1. **選擇性新增檔案以進行追蹤**
```bash
git add [file or folder name]
```
- 當你不想一次提交所有檔案時,這可以幫助你只新增選定的檔案到暫存區。
+ 當你不想一次提交所有檔案時,這可以幫助我們僅新增選定的檔案到暫存區。
1. **取消暫存所有檔案**
@@ -118,7 +118,7 @@ CO_OP_TRANSLATOR_METADATA:
git reset
```
- 此命令可幫助你一次取消暫存所有檔案。
+ 此命令可幫助我們一次取消暫存所有檔案。
1. **取消暫存特定檔案**
@@ -126,27 +126,27 @@ CO_OP_TRANSLATOR_METADATA:
git reset [file or folder name]
```
- 此命令可幫助你一次取消暫存特定檔案,這些檔案你不想包含在下一次提交中。
+ 此命令可幫助我們一次取消暫存特定檔案,這些檔案我們不想包含在下一次提交中。
-1. **持久化你的工作**。此時,你已將檔案新增到所謂的「暫存區」。這是一個 Git 追蹤檔案的地方。要使變更永久化,你需要「提交」檔案。為此,你可以使用 `git commit` 命令建立一個「提交」。提交代表儲存庫歷史中的一個儲存點。輸入以下命令來建立提交:
+1. **持久化你的工作**。此時,你已將檔案新增到所謂的 _暫存區_,這是一個 Git 正在追蹤你的檔案的地方。要使變更永久化,你需要 _提交_ 這些檔案。為此,你需要使用 `git commit` 命令建立一個 _提交_。提交代表儲存庫歷史中的一個儲存點。輸入以下命令來建立提交:
```bash
git commit -m "first commit"
```
- 這會提交所有檔案,並新增訊息「first commit」。未來的提交訊息應該更具描述性,以傳達你所做的變更類型。
+ 這會提交所有檔案,並新增訊息「first commit」。對於未來的提交訊息,你需要更具描述性,以傳達你所做的變更類型。
-1. **將本地 Git 儲存庫連接到 GitHub**。本地的 Git 儲存庫很好,但某些時候你可能希望將檔案備份到某個地方,並邀請其他人與你一起工作。一個很棒的地方就是 GitHub。記得我們已經在 GitHub 上建立了一個儲存庫,所以現在唯一需要做的就是將本地 Git 儲存庫與 GitHub 連接。`git remote add` 命令可以做到這一點。輸入以下命令:
+1. **將本地 Git 儲存庫與 GitHub 連接**。本地的 Git 儲存庫很好,但某些時候你會希望將檔案備份到某個地方,並邀請其他人與你一起合作。一個很棒的地方就是 GitHub。記住,我們已經在 GitHub 上建立了一個儲存庫,所以我們只需要將本地 Git 儲存庫與 GitHub 連接起來。`git remote add` 命令可以做到這一點。輸入以下命令:
- > 注意,在輸入命令之前,前往你的 GitHub 儲存庫頁面找到儲存庫 URL。你將在以下命令中使用它。將 ```https://github.com/username/repository_name.git``` 替換為你的 GitHub URL。
+ > 注意,在輸入命令之前,請前往你的 GitHub 儲存庫頁面找到儲存庫的 URL。你將在以下命令中使用它。將 ```https://github.com/username/repository_name.git``` 替換為你的 GitHub URL。
```bash
git remote add origin https://github.com/username/repository_name.git
```
- 這會建立一個名為「origin」的「遠端」,指向你之前建立的 GitHub 儲存庫。
+ 這會建立一個名為 "origin" 的 _遠端_,指向你之前建立的 GitHub 儲存庫。
-1. **將本地檔案發送到 GitHub**。到目前為止,你已經在本地儲存庫和 GitHub 儲存庫之間建立了「連接」。現在使用以下命令 `git push` 將這些檔案發送到 GitHub,如下所示:
+1. **將本地檔案發送到 GitHub**。到目前為止,你已經在本地儲存庫和 GitHub 儲存庫之間建立了一個 _連接_。現在使用以下命令 `git push` 將這些檔案發送到 GitHub,如下所示:
> 注意,你的分支名稱可能與 ```main``` 不同。
@@ -154,7 +154,7 @@ CO_OP_TRANSLATOR_METADATA:
git push -u origin main
```
- 這會將你的「main」分支中的提交發送到 GitHub。
+ 這會將你的 "main" 分支中的提交發送到 GitHub。
2. **新增更多變更**。如果你想繼續進行變更並將它們推送到 GitHub,你只需要使用以下三個命令:
@@ -164,57 +164,57 @@ CO_OP_TRANSLATOR_METADATA:
git push
```
- > 提示,你可能還想採用 `.gitignore` 檔案,以防止你不想追蹤的檔案出現在 GitHub 上——例如,你存放在同一資料夾中的筆記檔案,但它不適合放在公開儲存庫中。你可以在[.gitignore 模板](https://github.com/github/gitignore)中找到 `.gitignore` 檔案的模板。
+ > 提示,你可能還想採用 `.gitignore` 檔案,以防止你不想追蹤的檔案顯示在 GitHub 上——例如,你存放在同一資料夾中的筆記檔案,但它不適合放在公共儲存庫中。你可以在 [.gitignore templates](https://github.com/github/gitignore) 找到 `.gitignore` 檔案的範本。
#### 提交訊息
一個好的 Git 提交主題行應該能完成以下句子:
如果應用,這次提交將 <你的主題行在此>
-主題行應使用祈使句,現在時態:「變更」而不是「已變更」或「正在變更」。
-在主題行中,正文(可選)也應使用祈使句,現在時態。正文應包括變更的動機,並與之前的行為形成對比。你是在解釋「為什麼」,而不是「如何」。
+主題行應使用祈使句,現在時態:「更改」而不是「已更改」或「正在更改」。
+與主題行一樣,在正文(可選)中也使用祈使句,現在時態。正文應包括變更的動機,並將其與之前的行為進行對比。你是在解釋「為什麼」,而不是「如何」。
-✅ 花幾分鐘瀏覽 GitHub。你能找到一個非常棒的提交訊息嗎?你能找到一個非常簡略的嗎?你認為在提交訊息中傳達哪些資訊最重要且最有用?
+✅ 花幾分鐘瀏覽 GitHub。你能找到一個非常棒的提交訊息嗎?你能找到一個非常簡略的嗎?你認為提交訊息中最重要和最有用的信息是什麼?
### 任務:協作
-將內容放到 GitHub 上的主要原因是讓其他開發者能夠協作。
+將內容放到 GitHub 上的主要原因是為了能與其他開發者協作。
## 與他人合作專案
-> 查看影片
+> 查看影片
>
> [](https://www.youtube.com/watch?v=bFCM-PC3cu8)
在你的儲存庫中,導航到 `Insights > Community`,查看你的專案與推薦的社群標準相比如何。
-以下是一些可以改善 GitHub 儲存庫的事項:
-- **描述**。你是否為專案新增了描述?
+以下是一些可以改善你的 GitHub 儲存庫的事項:
+- **描述**。你是否為你的專案新增了描述?
- **README**。你是否新增了 README?GitHub 提供了撰寫 [README](https://docs.github.com/articles/about-readmes/?WT.mc_id=academic-77807-sagibbon) 的指導。
-- **貢獻指南**。你的專案是否有[貢獻指南](https://docs.github.com/articles/setting-guidelines-for-repository-contributors/?WT.mc_id=academic-77807-sagibbon)?
-- **行為準則**。是否有[行為準則](https://docs.github.com/articles/adding-a-code-of-conduct-to-your-project/)?
-- **授權條款**。或許最重要的是,是否有[授權條款](https://docs.github.com/articles/adding-a-license-to-a-repository/)?
+- **貢獻指南**。你的專案是否有 [貢獻指南](https://docs.github.com/articles/setting-guidelines-for-repository-contributors/?WT.mc_id=academic-77807-sagibbon)?
+- **行為準則**。是否有 [行為準則](https://docs.github.com/articles/adding-a-code-of-conduct-to-your-project/)?
+- **授權條款**。或許最重要的是,是否有 [授權條款](https://docs.github.com/articles/adding-a-license-to-a-repository/)?
所有這些資源都將有助於新團隊成員的加入。而這些通常是新貢獻者在查看你的程式碼之前會先看的內容,以了解你的專案是否值得他們投入時間。
-✅ README 檔案雖然需要時間準備,但經常被忙碌的維護者忽略。你能找到一個特別詳細的範例嗎?注意:有一些[工具可以幫助建立好的 README](https://www.makeareadme.com/),你可能會想試試看。
+✅ README 檔案雖然需要時間準備,但經常被忙碌的維護者忽略。你能找到一個特別詳細的 README 範例嗎?注意:有一些 [工具可以幫助建立好的 README](https://www.makeareadme.com/),你可能會想試試看。
### 任務:合併一些程式碼
-貢獻文件幫助人們為專案做出貢獻。它解釋了你正在尋找的貢獻類型以及流程如何運作。貢獻者需要完成一系列步驟才能為你的 GitHub 儲存庫做出貢獻:
+貢獻文檔幫助人們為專案做出貢獻。它解釋了你正在尋找的貢獻類型以及流程如何運作。貢獻者需要完成一系列步驟才能為你的 GitHub 儲存庫做出貢獻:
-1. **分叉你的儲存庫**。你可能希望人們「分叉」你的專案。分叉意味著在他們的 GitHub 個人檔案上建立你的儲存庫的副本。
+1. **分叉你的儲存庫**。你可能希望人們 _分叉_ 你的專案。分叉意味著在他們的 GitHub 個人檔案上建立你的儲存庫的副本。
1. **克隆**。接著,他們會將專案克隆到本地電腦。
-1. **建立分支**。你會希望他們為自己的工作建立一個「分支」。
-1. **專注於一個區域的變更**。請求貢獻者一次專注於一件事——這樣你能合併他們工作的機率會更高。想像他們修復了一個錯誤、新增了一個功能,並更新了幾個測試——如果你只想實施其中的 2 個或 1 個變更呢?
+1. **建立分支**。你會希望他們為他們的工作建立一個 _分支_。
+1. **專注於一個區域的變更**。請求貢獻者一次專注於一件事——這樣你能合併他們工作的機率會更高。想像他們修復了一個錯誤,新增了一個新功能,並更新了幾個測試——如果你只想實施其中的 2 項或 1 項變更,該怎麼辦?
✅ 想像一個情境,分支對於撰寫和發佈良好的程式碼特別重要。你能想到哪些使用案例?
> 注意,成為你希望看到的改變,為自己的工作也建立分支。你所做的任何提交都將在你當前「檢出」的分支上進行。使用 `git status` 查看當前所在的分支。
-讓我們來看看貢獻者的工作流程。假設貢獻者已經「分叉」並「克隆」了儲存庫,因此他們在本地電腦上有一個可以工作的 Git 儲存庫:
+讓我們來看看貢獻者的工作流程。假設貢獻者已經 _分叉_ 並 _克隆_ 了儲存庫,因此他們在本地電腦上有一個可以工作的 Git 儲存庫:
-1. **建立分支**。使用 `git branch` 命令建立一個分支,該分支將包含他們想要貢獻的變更:
+1. **建立分支**。使用 `git branch` 命令建立一個分支,該分支將包含他們打算貢獻的變更:
```bash
git branch [branch-name]
@@ -226,7 +226,7 @@ CO_OP_TRANSLATOR_METADATA:
git switch [branch-name]
```
-1. **進行工作**。此時,你可以新增變更。別忘了使用以下命令告訴 Git:
+1. **進行工作**。此時,你可以新增你的變更。別忘了使用以下命令告訴 Git:
```bash
git add .
@@ -235,21 +235,21 @@ CO_OP_TRANSLATOR_METADATA:
確保為你的提交取一個好的名稱,這對你自己以及你正在幫助的儲存庫維護者都很重要。
-1. **將你的工作與 `main` 分支合併**。在某個時候,你完成了工作,並希望將你的工作與 `main` 分支的工作合併。`main` 分支可能已經發生了變更,因此請確保首先使用以下命令更新到最新版本:
+1. **將你的工作與 `main` 分支合併**。在某個時候,你完成了工作,並希望將你的工作與 `main` 分支的內容合併。`main` 分支可能已經發生了變更,因此請確保首先使用以下命令更新到最新版本:
```bash
git switch main
git pull
```
- 此時,你需要確保任何「衝突」(Git 無法輕鬆「合併」的變更)發生在你的工作分支中。因此,運行以下命令:
+ 此時,你需要確保任何 _衝突_(Git 無法輕鬆 _合併_ 的情況)發生在你的工作分支中。因此,運行以下命令:
```bash
git switch [branch_name]
git merge main
```
- 這將把 `main` 中的所有變更帶入你的分支,希望你可以繼續。如果無法繼續,VS Code 會告訴你 Git 在哪裡「困惑」,你只需修改受影響的檔案,指出哪個內容最準確。
+ 這將把 `main` 分支的所有變更帶入你的分支,希望你可以繼續。如果無法繼續,VS Code 會告訴你 Git _困惑_ 的地方,你只需修改受影響的檔案,指出哪個內容最準確。
1. **將你的工作發送到 GitHub**。將你的工作發送到 GitHub 意味著兩件事。將你的分支推送到你的儲存庫,然後開啟一個 PR(Pull Request)。
@@ -259,71 +259,71 @@ CO_OP_TRANSLATOR_METADATA:
上述命令會在你的分叉儲存庫上建立分支。
-1. **開啟 PR**。接下來,你需要開啟一個 PR。你可以通過導航到 GitHub 上的分叉儲存庫來完成此操作。你會在 GitHub 上看到一個提示,詢問你是否要建立新的 PR,點擊它,你將進入一個介面,可以更改提交訊息標題,並給出更合適的描述。現在,你分叉的儲存庫的維護者將看到這個 PR,並且(希望如此)他們會欣賞並「合併」你的 PR。你現在是一名貢獻者,太棒了 :)
+1. **開啟 PR**。接下來,你需要開啟一個 PR。你可以通過導航到 GitHub 上的分叉儲存庫來完成此操作。你會在 GitHub 上看到一個提示,詢問你是否要建立新的 PR,點擊它,你將進入一個介面,可以更改提交訊息標題,並給出更合適的描述。現在,你分叉的儲存庫的維護者將看到這個 PR,_希望_ 他們會欣賞並 _合併_ 你的 PR。你現在是一名貢獻者,太棒了 :)
-1. **清理**。成功合併 PR 後,清理被認為是良好的做法。你需要清理本地分支以及推送到 GitHub 的分支。首先,使用以下命令在本地刪除它:
+1. **清理**。成功合併 PR 後,清理被認為是一種良好的習慣。你需要清理本地分支以及你推送到 GitHub 的分支。首先,使用以下命令在本地刪除它:
```bash
git branch -d [branch-name]
```
-確保你前往 GitHub 頁面檢查分叉的倉庫,然後移除你剛剛推送到的遠端分支。
-`Pull request` 這個詞聽起來有點奇怪,因為實際上你是想將你的更改推送到專案中。但維護者(專案擁有者)或核心團隊需要在合併到專案的 "main" 分支之前考慮你的更改,因此你實際上是在向維護者請求一個更改的決策。
+ 接著,前往分叉儲存庫的 GitHub 頁面,刪除你剛剛推送到的遠端分支。
+`Pull request` 這個詞聽起來有點奇怪,因為實際上你是想將你的更改推送到專案中。但專案的維護者(專案擁有者)或核心團隊需要在將更改合併到專案的 "main" 分支之前審核你的更改,因此實際上你是在向維護者請求一個更改的決策。
-Pull request 是一個用來比較和討論分支中引入的差異的地方,並且可以進行審查、評論、整合測試等操作。一個好的 pull request 大致遵循與提交訊息相同的規則。當你的工作解決了一個問題時,你可以在問題追蹤器中引用該問題。這可以通過使用 `#` 後接問題編號來完成。例如 `#97`。
+Pull request 是一個用來比較和討論分支中引入的差異的地方,這裡可以進行審查、評論、整合測試等操作。一個好的 pull request 大致遵循與提交訊息相同的規則。例如,當你的工作解決了一個問題時,你可以在問題追蹤器中引用該問題。這可以通過使用 `#` 後接問題編號來完成。例如 `#97`。
-🤞希望所有檢查都通過,並且專案擁有者合併你的更改到專案中🤞
+🤞希望所有檢查都通過,並且專案擁有者將你的更改合併到專案中🤞
-更新你當前的本地工作分支,將 GitHub 上對應的遠端分支中的所有新提交拉取下來:
+更新你當前本地工作分支,使其包含 GitHub 上對應遠端分支的所有新提交:
`git pull`
-## 如何貢獻開源
+## 如何貢獻開源專案
-首先,讓我們在 GitHub 上找到一個你感興趣並希望貢獻更改的倉庫(或 **repo**)。你需要將其內容複製到你的電腦上。
+首先,讓我們在 GitHub 上找到一個你感興趣並希望對其進行更改的儲存庫(或 **repo**)。你需要將其內容複製到你的電腦上。
-✅ 找到「適合初學者」的倉庫的一個好方法是 [透過標籤 'good-first-issue' 進行搜尋](https://github.blog/2020-01-22-browse-good-first-issues-to-start-contributing-to-open-source/)。
+✅ 尋找「適合初學者」的儲存庫的一個好方法是[通過標籤 'good-first-issue' 進行搜尋](https://github.blog/2020-01-22-browse-good-first-issues-to-start-contributing-to-open-source/)。
-
+
-有幾種複製程式碼的方法。一種方法是使用 HTTPS、SSH 或 GitHub CLI(命令行介面)來「克隆」倉庫的內容。
+有幾種方法可以複製程式碼。一種方法是使用 HTTPS、SSH 或 GitHub CLI(命令列介面)來「克隆」儲存庫的內容。
-打開你的終端並像這樣克隆倉庫:
+打開你的終端機,像這樣克隆儲存庫:
`git clone https://github.com/ProjectURL`
-要開始專案工作,切換到正確的資料夾:
+要開始處理專案,切換到正確的資料夾:
`cd ProjectURL`
你也可以使用 [Codespaces](https://github.com/features/codespaces)(GitHub 的嵌入式程式碼編輯器/雲端開發環境)或 [GitHub Desktop](https://desktop.github.com/) 打開整個專案。
-最後,你可以下載壓縮的資料夾來獲取程式碼。
+最後,你也可以將程式碼下載為壓縮檔案。
### 關於 GitHub 的一些有趣事實
-你可以對 GitHub 上的任何公共倉庫進行加星、關注或「分叉」。你可以在右上角的下拉選單中找到你加星的倉庫。這就像為程式碼加書籤。
+你可以對 GitHub 上的任何公共儲存庫進行加星、關注或「fork」。你可以在右上角的下拉選單中找到你加星的儲存庫。這就像為程式碼加書籤一樣。
專案通常有一個問題追蹤器,大多數情況下在 GitHub 的 "Issues" 標籤中,除非另有說明,人們會在這裡討論與專案相關的問題。而 Pull Requests 標籤則是人們討論和審查正在進行的更改的地方。
-專案可能還會在論壇、郵件列表或像 Slack、Discord 或 IRC 這樣的聊天頻道中進行討論。
+專案可能還會有論壇、郵件列表或像 Slack、Discord 或 IRC 這樣的聊天頻道進行討論。
-✅ 瀏覽你的新 GitHub 倉庫並嘗試一些操作,例如編輯設定、向倉庫添加資訊,以及創建專案(例如看板)。你可以做很多事情!
+✅ 瀏覽一下你的新 GitHub 儲存庫,嘗試一些操作,比如編輯設定、為儲存庫添加資訊,或者創建一個專案(比如看板)。你可以做很多事情!
---
## 🚀 挑戰
-與朋友配對,共同處理彼此的程式碼。協作創建一個專案,分叉程式碼,創建分支並合併更改。
+與朋友配對,一起處理彼此的程式碼。協作創建一個專案,fork 程式碼,創建分支,並合併更改。
## 課後測驗
-[課後測驗](https://ff-quizzes.netlify.app/web/quiz/4)
+[課後測驗](https://ff-quizzes.netlify.app/web/en/)
-## 回顧與自學
+## 複習與自學
-閱讀更多關於[如何貢獻開源軟體](https://opensource.guide/how-to-contribute/#how-to-submit-a-contribution)。
+閱讀更多關於[如何貢獻開源軟體](https://opensource.guide/how-to-contribute/#how-to-submit-a-contribution)的內容。
[Git 速查表](https://training.github.com/downloads/github-git-cheat-sheet/)。
-多練習,多練習,多練習。GitHub 提供了很棒的學習路徑:[skills.github.com](https://skills.github.com):
+多練習,多實踐。GitHub 提供了很棒的學習路徑,請參考 [skills.github.com](https://skills.github.com):
- [GitHub 的第一週](https://skills.github.com/#first-week-on-github)
@@ -331,7 +331,9 @@ Pull request 是一個用來比較和討論分支中引入的差異的地方,
## 作業
-完成 [GitHub 的第一週課程](https://skills.github.com/#first-week-on-github)。
+完成 [GitHub 的第一週課程](https://skills.github.com/#first-week-on-github)
+
+---
**免責聲明**:
-本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/1-getting-started-lessons/3-accessibility/README.md b/translations/mo/1-getting-started-lessons/3-accessibility/README.md
index 5589a532..c39efa7c 100644
--- a/translations/mo/1-getting-started-lessons/3-accessibility/README.md
+++ b/translations/mo/1-getting-started-lessons/3-accessibility/README.md
@@ -1,150 +1,149 @@
-# 建立無障礙的網頁
+# 建立無障礙網頁
-
-> 由 [Tomomi Imura](https://twitter.com/girlie_mac) 繪製的手繪筆記
+
+> 由 [Tomomi Imura](https://twitter.com/girlie_mac) 繪製的速記筆記
## 課前測驗
-[課前測驗](https://ff-quizzes.netlify.app/web/quiz/5)
+[課前測驗](https://ff-quizzes.netlify.app/web/)
-> 網路的力量在於它的普遍性。無論是否有障礙,讓每個人都能使用是其核心要素。
->
-> \- 提姆·柏納-李爵士,W3C 主任暨全球資訊網發明者
+> 網路的力量在於其普遍性。無論是否有障礙,人人都能使用是其核心要素。
+> \- 提姆·伯納斯-李爵士,W3C 主任及全球資訊網的發明者
-這句話完美地突顯了建立無障礙網站的重要性。一個無法讓所有人使用的應用程式,本質上就是排他的。作為網頁開發者,我們應該始終將無障礙性放在心上。從一開始就專注於此,將確保您所建立的頁面能被所有人訪問。在這堂課中,您將學習如何使用工具來確保您的網頁資產具有無障礙性,以及如何在設計時考慮無障礙性。
+這句話完美地突顯了建立無障礙網站的重要性。一個無法讓所有人使用的應用程式,本質上就是排他性的。作為網頁開發者,我們應該始終將無障礙性放在心上。從一開始就專注於此,您將能確保所有人都能訪問您創建的頁面。在本課程中,您將學習如何使用工具來確保您的網頁資產是無障礙的,以及如何以無障礙性為核心進行設計。
-> 您可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/accessibility/?WT.mc_id=academic-77807-sagibbon) 上學習這堂課!
+> 您可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/accessibility/?WT.mc_id=academic-77807-sagibbon) 上學習本課程!
## 可使用的工具
### 螢幕閱讀器
-最知名的無障礙工具之一就是螢幕閱讀器。
+最知名的無障礙工具之一是螢幕閱讀器。
-[螢幕閱讀器](https://en.wikipedia.org/wiki/Screen_reader) 是視障人士常用的工具。當我們花時間確保瀏覽器能正確傳遞我們想分享的資訊時,我們也必須確保螢幕閱讀器能做到同樣的事情。
+[螢幕閱讀器](https://en.wikipedia.org/wiki/Screen_reader) 是視力受損者常用的客戶端工具。當我們花時間確保瀏覽器正確傳遞我們想要分享的信息時,我們也必須確保螢幕閱讀器能做到同樣的事情。
-最基本的螢幕閱讀器會從上到下以語音方式讀取頁面。如果您的頁面全是文字,閱讀器會以類似於瀏覽器的方式傳遞資訊。然而,網頁很少是純文字的;它們通常包含連結、圖片、顏色和其他視覺元素。我們必須小心確保這些資訊能被螢幕閱讀器正確讀取。
+螢幕閱讀器的基本功能是從上到下以語音方式朗讀頁面。如果您的頁面全是文字,閱讀器將以類似瀏覽器的方式傳遞信息。然而,網頁很少僅僅是文字;它們通常包含連結、圖形、顏色和其他視覺元素。我們需要注意確保這些信息能被螢幕閱讀器正確地朗讀。
-每位網頁開發者都應該熟悉螢幕閱讀器。正如上面所提到的,這是使用者會使用的工具。就像您熟悉瀏覽器的操作一樣,您也應該學習螢幕閱讀器的操作。幸運的是,大多數作業系統內建了螢幕閱讀器。
+每位網頁開發者都應熟悉螢幕閱讀器。正如上文所述,這是您的使用者將使用的客戶端。就像您熟悉瀏覽器的操作方式一樣,您也應該了解螢幕閱讀器的操作方式。幸運的是,大多數操作系統都內建了螢幕閱讀器。
-一些瀏覽器也內建了工具和擴充功能,可以朗讀文字甚至提供一些基本的導航功能,例如 [這些專注於無障礙的 Edge 瀏覽器工具](https://support.microsoft.com/help/4000734/microsoft-edge-accessibility-features)。這些工具也是重要的無障礙工具,但它們的功能與螢幕閱讀器非常不同,不能將它們視為螢幕閱讀器測試工具。
+一些瀏覽器也內建了工具和擴展功能,可以朗讀文字或提供一些基本的導航功能,例如 [Edge 瀏覽器的這些無障礙工具](https://support.microsoft.com/help/4000734/microsoft-edge-accessibility-features)。這些工具也是重要的無障礙工具,但它們的功能與螢幕閱讀器非常不同,不能被誤認為螢幕閱讀器測試工具。
-✅ 試用螢幕閱讀器和瀏覽器的文字朗讀功能。在 Windows 上,[Narrator](https://support.microsoft.com/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1/?WT.mc_id=academic-77807-sagibbon) 是預設內建的,您也可以安裝 [JAWS](https://webaim.org/articles/jaws/) 和 [NVDA](https://www.nvaccess.org/about-nvda/)。在 macOS 和 iOS 上,[VoiceOver](https://support.apple.com/guide/voiceover/welcome/10) 是預設內建的。
+✅ 試用螢幕閱讀器和瀏覽器文字朗讀工具。在 Windows 上,[Narrator](https://support.microsoft.com/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1/?WT.mc_id=academic-77807-sagibbon) 是預設內建的,您也可以安裝 [JAWS](https://webaim.org/articles/jaws/) 和 [NVDA](https://www.nvaccess.org/about-nvda/)。在 macOS 和 iOS 上,[VoiceOver](https://support.apple.com/guide/voiceover/welcome/10) 是預設內建的。
### 放大功能
-另一個視障人士常用的工具是放大功能。最基本的放大功能是靜態放大,可以透過 `Control + 加號 (+)` 或降低螢幕解析度來控制。這種放大方式會使整個頁面重新調整大小,因此使用[響應式設計](https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Responsive_Design) 對於在放大級別下提供良好的使用者體驗非常重要。
+另一個視力受損者常用的工具是放大功能。最基本的放大方式是靜態放大,透過 `Control + 加號 (+)` 或降低螢幕解析度來控制。這種放大方式會使整個頁面重新調整大小,因此使用 [響應式設計](https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Responsive_Design) 對於在高放大級別下提供良好的使用者體驗非常重要。
-另一種放大方式依賴於專門的軟體來放大螢幕的一個區域並進行平移,就像使用真正的放大鏡一樣。在 Windows 上,[Magnifier](https://support.microsoft.com/windows/use-magnifier-to-make-things-on-the-screen-easier-to-see-414948ba-8b1c-d3bd-8615-0e5e32204198) 是內建的,而 [ZoomText](https://www.freedomscientific.com/training/zoomtext/getting-started/) 是一款第三方放大軟體,具有更多功能且擁有更大的使用者群體。在 macOS 和 iOS 上,內建了名為 [Zoom](https://www.apple.com/accessibility/mac/vision/) 的放大軟體。
+另一種放大方式依賴於專門的軟體來放大螢幕的一個區域並進行平移,就像使用真正的放大鏡一樣。在 Windows 上,[Magnifier](https://support.microsoft.com/windows/use-magnifier-to-make-things-on-the-screen-easier-to-see-414948ba-8b1c-d3bd-8615-0e5e32204198) 是內建的,而 [ZoomText](https://www.freedomscientific.com/training/zoomtext/getting-started/) 是第三方放大軟體,具有更多功能和更大的使用者群體。macOS 和 iOS 都內建了名為 [Zoom](https://www.apple.com/accessibility/mac/vision/) 的放大軟體。
### 對比檢查工具
-網站上的顏色需要仔細選擇,以滿足色盲使用者或難以辨識低對比顏色的人的需求。
+網站上的顏色需要仔細選擇,以滿足色盲使用者或難以辨識低對比顏色的使用者的需求。
-✅ 使用瀏覽器擴充功能(例如 [WCAG 的顏色檢查工具](https://microsoftedge.microsoft.com/addons/detail/wcag-color-contrast-check/idahaggnlnekelhgplklhfpchbfdmkjp?hl=en-US&WT.mc_id=academic-77807-sagibbon))測試您喜歡的網站的顏色使用情況。您學到了什麼?
+✅ 使用瀏覽器擴展工具,例如 [WCAG 的顏色檢查工具](https://microsoftedge.microsoft.com/addons/detail/wcag-color-contrast-check/idahaggnlnekelhgplklhfpchbfdmkjp?hl=en-US&WT.mc_id=academic-77807-sagibbon),測試您喜歡使用的網站的顏色使用情況。您學到了什麼?
### Lighthouse
-在瀏覽器的開發者工具區域,您會找到 Lighthouse 工具。這個工具對於初步檢視網站的無障礙性(以及其他分析)非常重要。雖然不應該完全依賴 Lighthouse,但獲得 100% 的分數作為基準是非常有幫助的。
+在瀏覽器的開發者工具區域,您會找到 Lighthouse 工具。這個工具對於初步了解網站的無障礙性(以及其他分析)非常重要。雖然不能僅僅依賴 Lighthouse,但 100% 的分數作為基準是非常有幫助的。
-✅ 在瀏覽器的開發者工具面板中找到 Lighthouse,並對任何網站進行分析。您發現了什麼?
+✅ 在瀏覽器的開發者工具面板中找到 Lighthouse,並對任意網站進行分析。您發現了什麼?
-## 無障礙設計
+## 為無障礙性進行設計
無障礙性是一個相對廣泛的主題。為了幫助您,有許多資源可供使用。
- [Accessible U - 明尼蘇達大學](https://accessibility.umn.edu/your-role/web-developers)
-雖然我們無法涵蓋建立無障礙網站的每個方面,但以下是您需要實施的一些核心原則。從一開始就設計無障礙頁面**總是**比事後再回頭修改更容易。
+雖然我們無法涵蓋建立無障礙網站的所有方面,但以下是一些您需要實施的核心原則。從一開始就設計一個無障礙的頁面 **總是** 比事後回頭修改現有頁面更容易。
## 良好的顯示原則
-### 安全的色彩調色盤
+### 安全的顏色調色盤
-每個人看世界的方式都不同,這包括顏色。在為您的網站選擇配色方案時,您應確保它對所有人都可訪問。一個很棒的[生成色彩調色盤的工具是 Color Safe](http://colorsafe.co/)。
+人們以不同的方式看待世界,包括顏色。在為您的網站選擇配色方案時,您應確保它對所有人都是無障礙的。一個很棒的 [生成顏色調色盤的工具是 Color Safe](http://colorsafe.co/)。
✅ 找出一個在顏色使用上非常有問題的網站。為什麼?
### 使用正確的 HTML
-透過 CSS 和 JavaScript,幾乎可以讓任何元素看起來像任何類型的控制項。例如,`
` 可以用來創建 ``,而 `` 可以變成超連結。雖然這樣可能更容易設計樣式,但對於螢幕閱讀器來說,這並沒有傳遞任何資訊。在頁面上創建控制項時,請使用適當的 HTML。如果您需要一個超連結,請使用 ``。使用正確的 HTML 創建控制項被稱為使用語義化 HTML。
+透過 CSS 和 JavaScript,可以使任何元素看起來像任何類型的控制項。`` 可以用來創建 ``,而 `` 可以變成超連結。雖然這可能被認為更容易設計,但它對螢幕閱讀器來說毫無意義。在頁面上創建控制項時,請使用適當的 HTML。如果您需要超連結,請使用 ``。使用正確的 HTML 創建控制項被稱為使用語義化 HTML。
-✅ 打開任何網站,看看設計師和開發者是否正確使用了 HTML。您能找到應該是連結但被設計成按鈕的元素嗎?提示:右鍵點擊並選擇「檢視頁面原始碼」來查看底層代碼。
+✅ 訪問任意網站,查看設計師和開發者是否正確使用 HTML。您能找到應該是連結但卻是按鈕的例子嗎?提示:右鍵點擊並選擇瀏覽器中的“查看頁面原始碼”來查看底層代碼。
### 創建描述性的標題層次結構
-螢幕閱讀器使用者[非常依賴標題](https://webaim.org/projects/screenreadersurvey8/#finding)來尋找資訊並在頁面中導航。撰寫描述性的標題內容並使用語義化的標題標籤,對於為螢幕閱讀器使用者創建易於導航的網站非常重要。
+螢幕閱讀器使用者 [非常依賴標題](https://webaim.org/projects/screenreadersurvey8/#finding) 來尋找信息並瀏覽頁面。撰寫描述性的標題內容並使用語義化的標題標籤,對於創建一個易於螢幕閱讀器使用者導航的網站非常重要。
-### 使用良好的視覺提示
+### 使用良好的視覺線索
-CSS 提供了對頁面上任何元素外觀的完全控制。您可以創建沒有外框的文字框或沒有底線的超連結。不幸的是,移除這些提示可能會讓依賴它們的使用者更難識別控制項的類型。
+CSS 提供了對頁面上任何元素外觀的完全控制。您可以創建沒有邊框的文本框或沒有下劃線的超連結。不幸的是,移除這些線索可能會使依賴它們的使用者更難識別控制項的類型。
## 超連結文字的重要性
-超連結是網路導航的核心。因此,確保螢幕閱讀器能正確讀取連結,讓所有使用者都能導航您的網站。
+超連結是網頁導航的核心。因此,確保螢幕閱讀器能正確朗讀連結文字,讓所有使用者都能導航您的網站。
### 螢幕閱讀器與連結
-正如您所預期的,螢幕閱讀器會像讀取頁面上的其他文字一樣讀取連結文字。考慮到這一點,以下示例中的文字可能看起來完全可以接受。
+正如您所預期的,螢幕閱讀器以與頁面上其他文字相同的方式朗讀連結文字。考慮以下示例,您可能會覺得這些文字完全可以接受。
-> 小企鵝,有時被稱為仙女企鵝,是世界上最小的企鵝。[點擊這裡](https://en.wikipedia.org/wiki/Little_penguin)了解更多資訊。
+> 小企鵝,有時被稱為仙女企鵝,是世界上最小的企鵝。[點擊這裡](https://en.wikipedia.org/wiki/Little_penguin) 了解更多信息。
-> 小企鵝,有時被稱為仙女企鵝,是世界上最小的企鵝。訪問 https://en.wikipedia.org/wiki/Little_penguin 了解更多資訊。
+> 小企鵝,有時被稱為仙女企鵝,是世界上最小的企鵝。訪問 https://en.wikipedia.org/wiki/Little_penguin 了解更多信息。
-> **注意** 如您即將閱讀的內容,您應該**永遠不要**創建如上所示的連結。
+> **NOTE** 如您即將閱讀的內容,您應該 **永遠** 不要創建像上面這樣的連結。
-記住,螢幕閱讀器是一種與瀏覽器不同的介面,具有不同的功能集。
+請記住,螢幕閱讀器是一種與瀏覽器不同的介面,具有不同的功能集。
### 使用 URL 的問題
-螢幕閱讀器會讀取文字。如果文字中出現 URL,螢幕閱讀器會讀取該 URL。一般來說,URL 並不能傳遞有意義的資訊,並且聽起來可能令人厭煩。如果您的手機曾經語音讀取過帶有 URL 的簡訊,您可能會有這樣的體驗。
+螢幕閱讀器會朗讀文字。如果文字中出現 URL,螢幕閱讀器會朗讀 URL。一般來說,URL 不會傳遞有意義的信息,並且聽起來可能很煩人。如果您的手機曾經語音朗讀過帶有 URL 的短信,您可能已經體驗過這種情況。
### 使用「點擊這裡」的問題
-螢幕閱讀器也能僅讀取頁面上的超連結,就像視力正常的人會掃描頁面尋找連結一樣。如果連結文字總是「點擊這裡」,使用者聽到的將是「點擊這裡,點擊這裡,點擊這裡,點擊這裡,點擊這裡,……」所有連結現在都無法區分。
+螢幕閱讀器也能僅朗讀頁面上的超連結,就像視力正常的人掃描頁面尋找連結一樣。如果連結文字總是「點擊這裡」,使用者聽到的就會是「點擊這裡,點擊這裡,點擊這裡,點擊這裡,點擊這裡,……」。所有連結現在都無法區分。
### 良好的連結文字
-良好的連結文字應簡要描述連結的內容。在上述關於小企鵝的示例中,連結指向該物種的維基百科頁面。「小企鵝」這個短語將是完美的連結文字,因為它清楚地表明點擊該連結後可以了解什麼——小企鵝。
+良好的連結文字能簡要描述連結的目的。在上述關於小企鵝的示例中,連結指向該物種的維基百科頁面。短語 *小企鵝* 作為連結文字非常合適,因為它清楚地表明點擊連結後可以了解什麼——小企鵝。
-> [小企鵝](https://en.wikipedia.org/wiki/Little_penguin),有時被稱為仙女企鵝,是世界上最小的企鵝。
+> 小企鵝,有時被稱為仙女企鵝,是世界上最小的企鵝。[小企鵝](https://en.wikipedia.org/wiki/Little_penguin)。
-✅ 在網路上隨意瀏覽幾分鐘,找出使用模糊連結策略的頁面。將它們與其他連結更清晰的網站進行比較。您學到了什麼?
+✅ 在網上瀏覽幾分鐘,找出使用模糊連結策略的頁面。將它們與其他連結更好的網站進行比較。您學到了什麼?
-#### 搜尋引擎的注意事項
+#### 搜索引擎注意事項
-確保您的網站對所有人都可訪問,還能幫助搜尋引擎更好地導航您的網站。搜尋引擎使用連結文字來了解頁面的主題。因此,使用良好的連結文字對所有人都有幫助!
+確保您的網站對所有人都無障礙,還能幫助搜索引擎導航您的網站。搜索引擎使用連結文字來了解頁面的主題。因此,使用良好的連結文字對所有人都有幫助!
### ARIA
想像以下頁面:
-| 產品 | 描述 | 訂購 |
-| ------------- | ----------------- | ----------------- |
-| 小工具 | [描述](../../../../1-getting-started-lessons/3-accessibility/') | [訂購](../../../../1-getting-started-lessons/3-accessibility/') |
-| 超級小工具 | [描述](../../../../1-getting-started-lessons/3-accessibility/') | [訂購](../../../../1-getting-started-lessons/3-accessibility/') |
+| 產品 | 描述 | 訂購 |
+| ------------ | ------------------ | ------------ |
+| Widget | [描述](../../../../1-getting-started-lessons/3-accessibility/') | [訂購](../../../../1-getting-started-lessons/3-accessibility/') |
+| Super widget | [描述](../../../../1-getting-started-lessons/3-accessibility/') | [訂購](../../../../1-getting-started-lessons/3-accessibility/') |
-在這個例子中,對於使用瀏覽器的人來說,重複使用「描述」和「訂購」的文字是合理的。然而,對於使用螢幕閱讀器的人來說,他們只會聽到「描述」和「訂購」不斷重複,沒有上下文。
+在此示例中,重複使用「描述」和「訂購」的文字對於使用瀏覽器的人來說是合理的。然而,使用螢幕閱讀器的人只會聽到「描述」和「訂購」的文字重複出現,沒有上下文。
-為了支援這類情況,HTML 支援一組稱為[無障礙豐富網際網路應用程式 (ARIA)](https://developer.mozilla.org/docs/Web/Accessibility/ARIA) 的屬性。這些屬性允許您為螢幕閱讀器提供額外的資訊。
+為了支持這類場景,HTML 支援一組屬性,稱為 [Accessible Rich Internet Applications (ARIA)](https://developer.mozilla.org/docs/Web/Accessibility/ARIA)。這些屬性允許您向螢幕閱讀器提供額外的信息。
-> **注意**:與 HTML 的許多方面一樣,瀏覽器和螢幕閱讀器的支援可能會有所不同。然而,大多數主流客戶端都支援 ARIA 屬性。
+> **NOTE**:與 HTML 的許多方面一樣,瀏覽器和螢幕閱讀器的支援可能有所不同。然而,大多數主流客戶端都支援 ARIA 屬性。
-您可以使用 `aria-label` 來描述連結,當頁面的格式不允許您這樣做時。例如,對於小工具的描述可以設置為:
+您可以使用 `aria-label` 來描述連結,當頁面的格式不允許您這樣做時。例如,Widget 的描述可以設置為:
``` html
description
```
-✅ 一般來說,使用上述的語義化標記優先於使用 ARIA,但有時某些 HTML 元件並沒有語義化的對應。例如樹狀結構(Tree)。HTML 中沒有對應的元素,因此您需要使用適當的角色和 ARIA 值來標識這個通用的 `` 元素。[MDN 上的 ARIA 文件](https://developer.mozilla.org/docs/Web/Accessibility/ARIA) 包含更多有用的資訊。
+✅ 一般來說,使用上述的語義化標記比使用 ARIA 更重要,但有時某些 HTML 元件沒有語義化的等效標記。一個很好的例子是樹狀結構。HTML 沒有樹狀結構的等效標記,因此您可以使用適當的角色和 ARIA 值來標識此元素的通用 `
`。[MDN ARIA 文檔](https://developer.mozilla.org/docs/Web/Accessibility/ARIA) 包含更多有用的信息。
```html
File Viewer
@@ -155,26 +154,26 @@ CSS 提供了對頁面上任何元素外觀的完全控制。您可以創建沒
## 圖片
-不用說,螢幕閱讀器無法自動讀取圖片中的內容。確保圖片具有無障礙性並不需要太多工作——這正是 `alt` 屬性的用途所在。所有有意義的圖片都應該有一個 `alt` 屬性來描述它們的內容。
-純裝飾性的圖片應將其 `alt` 屬性設置為空字串:`alt=""`。這樣可以防止螢幕閱讀器不必要地宣讀裝飾性圖片。
+螢幕閱讀器無法自動朗讀圖片中的內容。確保圖片是無障礙的並不需要太多工作——這就是 `alt` 屬性的用途。所有有意義的圖片都應該有 `alt` 屬性來描述它們的內容。
+純裝飾性的圖片應將其 `alt` 屬性設置為空字符串:`alt=""`。這樣可以防止螢幕閱讀器不必要地宣告裝飾性圖片。
-✅ 正如您所預期的,搜尋引擎也無法理解圖片中的內容。它們也使用 `alt` 文本。因此,再次確保您的頁面具有無障礙性還能帶來額外的好處!
+✅ 如您所料,搜索引擎也無法理解圖片中的內容。它們也使用 alt 文本。因此,再次確保您的頁面是無障礙的還能帶來額外的好處!
-## 鍵盤操作
+## 鍵盤
-有些使用者無法使用滑鼠或觸控板,而是依賴鍵盤操作來逐一切換元素。因此,您的網站需要以邏輯順序呈現內容,讓鍵盤使用者能夠按順序訪問每個互動元素。如果您使用語義化標記構建網頁,並使用 CSS 設計其視覺佈局,您的網站應該可以通過鍵盤導航,但手動測試這一點仍然很重要。了解更多關於[鍵盤導航策略](https://webaim.org/techniques/keyboard/)的資訊。
+有些使用者無法使用滑鼠或觸控板,而是依賴鍵盤操作來逐一切換元素。您的網站需要以邏輯順序呈現內容,讓鍵盤使用者能夠按順序訪問每個互動元素。如果您使用語義化標記構建網頁並使用 CSS 設計其視覺佈局,您的網站應該是可用鍵盤導航的,但手動測試這一方面仍然很重要。了解更多 [鍵盤導航策略](https://webaim.org/techniques/keyboard/)。
-✅ 打開任何網站,嘗試僅使用鍵盤進行導航。哪些部分有效,哪些部分無效?為什麼?
+✅ 訪問任意網站,嘗試僅使用鍵盤進行導航。哪些有效,哪些無效?為什麼?
## 總結
-一個僅對部分人可訪問的網路並不是真正的「全球資訊網」。確保您建立的網站具有無障礙性最好的方法是從一開始就融入無障礙性最佳實踐。雖然這需要額外的步驟,但現在將這些技能融入您的工作流程,將確保您創建的所有頁面都具有無障礙性。
+一個僅對部分人無障礙的網頁並不是真正的「全球資訊網」。確保您創建的網站是無障礙的最佳方法是從一開始就採用無障礙性最佳實踐。雖然需要額外的步驟,但現在將這些技能融入您的工作流程,意味著您創建的所有頁面都將是無障礙的。
---
## 🚀 挑戰
-將以下 HTML 重寫為盡可能無障礙,根據您學到的策略進行修改。
+使用您學到的策略,將以下 HTML 重寫為盡可能無障礙的版本。
```html
@@ -220,23 +219,25 @@ CSS 提供了對頁面上任何元素外觀的完全控制。您可以創建沒
Semantic Example
-
+
```
## 課後測驗
-[課後測驗](https://ff-quizzes.netlify.app/web/quiz/6)
+[課後測驗](https://ff-quizzes.netlify.app/web/en/)
-## 複習與自學
+## 回顧與自學
許多政府都有關於無障礙需求的法律。了解一下您所在國家的無障礙法律。哪些內容涵蓋在內,哪些未涵蓋?例如:[這個政府網站](https://accessibility.blog.gov.uk/)。
## 作業
[分析一個不具無障礙功能的網站](assignment.md)
-來源:由 Instrument 提供的 [Turtle Ipsum](https://github.com/Instrument/semantic-html-sample)
+致謝:[Turtle Ipsum](https://github.com/Instrument/semantic-html-sample) 由 Instrument 提供
+
+---
**免責聲明**:
-本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/2-js-basics/1-data-types/README.md b/translations/mo/2-js-basics/1-data-types/README.md
index 324a868e..c9529ccf 100644
--- a/translations/mo/2-js-basics/1-data-types/README.md
+++ b/translations/mo/2-js-basics/1-data-types/README.md
@@ -1,23 +1,23 @@
# JavaScript 基礎:資料型別
-
+
> 由 [Tomomi Imura](https://twitter.com/girlie_mac) 繪製的筆記圖
-## 課前測驗
-[課前測驗](https://ff-quizzes.netlify.app/web/quiz/7)
+## 課前測驗
+[課前測驗](https://ff-quizzes.netlify.app/web/)
-這堂課將介紹 JavaScript 的基礎知識,這是一種為網頁提供互動性的語言。
+本課程涵蓋 JavaScript 的基礎知識,這是一種為網頁提供互動功能的程式語言。
-> 你可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101-variables/?WT.mc_id=academic-77807-sagibbon) 上學習這堂課!
+> 您可以在 [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101-variables/?WT.mc_id=academic-77807-sagibbon) 上學習本課程!
[](https://youtube.com/watch?v=JNIXfGiDWM8 "JavaScript 中的變數")
@@ -29,56 +29,56 @@ CO_OP_TRANSLATOR_METADATA:
## 變數
-變數用來儲存值,這些值可以在程式碼中使用並更改。
+變數用來儲存值,這些值可以在程式碼中使用並進行更改。
-建立並**宣告**一個變數的語法是 **[關鍵字] [名稱]**,它由以下兩部分組成:
+建立和**宣告**變數的語法如下:**[關鍵字] [名稱]**。它由以下兩部分組成:
- **關鍵字**。關鍵字可以是 `let` 或 `var`。
-✅ `let` 關鍵字是在 ES6 中引入的,為變數提供所謂的 _區塊作用域_。建議使用 `let` 而非 `var`。我們會在後續部分更深入地討論區塊作用域。
-- **變數名稱**,這是你自己選擇的一個名稱。
+✅ `let` 關鍵字是在 ES6 中引入的,並為您的變數提供所謂的 _區塊作用域_。建議使用 `let` 而非 `var`。我們將在後續部分更深入地探討區塊作用域。
+- **變數名稱**,這是您自己選擇的名稱。
-### 任務 - 操作變數
+### 任務 - 使用變數
-1. **宣告一個變數**。使用 `let` 關鍵字宣告一個變數:
+1. **宣告變數**。讓我們使用 `let` 關鍵字宣告一個變數:
```javascript
let myVariable;
```
- 現在 `myVariable` 已經使用 `let` 關鍵字宣告,但目前尚未賦值。
+ `myVariable` 現在已使用 `let` 關鍵字宣告,但目前尚未賦值。
-2. **賦值**。使用 `=` 運算符將值儲存到變數中,後面接著期望的值。
+1. **賦值**。使用 `=` 運算符將值存儲到變數中,後面跟著期望的值。
```javascript
myVariable = 123;
```
- > 注意:在這堂課中,`=` 的使用表示我們使用的是「賦值運算符」,用來將值設定給變數。它並不表示相等。
+ > 注意:在本課程中,`=` 的使用表示我們使用了一個「賦值運算符」,用於將值設定到變數中。它並不表示相等。
- 現在 `myVariable` 已經被*初始化*為值 123。
+ `myVariable` 現在已被*初始化*為值 123。
-3. **重構**。將你的程式碼替換為以下語句。
+1. **重構**。將您的程式碼替換為以下語句。
```javascript
let myVariable = 123;
```
- 上述語句稱為 _顯式初始化_,即在宣告變數的同時賦值。
+ 上述程式碼稱為 _顯式初始化_,即在宣告變數的同時賦值。
-4. **更改變數值**。以下列方式更改變數值:
+1. **更改變數值**。以下列方式更改變數值:
```javascript
myVariable = 321;
```
- 一旦變數被宣告,你可以隨時使用 `=` 運算符和新值來更改它的值。
+ 一旦變數被宣告,您可以隨時使用 `=` 運算符和新值更改其值。
- ✅ 試試看!你可以直接在瀏覽器中撰寫 JavaScript。打開瀏覽器並進入開發者工具。在主控台中,你會看到一個提示符,輸入 `let myVariable = 123`,按下回車,然後輸入 `myVariable`。會發生什麼?注意,你會在後續課程中學到更多相關概念。
+ ✅ 試試看!您可以直接在瀏覽器中撰寫 JavaScript。打開瀏覽器窗口並導航到開發者工具。在主控台中,您會看到提示;輸入 `let myVariable = 123`,按下回車,然後輸入 `myVariable`。會發生什麼?注意,您將在後續課程中學到更多相關概念。
## 常數
-常數的宣告和初始化與變數的概念相同,但使用的是 `const` 關鍵字。常數通常以全大寫字母宣告。
+常數的宣告和初始化遵循與變數相同的概念,但使用 `const` 關鍵字。常數通常使用全大寫字母宣告。
```javascript
const MY_VARIABLE = 123;
@@ -86,60 +86,60 @@ const MY_VARIABLE = 123;
常數與變數相似,但有兩個例外:
-- **必須有值**。常數必須初始化,否則執行程式碼時會出現錯誤。
-- **參考不能更改**。一旦初始化,常數的參考不能更改,否則執行程式碼時會出現錯誤。我們來看兩個例子:
+- **必須有值**。常數必須初始化,否則在執行程式碼時會出現錯誤。
+- **引用不可更改**。常數的引用一旦初始化就不能更改,否則在執行程式碼時會出現錯誤。我們來看兩個例子:
- **簡單值**。以下是不允許的:
-
+
```javascript
const PI = 3;
PI = 4; // not allowed
```
-
- - **物件參考受保護**。以下是不允許的:
-
+
+ - **物件引用受保護**。以下是不允許的:
+
```javascript
const obj = { a: 3 };
obj = { b: 5 } // not allowed
```
- **物件值未受保護**。以下是允許的:
-
+
```javascript
const obj = { a: 3 };
obj.a = 5; // allowed
```
- 上述範例中,你更改了物件的值,但並未更改其參考,因此是允許的。
+ 上述程式碼更改了物件的值,但未更改其引用,因此是允許的。
- > 注意,`const` 表示參考受到重新賦值的保護。然而,值並非 _不可變_,尤其是當它是像物件這樣的複雜結構時,值仍然可以更改。
+ > 注意,`const` 表示引用受到重新賦值的保護。然而,值並非 _不可變_,尤其是當它是像物件這樣的複雜結構時,值仍然可以更改。
## 資料型別
-變數可以儲存多種不同型別的值,例如數字和文字。這些不同型別的值被稱為 **資料型別**。資料型別是軟體開發中的重要部分,因為它幫助開發者決定程式碼應該如何撰寫以及軟體應該如何運行。此外,一些資料型別具有獨特的功能,可以幫助轉換或提取值中的額外資訊。
+變數可以儲存許多不同類型的值,例如數字和文字。這些不同類型的值被稱為 **資料型別**。資料型別是軟體開發的重要部分,因為它幫助開發者決定程式碼的撰寫方式以及軟體的運行方式。此外,某些資料型別具有獨特的功能,可以幫助轉換或提取值中的額外資訊。
-✅ 資料型別也被稱為 JavaScript 的資料原始型別,因為它們是語言提供的最低層級資料型別。共有 7 種原始型別:string、number、bigint、boolean、undefined、null 和 symbol。花點時間想像這些原始型別各自代表什麼。什麼是 `zebra`?`0` 呢?`true` 呢?
+✅ 資料型別也被稱為 JavaScript 的資料原始型別,因為它們是語言提供的最低層級資料型別。共有 7 種原始型別:string、number、bigint、boolean、undefined、null 和 symbol。花點時間想像這些原始型別可能代表什麼。什麼是 `zebra`?`0` 呢?`true` 呢?
### 數字
-在前一部分中,`myVariable` 的值是一個數字型別。
+在上一節中,`myVariable` 的值是一個數字型別。
`let myVariable = 123;`
-變數可以儲存所有類型的數字,包括小數或負數。數字還可以與算術運算符一起使用,這部分會在[下一節](../../../../2-js-basics/1-data-types)中介紹。
+變數可以儲存所有類型的數字,包括小數或負數。數字還可以與算術運算符一起使用,這部分內容會在[下一節](../../../../2-js-basics/1-data-types)中介紹。
### 算術運算符
-在執行算術運算時,有多種類型的運算符可供使用,以下列出了一些:
+執行算術運算時可以使用多種運算符,以下列出了一些:
-| 符號 | 描述 | 範例 |
-| ---- | -------------------------------------- | --------------------------------- |
-| `+` | **加法**:計算兩個數字的總和 | `1 + 2 // 預期答案是 3` |
-| `-` | **減法**:計算兩個數字的差 | `1 - 2 // 預期答案是 -1` |
-| `*` | **乘法**:計算兩個數字的乘積 | `1 * 2 // 預期答案是 2` |
-| `/` | **除法**:計算兩個數字的商 | `1 / 2 // 預期答案是 0.5` |
-| `%` | **取餘**:計算兩個數字相除的餘數 | `1 % 2 // 預期答案是 1` |
+| 符號 | 描述 | 範例 |
+| ---- | ------------------------------------------------------------------------- | --------------------------------- |
+| `+` | **加法**:計算兩個數字的總和 | `1 + 2 //預期答案是 3` |
+| `-` | **減法**:計算兩個數字的差 | `1 - 2 //預期答案是 -1` |
+| `*` | **乘法**:計算兩個數字的乘積 | `1 * 2 //預期答案是 2` |
+| `/` | **除法**:計算兩個數字的商 | `1 / 2 //預期答案是 0.5` |
+| `%` | **餘數**:計算兩個數字相除後的餘數 | `1 % 2 //預期答案是 1` |
-✅ 試試看!在瀏覽器的主控台中嘗試一個算術運算。結果是否讓你感到驚訝?
+✅ 試試看!在瀏覽器的主控台中嘗試一個算術運算。結果是否讓您感到驚訝?
### 字串
@@ -149,11 +149,11 @@ const MY_VARIABLE = 123;
- `"這也是一個字串"`
- `let myString = '這是一個儲存在變數中的字串值';`
-記得在撰寫字串時使用引號,否則 JavaScript 會認為它是一個變數名稱。
+記得在撰寫字串時使用引號,否則 JavaScript 會假設它是一個變數名稱。
### 格式化字串
-字串是文字,有時需要進行格式化。
+字串是文字型的,有時需要進行格式化。
要**串接**兩個或多個字串(即將它們連接在一起),可以使用 `+` 運算符。
@@ -167,9 +167,9 @@ myString1 + ", " + myString2 + "!"; //Hello, World!
```
-✅ 為什麼在 JavaScript 中 `1 + 1 = 2`,但 `'1' + '1' = 11`?想一想。那 `'1' + 1` 呢?
+✅ 為什麼在 JavaScript 中 `1 + 1 = 2`,但 `'1' + '1' = 11`?想一想。那麼 `'1' + 1` 呢?
-**模板字面值** 是另一種格式化字串的方法,不同於引號,它使用的是反引號。任何非純文字的內容必須放在 `${ }` 的佔位符中,包括可能是字串的變數。
+**模板字串**是另一種格式化字串的方式,不同於引號,模板字串使用反引號。任何非純文字的內容必須放在 `${ }` 區塊中,包括可能是字串的變數。
```javascript
let myString1 = "Hello";
@@ -179,35 +179,37 @@ let myString2 = "World";
`${myString1}, ${myString2}!` //Hello, World!
```
-你可以使用任一方法來實現格式化目標,但模板字面值會保留所有空格和換行。
+您可以使用任一方法達到格式化的目的,但模板字串會保留所有空格和換行。
-✅ 什麼情況下你會使用模板字面值而不是普通字串?
+✅ 什麼時候您會使用模板字串而非普通字串?
### 布林值
-布林值只有兩個值:`true` 或 `false`。布林值可以幫助決定在某些條件滿足時應該執行哪些程式碼。在許多情況下,[運算符](../../../../2-js-basics/1-data-types) 有助於設定布林值,並且你會經常看到和撰寫變數在初始化或更新值時使用運算符。
+布林值只有兩個可能的值:`true` 或 `false`。布林值可以幫助決定在滿足某些條件時應執行哪些程式碼行。在許多情況下,[運算符](../../../../2-js-basics/1-data-types)會協助設定布林值,您會經常注意到並撰寫變數在初始化或更新其值時使用運算符。
- `let myTrueBool = true`
- `let myFalseBool = false`
-✅ 如果一個變數的值被認為是「真值」,那麼它會評估為布林值 `true`。有趣的是,在 JavaScript 中,[所有值都是真值,除非被定義為假值](https://developer.mozilla.org/docs/Glossary/Truthy)。
+✅ 如果一個變數的值評估為布林值 `true`,則可以認為它是「真值」。有趣的是,在 JavaScript 中,[所有值都是真值,除非被定義為假值](https://developer.mozilla.org/docs/Glossary/Truthy)。
---
## 🚀 挑戰
-JavaScript 因其在處理資料型別時偶爾令人驚訝的方式而聞名。研究一下這些「陷阱」。例如:大小寫敏感可能會讓你吃虧!在主控台中試試看:`let age = 1; let Age = 2; age == Age`(結果是 `false`——為什麼?)。你還能找到哪些陷阱?
+JavaScript 因其偶爾處理資料型別的驚人方式而聞名。進行一些研究,了解這些「陷阱」。例如:大小寫敏感可能會讓人措手不及!在主控台中嘗試以下程式碼:`let age = 1; let Age = 2; age == Age`(結果為 `false` —— 為什麼?)。您還能找到哪些其他陷阱?
-## 課後測驗
-[課後測驗](https://ff-quizzes.netlify.app/web/quiz/8)
+## 課後測驗
+[課後測驗](https://ff-quizzes.netlify.app)
-## 複習與自學
+## 回顧與自學
-看看[這份 JavaScript 練習題清單](https://css-tricks.com/snippets/javascript/),試著完成一題。你學到了什麼?
+查看[這份 JavaScript 練習題列表](https://css-tricks.com/snippets/javascript/)並嘗試其中一題。您學到了什麼?
## 作業
[資料型別練習](assignment.md)
+---
+
**免責聲明**:
-本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/2-js-basics/2-functions-methods/README.md b/translations/mo/2-js-basics/2-functions-methods/README.md
index bfe82ebc..11a5390d 100644
--- a/translations/mo/2-js-basics/2-functions-methods/README.md
+++ b/translations/mo/2-js-basics/2-functions-methods/README.md
@@ -1,8 +1,8 @@
# JavaScript 基礎:陣列與迴圈
-
-> Sketchnote by [Tomomi Imura](https://twitter.com/girlie_mac)
+
+> 手繪筆記由 [Tomomi Imura](https://twitter.com/girlie_mac) 提供
-## 課前測驗
+## 課前測驗
[課前測驗](https://ff-quizzes.netlify.app/web/quiz/13)
-本課程涵蓋 JavaScript 的基礎知識,這是一種為網頁提供互動性的程式語言。在這堂課中,你將學習有關陣列與迴圈的知識,這些工具用於操作資料。
+本課程介紹 JavaScript 的基礎知識,這是一種為網頁提供互動性的語言。在這堂課中,你將學習如何使用陣列與迴圈來操作資料。
-[](https://youtube.com/watch?v=1U4qTyq02Xw "陣列")
+[](https://youtube.com/watch?v=1U4qTyq02Xw "陣列")
-[](https://www.youtube.com/watch?v=Eeh7pxtTZ3k "迴圈")
+[](https://www.youtube.com/watch?v=Eeh7pxtTZ3k "迴圈")
> 🎥 點擊上方圖片觀看有關陣列與迴圈的影片。
@@ -27,25 +27,25 @@ CO_OP_TRANSLATOR_METADATA:
## 陣列
-處理資料是任何程式語言中常見的任務,而當資料以結構化格式(例如陣列)組織時,這項任務會變得更加容易。使用陣列時,資料會以類似清單的結構存儲。陣列的一大優勢是你可以在一個陣列中存儲不同類型的資料。
+處理資料是任何程式語言中常見的任務,而當資料以結構化的格式(如陣列)組織起來時,這項任務會變得更加簡單。使用陣列時,資料會以類似清單的結構儲存。陣列的一大優點是可以在同一個陣列中儲存不同類型的資料。
-✅ 陣列無處不在!你能想到一個像太陽能板陣列這樣的現實生活中的陣列例子嗎?
+✅ 陣列無處不在!你能想到一個現實生活中的陣列例子嗎?例如太陽能板陣列?
-陣列的語法是一對方括號。
+陣列的語法是使用一對方括號。
```javascript
let myArray = [];
```
-這是一個空陣列,但陣列也可以在宣告時就已經填充資料。陣列中的多個值以逗號分隔。
+這是一個空陣列,但陣列也可以在宣告時就已經填入資料。陣列中的多個值以逗號分隔。
```javascript
let iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
```
-陣列中的值會被分配一個獨特的值,稱為 **索引**,這是一個基於其距離陣列開頭的整數。在上面的例子中,字串值 "Chocolate" 的索引是 0,而 "Rocky Road" 的索引是 4。使用索引和方括號可以檢索、更改或插入陣列中的值。
+陣列中的值會被分配一個獨特的值,稱為 **索引**,這是一個整數,根據它與陣列開頭的距離分配。在上面的例子中,字串值 "Chocolate" 的索引是 0,而 "Rocky Road" 的索引是 4。使用方括號和索引可以檢索、更改或插入陣列中的值。
-✅ 你是否感到驚訝,陣列的索引是從零開始的?在某些程式語言中,索引是從 1 開始的。這背後有一段有趣的歷史,你可以在 [維基百科](https://en.wikipedia.org/wiki/Zero-based_numbering) 上閱讀相關內容。
+✅ 你是否感到驚訝,陣列的索引是從 0 開始的?在某些程式語言中,索引是從 1 開始的。這背後有一段有趣的歷史,你可以在 [維基百科](https://en.wikipedia.org/wiki/Zero-based_numbering) 上閱讀相關內容。
```javascript
let iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
@@ -58,34 +58,34 @@ iceCreamFlavors[2]; //"Vanilla"
iceCreamFlavors[4] = "Butter Pecan"; //Changed "Rocky Road" to "Butter Pecan"
```
-你也可以在指定索引處插入新值,例如:
+你也可以在指定的索引位置插入新值,例如:
```javascript
iceCreamFlavors[5] = "Cookie Dough"; //Added "Cookie Dough"
```
-✅ 更常見的方式是使用陣列操作符,例如 array.push(),來向陣列中添加值。
+✅ 更常見的方式是使用陣列操作符,例如 array.push(),來將值加入陣列。
-要知道陣列中有多少項,可以使用 `length` 屬性。
+要知道陣列中有多少項目,可以使用 `length` 屬性。
```javascript
let iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
iceCreamFlavors.length; //5
```
-✅ 自己試試看!使用瀏覽器的控制台創建並操作一個你自己設計的陣列。
+✅ 試試看!使用瀏覽器的主控台來建立並操作一個你自己創建的陣列。
## 迴圈
-迴圈允許我們執行重複或 **迭代** 的任務,並且可以節省大量時間和程式碼。每次迭代可以在變數、值和條件上有所不同。JavaScript 中有不同類型的迴圈,它們之間有些微差異,但基本上都做同樣的事情:迴圈處理資料。
+迴圈讓我們能夠執行重複或 **迭代** 的任務,這可以節省大量的時間和程式碼。每次迭代可以有不同的變數、值和條件。在 JavaScript 中有不同類型的迴圈,它們之間有些微的差異,但基本上都做相同的事情:遍歷資料。
### For 迴圈
`for` 迴圈需要三個部分來進行迭代:
-- `counter` 一個變數,通常初始化為一個數字,用於計算迭代次數
-- `condition` 使用比較運算符的表達式,當結果為 `false` 時迴圈停止
-- `iteration-expression` 在每次迭代結束時執行,通常用於更改計數器的值
-
+- `counter` 一個變數,通常初始化為一個數字,用來計算迭代次數
+- `condition` 使用比較運算符的表達式,當結果為 `false` 時迴圈停止
+- `iteration-expression` 在每次迭代結束時執行,通常用來改變計數器的值
+
```javascript
// Counting up to 10
for (let i = 0; i < 10; i++) {
@@ -93,11 +93,11 @@ for (let i = 0; i < 10; i++) {
}
```
-✅ 在瀏覽器控制台中執行這段程式碼。當你對計數器、條件或迭代表達式進行小改動時會發生什麼?你能讓它倒著執行,創建一個倒數嗎?
+✅ 在瀏覽器的主控台中執行這段程式碼。當你對計數器、條件或迭代表達式做些微更改時會發生什麼?你能讓它倒數,創建一個倒計時嗎?
### While 迴圈
-與 `for` 迴圈的語法不同,`while` 迴圈只需要一個條件,當條件變為 `false` 時迴圈停止。迴圈中的條件通常依賴於其他值(例如計數器),並且必須在迴圈中進行管理。計數器的初始值必須在迴圈外創建,並且任何滿足條件的表達式(包括更改計數器)必須在迴圈內維護。
+與 `for` 迴圈的語法不同,`while` 迴圈只需要一個條件,當條件變為 `false` 時迴圈停止。迴圈中的條件通常依賴於其他值(如計數器),並且必須在迴圈中進行管理。計數器的初始值必須在迴圈外創建,並且任何滿足條件的表達式(包括更改計數器)都必須在迴圈內維護。
```javascript
//Counting up to 10
@@ -108,11 +108,11 @@ while (i < 10) {
}
```
-✅ 為什麼你會選擇使用 for 迴圈而不是 while 迴圈?17K 名觀眾在 StackOverflow 上有同樣的疑問,其中一些意見可能 [對你有趣](https://stackoverflow.com/questions/39969145/while-loops-vs-for-loops-in-javascript)。
+✅ 你會在什麼情況下選擇使用 for 迴圈而不是 while 迴圈?17K 名讀者在 StackOverflow 上有相同的疑問,其中一些意見可能會 [引起你的興趣](https://stackoverflow.com/questions/39969145/while-loops-vs-for-loops-in-javascript)。
## 迴圈與陣列
-陣列通常與迴圈一起使用,因為大多數條件需要陣列的長度來停止迴圈,而索引也可以作為計數器的值。
+陣列經常與迴圈一起使用,因為大多數條件需要依賴陣列的長度來停止迴圈,而索引也可以作為計數器的值。
```javascript
let iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
@@ -122,24 +122,26 @@ for (let i = 0; i < iceCreamFlavors.length; i++) {
} //Ends when all flavors are printed
```
-✅ 在瀏覽器的控制台中嘗試迴圈處理一個你自己設計的陣列。
+✅ 在瀏覽器的主控台中,嘗試對你自己創建的陣列進行迴圈操作。
---
## 🚀 挑戰
-除了 for 和 while 迴圈之外,還有其他方式可以迴圈處理陣列,例如 [forEach](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)、[for-of](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for...of) 和 [map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map)。使用其中一種技術重寫你的陣列迴圈。
+除了 for 和 while 迴圈,還有其他方式可以遍歷陣列,例如 [forEach](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)、[for-of](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for...of) 和 [map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map)。試著用這些技術之一重寫你的陣列迴圈。
-## 課後測驗
+## 課後測驗
[課後測驗](https://ff-quizzes.netlify.app/web/quiz/14)
## 複習與自學
-JavaScript 中的陣列附帶許多方法,這些方法對資料操作非常有用。[閱讀這些方法](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array),並嘗試在你自己設計的陣列上使用一些方法(例如 push、pop、slice 和 splice)。
+JavaScript 中的陣列有許多附加的方法,這些方法對於資料操作非常有用。[閱讀這些方法](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array),並嘗試在你創建的陣列上使用一些方法(例如 push、pop、slice 和 splice)。
## 作業
-[迴圈處理陣列](assignment.md)
+[遍歷陣列](assignment.md)
+
+---
**免責聲明**:
-本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/3-terrarium/1-intro-to-html/README.md b/translations/mo/3-terrarium/1-intro-to-html/README.md
index 40e2784e..8228c841 100644
--- a/translations/mo/3-terrarium/1-intro-to-html/README.md
+++ b/translations/mo/3-terrarium/1-intro-to-html/README.md
@@ -1,35 +1,35 @@
-# Terrarium 專案第一部分:HTML 簡介
+# Terrarium 專案第一部分:HTML 入門
-
+
> 手繪筆記由 [Tomomi Imura](https://twitter.com/girlie_mac) 提供
## 課前測驗
[課前測驗](https://ff-quizzes.netlify.app/web/quiz/15)
-> 查看影片
+> 觀看影片
>
> [](https://www.youtube.com/watch?v=1TvxJKBzhyQ)
### 簡介
-HTML,全名為超文本標記語言 (HyperText Markup Language),是網頁的「骨架」。如果說 CSS 是為 HTML「穿上衣服」,JavaScript 是讓它「活起來」,那麼 HTML 就是網頁應用的「身體」。HTML 的語法甚至反映了這個概念,因為它包含了「head」、「body」和「footer」等標籤。
+HTML,全名為超文本標記語言 (HyperText Markup Language),是網頁的「骨架」。如果說 CSS 是為 HTML「穿上衣服」,JavaScript 則是讓它「活起來」,那麼 HTML 就是網頁應用的「身體」。HTML 的語法甚至反映了這個概念,因為它包含了「head」、「body」和「footer」等標籤。
-在這堂課中,我們將使用 HTML 來設計我們虛擬玻璃花園介面的「骨架」。它將包含一個標題和三個欄位:左右兩側的欄位放置可拖曳的植物,中間的區域則是實際的玻璃花園。到本課結束時,你將能看到植物出現在欄位中,但介面可能看起來有點奇怪;別擔心,在下一節課中,你將使用 CSS 為介面添加樣式,使其更美觀。
+在這節課中,我們將使用 HTML 來設計虛擬玻璃花園介面的「骨架」。它將包含一個標題和三個欄位:左右兩側欄位放置可拖曳的植物,中間區域則是實際的玻璃花園。到本課結束時,你將能看到植物出現在欄位中,但介面看起來可能有點奇怪;別擔心,在下一節課中,我們會用 CSS 為介面添加樣式,使其更美觀。
### 任務
-在你的電腦上,建立一個名為 `terrarium` 的資料夾,並在其中建立一個名為 `index.html` 的檔案。你可以在 Visual Studio Code 中完成這個操作:打開一個新的 VS Code 視窗,點擊「開啟資料夾」,然後導航到你新建的資料夾。接著,在 Explorer 面板中點擊小的「檔案」按鈕,建立新檔案:
+在你的電腦上,建立一個名為 `terrarium` 的資料夾,並在其中建立一個名為 `index.html` 的檔案。你可以在 Visual Studio Code 中完成這個操作:打開一個新的 VS Code 視窗,點擊「打開資料夾」,然後導航到新建的資料夾。接著在 Explorer 面板中點擊小的「檔案」按鈕,建立新檔案:

@@ -47,11 +47,11 @@ HTML,全名為超文本標記語言 (HyperText Markup Language),是網頁的
## DocType 和 html 標籤
-HTML 檔案的第一行是它的 DocType。這行需要放在檔案的最頂端,雖然看起來有點奇怪,但它告訴舊版瀏覽器需要以標準模式渲染頁面,遵循當前的 HTML 規範。
+HTML 檔案的第一行是它的 DocType。這行必須位於檔案的最頂部,雖然看起來有些奇怪,但它告訴舊版瀏覽器需要以標準模式渲染頁面,遵循當前的 HTML 規範。
-> 提示:在 VS Code 中,你可以將滑鼠懸停在標籤上,查看來自 MDN 參考指南的相關資訊。
+> 提示:在 VS Code 中,你可以將滑鼠懸停在標籤上,從 MDN 參考指南中獲取有關其用途的資訊。
-第二行應該是 `` 標籤的開啟標籤,接著是它的關閉標籤 ``。這些標籤是你的介面的根元素。
+第二行應該是 `` 標籤的開啟標籤,接著是它的關閉標籤 ``。這些標籤是介面的根元素。
### 任務
@@ -62,19 +62,19 @@ HTML 檔案的第一行是它的 DocType。這行需要放在檔案的最頂端
```
-✅ DocType 可以通過查詢字串設定不同的模式:[Quirks Mode 和 Standards Mode](https://developer.mozilla.org/docs/Web/HTML/Quirks_Mode_and_Standards_Mode)。這些模式曾經用於支援非常舊的瀏覽器(如 Netscape Navigator 4 和 Internet Explorer 5),但現在已不常用。你可以堅持使用標準的 DocType 聲明。
+✅ DocType 可以通過查詢字串設定不同的模式:[Quirks Mode 和 Standards Mode](https://developer.mozilla.org/docs/Web/HTML/Quirks_Mode_and_Standards_Mode)。這些模式曾用於支援非常舊的瀏覽器(如 Netscape Navigator 4 和 Internet Explorer 5),但現在已不常用。你可以堅持使用標準的 DocType 聲明。
---
## 文件的 'head'
-HTML 文件的 'head' 區域包含關於網頁的重要資訊,也稱為 [metadata](https://developer.mozilla.org/docs/Web/HTML/Element/meta)。在我們的例子中,我們需要告訴網頁伺服器以下四件事:
+HTML 文件的 'head' 區域包含有關網頁的重要資訊,也稱為 [元數據](https://developer.mozilla.org/docs/Web/HTML/Element/meta)。在我們的例子中,我們告訴將渲染此頁面的網頁伺服器以下四件事:
- 頁面的標題
-- 頁面的元數據,包括:
+- 頁面元數據,包括:
- 字元集,告訴頁面使用的字元編碼
- 瀏覽器資訊,包括 `x-ua-compatible`,表示支援 IE=edge 瀏覽器
- - 關於視窗的行為資訊,設定視窗的初始縮放比例為 1,控制頁面首次加載時的縮放級別。
+ - 關於視窗載入時應如何行為的資訊。將視窗設定為初始縮放比例為 1,可以控制頁面首次載入時的縮放級別。
### 任務
@@ -89,7 +89,7 @@ HTML 文件的 'head' 區域包含關於網頁的重要資訊,也稱為 [metad
```
-✅ 如果你將視窗的 meta 標籤設置為這樣:`
`,會發生什麼?閱讀更多關於 [viewport](https://developer.mozilla.org/docs/Web/HTML/Viewport_meta_tag) 的資訊。
+✅ 如果你將視窗的 meta 標籤設置為這樣:`
`,會發生什麼?閱讀更多關於 [視窗](https://developer.mozilla.org/docs/Web/HTML/Viewport_meta_tag) 的資訊。
---
@@ -114,13 +114,13 @@ HTML 文件的 'head' 區域包含關於網頁的重要資訊,也稱為 [metad
```
-現在,你可以開始建立你的頁面了。通常,你會使用 `
` 標籤來建立頁面中的各個元素。我們將建立一系列的 `
` 元素來包含圖片。
+現在,你可以開始建立頁面了。通常,你會使用 `
` 標籤來建立頁面中的各個元素。我們將建立一系列的 `
` 元素來包含圖片。
### 圖片
有一個 HTML 標籤不需要關閉標籤,那就是 `
` 標籤,因為它有一個 `src` 屬性,包含頁面渲染該項目所需的所有資訊。
-在你的應用中建立一個名為 `images` 的資料夾,並將 [source code folder](../../../../3-terrarium/solution/images) 中的所有圖片添加到該資料夾中;(共有 14 張植物圖片)。
+在你的應用中建立一個名為 `images` 的資料夾,並將 [原始碼資料夾](../../../../3-terrarium/solution/images) 中的所有圖片添加到該資料夾中;(共有 14 張植物圖片)。
### 任務
@@ -177,29 +177,29 @@ HTML 文件的 'head' 區域包含關於網頁的重要資訊,也稱為 [metad
```
-> 注意:Spans vs. Divs。Divs 被認為是「區塊」元素,而 Spans 是「內聯」元素。如果你將這些 divs 轉換為 spans,會發生什麼?
+> 注意:Span 和 Div 的區別。Div 被認為是「區塊」元素,而 Span 是「內聯」元素。如果你將這些 div 轉換為 span,會發生什麼?
-通過這些標記,植物現在會顯示在螢幕上。看起來可能很糟,因為它們尚未使用 CSS 進行樣式設計,我們會在下一課中完成這部分。
+使用這些標記,植物現在會顯示在螢幕上。看起來可能很糟,因為它們尚未使用 CSS 進行樣式設計,我們會在下一節課中完成這部分。
-每張圖片都有替代文字 (alt text),即使你無法看到或渲染圖片時也會顯示。這是一個重要的屬性,有助於提升無障礙性。在未來的課程中,你將學到更多關於無障礙性的內容;目前請記住,alt 屬性為圖片提供了替代資訊,當使用者因某些原因無法查看圖片時(例如網速慢、src 屬性錯誤,或使用螢幕閱讀器)會顯示這些資訊。
+每張圖片都有替代文字,即使你無法看到或渲染圖片,這些文字也會顯示出來。這是一個重要的屬性,有助於提升無障礙性。在未來的課程中,我們會學習更多關於無障礙性的內容;目前請記住,alt 屬性為圖片提供了替代資訊,當使用者因某些原因無法查看圖片時(例如網速慢、src 屬性錯誤,或使用者使用螢幕閱讀器),這些資訊會顯示出來。
-✅ 你是否注意到每張圖片的 alt 標籤都是一樣的?這是好的做法嗎?為什麼?你能改進這段程式碼嗎?
+✅ 你是否注意到每張圖片都有相同的 alt 標籤?這是好的做法嗎?為什麼?你能改進這段程式碼嗎?
---
-## 語意化標記
+## 語義化標記
-一般來說,在撰寫 HTML 時,使用有意義的「語意化」標記是更好的做法。這意味著你應該使用 HTML 標籤來表示它們設計用於的數據或互動類型。例如,頁面上的主標題文字應該使用 `
` 標籤。
+一般來說,在撰寫 HTML 時,使用有意義的「語義」是更好的選擇。這意味著你應該使用 HTML 標籤來表示它們設計用於的數據或交互類型。例如,頁面上的主要標題文字應使用 `` 標籤。
-在你的開啟 `` 標籤下方添加以下內容:
+在開啟的 `` 標籤下方添加以下內容:
```html
My Terrarium
```
-使用語意化標記,例如將標題設為 ``,將無序列表渲染為 ``,有助於螢幕閱讀器更好地導航頁面。一般來說,按鈕應該寫為 ``,列表應該寫為 ``。雖然可以使用特別樣式的 `` 元素和點擊處理器來模仿按鈕,但對於使用輔助技術的使用者來說,這樣的做法可能會讓他們難以定位頁面上的按鈕並與之互動。因此,盡量使用語意化標記。
+使用語義化標記,例如將標題設為 ``,將無序列表渲染為 ``,有助於螢幕閱讀器導航頁面。一般來說,按鈕應該寫為 ``,列表應該是 ``。雖然可以使用特別樣式的 `` 元素和點擊處理器來模仿按鈕,但對於使用輔助技術的使用者來說,這樣的元素可能無法被正確識別為按鈕。因此,盡量使用語義化標記。
-✅ 看看螢幕閱讀器 [如何與網頁互動](https://www.youtube.com/watch?v=OUDV1gqs9GA)。你能理解為什麼非語意化標記可能會讓使用者感到沮喪嗎?
+✅ 看看螢幕閱讀器 [如何與網頁互動](https://www.youtube.com/watch?v=OUDV1gqs9GA)。你能理解為什麼非語義化標記可能會讓使用者感到沮喪嗎?
## 玻璃花園
@@ -221,7 +221,7 @@ HTML 文件的 'head' 區域包含關於網頁的重要資訊,也稱為 [metad
```
-✅ 即使你將這些標記添加到螢幕上,你卻什麼都看不到。為什麼?
+✅ 即使你將這些標記添加到螢幕上,你仍然看不到任何渲染。為什麼?
---
@@ -235,7 +235,7 @@ HTML 中有一些有趣的「舊」標籤,雖然你不應該在標記中使用
## 回顧與自學
-HTML 是構建網頁的「經典」基石系統,幫助網頁發展成今天的樣子。通過學習一些舊標籤和新標籤,了解它的歷史。你能找出為什麼某些標籤被棄用,而某些標籤被新增嗎?未來可能會引入哪些標籤?
+HTML 是構建網頁的「經典」基石系統,幫助網路發展成今天的樣子。通過學習一些舊標籤和新標籤,了解它的歷史。你能弄清楚為什麼某些標籤被棄用,而某些標籤被添加嗎?未來可能會引入哪些標籤?
了解更多關於為網頁和行動裝置建立網站的內容,請參考 [Microsoft Learn](https://docs.microsoft.com/learn/modules/build-simple-website/?WT.mc_id=academic-77807-sagibbon)。
@@ -243,5 +243,7 @@ HTML 是構建網頁的「經典」基石系統,幫助網頁發展成今天的
[練習你的 HTML:建立一個部落格模型](assignment.md)
+---
+
**免責聲明**:
-本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/3-terrarium/2-intro-to-css/README.md b/translations/mo/3-terrarium/2-intro-to-css/README.md
index e960e876..b85984be 100644
--- a/translations/mo/3-terrarium/2-intro-to-css/README.md
+++ b/translations/mo/3-terrarium/2-intro-to-css/README.md
@@ -1,16 +1,16 @@
-# Terrarium 專案第二部分:CSS 入門
+# Terrarium Project Part 2: CSS 簡介
-
-> 手繪筆記由 [Tomomi Imura](https://twitter.com/girlie_mac) 提供
+
+> [Tomomi Imura](https://twitter.com/girlie_mac) 的手繪筆記
## 課前測驗
@@ -18,15 +18,15 @@ CO_OP_TRANSLATOR_METADATA:
### 簡介
-CSS,全名為層疊樣式表(Cascading Style Sheets),解決了網頁開發中的一個重要問題:如何讓網站看起來更美觀。為應用程式設計樣式不僅能提升其可用性,還能讓其外觀更吸引人;此外,CSS 還能用於創建響應式網頁設計(Responsive Web Design, RWD),確保應用程式在不同螢幕尺寸下都能有良好的顯示效果。CSS 不僅僅是讓應用程式看起來更美觀,其規範還包括動畫和變形功能,能為應用程式實現更複雜的互動效果。CSS 工作組負責維護當前的 CSS 規範,您可以在 [World Wide Web Consortium 的網站](https://www.w3.org/Style/CSS/members)上關注他們的工作。
+CSS,全名為層疊樣式表(Cascading Style Sheets),解決了網頁開發中的一個重要問題:如何讓你的網站看起來更美觀。為應用程式設計樣式可以讓它們更易於使用且更具吸引力;此外,你還可以使用 CSS 來創建響應式網頁設計(Responsive Web Design,RWD),使你的應用程式在任何螢幕尺寸下都能保持良好的外觀。CSS 不僅僅是讓你的應用程式看起來漂亮,它的規範還包括動畫和變形功能,能夠為你的應用程式提供更複雜的互動效果。CSS 工作小組負責維護最新的 CSS 規範,你可以在 [World Wide Web Consortium 的網站](https://www.w3.org/Style/CSS/members)上關注他們的工作。
-> 注意,CSS 是一種不斷演進的語言,就像網路上的其他技術一樣,並非所有瀏覽器都支援最新的規範部分。請隨時參考 [CanIUse.com](https://caniuse.com) 來檢查您的實現。
+> 注意,CSS 是一種不斷演進的語言,就像網頁上的所有事物一樣,並非所有瀏覽器都支援最新的規範部分。請隨時透過 [CanIUse.com](https://caniuse.com) 檢查你的實現。
-在本課程中,我們將為線上植物箱添加樣式,並學習多個 CSS 概念:層疊、繼承、選擇器的使用、定位以及如何使用 CSS 建立佈局。在此過程中,我們將設計植物箱的佈局,並創建實際的植物箱。
+在本課程中,我們將為線上植物箱添加樣式,並深入了解幾個 CSS 概念:層疊、繼承,以及選擇器的使用、定位和使用 CSS 建立佈局。在此過程中,我們將設計植物箱的佈局並創建實際的植物箱。
### 先決條件
-您應該已經完成植物箱的 HTML 結構,並準備好進行樣式設計。
+你應該已經完成了植物箱的 HTML,並準備好進行樣式設計。
> 查看影片
@@ -35,7 +35,7 @@ CSS,全名為層疊樣式表(Cascading Style Sheets),解決了網頁開
### 任務
-在您的植物箱資料夾中,創建一個名為 `style.css` 的新檔案。將該檔案匯入到 `` 區域中:
+在你的植物箱資料夾中,創建一個名為 `style.css` 的新檔案。將該檔案導入到 `` 部分:
```html
@@ -43,19 +43,19 @@ CSS,全名為層疊樣式表(Cascading Style Sheets),解決了網頁開
---
-## 層疊(Cascade)
+## 層疊
-層疊樣式表的核心概念是樣式的應用具有優先級,樣式會根據其優先級進行應用。由網站作者設定的樣式優先於瀏覽器設定的樣式,而內聯樣式的優先級高於外部樣式表中的樣式。
+層疊樣式表的核心理念是樣式會「層疊」,因此樣式的應用是由其優先級決定的。由網站作者設置的樣式優先於瀏覽器設置的樣式。內聯樣式的優先級高於外部樣式表中的樣式。
### 任務
-為 `
` 標籤添加內聯樣式 "color: red":
+為你的 `` 標籤添加內聯樣式 "color: red":
```HTML
My Terrarium
```
-然後,將以下程式碼添加到您的 `style.css` 檔案中:
+然後,將以下代碼添加到你的 `style.css` 檔案中:
```CSS
h1 {
@@ -63,13 +63,13 @@ h1 {
}
```
-✅ 您的網頁應用程式中顯示了哪種顏色?為什麼?您能找到覆蓋樣式的方法嗎?什麼情況下您會想這麼做,或者不想這麼做?
+✅ 你的網頁應用程式中顯示了哪種顏色?為什麼?你能找到覆蓋樣式的方法嗎?什麼情況下你會想要這樣做,或者不這樣做?
---
-## 繼承(Inheritance)
+## 繼承
-樣式會從祖先元素繼承到後代元素,嵌套的元素會繼承其父元素的樣式。
+樣式可以從祖先元素繼承到後代元素,嵌套的元素會繼承其父元素的樣式。
### 任務
@@ -81,11 +81,11 @@ body {
}
```
-打開瀏覽器的控制台,進入 "Elements" 標籤,觀察 H1 的字體。它繼承了 body 的字體,這在瀏覽器中已明確指出:
+打開瀏覽器的控制台,進入「元素」標籤,觀察 H1 的字體。它繼承了 body 的字體,這在瀏覽器中已明確指出:

-✅ 您能讓嵌套樣式繼承不同的屬性嗎?
+✅ 你能讓嵌套樣式繼承不同的屬性嗎?
---
@@ -93,7 +93,7 @@ body {
### 標籤
-目前,您的 `style.css` 檔案中僅對少數標籤進行了樣式設計,應用程式看起來可能有些奇怪:
+到目前為止,你的 `style.css` 檔案只設置了少量標籤樣式,應用程式看起來有些奇怪:
```CSS
body {
@@ -106,11 +106,11 @@ h1 {
}
```
-這種為標籤設計樣式的方法能讓您控制獨特的元素,但如果您需要控制植物箱中多個植物的樣式,就需要利用 CSS 選擇器。
+這種設置標籤樣式的方法可以控制獨特的元素,但你需要控制植物箱中許多植物的樣式。為此,你需要利用 CSS 選擇器。
### Ids
-為左側和右側容器添加一些樣式。由於標記中只有一個左側容器和一個右側容器,因此它們被賦予了 id。要設計它們,可以使用 `#`:
+為左側和右側容器添加一些樣式。由於標記中只有一個左側容器和一個右側容器,它們被分配了 id。要設置它們的樣式,使用 `#`:
```CSS
#left-container {
@@ -134,9 +134,9 @@ h1 {
}
```
-在這裡,您使用絕對定位將這些容器放置在螢幕的最左側和最右側,並使用百分比設置其寬度,以便它們能適應小型行動裝置的螢幕。
+在這裡,你使用了絕對定位將這些容器放置在螢幕的最左側和最右側,並使用百分比設置它們的寬度,以便它們可以適應小型行動裝置螢幕。
-✅ 這段程式碼有些重複,因此不符合 "DRY"(Don't Repeat Yourself)的原則;您能找到更好的方法來設計這些 id 嗎?也許可以結合 id 和 class?您需要更改標記並重構 CSS:
+✅ 這段代碼重複性很高,因此不符合「DRY」(Don't Repeat Yourself,不要重複自己)的原則;你能找到更好的方法來設置這些 id 的樣式嗎?或許可以使用 id 和 class 的組合?你需要更改標記並重構 CSS:
```html
@@ -144,9 +144,9 @@ h1 {
### Classes
-在上述範例中,您設計了螢幕上的兩個獨特元素。如果您希望樣式應用於螢幕上的多個元素,可以使用 CSS 類別。對左側和右側容器中的植物進行佈局設計。
+在上述範例中,你設置了螢幕上的兩個獨特元素的樣式。如果你希望樣式應用於螢幕上的多個元素,可以使用 CSS 類別。為左側和右側容器中的植物設置樣式。
-注意,HTML 標記中的每個植物都有 id 和 class 的組合。這裡的 id 是供稍後添加的 JavaScript 使用,用於操作植物箱中的植物位置。而 class 則為所有植物提供了統一的樣式。
+注意,HTML 標記中的每個植物都有 id 和 class 的組合。id 在這裡是供稍後添加的 JavaScript 使用,用於操作植物箱中的植物位置。而 class 則為所有植物提供了統一的樣式。
```html
@@ -154,7 +154,7 @@ h1 {
```
-將以下內容添加到您的 `style.css` 檔案中:
+將以下代碼添加到你的 `style.css` 檔案中:
```CSS
.plant-holder {
@@ -171,37 +171,37 @@ h1 {
}
```
-在這段程式碼中,值得注意的是相對定位和絕對定位的混合使用,我們將在下一節中詳細介紹。請注意高度是如何以百分比處理的:
+此代碼片段中值得注意的是相對定位和絕對定位的混合使用,我們將在下一節中進一步探討。請查看高度如何以百分比處理:
-您將植物容器的高度設置為 13%,這是一個適合的數值,確保所有植物都能顯示在每個垂直容器中,而無需滾動。
+你將植物容器的高度設置為 13%,這是一個不錯的數值,確保所有植物都能顯示在每個垂直容器中而無需滾動。
-您將植物容器向左移動,使植物在其容器中更居中。由於圖片有大量透明背景以便於拖動,因此需要向左移動以更好地適應螢幕。
+你將植物容器向左移動,使植物在容器中更居中。圖片有大量透明背景,這樣可以使它們更易於拖動,因此需要向左移動以更好地適應螢幕。
-然後,植物本身的最大寬度設置為 150%。這使得它能隨著瀏覽器縮小而縮小。嘗試調整瀏覽器大小,植物會保持在容器內,但會縮小以適應。
+然後,植物本身的最大寬度設置為 150%。這使得它可以隨瀏覽器縮小而縮小。嘗試調整瀏覽器大小,植物會保持在容器中,但會縮小以適應。
-還值得注意的是 z-index 的使用,它控制元素的相對高度(使植物位於容器之上,看起來像是放置在植物箱內)。
+另一個值得注意的是 z-index 的使用,它控制元素的相對高度(使植物位於容器之上,看起來像是放置在植物箱內)。
✅ 為什麼需要同時使用植物容器和植物的 CSS 選擇器?
## CSS 定位
-混合使用定位屬性(包括 static、relative、fixed、absolute 和 sticky 定位)可能有些棘手,但如果使用得當,能很好地控制頁面上的元素。
+混合使用定位屬性(包括 static、relative、fixed、absolute 和 sticky 定位)可能有些棘手,但如果使用得當,可以很好地控制頁面上的元素。
-絕對定位的元素是相對於其最近的已定位祖先進行定位的,如果沒有已定位的祖先,則相對於文件的 body 進行定位。
+絕對定位的元素是相對於其最近的定位祖先進行定位的,如果沒有定位祖先,則相對於文檔的 body 進行定位。
-相對定位的元素是根據 CSS 指定的方向,從其初始位置進行調整。
+相對定位的元素是根據 CSS 的指示,從其初始位置調整其位置。
-在我們的範例中,`plant-holder` 是一個相對定位的元素,位於一個絕對定位的容器內。其結果是側邊欄容器被固定在左側和右側,而 plant-holder 則嵌套在側邊欄內,調整自身位置以在側邊欄內垂直排列植物。
+在我們的範例中,`plant-holder` 是一個相對定位的元素,位於一個絕對定位的容器內。其結果是側邊欄容器被固定在左側和右側,而 `plant-holder` 則嵌套在側邊欄內,調整自身位置以在側邊欄內垂直排列植物。
-> `plant` 本身也使用了絕對定位,這是使其可拖動的必要條件,您將在下一課中了解更多。
+> 植物本身也使用了絕對定位,這是使其可拖動的必要條件,你將在下一課中了解更多。
-✅ 嘗試切換側邊容器和 plant-holder 的定位類型。會發生什麼?
+✅ 嘗試切換側邊容器和植物容器的定位類型。會發生什麼?
## CSS 佈局
-現在,您將使用所學內容,完全使用 CSS 建立植物箱本身!
+現在你將使用所學知識,完全使用 CSS 建立植物箱本身!
-首先,使用 CSS 將 `.terrarium` div 的子元素設計為圓角矩形:
+首先,使用 CSS 將 `.terrarium` div 的子元素設置為圓角矩形:
```CSS
.jar-walls {
@@ -250,9 +250,9 @@ h1 {
}
```
-注意這裡使用了百分比。如果您縮小瀏覽器,您可以看到植物箱也會縮放。此外,請注意植物箱元素的寬度和高度百分比,以及每個元素如何絕對定位在中心,並固定在視窗底部。
+注意此處使用的百分比。如果你縮小瀏覽器,可以看到植物箱也會縮小。還請注意植物箱元素的寬度和高度百分比,以及每個元素如何絕對定位在中心,固定在視窗底部。
-我們還使用了 `rem` 作為圓角半徑的單位,這是一種相對於字體的長度單位。可以在 [CSS 規範](https://www.w3.org/TR/css-values-3/#font-relative-lengths) 中了解更多關於這種類型的相對測量。
+我們還使用了 `rem` 作為邊框半徑的單位,這是一種相對於字體的長度。可以在 [CSS 規範](https://www.w3.org/TR/css-values-3/#font-relative-lengths) 中了解更多關於這種類型的相對測量。
✅ 嘗試更改植物箱的顏色和透明度與泥土的顏色和透明度。會發生什麼?為什麼?
@@ -260,11 +260,11 @@ h1 {
## 🚀挑戰
-為植物箱的左下角添加一個 "氣泡" 光澤,使其看起來更像玻璃。您將設計 `.jar-glossy-long` 和 `.jar-glossy-short`,使其看起來像反射的光澤。完成後效果如下:
+在植物箱的左下角添加一個「氣泡」光澤,使其看起來更像玻璃。你將設置 `.jar-glossy-long` 和 `.jar-glossy-short` 的樣式,使其看起來像反射的光澤。以下是完成後的效果:

-完成課後測驗,請參考此學習模組:[使用 CSS 為 HTML 應用程式設計樣式](https://docs.microsoft.com/learn/modules/build-simple-website/4-css-basics/?WT.mc_id=academic-77807-sagibbon)
+要完成課後測驗,請參考以下 Learn 模組:[使用 CSS 為 HTML 應用程式設計樣式](https://docs.microsoft.com/learn/modules/build-simple-website/4-css-basics/?WT.mc_id=academic-77807-sagibbon)
## 課後測驗
@@ -272,11 +272,13 @@ h1 {
## 回顧與自學
-CSS 看似簡單,但要為所有瀏覽器和螢幕尺寸完美設計應用程式樣式,仍然面臨許多挑戰。CSS-Grid 和 Flexbox 是為了讓這項工作更結構化、更可靠而開發的工具。通過玩 [Flexbox Froggy](https://flexboxfroggy.com/) 和 [Grid Garden](https://codepip.com/games/grid-garden/) 來學習這些工具。
+CSS 看似簡單,但在嘗試為所有瀏覽器和所有螢幕尺寸完美設計應用程式時,會面臨許多挑戰。CSS-Grid 和 Flexbox 是為了使工作更結構化、更可靠而開發的工具。通過玩 [Flexbox Froggy](https://flexboxfroggy.com/) 和 [Grid Garden](https://codepip.com/games/grid-garden/) 來學習這些工具。
## 作業
[CSS 重構](assignment.md)
+---
+
**免責聲明**:
-本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/3-terrarium/3-intro-to-DOM-and-closures/README.md b/translations/mo/3-terrarium/3-intro-to-DOM-and-closures/README.md
index 47bf5962..df77a64a 100644
--- a/translations/mo/3-terrarium/3-intro-to-DOM-and-closures/README.md
+++ b/translations/mo/3-terrarium/3-intro-to-DOM-and-closures/README.md
@@ -1,16 +1,16 @@
# Terrarium 專案第 3 部分:DOM 操作與閉包
-
-> 手繪筆記由 [Tomomi Imura](https://twitter.com/girlie_mac) 提供
+
+> 插圖由 [Tomomi Imura](https://twitter.com/girlie_mac) 提供
## 課前測驗
@@ -18,40 +18,41 @@ CO_OP_TRANSLATOR_METADATA:
### 簡介
-操作 DOM(文件物件模型)是網頁開發中的一個關鍵部分。根據 [MDN](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction) 的說法:「文件物件模型 (DOM) 是網頁上構成文件結構和內容的物件的數據表示形式。」由於操作 DOM 的挑戰,開發者經常選擇使用 JavaScript 框架來管理 DOM,而不是使用原生 JavaScript,但我們將嘗試自己來完成!
+操作 DOM(文件物件模型)是網頁開發中的一個關鍵部分。根據 [MDN](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction) 的說法:「文件物件模型 (DOM) 是構成網頁文件結構和內容的物件的數據表示形式。」網頁上的 DOM 操作挑戰通常是使用 JavaScript 框架而非原生 JavaScript 來管理 DOM 的原因,但我們將嘗試自己完成!
-此外,本課程將介紹 [JavaScript 閉包](https://developer.mozilla.org/docs/Web/JavaScript/Closures) 的概念。你可以將閉包想像成一個被另一個函數包裹的函數,這樣內部函數就可以訪問外部函數的作用域。
+此外,本課程將介紹 [JavaScript 閉包](https://developer.mozilla.org/docs/Web/JavaScript/Closures) 的概念。你可以將閉包視為一個被另一個函數包裹的函數,這樣內部函數就可以訪問外部函數的作用域。
-> JavaScript 閉包是一個廣泛且複雜的主題。本課程僅涉及最基本的概念。在這個 terrarium 的代碼中,你會發現一個閉包:一個內部函數和一個外部函數的結構,允許內部函數訪問外部函數的作用域。想了解更多細節,請參考 [詳細文檔](https://developer.mozilla.org/docs/Web/JavaScript/Closures)。
+> JavaScript 閉包是一個廣泛且複雜的主題。本課程僅涉及最基本的概念。在這個 terrarium 的程式碼中,你會發現一個閉包:一個內部函數和一個外部函數的結構,允許內部函數訪問外部函數的作用域。想了解更多細節,請參考 [詳細文檔](https://developer.mozilla.org/docs/Web/JavaScript/Closures)。
我們將使用閉包來操作 DOM。
-可以將 DOM 想像成一棵樹,代表了網頁文件可以被操作的所有方式。各種 API(應用程式介面)被設計出來,讓程式員可以使用他們選擇的程式語言來訪問 DOM,並進行編輯、修改、重組或其他管理操作。
+可以將 DOM 想像成一棵樹,代表了網頁文件可以被操作的所有方式。各種 API(應用程式介面)被設計出來,讓程式員可以使用他們選擇的程式語言來訪問 DOM,並進行編輯、更改、重新排列或其他管理操作。
-
+
> DOM 和其對應的 HTML 標記的表示圖。來源:[Olfa Nasraoui](https://www.researchgate.net/publication/221417012_Profile-Based_Focused_Crawler_for_Social_Media-Sharing_Websites)
-在本課程中,我們將完成互動式 terrarium 專案,通過創建 JavaScript 代碼,讓用戶可以操作頁面上的植物。
+在本課程中,我們將完成互動式 terrarium 專案,通過創建 JavaScript 來讓使用者能夠操作頁面上的植物。
### 前置條件
-你應該已經完成了 terrarium 的 HTML 和 CSS 部分。在本課程結束時,你將能夠通過拖動將植物移入或移出 terrarium。
+你應該已經完成了 terrarium 的 HTML 和 CSS。到本課程結束時,你將能夠通過拖動將植物移入或移出 terrarium。
### 任務
-在你的 terrarium 資料夾中,創建一個名為 `script.js` 的新文件。在 `` 區域中引入該文件:
+在你的 terrarium 資料夾中,創建一個名為 `script.js` 的新檔案。在 `` 區域中匯入該檔案:
```html
```
-> 注意:在將外部 JavaScript 文件引入 HTML 文件時,使用 `defer` 屬性,這樣可以確保 JavaScript 在 HTML 文件完全加載後執行。你也可以使用 `async` 屬性,允許腳本在 HTML 文件解析時執行,但在我們的情況下,必須確保 HTML 元素在拖動腳本執行前已完全可用。
+> 注意:在將外部 JavaScript 檔案匯入 HTML 時,使用 `defer` 屬性,這樣可以確保 JavaScript 在 HTML 完全加載後才執行。你也可以使用 `async` 屬性,這允許腳本在 HTML 解析時執行,但在我們的情況下,重要的是在執行拖動腳本之前,HTML 元素必須完全可用。
+
---
## DOM 元素
-首先,你需要在 DOM 中創建對你想操作的元素的引用。在我們的例子中,這些是目前位於側邊欄的 14 個植物。
+首先,你需要在 DOM 中創建對你想操作的元素的引用。在我們的例子中,它們是目前位於側邊欄的 14 個植物。
### 任務
@@ -72,7 +73,7 @@ dragElement(document.getElementById('plant13'));
dragElement(document.getElementById('plant14'));
```
-這裡發生了什麼?你正在引用文件,並在其 DOM 中查找具有特定 Id 的元素。還記得我們在 HTML 課程中給每個植物圖片分配了唯一的 Id(例如 `id="plant1"`)嗎?現在你將利用這一點。在識別每個元素後,你將該項目傳遞給一個名為 `dragElement` 的函數(稍後會構建)。因此,HTML 中的元素現在可以被拖動,或者即將可以被拖動。
+這裡發生了什麼?你正在引用文件並在其 DOM 中查找具有特定 Id 的元素。還記得我們在 HTML 課程中給每個植物圖片分配了唯一的 Id (`id="plant1"`) 嗎?現在你將利用這一點。在識別每個元素後,你將該項目傳遞給一個名為 `dragElement` 的函數,稍後你將構建該函數。這樣,HTML 中的元素現在就具備了拖動功能,或者很快就會具備。
✅ 為什麼我們通過 Id 引用元素?為什麼不通過它們的 CSS 類名?你可以回顧之前的 CSS 課程來回答這個問題。
@@ -80,7 +81,7 @@ dragElement(document.getElementById('plant14'));
## 閉包
-現在你準備創建 `dragElement` 閉包,這是一個外部函數,包裹了一個或多個內部函數(在我們的例子中是三個)。
+現在你準備創建 `dragElement` 閉包了,這是一個外部函數,包裹了一個或多個內部函數(在我們的例子中,我們將有三個)。
當一個或多個函數需要訪問外部函數的作用域時,閉包非常有用。以下是一個例子:
@@ -96,9 +97,9 @@ displayCandy();
console.log(candy)
```
-在這個例子中,`displayCandy` 函數包裹了一個函數,該函數將新的糖果類型推入已存在於函數中的數組。如果你運行這段代碼,`candy` 數組將是未定義的,因為它是一個局部變量(局限於閉包)。
+在這個例子中,`displayCandy` 函數包裹了一個函數,該函數將新的糖果類型推入已存在於函數中的陣列。如果你運行這段程式碼,`candy` 陣列將是未定義的,因為它是一個局部變數(局限於閉包內部)。
-✅ 如何讓 `candy` 數組可訪問?試著將它移到閉包之外。這樣,數組就變成了全域變量,而不是僅限於閉包的局部作用域。
+✅ 如何讓 `candy` 陣列可訪問?試著將它移到閉包外部。這樣,該陣列就變成了全域變數,而不僅僅是閉包的局部作用域。
### 任務
@@ -115,19 +116,19 @@ function dragElement(terrariumElement) {
}
```
-`dragElement` 從腳本頂部的聲明中獲取其 `terrariumElement` 對象。然後,你為傳遞給函數的對象設置了一些初始位置為 `0` 的局部變量。這些是每個元素的局部變量,當你為每個元素添加拖放功能時,這些變量將被操作。這些被拖動的元素將填充 terrarium,因此應用程式需要跟蹤它們的位置。
+`dragElement` 從腳本頂部的聲明中獲取其 `terrariumElement` 物件。然後,你為傳遞給函數的物件設置了一些初始位置為 `0` 的局部變數。這些是每個元素的局部變數,當你為每個元素添加拖放功能時,這些變數將被操作。這些被拖動的元素將填充 terrarium,因此應用程式需要跟蹤它們的位置。
-此外,傳遞給此函數的 `terrariumElement` 被分配了一個 `pointerdown` 事件,這是 [web API](https://developer.mozilla.org/docs/Web/API) 的一部分,旨在幫助管理 DOM。`onpointerdown` 事件在按下按鈕時觸發,或者在我們的例子中,當可拖動的元素被觸碰時觸發。此事件處理器適用於 [網頁和移動瀏覽器](https://caniuse.com/?search=onpointerdown),但有少數例外。
+此外,傳遞給此函數的 `terrariumElement` 被分配了一個 `pointerdown` 事件,這是 [web API](https://developer.mozilla.org/docs/Web/API) 的一部分,旨在幫助管理 DOM。`onpointerdown` 事件在按下按鈕時觸發,或者在我們的例子中,當觸摸可拖動的元素時觸發。此事件處理器適用於 [網頁和行動瀏覽器](https://caniuse.com/?search=onpointerdown),但有少數例外。
-✅ [事件處理器 `onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick) 在跨瀏覽器中有更廣泛的支持;為什麼不在這裡使用它?想一想你試圖創建的精確屏幕交互類型。
+✅ [事件處理器 `onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick) 在跨瀏覽器中有更廣泛的支援;為什麼不在這裡使用它?想一想你試圖創建的精確螢幕互動類型。
---
## Pointerdrag 函數
-`terrariumElement` 現在可以被拖動;當觸發 `onpointerdown` 事件時,函數 `pointerDrag` 被調用。在這行代碼下方添加該函數:`terrariumElement.onpointerdown = pointerDrag;`:
+`terrariumElement` 現在可以被拖動了;當觸發 `onpointerdown` 事件時,函數 `pointerDrag` 被調用。在這行代碼下方添加該函數:`terrariumElement.onpointerdown = pointerDrag;`:
-### 任務
+### 任務
```javascript
function pointerDrag(e) {
@@ -138,32 +139,32 @@ function pointerDrag(e) {
}
```
-這裡發生了幾件事。首先,你通過使用 `e.preventDefault();` 阻止了 pointerdown 事件的默認行為發生。這樣你可以更好地控制界面的行為。
+這裡發生了幾件事。首先,你使用 `e.preventDefault();` 防止在 pointerdown 上通常發生的默認事件。這樣你可以更好地控制介面的行為。
-> 當你完全構建腳本文件後,回到這行代碼並嘗試刪除 `e.preventDefault()`——會發生什麼?
+> 當你完全構建了腳本檔案後,回到這行代碼並嘗試不使用 `e.preventDefault()`——會發生什麼?
-其次,在瀏覽器窗口中打開 `index.html`,並檢查界面。當你點擊一個植物時,你可以看到如何捕獲 'e' 事件。深入研究該事件,看看一次 pointerdown 事件可以收集多少信息!
+其次,在瀏覽器窗口中打開 `index.html`,並檢查介面。當你點擊一個植物時,你可以看到如何捕獲 'e' 事件。深入研究該事件,看看一次 pointerdown 事件可以收集多少信息!
-接下來,注意如何將局部變量 `pos3` 和 `pos4` 設置為 e.clientX。你可以在檢查面板中找到 `e` 的值。這些值捕獲了你點擊或觸碰植物時的 x 和 y 坐標。你需要對植物的行為進行精細控制,因此需要跟蹤它們的坐標。
+接下來,注意如何將局部變數 `pos3` 和 `pos4` 設置為 e.clientX。你可以在檢查面板中找到 `e` 的值。這些值捕獲了你點擊或觸摸植物時的 x 和 y 座標。你需要對植物的行為進行精細控制,因此你需要跟蹤它們的座標。
✅ 現在是否更清楚為什麼整個應用程式是用一個大的閉包構建的?如果不是閉包,你將如何為 14 個可拖動的植物維持作用域?
-完成初始函數,通過在 `pos4 = e.clientY` 下添加兩個指針事件操作:
+完成初始函數,通過在 `pos4 = e.clientY` 下添加另外兩個指針事件操作:
```html
document.onpointermove = elementDrag;
document.onpointerup = stopElementDrag;
```
-現在你正在指示植物隨著指針的移動而被拖動,並在取消選擇植物時停止拖動手勢。`onpointermove` 和 `onpointerup` 都是與 `onpointerdown` 相同 API 的一部分。界面現在會拋出錯誤,因為你尚未定義 `elementDrag` 和 `stopElementDrag` 函數,因此接下來構建它們。
+現在你正在指示希望植物隨著指針的移動而被拖動,並在取消選擇植物時停止拖動手勢。`onpointermove` 和 `onpointerup` 都是與 `onpointerdown` 相同 API 的一部分。介面現在會拋出錯誤,因為你尚未定義 `elementDrag` 和 `stopElementDrag` 函數,因此接下來構建它們。
## elementDrag 和 stopElementDrag 函數
-你將通過添加兩個內部函數來完成閉包,這些函數將處理拖動植物和停止拖動時的行為。你希望的行為是,隨時可以拖動任何植物,並將其放置在屏幕上的任何位置。這個界面非常靈活(例如,沒有放置區域),允許你自由設計 terrarium,添加、移除和重新定位植物。
+你將通過添加另外兩個內部函數來完成閉包,這些函數將處理拖動植物和停止拖動時發生的事情。你希望的行為是,隨時可以拖動任何植物,並將其放置在螢幕上的任何位置。這個介面非常靈活(例如,沒有放置區域),允許你通過添加、移除和重新定位植物來自由設計你的 terrarium。
### 任務
-在 `pointerDrag` 的閉合大括號後添加 `elementDrag` 函數:
+在 `pointerDrag` 的結束大括號後添加 `elementDrag` 函數:
```javascript
function elementDrag(e) {
@@ -177,17 +178,17 @@ function elementDrag(e) {
}
```
-在這個函數中,你對最初設置為局部變量的 `pos1` 到 `pos4` 進行了大量編輯。這裡發生了什麼?
+在這個函數中,你對先前在外部函數中設置的初始位置 1-4 進行了大量編輯。這裡發生了什麼?
-當你拖動時,你通過將 `pos3`(之前設置為 `e.clientX`)減去當前的 `e.clientX` 值來重新分配 `pos1`。對 `pos2` 進行了類似的操作。然後,你將 `pos3` 和 `pos4` 重置為元素的新 X 和 Y 坐標。你可以在拖動時在控制台中觀察這些變化。接著,你操作植物的 CSS 樣式,根據這些新位置計算植物的頂部和左側 X 和 Y 坐標,並設置其新位置。
+當你拖動時,你通過將 `pos3`(之前設置為 `e.clientX`)減去當前的 `e.clientX` 值來重新分配 `pos1`。對 `pos2` 進行了類似的操作。然後,你將 `pos3` 和 `pos4` 重置為元素的新 X 和 Y 座標。你可以在拖動時在控制台中觀察這些變化。接著,你操作植物的 CSS 樣式,根據這些新位置計算植物的頂部和左側 X 和 Y 座標,並設置其新位置。
> `offsetTop` 和 `offsetLeft` 是 CSS 屬性,用於根據其父元素設置元素的位置;其父元素可以是任何非靜態定位的元素。
所有這些位置的重新計算允許你微調 terrarium 和其植物的行為。
-### 任務
+### 任務
-最後的任務是,在 `elementDrag` 的閉合大括號後添加 `stopElementDrag` 函數:
+完成介面的最後一步是在 `elementDrag` 的結束大括號後添加 `stopElementDrag` 函數:
```javascript
function stopElementDrag() {
@@ -198,11 +199,11 @@ function stopElementDrag() {
這個小函數重置了 `onpointerup` 和 `onpointermove` 事件,這樣你可以重新開始拖動植物,或者開始拖動新的植物。
-✅ 如果你不將這些事件設置為 null,會發生什麼?
+✅ 如果不將這些事件設置為 null,會發生什麼?
現在你已經完成了你的專案!
-🥇恭喜!你已經完成了美麗的 terrarium! 
+🥇恭喜!你完成了美麗的 terrarium!
---
@@ -214,17 +215,19 @@ function stopElementDrag() {
[課後測驗](https://ff-quizzes.netlify.app/web/quiz/20)
-## 回顧與自學
+## 複習與自學
-雖然在屏幕上拖動元素看起來很簡單,但有許多方法可以實現,並且根據你想要的效果,可能會遇到許多陷阱。事實上,有一個完整的 [拖放 API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API) 可以嘗試。我們在本模組中沒有使用它,因為我們想要的效果有些不同,但你可以在自己的專案中嘗試這個 API,看看能實現什麼。
+雖然在螢幕上拖動元素看起來很簡單,但根據你想要的效果,有很多種方法可以實現,並且有許多潛在的陷阱。事實上,有一整個 [拖放 API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API) 可以嘗試。我們在本模組中沒有使用它,因為我們想要的效果有些不同,但你可以在自己的專案中嘗試這個 API,看看能實現什麼。
在 [W3C 文檔](https://www.w3.org/TR/pointerevents1/) 和 [MDN 網頁文檔](https://developer.mozilla.org/docs/Web/API/Pointer_events) 上找到更多關於指針事件的信息。
-始終使用 [CanIUse.com](https://caniuse.com/) 檢查瀏覽器的兼容性。
+始終使用 [CanIUse.com](https://caniuse.com/) 檢查瀏覽器的功能。
## 作業
[進一步操作 DOM](assignment.md)
+---
+
**免責聲明**:
-本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/4-typing-game/typing-game/README.md b/translations/mo/4-typing-game/typing-game/README.md
index 00e8c961..4cd97d46 100644
--- a/translations/mo/4-typing-game/typing-game/README.md
+++ b/translations/mo/4-typing-game/typing-game/README.md
@@ -1,56 +1,56 @@
-# 使用事件建立遊戲
+# 使用事件創建遊戲
## 課前測驗
[課前測驗](https://ff-quizzes.netlify.app/web/quiz/21)
-## 事件驅動程式設計
+## 事件驅動編程
-在建立基於瀏覽器的應用程式時,我們會提供一個圖形使用者介面(GUI),讓使用者能夠與我們所建立的內容互動。使用者與瀏覽器互動最常見的方式是透過點擊和在各種元素中輸入文字。作為開發者,我們面臨的挑戰是無法預測使用者何時會執行這些操作!
+在創建基於瀏覽器的應用程式時,我們會提供一個圖形用戶介面(GUI),讓用戶在與我們構建的內容互動時使用。與瀏覽器互動最常見的方式是點擊和在各種元素中輸入文字。作為開發者,我們面臨的挑戰是,我們不知道用戶什麼時候會執行這些操作!
-[事件驅動程式設計](https://en.wikipedia.org/wiki/Event-driven_programming) 是我們需要用來建立 GUI 的程式設計方式。如果我們稍微拆解這個詞語,核心詞是 **事件**。根據 Merriam-Webster 的定義,[事件](https://www.merriam-webster.com/dictionary/event) 是指「某件事情發生」。這完美地描述了我們的情況。我們知道某件事情會發生,而我們希望執行一些程式碼來回應,但我們不知道它會在什麼時候發生。
+[事件驅動編程](https://en.wikipedia.org/wiki/Event-driven_programming) 是我們需要用來創建 GUI 的編程類型。如果我們稍微拆解這個詞組,會發現核心詞是 **事件**。根據 Merriam-Webster 的定義,[事件](https://www.merriam-webster.com/dictionary/event) 是指「某件發生的事情」。這完美地描述了我們的情況。我們知道會有某些事情發生,我們希望在這些事情發生時執行一些程式碼,但我們不知道它們會在什麼時候發生。
-我們標記希望執行的程式碼區段的方法是建立一個函數。在 [程序式程式設計](https://en.wikipedia.org/wiki/Procedural_programming) 中,函數會按照特定順序被呼叫。在事件驅動程式設計中也是如此,但不同之處在於 **函數如何被呼叫**。
+我們通過創建函數來標記我們希望執行的程式碼部分。在 [程序式編程](https://en.wikipedia.org/wiki/Procedural_programming) 中,函數是按照特定順序調用的。在事件驅動編程中也是如此,不同之處在於函數的調用方式。
-為了處理事件(例如按鈕點擊、輸入文字等),我們需要註冊 **事件監聽器**。事件監聽器是一個函數,負責監聽事件的發生並執行相應的操作。事件監聽器可以更新 UI、向伺服器發送請求,或執行其他需要回應使用者操作的任務。我們可以使用 [addEventListener](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) 並提供一個函數來添加事件監聽器。
+為了處理事件(如按鈕點擊、輸入等),我們需要註冊 **事件監聽器**。事件監聽器是一個函數,它會監聽某個事件的發生並在響應中執行。事件監聽器可以更新用戶介面、向伺服器發送請求,或者執行其他需要在用戶操作後完成的任務。我們可以使用 [addEventListener](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) 並提供一個函數來添加事件監聽器。
-> **NOTE:** 值得注意的是,建立事件監聽器有許多方法。你可以使用匿名函數或建立命名函數。你也可以使用各種快捷方式,例如設定 `click` 屬性或使用 `addEventListener`。在我們的練習中,我們將專注於使用 `addEventListener` 和匿名函數,因為這是網頁開發者最常使用的技術之一。它也是最靈活的,因為 `addEventListener` 適用於所有事件,並且事件名稱可以作為參數提供。
+> **NOTE:** 值得一提的是,創建事件監聽器有多種方式。你可以使用匿名函數,也可以創建命名函數。你還可以使用各種快捷方式,比如設置 `click` 屬性,或者使用 `addEventListener`。在我們的練習中,我們將專注於使用 `addEventListener` 和匿名函數,因為這是網頁開發者最常用的技術之一。它也是最靈活的,因為 `addEventListener` 適用於所有事件,並且事件名稱可以作為參數提供。
### 常見事件
-在建立應用程式時,有[數十種事件](https://developer.mozilla.org/docs/Web/Events)可供監聽。基本上,使用者在頁面上執行的任何操作都會觸發事件,這讓你擁有很大的能力來確保使用者獲得你期望的體驗。幸運的是,你通常只需要少數幾種事件。以下是一些常見的事件(包括我們在建立遊戲時會使用的兩個事件):
+在創建應用程式時,有[數十種事件](https://developer.mozilla.org/docs/Web/Events)可供監聽。基本上,用戶在頁面上執行的任何操作都會觸發事件,這讓你擁有很大的控制力來確保用戶獲得你期望的體驗。幸運的是,你通常只需要使用少數幾種事件。以下是一些常見的事件(包括我們在創建遊戲時會用到的兩個):
-- [click](https://developer.mozilla.org/docs/Web/API/Element/click_event):使用者點擊某個元素,通常是按鈕或超連結
-- [contextmenu](https://developer.mozilla.org/docs/Web/API/Element/contextmenu_event):使用者點擊右鍵
-- [select](https://developer.mozilla.org/docs/Web/API/Element/select_event):使用者選取了一些文字
-- [input](https://developer.mozilla.org/docs/Web/API/Element/input_event):使用者輸入了一些文字
+- [click](https://developer.mozilla.org/docs/Web/API/Element/click_event):用戶點擊某個元素,通常是按鈕或超連結
+- [contextmenu](https://developer.mozilla.org/docs/Web/API/Element/contextmenu_event):用戶點擊右鍵
+- [select](https://developer.mozilla.org/docs/Web/API/Element/select_event):用戶選中了一些文字
+- [input](https://developer.mozilla.org/docs/Web/API/Element/input_event):用戶輸入了一些文字
-## 建立遊戲
+## 創建遊戲
-我們將建立一個遊戲來探索 JavaScript 中事件的運作方式。這個遊戲將測試玩家的打字技巧,這是所有開發者都應該具備的一項重要技能。我們都應該練習打字!遊戲的基本流程如下:
+我們將創建一個遊戲來探索 JavaScript 中事件的工作原理。我們的遊戲將測試玩家的打字技能,這是所有開發者應該具備的一項非常重要的技能。我們都應該練習打字!遊戲的基本流程如下:
- 玩家點擊開始按鈕,並看到一段需要輸入的文字
-- 玩家在文字框中盡可能快速地輸入這段文字
- - 每完成一個單字,下一個單字會被高亮顯示
- - 如果玩家輸入錯誤,文字框會變成紅色
- - 當玩家完成整段文字時,會顯示成功訊息以及所花費的時間
+- 玩家在文本框中盡可能快地輸入這段文字
+ - 每當完成一個單詞,下一個單詞會被高亮顯示
+ - 如果玩家輸入錯誤,文本框會變成紅色
+ - 當玩家完成整段文字時,會顯示成功訊息以及所用時間
-讓我們開始建立遊戲,並學習事件的運作方式!
+讓我們開始構建遊戲,並學習事件的相關知識吧!
-### 檔案結構
+### 文件結構
-我們需要三個檔案:**index.html**、**script.js** 和 **style.css**。讓我們先設置好這些檔案,讓後續工作更輕鬆。
+我們需要三個文件:**index.html**、**script.js** 和 **style.css**。讓我們先設置這些文件,讓後續的工作更輕鬆。
-- 開啟終端機或控制台,建立一個新資料夾,並執行以下指令:
+- 打開控制台或終端,輸入以下命令創建一個新文件夾:
```bash
# Linux or macOS
@@ -60,29 +60,29 @@ mkdir typing-game && cd typing-game
md typing-game && cd typing-game
```
-- 開啟 Visual Studio Code
+- 打開 Visual Studio Code
```bash
code .
```
-- 在 Visual Studio Code 中,為資料夾新增以下三個檔案:
+- 在 Visual Studio Code 中,為該文件夾添加以下三個文件:
- index.html
- script.js
- style.css
-## 建立使用者介面
+## 創建用戶介面
-根據需求,我們知道在 HTML 頁面上需要一些元素。這有點像食譜,我們需要一些材料:
+根據需求,我們知道 HTML 頁面上需要一些元素。這有點像食譜,我們需要一些材料:
-- 顯示玩家需要輸入的文字的地方
-- 顯示訊息(例如成功訊息)的地方
-- 一個輸入文字的文字框
+- 一個用來顯示用戶需要輸入的文字的地方
+- 一個用來顯示訊息(如成功訊息)的地方
+- 一個用來輸入文字的文本框
- 一個開始按鈕
-每個元素都需要有 ID,以便我們能在 JavaScript 中操作它們。我們還需要添加對 CSS 和 JavaScript 檔案的引用。
+每個元素都需要一個 ID,這樣我們才能在 JavaScript 中操作它們。我們還需要添加對 CSS 和 JavaScript 文件的引用。
-建立一個名為 **index.html** 的新檔案,並添加以下 HTML:
+創建一個名為 **index.html** 的新文件,並添加以下 HTML:
```html
@@ -107,24 +107,24 @@ code .
### 啟動應用程式
-在開發過程中,最好以迭代方式進行,隨時查看效果。讓我們啟動應用程式。Visual Studio Code 有一個很棒的擴展工具叫 [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon),它可以在本地托管你的應用程式,並在每次儲存時刷新瀏覽器。
+最好以迭代的方式開發,隨時查看效果。讓我們啟動應用程式。Visual Studio Code 有一個很棒的擴展工具 [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon),它可以在本地託管你的應用程式,並在每次保存時刷新瀏覽器。
-- 安裝 [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon),點擊連結並選擇 **Install**
- - 瀏覽器會提示你開啟 Visual Studio Code,然後 Visual Studio Code 會提示你進行安裝
- - 如果有提示,請重新啟動 Visual Studio Code
-- 安裝完成後,在 Visual Studio Code 中按下 Ctrl-Shift-P(或 Cmd-Shift-P)開啟命令面板
+- 按照鏈接安裝 [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon),點擊 **Install**
+ - 瀏覽器會提示你打開 Visual Studio Code,然後 Visual Studio Code 會提示你進行安裝
+ - 如果提示,請重新啟動 Visual Studio Code
+- 安裝完成後,在 Visual Studio Code 中按 Ctrl-Shift-P(或 Cmd-Shift-P)打開命令面板
- 輸入 **Live Server: Open with Live Server**
- - Live Server 會開始托管你的應用程式
-- 開啟瀏覽器並導航至 **https://localhost:5500**
-- 你應該能看到你建立的頁面!
+ - Live Server 會開始託管你的應用程式
+- 打開瀏覽器,導航到 **https://localhost:5500**
+- 你應該能看到你創建的頁面!
-讓我們添加一些功能。
+現在讓我們添加一些功能。
## 添加 CSS
-建立好 HTML 後,讓我們添加核心樣式的 CSS。我們需要高亮玩家應輸入的單字,並在輸入錯誤時將文字框顯示為紅色。我們將使用兩個類別來完成這些操作。
+在創建 HTML 後,讓我們添加核心樣式的 CSS。我們需要高亮顯示玩家應該輸入的單詞,並在輸入錯誤時將文本框顯示為紅色。我們將通過兩個類來實現這些功能。
-建立一個名為 **style.css** 的新檔案,並添加以下語法。
+創建一個名為 **style.css** 的新文件,並添加以下語法。
```css
/* inside style.css */
@@ -138,7 +138,7 @@ code .
}
```
-✅ 在 CSS 中,你可以隨意設計你的頁面。花點時間讓頁面看起來更吸引人:
+✅ 關於 CSS,你可以根據自己的喜好佈局頁面。花點時間讓頁面更吸引人:
- 選擇不同的字體
- 為標題添加顏色
@@ -146,28 +146,28 @@ code .
## JavaScript
-建立好 UI 後,接下來我們要專注於提供邏輯的 JavaScript。我們將分成幾個步驟:
+在創建用戶介面後,現在我們將重點放在提供邏輯的 JavaScript 上。我們將把它分解為幾個步驟:
-- [建立常數](../../../../4-typing-game/typing-game)
+- [創建常量](../../../../4-typing-game/typing-game)
- [開始遊戲的事件監聽器](../../../../4-typing-game/typing-game)
-- [輸入文字的事件監聽器](../../../../4-typing-game/typing-game)
+- [輸入的事件監聽器](../../../../4-typing-game/typing-game)
-首先,建立一個名為 **script.js** 的新檔案。
+首先,創建一個名為 **script.js** 的新文件。
-### 建立常數
+### 添加常量
-我們需要一些項目來讓程式設計更方便。就像食譜一樣,以下是我們需要的材料:
+我們需要一些項目來讓編程更輕鬆。同樣,這有點像食譜,以下是我們需要的內容:
-- 包含所有文字的陣列
-- 用來存儲目前文字的空陣列
-- 用來存儲玩家目前輸入的單字索引的空間
-- 玩家點擊開始的時間
+- 包含所有文字段落的數組
+- 用於存儲當前段落所有單詞的空數組
+- 用於存儲玩家當前輸入單詞索引的空間
+- 玩家點擊開始時的時間
-我們還需要引用 UI 元素:
+我們還需要對用戶介面元素的引用:
-- 文字框(**typed-value**)
-- 顯示文字的地方(**quote**)
-- 訊息(**message**)
+- 文本框(**typed-value**)
+- 顯示段落的元素(**quote**)
+- 顯示訊息的元素(**message**)
```javascript
// inside script.js
@@ -192,9 +192,9 @@ const messageElement = document.getElementById('message');
const typedValueElement = document.getElementById('typed-value');
```
-✅ 為你的遊戲添加更多文字
+✅ 為你的遊戲添加更多段落
-> **NOTE:** 我們可以在程式碼中隨時使用 `document.getElementById` 來取得元素。由於我們會經常引用這些元素,因此使用常數可以避免字串文字的拼寫錯誤。像 [Vue.js](https://vuejs.org/) 或 [React](https://reactjs.org/) 這樣的框架可以幫助你更好地集中管理程式碼。
+> **NOTE:** 我們可以在程式碼中隨時使用 `document.getElementById` 獲取元素。由於我們會經常引用這些元素,為了避免字符串字面值的拼寫錯誤,我們使用常量。像 [Vue.js](https://vuejs.org/) 或 [React](https://reactjs.org/) 這樣的框架可以幫助你更好地集中管理程式碼。
花點時間觀看一段關於使用 `const`、`let` 和 `var` 的影片
@@ -204,9 +204,9 @@ const typedValueElement = document.getElementById('typed-value');
### 添加開始邏輯
-為了開始遊戲,玩家需要點擊開始按鈕。當然,我們不知道玩家何時會點擊開始按鈕。這就是 [事件監聽器](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) 的作用。事件監聽器允許我們監聽某件事情的發生(事件),並執行相應的程式碼。在我們的情況下,我們希望在使用者點擊開始時執行程式碼。
+為了開始遊戲,玩家需要點擊開始按鈕。當然,我們不知道他們什麼時候會點擊開始。這就是 [事件監聽器](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) 的作用。事件監聽器允許我們監聽某些事情的發生(事件)並執行相應的程式碼。在我們的例子中,我們希望在用戶點擊開始時執行程式碼。
-當使用者點擊 **開始** 時,我們需要選擇一段文字,設置使用者介面,並設置目前單字和計時的追蹤。以下是你需要添加的 JavaScript;我們在程式碼區塊後進行討論。
+當用戶點擊 **開始** 時,我們需要選擇一段文字,設置用戶介面,並設置當前單詞和計時的追蹤。以下是你需要添加的 JavaScript;我們會在程式碼塊後進行討論。
```javascript
// at the end of script.js
@@ -243,25 +243,25 @@ document.getElementById('start').addEventListener('click', () => {
讓我們分解程式碼!
-- 設置單字追蹤
- - 使用 [Math.floor](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) 和 [Math.random](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/random) 隨機選擇 `quotes` 陣列中的一段文字
- - 將 `quote` 轉換為 `words` 陣列,以便追蹤玩家目前輸入的單字
- - 將 `wordIndex` 設為 0,因為玩家會從第一個單字開始
-- 設置 UI
- - 建立 `spanWords` 陣列,其中包含每個單字的 `span` 元素
- - 這樣可以高亮顯示文字
- - 使用 `join` 方法建立一個字串,並更新 `quoteElement` 的 `innerHTML`
- - 這會將文字顯示給玩家
- - 將第一個 `span` 元素的 `className` 設為 `highlight`,以高亮顯示為黃色
- - 將 `messageElement` 的 `innerText` 設為 `''` 以清空訊息
-- 設置文字框
- - 清空 `typedValueElement` 的目前 `value`
+- 設置單詞追蹤
+ - 使用 [Math.floor](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/floor) 和 [Math.random](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/random) 隨機選擇 `quotes` 數組中的一段文字
+ - 將 `quote` 轉換為 `words` 數組,以便追蹤玩家當前輸入的單詞
+ - 將 `wordIndex` 設置為 0,因為玩家將從第一個單詞開始
+- 設置用戶介面
+ - 創建一個包含每個單詞的 `spanWords` 數組
+ - 這樣我們可以高亮顯示顯示中的單詞
+ - 使用 `join` 將數組轉換為字符串,並更新 `quoteElement` 的 `innerHTML`
+ - 這將顯示段落給玩家
+ - 將第一個 `span` 元素的 `className` 設置為 `highlight`,以高亮顯示為黃色
+ - 通過將 `messageElement` 的 `innerText` 設置為 `''` 來清空訊息
+- 設置文本框
+ - 清除 `typedValueElement` 的當前 `value`
- 將焦點設置到 `typedValueElement`
-- 使用 `getTime` 開始計時
+- 通過調用 `getTime` 開始計時
### 添加輸入邏輯
-當玩家輸入時,會觸發 `input` 事件。這個事件監聽器會檢查玩家是否正確輸入文字,並處理遊戲的目前狀態。回到 **script.js**,在檔案末尾添加以下程式碼。我們稍後會進行分解。
+當玩家輸入時,會觸發 `input` 事件。此事件監聽器將檢查玩家是否正確輸入單詞,並處理遊戲的當前狀態。返回到 **script.js**,在末尾添加以下程式碼。我們會在程式碼塊後進行討論。
```javascript
// at the end of script.js
@@ -300,29 +300,29 @@ typedValueElement.addEventListener('input', () => {
});
```
-讓我們分解程式碼!我們首先取得目前的單字以及玩家目前輸入的值。接著,我們使用瀑布邏輯檢查文字是否完成、單字是否完成、單字是否正確,或者(最後)是否有錯誤。
+讓我們分解程式碼!我們首先獲取當前單詞和玩家目前輸入的值。然後,我們使用瀑布邏輯檢查段落是否完成、單詞是否完成、單詞是否正確,或者(最後)是否有錯誤。
-- 文字完成,表示 `typedValue` 等於 `currentWord`,且 `wordIndex` 等於 `words` 的 `length` 減一
- - 使用目前時間減去 `startTime` 計算 `elapsedTime`
+- 段落完成,當 `typedValue` 等於 `currentWord` 並且 `wordIndex` 等於 `words` 的長度減一時
+ - 通過將當前時間減去 `startTime` 計算 `elapsedTime`
- 將 `elapsedTime` 除以 1,000,將毫秒轉換為秒
- 顯示成功訊息
-- 單字完成,表示 `typedValue` 以空格結尾(單字結尾),且 `typedValue` 等於 `currentWord`
- - 將 `typedElement` 的 `value` 設為 `''`,以便輸入下一個單字
- - 增加 `wordIndex`,移至下一個單字
- - 遍歷 `quoteElement` 的所有 `childNodes`,將 `className` 設為 `''`,恢復預設顯示
- - 將目前單字的 `className` 設為 `highlight`,以標記為下一個需要輸入的單字
-- 單字目前輸入正確(但未完成),表示 `currentWord` 以 `typedValue` 開頭
- - 清空 `typedValueElement` 的 `className`,確保顯示為預設狀態
-- 如果到這裡,表示有錯誤
- - 將 `typedValueElement` 的 `className` 設為 `error`
+- 單詞完成,當 `typedValue` 以空格結尾(單詞結束)並且 `typedValue` 等於 `currentWord` 時
+ - 將 `typedElement` 的 `value` 設置為 `''`,以便輸入下一個單詞
+ - 增加 `wordIndex`,移動到下一個單詞
+ - 遍歷 `quoteElement` 的所有 `childNodes`,將 `className` 設置為 `''`,恢復默認顯示
+ - 將當前單詞的 `className` 設置為 `highlight`,標記為下一個需要輸入的單詞
+- 單詞當前輸入正確(但未完成),當 `currentWord` 以 `typedValue` 開頭時
+ - 通過清除 `className` 確保 `typedValueElement` 顯示為默認狀態
+- 如果到這裡,說明有錯誤
+ - 將 `typedValueElement` 的 `className` 設置為 `error`
## 測試你的應用程式
-你已經完成了!最後一步是確保應用程式正常運作。試試看吧!如果有錯誤,不用擔心;**所有開發者**都會遇到錯誤。檢查訊息並進行除錯。
+你已經完成了!最後一步是確保應用程式正常運行。試試看吧!如果有錯誤,不用擔心;**所有開發者** 都會遇到錯誤。檢查訊息並根據需要進行調試。
點擊 **開始**,然後開始輸入!它應該看起來像我們之前看到的動畫。
-
+
---
@@ -331,21 +331,22 @@ typedValueElement.addEventListener('input', () => {
添加更多功能
- 在完成後禁用 `input` 事件監聽器,並在按下按鈕時重新啟用
-- 在玩家完成文字後禁用文字框
-- 顯示一個模態對話框,包含成功訊息
-- 使用 [localStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage) 儲存高分紀錄
-
+- 在玩家完成段落後禁用文本框
+- 顯示一個模態對話框,顯示成功訊息
+- 使用 [localStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage) 存儲最高分
## 課後測驗
[課後測驗](https://ff-quizzes.netlify.app/web/quiz/22)
## 回顧與自學
-閱讀 [所有可用的事件](https://developer.mozilla.org/docs/Web/Events),了解網頁瀏覽器提供給開發者的功能,並思考在什麼情境下會使用每個事件。
+閱讀[網頁瀏覽器提供的所有事件](https://developer.mozilla.org/docs/Web/Events),並思考每個事件適合使用的情境。
## 作業
[創建一個新的鍵盤遊戲](assignment.md)
+---
+
**免責聲明**:
-本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/5-browser-extension/1-about-browsers/README.md b/translations/mo/5-browser-extension/1-about-browsers/README.md
index 3f751943..4fcf6121 100644
--- a/translations/mo/5-browser-extension/1-about-browsers/README.md
+++ b/translations/mo/5-browser-extension/1-about-browsers/README.md
@@ -1,15 +1,15 @@
-# 瀏覽器擴充功能專案第1部分:關於瀏覽器的一切
+# 瀏覽器擴充功能專案第一部分:關於瀏覽器的一切
-
+
> 手繪筆記由 [Wassim Chegham](https://dev.to/wassimchegham/ever-wondered-what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser-3dob) 提供
## 課前測驗
@@ -18,94 +18,94 @@ CO_OP_TRANSLATOR_METADATA:
### 簡介
-瀏覽器擴充功能為瀏覽器增加了額外的功能。但在你開始製作之前,應該先了解一些關於瀏覽器如何運作的知識。
+瀏覽器擴充功能為瀏覽器增加額外的功能。但在開始建立之前,您需要先了解瀏覽器如何運作。
### 關於瀏覽器
-在這系列課程中,你將學習如何建立一個可以在 Chrome、Firefox 和 Edge 瀏覽器上運行的瀏覽器擴充功能。在這部分,你將了解瀏覽器的運作方式,並搭建瀏覽器擴充功能的基本結構。
+在這系列課程中,您將學習如何建立一個瀏覽器擴充功能,並使其能在 Chrome、Firefox 和 Edge 瀏覽器上運作。在這部分,您將了解瀏覽器的運作方式,並搭建瀏覽器擴充功能的基本架構。
-那麼,什麼是瀏覽器呢?它是一種軟體應用程式,允許終端使用者從伺服器訪問內容並將其顯示在網頁上。
+那麼,瀏覽器到底是什麼呢?它是一種軟體應用程式,允許終端使用者從伺服器存取內容並在網頁上顯示。
-✅ 一點歷史:第一個瀏覽器名為「WorldWideWeb」,由蒂姆·伯納斯-李爵士於1990年創建。
+✅ 一點歷史:第一個瀏覽器名為「WorldWideWeb」,由 Tim Berners-Lee 爵士於 1990 年創建。
-
-> 一些早期的瀏覽器,圖片來源:[Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing)
+
+> 一些早期的瀏覽器,圖片來源 [Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing)
-當使用者使用 URL(統一資源定位器)地址連接到互聯網時,通常通過 `http` 或 `https` 地址使用超文本傳輸協議,瀏覽器會與網頁伺服器通信並獲取網頁。
+當使用者透過 URL(統一資源定位器)地址連接到互聯網時,通常使用 Hypertext Transfer Protocol(HTTP 或 HTTPS 地址),瀏覽器會與網頁伺服器通信並抓取網頁。
-此時,瀏覽器的渲染引擎會將網頁顯示在使用者的設備上,這可能是手機、桌面電腦或筆記型電腦。
+此時,瀏覽器的渲染引擎會將網頁顯示在使用者的設備上,可能是手機、桌面或筆記型電腦。
-瀏覽器還具有緩存內容的功能,這樣就不需要每次都從伺服器檢索內容。它們可以記錄使用者的瀏覽歷史,存儲「cookies」(小型數據片段,用於保存使用者的活動信息)等。
+瀏覽器還具有快取內容的能力,這樣就不需要每次都從伺服器重新抓取。它們可以記錄使用者的瀏覽歷史、存儲「Cookie」(包含用於保存使用者活動的小型數據),以及更多功能。
-需要特別記住的是,瀏覽器並不完全相同!每個瀏覽器都有其優勢和劣勢,專業的網頁開發人員需要了解如何讓網頁在不同瀏覽器中表現良好。這包括處理像手機這樣的小視窗,以及處理離線使用者。
+需要特別記住的是,瀏覽器並不完全相同!每個瀏覽器都有其優勢和劣勢,專業的網頁開發人員需要了解如何使網頁在不同瀏覽器上良好運行。這包括處理小型視窗(例如手機的)以及離線使用者的需求。
-一個非常有用的網站是 [caniuse.com](https://www.caniuse.com),你應該將它加入你喜歡使用的瀏覽器的書籤中。在構建網頁時,使用 caniuse 提供的技術支持列表可以幫助你更好地支持使用者。
+一個非常有用的網站,您可能應該在您喜歡使用的瀏覽器中加入書籤:[caniuse.com](https://www.caniuse.com)。當您建立網頁時,使用 caniuse 提供的技術支持列表可以幫助您更好地支持使用者。
-✅ 如何知道你的網站使用者最常用哪些瀏覽器?檢查你的分析數據——你可以在網頁開發過程中安裝各種分析工具,它們會告訴你使用者最常用的瀏覽器。
+✅ 如何判斷您的網站使用者最常使用哪些瀏覽器?檢查您的分析數據——您可以在網頁開發過程中安裝各種分析工具包,它們會告訴您使用者最常使用的瀏覽器。
## 瀏覽器擴充功能
-為什麼要製作瀏覽器擴充功能?當你需要快速訪問一些經常重複的任務時,這是一個非常方便的工具。例如,如果你經常需要檢查網頁上的顏色,你可以安裝一個顏色選擇器擴充功能。如果你記不住密碼,可以使用密碼管理擴充功能。
+為什麼要建立瀏覽器擴充功能?當您需要快速執行一些重複的任務時,擴充功能是一個非常方便的工具。例如,如果您需要檢查與您互動的網頁上的顏色,您可以安裝一個顏色選擇器擴充功能。如果您難以記住密碼,您可以使用密碼管理擴充功能。
-開發瀏覽器擴充功能也很有趣。它們通常專注於執行少量的任務,並且執行得非常出色。
+瀏覽器擴充功能的開發也非常有趣。它們通常專注於執行有限的任務,並且能夠很好地完成這些任務。
-✅ 你最喜歡的瀏覽器擴充功能是什麼?它們執行哪些任務?
+✅ 您最喜歡的瀏覽器擴充功能是什麼?它們執行哪些任務?
### 安裝擴充功能
-在開始構建之前,先了解一下構建和部署瀏覽器擴充功能的過程。雖然每個瀏覽器在管理這個過程時略有不同,但在 Chrome 和 Firefox 上的過程與 Edge 上的示例類似:
+在開始建立之前,先了解建立和部署瀏覽器擴充功能的過程。雖然每個瀏覽器在管理這項任務上略有不同,但 Chrome 和 Firefox 的過程與 Edge 的示例相似:
-
+
> 注意:請確保開啟開發者模式並允許來自其他商店的擴充功能。
-基本過程如下:
+基本流程如下:
-- 使用 `npm run build` 構建你的擴充功能
-- 在瀏覽器中通過右上角的「設置及更多」按鈕(`...` 圖標)導航到擴充功能頁面
-- 如果是新安裝,選擇「加載未打包的擴充功能」,從其構建文件夾(在我們的例子中是 `/dist`)上傳新的擴充功能
-- 或者,如果是重新加載已安裝的擴充功能,點擊「重新加載」
+- 使用 `npm run build` 建立您的擴充功能
+- 在瀏覽器中透過右上角的「設定及更多」按鈕(`...` 圖示)進入擴充功能頁面
+- 如果是新安裝,選擇「載入未打包」以從其建立資料夾(在我們的案例中是 `/dist`)上傳新的擴充功能
+- 或者,如果是重新載入已安裝的擴充功能,點擊「重新載入」
-✅ 這些指令適用於你自己構建的擴充功能;如果要安裝已發布到瀏覽器擴充功能商店的擴充功能,應導航到這些 [商店](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home) 並安裝你選擇的擴充功能。
+✅ 這些指示適用於您自己建立的擴充功能;若要安裝已發布到瀏覽器擴充功能商店的擴充功能,您應該前往這些 [商店](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home) 並安裝您選擇的擴充功能。
-### 開始動手
+### 開始
-你將構建一個顯示你所在地區碳足跡的瀏覽器擴充功能,展示你所在地區的能源使用情況及能源來源。該擴充功能將包含一個表單,用於收集 API 金鑰,以訪問 CO2 Signal 的 API。
+您將建立一個瀏覽器擴充功能,顯示您所在地區的碳足跡,包括能源使用情況及能源來源。該擴充功能將包含一個表單,用於收集 API 金鑰,以便訪問 CO2 Signal 的 API。
-**你需要:**
+**您需要:**
-- [一個 API 金鑰](https://www.co2signal.com/);在此頁面輸入你的電子郵件,金鑰將發送到你的郵箱
-- 對應 [Electricity Map](https://www.electricitymap.org/map) 的 [地區代碼](http://api.electricitymap.org/v3/zones)(例如,在波士頓,我使用「US-NEISO」)
-- [起始代碼](../../../../5-browser-extension/start)。下載 `start` 文件夾;你將在此文件夾中完成代碼
-- [NPM](https://www.npmjs.com) - NPM 是一個套件管理工具;在本地安裝它,並安裝 `package.json` 文件中列出的套件以供網頁資產使用
+- [一個 API 金鑰](https://www.co2signal.com/);在此頁面輸入您的電子郵件,金鑰將發送給您
+- [您的地區代碼](http://api.electricitymap.org/v3/zones),對應於 [Electricity Map](https://www.electricitymap.org/map)(例如,在波士頓,我使用「US-NEISO」)
+- [起始代碼](../../../../5-browser-extension/start)。下載 `start` 資料夾;您將在此資料夾中完成代碼
+- [NPM](https://www.npmjs.com) - NPM 是一個套件管理工具;在本地安裝它,並安裝 `package.json` 文件中列出的套件以供網頁資產使用
-✅ 在這個 [優秀的學習模組](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon) 中了解更多關於套件管理的知識。
+✅ 在這個 [優秀的學習模組](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon) 中了解更多關於套件管理的內容
花點時間瀏覽代碼庫:
-dist
- -|manifest.json(默認設置在此處)
- -|index.html(前端 HTML 標記在此處)
- -|background.js(背景 JS 在此處)
- -|main.js(構建後的 JS)
-src
- -|index.js(你的 JS 代碼在此處)
+dist
+ -|manifest.json(預設值在此設置)
+ -|index.html(前端 HTML 標記在此)
+ -|background.js(背景 JS 在此)
+ -|main.js(已編譯的 JS)
+src
+ -|index.js(您的 JS 代碼在此)
-✅ 一旦你準備好 API 金鑰和地區代碼,將它們存放在某個筆記中以備未來使用。
+✅ 一旦您準備好 API 金鑰和地區代碼,請將它們存放在某個筆記中以供未來使用。
-### 為擴充功能構建 HTML
+### 建立擴充功能的 HTML
-這個擴充功能有兩個視圖。一個用於收集 API 金鑰和地區代碼:
+此擴充功能有兩個視圖。一個用於收集 API 金鑰和地區代碼:
-
+
另一個用於顯示地區的碳使用情況:
-
+
-我們先從構建表單的 HTML 開始,並用 CSS 進行樣式設計。
+首先,建立表單的 HTML 並使用 CSS 進行樣式設置。
-在 `/dist` 文件夾中,你將構建一個表單和一個結果區域。在 `index.html` 文件中,填充表單區域:
+在 `/dist` 資料夾中,建立一個表單和結果區域。在 `index.html` 文件中填充表單區域:
```HTML
@@ -122,10 +122,10 @@ src
Submit
-```
-這是保存信息並將其存儲到本地存儲的表單。
+```
+這是保存信息的表單,輸入的信息將保存到本地存儲。
-接下來,創建結果區域;在最後的表單標籤下方添加一些 div:
+接下來,建立結果區域;在最後的表單標籤下方添加一些 div:
```HTML
@@ -139,24 +139,24 @@ src
Change region
-```
-此時,你可以嘗試構建。確保安裝此擴充功能的套件依賴項:
+```
+此時,您可以嘗試進行編譯。確保安裝此擴充功能的套件依賴項:
```
npm install
-```
+```
-此命令將使用 npm(Node 套件管理器)來安裝 webpack,用於擴充功能的構建過程。你可以通過查看 `/dist/main.js` 來查看此過程的輸出——你會看到代碼已被打包。
+此命令將使用 npm(Node 套件管理器)安裝 webpack,用於擴充功能的編譯過程。您可以通過查看 `/dist/main.js` 的輸出來看到代碼已被打包。
-目前,擴充功能應該可以構建,並且如果你將其部署到 Edge 作為擴充功能,你會看到一個整齊顯示的表單。
+目前,擴充功能應該可以編譯,並且如果您將其部署到 Edge 作為擴充功能,您將看到一個整齊顯示的表單。
-恭喜你,你已經邁出了構建瀏覽器擴充功能的第一步。在接下來的課程中,你將使其更加實用和有用。
+恭喜您,您已經邁出了建立瀏覽器擴充功能的第一步。在後續課程中,您將使其更具功能性和實用性。
---
## 🚀 挑戰
-瀏覽一個瀏覽器擴充功能商店並安裝一個擴充功能到你的瀏覽器。你可以用有趣的方式檢查它的文件。你發現了什麼?
+瀏覽瀏覽器擴充功能商店並安裝一個擴充功能到您的瀏覽器。您可以用有趣的方式檢查其文件。您發現了什麼?
## 課後測驗
@@ -164,17 +164,19 @@ npm install
## 回顧與自學
-在這節課中,你學到了一些關於網頁瀏覽器歷史的知識;利用這個機會,通過閱讀更多歷史資料來了解萬維網的發明者如何設想它的用途。一些有用的網站包括:
+在本課中,您學習了一些關於網頁瀏覽器歷史的內容;利用這個機會,通過閱讀更多相關歷史來了解 World Wide Web 的發明者如何設想其用途。一些有用的網站包括:
-[網頁瀏覽器的歷史](https://www.mozilla.org/firefox/browsers/browser-history/)
+[網頁瀏覽器的歷史](https://www.mozilla.org/firefox/browsers/browser-history/)
-[網頁的歷史](https://webfoundation.org/about/vision/history-of-the-web/)
+[網頁的歷史](https://webfoundation.org/about/vision/history-of-the-web/)
-[蒂姆·伯納斯-李訪談](https://www.theguardian.com/technology/2019/mar/12/tim-berners-lee-on-30-years-of-the-web-if-we-dream-a-little-we-can-get-the-web-we-want)
+[Tim Berners-Lee 的訪談](https://www.theguardian.com/technology/2019/mar/12/tim-berners-lee-on-30-years-of-the-web-if-we-dream-a-little-we-can-get-the-web-we-want)
-## 作業
+## 作業
-[重新設計你的擴充功能](assignment.md)
+[重新設計您的擴充功能](assignment.md)
+
+---
**免責聲明**:
-本文檔使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/5-browser-extension/2-forms-browsers-local-storage/README.md b/translations/mo/5-browser-extension/2-forms-browsers-local-storage/README.md
index 2490c439..9b907037 100644
--- a/translations/mo/5-browser-extension/2-forms-browsers-local-storage/README.md
+++ b/translations/mo/5-browser-extension/2-forms-browsers-local-storage/README.md
@@ -1,13 +1,13 @@
-# 瀏覽器擴充功能專案第二部分:呼叫 API,使用本地存儲
+# 瀏覽器擴充功能專案第 2 部分:呼叫 API,使用本地存儲
## 課前測驗
@@ -15,15 +15,15 @@ CO_OP_TRANSLATOR_METADATA:
### 簡介
-在本課中,你將透過提交瀏覽器擴充功能的表單來呼叫 API,並在擴充功能中顯示結果。此外,你還將學習如何將資料存儲在瀏覽器的本地存儲中,以供未來參考和使用。
+在本課中,您將透過提交瀏覽器擴充功能的表單來呼叫 API,並在擴充功能中顯示結果。此外,您還將學習如何將數據存儲在瀏覽器的本地存儲中,以供未來參考和使用。
-✅ 按照適當檔案中的編號段落,了解應將程式碼放置在哪裡。
+✅ 按照適當文件中的編號段落,了解應將程式碼放置在哪裡。
### 設置擴充功能中需要操作的元素:
-到目前為止,你已經為瀏覽器擴充功能建立了表單和結果 `
` 的 HTML。接下來,你需要在 `/src/index.js` 檔案中逐步構建擴充功能。請參考[上一課](../1-about-browsers/README.md)以了解如何設置專案及其構建過程。
+到目前為止,您已經為瀏覽器擴充功能建立了表單和結果 `
` 的 HTML。接下來,您需要在 `/src/index.js` 文件中工作,逐步構建您的擴充功能。請參考[上一課](../1-about-browsers/README.md) 以了解如何設置專案和構建過程。
-在 `index.js` 檔案中,首先建立一些 `const` 變數來保存與各個欄位相關的值:
+在 `index.js` 文件中,首先建立一些 `const` 變數來保存與各個欄位相關的值:
```JavaScript
// form fields
@@ -41,11 +41,11 @@ const myregion = document.querySelector('.my-region');
const clearBtn = document.querySelector('.clear-btn');
```
-所有這些欄位都是通過其 CSS 類名來引用的,這些類名是在上一課的 HTML 中設置的。
+這些欄位都是通過其 CSS 類名來引用的,這是在上一課的 HTML 中設置的。
-### 添加事件監聽器
+### 添加監聽器
-接下來,為表單和重置按鈕添加事件監聽器,這樣當使用者提交表單或點擊重置按鈕時,會觸發相應的操作,並在檔案底部添加初始化應用程式的呼叫:
+接下來,為表單和重置按鈕添加事件監聽器,當使用者提交表單或點擊重置按鈕時,會觸發相應的操作,並在文件底部添加初始化應用程式的調用:
```JavaScript
form.addEventListener('submit', (e) => handleSubmit(e));
@@ -53,11 +53,11 @@ clearBtn.addEventListener('click', (e) => reset(e));
init();
```
-✅ 注意這裡使用的簡化方式來監聽提交或點擊事件,以及事件如何被傳遞到 `handleSubmit` 或 `reset` 函數。你能否用更長的格式寫出這種簡化方式的等效程式碼?你更喜歡哪種方式?
+✅ 注意這裡使用的簡寫方式來監聽提交或點擊事件,以及事件如何被傳遞給 handleSubmit 或 reset 函數。您能否用更長的格式來寫出這個簡寫的等效程式碼?您更喜歡哪種方式?
-### 構建 `init()` 函數和 `reset()` 函數:
+### 構建 init() 函數和 reset() 函數:
-現在你需要構建初始化擴充功能的函數,這個函數叫做 `init()`:
+現在,您將構建初始化擴充功能的函數,該函數名為 init():
```JavaScript
function init() {
@@ -93,34 +93,34 @@ function reset(e) {
```
-在這個函數中,有一些有趣的邏輯。仔細閱讀,你能看出發生了什麼嗎?
+在這個函數中,有一些有趣的邏輯。閱讀後,您能看出發生了什麼嗎?
-- 設置兩個 `const` 來檢查使用者是否在本地存儲中保存了 APIKey 和地區代碼。
-- 如果其中任何一個為 null,通過將表單的樣式更改為 'block' 來顯示表單。
-- 隱藏結果、加載狀態和清除按鈕,並將任何錯誤文字設置為空字串。
-- 如果存在 APIKey 和地區代碼,則啟動以下流程:
- - 呼叫 API 以獲取碳使用數據。
+- 設置了兩個 `const` 來檢查使用者是否在本地存儲中存儲了 APIKey 和地區代碼。
+- 如果其中任何一個為 null,則通過將表單的樣式更改為 'block' 來顯示表單。
+- 隱藏結果、加載狀態和 clearBtn,並將任何錯誤訊息設置為空字串。
+- 如果存在密鑰和地區,則啟動一個流程來:
+ - 呼叫 API 獲取碳使用數據。
- 隱藏結果區域。
- 隱藏表單。
- 顯示重置按鈕。
-在繼續之前,了解瀏覽器中一個非常重要的概念是很有幫助的:[LocalStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage)。LocalStorage 是一種在瀏覽器中以 `key-value` 配對形式存儲字串的有用方式。這種網頁存儲可以通過 JavaScript 操作來管理瀏覽器中的資料。LocalStorage 不會過期,而另一種網頁存儲 SessionStorage 則會在瀏覽器關閉時清除。這些存儲類型在使用上各有利弊。
+在繼續之前,了解瀏覽器中一個非常重要的概念是很有用的:[LocalStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage)。LocalStorage 是一種以 `key-value` 鍵值對形式在瀏覽器中存儲字串的有用方式。這種網頁存儲可以通過 JavaScript 操作來管理瀏覽器中的數據。LocalStorage 不會過期,而另一種網頁存儲 SessionStorage 則會在瀏覽器關閉時清除。這些存儲類型各有優缺點。
-> 注意 - 瀏覽器擴充功能有自己的本地存儲;主瀏覽器窗口是不同的實例,行為獨立。
+> 注意 - 您的瀏覽器擴充功能有其自己的本地存儲;主瀏覽器窗口是不同的實例,行為獨立。
-你可以將 APIKey 設置為一個字串值,例如,你可以通過 "檢查" 網頁(右鍵點擊瀏覽器並選擇檢查)並進入應用程式選項卡來查看存儲。
+您可以將 APIKey 設置為一個字串值,例如,您可以通過“檢查”網頁(您可以右鍵點擊瀏覽器進行檢查)並轉到 Applications 標籤來查看存儲。

-✅ 思考哪些情況下你不應該將某些資料存儲在 LocalStorage 中。一般來說,將 APIKey 放在 LocalStorage 中是個壞主意!你能看出原因嗎?在我們的案例中,由於我們的應用程式純粹是用於學習,並不會部署到應用程式商店,因此我們將使用這種方法。
+✅ 思考哪些情況下您不應該將某些數據存儲在 LocalStorage 中。一般來說,將 API 密鑰存儲在 LocalStorage 中是一個壞主意!您能看出原因嗎?在我們的案例中,由於我們的應用程式純粹是為了學習,並且不會部署到應用程式商店,因此我們將使用這種方法。
-注意,你使用 Web API 來操作 LocalStorage,可以使用 `getItem()`、`setItem()` 或 `removeItem()`。它在各大瀏覽器中都得到了廣泛支持。
+注意,您可以使用 Web API 操作 LocalStorage,通過 `getItem()`、`setItem()` 或 `removeItem()`。它在各個瀏覽器中都得到了廣泛支持。
-在構建 `displayCarbonUsage()` 函數(在 `init()` 中被呼叫)之前,讓我們先構建處理初始表單提交的功能。
+在構建 `displayCarbonUsage()` 函數(在 `init()` 中調用)之前,讓我們先構建處理初始表單提交的功能。
### 處理表單提交
-建立一個名為 `handleSubmit` 的函數,接受一個事件參數 `(e)`。阻止事件傳播(在這種情況下,我們希望阻止瀏覽器刷新),並呼叫一個新函數 `setUpUser`,傳入 `apiKey.value` 和 `region.value` 作為參數。通過這種方式,你使用了初始表單中填寫的兩個值。
+建立一個名為 `handleSubmit` 的函數,接受一個事件參數 `(e)`。阻止事件傳播(在這種情況下,我們希望阻止瀏覽器刷新),並調用一個新函數 `setUpUser`,傳遞 `apiKey.value` 和 `region.value` 作為參數。通過這種方式,您可以使用初始表單中填寫的兩個值。
```JavaScript
function handleSubmit(e) {
@@ -129,11 +129,11 @@ function handleSubmit(e) {
}
```
-✅ 回憶一下 - 你在上一課設置的 HTML 有兩個輸入欄位,其 `values` 是通過你在檔案頂部設置的 `const` 捕獲的,並且它們都是 `required`,因此瀏覽器會阻止使用者輸入空值。
+✅ 回顧一下 - 您在上一課中設置的 HTML 包含兩個輸入欄位,其 `values` 是通過您在文件頂部設置的 `const` 捕獲的,並且它們都是 `required`,因此瀏覽器會阻止使用者輸入空值。
### 設置使用者
-接下來是 `setUpUser` 函數,這裡你將為 apiKey 和 regionName 設置本地存儲值。添加一個新函數:
+接下來是 `setUpUser` 函數,這裡您將為 apiKey 和 regionName 設置本地存儲值。新增一個新函數:
```JavaScript
function setUpUser(apiKey, regionName) {
@@ -147,19 +147,19 @@ function setUpUser(apiKey, regionName) {
}
```
-此函數設置一個加載訊息,以在呼叫 API 時顯示。到目前為止,你已經到達了建立此瀏覽器擴充功能最重要的函數!
+此函數設置了一條加載訊息,以便在呼叫 API 時顯示。到這裡,您已經來到了這個瀏覽器擴充功能中最重要的函數!
-### 顯示碳使用數據
+### 顯示碳使用量
最後,是時候查詢 API 了!
-在進一步操作之前,我們應該討論 API。API,即[應用程式介面](https://www.webopedia.com/TERM/A/API.html),是網頁開發者工具箱中的重要元素。它們提供了標準化的方式,讓程式能夠相互交互和介面。例如,如果你正在建立一個需要查詢資料庫的網站,可能有人已經為你建立了一個 API 可以使用。雖然 API 有很多種類型,其中一種最受歡迎的是 [REST API](https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/)。
+在進一步操作之前,我們應該討論一下 API。API,即[應用程式編程介面](https://www.webopedia.com/TERM/A/API.html),是網頁開發人員工具箱中的關鍵元素。它們為程式之間的互動和介面提供了標準方式。例如,如果您正在建立一個需要查詢資料庫的網站,可能有人已經為您建立了一個 API。雖然有許多類型的 API,但其中一種最受歡迎的是 [REST API](https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/)。
-✅ "REST" 的意思是 "表現層狀態轉移",其特點是使用不同配置的 URL 來獲取資料。研究一下開發者可用的各種 API 類型。哪種格式最吸引你?
+✅ “REST” 代表“表現層狀態轉移”,其特點是使用各種配置的 URL 來獲取數據。請稍作研究,了解開發人員可用的各種 API 類型。哪種格式最吸引您?
-這個函數有一些重要的注意事項。首先,注意 [`async` 關鍵字](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function)。將函數設置為異步執行意味著它會等待某些操作(例如資料返回)完成後再繼續。
+這個函數有一些重要的注意事項。首先,注意 [`async` 關鍵字](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function)。將函數編寫為異步運行意味著它會等待某個操作(例如數據返回)完成後再繼續。
-這裡有一段關於 `async` 的簡短影片:
+這裡有一個關於 `async` 的簡短影片:
[](https://youtube.com/watch?v=YwmlRkrxvkk "管理 Promise 的 Async 和 Await")
@@ -207,20 +207,20 @@ async function displayCarbonUsage(apiKey, region) {
這是一個較大的函數。這裡發生了什麼?
-- 遵循最佳實踐,你使用 `async` 關鍵字使此函數異步執行。函數包含一個 `try/catch` 區塊,因為當 API 返回資料時,它會返回一個 Promise。由於你無法控制 API 的響應速度(它可能根本不響應!),你需要通過異步方式來處理這種不確定性。
-- 你正在查詢 co2signal API,以獲取地區的資料,使用你的 APIKey。要使用該密鑰,你需要在標頭參數中使用一種身份驗證方式。
-- 一旦 API 響應,你將其響應資料的各個元素分配給你設置的螢幕部分,以顯示這些資料。
-- 如果出現錯誤或沒有結果,你將顯示錯誤訊息。
+- 遵循最佳實踐,您使用 `async` 關鍵字使此函數異步運行。該函數包含一個 `try/catch` 區塊,因為當 API 返回數據時,它會返回一個 Promise。由於您無法控制 API 回應的速度(它可能根本不回應!),因此需要通過異步方式處理這種不確定性。
+- 您正在查詢 co2signal API 以獲取您地區的數據,使用您的 API 密鑰。要使用該密鑰,您需要在標頭參數中使用一種類型的身份驗證。
+- 一旦 API 回應,您將其回應數據的各個元素分配給您設置的螢幕部分以顯示這些數據。
+- 如果出現錯誤或沒有結果,則顯示錯誤訊息。
-✅ 使用異步程式設計模式是工具箱中的另一個非常有用的工具。閱讀[各種配置此類程式碼的方法](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function)。
+✅ 使用異步編程模式是您工具箱中另一個非常有用的工具。閱讀[有關各種方式](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function)配置此類程式碼的資訊。
-恭喜!如果你構建了擴充功能(`npm run build`)並在擴充功能面板中刷新它,你就擁有了一個可運行的擴充功能!唯一尚未完成的是圖示,你將在下一課中修復它。
+恭喜!如果您構建了擴充功能(`npm run build`)並在擴充功能面板中刷新它,您就擁有了一個可運行的擴充功能!唯一尚未運行的是圖示,您將在下一課中修復它。
---
## 🚀 挑戰
-我們在這些課程中已經討論了幾種 API 類型。選擇一個網頁 API,深入研究它提供的功能。例如,查看瀏覽器中可用的 API,例如 [HTML 拖放 API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API)。在你看來,什麼樣的 API 才是出色的?
+我們在這些課程中已經討論了幾種類型的 API。選擇一個網頁 API,深入研究它提供的功能。例如,查看瀏覽器中可用的 API,例如 [HTML 拖放 API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API)。在您看來,什麼樣的 API 是出色的?
## 課後測驗
@@ -228,11 +228,13 @@ async function displayCarbonUsage(apiKey, region) {
## 回顧與自學
-在本課中,你學到了 LocalStorage 和 API,這兩者對專業網頁開發者來說都非常有用。你能想到這兩者如何協同工作嗎?思考一下如何設計一個網站,將資料存儲起來以供 API 使用。
+在本課中,您學習了 LocalStorage 和 API,這兩者對專業網頁開發人員都非常有用。您能想到這兩者如何協同工作嗎?思考一下,您將如何設計一個網站來存儲供 API 使用的項目。
## 作業
[採用一個 API](assignment.md)
+---
+
**免責聲明**:
-本文檔使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/5-browser-extension/3-background-tasks-and-performance/README.md b/translations/mo/5-browser-extension/3-background-tasks-and-performance/README.md
index ac32606a..abc96804 100644
--- a/translations/mo/5-browser-extension/3-background-tasks-and-performance/README.md
+++ b/translations/mo/5-browser-extension/3-background-tasks-and-performance/README.md
@@ -1,13 +1,13 @@
-# 瀏覽器擴展項目第 3 部分:了解背景任務與效能
+# 瀏覽器擴充功能專案第三部分:了解背景任務與效能
## 課前測驗
@@ -15,59 +15,59 @@ CO_OP_TRANSLATOR_METADATA:
### 簡介
-在本模組的前兩節課中,你學會了如何建立一個表單以及用於顯示從 API 獲取的數據的區域。這是一種非常標準的方式來建立網頁。你甚至學會了如何異步獲取數據。你的瀏覽器擴展幾乎已經完成了。
+在本模組的前兩節課中,你學習了如何建立一個表單以及顯示從 API 獲取的資料區域。這是一種非常標準的方式來建立網頁。你甚至學會了如何處理非同步資料獲取。你的瀏覽器擴充功能已經接近完成。
-現在剩下的就是管理一些背景任務,包括刷新擴展圖標的顏色,因此這是一個很好的時機來討論瀏覽器如何管理這類任務。在構建網頁資產時,讓我們從效能的角度來思考這些瀏覽器任務。
+現在需要管理一些背景任務,包括刷新擴充功能圖示的顏色,因此這是一個很好的時機來討論瀏覽器如何管理這類任務。在建立網頁資產時,我們可以從效能的角度來思考這些瀏覽器任務。
## 網頁效能基礎
-> 「網站效能關乎兩件事:頁面加載的速度,以及頁面上程式碼執行的速度。」-- [Zack Grossbart](https://www.smashingmagazine.com/2012/06/javascript-profiling-chrome-developer-tools/)
+> 「網站效能主要關乎兩件事:頁面載入速度,以及頁面上的程式碼執行速度。」-- [Zack Grossbart](https://www.smashingmagazine.com/2012/06/javascript-profiling-chrome-developer-tools/)
-如何讓你的網站在各種設備、各類用戶以及各種情況下都能快速運行,這個話題自然非常廣泛。以下是一些在構建標準網頁項目或瀏覽器擴展時需要記住的要點。
+如何讓你的網站在各種裝置、各種使用者以及各種情境下都能快速運行是一個非常廣泛的主題。以下是一些在建立標準網頁專案或瀏覽器擴充功能時需要注意的要點。
-確保網站高效運行的第一步是收集其效能數據。第一個可以查看的地方是瀏覽器的開發者工具。在 Edge 瀏覽器中,你可以點擊「設定與更多」按鈕(瀏覽器右上角的三點圖標),然後導航到「更多工具 > 開發者工具」,並打開「效能」標籤。你也可以使用快捷鍵 `Ctrl` + `Shift` + `I`(Windows)或 `Option` + `Command` + `I`(Mac)來打開開發者工具。
+確保網站高效運行的第一步是收集其效能的相關資料。最直接的地方就是瀏覽器的開發者工具。在 Edge 瀏覽器中,你可以點選「設定及更多」按鈕(瀏覽器右上角的三點圖示),然後導航到「更多工具 > 開發者工具」,並打開「效能」標籤。你也可以使用快捷鍵 `Ctrl` + `Shift` + `I`(Windows)或 `Option` + `Command` + `I`(Mac)來開啟開發者工具。
-「效能」標籤包含一個分析工具。打開一個網站(例如 [https://www.microsoft.com](https://www.microsoft.com/?WT.mc_id=academic-77807-sagibbon)),點擊「記錄」按鈕,然後刷新網站。隨時停止記錄,你將能看到生成的「腳本」、「渲染」和「繪製」網站的例程:
+「效能」標籤包含一個分析工具。打開一個網站(例如 [https://www.microsoft.com](https://www.microsoft.com/?WT.mc_id=academic-77807-sagibbon)),點擊「記錄」按鈕,然後刷新網站。隨時停止記錄,你就能看到生成的例程,包括「腳本」、「渲染」和「繪製」網站的過程:

-✅ 參考 [Microsoft 文件](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) 了解 Edge 中「效能」面板的使用方法
+✅ 參考 [Microsoft 文件](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) 了解 Edge 中效能面板的使用方法
-> 提示:為了獲取網站啟動時間的準確讀數,請清除瀏覽器的快取
+> 提示:為了獲得網站啟動時間的準確讀數,請清除瀏覽器的快取
-選擇分析時間軸中的元素,放大頁面加載過程中的事件。
+選擇分析時間軸的元素,放大頁面載入過程中的事件。
-通過選擇分析時間軸的一部分並查看摘要面板,獲取頁面效能的快照:
+透過選擇分析時間軸的一部分,並查看摘要面板,獲取頁面效能的快照:

-檢查「事件日誌」面板,查看是否有任何事件超過了 15 毫秒:
+檢查事件日誌面板,查看是否有任何事件超過 15 毫秒:

-✅ 熟悉你的分析工具!打開本網站的開發者工具,看看是否有任何瓶頸。加載最慢的資產是什麼?最快的是什麼?
+✅ 熟悉你的分析工具!在本網站上開啟開發者工具,看看是否有任何瓶頸。哪個資產載入最慢?哪個最快?
-## 效能檢查
+## 分析檢查
-通常來說,為了避免在部署到生產環境時出現意外,每位網頁開發者都應該注意一些「問題區域」。
+一般來說,所有網頁開發者在建立網站時都應注意一些「問題區域」,以避免在部署到生產環境時出現意外。
-**資產大小**:近年來,網頁變得越來越「重」,因此也變得更慢。這部分重量與圖片的使用有關。
+**資產大小**:近年來,網頁變得「更重」,因此速度也變慢了。其中一部分重量來自於圖片的使用。
-✅ 瀏覽 [Internet Archive](https://httparchive.org/reports/page-weight) 了解頁面重量的歷史視圖及更多資訊。
+✅ 查看 [Internet Archive](https://httparchive.org/reports/page-weight) 了解網頁重量的歷史視角及更多資訊。
-一個好的做法是確保圖片已經過優化,並以適合用戶的大小和解析度進行傳遞。
+一個良好的做法是確保圖片已被優化,並以適合使用者的大小和解析度提供。
-**DOM 遍歷**:瀏覽器需要根據你編寫的程式碼構建其文件物件模型(DOM),因此為了提升頁面效能,應保持標籤的最小化,只使用和樣式化頁面所需的內容。例如,與頁面相關的多餘 CSS 可以進行優化;僅需在某一頁面使用的樣式不需要包含在主樣式表中。
+**DOM 遍歷**:瀏覽器需要根據你撰寫的程式碼建立其文件物件模型(DOM),因此為了良好的頁面效能,應保持標籤的最小化,只使用和樣式化頁面所需的內容。例如,僅需在某一頁使用的樣式不需要包含在主要樣式表中。
-**JavaScript**:每位 JavaScript 開發者都應注意「渲染阻塞」腳本,這些腳本必須在 DOM 被遍歷和繪製到瀏覽器之前加載完成。考慮對內聯腳本使用 `defer`(如在 Terrarium 模組中所示)。
+**JavaScript**:每位 JavaScript 開發者都應注意「渲染阻塞」腳本,這些腳本必須在瀏覽器遍歷和繪製 DOM 之前載入。考慮在內嵌腳本中使用 `defer`(如在 Terrarium 模組中所示)。
✅ 在 [網站速度測試網站](https://www.webpagetest.org/) 上嘗試一些網站,了解用於判斷網站效能的常見檢查。
-現在你已經了解了瀏覽器如何渲染你傳遞的資產,讓我們來看看完成擴展所需的最後幾步:
+現在你已經了解瀏覽器如何渲染你提供的資產,接下來我們來看看完成擴充功能所需的最後幾個步驟:
-### 建立一個計算顏色的函數
+### 建立計算顏色的函數
-在 `/src/index.js` 中,於你設置的 `const` 變數之後新增一個名為 `calculateColor()` 的函數:
+在 `/src/index.js` 中,於你設置的 `const` 變數之後新增一個名為 `calculateColor()` 的函數,以便訪問 DOM:
```JavaScript
function calculateColor(value) {
@@ -88,19 +88,19 @@ function calculateColor(value) {
}
```
-這裡發生了什麼?你傳入一個值(來自上一課完成的 API 呼叫中的碳強度),然後計算其值與顏色陣列中索引的接近程度。接著,你將最接近的顏色值傳遞給 chrome runtime。
+這裡發生了什麼?你傳入一個值(來自上一課完成的 API 呼叫中的碳強度),然後計算其值與顏色陣列中索引的接近程度。接著,你將最接近的顏色值傳送到 chrome runtime。
-chrome.runtime 提供了一個 [API](https://developer.chrome.com/extensions/runtime),用於處理各種背景任務,而你的擴展正在利用這個 API:
+chrome.runtime 有一個 [API](https://developer.chrome.com/extensions/runtime) 可處理各種背景任務,而你的擴充功能正在利用它:
-> 「使用 chrome.runtime API 來檢索背景頁面、返回有關 manifest 的詳細資訊,並監聽和響應應用或擴展生命週期中的事件。你還可以使用此 API 將 URL 的相對路徑轉換為完全限定的 URL。」
+> 「使用 chrome.runtime API 來檢索背景頁面、返回清單的詳細資訊,並監聽和回應應用程式或擴充功能生命週期中的事件。你也可以使用此 API 將 URL 的相對路徑轉換為完整的 URL。」
-✅ 如果你正在為 Edge 開發此瀏覽器擴展,可能會驚訝於你正在使用 chrome API。新版 Edge 瀏覽器基於 Chromium 瀏覽器引擎,因此你可以利用這些工具。
+✅ 如果你正在為 Edge 開發此瀏覽器擴充功能,可能會驚訝於你正在使用 chrome API。新版 Edge 瀏覽器基於 Chromium 瀏覽器引擎,因此你可以利用這些工具。
-> 注意,如果你想分析瀏覽器擴展,請從擴展本身內部啟動開發者工具,因為它是獨立的瀏覽器實例。
+> 注意,如果你想分析瀏覽器擴充功能,請從擴充功能本身內部啟動開發者工具,因為它是獨立的瀏覽器實例。
-### 設置預設圖標顏色
+### 設定預設圖示顏色
-現在,在 `init()` 函數中,通過再次調用 chrome 的 `updateIcon` 操作,將圖標設置為預設的綠色:
+現在,在 `init()` 函數中,透過再次調用 chrome 的 `updateIcon` 動作,將圖示設置為預設的綠色:
```JavaScript
chrome.runtime.sendMessage({
@@ -111,16 +111,16 @@ chrome.runtime.sendMessage({
});
```
-### 調用函數並執行呼叫
+### 呼叫函數並執行呼叫
-接下來,將你剛剛創建的函數添加到 C02Signal API 返回的 promise 中:
+接下來,透過將其新增到 C02Signal API 返回的 promise 中,呼叫你剛剛建立的函數:
```JavaScript
//let CO2...
calculateColor(CO2);
```
-最後,在 `/dist/background.js` 中,為這些背景操作呼叫新增監聽器:
+最後,在 `/dist/background.js` 中,新增監聽器以監聽這些背景動作呼叫:
```JavaScript
chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
@@ -142,19 +142,19 @@ function drawIcon(value) {
}
```
-在這段程式碼中,你為任何發送到後端任務管理器的消息新增了一個監聽器。如果消息名稱是 'updateIcon',則執行接下來的程式碼,使用 Canvas API 繪製適當顏色的圖標。
+在這段程式碼中,你新增了一個監聽器來監聽發送到後端任務管理器的任何訊息。如果訊息名稱是 'updateIcon',則執行接下來的程式碼,使用 Canvas API 繪製適當顏色的圖示。
✅ 你將在 [太空遊戲課程](../../6-space-game/2-drawing-to-canvas/README.md) 中學到更多關於 Canvas API 的知識。
-現在,重新構建你的擴展(`npm run build`),刷新並啟動你的擴展,觀察顏色的變化。是時候去跑個腿或洗碗了嗎?現在你知道了!
+現在,重新建置你的擴充功能(`npm run build`),刷新並啟動你的擴充功能,觀察顏色的變化。是時候去跑個腿或洗碗了嗎?現在你知道了!
-恭喜!你已經構建了一個實用的瀏覽器擴展,並學到了更多關於瀏覽器的工作原理以及如何分析其效能的知識。
+恭喜你!你已經建立了一個實用的瀏覽器擴充功能,並且更深入了解瀏覽器的運作方式以及如何分析其效能。
---
## 🚀 挑戰
-調查一些已經存在很長時間的開源網站,根據其 GitHub 歷史,看看它們是否在效能方面進行了優化。如果有,找出它們的優化方式。最常見的痛點是什麼?
+調查一些已存在多年的開源網站,根據其 GitHub 歷史,看看是否能判斷它們在效能方面的優化過程。如果有的話,最常見的痛點是什麼?
## 課後測驗
@@ -164,11 +164,13 @@ function drawIcon(value) {
考慮訂閱一份 [效能相關的電子報](https://perf.email/)
-調查瀏覽器如何通過其網頁工具中的效能標籤來評估網頁效能。你是否發現了任何主要差異?
+調查瀏覽器如何透過其開發工具中的效能標籤來評估網頁效能。你是否發現任何主要差異?
## 作業
[分析網站效能](assignment.md)
+---
+
**免責聲明**:
-本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤讀概不負責。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/6-space-game/1-introduction/README.md b/translations/mo/6-space-game/1-introduction/README.md
index da63290f..515df73c 100644
--- a/translations/mo/6-space-game/1-introduction/README.md
+++ b/translations/mo/6-space-game/1-introduction/README.md
@@ -1,8 +1,8 @@
-# 建立太空遊戲第 4 部分:新增雷射與碰撞檢測
+# 建造太空遊戲第四部分:添加雷射並檢測碰撞
## 課前測驗
[課前測驗](https://ff-quizzes.netlify.app/web/quiz/35)
-在這節課中,你將學習如何用 JavaScript 發射雷射!我們將為遊戲新增兩個功能:
+在這節課中,你將學習如何使用 JavaScript 發射雷射!我們將為遊戲添加以下兩個功能:
-- **雷射**:從英雄的飛船發射,垂直向上移動
-- **碰撞檢測**:作為實現射擊功能的一部分,我們還會加入一些有趣的遊戲規則:
- - **雷射擊中敵人**:敵人被雷射擊中後會死亡
- - **雷射擊中螢幕頂部**:雷射擊中螢幕頂部後會被銷毀
- - **敵人與英雄碰撞**:敵人與英雄相撞後雙方都會被銷毀
- - **敵人到達螢幕底部**:敵人到達螢幕底部後,敵人和英雄都會被銷毀
+- **雷射**:雷射從英雄的飛船垂直向上發射
+- **碰撞檢測**:作為實現射擊功能的一部分,我們還會添加一些有趣的遊戲規則:
+ - **雷射擊中敵人**:雷射擊中敵人時,敵人會被消滅
+ - **雷射擊中屏幕頂部**:雷射擊中屏幕頂部時會被銷毀
+ - **敵人與英雄碰撞**:敵人與英雄相撞時,雙方都會被銷毀
+ - **敵人到達屏幕底部**:敵人到達屏幕底部時,敵人和英雄都會被銷毀
-簡而言之,你——*英雄*——需要在敵人到達螢幕底部之前,用雷射擊中所有敵人。
+簡而言之,你——*英雄*——需要在敵人到達屏幕底部之前,用雷射擊中所有敵人。
-✅ 做一些研究,了解第一款電腦遊戲的功能是什麼?
+✅ 做一些研究,了解第一個被編寫的電腦遊戲。它的功能是什麼?
讓我們一起成為英雄吧!
## 碰撞檢測
-我們該如何進行碰撞檢測?我們需要將遊戲物件視為移動的矩形。為什麼呢?因為用來繪製遊戲物件的圖像本身就是一個矩形:它有 `x`、`y`、`width` 和 `height`。
+我們如何進行碰撞檢測?需要將遊戲中的物件視為移動的矩形。你可能會問為什麼?因為用來繪製遊戲物件的圖像是一個矩形:它有 `x`、`y`、`寬度` 和 `高度`。
-如果兩個矩形(例如英雄和敵人)*相交*,就發生了碰撞。碰撞後應該發生什麼,取決於遊戲規則。要實現碰撞檢測,你需要以下幾步:
+如果兩個矩形(例如英雄和敵人)*相交*,就發生了碰撞。碰撞後應該發生什麼取決於遊戲規則。要實現碰撞檢測,你需要以下內容:
-1. 一種方法來獲取遊戲物件的矩形表示,例如:
+1. 一種獲取遊戲物件矩形表示的方法,例如:
```javascript
rectFromGameObject() {
@@ -60,14 +60,14 @@ CO_OP_TRANSLATOR_METADATA:
## 我們如何銷毀物件
-在遊戲中銷毀物件需要讓遊戲知道不再需要在遊戲迴圈中繪製該物件。實現方法是當某些事件發生時,將遊戲物件標記為*死亡*,如下所示:
+在遊戲中銷毀物件需要讓遊戲知道在某個時間間隔觸發的遊戲循環中不再繪製該物件。一種方法是當某些事情發生時,將遊戲物件標記為*死亡*,例如:
```javascript
// collision happened
enemy.dead = true
```
-接著,你可以在重新繪製螢幕之前,將*死亡*的物件過濾掉,如下所示:
+然後在重新繪製屏幕之前,篩選出*死亡*的物件,例如:
```javascript
gameObjects = gameObject.filter(go => !go.dead);
@@ -75,15 +75,15 @@ gameObjects = gameObject.filter(go => !go.dead);
## 我們如何發射雷射
-發射雷射的過程是響應按鍵事件並創建一個向某個方向移動的物件。因此,我們需要執行以下步驟:
+發射雷射意味著響應按鍵事件並創建一個向某個方向移動的物件。因此,我們需要執行以下步驟:
-1. **創建雷射物件**:從英雄飛船的頂部發射,並在創建後立即開始向螢幕頂部移動。
+1. **創建雷射物件**:從英雄飛船的頂部開始,創建後立即向屏幕頂部移動。
2. **綁定按鍵事件**:選擇鍵盤上的某個按鍵來代表玩家發射雷射。
-3. **當按鍵被按下時,創建一個看起來像雷射的遊戲物件**。
+3. **創建看起來像雷射的遊戲物件**:當按鍵被按下時。
## 雷射的冷卻時間
-雷射需要在每次按下按鍵(例如 *空格鍵*)時發射。為了防止遊戲在短時間內生成過多雷射,我們需要解決這個問題。解決方法是實現所謂的*冷卻時間*,一個計時器,確保雷射只能在一定時間間隔內發射一次。你可以這樣實現:
+雷射需要在每次按下按鍵(例如空格鍵)時發射。為了防止短時間內生成過多雷射,我們需要解決這個問題。解決方法是實現所謂的*冷卻時間*,即一個計時器,確保雷射只能以一定頻率發射。你可以這樣實現:
```javascript
class Cooldown {
@@ -109,23 +109,23 @@ class Weapon {
}
```
-✅ 回顧太空遊戲系列的第 1 節課,重新了解*冷卻時間*的概念。
+✅ 回顧太空遊戲系列的第一課,重新了解*冷卻時間*。
-## 要建構的內容
+## 要建造什麼
-你將使用上一節課的現有程式碼(應該已經清理和重構過),並進行擴展。可以從第 II 部分的程式碼開始,或者使用 [第 III 部分的起始程式碼](../../../../../../../../../your-work)。
+你將使用上一課的現有代碼(應該已清理並重構),並進行擴展。可以從第二部分的代碼開始,或者使用 [第三部分的起始代碼](../../../../../../../../../your-work)。
-> 提示:你將使用的雷射已經在資產資料夾中,並且已被程式碼引用。
+> 提示:你要使用的雷射已經在資產文件夾中,並且已被代碼引用。
-- **新增碰撞檢測**,當雷射與某物件碰撞時,應遵循以下規則:
- 1. **雷射擊中敵人**:敵人被雷射擊中後會死亡
- 2. **雷射擊中螢幕頂部**:雷射擊中螢幕頂部後會被銷毀
- 3. **敵人與英雄碰撞**:敵人與英雄相撞後雙方都會被銷毀
- 4. **敵人到達螢幕底部**:敵人到達螢幕底部後,敵人和英雄都會被銷毀
+- **添加碰撞檢測**:當雷射與某物件碰撞時,應遵循以下規則:
+ 1. **雷射擊中敵人**:雷射擊中敵人時,敵人會被消滅
+ 2. **雷射擊中屏幕頂部**:雷射擊中屏幕頂部時會被銷毀
+ 3. **敵人與英雄碰撞**:敵人與英雄相撞時,雙方都會被銷毀
+ 4. **敵人到達屏幕底部**:敵人到達屏幕底部時,敵人和英雄都會被銷毀
## 建議步驟
-找到在 `your-work` 子資料夾中為你創建的檔案。它應包含以下內容:
+找到在 `your-work` 子文件夾中為你創建的文件。它應包含以下內容:
```bash
-| assets
@@ -137,18 +137,18 @@ class Weapon {
-| package.json
```
-在 `your_work` 資料夾中輸入以下指令來啟動專案:
+你可以通過輸入以下命令啟動你的項目:
```bash
cd your-work
npm start
```
-上述指令會在位址 `http://localhost:5000` 啟動一個 HTTP 伺服器。打開瀏覽器並輸入該位址,目前應該可以看到英雄和所有敵人,但它們尚未移動。
+上述命令會在地址 `http://localhost:5000` 上啟動 HTTP 伺服器。打開瀏覽器並輸入該地址,目前應該只渲染英雄和所有敵人,還沒有任何移動。
-### 新增程式碼
+### 添加代碼
-1. **為遊戲物件設置矩形表示以處理碰撞** 以下程式碼允許你獲取 `GameObject` 的矩形表示。編輯你的 GameObject 類別以擴展它:
+1. **設置遊戲物件的矩形表示以處理碰撞** 以下代碼允許你獲取 `GameObject` 的矩形表示。編輯你的 GameObject 類以擴展它:
```javascript
rectFromGameObject() {
@@ -161,7 +161,7 @@ npm start
}
```
-2. **新增檢查碰撞的程式碼** 這將是一個新函數,用於測試兩個矩形是否相交:
+2. **添加檢測碰撞的代碼** 這將是一個新函數,用於測試兩個矩形是否相交:
```javascript
function intersectRect(r1, r2) {
@@ -174,8 +174,8 @@ npm start
}
```
-3. **新增雷射發射功能**
- 1. **新增按鍵事件訊息**。*空格鍵*應在英雄飛船上方創建一個雷射。在 Messages 物件中新增三個常數:
+3. **添加雷射發射功能**
+ 1. **添加按鍵事件消息**。空格鍵應在英雄飛船上方創建雷射。在 Messages 物件中添加三個常量:
```javascript
KEY_EVENT_SPACE: "KEY_EVENT_SPACE",
@@ -191,7 +191,7 @@ npm start
}
```
- 1. **新增監聽器**。編輯 `initGame()` 函數,確保當按下空格鍵時英雄可以發射雷射:
+ 1. **添加監聽器**。編輯 `initGame()` 函數以確保英雄在按下空格鍵時可以發射雷射:
```javascript
eventEmitter.on(Messages.KEY_EVENT_SPACE, () => {
@@ -200,7 +200,7 @@ npm start
}
```
- 並新增一個新的 `eventEmitter.on()` 函數,以確保當敵人與雷射碰撞時的行為:
+ 並添加新的 `eventEmitter.on()` 函數以確保當敵人與雷射碰撞時的行為:
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
@@ -209,7 +209,7 @@ npm start
})
```
- 1. **移動物件**,確保雷射逐漸移動到螢幕頂部。你將創建一個新的 Laser 類別,繼承自 `GameObject`,如之前所做:
+ 1. **移動物件**,確保雷射逐漸移動到屏幕頂部。你將創建一個新的 Laser 類,該類擴展了 `GameObject`,如之前所做:
```javascript
class Laser extends GameObject {
@@ -230,7 +230,7 @@ npm start
}
```
- 1. **處理碰撞**,為雷射實現碰撞規則。新增一個 `updateGameObjects()` 函數,用於測試碰撞物件是否命中:
+ 1. **處理碰撞**,實現雷射的碰撞規則。添加一個 `updateGameObjects()` 函數,用於測試碰撞物件是否命中:
```javascript
function updateGameObjects() {
@@ -252,11 +252,11 @@ npm start
}
```
- 確保將 `updateGameObjects()` 新增到 `window.onload` 的遊戲迴圈中。
+ 確保將 `updateGameObjects()` 添加到 `window.onload` 的遊戲循環中。
- 4. **實現雷射的冷卻時間**,確保雷射只能在一定時間間隔內發射。
+ 4. **實現雷射的冷卻時間**,確保雷射只能以一定頻率發射。
- 最後,編輯 Hero 類別以實現冷卻功能:
+ 最後,編輯 Hero 類以實現冷卻功能:
```javascript
class Hero extends GameObject {
@@ -285,13 +285,13 @@ npm start
}
```
-到這裡為止,你的遊戲已經具備了一些功能!你可以用方向鍵移動,用空格鍵發射雷射,並且當雷射擊中敵人時,敵人會消失。做得好!
+到這裡,你的遊戲已經具備了一些功能!你可以使用方向鍵移動,用空格鍵發射雷射,並且當雷射擊中敵人時,敵人會消失。做得好!
---
## 🚀 挑戰
-新增爆炸效果!查看 [Space Art 資源庫](../../../../6-space-game/solution/spaceArt/readme.txt) 中的遊戲資產,嘗試在雷射擊中外星人時新增爆炸效果。
+添加爆炸效果!查看 [太空藝術資源庫](../../../../6-space-game/solution/spaceArt/readme.txt) 中的遊戲資產,嘗試在雷射擊中外星人時添加爆炸效果。
## 課後測驗
@@ -299,11 +299,13 @@ npm start
## 回顧與自學
-試著調整遊戲中的時間間隔,觀察會發生什麼變化?閱讀更多關於 [JavaScript 計時事件](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/) 的內容。
+嘗試調整遊戲中的時間間隔。當你改變它們時會發生什麼?閱讀更多關於 [JavaScript 計時事件](https://www.freecodecamp.org/news/javascript-timing-events-settimeout-and-setinterval/) 的內容。
## 作業
[探索碰撞](assignment.md)
+---
+
**免責聲明**:
-本文檔使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/6-space-game/5-keeping-score/README.md b/translations/mo/6-space-game/5-keeping-score/README.md
index 10d15db8..887cb56e 100644
--- a/translations/mo/6-space-game/5-keeping-score/README.md
+++ b/translations/mo/6-space-game/5-keeping-score/README.md
@@ -1,23 +1,23 @@
-# 建立太空遊戲第五部分:分數與生命
+# 建造太空遊戲第五部分:分數與生命
## 課前測驗
[課前測驗](https://ff-quizzes.netlify.app/web/quiz/37)
-在本課中,你將學習如何在遊戲中加入分數計算以及生命機制。
+在本課中,你將學習如何在遊戲中添加分數並計算生命。
## 在螢幕上繪製文字
-為了能夠在螢幕上顯示遊戲分數,你需要知道如何在螢幕上放置文字。答案是使用 canvas 物件的 `fillText()` 方法。你還可以控制其他方面,例如使用的字體、文字的顏色,甚至是對齊方式(左、右、置中)。以下是一些在螢幕上繪製文字的程式碼範例。
+為了能夠在螢幕上顯示遊戲分數,你需要知道如何在螢幕上放置文字。答案是使用畫布物件的 `fillText()` 方法。你還可以控制其他方面,例如使用什麼字體、文字的顏色,甚至文字的對齊方式(左、右、居中)。以下是一些在螢幕上繪製文字的程式碼。
```javascript
ctx.font = "30px Arial";
@@ -26,22 +26,22 @@ ctx.textAlign = "right";
ctx.fillText("show this on the screen", 0, 0);
```
-✅ 閱讀更多關於[如何在 canvas 上添加文字](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_text)的內容,並隨意讓你的文字看起來更有特色!
+✅ 閱讀更多關於[如何在畫布上添加文字](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_text)的內容,並隨意讓你的文字看起來更有趣!
## 生命作為遊戲概念
-在遊戲中,生命的概念只是一個數字。在太空遊戲的情境中,通常會分配一組生命值,當你的飛船受到傷害時,生命值會逐一扣減。如果能用圖形化的方式來表示,例如小型飛船或愛心,而不是單純的數字,會更有趣。
+在遊戲中,生命的概念只是一個數字。在太空遊戲的背景下,通常會分配一組生命,當你的飛船受到傷害時,生命會逐一減少。如果能用迷你飛船或心形圖案來顯示生命的圖形表示,而不是僅僅用數字,會更好。
-## 要實現的功能
+## 要建造什麼
-讓我們為你的遊戲新增以下功能:
+讓我們在你的遊戲中添加以下內容:
-- **遊戲分數**:每摧毀一艘敵方飛船,英雄應該獲得一些分數,我們建議每艘飛船 100 分。遊戲分數應顯示在左下角。
-- **生命**:你的飛船有三條生命。每當敵方飛船與你碰撞時,你會失去一條生命。生命分數應顯示在右下角,並由以下圖形表示 。
+- **遊戲分數**:每摧毀一艘敵方飛船,英雄應獲得一些分數,我們建議每艘飛船獲得100分。遊戲分數應顯示在左下角。
+- **生命**:你的飛船有三條生命。每當敵方飛船與你碰撞時,你會失去一條生命。生命分數應顯示在右下角,並由以下圖形表示 。
## 建議步驟
-找到在 `your-work` 子資料夾中為你建立的檔案。它應包含以下內容:
+找到在 `your-work` 子資料夾中為你創建的檔案。它應包含以下內容:
```bash
-| assets
@@ -53,24 +53,24 @@ ctx.fillText("show this on the screen", 0, 0);
-| package.json
```
-你可以透過輸入以下指令啟動你的專案:
+你可以通過輸入以下指令在 `your_work` 資料夾中啟動你的專案:
```bash
cd your-work
npm start
```
-上述指令會在位址 `http://localhost:5000` 啟動一個 HTTP 伺服器。打開瀏覽器並輸入該位址,目前應該會顯示英雄和所有敵人,當你按下左右方向鍵時,英雄會移動並能射擊敵人。
+上述指令將在地址 `http://localhost:5000` 上啟動一個 HTTP 伺服器。打開瀏覽器並輸入該地址,現在它應該渲染英雄和所有敵人,當你按下左右箭頭時,英雄會移動並可以擊落敵人。
-### 新增程式碼
+### 添加程式碼
-1. **複製所需資產** 從 `solution/assets/` 資料夾複製到 `your-work` 資料夾;你將新增一個 `life.png` 資產。在 `window.onload` 函數中新增 lifeImg:
+1. **複製所需資產** 從 `solution/assets/` 資料夾到 `your-work` 資料夾;你需要添加一個 `life.png` 資產。將 lifeImg 添加到 window.onload 函數中:
```javascript
lifeImg = await loadTexture("assets/life.png");
```
-1. 將 `lifeImg` 加入資產列表:
+1. 將 `lifeImg` 添加到資產列表中:
```javascript
let heroImg,
@@ -80,7 +80,7 @@ npm start
eventEmitter = new EventEmitter();
```
-2. **新增變數**。新增代表總分數(0)和剩餘生命(3)的程式碼,並在螢幕上顯示這些分數。
+2. **添加變數**。添加代表你的總分數(0)和剩餘生命(3)的程式碼,並在螢幕上顯示這些分數。
3. **擴展 `updateGameObjects()` 函數**。擴展 `updateGameObjects()` 函數以處理敵人碰撞:
@@ -93,8 +93,8 @@ npm start
})
```
-4. **新增生命與分數**。
- 1. **初始化變數**。在 `Hero` 類別中的 `this.cooldown = 0` 下,設定生命與分數:
+4. **添加生命和分數**。
+ 1. **初始化變數**。在 `Hero` 類中的 `this.cooldown = 0` 下設置生命和分數:
```javascript
this.life = 3;
@@ -128,7 +128,7 @@ npm start
```
- 1. **將方法新增到遊戲迴圈**。確保你在 `window.onload` 函數中於 `updateGameObjects()` 下新增這些函數:
+ 1. **將方法添加到遊戲循環**。確保你在 `updateGameObjects()` 下將這些函數添加到你的 window.onload 函數中:
```javascript
drawPoints();
@@ -137,9 +137,9 @@ npm start
1. **實現遊戲規則**。實現以下遊戲規則:
- 1. **每次英雄與敵人碰撞**,扣減一條生命。
+ 1. **每次英雄與敵人碰撞**,扣除一條生命。
- 擴展 `Hero` 類別以執行此扣減:
+ 擴展 `Hero` 類以執行此扣除:
```javascript
decrementLife() {
@@ -150,9 +150,9 @@ npm start
}
```
- 2. **每次雷射擊中敵人**,遊戲分數增加 100 分。
+ 2. **每次雷射擊中敵人**,遊戲分數增加100分。
- 擴展 `Hero` 類別以執行此增加:
+ 擴展 Hero 類以執行此增量:
```javascript
incrementPoints() {
@@ -160,7 +160,7 @@ npm start
}
```
- 將這些函數新增到你的碰撞事件觸發器中:
+ 將這些函數添加到你的碰撞事件發射器中:
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
@@ -175,15 +175,15 @@ npm start
});
```
-✅ 做一些研究,了解其他使用 JavaScript/Canvas 創建的遊戲。它們有哪些共同特點?
+✅ 做一些研究,探索其他使用 JavaScript/Canvas 創建的遊戲。它們有哪些共同特點?
-完成這些工作後,你應該能在右下角看到小型的「生命」飛船圖示,左下角顯示分數,並且當你與敵人碰撞時生命數會減少,當你射擊敵人時分數會增加。做得好!你的遊戲快完成了。
+完成這些工作後,你應該能在右下角看到小型的“生命”飛船,在左下角看到分數,並且當你與敵人碰撞時生命計數會減少,當你擊中敵人時分數會增加。做得好!你的遊戲幾乎完成了。
---
## 🚀 挑戰
-你的程式碼幾乎完成了。你能想像接下來的步驟嗎?
+你的程式碼幾乎完成了。你能想像下一步該做什麼嗎?
## 課後測驗
@@ -191,11 +191,13 @@ npm start
## 回顧與自學
-研究一些可以增加或減少遊戲分數與生命的方法。有一些有趣的遊戲引擎,例如 [PlayFab](https://playfab.com)。使用這些引擎如何能增強你的遊戲?
+研究一些可以增減遊戲分數和生命的方法。有一些有趣的遊戲引擎,例如 [PlayFab](https://playfab.com)。使用其中一個引擎如何能提升你的遊戲?
## 作業
-[建立一個計分遊戲](assignment.md)
+[建造一個計分遊戲](assignment.md)
+
+---
**免責聲明**:
-本文檔使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/6-space-game/6-end-condition/README.md b/translations/mo/6-space-game/6-end-condition/README.md
index 80572fb6..0155ca7f 100644
--- a/translations/mo/6-space-game/6-end-condition/README.md
+++ b/translations/mo/6-space-game/6-end-condition/README.md
@@ -1,8 +1,8 @@
-# 建立銀行應用程式第一部分:網頁應用中的 HTML 模板與路由
+# 建立銀行應用程式 第1部分:網頁應用中的HTML模板與路由
## 課前測驗
@@ -15,17 +15,17 @@ CO_OP_TRANSLATOR_METADATA:
### 簡介
-自從 JavaScript 在瀏覽器中出現以來,網站變得比以往更加互動且複雜。網頁技術現在常被用來建立直接在瀏覽器中運行的完整功能應用程式,我們稱之為[網頁應用程式](https://en.wikipedia.org/wiki/Web_application)。由於網頁應用程式高度互動,使用者不希望每次執行操作時都需要等待整個頁面重新載入。因此,JavaScript 被用來直接使用 DOM 更新 HTML,以提供更流暢的使用者體驗。
+自從JavaScript在瀏覽器中出現以來,網站變得比以往更加互動且複雜。網頁技術現在常被用來創建完全功能化的應用程式,這些應用程式直接在瀏覽器中運行,我們稱之為[網頁應用程式](https://en.wikipedia.org/wiki/Web_application)。由於網頁應用程式高度互動化,使用者不希望每次執行操作時都需要重新載入整個頁面。因此,JavaScript被用來直接使用DOM更新HTML,以提供更流暢的使用者體驗。
-在本課程中,我們將建立銀行網頁應用的基礎,使用 HTML 模板來創建多個畫面,這些畫面可以顯示並更新,而無需重新載入整個 HTML 頁面。
+在本課程中,我們將奠定基礎,創建一個銀行網頁應用,使用HTML模板來創建多個畫面,這些畫面可以顯示並更新,而無需重新載入整個HTML頁面。
### 先決條件
-您需要一個本地網頁伺服器來測試我們在本課程中建立的網頁應用。如果您沒有,可以安裝 [Node.js](https://nodejs.org),並在您的專案資料夾中使用指令 `npx lite-server`。它將建立一個本地網頁伺服器並在瀏覽器中開啟您的應用程式。
+您需要一個本地網頁伺服器來測試我們在本課程中構建的網頁應用。如果您還沒有,可以安裝[Node.js](https://nodejs.org)並從您的專案資料夾中使用指令 `npx lite-server`。這將創建一個本地網頁伺服器並在瀏覽器中打開您的應用。
### 準備工作
-在您的電腦上建立一個名為 `bank` 的資料夾,並在其中建立一個名為 `index.html` 的檔案。我們將從這個 HTML [樣板代碼](https://en.wikipedia.org/wiki/Boilerplate_code)開始:
+在您的電腦上,創建一個名為`bank`的資料夾,並在其中建立一個名為`index.html`的檔案。我們將從這個HTML[樣板代碼](https://en.wikipedia.org/wiki/Boilerplate_code)開始:
```html
@@ -43,28 +43,28 @@ CO_OP_TRANSLATOR_METADATA:
---
-## HTML 模板
+## HTML模板
-如果您想為網頁建立多個畫面,一種解決方案是為每個要顯示的畫面建立一個 HTML 檔案。然而,這種解決方案有一些不便之處:
+如果您想為網頁創建多個畫面,一種解決方案是為您想顯示的每個畫面創建一個HTML檔案。然而,這種解決方案存在一些不便之處:
-- 切換畫面時需要重新載入整個 HTML,可能會很慢。
-- 在不同畫面之間共享資料會變得困難。
+- 切換畫面時需要重新載入整個HTML,這可能會很慢。
+- 在不同畫面之間共享數據會變得困難。
-另一種方法是僅使用一個 HTML 檔案,並使用 `
` 元素定義多個 [HTML 模板](https://developer.mozilla.org/docs/Web/HTML/Element/template)。模板是一個可重複使用的 HTML 區塊,瀏覽器不會顯示它,必須在運行時使用 JavaScript 實例化。
+另一種方法是僅使用一個HTML檔案,並使用``元素定義多個[HTML模板](https://developer.mozilla.org/docs/Web/HTML/Element/template)。模板是一個可重複使用的HTML區塊,瀏覽器不會顯示它,必須在運行時使用JavaScript實例化。
### 任務
-我們將建立一個具有兩個畫面的銀行應用程式:登入頁面和儀表板。首先,讓我們在 HTML 主體中新增一個佔位元素,稍後我們將用它來實例化應用程式的不同畫面:
+我們將創建一個具有兩個畫面的銀行應用:登入頁面和儀表板。首先,在HTML的`body`中添加一個佔位元素,我們將用它來實例化應用的不同畫面:
```html
Loading...
```
-我們給它一個 `id`,以便稍後使用 JavaScript 更容易找到它。
+我們給它一個`id`,以便稍後用JavaScript更容易找到它。
-> 提示:由於此元素的內容將被替換,我們可以放置一個加載訊息或指示器,當應用程式加載時會顯示。
+> 提示:由於此元素的內容將被替換,我們可以在其中放置一個加載消息或指示器,這將在應用加載時顯示。
-接下來,讓我們在 HTML 中新增登入頁面的模板。目前,我們只會在其中放置一個標題和一個包含導航連結的區段。
+接下來,在下面添加登入頁面的HTML模板。目前,我們只在其中放置一個標題和一個包含導航連結的區塊。
```html
@@ -75,11 +75,11 @@ CO_OP_TRANSLATOR_METADATA:
```
-然後,我們將新增另一個儀表板頁面的 HTML 模板。此頁面將包含不同的區段:
+然後,我們將為儀表板頁面添加另一個HTML模板。此頁面將包含不同的區塊:
- 一個包含標題和登出連結的標頭
- 銀行帳戶的當前餘額
-- 一個以表格顯示的交易列表
+- 一個以表格形式顯示的交易清單
```html
@@ -106,31 +106,31 @@ CO_OP_TRANSLATOR_METADATA:
```
-> 提示:在建立 HTML 模板時,如果您想查看它的外觀,可以將 `` 和 ` ` 行用 `` 註解掉。
+> 提示:在創建HTML模板時,如果您想查看它的外觀,可以用``將``和` `行註解掉。
-✅ 您認為我們為什麼要在模板上使用 `id` 屬性?我們是否可以使用其他方法,例如類別?
+✅ 您認為我們為什麼在模板上使用`id`屬性?我們是否可以使用其他東西,例如類別?
-## 使用 JavaScript 顯示模板
+## 使用JavaScript顯示模板
-如果您在瀏覽器中嘗試目前的 HTML 檔案,您會看到它停留在顯示 `Loading...`。這是因為我們需要新增一些 JavaScript 代碼來實例化並顯示 HTML 模板。
+如果您在瀏覽器中嘗試當前的HTML檔案,您會看到它卡在顯示`Loading...`。這是因為我們需要添加一些JavaScript代碼來實例化並顯示HTML模板。
實例化模板通常分為三個步驟:
-1. 在 DOM 中檢索模板元素,例如使用 [`document.getElementById`](https://developer.mozilla.org/docs/Web/API/Document/getElementById)。
-2. 使用 [`cloneNode`](https://developer.mozilla.org/docs/Web/API/Node/cloneNode) 複製模板元素。
-3. 將其附加到 DOM 中的可見元素,例如使用 [`appendChild`](https://developer.mozilla.org/docs/Web/API/Node/appendChild)。
+1. 在DOM中檢索模板元素,例如使用[`document.getElementById`](https://developer.mozilla.org/docs/Web/API/Document/getElementById)。
+2. 使用[`cloneNode`](https://developer.mozilla.org/docs/Web/API/Node/cloneNode)克隆模板元素。
+3. 將其附加到可見元素下的DOM中,例如使用[`appendChild`](https://developer.mozilla.org/docs/Web/API/Node/appendChild)。
-✅ 為什麼我們需要在附加到 DOM 之前複製模板?如果跳過這一步,您認為會發生什麼?
+✅ 為什麼我們需要在附加到DOM之前克隆模板?如果跳過這一步,您認為會發生什麼?
### 任務
-在您的專案資料夾中建立一個名為 `app.js` 的新檔案,並在 HTML 的 `` 區段中匯入該檔案:
+在您的專案資料夾中創建一個名為`app.js`的新檔案,並在HTML的``部分中導入該檔案:
```html
```
-現在在 `app.js` 中,我們將建立一個新函數 `updateRoute`:
+現在在`app.js`中,我們將創建一個新函數`updateRoute`:
```js
function updateRoute(templateId) {
@@ -142,19 +142,19 @@ function updateRoute(templateId) {
}
```
-我們在這裡執行的正是上述的三個步驟。我們使用 `templateId` 實例化模板,並將其複製的內容放入應用程式的佔位元素中。請注意,我們需要使用 `cloneNode(true)` 來複製模板的整個子樹。
+我們在這裡執行的正是上述的三個步驟。我們使用`templateId`實例化模板,並將其克隆的內容放入應用的佔位元素中。請注意,我們需要使用`cloneNode(true)`來複製模板的整個子樹。
-現在使用其中一個模板呼叫此函數並查看結果。
+現在調用此函數並傳入其中一個模板,查看結果。
```js
updateRoute('login');
```
-✅ 這段代碼 `app.innerHTML = '';` 的目的是什麼?如果沒有它會發生什麼?
+✅ 這段代碼`app.innerHTML = '';`的目的是什麼?如果沒有它會發生什麼?
-## 建立路由
+## 創建路由
-在談論網頁應用程式時,我們稱 *路由* 為將 **URL** 映射到應顯示的特定畫面的意圖。在具有多個 HTML 檔案的網站中,這是自動完成的,因為檔案路徑會反映在 URL 上。例如,在您的專案資料夾中有以下檔案:
+在談論網頁應用時,我們稱*路由*為將**URL**映射到應顯示的特定畫面的意圖。在具有多個HTML檔案的網站上,這是自動完成的,因為檔案路徑會反映在URL上。例如,在您的專案資料夾中有以下檔案:
```
mywebsite/index.html
@@ -162,7 +162,7 @@ mywebsite/login.html
mywebsite/admin/index.html
```
-如果您以 `mywebsite` 作為根目錄建立一個網頁伺服器,URL 映射將是:
+如果您以`mywebsite`作為根目錄創建一個網頁伺服器,URL映射將是:
```
https://site.com --> mywebsite/index.html
@@ -170,11 +170,11 @@ https://site.com/login.html --> mywebsite/login.html
https://site.com/admin/ --> mywebsite/admin/index.html
```
-然而,對於我們的網頁應用程式,我們使用的是包含所有畫面的單一 HTML 檔案,因此這種預設行為對我們沒有幫助。我們必須手動建立此映射並使用 JavaScript 更新顯示的模板。
+然而,對於我們的網頁應用,我們使用的是包含所有畫面的單一HTML檔案,因此這種預設行為對我們沒有幫助。我們必須手動創建這個映射,並使用JavaScript更新顯示的模板。
### 任務
-我們將使用一個簡單的物件來實現 [映射](https://en.wikipedia.org/wiki/Associative_array) URL 路徑與模板之間的關係。在您的 `app.js` 檔案頂部新增此物件。
+我們將使用一個簡單的物件來實現一個[映射](https://en.wikipedia.org/wiki/Associative_array),將URL路徑與我們的模板對應起來。在`app.js`檔案的頂部添加此物件。
```js
const routes = {
@@ -183,7 +183,7 @@ const routes = {
};
```
-現在讓我們稍微修改一下 `updateRoute` 函數。我們不再直接傳遞 `templateId` 作為參數,而是希望先查看當前 URL,然後使用我們的映射來獲取對應的模板 ID 值。我們可以使用 [`window.location.pathname`](https://developer.mozilla.org/docs/Web/API/Location/pathname) 來僅獲取 URL 的路徑部分。
+現在讓我們稍微修改一下`updateRoute`函數。我們不再直接將`templateId`作為參數傳遞,而是希望先查看當前的URL,然後使用我們的映射來獲取對應的模板ID值。我們可以使用[`window.location.pathname`](https://developer.mozilla.org/docs/Web/API/Location/pathname)來僅獲取URL中的路徑部分。
```js
function updateRoute() {
@@ -198,26 +198,26 @@ function updateRoute() {
}
```
-在這裡,我們將宣告的路由映射到對應的模板。您可以嘗試手動更改瀏覽器中的 URL,檢查它是否正確運作。
+在這裡,我們將聲明的路由映射到對應的模板。您可以嘗試手動更改瀏覽器中的URL,檢查是否正確運作。
-✅ 如果您在 URL 中輸入未知路徑會發生什麼?我們如何解決這個問題?
+✅ 如果您在URL中輸入一個未知路徑會發生什麼?我們該如何解決這個問題?
-## 新增導航功能
+## 添加導航功能
-我們應用程式的下一步是新增在頁面之間導航的功能,而不需要手動更改 URL。這涉及兩件事:
+應用的下一步是添加在頁面之間導航的功能,而不需要手動更改URL。這涉及兩件事:
-1. 更新當前 URL
-2. 根據新 URL 更新顯示的模板
+1. 更新當前的URL
+2. 根據新URL更新顯示的模板
-第二部分我們已經使用 `updateRoute` 函數處理了,因此我們需要弄清楚如何更新當前 URL。
+第二部分我們已經通過`updateRoute`函數處理了,因此我們需要弄清楚如何更新當前的URL。
-我們需要使用 JavaScript,特別是 [`history.pushState`](https://developer.mozilla.org/docs/Web/API/History/pushState),它允許更新 URL 並在瀏覽歷史中建立新條目,而不重新載入 HTML。
+我們需要使用JavaScript,具體來說是[`history.pushState`](https://developer.mozilla.org/docs/Web/API/History/pushState),它允許更新URL並在瀏覽歷史中創建新條目,而無需重新載入HTML。
-> 注意:雖然 HTML 錨點元素 [``](https://developer.mozilla.org/docs/Web/HTML/Element/a) 本身可以用來建立指向不同 URL 的超連結,但它預設會使瀏覽器重新載入 HTML。在使用自定義 JavaScript 處理路由時,必須使用 `preventDefault()` 函數來防止此行為。
+> 注意:雖然HTML的錨點元素[` `](https://developer.mozilla.org/docs/Web/HTML/Element/a)本身可以用來創建指向不同URL的超連結,但它預設會使瀏覽器重新載入HTML。在處理自定義JavaScript路由時,需要使用`preventDefault()`函數來防止此行為。
### 任務
-讓我們建立一個新函數,用於在應用程式中導航:
+讓我們創建一個新函數,用於在應用中導航:
```js
function navigate(path) {
@@ -226,9 +226,9 @@ function navigate(path) {
}
```
-此方法首先根據給定的路徑更新當前 URL,然後更新模板。屬性 `window.location.origin` 返回 URL 根目錄,允許我們從給定路徑重建完整 URL。
+此方法首先根據給定的路徑更新當前URL,然後更新模板。屬性`window.location.origin`返回URL的根目錄,允許我們從給定路徑重建完整的URL。
-現在我們有了這個函數,可以解決當路徑不匹配任何定義的路由時的問題。我們將通過新增回退到現有路由之一來修改 `updateRoute` 函數。
+現在我們有了這個函數,我們可以解決當路徑與任何定義的路由不匹配時的問題。我們將通過在`updateRoute`函數中添加一個回退到現有路由的邏輯來解決這個問題。
```js
function updateRoute() {
@@ -242,9 +242,9 @@ function updateRoute() {
...
```
-如果找不到路由,我們現在會重定向到 `login` 頁面。
+如果找不到路由,我們現在將重定向到`login`頁面。
-現在讓我們建立一個函數,用於在點擊連結時獲取 URL,並防止瀏覽器的預設連結行為:
+接下來,我們創建一個函數來獲取點擊連結時的URL,並防止瀏覽器的預設連結行為:
```js
function onLinkClick(event) {
@@ -253,7 +253,7 @@ function onLinkClick(event) {
}
```
-讓我們通過在 HTML 中的 *登入* 和 *登出* 連結上新增綁定來完成導航系統。
+最後,通過在HTML中的*登入*和*登出*連結上添加綁定來完成導航系統。
```html
Login
@@ -261,48 +261,48 @@ function onLinkClick(event) {
Logout
```
-上述的 `event` 物件捕捉 `click` 事件並將其傳遞給我們的 `onLinkClick` 函數。
+上述代碼中的`event`物件捕獲`click`事件並將其傳遞給我們的`onLinkClick`函數。
-使用 [`onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick) 屬性將 `click` 事件綁定到 JavaScript 代碼,這裡是呼叫 `navigate()` 函數。
+使用[`onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick)屬性將`click`事件綁定到JavaScript代碼,這裡是對`navigate()`函數的調用。
-嘗試點擊這些連結,您現在應該能夠在應用程式的不同畫面之間導航。
+嘗試點擊這些連結,您現在應該能夠在應用的不同畫面之間導航。
-✅ `history.pushState` 方法是 HTML5 標準的一部分,並在[所有現代瀏覽器](https://caniuse.com/?search=pushState)中實現。如果您正在為舊版瀏覽器建立網頁應用程式,可以使用一個技巧來替代此 API:使用路徑前的[哈希 (`#`)](https://en.wikipedia.org/wiki/URI_fragment),您可以實現與常規錨點導航相容的路由,且不重新載入頁面,因為它的目的是在頁面內建立內部連結。
+✅ `history.pushState`方法是HTML5標準的一部分,並在[所有現代瀏覽器](https://caniuse.com/?search=pushState)中實現。如果您正在為舊版瀏覽器構建網頁應用,有一個替代方法:使用[哈希(`#`)](https://en.wikipedia.org/wiki/URI_fragment)作為路徑前綴,您可以實現基於常規錨點導航的路由,且不會重新載入頁面,因為它的目的是在頁面內創建內部連結。
## 處理瀏覽器的返回與前進按鈕
-使用 `history.pushState` 會在瀏覽器的導航歷史中建立新條目。您可以通過按住瀏覽器的*返回按鈕*來檢查,它應顯示類似以下內容:
+使用`history.pushState`會在瀏覽器的導航歷史中創建新條目。您可以通過按住瀏覽器的*返回按鈕*來檢查,它應該顯示如下內容:

-如果您嘗試多次點擊返回按鈕,您會看到當前 URL 發生變化且歷史被更新,但顯示的模板保持不變。
+如果您嘗試多次點擊返回按鈕,您會看到當前URL發生了變化,歷史也被更新,但顯示的模板保持不變。
-這是因為應用程式不知道每次歷史變更時需要呼叫 `updateRoute()`。如果您查看 [`history.pushState` 文件](https://developer.mozilla.org/docs/Web/API/History/pushState),您會看到如果狀態改變——意味著我們移動到不同的 URL——[`popstate`](https://developer.mozilla.org/docs/Web/API/Window/popstate_event) 事件會被觸發。我們將使用它來修正此問題。
+這是因為應用不知道每次歷史變化時需要調用`updateRoute()`。如果您查看[`history.pushState`文檔](https://developer.mozilla.org/docs/Web/API/History/pushState),您會看到當狀態改變時(即我們移動到不同的URL),會觸發[`popstate`](https://developer.mozilla.org/docs/Web/API/Window/popstate_event)事件。我們將利用這一點來解決這個問題。
### 任務
-為了確保當瀏覽器歷史變更時顯示的模板被更新,我們將附加一個新函數來呼叫 `updateRoute()`。我們會在 `app.js` 檔案的底部完成此操作:
+為了確保當瀏覽器歷史變化時顯示的模板被更新,我們將附加一個新函數來調用`updateRoute()`。我們將在`app.js`檔案的底部完成這一操作:
```js
window.onpopstate = () => updateRoute();
updateRoute();
```
-> 注意:我們在這裡使用了一個[箭頭函數](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions)來宣告 `popstate` 事件處理器以簡化代碼,但普通函數也可以正常工作。
+> 注意:我們在這裡使用了一個[箭頭函數](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Functions/Arrow_functions)來聲明`popstate`事件處理器以簡化代碼,但普通函數也可以正常工作。
-以下是箭頭函數的影片回顧:
+這裡有一段關於箭頭函數的回顧影片:
[](https://youtube.com/watch?v=OP6eEbOj2sc "箭頭函數")
> 🎥 點擊上方圖片觀看有關箭頭函數的影片。
-現在嘗試使用瀏覽器的返回與前進按鈕,檢查顯示的路由是否正確更新。
+現在嘗試使用瀏覽器的返回和前進按鈕,檢查這次顯示的路由是否正確更新。
---
## 🚀 挑戰
-新增一個模板和路由,用於顯示此應用程式的製作人員名單的第三個頁面。
+為此應用新增一個模板和路由,顯示應用的製作團隊名單。
## 課後測驗
@@ -310,11 +310,13 @@ updateRoute();
## 回顧與自學
-路由是網頁開發中令人驚訝的棘手部分之一,尤其是當網頁從頁面刷新行為轉向單頁應用程式的頁面刷新時。閱讀一些有關 [Azure 靜態網頁應用服務](https://docs.microsoft.com/azure/static-web-apps/routes/?WT.mc_id=academic-77807-sagibbon)如何處理路由的資料。您能否解釋為什麼文件中描述的一些決策是必要的?
+路由是網頁開發中出乎意料的棘手部分之一,特別是隨著網頁從頁面刷新行為轉向單頁應用的頁面刷新。閱讀一些關於[Azure靜態網頁應用服務如何處理路由](https://docs.microsoft.com/azure/static-web-apps/routes/?WT.mc_id=academic-77807-sagibbon)的內容。您能解釋為什麼文檔中描述的一些決策是必要的嗎?
## 作業
-[改善路由](assignment.md)
+[改進路由](assignment.md)
+
+---
**免責聲明**:
-本文檔使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/7-bank-project/2-forms/README.md b/translations/mo/7-bank-project/2-forms/README.md
index 90cb0ecb..76416f3b 100644
--- a/translations/mo/7-bank-project/2-forms/README.md
+++ b/translations/mo/7-bank-project/2-forms/README.md
@@ -1,13 +1,13 @@
-# 建立銀行應用程式第二部分:建立登入與註冊表單
+# 建立銀行應用程式第二部分:建立登入和註冊表單
## 課前測驗
@@ -15,22 +15,22 @@ CO_OP_TRANSLATOR_METADATA:
### 簡介
-在幾乎所有現代的網頁應用程式中,您都可以創建一個帳戶來擁有自己的私人空間。由於多個使用者可以同時訪問網頁應用程式,因此需要一種機制來分別儲存每位使用者的個人資料,並選擇要顯示的資訊。我們不會深入探討如何[安全地管理使用者身份](https://en.wikipedia.org/wiki/Authentication),因為這是一個非常廣泛的主題,但我們會確保每位使用者能夠在我們的應用程式中創建一個(或多個)銀行帳戶。
+幾乎所有現代網頁應用程式都允許使用者建立帳戶,擁有自己的私人空間。由於多位使用者可以同時存取網頁應用程式,因此需要一種機制來分別儲存每位使用者的個人資料,並選擇要顯示的資訊。我們不會深入探討如何[安全地管理使用者身份](https://en.wikipedia.org/wiki/Authentication),因為這是一個非常廣泛的主題,但我們會確保每位使用者能夠在我們的應用程式中建立一個(或多個)銀行帳戶。
-在這部分,我們將使用 HTML 表單為我們的網頁應用程式新增登入與註冊功能。我們將學習如何以程式化方式將資料發送到伺服器 API,並最終定義基本的使用者輸入驗證規則。
+在這部分,我們將使用 HTML 表單為我們的網頁應用程式新增登入和註冊功能。我們將學習如何以程式方式將資料傳送到伺服器 API,並最終定義使用者輸入的基本驗證規則。
### 先決條件
-您需要完成本課程中[HTML 模板與路由](../1-template-route/README.md)的部分。此外,您還需要安裝 [Node.js](https://nodejs.org) 並[在本地運行伺服器 API](../api/README.md),以便能夠發送資料來創建帳戶。
+您需要完成網頁應用程式的[HTML 模板和路由](../1-template-route/README.md)部分。此外,您需要安裝 [Node.js](https://nodejs.org) 並[在本地執行伺服器 API](../api/README.md),以便能夠傳送資料來建立帳戶。
-**請注意**
-您需要同時運行以下兩個終端:
-1. 用於我們在[HTML 模板與路由](../1-template-route/README.md)課程中建立的主要銀行應用程式。
-2. 用於我們剛剛設置的[銀行應用程式伺服器 API](../api/README.md)。
+**注意事項**
+您需要同時開啟兩個終端機,如下所列:
+1. 用於我們在[HTML 模板和路由](../1-template-route/README.md)課程中建立的主要銀行應用程式。
+2. 用於我們剛剛設定的[銀行應用程式伺服器 API](../api/README.md)。
-您需要這兩個伺服器都在運行,才能完成本課程的其餘部分。它們分別監聽不同的埠(埠 `3000` 和埠 `5000`),因此應該可以正常運作。
+您需要啟動並運行這兩個伺服器才能完成接下來的課程。它們分別監聽不同的埠(埠 `3000` 和埠 `5000`),因此應該不會有問題。
-您可以在終端中執行以下命令來測試伺服器是否正常運行:
+您可以在終端機中執行以下指令來測試伺服器是否正常運行:
```sh
curl http://localhost:5000/api
@@ -41,29 +41,29 @@ curl http://localhost:5000/api
## 表單與控制項
-`` 元素封裝了 HTML 文件的一個區域,使用者可以在其中使用互動式控制項輸入並提交資料。在表單中可以使用各種使用者介面(UI)控制項,其中最常見的是 ` ` 和 `` 元素。
+`` 元素封裝了 HTML 文件中的一個區域,使用者可以透過互動式控制項輸入並提交資料。表單中可以使用各種使用者介面(UI)控制項,其中最常見的是 ` ` 和 `` 元素。
-` ` 有許多不同的[類型](https://developer.mozilla.org/docs/Web/HTML/Element/input),例如,您可以使用以下代碼創建一個讓使用者輸入用戶名的欄位:
+` ` 有許多不同的[類型](https://developer.mozilla.org/docs/Web/HTML/Element/input)。例如,要建立一個使用者輸入其使用者名稱的欄位,可以使用以下程式碼:
```html
```
-`name` 屬性將在表單資料發送時作為屬性名稱使用。而 `id` 屬性則用於將 `` 與表單控制項關聯。
+`name` 屬性將在表單資料傳送時用作屬性名稱,而 `id` 屬性則用於將 `` 與表單控制項關聯。
-> 查看 [` ` 類型](https://developer.mozilla.org/docs/Web/HTML/Element/input) 和[其他表單控制項](https://developer.mozilla.org/docs/Learn/Forms/Other_form_controls)的完整列表,了解在構建 UI 時可以使用的所有原生 UI 元素。
+> 查看 [` ` 類型](https://developer.mozilla.org/docs/Web/HTML/Element/input)的完整列表以及[其他表單控制項](https://developer.mozilla.org/docs/Learn/Forms/Other_form_controls),以了解您在建立 UI 時可以使用的所有原生 UI 元素。
-✅ 請注意,` ` 是一個[空元素](https://developer.mozilla.org/docs/Glossary/Empty_element),您*不應*為其添加匹配的閉合標籤。不過,您可以使用自閉合的 ` ` 表示法,但這不是必須的。
+✅ 請注意,` ` 是一個[空元素](https://developer.mozilla.org/docs/Glossary/Empty_element),不應添加匹配的結束標籤。不過,您可以使用自閉合的 ` ` 語法,但這不是必須的。
-在表單中,`` 元素有些特殊。如果您未指定其 `type` 屬性,按下按鈕時會自動提交表單資料到伺服器。以下是可能的 `type` 值:
+表單中的 `` 元素有些特殊。如果未指定其 `type` 屬性,按下時會自動提交表單資料到伺服器。以下是可能的 `type` 值:
-- `submit`:表單中的預設值,按鈕觸發表單提交操作。
+- `submit`:表單中的預設值,按鈕觸發表單提交動作。
- `reset`:按鈕將所有表單控制項重置為初始值。
-- `button`:按鈕按下時不分配預設行為。您可以使用 JavaScript 為其分配自定義操作。
+- `button`:按鈕按下時不分配預設行為。您可以使用 JavaScript 為其分配自定義動作。
### 任務
-讓我們從在 `login` 模板中新增一個表單開始。我們需要一個*用戶名*欄位和一個*登入*按鈕。
+讓我們從在 `login` 模板中新增一個表單開始。我們需要一個*使用者名稱*欄位和一個*登入*按鈕。
```html
@@ -79,14 +79,14 @@ curl http://localhost:5000/api
```
-如果您仔細觀察,會發現我們還新增了一個 `` 元素。`` 元素用於為 UI 控制項(例如我們的用戶名欄位)添加名稱。標籤對於表單的可讀性非常重要,並且還帶來以下額外好處:
+仔細查看,您會注意到我們還新增了一個 `` 元素。`` 元素用於為 UI 控制項添加名稱,例如我們的使用者名稱欄位。標籤對於表單的可讀性非常重要,並且還具有以下額外好處:
-- 通過將標籤與表單控制項關聯,可以幫助使用輔助技術(如螢幕閱讀器)的使用者理解需要提供哪些資料。
-- 您可以點擊標籤直接將焦點放在相關的輸入欄位上,這對於觸控螢幕設備來說更加方便。
+- 將標籤與表單控制項關聯,有助於使用輔助技術(例如螢幕閱讀器)的使用者理解需要提供什麼資料。
+- 您可以點擊標籤直接將焦點放在相關的輸入欄位上,這使得在觸控螢幕設備上更容易操作。
-> [網頁無障礙性](https://developer.mozilla.org/docs/Learn/Accessibility/What_is_accessibility)是一個經常被忽視但非常重要的主題。得益於[語義化 HTML 元素](https://developer.mozilla.org/docs/Learn/Accessibility/HTML),如果正確使用它們,創建無障礙內容並不困難。您可以[閱讀更多關於無障礙性的內容](https://developer.mozilla.org/docs/Web/Accessibility),以避免常見錯誤並成為一名負責任的開發者。
+> [網頁的可及性](https://developer.mozilla.org/docs/Learn/Accessibility/What_is_accessibility)是一個非常重要但常被忽略的主題。得益於[語義化 HTML 元素](https://developer.mozilla.org/docs/Learn/Accessibility/HTML),如果正確使用它們,創建可及內容並不困難。您可以[閱讀更多關於可及性的內容](https://developer.mozilla.org/docs/Web/Accessibility),以避免常見錯誤並成為負責任的開發者。
-接下來,我們將在前一個表單的下方新增第二個註冊表單:
+現在,我們將在前一個表單下方新增第二個註冊表單:
```html
@@ -104,28 +104,28 @@ curl http://localhost:5000/api
```
-使用 `value` 屬性,我們可以為給定的輸入欄位定義預設值。
-另外,請注意 `balance` 的輸入欄位使用了 `number` 類型。它看起來與其他輸入欄位不同嗎?試著與它互動看看。
+使用 `value` 屬性,我們可以為指定的輸入欄位定義預設值。
+此外,請注意 `balance` 的輸入類型是 `number`。它看起來是否與其他輸入欄位不同?試著與它互動看看。
-✅ 您能僅使用鍵盤導航並與表單互動嗎?您會怎麼做?
+✅ 您能否僅使用鍵盤導航並與表單互動?您會如何操作?
## 將資料提交到伺服器
-現在我們有了一個功能性的 UI,下一步是將資料發送到伺服器。讓我們使用當前的代碼進行快速測試:如果您點擊*登入*或*註冊*按鈕會發生什麼?
+現在我們有了一個功能性的 UI,下一步是將資料傳送到伺服器。讓我們使用目前的程式碼進行快速測試:如果您點擊*登入*或*註冊*按鈕,會發生什麼?
您是否注意到瀏覽器的 URL 區域發生了變化?

-`` 的預設行為是使用 [GET 方法](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3)將表單提交到當前伺服器 URL,並將表單資料直接附加到 URL 中。然而,這種方法有一些缺點:
+` ` 的預設行為是使用 [GET 方法](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3)將表單提交到當前伺服器 URL,並將表單資料直接附加到 URL。這種方法有一些缺點:
-- 發送的資料大小非常有限(約 2000 個字符)。
-- 資料直接顯示在 URL 中(對於密碼來說並不理想)。
-- 不支持文件上傳。
+- 傳送的資料大小有限(約 2000 字元)
+- 資料直接顯示在 URL 中(對於密碼來說不太理想)
+- 不支援檔案上傳
-因此,您可以將其更改為使用 [POST 方法](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5),該方法將表單資料作為 HTTP 請求的主體發送到伺服器,避免了上述限制。
+因此,您可以將其更改為使用 [POST 方法](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.5),該方法將表單資料傳送到 HTTP 請求的主體中,避免了上述限制。
-> 雖然 POST 是最常用於發送資料的方法,但[在某些特定情況下](https://www.w3.org/2001/tag/doc/whenToUseGet.html),例如實現搜索欄時,使用 GET 方法更為合適。
+> 雖然 POST 是最常用的資料傳送方法,但[在某些特定情況下](https://www.w3.org/2001/tag/doc/whenToUseGet.html),例如實現搜尋欄位時,使用 GET 方法可能更合適。
### 任務
@@ -135,23 +135,23 @@ curl http://localhost:5000/api
```
-現在嘗試使用您的名字註冊一個新帳戶。點擊*註冊*按鈕後,您應該會看到如下內容:
+現在嘗試使用您的名字註冊新帳戶。點擊*註冊*按鈕後,您應該會看到類似以下的內容:
-
+
-如果一切順利,伺服器應該會以包含已創建帳戶資料的 [JSON](https://www.json.org/json-en.html) 響應回覆您的請求。
+如果一切正常,伺服器應該會以 [JSON](https://www.json.org/json-en.html) 回應您的請求,並包含已建立的帳戶資料。
-✅ 再次使用相同的名字註冊會發生什麼?
+✅ 再次使用相同的名字註冊。會發生什麼?
-## 在不重新加載頁面的情況下提交資料
+## 不重新載入頁面提交資料
-您可能已經注意到,我們剛剛使用的方法有一個小問題:提交表單時,我們離開了應用程式,瀏覽器重定向到伺服器 URL。我們正在嘗試避免所有頁面重新加載,因為我們正在構建一個[單頁應用程式(SPA)](https://en.wikipedia.org/wiki/Single-page_application)。
+您可能注意到,我們剛剛使用的方法有一個小問題:提交表單時,我們離開了應用程式,瀏覽器重定向到伺服器 URL。我們正在嘗試避免所有頁面重新載入,因為我們正在建立一個[單頁應用程式 (SPA)](https://en.wikipedia.org/wiki/Single-page_application)。
-為了在不強制重新加載頁面的情況下將表單資料發送到伺服器,我們需要使用 JavaScript 代碼。與其在 ` ` 元素的 `action` 屬性中放置 URL,您可以使用任何以 `javascript:` 字符串開頭的 JavaScript 代碼來執行自定義操作。這樣做也意味著您需要實現一些瀏覽器之前自動完成的任務:
+要在不強制重新載入頁面的情況下將表單資料傳送到伺服器,我們需要使用 JavaScript 程式碼。與其在 ` ` 元素的 `action` 屬性中放置 URL,您可以使用任何以 `javascript:` 字串開頭的 JavaScript 程式碼來執行自定義動作。使用此方法意味著您需要實現一些之前由瀏覽器自動完成的任務:
- 獲取表單資料
-- 將表單資料轉換並編碼為合適的格式
-- 創建 HTTP 請求並將其發送到伺服器
+- 將表單資料轉換並編碼為適合的格式
+- 建立 HTTP 請求並將其傳送到伺服器
### 任務
@@ -172,9 +172,9 @@ function register() {
}
```
-在這裡,我們使用 `getElementById()` 獲取表單元素,並使用 [`FormData`](https://developer.mozilla.org/docs/Web/API/FormData) 幫助程序將表單控制項中的值提取為一組鍵/值對。接著,我們使用 [`Object.fromEntries()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries) 將資料轉換為普通物件,最後將資料序列化為 [JSON](https://www.json.org/json-en.html),這是一種網頁上常用的資料交換格式。
+在這裡,我們使用 `getElementById()` 獲取表單元素,並使用 [`FormData`](https://developer.mozilla.org/docs/Web/API/FormData) 幫助器將表單控制項中的值提取為一組鍵值對。然後,我們使用 [`Object.fromEntries()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries) 將資料轉換為常規物件,最後序列化為 [JSON](https://www.json.org/json-en.html),這是一種常用於網頁資料交換的格式。
-資料現在已準備好發送到伺服器。創建一個名為 `createAccount` 的新函數:
+資料現在已準備好傳送到伺服器。建立一個名為 `createAccount` 的新函數:
```js
async function createAccount(account) {
@@ -191,7 +191,7 @@ async function createAccount(account) {
}
```
-這個函數在做什麼?首先,注意這裡的 `async` 關鍵字。這表示該函數包含將[**異步執行**](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function)的代碼。當與 `await` 關鍵字一起使用時,它允許等待異步代碼執行(例如等待伺服器響應)後再繼續。
+這個函數在做什麼?首先,注意這裡的 `async` 關鍵字。這表示函數包含將以[**非同步**](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function)方式執行的程式碼。當與 `await` 關鍵字一起使用時,它允許等待非同步程式碼執行(例如等待伺服器回應)後再繼續。
這裡有一段關於 `async/await` 使用的快速影片:
@@ -199,26 +199,26 @@ async function createAccount(account) {
> 🎥 點擊上方圖片觀看關於 async/await 的影片。
-我們使用 `fetch()` API 將 JSON 資料發送到伺服器。此方法接受兩個參數:
+我們使用 `fetch()` API 將 JSON 資料傳送到伺服器。此方法需要兩個參數:
- 伺服器的 URL,因此我們在這裡放回 `//localhost:5000/api/accounts`。
-- 請求的設置。在這裡,我們將方法設置為 `POST`,並提供請求的 `body`。由於我們將 JSON 資料發送到伺服器,因此還需要將 `Content-Type` 標頭設置為 `application/json`,以便伺服器知道如何解釋內容。
+- 請求的設定。在這裡,我們將方法設置為 `POST`,並提供請求的 `body`。由於我們正在向伺服器傳送 JSON 資料,因此還需要將 `Content-Type` 標頭設置為 `application/json`,以便伺服器知道如何解釋內容。
-由於伺服器會以 JSON 響應請求,我們可以使用 `await response.json()` 解析 JSON 內容並返回結果物件。請注意,此方法是異步的,因此我們在返回之前使用 `await` 關鍵字以確保在解析期間的任何錯誤也能被捕獲。
+由於伺服器會以 JSON 回應請求,我們可以使用 `await response.json()` 解析 JSON 內容並返回結果物件。請注意,此方法是非同步的,因此我們在返回之前使用 `await` 關鍵字,以確保在解析期間的任何錯誤也能被捕獲。
-現在在 `register` 函數中新增一些代碼來調用 `createAccount()`:
+現在在 `register` 函數中新增一些程式碼以呼叫 `createAccount()`:
```js
const result = await createAccount(jsonData);
```
-由於我們在這裡使用了 `await` 關鍵字,因此需要在 register 函數之前新增 `async` 關鍵字:
+由於我們在這裡使用了 `await` 關鍵字,因此需要在 register 函數前添加 `async` 關鍵字:
```js
async function register() {
```
-最後,讓我們新增一些日誌來檢查結果。最終的函數應如下所示:
+最後,新增一些日誌以檢查結果。最終的函數應如下所示:
```js
async function register() {
@@ -235,27 +235,27 @@ async function register() {
}
```
-這部分有點長,但我們完成了!如果您打開[瀏覽器開發者工具](https://developer.mozilla.org/docs/Learn/Common_questions/What_are_browser_developer_tools),並嘗試註冊一個新帳戶,您應該不會看到網頁發生任何變化,但控制台中會出現一條消息,確認一切正常運作。
+雖然過程有點長,但我們完成了!如果您打開[瀏覽器開發者工具](https://developer.mozilla.org/docs/Learn/Common_questions/What_are_browser_developer_tools),並嘗試註冊新帳戶,您應該不會看到網頁有任何變化,但控制台中會出現一條訊息,確認一切正常。
-
+
-✅ 您認為資料是安全地發送到伺服器的嗎?如果有人能攔截請求會怎麼樣?您可以閱讀[HTTPS](https://en.wikipedia.org/wiki/HTTPS)來了解更多關於安全資料通信的內容。
+✅ 您認為資料是否安全地傳送到伺服器?如果有人能夠攔截請求會怎麼樣?您可以閱讀[HTTPS](https://en.wikipedia.org/wiki/HTTPS)以了解更多關於安全資料通信的內容。
## 資料驗證
-如果您嘗試在未先設置用戶名的情況下註冊新帳戶,您會看到伺服器返回了一個狀態碼為 [400(錯誤請求)](https://developer.mozilla.org/docs/Web/HTTP/Status/400#:~:text=The%20HyperText%20Transfer%20Protocol%20(HTTP,%2C%20or%20deceptive%20request%20routing).) 的錯誤。
+如果您嘗試在未設置使用者名稱的情況下註冊新帳戶,您會看到伺服器返回了一個狀態碼為 [400 (Bad Request)](https://developer.mozilla.org/docs/Web/HTTP/Status/400#:~:text=The%20HyperText%20Transfer%20Protocol%20(HTTP,%2C%20or%20deceptive%20request%20routing).) 的錯誤。
-在將資料發送到伺服器之前,最好先[驗證表單資料](https://developer.mozilla.org/docs/Learn/Forms/Form_validation),以確保您發送的是有效請求。HTML5 表單控制項提供了內建的驗證功能,通過使用各種屬性:
+在將資料傳送到伺服器之前,最好先[驗證表單資料](https://developer.mozilla.org/docs/Learn/Forms/Form_validation),以確保您傳送的是有效請求。HTML5 表單控制項提供了內建的驗證功能,使用各種屬性:
-- `required`:該欄位必須填寫,否則表單無法提交。
-- `minlength` 和 `maxlength`:定義文本欄位的最小和最大字符數。
-- `min` 和 `max`:定義數字欄位的最小和最大值。
-- `type`:定義預期的資料類型,例如 `number`、`email`、`file` 或[其他內建類型](https://developer.mozilla.org/docs/Web/HTML/Element/input)。此屬性還可能改變表單控制項的視覺呈現。
-- `pattern`:允許定義一個[正則表達式](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Regular_Expressions)模式,用於測試輸入的資料是否有效。
+- `required`:欄位需要填寫,否則表單無法提交。
+- `minlength` 和 `maxlength`:定義文字欄位的最小和最大字元數。
+- `min` 和 `max`:定義數值欄位的最小和最大值。
+- `type`:定義預期的資料類型,例如 `number`、`email`、`file` 或[其他內建類型](https://developer.mozilla.org/docs/Web/HTML/Element/input)。此屬性也可能改變表單控制項的視覺呈現。
+- `pattern`:允許定義一個[正則表達式](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Regular_Expressions)模式,以測試輸入的資料是否有效。
提示:您可以使用 `:valid` 和 `:invalid` CSS 偽類來根據表單控件是否有效自訂其外觀。
### 任務
-要建立一個有效的新帳戶,需要填寫兩個必填欄位:使用者名稱和貨幣,其餘欄位為選填。更新表單的 HTML,使用 `required` 屬性以及欄位標籤中的文字來實現:
+建立新帳戶時,必須填寫兩個必要欄位:使用者名稱和貨幣,其他欄位則為選填。更新表單的 HTML,使用 `required` 屬性以及欄位標籤中的文字來達到以下效果:
```html
Username (required)
@@ -265,9 +265,9 @@ async function register() {
```
-雖然這個伺服器的實作並未對欄位的最大長度設置特定限制,但為使用者輸入的文字定義合理的限制始終是個好習慣。
+雖然這個伺服器的實作並未強制限制欄位的最大長度,但為使用者輸入的文字定義合理的限制始終是良好的做法。
-為文字欄位新增 `maxlength` 屬性:
+在文字欄位中加入 `maxlength` 屬性:
```html
@@ -277,35 +277,37 @@ async function register() {
```
-現在,如果你按下 *註冊* 按鈕,而某個欄位未遵守我們定義的驗證規則,你應該會看到類似以下的畫面:
+現在,如果按下 *註冊* 按鈕,而某個欄位未遵守我們定義的驗證規則,您應該會看到類似以下的畫面:
-
+
-像這樣在將任何資料發送到伺服器之前進行的驗證稱為 **客戶端驗證**。但請注意,並非所有檢查都能在不發送資料的情況下完成。例如,我們無法在這裡檢查是否已經存在相同使用者名稱的帳戶,除非向伺服器發送請求。在伺服器上執行的額外驗證稱為 **伺服器端驗證**。
+在將任何資料發送到伺服器之前進行的驗證稱為 **客戶端驗證**。但請注意,並非所有檢查都能在不發送資料的情況下完成。例如,我們無法在此檢查是否已存在相同使用者名稱的帳戶,除非向伺服器發送請求。在伺服器上進行的額外驗證稱為 **伺服器端驗證**。
-通常需要同時實現這兩種驗證。雖然使用客戶端驗證可以通過即時反饋提升使用者體驗,但伺服器端驗證對於確保你處理的使用者資料是可靠且安全的至關重要。
+通常需要同時實施這兩種驗證。客戶端驗證能改善使用者體驗,提供即時回饋;而伺服器端驗證則至關重要,確保您處理的使用者資料是可靠且安全的。
---
## 🚀 挑戰
-如果使用者已存在,請在 HTML 中顯示一條錯誤訊息。
+在 HTML 中顯示錯誤訊息,提示使用者帳戶已存在。
-以下是一個經過一些樣式設計後的最終登入頁面的範例:
+以下是經過一些樣式設計後的最終登入頁面範例:
-
+
## 課後測驗
[課後測驗](https://ff-quizzes.netlify.app/web/quiz/44)
-## 複習與自學
+## 回顧與自學
-開發者在表單構建方面變得非常有創意,特別是在驗證策略方面。透過瀏覽 [CodePen](https://codepen.com) 來了解不同的表單流程;你能找到一些有趣且具有啟發性的表單嗎?
+開發者在表單構建方面非常有創意,尤其是在驗證策略上。透過瀏覽 [CodePen](https://codepen.com) 來了解不同的表單流程;您能找到一些有趣且具啟發性的表單嗎?
## 作業
-[為你的銀行應用程式設計樣式](assignment.md)
+[為您的銀行應用程式設計樣式](assignment.md)
+
+---
**免責聲明**:
-本文檔使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/7-bank-project/3-data/README.md b/translations/mo/7-bank-project/3-data/README.md
index c1451bdb..4fa1fe4f 100644
--- a/translations/mo/7-bank-project/3-data/README.md
+++ b/translations/mo/7-bank-project/3-data/README.md
@@ -1,29 +1,29 @@
-# 建立銀行應用程式第 3 部分:獲取和使用資料的方法
+# 建立銀行應用程式第三部分:資料的獲取與使用方法
## 課前測驗
[課前測驗](https://ff-quizzes.netlify.app/web/quiz/45)
-### 簡介
+### 介紹
-在每個網頁應用程式的核心都有一個關鍵元素:*資料*。資料可以有多種形式,但其主要目的是向使用者顯示資訊。隨著網頁應用程式變得越來越互動且複雜,使用者如何存取和互動資訊已成為網頁開發中的關鍵部分。
+在每個網頁應用程式的核心中都有一個重要元素:*資料*。資料可以有多種形式,但其主要目的是向使用者顯示資訊。隨著網頁應用程式越來越互動化和複雜,使用者如何存取和互動資訊已成為網頁開發的關鍵部分。
-在本課中,我們將學習如何從伺服器非同步地獲取資料,並使用這些資料在不重新載入 HTML 的情況下在網頁上顯示資訊。
+在本課程中,我們將學習如何以非同步方式從伺服器獲取資料,並使用這些資料在不重新載入 HTML 的情況下顯示於網頁上。
-### 先決條件
+### 前置條件
-在學習本課之前,您需要完成網頁應用程式的 [登入和註冊表單](../2-forms/README.md) 部分。此外,您需要安裝 [Node.js](https://nodejs.org) 並在本地執行 [伺服器 API](../api/README.md),以便獲取帳戶資料。
+您需要完成網頁應用程式的[登入與註冊表單](../2-forms/README.md)部分,並安裝 [Node.js](https://nodejs.org) 和[在本地執行伺服器 API](../api/README.md),以便獲取帳戶資料。
-您可以在終端中執行以下命令來測試伺服器是否正常運行:
+您可以透過在終端機執行以下指令來測試伺服器是否正常運行:
```sh
curl http://localhost:5000/api
@@ -32,23 +32,23 @@ curl http://localhost:5000/api
---
-## AJAX 和資料獲取
+## AJAX 與資料獲取
-傳統的網站在使用者選擇連結或提交表單資料時,會透過重新載入整個 HTML 頁面來更新顯示的內容。每次需要載入新資料時,網頁伺服器都會返回一個全新的 HTML 頁面,這需要瀏覽器處理,並中斷當前的使用者操作,限制了重新載入期間的互動性。這種工作流程也被稱為 *多頁應用程式*(Multi-Page Application,MPA)。
+傳統的網站在使用者選擇連結或使用表單提交資料時,會透過重新載入整個 HTML 頁面來更新顯示的內容。每次需要載入新資料時,網頁伺服器都會返回一個全新的 HTML 頁面,瀏覽器需要重新處理,這會中斷使用者的操作並限制重新載入期間的互動。這種工作流程也被稱為*多頁應用程式*(Multi-Page Application,MPA)。

-隨著網頁應用程式變得更加複雜和互動化,一種名為 [AJAX(Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)) 的新技術應運而生。這種技術允許網頁應用程式使用 JavaScript 非同步地向伺服器發送和檢索資料,而無需重新載入 HTML 頁面,從而實現更快的更新和更流暢的使用者互動。當從伺服器接收到新資料時,可以使用 [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API 透過 JavaScript 更新當前的 HTML 頁面。隨著時間的推移,這種方法演變成現在所謂的 [*單頁應用程式*(Single-Page Application,SPA)](https://en.wikipedia.org/wiki/Single-page_application)。
+隨著網頁應用程式變得越來越複雜和互動化,一種名為 [AJAX(非同步 JavaScript 和 XML)](https://en.wikipedia.org/wiki/Ajax_(programming)) 的新技術出現了。這項技術允許網頁應用程式使用 JavaScript 非同步地向伺服器發送和接收資料,而無需重新載入 HTML 頁面,從而實現更快的更新和更流暢的使用者互動。當從伺服器接收到新資料時,可以使用 [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API 透過 JavaScript 更新當前的 HTML 頁面。隨著時間的推移,這種方法演變成現在所謂的[*單頁應用程式*(Single-Page Application,SPA)](https://en.wikipedia.org/wiki/Single-page_application)。

在 AJAX 剛推出時,唯一可用的非同步獲取資料的 API 是 [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest)。但現代瀏覽器現在也實現了更方便且功能更強大的 [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API),它使用 Promise 並更適合處理 JSON 資料。
-> 雖然所有現代瀏覽器都支援 `Fetch API`,但如果您希望您的網頁應用程式能在舊版或過時的瀏覽器上運行,建議先檢查 [caniuse.com 上的相容性表](https://caniuse.com/fetch)。
+> 雖然所有現代瀏覽器都支援 `Fetch API`,但如果您希望您的網頁應用程式能在舊版或老舊瀏覽器上運行,最好先檢查 [caniuse.com 的相容性表](https://caniuse.com/fetch)。
### 任務
-在[上一課](../2-forms/README.md)中,我們實現了註冊表單來建立帳戶。現在,我們將新增程式碼來使用現有帳戶登入並獲取其資料。打開 `app.js` 檔案,新增一個新的 `login` 函數:
+在[上一課程](../2-forms/README.md)中,我們實現了註冊表單以建立帳戶。現在我們將新增程式碼以使用現有帳戶登入並獲取其資料。打開 `app.js` 檔案並新增一個 `login` 函數:
```js
async function login() {
@@ -57,9 +57,9 @@ async function login() {
}
```
-首先,我們使用 `getElementById()` 獲取表單元素,然後透過 `loginForm.user.value` 獲取輸入框中的使用者名稱。每個表單控制項都可以透過其名稱(在 HTML 中使用 `name` 屬性設定)作為表單的屬性來存取。
+首先,我們使用 `getElementById()` 獲取表單元素,然後透過 `loginForm.user.value` 從輸入欄位中獲取使用者名稱。每個表單控制項都可以透過其名稱(在 HTML 中使用 `name` 屬性設定)作為表單的屬性來存取。
-與我們為註冊所做的類似,我們將建立另一個函數來執行伺服器請求,但這次是用於檢索帳戶資料:
+與我們在註冊中所做的類似,我們將建立另一個函數來執行伺服器請求,但這次是用於獲取帳戶資料:
```js
async function getAccount(user) {
@@ -72,11 +72,11 @@ async function getAccount(user) {
}
```
-我們使用 `fetch` API 非同步地向伺服器請求資料,但這次除了要呼叫的 URL 外,我們不需要其他額外的參數,因為我們只是查詢資料。預設情況下,`fetch` 會建立一個 [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP 請求,這正是我們需要的。
+我們使用 `fetch` API 非同步地向伺服器請求資料,但這次除了要呼叫的 URL 外不需要任何額外的參數,因為我們只是查詢資料。預設情況下,`fetch` 會建立一個 [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP 請求,這正是我們需要的。
✅ `encodeURIComponent()` 是一個用於對 URL 中的特殊字元進行編碼的函數。如果我們不呼叫此函數而直接在 URL 中使用 `user` 值,可能會出現什麼問題?
-現在讓我們更新 `login` 函數以使用 `getAccount`:
+現在我們來更新 `login` 函數以使用 `getAccount`:
```js
async function login() {
@@ -93,15 +93,15 @@ async function login() {
}
```
-首先,由於 `getAccount` 是一個非同步函數,我們需要使用 `await` 關鍵字來等待伺服器的結果。與任何伺服器請求一樣,我們還需要處理錯誤情況。目前,我們只新增一條日誌訊息來顯示錯誤,稍後再回來處理。
+首先,由於 `getAccount` 是一個非同步函數,我們需要使用 `await` 關鍵字來等待伺服器的結果。與任何伺服器請求一樣,我們還需要處理錯誤情況。目前我們只會新增一個日誌訊息來顯示錯誤,稍後再進一步處理。
-接著,我們需要將資料儲存到某個地方,以便稍後用於顯示儀表板資訊。由於 `account` 變數尚不存在,我們將在檔案的頂部建立一個全域變數:
+接著,我們需要將資料儲存到某個地方,以便稍後用於顯示儀表板資訊。由於 `account` 變數尚未存在,我們會在檔案的頂部建立一個全域變數:
```js
let account = null;
```
-在使用者資料儲存到變數後,我們可以使用我們已有的 `navigate()` 函數從 *登入* 頁面導航到 *儀表板*。
+在使用者資料儲存到變數後,我們可以使用已經存在的 `navigate()` 函數從*登入*頁面導航到*儀表板*。
最後,我們需要在提交登入表單時呼叫 `login` 函數,透過修改 HTML:
@@ -111,32 +111,32 @@ let account = null;
透過註冊新帳戶並嘗試使用相同帳戶登入,測試一切是否正常運行。
-在進入下一部分之前,我們還可以透過在 `register` 函數底部新增以下內容來完成該函數:
+在進入下一部分之前,我們還可以完成 `register` 函數,透過在函數底部新增以下內容:
```js
account = result;
navigate('/dashboard');
```
-✅ 您知道嗎?預設情況下,您只能從與您正在查看的網頁相同的 *域名和埠* 呼叫伺服器 API?這是瀏覽器強制執行的安全機制。但等等,我們的網頁應用程式運行在 `localhost:3000`,而伺服器 API 運行在 `localhost:5000`,為什麼它能正常工作?透過使用一種名為 [跨來源資源共享(CORS)](https://developer.mozilla.org/docs/Web/HTTP/CORS) 的技術,如果伺服器在回應中新增特殊標頭,允許特定域名的例外情況,就可以執行跨來源 HTTP 請求。
+✅ 您知道嗎?預設情況下,您只能從與您正在查看的網頁相同的*域名和埠*呼叫伺服器 API?這是瀏覽器強制執行的安全機制。但等等,我們的網頁應用程式運行在 `localhost:3000`,而伺服器 API 運行在 `localhost:5000`,為什麼它能正常運行?透過使用一種名為 [跨來源資源共享(CORS)](https://developer.mozilla.org/docs/Web/HTTP/CORS) 的技術,如果伺服器在回應中新增特殊標頭,允許特定域名的例外情況,就可以執行跨來源 HTTP 請求。
-> 想了解更多關於 API 的資訊,請參考這個[課程](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon)
+> 透過學習這個[課程](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon)了解更多關於 API 的知識。
## 更新 HTML 以顯示資料
-現在我們已經有了使用者資料,我們需要更新現有的 HTML 來顯示它。我們已經知道如何使用例如 `document.getElementById()` 從 DOM 中檢索元素。在獲取基礎元素後,以下是一些可以用來修改或新增子元素的 API:
+現在我們已經有了使用者資料,我們需要更新現有的 HTML 以顯示它。我們已經知道如何使用例如 `document.getElementById()` 從 DOM 中獲取元素。在獲取基礎元素後,以下是一些可以用來修改或新增子元素的 API:
-- 使用 [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) 屬性可以更改元素的文字內容。請注意,更改此值會移除該元素的所有子元素(如果有的話),並用提供的文字取代。因此,將空字串 `''` 賦值給它也是一種有效的方法來移除給定元素的所有子元素。
+- 使用 [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) 屬性可以更改元素的文字內容。請注意,更改此值會移除元素的所有子元素(如果有的話),並用提供的文字替換。因此,透過將空字串 `''` 賦值給它,也是一種有效的方法來移除給定元素的所有子元素。
-- 使用 [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) 與 [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) 方法,可以建立並附加一個或多個新的子元素。
+- 使用 [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) 與 [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) 方法可以建立並附加一個或多個新的子元素。
-✅ 使用元素的 [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) 屬性也可以更改其 HTML 內容,但應避免使用,因為它容易受到 [跨站腳本(XSS)](https://developer.mozilla.org/docs/Glossary/Cross-site_scripting) 攻擊。
+✅ 使用元素的 [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) 屬性也可以更改其 HTML 內容,但應避免使用此方法,因為它容易受到[跨站腳本(XSS)](https://developer.mozilla.org/docs/Glossary/Cross-site_scripting)攻擊。
### 任務
-在進入 *儀表板* 畫面之前,我們還需要在 *登入* 頁面上完成一件事。目前,如果您嘗試使用不存在的使用者名稱登入,會在主控台中顯示一條訊息,但對於普通使用者來說,畫面上什麼都沒有改變,您不知道發生了什麼。
+在進入儀表板畫面之前,我們需要在*登入*頁面上做一些額外的處理。目前,如果您嘗試使用不存在的使用者名稱登入,訊息會顯示在主控台中,但對普通使用者來說,畫面上沒有任何變化,您不知道發生了什麼。
-讓我們在登入表單中新增一個佔位元素,以便在需要時顯示錯誤訊息。一個不錯的位置是在登入 `` 之前:
+讓我們在登入表單中新增一個佔位元素,以便在需要時顯示錯誤訊息。一個不錯的位置是登入 `` 的前面:
```html
...
@@ -145,9 +145,9 @@ navigate('/dashboard');
...
```
-這個 `` 元素是空的,這意味著在我們新增內容之前,畫面上不會顯示任何東西。我們還為它設定了一個 `id`,以便可以透過 JavaScript 輕鬆檢索它。
+這個 `
` 元素是空的,意味著在我們新增內容之前,畫面上不會顯示任何東西。我們還為它設定了一個 `id`,以便可以透過 JavaScript 輕鬆地獲取它。
-回到 `app.js` 檔案,建立一個新的輔助函數 `updateElement`:
+回到 `app.js` 檔案並建立一個新的輔助函數 `updateElement`:
```js
function updateElement(id, text) {
@@ -156,7 +156,7 @@ function updateElement(id, text) {
}
```
-這個函數非常簡單:給定一個元素 *id* 和 *文字*,它會更新具有匹配 `id` 的 DOM 元素的文字內容。讓我們在 `login` 函數中用此方法取代之前的錯誤訊息:
+這個函數非常簡單:給定一個元素 *id* 和 *text*,它會更新具有匹配 `id` 的 DOM 元素的文字內容。讓我們在 `login` 函數中使用此方法來取代之前的錯誤訊息:
```js
if (data.error) {
@@ -164,11 +164,11 @@ if (data.error) {
}
```
-現在,如果您嘗試使用無效帳戶登入,您應該會看到類似以下的內容:
+現在,如果您嘗試使用無效帳戶登入,您應該會看到類似以下的畫面:

-現在我們有了視覺上顯示的錯誤文字,但如果您使用螢幕閱讀器嘗試,您會發現什麼都沒有被宣告。為了讓動態新增到頁面的文字能被螢幕閱讀器宣告,我們需要使用一種名為 [Live Region](https://developer.mozilla.org/docs/Web/Accessibility/ARIA/ARIA_Live_Regions) 的技術。在這裡,我們將使用一種特定類型的 Live Region,稱為警示(alert):
+現在我們有了視覺上顯示的錯誤文字,但如果您使用螢幕閱讀器嘗試,您會注意到什麼都沒有被宣告。為了讓動態新增到頁面的文字能被螢幕閱讀器宣告,我們需要使用一種名為[即時區域(Live Region)](https://developer.mozilla.org/docs/Web/Accessibility/ARIA/ARIA_Live_Regions)的技術。這裡我們將使用一種特定類型的即時區域,稱為警告:
```html
@@ -178,7 +178,7 @@ if (data.error) {
## 在儀表板上顯示資訊
-使用我們剛剛學到的技術,我們還將處理在儀表板頁面上顯示帳戶資訊。
+使用我們剛剛學到的技術,我們也將處理在儀表板頁面上顯示帳戶資訊。
以下是從伺服器接收到的帳戶物件的樣子:
@@ -200,7 +200,7 @@ if (data.error) {
### 任務
-首先,將 HTML 中的 "Balance" 區域替換為新增的佔位元素:
+首先,我們將替換 HTML 中的「餘額」部分,新增佔位元素:
```html
@@ -208,15 +208,15 @@ if (data.error) {
```
-接著,在其下方新增一個新區域來顯示帳戶描述:
+接著,我們會在下面新增一個新部分以顯示帳戶描述:
```html
```
-✅ 由於帳戶描述作為其下方內容的標題,因此它在語義上被標記為標題。了解更多關於 [標題結構](https://www.nomensa.com/blog/2017/how-structure-headings-web-accessibility) 對於無障礙性的重要性,並批判性地檢視頁面以確定還有什麼可以作為標題。
+✅ 由於帳戶描述作為內容下方的標題,它在語義上被標記為標題。了解更多關於[標題結構](https://www.nomensa.com/blog/2017/how-structure-headings-web-accessibility)對於無障礙的重要性,並批判性地檢視頁面以確定還有哪些部分可以作為標題。
-接下來,我們將在 `app.js` 中建立一個新函數來填充佔位元素:
+接下來,我們會在 `app.js` 中建立一個新函數以填充佔位元素:
```js
function updateDashboard() {
@@ -230,11 +230,11 @@ function updateDashboard() {
}
```
-首先,我們檢查是否有需要的帳戶資料,然後再繼續。接著,我們使用之前建立的 `updateElement()` 函數來更新 HTML。
+首先,我們檢查是否有需要的帳戶資料,然後再進一步操作。接著,我們使用之前建立的 `updateElement()` 函數來更新 HTML。
-> 為了讓餘額顯示得更美觀,我們使用方法 [`toFixed(2)`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed) 強制顯示小數點後 2 位數。
+> 為了讓餘額顯示更美觀,我們使用方法 [`toFixed(2)`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed) 強制顯示小數點後 2 位數。
-現在,我們需要在每次載入儀表板時呼叫 `updateDashboard()` 函數。如果您已完成 [第 1 課的作業](../1-template-route/assignment.md),這應該很簡單,否則您可以使用以下實現。
+現在我們需要在每次載入儀表板時呼叫 `updateDashboard()` 函數。如果您已完成[第一課的作業](../1-template-route/assignment.md),這應該很簡單,否則您可以使用以下實現。
將此程式碼新增到 `updateRoute()` 函數的末尾:
@@ -244,7 +244,7 @@ if (typeof route.init === 'function') {
}
```
-並使用以下內容更新路由定義:
+並更新路由定義:
```js
const routes = {
@@ -253,13 +253,13 @@ const routes = {
};
```
-透過此更改,每次顯示儀表板頁面時,`updateDashboard()` 函數都會被呼叫。登入後,您應該能夠看到帳戶餘額、貨幣和描述。
+透過此更改,每次顯示儀表板頁面時,會呼叫 `updateDashboard()` 函數。登入後,您應該能看到帳戶餘額、貨幣和描述。
-## 使用 HTML 模板動態建立表格列
+## 使用 HTML 模板動態建立表格行
-在[第一課](../1-template-route/README.md)中,我們使用 HTML 模板和 [`appendChild()`](https://developer.mozilla.org/docs/Web/API/Node/appendChild) 方法實現了應用程式中的導航。模板也可以更小,並用於動態填充頁面中重複的部分。
+在[第一課](../1-template-route/README.md)中,我們使用 HTML 模板與 [`appendChild()`](https://developer.mozilla.org/docs/Web/API/Node/appendChild) 方法來實現應用程式的導航。模板也可以更小,並用於動態填充頁面中重複的部分。
-我們將使用類似的方法來在 HTML 表格中顯示交易列表。
+我們將使用類似的方法在 HTML 表格中顯示交易列表。
### 任務
@@ -275,15 +275,15 @@ const routes = {
```
-此模板表示一個表格列,包含我們想要填充的 3 個欄位:交易的 *日期*、*物件* 和 *金額*。
+此模板代表一個表格行,包含我們想要填充的三個欄位:交易的*日期*、*物件*和*金額*。
-然後,將此 `id` 屬性新增到儀表板模板中表格的 `
` 元素,以便透過 JavaScript 更容易找到它:
+接著,將此 `id` 屬性新增到儀表板模板中的表格 ` ` 元素,以便透過 JavaScript 更容易找到:
```html
```
-我們的 HTML 已準備就緒,現在切換到 JavaScript 程式碼並建立一個新函數 `createTransactionRow`:
+我們的 HTML 已準備好,接下來切換到 JavaScript 程式碼並建立一個新函數 `createTransactionRow`:
```js
function createTransactionRow(transaction) {
@@ -297,7 +297,7 @@ function createTransactionRow(transaction) {
}
```
-此函數正如其名稱所示:使用我們之前建立的模板,建立一個新的表格列,並使用交易資料填充其內容。我們將在 `updateDashboard()` 函數中使用它來填充表格:
+此函數正如其名稱所示:使用我們之前建立的模板,建立一個新的表格行並使用交易資料填充其內容。我們會在 `updateDashboard()` 函數中使用此函數來填充表格:
```js
const transactionsRows = document.createDocumentFragment();
@@ -308,9 +308,9 @@ for (const transaction of account.transactions) {
updateElement('transactions', transactionsRows);
```
-在這裡,我們使用方法 [`document.createDocumentFragment()`](https://developer.mozilla.org/docs/Web/API/Document/createDocumentFragment),它建立了一個新的 DOM 片段,我們可以在其上操作,然後最終將其附加到我們的 HTML 表格中。
+這裡我們使用方法 [`document.createDocumentFragment()`](https://developer.mozilla.org/docs/Web/API/Document/createDocumentFragment),它建立一個新的 DOM 片段,我們可以在其上操作,最後將其附加到 HTML 表格中。
-在此程式碼能正常運行之前,我們還需要做一件事,因為我們的 `updateElement()` 函數目前僅支援文字內容。讓我們稍微修改其程式碼:
+在此程式碼能正常運行之前,我們還需要做一件事,因為目前的 `updateElement()` 函數僅支援文字內容。我們需要稍微修改其程式碼:
```js
function updateElement(id, textOrNode) {
@@ -327,7 +327,7 @@ function updateElement(id, textOrNode) {
## 🚀 挑戰
-一起合作讓儀表板頁面看起來像一個真正的銀行應用程式。如果你已經為應用程式設計了樣式,試著使用 [媒體查詢](https://developer.mozilla.org/docs/Web/CSS/Media_Queries) 來創建一個 [響應式設計](https://developer.mozilla.org/docs/Web/Progressive_web_apps/Responsive/responsive_design_building_blocks),讓它在桌面和行動裝置上都能良好運作。
+一起合作讓儀表板頁面看起來像一個真正的銀行應用程式。如果你已經為你的應用程式設計了樣式,試著使用 [媒體查詢](https://developer.mozilla.org/docs/Web/CSS/Media_Queries) 來創建一個 [響應式設計](https://developer.mozilla.org/docs/Web/Progressive_web_apps/Responsive/responsive_design_building_blocks),讓它在桌面和行動裝置上都能良好運作。
以下是一個設計過的儀表板頁面的範例:
@@ -341,5 +341,7 @@ function updateElement(id, textOrNode) {
[重構並註解你的程式碼](assignment.md)
+---
+
**免責聲明**:
-本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/7-bank-project/4-state-management/README.md b/translations/mo/7-bank-project/4-state-management/README.md
index d0815da2..ca1a97f8 100644
--- a/translations/mo/7-bank-project/4-state-management/README.md
+++ b/translations/mo/7-bank-project/4-state-management/README.md
@@ -1,13 +1,13 @@
-# 建立銀行應用程式第4部分:狀態管理的概念
+# 建立銀行應用程式第4部分:狀態管理概念
## 課前測驗
@@ -15,15 +15,15 @@ CO_OP_TRANSLATOR_METADATA:
### 簡介
-隨著網頁應用程式的規模增長,管理所有數據流變得越來越具有挑戰性。哪段程式碼獲取了數據?哪個頁面使用了它?它需要在何時何地更新?這些問題很容易導致程式碼變得混亂且難以維護。特別是當你需要在應用程式的不同頁面之間共享數據時,例如用戶數據。*狀態管理* 的概念一直存在於各類程式中,但隨著網頁應用程式的複雜性不斷增加,這已成為開發過程中的一個關鍵點。
+隨著網頁應用程式的規模增大,追蹤所有資料流變得越來越困難。哪些程式碼獲取資料、哪些頁面使用資料、資料需要在哪裡以及何時更新……很容易導致程式碼混亂且難以維護。尤其是當需要在應用程式的不同頁面之間共享資料時,例如使用者資料。*狀態管理*的概念一直存在於各種程式中,但隨著網頁應用程式的複雜性不斷增加,現在在開發過程中需要特別考慮這一點。
-在這最後一部分,我們將重新審視我們建立的應用程式,重新思考如何管理狀態,以支持在任何時候刷新瀏覽器,並在用戶會話之間持續保存數據。
+在這最後一部分,我們將重新審視我們建立的應用程式,重新思考如何管理狀態,支持瀏覽器在任何時候刷新,並在使用者會話之間持續保存資料。
### 先決條件
-你需要完成網頁應用程式的[數據獲取](../3-data/README.md)部分。你還需要安裝 [Node.js](https://nodejs.org) 並在本地運行 [伺服器 API](../api/README.md),以便管理帳戶數據。
+您需要完成本課程的[資料擷取](../3-data/README.md)部分。此外,您需要安裝 [Node.js](https://nodejs.org) 並[在本地運行伺服器 API](../api/README.md),以便管理帳戶資料。
-你可以通過在終端執行以下命令來測試伺服器是否正常運行:
+您可以通過在終端執行以下命令來測試伺服器是否正常運行:
```sh
curl http://localhost:5000/api
@@ -34,34 +34,34 @@ curl http://localhost:5000/api
## 重新思考狀態管理
-在[上一課](../3-data/README.md)中,我們在應用程式中引入了一個基本的狀態概念,即全域變數 `account`,它包含當前登錄用戶的銀行數據。然而,我們目前的實現存在一些缺陷。嘗試在儀表板頁面刷新瀏覽器。會發生什麼?
+在[上一課程](../3-data/README.md)中,我們在應用程式中引入了基本的狀態概念,使用全域變數 `account` 來保存當前登入使用者的銀行資料。然而,我們目前的實現存在一些缺陷。嘗試在儀表板頁面刷新,會發生什麼?
-目前的程式碼有三個問題:
+目前程式碼有三個問題:
-- 狀態未被持久化,刷新瀏覽器會將你帶回登錄頁面。
-- 有多個函數修改狀態。隨著應用程式的增長,這可能使得跟蹤更改變得困難,並且很容易忘記更新某些部分。
-- 狀態未被清理,因此當你點擊 *登出* 時,即使你已經在登錄頁面,帳戶數據仍然存在。
+- 狀態未持久化,瀏覽器刷新會將您帶回登入頁面。
+- 有多個函數修改狀態。隨著應用程式的增長,這可能使追蹤更改變得困難,並且容易忘記更新某些部分。
+- 狀態未清理,因此當您點擊*登出*時,帳戶資料仍然存在,即使您已回到登入頁面。
-我們可以逐一更新程式碼來解決這些問題,但這會導致程式碼重複,並使應用程式變得更加複雜且難以維護。或者,我們可以花幾分鐘重新思考我們的策略。
+我們可以逐一更新程式碼來解決這些問題,但這會導致程式碼重複並使應用程式更加複雜且難以維護。或者,我們可以停下來重新思考策略。
-> 我們真正想解決的問題是什麼?
+> 我們真正想要解決的問題是什麼?
-[狀態管理](https://en.wikipedia.org/wiki/State_management) 的核心在於找到一個好的方法來解決以下兩個特定問題:
+[狀態管理](https://en.wikipedia.org/wiki/State_management)的核心在於找到一個良好的方法來解決以下兩個特定問題:
-- 如何讓應用程式中的數據流變得易於理解?
-- 如何確保狀態數據始終與用戶界面保持同步(反之亦然)?
+- 如何讓應用程式中的資料流保持清晰易懂?
+- 如何確保狀態資料始終與使用者介面同步(反之亦然)?
-一旦解決了這些問題,你可能面臨的其他問題要麼已經被解決,要麼變得更容易解決。有許多可能的方法來解決這些問題,但我們將採用一種常見的解決方案,即**集中化數據及其更改方式**。數據流將如下圖所示:
+一旦解決了這些問題,您可能已經解決了其他問題,或者使它們更容易解決。有許多方法可以解決這些問題,但我們將採用一種常見的解決方案,即**集中化資料及其更改方式**。資料流將如下所示:
-
+
-> 我們在這裡不會涵蓋數據自動觸發視圖更新的部分,因為這涉及到更高級的[反應式編程](https://en.wikipedia.org/wiki/Reactive_programming)概念。如果你有興趣深入研究,這是一個很好的後續主題。
+> 我們在此不會涵蓋資料自動觸發視圖更新的部分,因為這涉及到更高級的[反應式程式設計](https://en.wikipedia.org/wiki/Reactive_programming)概念。如果您有興趣深入研究,這是一個很好的後續主題。
-✅ 現在有許多不同方法的狀態管理庫,[Redux](https://redux.js.org) 是一個流行的選擇。了解其使用的概念和模式通常是一個很好的方式,可以幫助你了解在大型網頁應用程式中可能面臨的問題以及如何解決它們。
+✅ 市面上有許多不同方法的狀態管理庫,[Redux](https://redux.js.org) 是一個受歡迎的選擇。了解其使用的概念和模式通常是學習大型網頁應用程式可能面臨的潛在問題以及如何解決這些問題的好方法。
### 任務
-我們將從一些重構開始。替換 `account` 的聲明:
+我們將從一些重構開始。替換 `account` 宣告:
```js
let account = null;
@@ -75,7 +75,7 @@ let state = {
};
```
-這樣做的目的是將我們應用程式的所有數據集中到一個單一的狀態物件中。目前狀態中只有 `account`,所以變化不大,但這為未來的擴展奠定了基礎。
+這個想法是將應用程式的所有資料集中到一個單一的狀態物件中。我們目前在狀態中只有 `account`,因此變化不大,但這為未來的擴展奠定了基礎。
我們還需要更新使用它的函數。在 `register()` 和 `login()` 函數中,將 `account = ...` 替換為 `state.account = ...`;
@@ -85,17 +85,17 @@ let state = {
const account = state.account;
```
-這次重構本身並沒有帶來太多改進,但目的是為接下來的更改奠定基礎。
+這次重構本身並未帶來太多改進,但其目的是為接下來的更改奠定基礎。
-## 跟蹤數據更改
+## 追蹤資料變更
-現在我們已經設置了 `state` 物件來存儲數據,下一步是集中更新。目標是讓跟蹤任何更改及其發生時間變得更容易。
+現在我們已經設置了 `state` 物件來存儲資料,下一步是集中更新。目的是讓追蹤任何更改及其發生時間變得更容易。
-為了避免對 `state` 物件進行更改,將其視為[*不可變*](https://en.wikipedia.org/wiki/Immutable_object)是一個好習慣,這意味著它完全不能被修改。這也意味著如果你想更改其中的任何內容,必須創建一個新的狀態物件。這樣做可以防止潛在的[副作用](https://en.wikipedia.org/wiki/Side_effect_(computer_science)),並為應用程式的新功能(如實現撤銷/重做)打開可能性,同時也使調試更容易。例如,你可以記錄對狀態所做的每次更改,並保留更改的歷史記錄,以便了解錯誤的來源。
+為了避免對 `state` 物件進行更改,考慮將其設為[*不可變*](https://en.wikipedia.org/wiki/Immutable_object)是一個好習慣,這意味著它完全不能被修改。這也意味著如果您想更改其中的任何內容,必須創建一個新的狀態物件。通過這樣做,您可以防止潛在的[副作用](https://en.wikipedia.org/wiki/Side_effect_(computer_science)),並為應用程式的新功能(例如實現撤銷/重做)開闢可能性,同時使調試更容易。例如,您可以記錄對狀態所做的每次更改並保留更改歷史,以了解錯誤的來源。
-在 JavaScript 中,你可以使用 [`Object.freeze()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) 創建物件的不可變版本。如果你嘗試更改不可變物件,將會引發異常。
+在 JavaScript 中,您可以使用 [`Object.freeze()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) 創建物件的不可變版本。如果嘗試更改不可變物件,將引發異常。
-✅ 你知道 *淺不可變* 和 *深不可變* 物件之間的區別嗎?你可以在[這裡](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze)閱讀相關內容。
+✅ 您知道*淺層*和*深層*不可變物件的區別嗎?您可以在[這裡](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze)閱讀相關內容。
### 任務
@@ -110,7 +110,7 @@ function updateState(property, newData) {
}
```
-在這個函數中,我們創建了一個新的狀態物件,並使用[*展開運算符 (`...`)*](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals)從前一個狀態中複製數據。然後,我們使用[方括號表示法](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties) `[property]` 覆蓋狀態物件的特定屬性,最後使用 `Object.freeze()` 鎖定物件以防止修改。目前狀態中只存儲了 `account` 屬性,但通過這種方法,你可以在狀態中添加任意多的屬性。
+在此函數中,我們創建了一個新的狀態物件,並使用[*展開運算符 (`...`)*](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals)從先前的狀態中複製資料。然後使用[方括號表示法](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties) `[property]` 覆蓋狀態物件的特定屬性。最後,我們使用 `Object.freeze()` 鎖定物件以防止修改。目前狀態中僅存儲 `account` 屬性,但使用此方法,您可以在狀態中添加任意多的屬性。
我們還需要更新 `state` 的初始化,以確保初始狀態也是不可變的:
@@ -120,21 +120,21 @@ let state = Object.freeze({
});
```
-接下來,更新 `register` 函數,將 `state.account = result;` 替換為:
+之後,更新 `register` 函數,將 `state.account = result;` 替換為:
```js
updateState('account', result);
```
-對 `login` 函數執行相同操作,將 `state.account = data;` 替換為:
+對 `login` 函數進行相同的操作,將 `state.account = data;` 替換為:
```js
updateState('account', data);
```
-現在,我們可以順便修復用戶點擊 *登出* 時帳戶數據未被清除的問題。
+現在我們可以趁機修復使用者點擊*登出*時帳戶資料未清理的問題。
-創建一個新函數 `logout()`:
+創建一個新的函數 `logout()`:
```js
function logout() {
@@ -145,33 +145,33 @@ function logout() {
在 `updateDashboard()` 中,將重定向 `return navigate('/login');` 替換為 `return logout();`
-嘗試註冊一個新帳戶,登出並重新登錄,檢查一切是否仍然正常運作。
+嘗試註冊新帳戶,登出並重新登入,檢查是否一切正常。
-> 提示:你可以在 `updateState()` 的底部添加 `console.log(state)`,然後打開瀏覽器的開發工具中的控制台,查看所有狀態更改。
+> 提示:您可以通過在 `updateState()` 的底部添加 `console.log(state)` 並打開瀏覽器開發工具中的控制台來查看所有狀態更改。
## 持久化狀態
-大多數網頁應用程式需要持久化數據才能正常運作。所有關鍵數據通常存儲在數據庫中,並通過伺服器 API 訪問,例如我們的用戶帳戶數據。但有時,將一些數據存儲在瀏覽器中運行的客戶端應用程式中也是有意義的,這樣可以提升用戶體驗或改善加載性能。
+大多數網頁應用程式需要持久化資料才能正常運作。所有關鍵資料通常存儲在資料庫中,並通過伺服器 API 訪問,例如我們的使用者帳戶資料。但有時,將某些資料存儲在瀏覽器中運行的客戶端應用程式中也是有益的,這可以改善使用者體驗或提高加載性能。
-當你想在瀏覽器中持久化數據時,有幾個重要問題需要考慮:
+當您想在瀏覽器中持久化資料時,有幾個重要問題需要考慮:
-- *數據是否敏感?* 你應該避免在客戶端存儲任何敏感數據,例如用戶密碼。
-- *你需要保存這些數據多久?* 你是只打算在當前會話中訪問這些數據,還是希望它們永久保存?
+- *資料是否敏感?* 您應避免在客戶端存儲任何敏感資料,例如使用者密碼。
+- *您需要保存這些資料多久?* 您是僅在當前會話中訪問這些資料,還是希望永久保存?
-根據你的需求,有多種方式可以在網頁應用程式中存儲信息。例如,你可以使用 URL 存儲搜索查詢,並使其可在用戶之間共享。你還可以使用 [HTTP cookies](https://developer.mozilla.org/docs/Web/HTTP/Cookies) 存儲需要與伺服器共享的數據,例如[身份驗證](https://en.wikipedia.org/wiki/Authentication)信息。
+根據您的需求,有多種方法可以在網頁應用程式中存儲資訊。例如,您可以使用 URL 存儲搜尋查詢,並使其可在使用者之間共享。您還可以使用 [HTTP cookies](https://developer.mozilla.org/docs/Web/HTTP/Cookies) 存儲需要與伺服器共享的資料,例如[身份驗證](https://en.wikipedia.org/wiki/Authentication)資訊。
-另一個選擇是使用瀏覽器的數據存儲 API,其中有兩個特別有趣:
+另一個選擇是使用瀏覽器的多種資料存儲 API,其中有兩個特別值得注意:
-- [`localStorage`](https://developer.mozilla.org/docs/Web/API/Window/localStorage):一種[鍵值存儲](https://en.wikipedia.org/wiki/Key%E2%80%93value_database),允許在不同會話之間持久化特定於當前網站的數據。存儲在其中的數據永不過期。
-- [`sessionStorage`](https://developer.mozilla.org/docs/Web/API/Window/sessionStorage):其工作方式與 `localStorage` 相同,但存儲在其中的數據會在會話結束(瀏覽器關閉時)被清除。
+- [`localStorage`](https://developer.mozilla.org/docs/Web/API/Window/localStorage):一種[鍵值存儲](https://en.wikipedia.org/wiki/Key%E2%80%93value_database),允許跨不同會話持久化特定於當前網站的資料。存儲在其中的資料永不過期。
+- [`sessionStorage`](https://developer.mozilla.org/docs/Web/API/Window/sessionStorage):其工作方式與 `localStorage` 相同,但存儲的資料在會話結束(瀏覽器關閉時)後會被清除。
-需要注意的是,這兩個 API 都只允許存儲[字串](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)。如果你想存儲複雜物件,需要使用 [`JSON.stringify()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) 將其序列化為 [JSON](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON) 格式。
+請注意,這兩個 API 只允許存儲[字串](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)。如果您想存儲複雜物件,則需要使用 [`JSON.stringify()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) 將其序列化為 [JSON](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON) 格式。
-✅ 如果你想創建一個不依賴伺服器的網頁應用程式,也可以使用 [`IndexedDB` API](https://developer.mozilla.org/docs/Web/API/IndexedDB_API) 在客戶端創建數據庫。這適用於需要存儲大量數據的高級用例,因為它的使用更為複雜。
+✅ 如果您想創建一個不依賴伺服器的網頁應用程式,也可以使用 [`IndexedDB` API](https://developer.mozilla.org/docs/Web/API/IndexedDB_API) 在客戶端創建資料庫。這適用於需要存儲大量資料的高級用例,但使用起來更為複雜。
### 任務
-我們希望用戶在明確點擊 *登出* 按鈕之前保持登錄狀態,因此我們將使用 `localStorage` 存儲帳戶數據。首先,定義一個用於存儲數據的鍵。
+我們希望使用者保持登入狀態,直到他們明確點擊*登出*按鈕,因此我們將使用 `localStorage` 存儲帳戶資料。首先,定義一個用於存儲資料的鍵。
```js
const storageKey = 'savedAccount';
@@ -183,9 +183,9 @@ const storageKey = 'savedAccount';
localStorage.setItem(storageKey, JSON.stringify(state.account));
```
-通過這樣做,用戶帳戶數據將被持久化,並且由於我們之前集中化了所有狀態更新,它始終是最新的。這正是我們之前重構的好處所在 🙂。
+有了這個,使用者帳戶資料將被持久化並始終保持最新,因為我們之前已集中化所有狀態更新。這就是我們開始從之前的重構中受益的地方 🙂。
-由於數據已保存,我們還需要在應用程式加載時恢復它。由於我們即將有更多初始化程式碼,因此最好創建一個新的 `init` 函數,將之前在 `app.js` 底部的程式碼也包括進來:
+由於資料已保存,我們還需要在應用程式加載時恢復它。由於我們將開始有更多的初始化程式碼,創建一個新的 `init` 函數可能是一個好主意,並將之前的程式碼也包含在 `app.js` 的底部:
```js
function init() {
@@ -202,17 +202,17 @@ function init() {
init();
```
-在這裡,我們檢索保存的數據,如果有數據,則相應地更新狀態。重要的是要在更新路由*之前*執行此操作,因為在頁面更新期間可能有程式碼依賴於狀態。
+在此,我們檢索保存的資料,如果有任何資料,我們相應地更新狀態。重要的是在更新路由*之前*執行此操作,因為在頁面更新期間可能有程式碼依賴於狀態。
-我們還可以將 *儀表板* 頁設為應用程式的默認頁面,因為我們現在已經持久化了帳戶數據。如果未找到數據,儀表板會負責重定向到 *登錄* 頁。在 `updateRoute()` 中,將回退 `return navigate('/login');` 替換為 `return navigate('/dashboard');`。
+我們還可以將*儀表板*頁面設為應用程式的預設頁面,因為我們現在正在持久化帳戶資料。如果未找到資料,儀表板會負責重定向到*登入*頁面。在 `updateRoute()` 中,將回退 `return navigate('/login');` 替換為 `return navigate('/dashboard');`。
-現在登錄應用程式並嘗試刷新頁面。你應該仍然停留在儀表板頁面。通過這次更新,我們解決了所有初始問題...
+現在登入應用程式並嘗試刷新頁面。您應該停留在儀表板上。通過這次更新,我們已經解決了所有初始問題...
-## 刷新數據
+## 刷新資料
...但我們可能也創造了一個新問題。糟糕!
-使用 `test` 帳戶進入儀表板,然後在終端運行以下命令創建一個新交易:
+使用 `test` 帳戶進入儀表板,然後在終端執行以下命令以創建新交易:
```sh
curl --request POST \
@@ -221,15 +221,15 @@ curl --request POST \
http://localhost:5000/api/accounts/test/transactions
```
-現在嘗試在瀏覽器中刷新儀表板頁面。會發生什麼?你看到新交易了嗎?
+現在嘗試刷新瀏覽器中的儀表板頁面。會發生什麼?您是否看到新的交易?
-由於 `localStorage` 使狀態被無限期持久化,但這也意味著在你登出應用程式並重新登錄之前,它永遠不會更新!
+由於 `localStorage`,狀態被無限期持久化,但這也意味著它永遠不會更新,直到您登出應用程式並重新登入!
-一種可能的解決策略是每次加載儀表板時重新加載帳戶數據,以避免數據陳舊。
+解決此問題的一種可能策略是每次加載儀表板時重新載入帳戶資料,以避免資料過時。
### 任務
-創建一個新函數 `updateAccountData`:
+創建一個新的函數 `updateAccountData`:
```js
async function updateAccountData() {
@@ -247,9 +247,9 @@ async function updateAccountData() {
}
```
-此方法檢查我們當前是否已登錄,然後從伺服器重新加載帳戶數據。
+此方法檢查我們當前是否已登入,然後從伺服器重新載入帳戶資料。
-再創建另一個名為 `refresh` 的函數:
+創建另一個名為 `refresh` 的函數:
```js
async function refresh() {
@@ -258,7 +258,7 @@ async function refresh() {
}
```
-此函數更新帳戶數據,然後負責更新儀表板頁面的 HTML。這是我們需要在加載儀表板路由時調用的函數。使用以下程式碼更新路由定義:
+此函數更新帳戶資料,然後負責更新儀表板頁面的 HTML。這是我們需要在儀表板路由加載時調用的函數。使用以下程式碼更新路由定義:
```js
const routes = {
@@ -267,26 +267,28 @@ const routes = {
};
```
-現在嘗試重新加載儀表板,它應該顯示更新的帳戶數據。
+現在嘗試重新載入儀表板,它應顯示更新的帳戶資料。
---
## 🚀 挑戰
-現在我們每次加載儀表板時都會重新加載帳戶數據,你認為我們是否仍然需要持久化*所有帳戶*數據?
+現在我們每次加載儀表板時都重新載入帳戶資料,您認為我們是否仍然需要持久化*所有帳戶*資料?
-試著一起合作,修改 `localStorage` 中保存和加載的內容,使其僅包含應用程式正常運作所需的數據。
+嘗試一起修改 `localStorage` 中保存和加載的內容,使其僅包含應用程式正常運作所需的資料。
## 課後測驗
+
[課後測驗](https://ff-quizzes.netlify.app/web/quiz/48)
## 作業
+[實現「新增交易」對話框](assignment.md)
-[實作「新增交易」對話框](assignment.md)
+以下是完成任務後的範例結果:
-以下是完成作業後的範例結果:
+
-
+---
**免責聲明**:
-本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/8-code-editor/1-using-a-code-editor/README.md b/translations/mo/8-code-editor/1-using-a-code-editor/README.md
index edbe7536..e240eb78 100644
--- a/translations/mo/8-code-editor/1-using-a-code-editor/README.md
+++ b/translations/mo/8-code-editor/1-using-a-code-editor/README.md
@@ -1,159 +1,174 @@
# 使用程式碼編輯器
-本課程介紹如何使用 [VSCode.dev](https://vscode.dev),一個基於網頁的程式碼編輯器,讓你可以在不需要安裝任何軟體的情況下,修改程式碼並參與專案。
+本課程介紹如何使用 [VSCode.dev](https://vscode.dev) 這款基於網頁的程式碼編輯器,讓您可以在不需要安裝任何軟體的情況下修改程式碼並參與專案。
+
+
+
+
## 學習目標
-在這節課中,你將學會:
+在本課程中,您將學習如何:
- 在程式碼專案中使用程式碼編輯器
-- 使用版本控制來追蹤變更
-- 自訂編輯器以適應開發需求
+- 使用版本控制追蹤變更
+- 自訂編輯器以進行開發
### 先決條件
-在開始之前,你需要擁有一個 [GitHub](https://github.com) 帳戶。如果還沒有帳戶,請前往 [GitHub](https://github.com/) 註冊。
+在開始之前,您需要先在 [GitHub](https://github.com) 建立一個帳戶。如果您尚未建立帳戶,請前往 [GitHub](https://github.com/) 註冊。
### 簡介
-程式碼編輯器是撰寫程式和協作處理現有程式碼專案的重要工具。一旦你掌握了編輯器的基本操作及其功能,就能將這些技能應用到程式碼撰寫中。
+程式碼編輯器是撰寫程式和協作現有程式碼專案的重要工具。一旦您了解編輯器的基本功能及如何使用其特性,便能在撰寫程式碼時靈活運用。
## 開始使用 VSCode.dev
-[VSCode.dev](https://vscode.dev) 是一個基於網頁的程式碼編輯器。你不需要安裝任何軟體,只需像打開其他網站一樣打開它即可。要開始使用,請打開以下連結:[https://vscode.dev](https://vscode.dev)。如果你尚未登入 [GitHub](https://github.com/),請按照提示登入或創建新帳戶後再登入。
+[VSCode.dev](https://vscode.dev) 是一款基於網頁的程式碼編輯器。您不需要安裝任何軟體,只需像開啟其他網站一樣使用它。要開始使用編輯器,請開啟以下連結:[https://vscode.dev](https://vscode.dev)。如果您尚未登入 [GitHub](https://github.com/),請按照提示登入或建立新帳戶後再登入。
-載入後,畫面應該類似於以下圖片:
+載入後,畫面應該看起來像這張圖片:

-畫面主要分為三個部分,從左到右依次為:
+主要有三個區域,從左到右分別是:
-1. **活動欄**,包含一些圖示,例如放大鏡 🔎、齒輪 ⚙️ 等。
-2. 展開的活動欄,預設為 **檔案總管**,稱為 **側邊欄**。
+1. _活動列_,包含一些圖示,例如放大鏡 🔎、齒輪 ⚙️ 等。
+2. 展開的活動列,預設為 _檔案總管_,稱為 _側邊欄_。
3. 最右側的程式碼區域。
-點擊每個圖示以顯示不同的選單。完成後,點擊 **檔案總管** 回到初始畫面。
+點擊每個圖示以顯示不同的選單。完成後,點擊 _檔案總管_ 回到初始位置。
-當你開始撰寫程式碼或修改現有程式碼時,這些操作都會在右側最大的區域進行。接下來,你將學習如何在這裡查看現有程式碼。
+當您開始撰寫程式碼或修改現有程式碼時,這些操作都會在右側最大的區域進行。您也可以在此區域查看現有程式碼,接下來我們將進一步探討。
## 開啟 GitHub 儲存庫
-首先,你需要開啟一個 GitHub 儲存庫。有多種方式可以開啟儲存庫,以下介紹兩種方法,讓你可以開始進行修改。
+首先,您需要開啟一個 GitHub 儲存庫。有多種方式可以開啟儲存庫,本節將介紹兩種方法,讓您可以開始進行修改。
### 1. 使用編輯器
-使用編輯器本身來開啟遠端儲存庫。進入 [VSCode.dev](https://vscode.dev),你會看到一個 **"Open Remote Repository"** 按鈕:
+使用編輯器本身開啟遠端儲存庫。如果您前往 [VSCode.dev](https://vscode.dev),會看到一個 _"開啟遠端儲存庫"_ 按鈕:

-你也可以使用指令面板。指令面板是一個輸入框,你可以輸入任何指令或操作的關鍵字來找到相應的指令。點擊左上角的選單,選擇 **檢視**,然後選擇 **指令面板**,或者使用以下快捷鍵:Ctrl-Shift-P(MacOS 上為 Command-Shift-P)。
+您也可以使用指令面板。指令面板是一個輸入框,您可以輸入任何指令或動作的關鍵字來找到相應的指令。使用左上方的選單,選擇 _檢視_,然後點擊 _指令面板_,或使用以下快捷鍵:Ctrl-Shift-P(MacOS 上為 Command-Shift-P)。

-選單打開後,輸入 **open remote repository**,然後選擇第一個選項。你參與的儲存庫或最近開啟的儲存庫會顯示出來。你也可以使用完整的 GitHub URL 來選擇儲存庫。將以下 URL 貼入輸入框:
+開啟選單後,輸入 _開啟遠端儲存庫_,然後選擇第一個選項。您參與的儲存庫或最近開啟的儲存庫將顯示出來。您也可以使用完整的 GitHub URL 來選擇儲存庫。將以下 URL 貼入輸入框:
```
https://github.com/microsoft/Web-Dev-For-Beginners
```
-✅ 如果成功,你會看到該儲存庫的所有檔案載入到文字編輯器中。
+✅ 如果成功,您將看到該儲存庫的所有檔案載入到文字編輯器中。
### 2. 使用 URL
-你也可以直接使用 URL 來載入儲存庫。例如,目前儲存庫的完整 URL 是 [https://github.com/microsoft/Web-Dev-For-Beginners](https://github.com/microsoft/Web-Dev-For-Beginners),但你可以將 GitHub 網域替換為 `VSCode.dev/github`,直接載入儲存庫。結果 URL 為 [https://vscode.dev/github/microsoft/Web-Dev-For-Beginners](https://vscode.dev/github/microsoft/Web-Dev-For-Beginners)。
+您也可以直接使用 URL 來載入儲存庫。例如,目前儲存庫的完整 URL 是 [https://github.com/microsoft/Web-Dev-For-Beginners](https://github.com/microsoft/Web-Dev-For-Beginners),但您可以將 GitHub 網域替換為 `VSCode.dev/github`,直接載入儲存庫。結果 URL 為 [https://vscode.dev/github/microsoft/Web-Dev-For-Beginners](https://vscode.dev/github/microsoft/Web-Dev-For-Beginners)。
## 編輯檔案
-當你在瀏覽器或 vscode.dev 中開啟儲存庫後,下一步就是對專案進行更新或修改。
+當您在瀏覽器或 vscode.dev 中開啟儲存庫後,下一步就是更新或修改專案。
### 1. 建立新檔案
-你可以選擇在現有資料夾中建立檔案,或者直接在根目錄/資料夾中建立。要建立新檔案,打開你希望儲存檔案的位置/目錄,然後選擇 **"New file ..."** 圖示,為檔案命名並按下 Enter。
+您可以在現有資料夾中建立檔案,也可以在根目錄/資料夾中建立檔案。要建立新檔案,請開啟您希望儲存檔案的位置/目錄,然後選擇活動列 _(左側)_ 的 _'新檔案 ...'_ 圖示,命名檔案後按下 Enter。

### 2. 編輯並儲存儲存庫中的檔案
-使用 vscode.dev 非常方便,特別是當你想快速更新專案而不需要在本地安裝任何軟體時。
-
-要更新程式碼,點擊活動欄上的 **檔案總管** 圖示,查看儲存庫中的檔案和資料夾。選擇一個檔案以在程式碼區域中打開,進行修改並儲存。
+使用 vscode.dev 非常適合快速更新專案,而不需要在本地端載入任何軟體。
+要更新程式碼,點擊活動列上的 '檔案總管' 圖示以查看儲存庫中的檔案和資料夾。
+選擇一個檔案以在程式碼區域中開啟,進行修改並儲存。

-完成專案更新後,選擇 **`原始碼控制`** 圖示,這裡會顯示你對儲存庫所做的所有變更。
+完成專案更新後,選擇 _`版本控制`_ 圖示,該圖示包含您對儲存庫所做的所有新變更。
-要查看你對專案的變更,選擇展開的活動欄中 **`變更`** 資料夾中的檔案。這將打開一個 **工作樹**,讓你直觀地查看檔案的變更。紅色表示刪除的內容,綠色表示新增的內容。
+要查看您對專案所做的變更,選擇展開的活動列中 `變更` 資料夾中的檔案。這將開啟一個 '工作樹',讓您直觀地查看檔案的變更。紅色表示刪除,綠色表示新增。

-如果你對所做的變更感到滿意,將滑鼠移到 **`變更`** 資料夾上,點擊 `+` 按鈕以暫存變更。暫存的意思是準備將變更提交到 GitHub。
+如果您對所做的變更感到滿意,將滑鼠移至 `變更` 資料夾並點擊 `+` 按鈕以暫存變更。暫存表示準備將變更提交到 GitHub。
-如果你對某些變更不滿意,想要捨棄它們,將滑鼠移到 **`變更`** 資料夾上,選擇 `撤銷` 圖示。
+如果您對某些變更不滿意並希望捨棄它們,將滑鼠移至 `變更` 資料夾並選擇 `撤銷` 圖示。
-接著,輸入一個 **提交訊息**(描述你對專案所做的變更),點擊 `勾選圖示` 提交並推送你的變更。
+接著,輸入 `提交訊息` _(描述您對專案所做的變更)_,點擊 `勾選圖示` 以提交並推送您的變更。
-完成專案工作後,選擇左上角的 **漢堡選單圖示** 返回 github.com 上的儲存庫。
+完成專案工作後,選擇左上方的 `漢堡選單圖示` 返回 github.com 上的儲存庫。

## 使用擴充功能
-在 VSCode 中安裝擴充功能可以為你的編輯器新增功能,並自訂開發環境選項,以改善開發工作流程。這些擴充功能還能幫助你支援多種程式語言,通常分為通用擴充功能或語言專用擴充功能。
+在 VSCode 中安裝擴充功能可以新增功能並自訂開發環境,提升開發工作流程。這些擴充功能可以支援多種程式語言,通常分為通用擴充功能或語言專屬擴充功能。
-要瀏覽所有可用的擴充功能列表,點擊活動欄上的 **`擴充功能圖示`**,然後在標有 **"Search Extensions in Marketplace"** 的文字框中輸入擴充功能的名稱。
-你會看到一個擴充功能列表,每個項目包含 **擴充功能名稱、發佈者名稱、一句話描述、下載次數** 和 **星級評分**。
+要瀏覽所有可用的擴充功能列表,點擊活動列上的 _`擴充功能圖示`_,並在標示為 _'在 Marketplace 中搜尋擴充功能'_ 的文字框中輸入擴充功能名稱。
+您將看到一個擴充功能列表,每個擴充功能包含 **名稱、發行者名稱、一句話描述、下載次數** 和 **星級評分**。

-你還可以通過展開以下資料夾來查看擴充功能:
-- **已安裝資料夾**:查看所有已安裝的擴充功能。
-- **熱門資料夾**:查看大多數開發者使用的熱門擴充功能。
-- **推薦資料夾**:根據相同工作區的使用者或你最近打開的檔案推薦的擴充功能。
+您也可以透過展開 _`已安裝資料夾`_ 查看所有已安裝的擴充功能,透過 _`熱門資料夾`_ 查看大多數開發者使用的熱門擴充功能,或透過 _`推薦資料夾`_ 查看基於您最近開啟的檔案或工作空間的推薦擴充功能。

### 1. 安裝擴充功能
-要安裝擴充功能,在搜尋框中輸入擴充功能的名稱,當它出現在展開的活動欄中時,點擊它以查看更多資訊。
+要安裝擴充功能,請在搜尋框中輸入擴充功能名稱,點擊它以在展開的活動列中查看更多資訊。
-你可以點擊展開活動欄中的 **藍色安裝按鈕** 安裝,或者在選擇擴充功能後,使用程式碼區域中顯示的安裝按鈕。
+您可以點擊展開的活動列中的 _藍色安裝按鈕_ 安裝擴充功能,或在程式碼區域中選擇擴充功能以載入更多資訊後使用安裝按鈕。

### 2. 自訂擴充功能
-安裝擴充功能後,你可能需要根據自己的偏好修改其行為並進行自訂。要執行此操作,選擇擴充功能圖示,然後在 **已安裝資料夾** 中找到你的擴充功能,點擊 **齒輪圖示** 並導航到 **擴充功能設定**。
+安裝擴充功能後,您可能需要根據偏好修改其行為並進行自訂。要執行此操作,選擇擴充功能圖示,您的擴充功能將出現在 _已安裝資料夾_ 中,點擊 _**齒輪圖示**_ 並導航至 _擴充功能設定_。

### 3. 管理擴充功能
-安裝並使用擴充功能後,vscode.dev 提供了多種選項來根據不同需求管理擴充功能。例如,你可以選擇:
+安裝並使用擴充功能後,vscode.dev 提供多種選項以根據不同需求管理擴充功能。例如,您可以選擇:
-- **停用**:當你暫時不需要某個擴充功能,但又不想完全卸載它時,可以選擇停用。
+- **停用:** _(當您暫時不需要擴充功能但不想完全卸載時,可以停用它)_
- 選擇展開活動欄中的已安裝擴充功能 > 點擊齒輪圖示 > 選擇 **停用** 或 **停用(工作區)** **或者** 打開程式碼區域中的擴充功能,點擊藍色停用按鈕。
+ 選擇展開的活動列中的已安裝擴充功能 > 點擊齒輪圖示 > 選擇 '停用' 或 '停用(工作空間)' **或** 在程式碼區域中開啟擴充功能並點擊藍色停用按鈕。
-- **卸載**:選擇展開活動欄中的已安裝擴充功能 > 點擊齒輪圖示 > 選擇 **卸載** **或者** 打開程式碼區域中的擴充功能,點擊藍色卸載按鈕。
+- **卸載:** 選擇展開的活動列中的已安裝擴充功能 > 點擊齒輪圖示 > 選擇 '卸載' **或** 在程式碼區域中開啟擴充功能並點擊藍色卸載按鈕。
---
## 作業
-[使用 vscode.dev 建立一個履歷網站](https://github.com/microsoft/Web-Dev-For-Beginners/blob/main/8-code-editor/1-using-a-code-editor/assignment.md)
+[使用 vscode.dev 建立履歷網站](https://github.com/microsoft/Web-Dev-For-Beginners/blob/main/8-code-editor/1-using-a-code-editor/assignment.md)
-## 複習與自學
+
-閱讀更多關於 [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) 的內容及其其他功能。
+## 回顧與自學
+
+閱讀更多關於 [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) 及其其他功能的資訊。
+
+---
**免責聲明**:
-本文檔使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始語言的文件應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/8-code-editor/1-using-a-code-editor/assignment.md b/translations/mo/8-code-editor/1-using-a-code-editor/assignment.md
index a929e0be..0feb5046 100644
--- a/translations/mo/8-code-editor/1-using-a-code-editor/assignment.md
+++ b/translations/mo/8-code-editor/1-using-a-code-editor/assignment.md
@@ -1,25 +1,25 @@
# 使用 vscode.dev 建立履歷網站
-_當面試官要求你的履歷時,你能直接給他一個網址,這是不是很酷?_ 😎
+_當面試官要求你的履歷時,你可以直接給他們一個網址,這有多酷呢?_ 😎
## 目標
-完成這個作業後,你將學會:
+完成這個任務後,你將學會:
- 建立一個網站來展示你的履歷
### 先決條件
-1. 一個 GitHub 帳號。如果你還沒有帳號,請前往 [GitHub](https://github.com/) 註冊。
+1. 一個 GitHub 帳號。如果你還沒有,請前往 [GitHub](https://github.com/) 註冊一個帳號。
## 步驟
@@ -33,7 +33,7 @@ _當面試官要求你的履歷時,你能直接給他一個網址,這是不
**步驟 3:** 開啟 [VSCode.dev](https://vscode.dev),選擇 `Open Remote Repository` 按鈕。
-複製你剛剛為履歷網站建立的儲存庫網址,並將其貼到輸入框中:
+複製剛剛為你的履歷網站建立的儲存庫網址,並將其貼到輸入框中:
_將 `your-username` 替換為你的 GitHub 使用者名稱_
@@ -43,26 +43,26 @@ https://github.com/your-username/my-resume
✅ 如果成功,你將在瀏覽器中的文字編輯器看到你的專案和 `index.html` 檔案。
-
+
**步驟 4:** 開啟 `index.html` 檔案,將以下程式碼貼到你的編輯區域並儲存。
- HTML 程式碼負責履歷網站的內容。
+ 負責履歷網站內容的 HTML 程式碼。
- 你的名字在這裡!
+ Your Name Goes Here!
@@ -98,25 +98,25 @@ https://github.com/your-username/my-resume
在這裡填寫你的課程!
- 在這裡填寫你的學校!
+ 在這裡填寫你的學校名稱!
- 開始日期 - 結束日期
+ 開始 - 結束日期
- 工作經歷
-
+ 工作經驗
+
職位名稱
- 公司名稱在這裡 | 開始月份 – 結束月份
+ 在這裡填寫組織名稱 | 開始月份 – 結束月份
任務 1 - 描述你做了什麼!
@@ -126,7 +126,7 @@ https://github.com/your-username/my-resume
職位名稱 2
- 公司名稱在這裡 | 開始月份 – 結束月份
+ 在這裡填寫組織名稱 | 開始月份 – 結束月份
任務 1 - 描述你做了什麼!
@@ -143,12 +143,12 @@ https://github.com/your-username/my-resume
將你的履歷細節替換掉 HTML 程式碼中的 _佔位文字_。
-**步驟 5:** 將滑鼠移到 My-Resume 資料夾上,點擊 `New File ...` 圖示,並在專案中建立兩個新檔案:`style.css` 和 `codeswing.json`。
+**步驟 5:** 將滑鼠移到 My-Resume 資料夾上,點擊 `New File ...` 圖示,並在你的專案中建立兩個新檔案:`style.css` 和 `codeswing.json`。
**步驟 6:** 開啟 `style.css` 檔案,將以下程式碼貼上並儲存。
- CSS 程式碼負責網站的版面設計。
+ 用於格式化網站佈局的 CSS 程式碼。
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
@@ -217,17 +217,17 @@ https://github.com/your-username/my-resume
"styles": []
}
-**步驟 7:** 安裝 `Codeswing extension` 來在程式碼區域中預覽履歷網站。
+**步驟 7:** 安裝 `Codeswing extension` 以在編輯區域中預覽履歷網站。
-點擊活動欄上的 _`Extensions`_ 圖示,輸入 Codeswing。點擊展開活動欄上的 _藍色安裝按鈕_ 或在選擇擴展後出現的安裝按鈕來安裝。安裝完成後,觀察你的程式碼區域,看看專案的變化 😃
+點擊活動欄上的 _`Extensions`_ 圖示,輸入 Codeswing。點擊展開活動欄上的 _藍色安裝按鈕_ 或在選擇擴展後於編輯區域出現的安裝按鈕進行安裝。安裝完成後,觀察你的編輯區域,看看專案的變化 😃。

-安裝擴展後,你的螢幕上會看到以下內容。
+安裝擴展後,你的畫面應該會顯示如下。

-如果你對所做的更改感到滿意,將滑鼠移到 `Changes` 資料夾上,點擊 `+` 按鈕來暫存更改。
+如果你對所做的更改感到滿意,將滑鼠移到 `Changes` 資料夾上,點擊 `+` 按鈕以暫存更改。
輸入提交訊息 _(描述你對專案所做的更改)_,然後點擊 `check` 提交更改。完成專案後,選擇左上角的漢堡選單圖示返回 GitHub 上的儲存庫。
@@ -235,11 +235,13 @@ https://github.com/your-username/my-resume
## 🚀 挑戰
-開啟一個你有權限修改的遠端儲存庫,更新一些檔案。接著,嘗試建立一個包含更改的新分支並發起 Pull Request。
+開啟一個你有權限進行更改的遠端儲存庫,更新一些檔案。接下來,嘗試建立一個包含更改的新分支並提交 Pull Request。
## 回顧與自學
-閱讀更多關於 [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) 的內容以及它的其他功能。
+閱讀更多關於 [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) 及其其他功能的資訊。
+
+---
**免責聲明**:
-本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。
\ No newline at end of file
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
\ No newline at end of file
diff --git a/translations/mo/9-chat-project/README.md b/translations/mo/9-chat-project/README.md
new file mode 100644
index 00000000..635820df
--- /dev/null
+++ b/translations/mo/9-chat-project/README.md
@@ -0,0 +1,389 @@
+
+# 聊天專案
+
+這個聊天專案展示了如何使用 GitHub Models 建立一個聊天助手。
+
+以下是完成的專案樣貌:
+
+
+
+
+
+一些背景資訊,使用生成式 AI 建立聊天助手是一個很好的方式來開始學習 AI。在這堂課中,你將學習如何將生成式 AI整合到網頁應用程式中,讓我們開始吧。
+
+## 連接生成式 AI
+
+在後端部分,我們使用 GitHub Models。這是一個很棒的服務,讓你可以免費使用 AI。前往它的 Playground,並取得與你選擇的後端語言相對應的程式碼。以下是 [GitHub Models Playground](https://github.com/marketplace/models/azure-openai/gpt-4o-mini/playground) 的樣子:
+
+
+
+
+
+如前所述,選擇 "Code" 標籤和你選擇的執行環境。
+
+
+
+
+
+在這個例子中,我們選擇 Python,這意味著我們會選擇以下程式碼:
+
+```python
+"""Run this model in Python
+
+> pip install openai
+"""
+import os
+from openai import OpenAI
+
+# To authenticate with the model you will need to generate a personal access token (PAT) in your GitHub settings.
+# Create your PAT token by following instructions here: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
+client = OpenAI(
+ base_url="https://models.github.ai/inference",
+ api_key=os.environ["GITHUB_TOKEN"],
+)
+
+response = client.chat.completions.create(
+ messages=[
+ {
+ "role": "system",
+ "content": "",
+ },
+ {
+ "role": "user",
+ "content": "What is the capital of France?",
+ }
+ ],
+ model="openai/gpt-4o-mini",
+ temperature=1,
+ max_tokens=4096,
+ top_p=1
+)
+
+print(response.choices[0].message.content)
+```
+
+讓我們稍微整理一下這段程式碼,使其可重複使用:
+
+```python
+def call_llm(prompt: str, system_message: str):
+ response = client.chat.completions.create(
+ messages=[
+ {
+ "role": "system",
+ "content": system_message,
+ },
+ {
+ "role": "user",
+ "content": prompt,
+ }
+ ],
+ model="openai/gpt-4o-mini",
+ temperature=1,
+ max_tokens=4096,
+ top_p=1
+ )
+
+ return response.choices[0].message.content
+```
+
+有了這個函數 `call_llm`,我們現在可以傳入提示和系統提示,函數最終會返回結果。
+
+### 自訂 AI 助手
+
+如果你想自訂 AI 助手的行為,可以像下面這樣填入系統提示:
+
+```python
+call_llm("Tell me about you", "You're Albert Einstein, you only know of things in the time you were alive")
+```
+
+## 通過 Web API 暴露功能
+
+很好,我們已完成 AI 部分,接下來看看如何將其整合到 Web API 中。對於 Web API,我們選擇使用 Flask,但任何網頁框架都可以。以下是程式碼:
+
+```python
+# api.py
+from flask import Flask, request, jsonify
+from llm import call_llm
+from flask_cors import CORS
+
+app = Flask(__name__)
+CORS(app) # * example.com
+
+@app.route("/", methods=["GET"])
+def index():
+ return "Welcome to this API. Call POST /hello with 'message': 'my message' as JSON payload"
+
+
+@app.route("/hello", methods=["POST"])
+def hello():
+ # get message from request body { "message": "do this taks for me" }
+ data = request.get_json()
+ message = data.get("message", "")
+
+ response = call_llm(message, "You are a helpful assistant.")
+ return jsonify({
+ "response": response
+ })
+
+if __name__ == "__main__":
+ app.run(host="0.0.0.0", port=5000)
+```
+
+在這裡,我們建立了一個 Flask API,並定義了預設路徑 "/" 和 "/chat"。後者是供前端用來傳遞問題的。
+
+要整合 *llm.py*,我們需要做以下幾件事:
+
+- 匯入 `call_llm` 函數:
+
+ ```python
+ from llm import call_llm
+ from flask import Flask, request
+ ```
+
+- 從 "/chat" 路徑呼叫它:
+
+ ```python
+ @app.route("/hello", methods=["POST"])
+ def hello():
+ # get message from request body { "message": "do this taks for me" }
+ data = request.get_json()
+ message = data.get("message", "")
+
+ response = call_llm(message, "You are a helpful assistant.")
+ return jsonify({
+ "response": response
+ })
+ ```
+
+ 在這裡,我們解析傳入的請求,從 JSON 主體中檢索 `message` 屬性。接著,我們使用以下呼叫來調用 LLM:
+
+ ```python
+ response = call_llm(message, "You are a helpful assistant")
+
+ # return the response as JSON
+ return jsonify({
+ "response": response
+ })
+ ```
+
+很好,現在我們已完成所需的部分。
+
+### 配置 Cors
+
+我們需要提到的是,我們設置了類似 CORS(跨來源資源共享)的功能。這意味著,由於後端和前端將在不同的埠上運行,我們需要允許前端呼叫後端。在 *api.py* 中有一段程式碼設置了這個功能:
+
+```python
+from flask_cors import CORS
+
+app = Flask(__name__)
+CORS(app) # * example.com
+```
+
+目前它被設置為允許 "*",即所有來源,這有點不安全,應該在進入生產環境時進行限制。
+
+## 運行你的專案
+
+好了,我們有 *llm.py* 和 *api.py*,如何讓它與後端一起運行呢?有兩件事需要做:
+
+- 安裝依賴項:
+
+ ```sh
+ cd backend
+ python -m venv venv
+ source ./venv/bin/activate
+
+ pip install openai flask flask-cors openai
+ ```
+
+- 啟動 API:
+
+ ```sh
+ python api.py
+ ```
+
+ 如果你在 Codespaces 中,需要前往編輯器底部的 Ports,右鍵點擊並選擇 "Port Visibility",然後選擇 "Public"。
+
+### 開發前端
+
+現在我們的 API 已經啟動並運行,讓我們為此建立一個前端。這是一個最低限度的前端,我們將逐步改進。在 *frontend* 資料夾中,建立以下內容:
+
+```text
+backend/
+frontend/
+index.html
+app.js
+styles.css
+```
+
+首先是 **index.html**:
+
+```html
+
+
+
+
+
+
+
+
+ Send
+
+
+
+
+```
+
+以上是支持聊天窗口所需的最低限度內容,包括一個用於顯示訊息的文字區域、一個輸入框用於輸入訊息,以及一個按鈕用於將訊息發送到後端。接下來看看 *app.js* 中的 JavaScript。
+
+**app.js**
+
+```js
+// app.js
+
+(function(){
+ // 1. set up elements
+ const messages = document.getElementById("messages");
+ const form = document.getElementById("form");
+ const input = document.getElementById("input");
+
+ const BASE_URL = "change this";
+ const API_ENDPOINT = `${BASE_URL}/hello`;
+
+ // 2. create a function that talks to our backend
+ async function callApi(text) {
+ const response = await fetch(API_ENDPOINT, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ message: text })
+ });
+ let json = await response.json();
+ return json.response;
+ }
+
+ // 3. add response to our textarea
+ function appendMessage(text, role) {
+ const el = document.createElement("div");
+ el.className = `message ${role}`;
+ el.innerHTML = text;
+ messages.appendChild(el);
+ }
+
+ // 4. listen to submit events
+ form.addEventListener("submit", async(e) => {
+ e.preventDefault();
+ // someone clicked the button in the form
+
+ // get input
+ const text = input.value.trim();
+
+ appendMessage(text, "user")
+
+ // reset it
+ input.value = '';
+
+ const reply = await callApi(text);
+
+ // add to messages
+ appendMessage(reply, "assistant");
+
+ })
+})();
+```
+
+讓我們逐段解析程式碼:
+
+- 1) 在這裡,我們獲取所有稍後會引用的元素的參考。
+- 2) 在這部分,我們建立了一個函數,使用內建的 `fetch` 方法呼叫後端。
+- 3) `appendMessage` 幫助添加回應以及使用者輸入的訊息。
+- 4) 在這裡,我們監聽提交事件,讀取輸入欄位,將使用者的訊息放入文字區域,呼叫 API,並將回應渲染到文字區域。
+
+接下來看看樣式,這是你可以自由發揮的地方,但以下是一些建議:
+
+**styles.css**
+
+```
+.message {
+ background: #222;
+ box-shadow: 0 0 0 10px orange;
+ padding: 10px:
+ margin: 5px;
+}
+
+.message.user {
+ background: blue;
+}
+
+.message.assistant {
+ background: grey;
+}
+```
+
+有了這三個類別,你可以根據訊息的來源(助手或使用者)來區分樣式。如果需要靈感,可以查看 `solution/frontend/styles.css` 資料夾。
+
+### 更改 Base Url
+
+有一件事我們還沒設置,那就是 `BASE_URL`,這在後端啟動之前是未知的。設置方式如下:
+
+- 如果你在本地運行 API,應設置為類似 `http://localhost:5000`。
+- 如果在 Codespaces 中運行,應設置為類似 "[name]app.github.dev"。
+
+## 作業
+
+建立自己的資料夾 *project*,內容如下:
+
+```text
+project/
+ frontend/
+ index.html
+ app.js
+ styles.css
+ backend/
+ api.py
+ llm.py
+```
+
+複製上述指示的內容,但可以根據自己的喜好進行自訂。
+
+## 解決方案
+
+[解決方案](./solution/README.md)
+
+## 額外挑戰
+
+嘗試更改 AI 助手的個性。在 *api.py* 中呼叫 `call_llm` 時,可以將第二個參數更改為你想要的內容,例如:
+
+```python
+call_llm(message, "You are Captain Picard")
+```
+
+同時更改 CSS 和文字,使其符合你的喜好,因此需要修改 *index.html* 和 *styles.css*。
+
+## 總結
+
+很好,你已經從零開始學習如何使用 AI 建立個人助手。我們使用了 GitHub Models、Python 後端以及 HTML、CSS 和 JavaScript 前端完成了這項工作。
+
+## 使用 Codespaces 設置
+
+- 前往:[Web Dev For Beginners repo](https://github.com/microsoft/Web-Dev-For-Beginners)
+- 從模板建立(確保你已登入 GitHub),在右上角:
+
+ 
+
+- 一旦進入你的 repo,建立一個 Codespace:
+
+ 
+
+ 這將啟動一個你可以開始工作的環境。
+
+---
+
+**免責聲明**:
+本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解讀概不負責。
\ No newline at end of file
diff --git a/translations/mo/9-chat-project/solution/README.md b/translations/mo/9-chat-project/solution/README.md
new file mode 100644
index 00000000..541150e9
--- /dev/null
+++ b/translations/mo/9-chat-project/solution/README.md
@@ -0,0 +1,55 @@
+
+# 執行程式碼
+
+## 設置環境
+
+建立虛擬環境
+
+```sh
+cd backend
+python -m venv venv
+source ./venv/bin/activate
+```
+
+## 安裝依賴項
+
+```sh
+pip install openai flask flask-cors
+```
+
+## 啟動 API
+
+```sh
+python api.py
+```
+
+## 啟動前端
+
+確保你位於前端資料夾
+
+找到 *app.js*,將 `BASE_URL` 更改為你的後端 URL
+
+執行程式
+
+```
+npx http-server -p 8000
+```
+
+嘗試在聊天框中輸入訊息,你應該會看到回應(前提是你在 Codespace 中執行此程式或已設置存取權杖)。
+
+## 設置存取權杖(如果你不是在 Codespace 中執行)
+
+請參考 [設置 PAT](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)
+
+---
+
+**免責聲明**:
+本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而產生的任何誤解或錯誤解讀概不負責。
\ No newline at end of file
diff --git a/translations/mo/README.md b/translations/mo/README.md
index 52280b58..49b7171d 100644
--- a/translations/mo/README.md
+++ b/translations/mo/README.md
@@ -1,8 +1,8 @@
# Introductie tot Programmeertalen en Tools van het Vak
-Deze les behandelt de basisprincipes van programmeertalen. De onderwerpen die hier aan bod komen, zijn van toepassing op de meeste moderne programmeertalen van vandaag. In het gedeelte 'Tools van het Vak' leer je over nuttige software die je als ontwikkelaar kan helpen.
+Deze les behandelt de basisprincipes van programmeertalen. De onderwerpen die hier aan bod komen, zijn van toepassing op de meeste moderne programmeertalen van vandaag. In de sectie 'Tools van het Vak' leer je over nuttige software die je als ontwikkelaar kan helpen.

> Sketchnote door [Tomomi Imura](https://twitter.com/girlie_mac)
-## Quiz vóór de les
-[Quiz vóór de les](https://forms.office.com/r/dru4TE0U9n?origin=lprLink)
+## Quiz voor de Les
+[Quiz voor de les](https://forms.office.com/r/dru4TE0U9n?origin=lprLink)
## Introductie
@@ -28,23 +28,23 @@ In deze les behandelen we:
> Je kunt deze les volgen op [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/introduction-programming/?WT.mc_id=academic-77807-sagibbon)!
-## Wat is programmeren?
+## Wat is Programmeren?
-Programmeren (ook wel coderen genoemd) is het proces van het schrijven van instructies voor een apparaat, zoals een computer of mobiel apparaat. We schrijven deze instructies met een programmeertaal, die vervolgens door het apparaat wordt geïnterpreteerd. Deze sets van instructies kunnen verschillende namen hebben, zoals *programma*, *computerprogramma*, *applicatie (app)* of *uitvoerbaar bestand*.
+Programmeren (ook wel coderen genoemd) is het proces van het schrijven van instructies voor een apparaat zoals een computer of mobiel apparaat. We schrijven deze instructies met een programmeertaal, die vervolgens door het apparaat wordt geïnterpreteerd. Deze sets van instructies kunnen verschillende namen hebben, zoals *programma*, *computerprogramma*, *applicatie (app)* en *uitvoerbaar bestand*.
-Een *programma* kan alles zijn wat met code is geschreven; websites, games en telefoonapps zijn allemaal programma's. Hoewel het mogelijk is om een programma te maken zonder code te schrijven, wordt de onderliggende logica geïnterpreteerd door het apparaat, en die logica is hoogstwaarschijnlijk met code geschreven. Een programma dat *draait* of *code uitvoert*, voert instructies uit. Het apparaat waarmee je deze les leest, draait een programma om het op je scherm weer te geven.
+Een *programma* kan alles zijn wat met code is geschreven; websites, games en telefoonapps zijn allemaal programma's. Hoewel het mogelijk is om een programma te maken zonder code te schrijven, wordt de onderliggende logica geïnterpreteerd door het apparaat, en die logica is hoogstwaarschijnlijk met code geschreven. Een programma dat *draait* of *uitgevoerd* wordt, voert instructies uit. Het apparaat waarmee je deze les leest, draait een programma om het op je scherm weer te geven.
✅ Doe wat onderzoek: wie wordt beschouwd als de eerste computerprogrammeur ter wereld?
## Programmeertalen
-Programmeertalen stellen ontwikkelaars in staat om instructies voor een apparaat te schrijven. Apparaten begrijpen alleen binaire code (1-en en 0-en), en voor *de meeste* ontwikkelaars is dat geen efficiënte manier van communiceren. Programmeertalen zijn het middel om te communiceren tussen mensen en computers.
+Programmeertalen stellen ontwikkelaars in staat om instructies voor een apparaat te schrijven. Apparaten begrijpen alleen binaire code (1-en en 0-en), en voor *de meeste* ontwikkelaars is dat geen efficiënte manier van communiceren. Programmeertalen zijn het middel voor communicatie tussen mensen en computers.
Programmeertalen hebben verschillende formaten en kunnen verschillende doelen dienen. Bijvoorbeeld, JavaScript wordt voornamelijk gebruikt voor webapplicaties, terwijl Bash voornamelijk wordt gebruikt voor besturingssystemen.
-*Lageniveau-talen* vereisen doorgaans minder stappen dan *hogerniveau-talen* om instructies door een apparaat te laten interpreteren. Wat hogerniveau-talen echter populair maakt, is hun leesbaarheid en ondersteuning. JavaScript wordt beschouwd als een hogerniveau-taal.
+*Lage niveau talen* vereisen doorgaans minder stappen dan *hoge niveau talen* voor een apparaat om instructies te interpreteren. Wat hoge niveau talen echter populair maakt, is hun leesbaarheid en ondersteuning. JavaScript wordt beschouwd als een hoge niveau taal.
-De volgende code laat het verschil zien tussen een hogerniveau-taal met JavaScript en een lageniveau-taal met ARM-assemblycode.
+De volgende code illustreert het verschil tussen een hoge niveau taal met JavaScript en een lage niveau taal met ARM-assemblycode.
```javascript
let number = 10
@@ -85,15 +85,15 @@ back add r0,r1
Geloof het of niet, *ze doen allebei hetzelfde*: het afdrukken van een Fibonacci-reeks tot 10.
-✅ Een Fibonacci-reeks wordt [gedefinieerd](https://en.wikipedia.org/wiki/Fibonacci_number) als een reeks getallen waarbij elk getal de som is van de twee voorgaande getallen, beginnend bij 0 en 1. De eerste 10 getallen in de Fibonacci-reeks zijn 0, 1, 1, 2, 3, 5, 8, 13, 21 en 34.
+✅ Een Fibonacci-reeks wordt [gedefinieerd](https://en.wikipedia.org/wiki/Fibonacci_number) als een reeks getallen waarbij elk getal de som is van de twee voorgaande, beginnend bij 0 en 1. De eerste 10 getallen in de Fibonacci-reeks zijn 0, 1, 1, 2, 3, 5, 8, 13, 21 en 34.
-## Elementen van een programma
+## Componenten van een Programma
Een enkele instructie in een programma wordt een *statement* genoemd en heeft meestal een teken of regelafstand die aangeeft waar de instructie eindigt, of *beëindigt*. Hoe een programma beëindigt, verschilt per taal.
-Statements in een programma kunnen afhankelijk zijn van gegevens die door een gebruiker of elders worden geleverd om instructies uit te voeren. Gegevens kunnen beïnvloeden hoe een programma zich gedraagt, dus programmeertalen hebben een manier om gegevens tijdelijk op te slaan zodat ze later kunnen worden gebruikt. Dit worden *variabelen* genoemd. Variabelen zijn statements die een apparaat instrueren om gegevens in zijn geheugen op te slaan. Variabelen in programma's lijken op variabelen in algebra, waarbij ze een unieke naam hebben en hun waarde in de loop van de tijd kan veranderen.
+Statements in een programma kunnen afhankelijk zijn van gegevens die door een gebruiker of elders worden geleverd om instructies uit te voeren. Gegevens kunnen het gedrag van een programma veranderen, dus programmeertalen hebben een manier om gegevens tijdelijk op te slaan zodat ze later kunnen worden gebruikt. Dit worden *variabelen* genoemd. Variabelen zijn statements die een apparaat instrueren om gegevens in zijn geheugen op te slaan. Variabelen in programma's lijken op variabelen in algebra, waar ze een unieke naam hebben en hun waarde in de loop van de tijd kan veranderen.
-Het kan voorkomen dat sommige statements niet door een apparaat worden uitgevoerd. Dit gebeurt meestal opzettelijk door de ontwikkelaar of per ongeluk wanneer er een onverwachte fout optreedt. Dit soort controle over een applicatie maakt het robuuster en beter onderhoudbaar. Meestal vinden deze veranderingen in controle plaats wanneer aan bepaalde voorwaarden wordt voldaan. Een veelgebruikt statement in moderne programmeertalen om te bepalen hoe een programma wordt uitgevoerd, is het `if..else`-statement.
+Het kan voorkomen dat sommige statements niet door een apparaat worden uitgevoerd. Dit is meestal met opzet door de ontwikkelaar geschreven of per ongeluk wanneer er een onverwachte fout optreedt. Dit soort controle over een applicatie maakt het robuuster en beter onderhoudbaar. Meestal vinden deze wijzigingen in controle plaats wanneer aan bepaalde voorwaarden wordt voldaan. Een veelgebruikt statement in moderne programmering om te bepalen hoe een programma wordt uitgevoerd, is het `if..else` statement.
✅ Je leert meer over dit soort statements in latere lessen.
@@ -103,22 +103,22 @@ Het kan voorkomen dat sommige statements niet door een apparaat worden uitgevoer
> 🎥 Klik op de afbeelding hierboven voor een video over tools
-In dit gedeelte leer je over enkele softwaretools die je erg nuttig kunt vinden als je aan je professionele ontwikkelreis begint.
+In deze sectie leer je over enkele software die je erg nuttig kunt vinden als je aan je professionele ontwikkelreis begint.
Een **ontwikkelomgeving** is een unieke set tools en functies die een ontwikkelaar vaak gebruikt bij het schrijven van software. Sommige van deze tools zijn aangepast aan de specifieke behoeften van een ontwikkelaar en kunnen in de loop van de tijd veranderen als die ontwikkelaar andere prioriteiten krijgt in werk, persoonlijke projecten of bij het gebruik van een andere programmeertaal. Ontwikkelomgevingen zijn net zo uniek als de ontwikkelaars die ze gebruiken.
### Editors
-Een van de belangrijkste tools voor softwareontwikkeling is de editor. Editors zijn de plekken waar je je code schrijft en soms ook uitvoert.
+Een van de belangrijkste tools voor softwareontwikkeling is de editor. Editors zijn waar je je code schrijft en soms ook uitvoert.
-Ontwikkelaars vertrouwen op editors om verschillende redenen:
+Ontwikkelaars vertrouwen op editors om een paar extra redenen:
- *Debuggen* helpt bugs en fouten op te sporen door de code regel voor regel door te lopen. Sommige editors hebben debuggingmogelijkheden; ze kunnen worden aangepast en toegevoegd voor specifieke programmeertalen.
- *Syntax highlighting* voegt kleuren en tekstopmaak toe aan code, waardoor het gemakkelijker te lezen is. De meeste editors staan aangepaste syntax highlighting toe.
- *Extensies en integraties* zijn gespecialiseerde tools voor ontwikkelaars, door ontwikkelaars. Deze tools zijn niet ingebouwd in de basiseditor. Bijvoorbeeld, veel ontwikkelaars documenteren hun code om uit te leggen hoe het werkt. Ze kunnen een spellingscontrole-extensie installeren om typefouten in de documentatie te vinden. De meeste extensies zijn bedoeld voor gebruik binnen een specifieke editor, en de meeste editors hebben een manier om beschikbare extensies te zoeken.
-- *Aanpassing* stelt ontwikkelaars in staat om een unieke ontwikkelomgeving te creëren die aan hun behoeften voldoet. De meeste editors zijn extreem aanpasbaar en stellen ontwikkelaars ook in staat om aangepaste extensies te maken.
+- *Aanpassing* stelt ontwikkelaars in staat om een unieke ontwikkelomgeving te creëren die aan hun behoeften voldoet. De meeste editors zijn extreem aanpasbaar en kunnen ontwikkelaars ook toestaan om aangepaste extensies te maken.
-#### Populaire editors en webontwikkeling-extensies
+#### Populaire Editors en Webontwikkeling Extensies
- [Visual Studio Code](https://code.visualstudio.com/?WT.mc_id=academic-77807-sagibbon)
- [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
@@ -135,11 +135,11 @@ Ontwikkelaars vertrouwen op editors om verschillende redenen:
### Browsers
-Een andere cruciale tool is de browser. Webontwikkelaars vertrouwen op de browser om te zien hoe hun code op het web wordt uitgevoerd. Het wordt ook gebruikt om de visuele elementen van een webpagina weer te geven die in de editor zijn geschreven, zoals HTML.
+Een andere cruciale tool is de browser. Webontwikkelaars vertrouwen op de browser om te zien hoe hun code op het web draait. Het wordt ook gebruikt om de visuele elementen van een webpagina weer te geven die in de editor zijn geschreven, zoals HTML.
-Veel browsers worden geleverd met *ontwikkelaarstools* (DevTools) die een reeks handige functies en informatie bevatten om ontwikkelaars te helpen belangrijke informatie over hun applicatie te verzamelen en vast te leggen. Bijvoorbeeld: Als een webpagina fouten heeft, is het soms nuttig om te weten wanneer ze zijn opgetreden. DevTools in een browser kunnen worden geconfigureerd om deze informatie vast te leggen.
+Veel browsers worden geleverd met *ontwikkelaarstools* (DevTools) die een set handige functies en informatie bevatten om ontwikkelaars te helpen belangrijke informatie over hun applicatie te verzamelen en vast te leggen. Bijvoorbeeld: Als een webpagina fouten heeft, is het soms handig om te weten wanneer ze zijn opgetreden. DevTools in een browser kunnen worden geconfigureerd om deze informatie vast te leggen.
-#### Populaire browsers en DevTools
+#### Populaire Browsers en DevTools
- [Edge](https://docs.microsoft.com/microsoft-edge/devtools-guide-chromium/?WT.mc_id=academic-77807-sagibbon)
- [Chrome](https://developers.google.com/web/tools/chrome-devtools/)
@@ -147,13 +147,13 @@ Veel browsers worden geleverd met *ontwikkelaarstools* (DevTools) die een reeks
### Command Line Tools
-Sommige ontwikkelaars geven de voorkeur aan een minder grafische weergave voor hun dagelijkse taken en vertrouwen op de command line om dit te bereiken. Code schrijven vereist een aanzienlijke hoeveelheid typen, en sommige ontwikkelaars willen hun flow op het toetsenbord niet onderbreken. Ze gebruiken sneltoetsen om te schakelen tussen vensters, aan verschillende bestanden te werken en tools te gebruiken. De meeste taken kunnen met een muis worden uitgevoerd, maar een voordeel van de command line is dat veel kan worden gedaan zonder te schakelen tussen muis en toetsenbord. Een ander voordeel van de command line is dat deze configureerbaar is; je kunt een aangepaste configuratie opslaan, deze later wijzigen en importeren op andere ontwikkelmachines. Omdat ontwikkelomgevingen zo uniek zijn voor elke ontwikkelaar, vermijden sommigen het gebruik van de command line, vertrouwen anderen er volledig op, en geven weer anderen de voorkeur aan een mix van beide.
+Sommige ontwikkelaars geven de voorkeur aan een minder grafische weergave voor hun dagelijkse taken en vertrouwen op de command line om dit te bereiken. Code schrijven vereist een aanzienlijke hoeveelheid typen, en sommige ontwikkelaars willen hun flow op het toetsenbord niet onderbreken. Ze gebruiken sneltoetsen om te wisselen tussen desktopvensters, aan verschillende bestanden te werken en tools te gebruiken. De meeste taken kunnen met een muis worden uitgevoerd, maar een voordeel van de command line is dat veel kan worden gedaan zonder te wisselen tussen muis en toetsenbord. Een ander voordeel van de command line is dat deze configureerbaar is en je een aangepaste configuratie kunt opslaan, later kunt wijzigen en kunt importeren naar andere ontwikkelmachines. Omdat ontwikkelomgevingen zo uniek zijn voor elke ontwikkelaar, zullen sommigen de command line vermijden, anderen vertrouwen er volledig op, en weer anderen geven de voorkeur aan een mix van beide.
-### Populaire opties voor de command line
+### Populaire Command Line Opties
De opties voor de command line verschillen afhankelijk van het besturingssysteem dat je gebruikt.
-*💻 = wordt standaard meegeleverd met het besturingssysteem.*
+*💻 = wordt vooraf geïnstalleerd op het besturingssysteem.*
#### Windows
@@ -174,7 +174,7 @@ De opties voor de command line verschillen afhankelijk van het besturingssysteem
- [KDE Konsole](https://docs.kde.org/trunk5/en/konsole/konsole/index.html)
- [Powershell](https://docs.microsoft.com/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7/?WT.mc_id=academic-77807-sagibbon)
-#### Populaire command line tools
+#### Populaire Command Line Tools
- [Git](https://git-scm.com/) (💻 op de meeste besturingssystemen)
- [NPM](https://www.npmjs.com/)
@@ -182,9 +182,9 @@ De opties voor de command line verschillen afhankelijk van het besturingssysteem
### Documentatie
-Wanneer een ontwikkelaar iets nieuws wil leren, zal hij of zij waarschijnlijk naar documentatie grijpen om te leren hoe het te gebruiken. Ontwikkelaars vertrouwen vaak op documentatie om hen te begeleiden in het correct gebruik van tools en talen, en om diepere kennis te verkrijgen over hoe het werkt.
+Wanneer een ontwikkelaar iets nieuws wil leren, zal hij of zij hoogstwaarschijnlijk naar documentatie grijpen om te leren hoe het te gebruiken. Ontwikkelaars vertrouwen vaak op documentatie om hen te begeleiden in het correct gebruik van tools en talen, en ook om diepere kennis te verkrijgen over hoe het werkt.
-#### Populaire documentatie over webontwikkeling
+#### Populaire Documentatie over Webontwikkeling
- [Mozilla Developer Network (MDN)](https://developer.mozilla.org/docs/Web), van Mozilla, de uitgevers van de [Firefox](https://www.mozilla.org/firefox/) browser
- [Frontend Masters](https://frontendmasters.com/learn/)
@@ -200,8 +200,8 @@ Wanneer een ontwikkelaar iets nieuws wil leren, zal hij of zij waarschijnlijk na
Vergelijk enkele programmeertalen. Wat zijn enkele unieke eigenschappen van JavaScript versus Java? En hoe zit het met COBOL versus Go?
-## Quiz na de les
-[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/2)
+## Quiz na de Les
+[Quiz na de les](https://ff-quizzes.netlify.app/web/)
## Herziening & Zelfstudie
@@ -209,9 +209,9 @@ Bestudeer de verschillende talen die beschikbaar zijn voor de programmeur. Probe
## Opdracht
-[De documentatie lezen](assignment.md)
+[De Documentatie Lezen](assignment.md)
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/1-getting-started-lessons/2-github-basics/README.md b/translations/nl/1-getting-started-lessons/2-github-basics/README.md
index 3bca3cfa..0a3bc239 100644
--- a/translations/nl/1-getting-started-lessons/2-github-basics/README.md
+++ b/translations/nl/1-getting-started-lessons/2-github-basics/README.md
@@ -1,8 +1,8 @@
# Toegankelijke Webpagina's Maken
-
+
> Sketchnote door [Tomomi Imura](https://twitter.com/girlie_mac)
-## Quiz Voorafgaand aan de Les
-[Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/web/quiz/5)
+## Quiz Voor De Les
+[Quiz voor de les](https://ff-quizzes.netlify.app/web/)
> De kracht van het web ligt in zijn universaliteit. Toegang voor iedereen, ongeacht een beperking, is een essentieel aspect.
>
> \- Sir Timothy Berners-Lee, W3C-directeur en uitvinder van het World Wide Web
-Deze quote benadrukt perfect het belang van het maken van toegankelijke websites. Een applicatie die niet door iedereen toegankelijk is, is per definitie uitsluitend. Als webontwikkelaars moeten we altijd toegankelijkheid in gedachten houden. Door hier vanaf het begin op te focussen, zorg je ervoor dat iedereen toegang heeft tot de pagina's die je maakt. In deze les leer je over de tools die je kunnen helpen om ervoor te zorgen dat je webassets toegankelijk zijn en hoe je met toegankelijkheid in gedachten kunt bouwen.
+Deze quote benadrukt perfect het belang van het maken van toegankelijke websites. Een applicatie die niet door iedereen kan worden gebruikt, is per definitie exclusief. Als webontwikkelaars moeten we altijd toegankelijkheid in gedachten houden. Door hier vanaf het begin op te focussen, ben je goed op weg om ervoor te zorgen dat iedereen toegang heeft tot de pagina's die je maakt. In deze les leer je over de tools die je kunnen helpen om ervoor te zorgen dat je webassets toegankelijk zijn en hoe je met toegankelijkheid in gedachten kunt bouwen.
> Je kunt deze les volgen op [Microsoft Learn](https://docs.microsoft.com/learn/modules/web-development-101/accessibility/?WT.mc_id=academic-77807-sagibbon)!
-## Tools om te Gebruiken
+## Tools om te gebruiken
### Schermlezers
Een van de bekendste toegankelijkheidstools zijn schermlezers.
-[Schermlezers](https://en.wikipedia.org/wiki/Screen_reader) worden vaak gebruikt door mensen met een visuele beperking. Net zoals we tijd besteden aan het zorgen dat een browser de informatie correct weergeeft, moeten we er ook voor zorgen dat een schermlezer dit doet.
+[Schermlezers](https://en.wikipedia.org/wiki/Screen_reader) worden vaak gebruikt door mensen met een visuele beperking. Terwijl we tijd besteden aan het zorgen dat een browser de informatie correct weergeeft, moeten we er ook voor zorgen dat een schermlezer dit doet.
-In de basis leest een schermlezer een pagina van boven naar beneden voor. Als je pagina alleen tekst bevat, zal de lezer de informatie op een vergelijkbare manier overbrengen als een browser. Natuurlijk bevatten webpagina's zelden alleen tekst; ze bevatten links, afbeeldingen, kleuren en andere visuele elementen. Er moet aandacht worden besteed aan het correct laten lezen van deze informatie door een schermlezer.
+In de meest eenvoudige vorm leest een schermlezer een pagina van boven naar beneden voor. Als je pagina alleen tekst bevat, zal de lezer de informatie op een vergelijkbare manier overbrengen als een browser. Natuurlijk zijn webpagina's zelden puur tekst; ze bevatten links, afbeeldingen, kleuren en andere visuele componenten. Er moet aandacht worden besteed aan het correct laten lezen van deze informatie door een schermlezer.
-Elke webontwikkelaar zou bekend moeten zijn met een schermlezer. Zoals hierboven benadrukt, is het de client die je gebruikers zullen gebruiken. Net zoals je weet hoe een browser werkt, zou je moeten leren hoe een schermlezer werkt. Gelukkig zijn schermlezers ingebouwd in de meeste besturingssystemen.
+Elke webontwikkelaar zou zich vertrouwd moeten maken met een schermlezer. Zoals hierboven benadrukt, is het de client die je gebruikers zullen gebruiken. Net zoals je bekend bent met hoe een browser werkt, zou je moeten leren hoe een schermlezer werkt. Gelukkig zijn schermlezers ingebouwd in de meeste besturingssystemen.
-Sommige browsers hebben ook ingebouwde tools en extensies die tekst kunnen voorlezen of zelfs enkele basisnavigatiefuncties bieden, zoals [deze toegankelijkheidsgerichte Edge-browsertools](https://support.microsoft.com/help/4000734/microsoft-edge-accessibility-features). Deze zijn ook belangrijke toegankelijkheidstools, maar werken heel anders dan schermlezers en mogen niet worden verward met tools voor het testen van schermlezers.
+Sommige browsers hebben ook ingebouwde tools en extensies die tekst kunnen voorlezen of zelfs enkele basisnavigatiefuncties bieden, zoals [deze toegankelijkheidsgerichte Edge-browsertools](https://support.microsoft.com/help/4000734/microsoft-edge-accessibility-features). Deze zijn ook belangrijke toegankelijkheidstools, maar werken heel anders dan schermlezers en mogen niet worden verward met schermlezer-testtools.
-✅ Probeer een schermlezer en een browsertekstlezer. Op Windows is [Verteller](https://support.microsoft.com/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1/?WT.mc_id=academic-77807-sagibbon) standaard inbegrepen, en [JAWS](https://webaim.org/articles/jaws/) en [NVDA](https://www.nvaccess.org/about-nvda/) kunnen ook worden geïnstalleerd. Op macOS en iOS is [VoiceOver](https://support.apple.com/guide/voiceover/welcome/10) standaard geïnstalleerd.
+✅ Probeer een schermlezer en browsertekstlezer. Op Windows is [Verteller](https://support.microsoft.com/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1/?WT.mc_id=academic-77807-sagibbon) standaard inbegrepen, en [JAWS](https://webaim.org/articles/jaws/) en [NVDA](https://www.nvaccess.org/about-nvda/) kunnen ook worden geïnstalleerd. Op macOS en iOS is [VoiceOver](https://support.apple.com/guide/voiceover/welcome/10) standaard geïnstalleerd.
### Zoomen
-Een andere tool die vaak wordt gebruikt door mensen met een visuele beperking is zoomen. De meest basale vorm van zoomen is statisch zoomen, bediend via `Control + plusteken (+)` of door de schermresolutie te verlagen. Dit type zoom vergroot de hele pagina, dus het gebruik van [responsief ontwerp](https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Responsive_Design) is belangrijk om een goede gebruikerservaring te bieden bij verhoogde zoomniveaus.
+Een andere tool die vaak wordt gebruikt door mensen met een visuele beperking is zoomen. De meest basale vorm van zoomen is statisch zoomen, gecontroleerd via `Control + plusteken (+)` of door de schermresolutie te verlagen. Dit type zoomen zorgt ervoor dat de hele pagina wordt vergroot, dus het gebruik van [responsief ontwerp](https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Responsive_Design) is belangrijk om een goede gebruikerservaring te bieden bij verhoogde zoomniveaus.
-Een ander type zoom maakt gebruik van gespecialiseerde software om een deel van het scherm te vergroten en te pannen, vergelijkbaar met het gebruik van een echte vergrootglas. Op Windows is [Vergrootglas](https://support.microsoft.com/windows/use-magnifier-to-make-things-on-the-screen-easier-to-see-414948ba-8b1c-d3bd-8615-0e5e32204198) ingebouwd, en [ZoomText](https://www.freedomscientific.com/training/zoomtext/getting-started/) is een externe vergrootsoftware met meer functies en een grotere gebruikersbasis. Zowel macOS als iOS hebben ingebouwde vergrootsoftware genaamd [Zoom](https://www.apple.com/accessibility/mac/vision/).
+Een ander type zoomen maakt gebruik van gespecialiseerde software om één gebied van het scherm te vergroten en te pannen, vergelijkbaar met het gebruik van een echte vergrootglas. Op Windows is [Vergrootglas](https://support.microsoft.com/windows/use-magnifier-to-make-things-on-the-screen-easier-to-see-414948ba-8b1c-d3bd-8615-0e5e32204198) ingebouwd, en [ZoomText](https://www.freedomscientific.com/training/zoomtext/getting-started/) is een software van derden met meer functies en een grotere gebruikersbasis. Zowel macOS als iOS hebben ingebouwde vergrootsoftware genaamd [Zoom](https://www.apple.com/accessibility/mac/vision/).
-### Contrastcontrole
+### Contrastcheckers
Kleuren op websites moeten zorgvuldig worden gekozen om te voldoen aan de behoeften van kleurenblinde gebruikers of mensen die moeite hebben met het zien van kleuren met weinig contrast.
-✅ Test een website die je graag gebruikt op kleurgebruik met een browserextensie zoals [WCAG's kleurcontrole](https://microsoftedge.microsoft.com/addons/detail/wcag-color-contrast-check/idahaggnlnekelhgplklhfpchbfdmkjp?hl=en-US&WT.mc_id=academic-77807-sagibbon). Wat leer je?
+✅ Test een website die je graag gebruikt op kleurgebruik met een browserextensie zoals [WCAG's kleurchecker](https://microsoftedge.microsoft.com/addons/detail/wcag-color-contrast-check/idahaggnlnekelhgplklhfpchbfdmkjp?hl=en-US&WT.mc_id=academic-77807-sagibbon). Wat leer je?
### Lighthouse
-In het ontwikkelaarstoolgebied van je browser vind je de Lighthouse-tool. Deze tool is belangrijk om een eerste indruk te krijgen van de toegankelijkheid (en andere analyses) van een website. Hoewel het belangrijk is om niet uitsluitend op Lighthouse te vertrouwen, is een score van 100% een nuttige basis.
+In het ontwikkelaarstoolgebied van je browser vind je de Lighthouse-tool. Deze tool is belangrijk om een eerste indruk te krijgen van de toegankelijkheid (en andere analyses) van een website. Hoewel het belangrijk is om niet uitsluitend op Lighthouse te vertrouwen, is een score van 100% zeer nuttig als basislijn.
✅ Zoek Lighthouse in het ontwikkelaarstoolpaneel van je browser en voer een analyse uit op een willekeurige site. Wat ontdek je?
-## Ontwerpen voor Toegankelijkheid
+## Ontwerpen voor toegankelijkheid
-Toegankelijkheid is een relatief groot onderwerp. Om je te helpen, zijn er tal van bronnen beschikbaar.
+Toegankelijkheid is een relatief groot onderwerp. Om je te helpen zijn er tal van bronnen beschikbaar.
- [Accessible U - Universiteit van Minnesota](https://accessibility.umn.edu/your-role/web-developers)
-Hoewel we niet elk aspect van het maken van toegankelijke sites kunnen behandelen, staan hieronder enkele van de kernprincipes die je wilt implementeren. Een toegankelijke pagina ontwerpen vanaf het begin is **altijd** makkelijker dan een bestaande pagina achteraf toegankelijk maken.
+Hoewel we niet elk aspect van het maken van toegankelijke sites kunnen behandelen, staan hieronder enkele kernprincipes die je wilt implementeren. Een toegankelijke pagina ontwerpen vanaf het begin is **altijd** gemakkelijker dan teruggaan naar een bestaande pagina om deze toegankelijk te maken.
-## Goede Weergaveprincipes
+## Goede weergaveprincipes
-### Kleurenpaletten die veilig zijn voor iedereen
+### Kleurenveilige paletten
-Mensen zien de wereld op verschillende manieren, en dit geldt ook voor kleuren. Bij het kiezen van een kleurenpalet voor je site moet je ervoor zorgen dat het toegankelijk is voor iedereen. Een geweldige [tool voor het genereren van kleurenpaletten is Color Safe](http://colorsafe.co/).
+Mensen zien de wereld op verschillende manieren, en dit geldt ook voor kleuren. Bij het selecteren van een kleurenpalet voor je site moet je ervoor zorgen dat het toegankelijk is voor iedereen. Een geweldige [tool voor het genereren van kleurenpaletten is Color Safe](http://colorsafe.co/).
-✅ Identificeer een website die erg problematisch is in het gebruik van kleuren. Waarom?
+✅ Identificeer een website die zeer problematisch is in het gebruik van kleuren. Waarom?
### Gebruik de juiste HTML
-Met CSS en JavaScript is het mogelijk om elk element eruit te laten zien als elk type controle. `` kan worden gebruikt om een `` te maken, en `` kan een hyperlink worden. Hoewel dit misschien makkelijker te stijlen lijkt, zegt het niets tegen een schermlezer. Gebruik de juiste HTML bij het maken van controles op een pagina. Als je een hyperlink wilt, gebruik dan ``. Het gebruik van de juiste HTML voor de juiste controle wordt Semantische HTML genoemd.
+Met CSS en JavaScript is het mogelijk om elk element eruit te laten zien als elk type controle. `` kan worden gebruikt om een `` te maken, en `` kan een hyperlink worden. Hoewel dit misschien gemakkelijker te stijlen lijkt, geeft het niets door aan een schermlezer. Gebruik de juiste HTML bij het maken van controles op een pagina. Als je een hyperlink wilt, gebruik dan ``. Het gebruik van de juiste HTML voor de juiste controle wordt het gebruik van Semantische HTML genoemd.
-✅ Ga naar een willekeurige website en kijk of de ontwerpers en ontwikkelaars HTML correct gebruiken. Kun je een knop vinden die eigenlijk een link zou moeten zijn? Tip: klik met de rechtermuisknop en kies 'Paginabron weergeven' in je browser om de onderliggende code te bekijken.
+✅ Ga naar een willekeurige website en kijk of de ontwerpers en ontwikkelaars HTML correct gebruiken. Kun je een knop vinden die een link zou moeten zijn? Tip: klik met de rechtermuisknop en kies 'Pagina Bron Bekijken' in je browser om de onderliggende code te bekijken.
### Maak een beschrijvende koppenhiërarchie
-Gebruikers van schermlezers [vertrouwen sterk op koppen](https://webaim.org/projects/screenreadersurvey8/#finding) om informatie te vinden en door een pagina te navigeren. Het schrijven van beschrijvende kopinhoud en het gebruik van semantische koppen-tags zijn belangrijk voor het creëren van een gemakkelijk navigeerbare site voor gebruikers van schermlezers.
+Schermlezergebruikers [vertrouwen sterk op koppen](https://webaim.org/projects/screenreadersurvey8/#finding) om informatie te vinden en door een pagina te navigeren. Beschrijvende koppen schrijven en semantische koppen-tags gebruiken zijn belangrijk voor het maken van een gemakkelijk navigeerbare site voor schermlezergebruikers.
### Gebruik goede visuele aanwijzingen
CSS biedt volledige controle over het uiterlijk van elk element op een pagina. Je kunt tekstvakken maken zonder een omlijning of hyperlinks zonder een onderstreping. Helaas kan het verwijderen van die aanwijzingen het moeilijker maken voor iemand die ervan afhankelijk is om het type controle te herkennen.
-## Het Belang van Linktekst
+## Het belang van linktekst
Hyperlinks zijn essentieel voor het navigeren op het web. Daarom is het belangrijk dat een schermlezer links correct kan lezen, zodat alle gebruikers je site kunnen navigeren.
### Schermlezers en links
-Zoals je zou verwachten, lezen schermlezers linktekst op dezelfde manier als andere tekst op de pagina. Met dit in gedachten lijkt de onderstaande tekst misschien prima.
+Zoals je zou verwachten, lezen schermlezers linktekst op dezelfde manier als andere tekst op de pagina. Met dit in gedachten lijkt de onderstaande tekst misschien perfect acceptabel.
> De kleine pinguïn, ook wel bekend als de feeënpinguïn, is de kleinste pinguïn ter wereld. [Klik hier](https://en.wikipedia.org/wiki/Little_penguin) voor meer informatie.
@@ -101,15 +101,15 @@ Zoals je zou verwachten, lezen schermlezers linktekst op dezelfde manier als and
> **NOTE** Zoals je zo zult lezen, moet je **nooit** links maken die eruitzien zoals hierboven.
-Onthoud dat schermlezers een andere interface zijn dan browsers, met een andere set functies.
+Onthoud dat schermlezers een andere interface zijn dan browsers met een andere set functies.
### Het probleem met het gebruik van de URL
-Schermlezers lezen de tekst. Als een URL in de tekst verschijnt, zal de schermlezer de URL voorlezen. Over het algemeen geeft de URL geen betekenisvolle informatie en kan het irritant klinken. Je hebt dit misschien ervaren als je telefoon ooit een tekstbericht met een URL hardop heeft voorgelezen.
+Schermlezers lezen de tekst. Als een URL in de tekst verschijnt, zal de schermlezer de URL lezen. Over het algemeen geeft de URL geen betekenisvolle informatie en kan het vervelend klinken. Je hebt dit misschien ervaren als je telefoon ooit een tekstbericht met een URL hardop heeft voorgelezen.
### Het probleem met "klik hier"
-Schermlezers kunnen ook alleen de hyperlinks op een pagina lezen, net zoals een ziend persoon een pagina zou scannen op links. Als de linktekst altijd "klik hier" is, hoort de gebruiker alleen "klik hier, klik hier, klik hier, klik hier, klik hier, ..." Alle links zijn nu niet van elkaar te onderscheiden.
+Schermlezers hebben ook de mogelijkheid om alleen de hyperlinks op een pagina te lezen, net zoals een ziende persoon een pagina zou scannen op links. Als de linktekst altijd "klik hier" is, zal de gebruiker alleen "klik hier, klik hier, klik hier, klik hier, klik hier, ..." horen. Alle links zijn nu niet te onderscheiden van elkaar.
### Goede linktekst
@@ -132,11 +132,11 @@ Stel je de volgende pagina voor:
| Widget | [Beschrijving](../../../../1-getting-started-lessons/3-accessibility/') | [Bestellen](../../../../1-getting-started-lessons/3-accessibility/') |
| Super widget | [Beschrijving](../../../../1-getting-started-lessons/3-accessibility/') | [Bestellen](../../../../1-getting-started-lessons/3-accessibility/') |
-In dit voorbeeld is het dupliceren van de tekst van beschrijving en bestellen logisch voor iemand die een browser gebruikt. Maar iemand die een schermlezer gebruikt, zou alleen de woorden *beschrijving* en *bestellen* herhaald horen zonder context.
+In dit voorbeeld lijkt het dupliceren van de tekst van beschrijving en bestellen logisch voor iemand die een browser gebruikt. Echter, iemand die een schermlezer gebruikt, zou alleen de woorden *beschrijving* en *bestellen* herhaald horen zonder context.
Om dit soort scenario's te ondersteunen, ondersteunt HTML een reeks attributen die bekend staan als [Accessible Rich Internet Applications (ARIA)](https://developer.mozilla.org/docs/Web/Accessibility/ARIA). Deze attributen stellen je in staat om extra informatie te geven aan schermlezers.
-> **NOTE**: Zoals bij veel aspecten van HTML, kan de ondersteuning door browsers en schermlezers variëren. De meeste gangbare clients ondersteunen echter ARIA-attributen.
+> **NOTE**: Zoals bij veel aspecten van HTML, kan de ondersteuning door browsers en schermlezers variëren. Echter, de meeste mainstream clients ondersteunen ARIA-attributen.
Je kunt `aria-label` gebruiken om de link te beschrijven wanneer het formaat van de pagina dit niet toestaat. De beschrijving voor widget kan worden ingesteld als
@@ -144,7 +144,7 @@ Je kunt `aria-label` gebruiken om de link te beschrijven wanneer het formaat van
description
```
-✅ Over het algemeen vervangt het gebruik van Semantische markup zoals hierboven beschreven het gebruik van ARIA, maar soms is er geen semantiek equivalent voor verschillende HTML-widgets. Een goed voorbeeld is een Tree. Er is geen HTML-equivalent voor een tree, dus je identificeert het generieke ``-element voor dit element met een juiste rol en aria-waarden. De [MDN-documentatie over ARIA](https://developer.mozilla.org/docs/Web/Accessibility/ARIA) bevat meer nuttige informatie.
+✅ Over het algemeen heeft het gebruik van semantische markup zoals hierboven beschreven de voorkeur boven het gebruik van ARIA, maar soms is er geen semantisch equivalent voor verschillende HTML-widgets. Een goed voorbeeld is een boomstructuur. Er is geen HTML-equivalent voor een boomstructuur, dus je identificeert het generieke `
`-element voor dit onderdeel met een juiste rol en ARIA-waarden. De [MDN-documentatie over ARIA](https://developer.mozilla.org/docs/Web/Accessibility/ARIA) bevat meer nuttige informatie.
```html
File Viewer
@@ -155,20 +155,20 @@ Je kunt `aria-label` gebruiken om de link te beschrijven wanneer het formaat van
## Afbeeldingen
-Het spreekt voor zich dat schermlezers niet automatisch kunnen lezen wat er in een afbeelding staat. Het toegankelijk maken van afbeeldingen kost niet veel werk - dat is waar het `alt`-attribuut voor is. Alle betekenisvolle afbeeldingen moeten een `alt` hebben om te beschrijven wat ze zijn.
+Het spreekt voor zich dat schermlezers niet automatisch kunnen lezen wat er in een afbeelding staat. Het toegankelijk maken van afbeeldingen kost niet veel werk - dat is waar het `alt`-attribuut voor is. Alle betekenisvolle afbeeldingen moeten een `alt` hebben om te beschrijven wat ze zijn.
Afbeeldingen die puur decoratief zijn, moeten hun `alt`-attribuut instellen op een lege string: `alt=""`. Dit voorkomt dat schermlezers onnodig de decoratieve afbeelding aankondigen.
-✅ Zoals je zou verwachten, kunnen zoekmachines ook niet begrijpen wat er in een afbeelding staat. Ze gebruiken ook alt-tekst. Dus nogmaals, ervoor zorgen dat je pagina toegankelijk is, biedt extra voordelen!
+✅ Zoals je zou verwachten, kunnen zoekmachines ook niet begrijpen wat er in een afbeelding staat. Ze gebruiken ook alt-tekst. Dus nogmaals, het zorgen dat je pagina toegankelijk is biedt extra voordelen!
-## Het Toetsenbord
+## Het toetsenbord
-Sommige gebruikers kunnen geen muis of trackpad gebruiken en vertrouwen in plaats daarvan op toetsenbordinteracties om van het ene element naar het andere te tabben. Het is belangrijk dat je website je inhoud in een logische volgorde presenteert, zodat een toetsenbordgebruiker elk interactief element kan bereiken terwijl ze door een document navigeren. Als je je webpagina's bouwt met semantische markup en CSS gebruikt om hun visuele lay-out te stijlen, zou je site navigeerbaar moeten zijn met het toetsenbord, maar het is belangrijk om dit aspect handmatig te testen. Lees meer over [toetsenbordnavigatiestrategieën](https://webaim.org/techniques/keyboard/).
+Sommige gebruikers kunnen geen muis of trackpad gebruiken en vertrouwen in plaats daarvan op toetsenbordinteracties om van het ene element naar het andere te tabben. Het is belangrijk dat je website je inhoud in een logische volgorde presenteert, zodat een toetsenbordgebruiker elk interactief element kan bereiken terwijl ze door een document gaan. Als je je webpagina's bouwt met semantische markup en CSS gebruikt om hun visuele lay-out te stijlen, zou je site toetsenbordnavigeerbaar moeten zijn, maar het is belangrijk om dit aspect handmatig te testen. Leer meer over [toetsenbordnavigatiestrategieën](https://webaim.org/techniques/keyboard/).
✅ Ga naar een willekeurige website en probeer er doorheen te navigeren met alleen je toetsenbord. Wat werkt, wat werkt niet? Waarom?
## Samenvatting
-Een web dat slechts voor sommigen toegankelijk is, is geen echt 'wereldwijd web'. De beste manier om ervoor te zorgen dat de sites die je maakt toegankelijk zijn, is door vanaf het begin toegankelijkheidsrichtlijnen te volgen. Hoewel er extra stappen bij komen kijken, betekent het opnemen van deze vaardigheden in je workflow nu dat alle pagina's die je maakt toegankelijk zullen zijn.
+Een web dat slechts voor sommigen toegankelijk is, is geen echt 'wereldwijd web'. De beste manier om ervoor te zorgen dat de sites die je maakt toegankelijk zijn, is door vanaf het begin toegankelijkheidsbest practices te integreren. Hoewel er extra stappen nodig zijn, betekent het opnemen van deze vaardigheden in je workflow nu dat alle pagina's die je maakt toegankelijk zullen zijn.
---
@@ -220,17 +220,17 @@ Neem deze HTML en herschrijf deze om zo toegankelijk mogelijk te zijn, gegeven d
Semantic Example
-
+
```
-## Quiz Na de Les
-[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/6)
+## Quiz Na De Les
+[Quiz na de les](https://ff-quizzes.netlify.app/web/en/)
-## Herziening & Zelfstudie
-Veel overheden hebben wetten met betrekking tot toegankelijkheidseisen. Lees de toegankelijkheidswetten van jouw eigen land door. Wat wordt er gedekt, en wat niet? Een voorbeeld is [deze overheidswebsite](https://accessibility.blog.gov.uk/).
+## Review & Zelfstudie
+Veel overheden hebben wetten met betrekking tot toegankelijkheidseisen. Lees meer over de toegankelijkheidswetten in jouw eigen land. Wat wordt er gedekt, en wat niet? Een voorbeeld is [deze overheidswebsite](https://accessibility.blog.gov.uk/).
## Opdracht
@@ -241,4 +241,4 @@ Credits: [Turtle Ipsum](https://github.com/Instrument/semantic-html-sample) door
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/2-js-basics/1-data-types/README.md b/translations/nl/2-js-basics/1-data-types/README.md
index 8bfaac8f..3f0b589a 100644
--- a/translations/nl/2-js-basics/1-data-types/README.md
+++ b/translations/nl/2-js-basics/1-data-types/README.md
@@ -1,8 +1,8 @@
# Terrarium Project Deel 2: Introductie tot CSS
-
+
> Sketchnote door [Tomomi Imura](https://twitter.com/girlie_mac)
-## Quiz voorafgaand aan de les
+## Pre-Lecture Quiz
-[Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/web/quiz/17)
+[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/17)
### Introductie
-CSS, oftewel Cascading Style Sheets, lost een belangrijk probleem op in webontwikkeling: hoe zorg je ervoor dat je website er goed uitziet. Het stijlen van je apps maakt ze gebruiksvriendelijker en aantrekkelijker; je kunt CSS ook gebruiken om Responsive Web Design (RWD) te creëren, zodat je apps er goed uitzien, ongeacht de schermgrootte waarop ze worden weergegeven. CSS gaat niet alleen over het mooier maken van je app; de specificatie bevat ook animaties en transformaties die geavanceerde interacties mogelijk maken. De CSS Working Group onderhoudt de huidige CSS-specificaties; je kunt hun werk volgen op de [site van het World Wide Web Consortium](https://www.w3.org/Style/CSS/members).
+CSS, oftewel Cascading Style Sheets, lost een belangrijk probleem op in webontwikkeling: hoe je je website er mooi uit kunt laten zien. Het stylen van je apps maakt ze gebruiksvriendelijker en aantrekkelijker; je kunt CSS ook gebruiken om Responsive Web Design (RWD) te creëren, zodat je apps er goed uitzien, ongeacht het schermformaat waarop ze worden weergegeven. CSS gaat niet alleen over het uiterlijk van je app; de specificatie bevat ook animaties en transformaties die geavanceerde interacties mogelijk maken. De CSS Working Group helpt bij het onderhouden van de huidige CSS-specificaties; je kunt hun werk volgen op de [site van het World Wide Web Consortium](https://www.w3.org/Style/CSS/members).
-> Let op, CSS is een taal die zich blijft ontwikkelen, net als alles op het web, en niet alle browsers ondersteunen de nieuwste delen van de specificatie. Controleer altijd je implementaties door [CanIUse.com](https://caniuse.com) te raadplegen.
+> Let op, CSS is een taal die evolueert, net als alles op het web, en niet alle browsers ondersteunen de nieuwste delen van de specificatie. Controleer je implementaties altijd via [CanIUse.com](https://caniuse.com).
In deze les gaan we stijlen toevoegen aan ons online terrarium en meer leren over verschillende CSS-concepten: de cascade, overerving, het gebruik van selectors, positionering en het bouwen van layouts met CSS. Tijdens dit proces zullen we het terrarium opmaken en het daadwerkelijke terrarium creëren.
### Vereiste
-Je moet de HTML voor je terrarium al hebben gebouwd en klaar hebben om te stijlen.
+Je moet de HTML voor je terrarium al hebben gebouwd en klaar hebben om te stylen.
> Bekijk de video
@@ -45,7 +45,7 @@ Maak in je terrarium-map een nieuw bestand aan genaamd `style.css`. Importeer da
## De Cascade
-Cascading Style Sheets bevatten het idee dat stijlen 'cascaderen', wat betekent dat de toepassing van een stijl wordt geleid door de prioriteit ervan. Stijlen die door een website-auteur zijn ingesteld, hebben voorrang op die van een browser. Stijlen die 'inline' zijn ingesteld, hebben voorrang op die in een extern stijlblad.
+Cascading Style Sheets bevatten het idee dat stijlen 'cascaderen', wat betekent dat de toepassing van een stijl wordt geleid door de prioriteit ervan. Stijlen die door een website-auteur zijn ingesteld, hebben prioriteit boven die van een browser. Inline stijlen hebben prioriteit boven stijlen die in een extern stylesheet zijn ingesteld.
### Taak
@@ -69,11 +69,11 @@ h1 {
## Overerving
-Stijlen worden geërfd van een bovenliggende stijl naar een onderliggende stijl, zodat geneste elementen de stijlen van hun ouders overnemen.
+Stijlen worden geërfd van een voorouderstijl naar een afstammeling, zodat geneste elementen de stijlen van hun ouders overnemen.
### Taak
-Stel het lettertype van de body in op een bepaald lettertype en controleer of een genest element hetzelfde lettertype heeft:
+Stel het lettertype van de body in op een bepaald lettertype en controleer of een genest element hetzelfde lettertype gebruikt:
```CSS
body {
@@ -81,11 +81,11 @@ body {
}
```
-Open de console van je browser in het tabblad 'Elements' en observeer het lettertype van de H1. Het erft zijn lettertype van de body, zoals aangegeven in de browser:
+Open de console van je browser en ga naar het tabblad 'Elements' om het lettertype van de H1 te bekijken. Het erft zijn lettertype van de body, zoals aangegeven in de browser:

-✅ Kun je een geneste stijl een andere eigenschap laten erven?
+✅ Kun je een geneste stijl een andere eigenschap laten overerven?
---
@@ -106,11 +106,11 @@ h1 {
}
```
-Deze manier van het stijlen van een tag geeft je controle over unieke elementen, maar je moet de stijlen van veel planten in je terrarium kunnen beheren. Om dat te doen, moet je gebruik maken van CSS-selectors.
+Deze manier van het stylen van een tag geeft je controle over unieke elementen, maar je moet de stijlen van veel planten in je terrarium beheren. Om dat te doen, moet je gebruik maken van CSS-selectors.
### Id's
-Voeg wat stijl toe om de linker- en rechtercontainers op te maken. Omdat er slechts één linkercontainer en één rechtercontainer is, hebben ze id's gekregen in de markup. Om ze te stijlen, gebruik je `#`:
+Voeg wat stijl toe om de linker- en rechtercontainers op te maken. Omdat er slechts één linkercontainer en één rechtercontainer is, hebben ze id's gekregen in de markup. Om ze te stylen, gebruik je `#`:
```CSS
#left-container {
@@ -134,9 +134,9 @@ Voeg wat stijl toe om de linker- en rechtercontainers op te maken. Omdat er slec
}
```
-Hier heb je deze containers met absolute positionering aan de uiterste linker- en rechterkant van het scherm geplaatst, en percentages gebruikt voor hun breedte zodat ze kunnen schalen voor kleine mobiele schermen.
+Hier heb je deze containers met absolute positionering aan de uiterste linker- en rechterkant van het scherm geplaatst en percentages gebruikt voor hun breedte, zodat ze kunnen schalen voor kleine mobiele schermen.
-✅ Deze code wordt behoorlijk herhaald en is dus niet "DRY" (Don't Repeat Yourself); kun je een betere manier vinden om deze id's te stijlen, misschien met een combinatie van een id en een class? Je zou de markup moeten aanpassen en de CSS moeten refactoren:
+✅ Deze code wordt vaak herhaald en is dus niet "DRY" (Don't Repeat Yourself); kun je een betere manier vinden om deze id's te stylen, misschien met een combinatie van een id en een class? Je zou de markup en de CSS moeten aanpassen:
```html
@@ -144,9 +144,9 @@ Hier heb je deze containers met absolute positionering aan de uiterste linker- e
### Classes
-In het bovenstaande voorbeeld heb je twee unieke elementen op het scherm gestyled. Als je wilt dat stijlen op veel elementen op het scherm worden toegepast, kun je CSS-classes gebruiken. Doe dit om de planten in de linker- en rechtercontainers op te maken.
+In het bovenstaande voorbeeld heb je twee unieke elementen op het scherm gestyled. Als je stijlen wilt toepassen op meerdere elementen op het scherm, kun je CSS-classes gebruiken. Doe dit om de planten in de linker- en rechtercontainers op te maken.
-Merk op dat elke plant in de HTML-markup een combinatie van id's en classes heeft. De id's worden hier gebruikt door de JavaScript die je later zult toevoegen om de plaatsing van de terrariumplanten te manipuleren. De classes daarentegen geven alle planten een bepaalde stijl.
+Merk op dat elke plant in de HTML-markup een combinatie van id's en classes heeft. De id's worden hier gebruikt door de JavaScript die je later toevoegt om de plaatsing van de terrariumplanten te manipuleren. De classes geven echter alle planten een bepaalde stijl.
```html
@@ -171,37 +171,37 @@ Voeg het volgende toe aan je `style.css`-bestand:
}
```
-Opvallend in dit fragment is de mix van relatieve en absolute positionering, wat we in de volgende sectie zullen behandelen. Bekijk hoe de hoogtes worden behandeld met percentages:
+Opvallend in dit fragment is de mix van relatieve en absolute positionering, wat we in de volgende sectie zullen behandelen. Bekijk hoe hoogtes worden behandeld met percentages:
Je stelt de hoogte van de plantenhouder in op 13%, een goed getal om ervoor te zorgen dat alle planten in elke verticale container worden weergegeven zonder dat scrollen nodig is.
-Je stelt de plantenhouder in om naar links te bewegen, zodat de planten meer gecentreerd zijn binnen hun container. De afbeeldingen hebben een grote hoeveelheid transparante achtergrond om ze beter sleepbaar te maken, dus ze moeten naar links worden verschoven om beter op het scherm te passen.
+Je stelt de plantenhouder in om naar links te bewegen, zodat de planten meer gecentreerd zijn binnen hun container. De afbeeldingen hebben een grote hoeveelheid transparante achtergrond om ze beter verplaatsbaar te maken, dus moeten ze naar links worden verschoven om beter op het scherm te passen.
Vervolgens krijgt de plant zelf een maximale breedte van 150%. Dit zorgt ervoor dat deze kleiner wordt als de browser kleiner wordt. Probeer je browser te verkleinen; de planten blijven in hun containers maar schalen naar beneden om te passen.
-Ook opvallend is het gebruik van z-index, waarmee je de relatieve hoogte van een element kunt regelen (zodat de planten bovenop de container zitten en lijken te zitten in het terrarium).
+Ook opvallend is het gebruik van z-index, waarmee de relatieve hoogte van een element wordt geregeld (zodat de planten bovenop de container zitten en in het terrarium lijken te zitten).
✅ Waarom heb je zowel een plantenhouder- als een plant-CSS-selector nodig?
## CSS Positionering
-Het combineren van positioneringseigenschappen (er zijn statische, relatieve, vaste, absolute en plakkerige posities) kan een beetje lastig zijn, maar als het goed wordt gedaan, geeft het je veel controle over de elementen op je pagina's.
+Het combineren van positioneringseigenschappen (er zijn statische, relatieve, vaste, absolute en plakkerige posities) kan een beetje lastig zijn, maar als het goed wordt gedaan, geeft het je goede controle over de elementen op je pagina's.
-Absoluut gepositioneerde elementen worden gepositioneerd ten opzichte van hun dichtstbijzijnde gepositioneerde voorouders, en als die er niet zijn, worden ze gepositioneerd ten opzichte van het documentbody.
+Absoluut gepositioneerde elementen worden gepositioneerd ten opzichte van hun dichtstbijzijnde gepositioneerde voorouders, en als die er niet zijn, worden ze gepositioneerd volgens het documentbody.
Relatief gepositioneerde elementen worden gepositioneerd op basis van de CSS-instructies om hun plaatsing aan te passen ten opzichte van hun oorspronkelijke positie.
-In ons voorbeeld is de `plant-holder` een relatief gepositioneerd element dat zich binnen een absoluut gepositioneerde container bevindt. Het resulterende gedrag is dat de zijbalkcontainers links en rechts worden vastgezet, en de plantenhouder genest is, zichzelf aanpast binnen de zijbalken, en ruimte geeft voor de planten om in een verticale rij te worden geplaatst.
+In ons voorbeeld is de `plant-holder` een relatief gepositioneerd element dat is gepositioneerd binnen een absoluut gepositioneerde container. Het resulterende gedrag is dat de zijbalkcontainers links en rechts worden vastgezet, en de plantenhouder genest is, zichzelf aanpast binnen de zijbalken en ruimte geeft voor de planten om in een verticale rij te worden geplaatst.
-> De `plant` zelf heeft ook absolute positionering, wat nodig is om het sleepbaar te maken, zoals je in de volgende les zult ontdekken.
+> De `plant` zelf heeft ook absolute positionering, wat nodig is om het verplaatsbaar te maken, zoals je in de volgende les zult ontdekken.
✅ Experimenteer met het wisselen van de soorten positionering van de zijcontainers en de plantenhouder. Wat gebeurt er?
## CSS Layouts
-Nu ga je gebruiken wat je hebt geleerd om het terrarium zelf te bouwen, volledig met CSS!
+Nu ga je wat je hebt geleerd gebruiken om het terrarium zelf te bouwen, allemaal met CSS!
-Stijl eerst de `.terrarium` div-kinderen als een afgeronde rechthoek met CSS:
+Stijl eerst de `.terrarium`-div-kinderen als een afgeronde rechthoek met CSS:
```CSS
.jar-walls {
@@ -254,25 +254,25 @@ Let op het gebruik van percentages hier. Als je je browser verkleint, kun je zie
We gebruiken ook `rem` voor de border-radius, een lettertype-relatieve lengte. Lees meer over dit type relatieve meting in de [CSS-specificatie](https://www.w3.org/TR/css-values-3/#font-relative-lengths).
-✅ Probeer de kleuren en de doorzichtigheid van de pot te veranderen in vergelijking met die van de aarde. Wat gebeurt er? Waarom?
+✅ Probeer de kleuren en de doorzichtigheid van de pot en de aarde te veranderen. Wat gebeurt er? Waarom?
---
## 🚀Uitdaging
-Voeg een 'bubbel'-glans toe aan de linkeronderkant van de pot om het er meer uit te laten zien als glas. Je gaat de `.jar-glossy-long` en `.jar-glossy-short` stijlen om eruit te zien als een gereflecteerde glans. Zo zou het eruit zien:
+Voeg een 'bubbel'-glans toe aan de linkeronderkant van de pot om deze er meer als glas uit te laten zien. Je gaat de `.jar-glossy-long` en `.jar-glossy-short` stylen om eruit te zien als een gereflecteerde glans. Zo zou het eruit zien:

-Om de quiz na de les te voltooien, doorloop deze Learn-module: [Stijl je HTML-app met CSS](https://docs.microsoft.com/learn/modules/build-simple-website/4-css-basics/?WT.mc_id=academic-77807-sagibbon)
+Om de post-lecture quiz te voltooien, doorloop deze Learn-module: [Style your HTML app with CSS](https://docs.microsoft.com/learn/modules/build-simple-website/4-css-basics/?WT.mc_id=academic-77807-sagibbon)
-## Quiz na de les
+## Post-Lecture Quiz
-[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/18)
+[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/18)
-## Herziening & Zelfstudie
+## Review & Zelfstudie
-CSS lijkt bedrieglijk eenvoudig, maar er zijn veel uitdagingen bij het proberen een app perfect te stijlen voor alle browsers en schermformaten. CSS-Grid en Flexbox zijn tools die zijn ontwikkeld om het werk iets gestructureerder en betrouwbaarder te maken. Leer over deze tools door [Flexbox Froggy](https://flexboxfroggy.com/) en [Grid Garden](https://codepip.com/games/grid-garden/) te spelen.
+CSS lijkt bedrieglijk eenvoudig, maar er zijn veel uitdagingen bij het proberen een app perfect te stylen voor alle browsers en schermformaten. CSS-Grid en Flexbox zijn tools die zijn ontwikkeld om het werk wat gestructureerder en betrouwbaarder te maken. Leer over deze tools door [Flexbox Froggy](https://flexboxfroggy.com/) en [Grid Garden](https://codepip.com/games/grid-garden/) te spelen.
## Opdracht
@@ -281,4 +281,4 @@ CSS lijkt bedrieglijk eenvoudig, maar er zijn veel uitdagingen bij het proberen
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/3-terrarium/3-intro-to-DOM-and-closures/README.md b/translations/nl/3-terrarium/3-intro-to-DOM-and-closures/README.md
index a48bf246..6d36f779 100644
--- a/translations/nl/3-terrarium/3-intro-to-DOM-and-closures/README.md
+++ b/translations/nl/3-terrarium/3-intro-to-DOM-and-closures/README.md
@@ -1,8 +1,8 @@
# Een spel maken met behulp van events
-## Quiz voor de les
+## Quiz voorafgaand aan de les
-[Quiz voor de les](https://ff-quizzes.netlify.app/web/quiz/21)
+[Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/web/quiz/21)
## Event-driven programmeren
Bij het maken van een browsergebaseerde applicatie bieden we een grafische gebruikersinterface (GUI) aan waarmee de gebruiker kan interageren met wat we hebben gebouwd. De meest gebruikelijke manier om met de browser te interageren is door te klikken en te typen in verschillende elementen. De uitdaging voor ons als ontwikkelaars is dat we niet weten wanneer ze deze acties gaan uitvoeren!
-[Event-driven programmeren](https://en.wikipedia.org/wiki/Event-driven_programming) is de naam voor het type programmeren dat we nodig hebben om onze GUI te maken. Als we deze term een beetje ontleden, zien we dat het kernwoord hier **event** is. [Event](https://www.merriam-webster.com/dictionary/event), volgens Merriam-Webster, wordt gedefinieerd als "iets dat gebeurt". Dit beschrijft onze situatie perfect. We weten dat er iets gaat gebeuren waarvoor we code willen uitvoeren als reactie, maar we weten niet wanneer het zal plaatsvinden.
+[Event-driven programmeren](https://en.wikipedia.org/wiki/Event-driven_programming) is de naam voor het type programmeren dat we moeten gebruiken om onze GUI te maken. Als we deze term een beetje ontleden, zien we dat het kernwoord hier **event** is. [Event](https://www.merriam-webster.com/dictionary/event), volgens Merriam-Webster, wordt gedefinieerd als "iets dat gebeurt". Dit beschrijft onze situatie perfect. We weten dat er iets gaat gebeuren waarvoor we code willen uitvoeren als reactie, maar we weten niet wanneer het zal plaatsvinden.
De manier waarop we een stuk code markeren dat we willen uitvoeren, is door een functie te maken. Als we denken aan [procedureel programmeren](https://en.wikipedia.org/wiki/Procedural_programming), worden functies in een specifieke volgorde aangeroepen. Ditzelfde geldt voor event-driven programmeren. Het verschil zit in **hoe** de functies worden aangeroepen.
-Om events (knopklikken, typen, enz.) te verwerken, registreren we **event listeners**. Een event listener is een functie die luistert naar een event dat plaatsvindt en code uitvoert als reactie. Event listeners kunnen de UI bijwerken, serveraanroepen doen of wat er verder nodig is als reactie op de actie van de gebruiker. We voegen een event listener toe met behulp van [addEventListener](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) en geven een functie op om uit te voeren.
+Om events te verwerken (knopklikken, typen, enz.), registreren we **event listeners**. Een event listener is een functie die luistert naar een event dat plaatsvindt en code uitvoert als reactie. Event listeners kunnen de UI bijwerken, serveraanroepen doen, of wat er ook nodig is als reactie op de actie van de gebruiker. We voegen een event listener toe met behulp van [addEventListener](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) en geven een functie op die moet worden uitgevoerd.
-> **NOTE:** Het is belangrijk om te benadrukken dat er verschillende manieren zijn om event listeners te maken. Je kunt anonieme functies gebruiken of benoemde functies maken. Je kunt verschillende snelkoppelingen gebruiken, zoals het instellen van de `click`-eigenschap of het gebruik van `addEventListener`. In onze oefening gaan we ons richten op `addEventListener` en anonieme functies, omdat dit waarschijnlijk de meest gebruikelijke techniek is die webontwikkelaars gebruiken. Het is ook de meest flexibele, omdat `addEventListener` werkt voor alle events en de eventnaam als parameter kan worden opgegeven.
+> **NOTE:** Het is belangrijk om te benadrukken dat er verschillende manieren zijn om event listeners te maken. Je kunt anonieme functies gebruiken of benoemde functies maken. Je kunt verschillende snelkoppelingen gebruiken, zoals het instellen van de `click`-eigenschap of het gebruik van `addEventListener`. In onze oefening gaan we ons richten op `addEventListener` en anonieme functies, omdat dit waarschijnlijk de meest gebruikte techniek is onder webontwikkelaars. Het is ook de meest flexibele, omdat `addEventListener` werkt voor alle events en de eventnaam als parameter kan worden opgegeven.
### Veelvoorkomende events
-Er zijn [tientallen events](https://developer.mozilla.org/docs/Web/Events) beschikbaar om naar te luisteren bij het maken van een applicatie. Eigenlijk roept alles wat een gebruiker op een pagina doet een event op, wat je veel macht geeft om ervoor te zorgen dat ze de ervaring krijgen die je wenst. Gelukkig heb je meestal maar een klein aantal events nodig. Hier zijn een paar veelvoorkomende (inclusief de twee die we gaan gebruiken bij het maken van ons spel):
+Er zijn [tientallen events](https://developer.mozilla.org/docs/Web/Events) beschikbaar die je kunt gebruiken bij het maken van een applicatie. In principe roept alles wat een gebruiker op een pagina doet een event op, wat je veel mogelijkheden geeft om ervoor te zorgen dat ze de ervaring krijgen die je wenst. Gelukkig heb je meestal maar een klein aantal events nodig. Hier zijn een paar veelvoorkomende (inclusief de twee die we gaan gebruiken bij het maken van ons spel):
- [click](https://developer.mozilla.org/docs/Web/API/Element/click_event): De gebruiker heeft ergens op geklikt, meestal een knop of hyperlink
- [contextmenu](https://developer.mozilla.org/docs/Web/API/Element/contextmenu_event): De gebruiker heeft met de rechtermuisknop geklikt
@@ -36,11 +36,11 @@ Er zijn [tientallen events](https://developer.mozilla.org/docs/Web/Events) besch
## Het spel maken
-We gaan een spel maken om te ontdekken hoe events werken in JavaScript. Ons spel gaat de typevaardigheid van een speler testen, wat een van de meest onderschatte vaardigheden is die alle ontwikkelaars zouden moeten hebben. We zouden allemaal onze typevaardigheid moeten oefenen! De algemene flow van het spel ziet er als volgt uit:
+We gaan een spel maken om te ontdekken hoe events werken in JavaScript. Ons spel zal de typevaardigheid van een speler testen, wat een van de meest onderschatte vaardigheden is die alle ontwikkelaars zouden moeten hebben. We zouden allemaal onze typevaardigheid moeten oefenen! De algemene flow van het spel ziet er als volgt uit:
-- De speler klikt op de startknop en krijgt een quote om te typen
+- De speler klikt op de startknop en krijgt een quote te zien om te typen
- De speler typt de quote zo snel mogelijk in een tekstvak
- - Zodra een woord is voltooid, wordt het volgende woord gemarkeerd
+ - Elke keer dat een woord is voltooid, wordt het volgende woord gemarkeerd
- Als de speler een typefout maakt, wordt het tekstvak rood
- Wanneer de speler de quote voltooit, wordt een succesbericht weergegeven met de verstreken tijd
@@ -48,7 +48,7 @@ Laten we ons spel bouwen en meer leren over events!
### Bestandsstructuur
-We hebben in totaal drie bestanden nodig: **index.html**, **script.js** en **style.css**. Laten we die instellen om het onszelf wat makkelijker te maken.
+We hebben in totaal drie bestanden nodig: **index.html**, **script.js** en **style.css**. Laten we die opzetten om het onszelf wat makkelijker te maken.
- Maak een nieuwe map voor je werk door een console- of terminalvenster te openen en het volgende commando uit te voeren:
@@ -71,7 +71,7 @@ code .
- script.js
- style.css
-## Maak de gebruikersinterface
+## De gebruikersinterface maken
Als we de vereisten bekijken, weten we dat we een aantal elementen nodig hebben op onze HTML-pagina. Dit is een beetje zoals een recept, waarbij we enkele ingrediënten nodig hebben:
@@ -105,7 +105,7 @@ Maak een nieuw bestand genaamd **index.html**. Voeg de volgende HTML toe:
```
-### Start de applicatie
+### De applicatie starten
Het is altijd het beste om iteratief te ontwikkelen om te zien hoe dingen eruitzien. Laten we onze applicatie starten. Er is een geweldige extensie voor Visual Studio Code genaamd [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer&WT.mc_id=academic-77807-sagibbon) die zowel je applicatie lokaal host als de browser ververst elke keer dat je opslaat.
@@ -138,7 +138,7 @@ Maak een nieuw bestand genaamd **style.css** en voeg de volgende syntax toe.
}
```
-✅ Als het gaat om CSS kun je je pagina indelen zoals je wilt. Neem even de tijd om de pagina er aantrekkelijker uit te laten zien:
+✅ Als het gaat om CSS kun je je pagina indelen zoals je wilt. Neem wat tijd om de pagina aantrekkelijker te maken:
- Kies een ander lettertype
- Geef de koppen een kleur
@@ -146,7 +146,7 @@ Maak een nieuw bestand genaamd **style.css** en voeg de volgende syntax toe.
## JavaScript
-Met onze UI gemaakt, is het tijd om onze aandacht te richten op de JavaScript die de logica zal bieden. We gaan dit opsplitsen in een aantal stappen:
+Met onze UI gemaakt, is het tijd om ons te richten op de JavaScript die de logica zal bieden. We gaan dit opsplitsen in een aantal stappen:
- [Maak de constanten](../../../../4-typing-game/typing-game)
- [Event listener om het spel te starten](../../../../4-typing-game/typing-game)
@@ -154,9 +154,9 @@ Met onze UI gemaakt, is het tijd om onze aandacht te richten op de JavaScript di
Maar eerst, maak een nieuw bestand genaamd **script.js**.
-### Maak de constanten
+### Voeg de constanten toe
-We hebben een paar items nodig om ons leven wat makkelijker te maken bij het programmeren. Opnieuw, vergelijkbaar met een recept, hier is wat we nodig hebben:
+We hebben een paar items nodig om het programmeren wat makkelijker te maken. Opnieuw, vergelijkbaar met een recept, hier is wat we nodig hebben:
- Een array met de lijst van alle quotes
- Een lege array om alle woorden van de huidige quote op te slaan
@@ -166,7 +166,7 @@ We hebben een paar items nodig om ons leven wat makkelijker te maken bij het pro
We willen ook verwijzingen naar de UI-elementen:
- Het tekstvak (**typed-value**)
-- De quote-weergave (**quote**)
+- De quoteweergave (**quote**)
- Het bericht (**message**)
```javascript
@@ -196,7 +196,7 @@ const typedValueElement = document.getElementById('typed-value');
> **NOTE:** We kunnen de elementen altijd ophalen in de code door `document.getElementById` te gebruiken. Omdat we regelmatig naar deze elementen gaan verwijzen, vermijden we typefouten met string literals door constanten te gebruiken. Frameworks zoals [Vue.js](https://vuejs.org/) of [React](https://reactjs.org/) kunnen je helpen bij het beter beheren van het centraliseren van je code.
-Neem een minuut om een video te bekijken over het gebruik van `const`, `let` en `var`
+Neem een minuut om een video te bekijken over het gebruik van `const`, `let` en `var`.
[](https://youtube.com/watch?v=JNIXfGiDWM8 "Soorten variabelen")
@@ -206,7 +206,7 @@ Neem een minuut om een video te bekijken over het gebruik van `const`, `let` en
Om het spel te beginnen, klikt de speler op start. Natuurlijk weten we niet wanneer ze op start gaan klikken. Dit is waar een [event listener](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener) van pas komt. Een event listener stelt ons in staat om te luisteren naar iets dat gebeurt (een event) en code uit te voeren als reactie. In ons geval willen we code uitvoeren wanneer de gebruiker op start klikt.
-Wanneer de gebruiker op **start** klikt, moeten we een quote selecteren, de gebruikersinterface instellen en tracking instellen voor het huidige woord en de timing. Hieronder staat de JavaScript die je moet toevoegen; we bespreken het direct na het scriptblok.
+Wanneer de gebruiker op **start** klikt, moeten we een quote selecteren, de gebruikersinterface instellen en de tracking voor het huidige woord en de timing instellen. Hieronder staat de JavaScript die je moet toevoegen; we bespreken het direct na het scriptblok.
```javascript
// at the end of script.js
@@ -300,18 +300,18 @@ typedValueElement.addEventListener('input', () => {
});
```
-Laten we de code opsplitsen! We beginnen met het ophalen van het huidige woord en de waarde die de speler tot nu toe heeft getypt. Vervolgens hebben we waterval-logica, waarbij we controleren of de quote compleet is, het woord compleet is, het woord correct is, of (ten slotte) of er een fout is.
+Laten we de code opsplitsen! We beginnen met het ophalen van het huidige woord en de waarde die de speler tot nu toe heeft getypt. Vervolgens hebben we een watervallogica, waarbij we controleren of de quote compleet is, het woord compleet is, het woord correct is, of (ten slotte) of er een fout is.
-- De quote is compleet, aangegeven door `typedValue` gelijk aan `currentWord` en `wordIndex` gelijk aan één minder dan de `length` van `words`
+- De quote is compleet, aangegeven door `typedValue` gelijk te zijn aan `currentWord` en `wordIndex` gelijk te zijn aan één minder dan de `length` van `words`
- Bereken `elapsedTime` door `startTime` af te trekken van de huidige tijd
- Deel `elapsedTime` door 1.000 om van milliseconden naar seconden te converteren
- Toon een succesbericht
-- Het woord is compleet, aangegeven door `typedValue` eindigend met een spatie (het einde van een woord) en `typedValue` gelijk aan `currentWord`
+- Het woord is compleet, aangegeven door `typedValue` te eindigen met een spatie (het einde van een woord) en `typedValue` gelijk te zijn aan `currentWord`
- Stel `value` op `typedElement` in op `''` om het volgende woord te kunnen typen
- Verhoog `wordIndex` om naar het volgende woord te gaan
- Loop door alle `childNodes` van `quoteElement` om `className` in te stellen op `''` om terug te keren naar de standaardweergave
- Stel `className` van het huidige woord in op `highlight` om het te markeren als het volgende woord om te typen
-- Het woord is momenteel correct getypt (maar niet compleet), aangegeven door `currentWord` beginnend met `typedValue`
+- Het woord is momenteel correct getypt (maar niet compleet), aangegeven door `currentWord` te beginnen met `typedValue`
- Zorg ervoor dat `typedValueElement` wordt weergegeven als standaard door `className` te wissen
- Als we zover zijn gekomen, is er een fout
- Stel `className` op `typedValueElement` in op `error`
@@ -320,7 +320,7 @@ Laten we de code opsplitsen! We beginnen met het ophalen van het huidige woord e
Je bent aan het einde gekomen! De laatste stap is om ervoor te zorgen dat onze applicatie werkt. Probeer het uit! Maak je geen zorgen als er fouten zijn; **alle ontwikkelaars** hebben fouten. Onderzoek de berichten en debug indien nodig.
-Klik op **start** en begin te typen! Het zou een beetje moeten lijken op de animatie die we eerder zagen.
+Klik op **start** en begin met typen! Het zou een beetje moeten lijken op de animatie die we eerder zagen.

@@ -330,18 +330,17 @@ Klik op **start** en begin te typen! Het zou een beetje moeten lijken op de anim
Voeg meer functionaliteit toe
-- Schakel de `input`-event listener uit bij voltooiing en schakel deze opnieuw in wanneer op de knop wordt geklikt
+- Schakel de `input`-event listener uit bij voltooiing en schakel deze opnieuw in wanneer de knop wordt ingedrukt
- Schakel het tekstvak uit wanneer de speler de quote voltooit
- Toon een modaal dialoogvenster met het succesbericht
-- Sla hoge scores op met behulp van [localStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage)
-
+- Sla topscores op met behulp van [localStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage)
## Quiz na de les
[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/22)
## Herhaling & Zelfstudie
-Lees meer over [alle beschikbare events](https://developer.mozilla.org/docs/Web/Events) voor de ontwikkelaar via de webbrowser, en denk na over de scenario's waarin je elk event zou gebruiken.
+Lees meer over [alle beschikbare events](https://developer.mozilla.org/docs/Web/Events) voor ontwikkelaars via de webbrowser, en denk na over de scenario's waarin je elk event zou gebruiken.
## Opdracht
@@ -350,4 +349,4 @@ Lees meer over [alle beschikbare events](https://developer.mozilla.org/docs/Web/
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we ons best doen voor nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertaalservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/5-browser-extension/1-about-browsers/README.md b/translations/nl/5-browser-extension/1-about-browsers/README.md
index 00bf530a..7ab1a023 100644
--- a/translations/nl/5-browser-extension/1-about-browsers/README.md
+++ b/translations/nl/5-browser-extension/1-about-browsers/README.md
@@ -1,111 +1,111 @@
-# Browser Extensie Project Deel 1: Alles over Browsers
+# Browserextensieproject Deel 1: Alles over Browsers

> Sketchnote door [Wassim Chegham](https://dev.to/wassimchegham/ever-wondered-what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser-3dob)
-## Pre-Les Quiz
+## Quiz vóór de les
-[Pre-les quiz](https://ff-quizzes.netlify.app/web/quiz/23)
+[Quiz vóór de les](https://ff-quizzes.netlify.app/web/quiz/23)
### Introductie
-Browserextensies voegen extra functionaliteit toe aan een browser. Maar voordat je er een gaat bouwen, is het handig om eerst wat te leren over hoe browsers werken.
+Browserextensies voegen extra functionaliteit toe aan een browser. Maar voordat je er een bouwt, is het handig om eerst te begrijpen hoe browsers werken.
### Over de browser
-In deze serie lessen leer je hoe je een browserextensie bouwt die werkt op Chrome, Firefox en Edge browsers. In dit deel ontdek je hoe browsers werken en zet je de basis op voor de elementen van de browserextensie.
+In deze lessenreeks leer je hoe je een browserextensie bouwt die werkt in Chrome, Firefox en Edge. In dit deel ontdek je hoe browsers werken en zet je de basis op voor de elementen van de browserextensie.
Maar wat is een browser precies? Het is een softwaretoepassing waarmee een eindgebruiker inhoud van een server kan ophalen en deze kan weergeven op webpagina's.
✅ Een beetje geschiedenis: de eerste browser heette 'WorldWideWeb' en werd in 1990 gemaakt door Sir Timothy Berners-Lee.
-
+
> Enkele vroege browsers, via [Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing)
-Wanneer een gebruiker verbinding maakt met het internet via een URL (Uniform Resource Locator) adres, meestal via Hypertext Transfer Protocol met een `http` of `https` adres, communiceert de browser met een webserver en haalt een webpagina op.
+Wanneer een gebruiker verbinding maakt met het internet via een URL (Uniform Resource Locator)-adres, meestal met behulp van het Hypertext Transfer Protocol via een `http`- of `https`-adres, communiceert de browser met een webserver en haalt een webpagina op.
-Op dat moment toont de rendering engine van de browser de pagina op het apparaat van de gebruiker, zoals een mobiele telefoon, desktop of laptop.
+Op dat moment toont de render-engine van de browser de pagina op het apparaat van de gebruiker, zoals een mobiele telefoon, desktop of laptop.
-Browsers hebben ook de mogelijkheid om inhoud te cachen, zodat deze niet elke keer opnieuw van de server hoeft te worden opgehaald. Ze kunnen de geschiedenis van de browse-activiteit van een gebruiker bijhouden, 'cookies' opslaan, kleine stukjes data die informatie bevatten over de activiteit van een gebruiker, en meer.
+Browsers kunnen ook inhoud cachen, zodat deze niet elke keer opnieuw van de server hoeft te worden opgehaald. Ze kunnen de geschiedenis van het browsegedrag van een gebruiker bijhouden, 'cookies' opslaan (kleine stukjes data met informatie over het gebruikersgedrag), en meer.
-Een belangrijk punt om te onthouden over browsers is dat ze niet allemaal hetzelfde zijn! Elke browser heeft zijn sterke en zwakke punten, en een professionele webontwikkelaar moet begrijpen hoe webpagina's goed kunnen presteren in verschillende browsers. Dit omvat het omgaan met kleine schermen zoals die van een mobiele telefoon, evenals een gebruiker die offline is.
+Een belangrijk punt om te onthouden is dat browsers niet allemaal hetzelfde zijn! Elke browser heeft zijn eigen sterke en zwakke punten, en een professionele webontwikkelaar moet begrijpen hoe webpagina's goed kunnen presteren in verschillende browsers. Dit omvat het omgaan met kleine schermen, zoals die van een mobiele telefoon, en gebruikers die offline zijn.
-Een zeer handige website die je waarschijnlijk zou moeten bookmarken in de browser die je verkiest, is [caniuse.com](https://www.caniuse.com). Wanneer je webpagina's bouwt, is het erg nuttig om de lijsten met ondersteunde technologieën van caniuse te gebruiken, zodat je je gebruikers optimaal kunt ondersteunen.
+Een erg handige website die je waarschijnlijk zou moeten bookmarken in je favoriete browser is [caniuse.com](https://www.caniuse.com). Bij het bouwen van webpagina's is het erg nuttig om de lijsten met ondersteunde technologieën van caniuse te gebruiken, zodat je je gebruikers zo goed mogelijk kunt ondersteunen.
-✅ Hoe kun je zien welke browsers het populairst zijn bij de gebruikers van je website? Controleer je analytics - je kunt verschillende analysetools installeren als onderdeel van je webontwikkelingsproces, en deze zullen je vertellen welke browsers het meest worden gebruikt door de verschillende populaire browsers.
+✅ Hoe kun je zien welke browsers het populairst zijn bij de gebruikers van je website? Controleer je analytics - je kunt verschillende analysetools installeren als onderdeel van je webontwikkelingsproces, en deze laten zien welke browsers het meest worden gebruikt.
## Browserextensies
-Waarom zou je een browserextensie willen bouwen? Het is een handige toevoeging aan je browser wanneer je snel toegang nodig hebt tot taken die je vaak herhaalt. Bijvoorbeeld, als je vaak kleuren moet controleren op verschillende webpagina's waarmee je interacteert, kun je een kleurkiezer-browserextensie installeren. Als je moeite hebt om wachtwoorden te onthouden, kun je een wachtwoordbeheer-browserextensie gebruiken.
+Waarom zou je een browserextensie willen bouwen? Het is een handige toevoeging aan je browser voor snelle toegang tot taken die je vaak herhaalt. Als je bijvoorbeeld vaak kleuren moet controleren op verschillende webpagina's, kun je een kleurkiezer-extensie installeren. Als je moeite hebt om wachtwoorden te onthouden, kun je een wachtwoordbeheer-extensie gebruiken.
-Browserextensies zijn ook leuk om te ontwikkelen. Ze beheren meestal een beperkt aantal taken die ze goed uitvoeren.
+Browserextensies zijn ook leuk om te ontwikkelen. Ze richten zich meestal op een beperkt aantal taken die ze goed uitvoeren.
✅ Wat zijn jouw favoriete browserextensies? Welke taken voeren ze uit?
### Extensies installeren
-Voordat je begint met bouwen, kijk eens naar het proces van het bouwen en implementeren van een browserextensie. Hoewel elke browser enigszins verschilt in hoe ze deze taak beheren, is het proces vergelijkbaar op Chrome en Firefox met dit voorbeeld op Edge:
+Voordat je begint met bouwen, is het handig om te kijken naar het proces van het bouwen en implementeren van een browserextensie. Hoewel elk browserplatform hier iets anders mee omgaat, is het proces op Chrome en Firefox vergelijkbaar met dit voorbeeld op Edge:
-
+
> Opmerking: Zorg ervoor dat je de ontwikkelaarsmodus inschakelt en extensies van andere winkels toestaat.
-In essentie zal het proces zijn:
+In essentie zal het proces er als volgt uitzien:
-- bouw je extensie met `npm run build`
-- navigeer in de browser naar het extensiepaneel via de knop "Instellingen en meer" (het `...` icoon) rechtsboven
-- als het een nieuwe installatie is, kies `load unpacked` om een nieuwe extensie te uploaden vanuit de buildmap (in ons geval is dat `/dist`)
-- of klik op `reload` als je de al geïnstalleerde extensie opnieuw laadt
+- bouw je extensie met `npm run build`
+- navigeer in de browser naar het extensiepaneel via de knop "Instellingen en meer" (het `...`-pictogram) rechtsboven
+- als het een nieuwe installatie betreft, kies `load unpacked` om een nieuwe extensie te uploaden vanuit de buildmap (in ons geval is dat `/dist`)
+- of klik op `reload` als je een al geïnstalleerde extensie opnieuw wilt laden
-✅ Deze instructies hebben betrekking op extensies die je zelf bouwt; om extensies te installeren die zijn uitgebracht in de browserextensiewinkel die bij elke browser hoort, moet je naar die [winkels](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home) navigeren en de extensie van je keuze installeren.
+✅ Deze instructies zijn van toepassing op extensies die je zelf bouwt; om extensies te installeren die beschikbaar zijn in de extensiewinkel van een browser, navigeer je naar die [winkels](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home) en installeer je de extensie van je keuze.
### Aan de slag
-Je gaat een browserextensie bouwen die de CO2-voetafdruk van jouw regio weergeeft, inclusief het energieverbruik en de bron van de energie. De extensie zal een formulier hebben dat een API-sleutel verzamelt zodat je toegang hebt tot de API van CO2 Signal.
+Je gaat een browserextensie bouwen die de CO2-voetafdruk van jouw regio weergeeft, inclusief het energieverbruik en de bron van de energie. De extensie bevat een formulier waarin je een API-sleutel kunt invoeren om toegang te krijgen tot de API van CO2 Signal.
-**Je hebt nodig:**
+**Wat je nodig hebt:**
-- [een API-sleutel](https://www.co2signal.com/); voer je e-mailadres in het vak op deze pagina in en er wordt een sleutel naar je verzonden
-- de [code voor jouw regio](http://api.electricitymap.org/v3/zones) die overeenkomt met de [Electricity Map](https://www.electricitymap.org/map) (in Boston gebruik ik bijvoorbeeld 'US-NEISO').
-- de [startcode](../../../../5-browser-extension/start). Download de `start` map; je zult code in deze map voltooien.
-- [NPM](https://www.npmjs.com) - NPM is een pakketbeheerder; installeer het lokaal en de pakketten die in je `package.json` bestand staan, worden geïnstalleerd voor gebruik door je webasset
+- [een API-sleutel](https://www.co2signal.com/); voer je e-mailadres in op deze pagina en je ontvangt een sleutel
+- de [code voor jouw regio](http://api.electricitymap.org/v3/zones) die overeenkomt met de [Electricity Map](https://www.electricitymap.org/map) (in Boston gebruik ik bijvoorbeeld 'US-NEISO')
+- de [starter code](../../../../5-browser-extension/start). Download de `start`-map; je voltooit de code in deze map
+- [NPM](https://www.npmjs.com) - NPM is een pakketbeheerder; installeer het lokaal en de pakketten die in je `package.json`-bestand staan, worden geïnstalleerd voor gebruik in je webproject
-✅ Leer meer over pakketbeheer in deze [uitstekende Learn module](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon)
+✅ Meer leren over pakketbeheer? Bekijk deze [uitstekende Learn-module](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon)
Neem even de tijd om de codebase te bekijken:
-dist
- -|manifest.json (standaardinstellingen hier)
- -|index.html (front-end HTML markup hier)
- -|background.js (achtergrond JS hier)
- -|main.js (gebouwde JS)
-src
- -|index.js (jouw JS code komt hier)
+dist
+ -|manifest.json (standaardinstellingen hier)
+ -|index.html (HTML-markup hier)
+ -|background.js (achtergrond-JS hier)
+ -|main.js (gebundelde JS)
+src
+ -|index.js (je JS-code komt hier)
-✅ Zodra je je API-sleutel en regiocode bij de hand hebt, sla deze ergens op in een notitie voor toekomstig gebruik.
+✅ Zodra je je API-sleutel en regiocode hebt, sla deze ergens op voor toekomstig gebruik.
### Bouw de HTML voor de extensie
-Deze extensie heeft twee weergaven. Eén om de API-sleutel en regiocode te verzamelen:
+Deze extensie heeft twee weergaven. Eén om de API-sleutel en regiocode in te voeren:
-
+
-En de tweede om het koolstofgebruik van de regio weer te geven:
+En een tweede om het koolstofverbruik van de regio weer te geven:
-
+
Laten we beginnen met het bouwen van de HTML voor het formulier en het stylen met CSS.
-In de `/dist` map bouw je een formulier en een resultaatgebied. In het `index.html` bestand vul je het afgebakende formuliergebied in:
+In de `/dist`-map bouw je een formulier en een resultaatgebied. Vul in het `index.html`-bestand het aangegeven formuliergebied in:
```HTML
@@ -122,8 +122,8 @@ In de `/dist` map bouw je een formulier en een resultaatgebied. In het `index.ht
Submit
-```
-Dit is het formulier waar je opgeslagen informatie wordt ingevoerd en opgeslagen in de lokale opslag.
+```
+Dit is het formulier waarin je opgeslagen informatie wordt ingevoerd en opgeslagen in de lokale opslag.
Maak vervolgens het resultaatgebied; voeg onder de laatste form-tag enkele divs toe:
@@ -139,32 +139,32 @@ Maak vervolgens het resultaatgebied; voeg onder de laatste form-tag enkele divs
Change region
-```
+```
Op dit punt kun je een build proberen. Zorg ervoor dat je de pakketafhankelijkheden van deze extensie installeert:
```
npm install
-```
+```
-Deze opdracht gebruikt npm, de Node Package Manager, om webpack te installeren voor het buildproces van je extensie. Webpack is een bundelaar die code compileert. Je kunt de output van dit proces bekijken door te kijken in `/dist/main.js` - je ziet dat de code is gebundeld.
+Met dit commando gebruik je npm, de Node Package Manager, om webpack te installeren voor het buildproces van je extensie. Webpack is een bundelaar die code compileert. Je kunt het resultaat van dit proces bekijken in `/dist/main.js` - je ziet dat de code is gebundeld.
-Voor nu zou de extensie moeten bouwen en, als je deze in Edge implementeert als extensie, zie je een formulier netjes weergegeven.
+Voor nu zou de extensie moeten bouwen en, als je deze in Edge als extensie implementeert, zie je een net weergegeven formulier.
-Gefeliciteerd, je hebt de eerste stappen gezet richting het bouwen van een browserextensie. In de volgende lessen maak je het functioneler en nuttiger.
+Gefeliciteerd, je hebt de eerste stappen gezet in het bouwen van een browserextensie. In de volgende lessen maak je deze functioneler en nuttiger.
---
## 🚀 Uitdaging
-Bekijk een browserextensiewinkel en installeer er een in je browser. Je kunt de bestanden op interessante manieren onderzoeken. Wat ontdek je?
+Bekijk een extensiewinkel van een browser en installeer een extensie in je browser. Onderzoek de bestanden van de extensie. Wat ontdek je?
-## Post-Les Quiz
+## Quiz na de les
-[Post-les quiz](https://ff-quizzes.netlify.app/web/quiz/24)
+[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/24)
-## Review & Zelfstudie
+## Herhaling & Zelfstudie
-In deze les heb je een beetje geleerd over de geschiedenis van de webbrowser; neem de tijd om meer te leren over hoe de uitvinders van het World Wide Web het gebruik ervan voor ogen hadden door meer te lezen over de geschiedenis. Enkele nuttige sites zijn:
+In deze les heb je iets geleerd over de geschiedenis van de webbrowser; neem de tijd om meer te leren over hoe de uitvinders van het World Wide Web het gebruik ervan voor ogen hadden door meer te lezen over de geschiedenis. Enkele nuttige sites zijn:
[De geschiedenis van webbrowsers](https://www.mozilla.org/firefox/browsers/browser-history/)
@@ -174,9 +174,9 @@ In deze les heb je een beetje geleerd over de geschiedenis van de webbrowser; ne
## Opdracht
-[Restyle je extensie](assignment.md)
+[Restyle je extensie](assignment.md)
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/5-browser-extension/2-forms-browsers-local-storage/README.md b/translations/nl/5-browser-extension/2-forms-browsers-local-storage/README.md
index 546f278b..06b84bc1 100644
--- a/translations/nl/5-browser-extension/2-forms-browsers-local-storage/README.md
+++ b/translations/nl/5-browser-extension/2-forms-browsers-local-storage/README.md
@@ -1,29 +1,29 @@
# Browserextensieproject Deel 2: Een API aanroepen, gebruik maken van Local Storage
-## Quiz vóór de les
+## Pre-Lecture Quiz
-[Quiz vóór de les](https://ff-quizzes.netlify.app/web/quiz/25)
+[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/25)
### Introductie
-In deze les leer je hoe je een API aanroept door het formulier van je browserextensie in te vullen en de resultaten in je extensie weer te geven. Daarnaast leer je hoe je gegevens kunt opslaan in de lokale opslag van je browser voor toekomstig gebruik.
+In deze les leer je hoe je een API kunt aanroepen door het formulier van je browserextensie in te dienen en de resultaten in je extensie weer te geven. Daarnaast leer je hoe je gegevens kunt opslaan in de lokale opslag van je browser voor toekomstig gebruik en referentie.
-✅ Volg de genummerde segmenten in de betreffende bestanden om te weten waar je je code moet plaatsen.
+✅ Volg de genummerde segmenten in de juiste bestanden om te weten waar je je code moet plaatsen.
### Stel de elementen in die je in de extensie wilt manipuleren:
-Tegen deze tijd heb je de HTML gebouwd voor het formulier en de `
` voor de resultaten van je browserextensie. Vanaf nu werk je in het bestand `/src/index.js` en bouw je je extensie stap voor stap verder uit. Raadpleeg de [vorige les](../1-about-browsers/README.md) om je project op te zetten en meer te leren over het bouwproces.
+Op dit punt heb je de HTML gebouwd voor het formulier en de resultaten `
` van je browserextensie. Vanaf nu werk je in het bestand `/src/index.js` en bouw je je extensie stap voor stap. Raadpleeg de [vorige les](../1-about-browsers/README.md) over het opzetten van je project en het bouwproces.
-Werkend in je `index.js`-bestand, begin je met het aanmaken van enkele `const`-variabelen om de waarden vast te houden die horen bij verschillende velden:
+Werkend in je `index.js`-bestand, begin je met het maken van enkele `const`-variabelen om de waarden te bewaren die gekoppeld zijn aan verschillende velden:
```JavaScript
// form fields
@@ -41,11 +41,11 @@ const myregion = document.querySelector('.my-region');
const clearBtn = document.querySelector('.clear-btn');
```
-Al deze velden worden gerefereerd via hun CSS-class, zoals je hebt ingesteld in de HTML in de vorige les.
+Al deze velden worden gerefereerd via hun CSS-klasse, zoals je hebt ingesteld in de HTML in de vorige les.
-### Voeg event listeners toe
+### Voeg listeners toe
-Voeg vervolgens event listeners toe aan het formulier en de resetknop die het formulier reset, zodat er iets gebeurt als een gebruiker het formulier indient of op de resetknop klikt. Voeg ook de aanroep toe om de app te initialiseren onderaan het bestand:
+Voeg vervolgens event listeners toe aan het formulier en de knop om het formulier te wissen, zodat er iets gebeurt wanneer een gebruiker het formulier indient of op die resetknop klikt. Voeg ook de aanroep toe om de app te initialiseren onderaan het bestand:
```JavaScript
form.addEventListener('submit', (e) => handleSubmit(e));
@@ -53,7 +53,7 @@ clearBtn.addEventListener('click', (e) => reset(e));
init();
```
-✅ Let op de verkorte notatie die wordt gebruikt om te luisteren naar een submit- of klikgebeurtenis, en hoe de gebeurtenis wordt doorgegeven aan de functies handleSubmit of reset. Kun je het equivalent van deze verkorte notatie in een langere vorm schrijven? Welke vorm heeft jouw voorkeur?
+✅ Let op de verkorte notatie die wordt gebruikt om te luisteren naar een submit- of klikgebeurtenis, en hoe de gebeurtenis wordt doorgegeven aan de functies handleSubmit of reset. Kun je de equivalente langere versie van deze verkorte notatie schrijven? Welke versie heeft jouw voorkeur?
### Bouw de init()-functie en de reset()-functie uit:
@@ -93,34 +93,34 @@ function reset(e) {
```
-In deze functie zit interessante logica. Als je het doorleest, kun je zien wat er gebeurt?
+In deze functie zit interessante logica. Kun je zien wat er gebeurt?
-- Twee `const` worden ingesteld om te controleren of de gebruiker een APIKey en regiocode heeft opgeslagen in de lokale opslag.
-- Als een van deze null is, wordt het formulier weergegeven door de stijl ervan in te stellen op 'block'.
-- De resultaten, de laadindicator en de resetknop worden verborgen en eventuele foutmeldingen worden leeggemaakt.
-- Als er een sleutel en regio bestaan, wordt een routine gestart om:
+- Twee `const` worden ingesteld om te controleren of de gebruiker een APIKey en regio-code heeft opgeslagen in de lokale opslag.
+- Als een van deze null is, wordt het formulier weergegeven door de stijl ervan te veranderen naar 'block'.
+- Verberg de resultaten, de laadindicator en de clearBtn en stel eventuele foutmeldingen in op een lege string.
+- Als er een sleutel en regio bestaan, start een routine om:
- De API aan te roepen om gegevens over koolstofgebruik op te halen.
- Het resultatengebied te verbergen.
- Het formulier te verbergen.
- De resetknop weer te geven.
-Voordat je verdergaat, is het handig om meer te leren over een belangrijk concept dat beschikbaar is in browsers: [LocalStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage). LocalStorage is een handige manier om strings op te slaan in de browser als een `key-value`-paar. Dit type webopslag kan worden gemanipuleerd met JavaScript om gegevens in de browser te beheren. LocalStorage verloopt niet, terwijl SessionStorage, een ander soort webopslag, wordt gewist wanneer de browser wordt gesloten. De verschillende soorten opslag hebben hun eigen voor- en nadelen.
+Voordat je verder gaat, is het handig om meer te leren over een belangrijk concept dat beschikbaar is in browsers: [LocalStorage](https://developer.mozilla.org/docs/Web/API/Window/localStorage). LocalStorage is een handige manier om strings in de browser op te slaan als een `key-value`-paar. Dit type webopslag kan worden gemanipuleerd door JavaScript om gegevens in de browser te beheren. LocalStorage verloopt niet, terwijl SessionStorage, een ander soort webopslag, wordt gewist wanneer de browser wordt gesloten. De verschillende soorten opslag hebben hun eigen voor- en nadelen.
-> Opmerking - je browserextensie heeft zijn eigen lokale opslag; het hoofdvenster van de browser is een andere instantie en werkt afzonderlijk.
+> Opmerking - je browserextensie heeft zijn eigen lokale opslag; het hoofdvenster van de browser is een andere instantie en gedraagt zich afzonderlijk.
-Je stelt bijvoorbeeld je APIKey in met een stringwaarde, en je kunt zien dat deze is ingesteld in Edge door een webpagina te "inspecteren" (je kunt met de rechtermuisknop op een browser klikken om te inspecteren) en naar het tabblad Toepassingen te gaan om de opslag te bekijken.
+Je stelt je APIKey in met een stringwaarde, bijvoorbeeld, en je kunt zien dat deze is ingesteld in Edge door een webpagina te "inspecteren" (je kunt met de rechtermuisknop op een browser klikken om te inspecteren) en naar het tabblad Toepassingen te gaan om de opslag te bekijken.

-✅ Denk na over situaties waarin je bepaalde gegevens NIET in LocalStorage zou willen opslaan. Over het algemeen is het een slecht idee om API-sleutels in LocalStorage op te slaan! Kun je zien waarom? In ons geval, omdat onze app puur bedoeld is om te leren en niet zal worden gepubliceerd in een app store, gebruiken we deze methode.
+✅ Denk na over situaties waarin je bepaalde gegevens NIET in LocalStorage zou willen opslaan. Over het algemeen is het een slecht idee om API-sleutels in LocalStorage te plaatsen! Kun je zien waarom? In ons geval, omdat onze app puur bedoeld is om te leren en niet zal worden gepubliceerd in een app store, gebruiken we deze methode.
-Merk op dat je de Web API gebruikt om LocalStorage te manipuleren, ofwel met `getItem()`, `setItem()` of `removeItem()`. Het wordt breed ondersteund in browsers.
+Merk op dat je de Web API gebruikt om LocalStorage te manipuleren, door gebruik te maken van `getItem()`, `setItem()`, of `removeItem()`. Het wordt breed ondersteund in browsers.
-Voordat je de functie `displayCarbonUsage()` bouwt die wordt aangeroepen in `init()`, laten we de functionaliteit bouwen om de initiële formulierindiening af te handelen.
+Voordat je de functie `displayCarbonUsage()` bouwt die wordt aangeroepen in `init()`, laten we de functionaliteit bouwen om de initiële formulierinzending te verwerken.
-### Verwerk de formulierindiening
+### Verwerk de formulierinzending
-Maak een functie genaamd `handleSubmit` die een gebeurtenisargument `(e)` accepteert. Stop de gebeurtenis van propagatie (in dit geval willen we voorkomen dat de browser ververst) en roep een nieuwe functie aan, `setUpUser`, waarbij je de argumenten `apiKey.value` en `region.value` doorgeeft. Op deze manier gebruik je de twee waarden die via het initiële formulier worden ingevoerd wanneer de betreffende velden zijn ingevuld.
+Maak een functie genaamd `handleSubmit` die een event-argument `(e)` accepteert. Stop de gebeurtenis van propagatie (in dit geval willen we voorkomen dat de browser ververst) en roep een nieuwe functie aan, `setUpUser`, waarbij je de argumenten `apiKey.value` en `region.value` doorgeeft. Op deze manier gebruik je de twee waarden die via het initiële formulier worden binnengebracht wanneer de juiste velden zijn ingevuld.
```JavaScript
function handleSubmit(e) {
@@ -129,11 +129,11 @@ function handleSubmit(e) {
}
```
-✅ Verfris je geheugen - de HTML die je in de vorige les hebt ingesteld, heeft twee invoervelden waarvan de `values` worden vastgelegd via de `const` die je bovenaan het bestand hebt ingesteld, en ze zijn beide `required`, zodat de browser voorkomt dat gebruikers null-waarden invoeren.
+✅ Verfris je geheugen - de HTML die je in de vorige les hebt ingesteld, heeft twee invoervelden waarvan de `values` worden vastgelegd via de `const` die je bovenaan het bestand hebt ingesteld, en ze zijn beide `required`, zodat de browser gebruikers stopt van het invoeren van null-waarden.
### Stel de gebruiker in
-Ga verder met de functie `setUpUser`, waar je de waarden voor apiKey en regionName in de lokale opslag instelt. Voeg een nieuwe functie toe:
+Ga verder met de functie `setUpUser`, hier stel je de waarden voor lokale opslag in voor apiKey en regionName. Voeg een nieuwe functie toe:
```JavaScript
function setUpUser(apiKey, regionName) {
@@ -147,17 +147,17 @@ function setUpUser(apiKey, regionName) {
}
```
-Deze functie stelt een laadbericht in dat wordt weergegeven terwijl de API wordt aangeroepen. Op dit punt ben je aangekomen bij het maken van de belangrijkste functie van deze browserextensie!
+Deze functie stelt een laadbericht in om te tonen terwijl de API wordt aangeroepen. Op dit punt ben je aangekomen bij het maken van de belangrijkste functie van deze browserextensie!
### Toon koolstofgebruik
-Eindelijk is het tijd om de API aan te roepen!
+Eindelijk is het tijd om de API te raadplegen!
-Voordat we verder gaan, moeten we het hebben over API's. API's, of [Application Programming Interfaces](https://www.webopedia.com/TERM/A/API.html), zijn een cruciaal onderdeel van de gereedschapskist van een webontwikkelaar. Ze bieden standaardmanieren voor programma's om met elkaar te communiceren en te integreren. Als je bijvoorbeeld een website bouwt die een database moet raadplegen, kan iemand een API hebben gemaakt die je kunt gebruiken. Hoewel er veel soorten API's zijn, is een van de populairste een [REST API](https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/).
+Voordat we verder gaan, moeten we APIs bespreken. APIs, of [Application Programming Interfaces](https://www.webopedia.com/TERM/A/API.html), zijn een cruciaal onderdeel van de gereedschapskist van een webontwikkelaar. Ze bieden standaard manieren voor programma's om met elkaar te communiceren en te interfacen. Bijvoorbeeld, als je een website bouwt die een database moet raadplegen, heeft iemand mogelijk een API gemaakt die je kunt gebruiken. Hoewel er veel soorten APIs zijn, is een van de meest populaire een [REST API](https://www.smashingmagazine.com/2018/01/understanding-using-rest-api/).
-✅ De term 'REST' staat voor 'Representational State Transfer' en maakt gebruik van verschillende geconfigureerde URL's om gegevens op te halen. Doe wat onderzoek naar de verschillende soorten API's die beschikbaar zijn voor ontwikkelaars. Welke vorm spreekt jou het meest aan?
+✅ De term 'REST' staat voor 'Representational State Transfer' en maakt gebruik van verschillende geconfigureerde URLs om gegevens op te halen. Doe wat onderzoek naar de verschillende soorten APIs die beschikbaar zijn voor ontwikkelaars. Welk formaat spreekt jou aan?
-Er zijn belangrijke dingen om op te merken over deze functie. Ten eerste, let op het [`async`-sleutelwoord](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function). Door je functies asynchroon te schrijven, zorg je ervoor dat ze wachten op een actie, zoals het retourneren van gegevens, voordat ze doorgaan.
+Er zijn belangrijke dingen om op te merken over deze functie. Ten eerste, let op het [`async` keyword](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function). Door je functies zo te schrijven dat ze asynchroon werken, wachten ze op een actie, zoals het retourneren van gegevens, voordat ze doorgaan.
Hier is een korte video over `async`:
@@ -165,7 +165,7 @@ Hier is een korte video over `async`:
> 🎥 Klik op de afbeelding hierboven voor een video over async/await.
-Maak een nieuwe functie om de C02Signal API aan te roepen:
+Maak een nieuwe functie om de C02Signal API te raadplegen:
```JavaScript
import axios from '../node_modules/axios';
@@ -207,28 +207,28 @@ async function displayCarbonUsage(apiKey, region) {
Dit is een grote functie. Wat gebeurt hier?
-- Volgens best practices gebruik je het `async`-sleutelwoord om deze functie asynchroon te laten werken. De functie bevat een `try/catch`-blok omdat deze een belofte retourneert wanneer de API gegevens retourneert. Omdat je geen controle hebt over de snelheid waarmee de API reageert (of helemaal niet reageert!), moet je met deze onzekerheid omgaan door deze asynchroon aan te roepen.
-- Je roept de co2signal API aan om gegevens van je regio op te halen, met behulp van je API-sleutel. Om die sleutel te gebruiken, moet je een vorm van authenticatie gebruiken in je headerparameters.
+- Volgens best practices gebruik je een `async` keyword om deze functie asynchroon te laten werken. De functie bevat een `try/catch`-blok omdat het een belofte zal retourneren wanneer de API gegevens retourneert. Omdat je geen controle hebt over de snelheid waarmee de API zal reageren (het kan helemaal niet reageren!), moet je deze onzekerheid asynchroon afhandelen.
+- Je raadpleegt de co2signal API om gegevens over je regio op te halen, met behulp van je API-sleutel. Om die sleutel te gebruiken, moet je een soort authenticatie gebruiken in je headerparameters.
- Zodra de API reageert, wijs je verschillende elementen van de responsgegevens toe aan de delen van je scherm die je hebt ingesteld om deze gegevens weer te geven.
- Als er een fout is, of als er geen resultaat is, toon je een foutmelding.
-✅ Het gebruik van asynchrone programmeerpatronen is een andere zeer nuttige vaardigheid in je gereedschapskist. Lees [over de verschillende manieren](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function) waarop je dit type code kunt configureren.
+✅ Het gebruik van asynchrone programmeerpatronen is een andere zeer nuttige tool in je gereedschapskist. Lees [over de verschillende manieren](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function) waarop je dit type code kunt configureren.
-Gefeliciteerd! Als je je extensie bouwt (`npm run build`) en deze vernieuwt in je extensiepaneel, heb je een werkende extensie! Het enige dat nog niet werkt, is het pictogram, en dat los je op in de volgende les.
+Gefeliciteerd! Als je je extensie bouwt (`npm run build`) en deze ververst in je extensiepaneel, heb je een werkende extensie! Het enige dat nog niet werkt, is het pictogram, en dat fix je in de volgende les.
---
## 🚀 Uitdaging
-We hebben in deze lessen verschillende soorten API's besproken. Kies een web-API en onderzoek in detail wat deze biedt. Kijk bijvoorbeeld naar API's die beschikbaar zijn binnen browsers, zoals de [HTML Drag and Drop API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API). Wat maakt volgens jou een goede API?
+We hebben tot nu toe verschillende soorten APIs besproken in deze lessen. Kies een web-API en onderzoek in detail wat deze biedt. Bekijk bijvoorbeeld de APIs die beschikbaar zijn binnen browsers, zoals de [HTML Drag and Drop API](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API). Wat maakt volgens jou een geweldige API?
-## Quiz na de les
+## Post-Lecture Quiz
-[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/26)
+[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/26)
-## Herhaling & Zelfstudie
+## Review & Zelfstudie
-In deze les heb je geleerd over LocalStorage en API's, beide zeer nuttig voor de professionele webontwikkelaar. Kun je bedenken hoe deze twee dingen samenwerken? Denk na over hoe je een website zou ontwerpen die items opslaat om te worden gebruikt door een API.
+Je hebt in deze les geleerd over LocalStorage en APIs, beide zeer nuttig voor de professionele webontwikkelaar. Kun je bedenken hoe deze twee dingen samenwerken? Denk na over hoe je een website zou ontwerpen die items opslaat om te worden gebruikt door een API.
## Opdracht
diff --git a/translations/nl/5-browser-extension/3-background-tasks-and-performance/README.md b/translations/nl/5-browser-extension/3-background-tasks-and-performance/README.md
index 185b9a3d..8fc0a0f7 100644
--- a/translations/nl/5-browser-extension/3-background-tasks-and-performance/README.md
+++ b/translations/nl/5-browser-extension/3-background-tasks-and-performance/README.md
@@ -1,39 +1,39 @@
# Browserextensieproject Deel 3: Leer over Achtergrondtaken en Prestaties
-## Pre-lezing Quiz
+## Quiz vóór de les
-[Pre-lezing quiz](https://ff-quizzes.netlify.app/web/quiz/27)
+[Quiz vóór de les](https://ff-quizzes.netlify.app/web/quiz/27)
### Introductie
-In de laatste twee lessen van dit module heb je geleerd hoe je een formulier en een weergavegebied kunt bouwen voor gegevens die worden opgehaald uit een API. Dit is een zeer standaard manier om een webaanwezigheid te creëren. Je hebt zelfs geleerd hoe je gegevens asynchroon kunt ophalen. Je browserextensie is bijna compleet.
+In de laatste twee lessen van deze module heb je geleerd hoe je een formulier en een weergavegebied kunt maken voor gegevens die worden opgehaald van een API. Dit is een zeer standaard manier om een webaanwezigheid te creëren. Je hebt zelfs geleerd hoe je gegevens asynchroon kunt ophalen. Je browserextensie is bijna klaar.
-Het blijft nog om enkele achtergrondtaken te beheren, waaronder het verversen van de kleur van het pictogram van de extensie. Dit is een goed moment om te bespreken hoe de browser dit soort taken beheert. Laten we nadenken over deze browsertaken in de context van de prestaties van je webassets terwijl je ze bouwt.
+Het enige wat nog moet gebeuren, is het beheren van enkele achtergrondtaken, zoals het verversen van de kleur van het pictogram van de extensie. Dit is een goed moment om te bespreken hoe de browser dit soort taken beheert. Laten we nadenken over deze browsertaken in de context van de prestaties van je webassets terwijl je ze bouwt.
## Basisprincipes van Webprestaties
-> "Websiteprestaties gaan over twee dingen: hoe snel de pagina laadt en hoe snel de code erop wordt uitgevoerd." -- [Zack Grossbart](https://www.smashingmagazine.com/2012/06/javascript-profiling-chrome-developer-tools/)
+> "Websiteprestaties gaan over twee dingen: hoe snel de pagina laadt en hoe snel de code op de pagina wordt uitgevoerd." -- [Zack Grossbart](https://www.smashingmagazine.com/2012/06/javascript-profiling-chrome-developer-tools/)
-Het onderwerp hoe je je websites razendsnel kunt maken op allerlei soorten apparaten, voor allerlei soorten gebruikers, in allerlei situaties, is niet verrassend enorm. Hier zijn enkele punten om in gedachten te houden terwijl je een standaard webproject of een browserextensie bouwt.
+Het onderwerp hoe je je websites razendsnel kunt maken op allerlei apparaten, voor allerlei gebruikers, in allerlei situaties, is niet verrassend enorm uitgebreid. Hier zijn enkele punten om in gedachten te houden terwijl je een standaard webproject of een browserextensie bouwt.
-Het eerste wat je moet doen om ervoor te zorgen dat je site efficiënt werkt, is gegevens verzamelen over de prestaties ervan. De eerste plek om dit te doen is in de ontwikkelaarstools van je webbrowser. In Edge kun je de knop "Instellingen en meer" selecteren (het pictogram met drie stippen rechtsboven in de browser), vervolgens navigeren naar Meer Hulpmiddelen > Ontwikkelaarstools en het tabblad Prestaties openen. Je kunt ook de sneltoetsen `Ctrl` + `Shift` + `I` op Windows of `Option` + `Command` + `I` op Mac gebruiken om ontwikkelaarstools te openen.
+Het eerste wat je moet doen om ervoor te zorgen dat je site efficiënt werkt, is gegevens verzamelen over de prestaties. De eerste plek om dit te doen is in de ontwikkelaarstools van je webbrowser. In Edge kun je de knop "Instellingen en meer" selecteren (het pictogram met de drie stippen rechtsboven in de browser), vervolgens naar Meer Hulpmiddelen > Ontwikkelaarstools navigeren en het tabblad Prestaties openen. Je kunt ook de sneltoetsen `Ctrl` + `Shift` + `I` op Windows of `Option` + `Command` + `I` op Mac gebruiken om de ontwikkelaarstools te openen.
-Het tabblad Prestaties bevat een Profiling-tool. Open een website (probeer bijvoorbeeld [https://www.microsoft.com](https://www.microsoft.com/?WT.mc_id=academic-77807-sagibbon)) en klik op de knop 'Record', ververs vervolgens de site. Stop de opname op elk moment en je kunt de routines zien die worden gegenereerd om de site te 'scripten', 'renderen' en 'schilderen':
+Het tabblad Prestaties bevat een Profileringstool. Open een website (bijvoorbeeld [https://www.microsoft.com](https://www.microsoft.com/?WT.mc_id=academic-77807-sagibbon)) en klik op de knop 'Opnemen', ververs vervolgens de site. Stop de opname op elk moment en je kunt de routines zien die worden gegenereerd om de site te 'scripten', 'renderen' en 'tekenen':

-✅ Bezoek de [Microsoft Documentatie](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) over het Prestaties-paneel in Edge
+✅ Bezoek de [Microsoft-documentatie](https://docs.microsoft.com/microsoft-edge/devtools-guide/performance/?WT.mc_id=academic-77807-sagibbon) over het tabblad Prestaties in Edge.
-> Tip: om een nauwkeurige meting van de opstarttijd van je website te krijgen, wis je de cache van je browser
+> Tip: om een nauwkeurige meting van de opstarttijd van je website te krijgen, wis je de cache van je browser.
Selecteer elementen van de profiel-tijdlijn om in te zoomen op gebeurtenissen die plaatsvinden terwijl je pagina laadt.
@@ -41,33 +41,33 @@ Krijg een momentopname van de prestaties van je pagina door een deel van de prof

-Controleer het Gebeurtenislogpaneel om te zien of een gebeurtenis langer dan 15 ms duurde:
+Controleer het gebeurtenislogboekpaneel om te zien of een gebeurtenis langer dan 15 ms duurde:

-✅ Leer je profiler kennen! Open de ontwikkelaarstools op deze site en kijk of er knelpunten zijn. Wat is het langzaamst ladende asset? Het snelst?
+✅ Maak kennis met je profiler! Open de ontwikkelaarstools op deze site en kijk of er knelpunten zijn. Wat is het langzaamst ladende asset? Het snelst?
-## Profiling-controles
+## Profileringscontroles
-Over het algemeen zijn er enkele "probleemgebieden" waar elke webontwikkelaar op moet letten bij het bouwen van een site om nare verrassingen te voorkomen wanneer het tijd is om naar productie te gaan.
+Over het algemeen zijn er enkele "probleemgebieden" waar elke webontwikkelaar op moet letten bij het bouwen van een site om vervelende verrassingen te voorkomen wanneer het tijd is om naar productie te gaan.
-**Assetgroottes**: Het web is de afgelopen jaren 'zwaarder' en dus langzamer geworden. Een deel van dit gewicht heeft te maken met het gebruik van afbeeldingen.
+**Assetgroottes**: Het web is de afgelopen jaren 'zwaarder' en daardoor trager geworden. Een deel van dit gewicht heeft te maken met het gebruik van afbeeldingen.
-✅ Bekijk het [Internet Archief](https://httparchive.org/reports/page-weight) voor een historisch overzicht van paginagewicht en meer.
+✅ Bekijk het [Internetarchief](https://httparchive.org/reports/page-weight) voor een historisch overzicht van paginagewicht en meer.
-Een goede praktijk is ervoor te zorgen dat je afbeeldingen zijn geoptimaliseerd en worden geleverd op de juiste grootte en resolutie voor je gebruikers.
+Een goede praktijk is ervoor te zorgen dat je afbeeldingen zijn geoptimaliseerd en worden geleverd in het juiste formaat en de juiste resolutie voor je gebruikers.
-**DOM-traversals**: De browser moet zijn Document Object Model bouwen op basis van de code die je schrijft, dus het is in het belang van goede pagina-prestaties om je tags minimaal te houden, alleen te gebruiken en te stylen wat de pagina nodig heeft. Tot dit punt kan overtollige CSS die aan een pagina is gekoppeld worden geoptimaliseerd; stijlen die alleen op één pagina hoeven te worden gebruikt, hoeven bijvoorbeeld niet te worden opgenomen in het hoofdstijlblad.
+**DOM-traversals**: De browser moet zijn Document Object Model bouwen op basis van de code die je schrijft, dus het is in het belang van goede paginaprestaties om je tags minimaal te houden en alleen te gebruiken en te stylen wat de pagina nodig heeft. In dit opzicht kan overtollige CSS die aan een pagina is gekoppeld worden geoptimaliseerd; stijlen die alleen op één pagina nodig zijn, hoeven bijvoorbeeld niet in het hoofdstijlblad te worden opgenomen.
-**JavaScript**: Elke JavaScript-ontwikkelaar moet letten op 'render-blocking' scripts die moeten worden geladen voordat de rest van de DOM kan worden doorlopen en naar de browser kan worden geschilderd. Overweeg het gebruik van `defer` met je inline scripts (zoals gedaan in het Terrarium-module).
+**JavaScript**: Elke JavaScript-ontwikkelaar moet letten op 'render-blocking'-scripts die moeten worden geladen voordat de rest van de DOM kan worden doorlopen en naar de browser kan worden getekend. Overweeg het gebruik van `defer` met je inline scripts (zoals gedaan in de Terrarium-module).
-✅ Probeer enkele sites op een [Site Speed Test website](https://www.webpagetest.org/) om meer te leren over de gebruikelijke controles die worden uitgevoerd om de prestaties van een site te bepalen.
+✅ Probeer enkele sites op een [Site Speed Test-website](https://www.webpagetest.org/) om meer te leren over de gebruikelijke controles die worden uitgevoerd om de prestaties van een site te bepalen.
Nu je een idee hebt van hoe de browser de assets rendert die je naar hem stuurt, laten we kijken naar de laatste paar dingen die je moet doen om je extensie te voltooien:
### Maak een functie om kleur te berekenen
-Werkend in `/src/index.js`, voeg een functie genaamd `calculateColor()` toe na de reeks `const`-variabelen die je hebt ingesteld om toegang te krijgen tot de DOM:
+Werk in `/src/index.js` en voeg een functie genaamd `calculateColor()` toe na de reeks `const`-variabelen die je hebt ingesteld om toegang te krijgen tot de DOM:
```JavaScript
function calculateColor(value) {
@@ -88,17 +88,17 @@ function calculateColor(value) {
}
```
-Wat gebeurt hier? Je geeft een waarde door (de koolstofintensiteit) van de API-aanroep die je in de laatste les hebt voltooid, en vervolgens bereken je hoe dicht de waarde bij de index in de kleurenarray ligt. Vervolgens stuur je die dichtstbijzijnde kleurwaarde naar de chrome runtime.
+Wat gebeurt hier? Je geeft een waarde door (de koolstofintensiteit) van de API-aanroep die je in de vorige les hebt voltooid, en vervolgens bereken je hoe dicht de waarde bij de index in de kleurenarray ligt. Vervolgens stuur je die dichtstbijzijnde kleurwaarde naar de chrome runtime.
De chrome.runtime heeft [een API](https://developer.chrome.com/extensions/runtime) die allerlei achtergrondtaken afhandelt, en je extensie maakt hier gebruik van:
> "Gebruik de chrome.runtime API om de achtergrondpagina op te halen, details over het manifest te retourneren en te luisteren naar en te reageren op gebeurtenissen in de levenscyclus van de app of extensie. Je kunt deze API ook gebruiken om het relatieve pad van URL's om te zetten naar volledig gekwalificeerde URL's."
-✅ Als je deze browserextensie voor Edge ontwikkelt, kan het je verrassen dat je een chrome API gebruikt. De nieuwere Edge-browserversies draaien op de Chromium-browserengine, dus je kunt deze tools gebruiken.
+✅ Als je deze browserextensie ontwikkelt voor Edge, kan het je verrassen dat je een chrome API gebruikt. De nieuwere Edge-browserversies draaien op de Chromium-browserengine, dus je kunt deze tools gebruiken.
-> Let op, als je een browserextensie wilt profileren, start je de ontwikkelaarstools vanuit de extensie zelf, aangezien dit een aparte browserinstantie is.
+> Opmerking: als je een browserextensie wilt profileren, start je de ontwikkelaarstools vanuit de extensie zelf, omdat deze zijn eigen aparte browserinstantie is.
-### Stel een standaard pictogramkleur in
+### Stel een standaardkleur voor het pictogram in
Stel nu in de `init()`-functie het pictogram in op een generieke groene kleur door opnieuw de `updateIcon`-actie van chrome aan te roepen:
@@ -120,7 +120,7 @@ Roep vervolgens de functie die je zojuist hebt gemaakt aan door deze toe te voeg
calculateColor(CO2);
```
-En tot slot, in `/dist/background.js`, voeg de listener toe voor deze achtergrondactie-oproepen:
+En voeg ten slotte in `/dist/background.js` de luisteraar toe voor deze achtergrondactie-aanroepen:
```JavaScript
chrome.runtime.onMessage.addListener(function (msg, sender, sendResponse) {
@@ -142,7 +142,7 @@ function drawIcon(value) {
}
```
-In deze code voeg je een listener toe voor alle berichten die naar de backend-taakbeheerder worden verzonden. Als het 'updateIcon' wordt genoemd, wordt de volgende code uitgevoerd om een pictogram van de juiste kleur te tekenen met behulp van de Canvas API.
+In deze code voeg je een luisteraar toe voor alle berichten die naar de backend-taakbeheerder worden gestuurd. Als het 'updateIcon' wordt genoemd, wordt de volgende code uitgevoerd om een pictogram van de juiste kleur te tekenen met behulp van de Canvas API.
✅ Je leert meer over de Canvas API in de [Space Game-lessen](../../6-space-game/2-drawing-to-canvas/README.md).
@@ -154,17 +154,17 @@ Gefeliciteerd, je hebt een nuttige browserextensie gebouwd en meer geleerd over
## 🚀 Uitdaging
-Onderzoek enkele open source websites die al lang bestaan, en kijk op basis van hun GitHub-geschiedenis of je kunt bepalen hoe ze in de loop der jaren zijn geoptimaliseerd voor prestaties, indien überhaupt. Wat is het meest voorkomende pijnpunt?
+Onderzoek enkele open source-websites die al lang bestaan en kijk op basis van hun GitHub-geschiedenis of je kunt bepalen hoe ze in de loop der jaren zijn geoptimaliseerd voor prestaties, als dat al is gebeurd. Wat is het meest voorkomende pijnpunt?
-## Post-lezing Quiz
+## Quiz na de les
-[Post-lezing quiz](https://ff-quizzes.netlify.app/web/quiz/28)
+[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/28)
-## Review & Zelfstudie
+## Herziening & Zelfstudie
-Overweeg je aan te melden voor een [prestaties-nieuwsbrief](https://perf.email/)
+Overweeg je aan te melden voor een [prestatie-nieuwsbrief](https://perf.email/).
-Onderzoek enkele manieren waarop browsers webprestaties meten door de prestatietabbladen in hun webtools te bekijken. Vind je grote verschillen?
+Onderzoek enkele manieren waarop browsers webprestaties meten door de prestatietabbladen in hun webtools te bekijken. Zie je grote verschillen?
## Opdracht
@@ -173,4 +173,4 @@ Onderzoek enkele manieren waarop browsers webprestaties meten door de prestatiet
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/6-space-game/1-introduction/README.md b/translations/nl/6-space-game/1-introduction/README.md
index 6c184c93..8617e56f 100644
--- a/translations/nl/6-space-game/1-introduction/README.md
+++ b/translations/nl/6-space-game/1-introduction/README.md
@@ -1,8 +1,8 @@
# Bouw een Ruimtespel Deel 2: Teken Held en Monsters op Canvas
-## Pre-Lecture Quiz
+## Pre-Les Quiz
-[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/31)
+[Pre-les quiz](https://ff-quizzes.netlify.app/web/quiz/31)
## Het Canvas
@@ -35,14 +35,14 @@ Hierboven stellen we de `id`, `width` en `height` in.
Het canvas gebruikt een cartesiaans coördinatensysteem om dingen te tekenen. Het gebruikt dus een x-as en y-as om uit te drukken waar iets zich bevindt. De locatie `0,0` is de positie linksboven en rechtsonder is wat je hebt ingesteld als de BREEDTE en HOOGTE van het canvas.
-
+
> Afbeelding van [MDN](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes)
Om op het canvas-element te tekenen, moet je de volgende stappen doorlopen:
-1. **Verkrijg een referentie** naar het Canvas-element.
-2. **Verkrijg een referentie** naar het Context-element dat op het canvas-element zit.
-3. **Voer een tekenoperatie uit** met behulp van het context-element.
+1. **Verkrijg een referentie** naar het Canvas-element.
+1. **Verkrijg een referentie** naar het Context-element dat op het canvas-element zit.
+1. **Voer een tekenoperatie uit** met behulp van het context-element.
De code voor bovenstaande stappen ziet er meestal zo uit:
@@ -65,15 +65,15 @@ ctx.fillRect(0,0, 200, 200) // x,y,width, height
Je kunt allerlei dingen tekenen met de Canvas API, zoals:
-- **Geometrische vormen**, we hebben al laten zien hoe je een rechthoek tekent, maar er is nog veel meer dat je kunt tekenen.
-- **Tekst**, je kunt tekst tekenen met elk gewenst lettertype en kleur.
-- **Afbeeldingen**, je kunt een afbeelding tekenen op basis van een afbeeldingsbestand zoals een .jpg of .png.
+- **Geometrische vormen**, we hebben al laten zien hoe je een rechthoek tekent, maar er is nog veel meer dat je kunt tekenen.
+- **Tekst**, je kunt tekst tekenen met elk gewenst lettertype en kleur.
+- **Afbeeldingen**, je kunt een afbeelding tekenen op basis van een afbeeldingsbestand zoals een .jpg of .png.
-✅ Probeer het! Je weet hoe je een rechthoek tekent, kun je een cirkel tekenen op een pagina? Bekijk enkele interessante Canvas-tekeningen op CodePen. Hier is een [bijzonder indrukwekkend voorbeeld](https://codepen.io/dissimulate/pen/KrAwx).
+✅ Probeer het! Je weet hoe je een rechthoek tekent, kun je een cirkel op een pagina tekenen? Bekijk enkele interessante Canvas-tekeningen op CodePen. Hier is een [bijzonder indrukwekkend voorbeeld](https://codepen.io/dissimulate/pen/KrAwx).
## Een afbeeldingsbestand laden en tekenen
-Je laadt een afbeeldingsbestand door een `Image`-object te maken en de `src`-eigenschap in te stellen. Vervolgens luister je naar het `load`-event om te weten wanneer het klaar is om te worden gebruikt. De code ziet er als volgt uit:
+Je laadt een afbeeldingsbestand door een `Image`-object te maken en de `src`-eigenschap in te stellen. Vervolgens luister je naar het `load`-event om te weten wanneer het klaar is om te worden gebruikt. De code ziet er zo uit:
### Bestand laden
@@ -110,7 +110,7 @@ async function run() {
```
-Om spelassets op een scherm te tekenen, zou je code er als volgt uitzien:
+Om spelassets op een scherm te tekenen, zou je code er zo uitzien:
```javascript
async function run() {
@@ -128,13 +128,13 @@ async function run() {
### Wat te bouwen
-Je gaat een webpagina bouwen met een Canvas-element. Het moet een zwart scherm renderen van `1024*768`. We hebben je twee afbeeldingen gegeven:
+Je gaat een webpagina bouwen met een Canvas-element. Het moet een zwart scherm van `1024*768` weergeven. We hebben je twee afbeeldingen gegeven:
-- Heldenschip
+- Heldenschip

-- 5*5 monster
+- 5*5 monster

@@ -168,14 +168,14 @@ Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open
Voeg de benodigde code toe aan `your-work/app.js` om het onderstaande op te lossen:
-1. **Teken** een canvas met zwarte achtergrond
- > tip: voeg twee regels toe onder de juiste TODO in `/app.js`, waarbij je het `ctx`-element instelt op zwart en de boven/links-coördinaten op 0,0 en de hoogte en breedte gelijk aan die van het canvas.
-2. **Laad** texturen
- > tip: voeg de speler- en vijandafbeeldingen toe met behulp van `await loadTexture` en geef het afbeeldingspad door. Je ziet ze nog niet op het scherm!
-3. **Teken** de held in het midden van het scherm in de onderste helft
- > tip: gebruik de `drawImage` API om heroImg op het scherm te tekenen, waarbij je `canvas.width / 2 - 45` en `canvas.height - canvas.height / 4)` instelt.
-4. **Teken** 5*5 monsters
- > tip: Nu kun je de code om vijanden op het scherm te tekenen deblokkeren. Ga vervolgens naar de functie `createEnemies` en bouw deze uit.
+1. **Teken** een canvas met zwarte achtergrond
+ > tip: voeg twee regels toe onder de juiste TODO in `/app.js`, waarbij je het `ctx`-element instelt op zwart en de boven/links-coördinaten op 0,0 en de hoogte en breedte gelijk aan die van het canvas.
+2. **Laad** texturen
+ > tip: voeg de speler- en vijandafbeeldingen toe met behulp van `await loadTexture` en geef het afbeeldingspad door. Je zult ze nog niet op het scherm zien!
+3. **Teken** de held in het midden van het scherm in de onderste helft
+ > tip: gebruik de `drawImage` API om heroImg op het scherm te tekenen, waarbij je `canvas.width / 2 - 45` en `canvas.height - canvas.height / 4)` instelt.
+4. **Teken** 5*5 monsters
+ > tip: Nu kun je de code om vijanden op het scherm te tekenen deblokkeren. Ga vervolgens naar de functie `createEnemies` en bouw deze uit.
Stel eerst enkele constanten in:
@@ -198,7 +198,7 @@ Voeg de benodigde code toe aan `your-work/app.js` om het onderstaande op te loss
## Resultaat
-Het eindresultaat zou er als volgt uit moeten zien:
+Het eindresultaat zou er zo uit moeten zien:

@@ -210,11 +210,11 @@ Probeer het eerst zelf op te lossen, maar als je vastloopt, bekijk dan een [oplo
## 🚀 Uitdaging
-Je hebt geleerd over tekenen met de 2D-georiënteerde Canvas API; bekijk de [WebGL API](https://developer.mozilla.org/docs/Web/API/WebGL_API) en probeer een 3D-object te tekenen.
+Je hebt geleerd over tekenen met de 2D-gerichte Canvas API; bekijk de [WebGL API](https://developer.mozilla.org/docs/Web/API/WebGL_API) en probeer een 3D-object te tekenen.
-## Post-Lecture Quiz
+## Post-Les Quiz
-[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/32)
+[Post-les quiz](https://ff-quizzes.netlify.app/web/quiz/32)
## Review & Zelfstudie
@@ -227,4 +227,4 @@ Leer meer over de Canvas API door [erover te lezen](https://developer.mozilla.or
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/6-space-game/3-moving-elements-around/README.md b/translations/nl/6-space-game/3-moving-elements-around/README.md
index 99bd8bd5..97211904 100644
--- a/translations/nl/6-space-game/3-moving-elements-around/README.md
+++ b/translations/nl/6-space-game/3-moving-elements-around/README.md
@@ -1,32 +1,32 @@
# Bouw een Ruimtespel Deel 3: Beweging Toevoegen
-## Quiz Voorafgaand aan de Les
+## Quiz voor de les
-[Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/web/quiz/33)
+[Quiz voor de les](https://ff-quizzes.netlify.app/web/quiz/33)
-Games worden pas echt leuk als er aliens over het scherm bewegen! In dit spel maken we gebruik van twee soorten bewegingen:
+Spellen worden pas echt leuk wanneer er aliens rondrennen op het scherm! In dit spel maken we gebruik van twee soorten bewegingen:
-- **Toetsenbord/Muisbeweging**: wanneer de gebruiker een object op het scherm beweegt door interactie met het toetsenbord of de muis.
-- **Spelgeïnduceerde beweging**: wanneer het spel een object met een bepaald tijdsinterval beweegt.
+- **Toetsenbord/Muis beweging**: wanneer de gebruiker interactie heeft met het toetsenbord of de muis om een object op het scherm te verplaatsen.
+- **Spel-geïnduceerde beweging**: wanneer het spel een object beweegt met een bepaalde tijdsinterval.
-Maar hoe bewegen we dingen op een scherm? Het draait allemaal om cartesiaanse coördinaten: we veranderen de locatie (x, y) van het object en tekenen vervolgens het scherm opnieuw.
+Hoe verplaatsen we dingen op een scherm? Het draait allemaal om cartesiaanse coördinaten: we veranderen de locatie (x,y) van het object en tekenen vervolgens het scherm opnieuw.
-Meestal zijn de volgende stappen nodig om *beweging* op een scherm te realiseren:
+Meestal heb je de volgende stappen nodig om *beweging* op een scherm te realiseren:
-1. **Stel een nieuwe locatie in** voor een object; dit is nodig om het object als verplaatst waar te nemen.
-2. **Maak het scherm leeg**, het scherm moet tussen de tekeningen door worden gewist. Dit kan door een rechthoek te tekenen die we vullen met een achtergrondkleur.
-3. **Teken het object opnieuw** op de nieuwe locatie. Hiermee bereiken we uiteindelijk dat het object van de ene naar de andere locatie beweegt.
+1. **Stel een nieuwe locatie in** voor een object; dit is nodig om het object als verplaatst te ervaren.
+2. **Maak het scherm leeg**, het scherm moet tussen de tekeningen worden leeggemaakt. Dit kan door een rechthoek te tekenen die we vullen met een achtergrondkleur.
+3. **Teken het object opnieuw** op de nieuwe locatie. Door dit te doen, verplaatsen we het object uiteindelijk van de ene locatie naar de andere.
-Hier is hoe dat er in code uit kan zien:
+Hier is hoe dat eruit kan zien in code:
```javascript
//set the hero's location
@@ -39,13 +39,13 @@ ctx.fillStyle = "black";
ctx.drawImage(heroImg, hero.x, hero.y);
```
-✅ Kun je bedenken waarom het herhaaldelijk opnieuw tekenen van je held met veel frames per seconde prestatiekosten met zich mee kan brengen? Lees meer over [alternatieven voor dit patroon](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Optimizing_canvas).
+✅ Kun je een reden bedenken waarom het herhaaldelijk tekenen van je held meerdere frames per seconde prestatiekosten kan veroorzaken? Lees meer over [alternatieven voor dit patroon](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Optimizing_canvas).
-## Toetsenbordgebeurtenissen Afhandelen
+## Toetsenbordgebeurtenissen afhandelen
-Je handelt gebeurtenissen af door specifieke gebeurtenissen aan code te koppelen. Toetsenbordgebeurtenissen worden geactiveerd op het hele venster, terwijl muisgebeurtenissen zoals een `klik` kunnen worden gekoppeld aan het klikken op een specifiek element. We zullen toetsenbordgebeurtenissen gebruiken in dit project.
+Je handelt gebeurtenissen af door specifieke gebeurtenissen aan code te koppelen. Toetsenbordgebeurtenissen worden geactiveerd op het hele venster, terwijl muisgebeurtenissen zoals een `klik` kunnen worden gekoppeld aan het klikken op een specifiek element. We zullen toetsenbordgebeurtenissen gebruiken gedurende dit project.
-Om een gebeurtenis af te handelen, gebruik je de `addEventListener()`-methode van het venster en geef je twee invoerparameters op. De eerste parameter is de naam van de gebeurtenis, bijvoorbeeld `keyup`. De tweede parameter is de functie die moet worden aangeroepen als gevolg van de gebeurtenis.
+Om een gebeurtenis af te handelen, moet je de `addEventListener()`-methode van het venster gebruiken en deze voorzien van twee invoerparameters. De eerste parameter is de naam van de gebeurtenis, bijvoorbeeld `keyup`. De tweede parameter is de functie die moet worden aangeroepen als gevolg van de gebeurtenis.
Hier is een voorbeeld:
@@ -58,16 +58,16 @@ window.addEventListener('keyup', (evt) => {
})
```
-Voor toetsgebeurtenissen zijn er twee eigenschappen op de gebeurtenis die je kunt gebruiken om te zien welke toets is ingedrukt:
+Voor toetsenbordgebeurtenissen zijn er twee eigenschappen op de gebeurtenis die je kunt gebruiken om te zien welke toets is ingedrukt:
- `key`, dit is een stringrepresentatie van de ingedrukte toets, bijvoorbeeld `ArrowUp`.
- `keyCode`, dit is een numerieke representatie, bijvoorbeeld `37`, wat overeenkomt met `ArrowLeft`.
-✅ Het manipuleren van toetsgebeurtenissen is ook nuttig buiten game-ontwikkeling. Aan welke andere toepassingen kun je denken voor deze techniek?
+✅ Manipulatie van toetsenbordgebeurtenissen is nuttig buiten gameontwikkeling. Aan welke andere toepassingen kun je denken voor deze techniek?
### Speciale toetsen: een kanttekening
-Er zijn enkele *speciale* toetsen die invloed hebben op het venster. Dit betekent dat als je luistert naar een `keyup`-gebeurtenis en je deze speciale toetsen gebruikt om je held te bewegen, dit ook horizontaal scrollen veroorzaakt. Daarom wil je mogelijk dit ingebouwde browsergedrag *uitschakelen* terwijl je je spel ontwikkelt. Hiervoor heb je code zoals deze nodig:
+Er zijn enkele *speciale* toetsen die invloed hebben op het venster. Dat betekent dat als je luistert naar een `keyup`-gebeurtenis en je deze speciale toetsen gebruikt om je held te verplaatsen, het ook horizontaal scrollen zal uitvoeren. Om die reden wil je mogelijk dit ingebouwde browsergedrag *uitschakelen* terwijl je je spel ontwikkelt. Je hebt code zoals deze nodig:
```javascript
let onKeyDown = function (e) {
@@ -88,11 +88,11 @@ let onKeyDown = function (e) {
window.addEventListener('keydown', onKeyDown);
```
-De bovenstaande code zorgt ervoor dat de pijltjestoetsen en de spatiebalk hun *standaard* gedrag uitschakelen. Het *uitschakel*-mechanisme vindt plaats wanneer we `e.preventDefault()` aanroepen.
+De bovenstaande code zorgt ervoor dat pijltjestoetsen en de spatiebalk hun *standaard* gedrag uitschakelen. Het *uitschakel*-mechanisme treedt in werking wanneer we `e.preventDefault()` aanroepen.
-## Spelgeïnduceerde Beweging
+## Spel-geïnduceerde beweging
-We kunnen objecten automatisch laten bewegen door timers te gebruiken, zoals de `setTimeout()`- of `setInterval()`-functie, die de locatie van het object bij elke tik of tijdsinterval bijwerken. Hier is hoe dat eruit kan zien:
+We kunnen dingen vanzelf laten bewegen door timers te gebruiken zoals de `setTimeout()`- of `setInterval()`-functie die de locatie van het object bijwerkt bij elke tik, of tijdsinterval. Hier is hoe dat eruit kan zien:
```javascript
let id = setInterval(() => {
@@ -101,11 +101,11 @@ let id = setInterval(() => {
})
```
-## De Spelloop
+## De spel-lus
-De spelloop is een concept dat in wezen een functie is die op regelmatige intervallen wordt aangeroepen. Het wordt de spelloop genoemd omdat alles wat zichtbaar moet zijn voor de gebruiker in de loop wordt getekend. De spelloop maakt gebruik van alle spelobjecten die deel uitmaken van het spel en tekent ze, tenzij ze om een bepaalde reden niet langer deel uitmaken van het spel. Bijvoorbeeld, als een object een vijand is die door een laser is geraakt en explodeert, maakt het geen deel meer uit van de huidige spelloop (je leert hier meer over in latere lessen).
+De spel-lus is een concept dat in wezen een functie is die op regelmatige intervallen wordt aangeroepen. Het wordt de spel-lus genoemd omdat alles wat zichtbaar moet zijn voor de gebruiker in de lus wordt getekend. De spel-lus maakt gebruik van alle spelobjecten die deel uitmaken van het spel en tekent ze allemaal, tenzij ze om een bepaalde reden niet meer deel uitmaken van het spel. Bijvoorbeeld, als een object een vijand is die door een laser is geraakt en explodeert, maakt het geen deel meer uit van de huidige spel-lus (je leert hier meer over in latere lessen).
-Hier is hoe een spelloop er typisch uitziet, uitgedrukt in code:
+Hier is hoe een spel-lus er typisch uitziet, uitgedrukt in code:
```javascript
let gameLoopId = setInterval(() =>
@@ -119,18 +119,18 @@ let gameLoopId = setInterval(() =>
}, 200);
```
-De bovenstaande loop wordt elke `200` milliseconden aangeroepen om het canvas opnieuw te tekenen. Je kunt het beste interval kiezen dat logisch is voor jouw spel.
+De bovenstaande lus wordt elke `200` milliseconden aangeroepen om het canvas opnieuw te tekenen. Je kunt het beste interval kiezen dat logisch is voor jouw spel.
-## Het Ruimtespel Voortzetten
+## Verder met het Ruimtespel
Je neemt de bestaande code en breidt deze uit. Begin met de code die je hebt voltooid tijdens deel I of gebruik de code in [Deel II - starter](../../../../6-space-game/3-moving-elements-around/your-work).
-- **De held bewegen**: je voegt code toe om ervoor te zorgen dat je de held kunt bewegen met de pijltjestoetsen.
-- **Vijanden bewegen**: je voegt ook code toe om ervoor te zorgen dat de vijanden van boven naar beneden bewegen met een bepaald tempo.
+- **Beweeg de held**: je voegt code toe om ervoor te zorgen dat je de held kunt bewegen met de pijltjestoetsen.
+- **Beweeg vijanden**: je moet ook code toevoegen om ervoor te zorgen dat de vijanden van boven naar beneden bewegen met een bepaalde snelheid.
-## Aanbevolen Stappen
+## Aanbevolen stappen
-Zoek de bestanden die voor je zijn aangemaakt in de map `your-work`. Deze map zou het volgende moeten bevatten:
+Vind de bestanden die voor je zijn aangemaakt in de submap `your-work`. Het zou het volgende moeten bevatten:
```bash
-| assets
@@ -141,22 +141,22 @@ Zoek de bestanden die voor je zijn aangemaakt in de map `your-work`. Deze map zo
-| package.json
```
-Start je project in de map `your_work` door het volgende in te typen:
+Je start je project in de map `your_work` door het volgende te typen:
```bash
cd your-work
npm start
```
-Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een browser en voer dat adres in. Op dit moment zou het de held en alle vijanden moeten weergeven; er beweegt nog niets - nog niet!
+Het bovenstaande start een HTTP-server op het adres `http://localhost:5000`. Open een browser en voer dat adres in, op dit moment zou het de held en alle vijanden moeten weergeven; niets beweegt - nog niet!
-### Code Toevoegen
+### Code toevoegen
-1. **Voeg toegewijde objecten toe** voor `hero`, `enemy` en `game object`. Deze moeten `x`- en `y`-eigenschappen hebben. (Onthoud het gedeelte over [Overerving of compositie](../README.md)).
+1. **Voeg toegewijde objecten toe** voor `hero`, `enemy` en `game object`, ze moeten `x`- en `y`-eigenschappen hebben. (Herinner je het gedeelte over [Erfenis of compositie](../README.md)).
- *TIP*: `game object` moet degene zijn met `x` en `y` en de mogelijkheid om zichzelf op een canvas te tekenen.
+ *TIP* `game object` moet degene zijn met `x` en `y` en de mogelijkheid om zichzelf op een canvas te tekenen.
- >tip: begin met het toevoegen van een nieuwe GameObject-klasse met de constructor zoals hieronder, en teken deze vervolgens op het canvas:
+ >tip: begin met het toevoegen van een nieuwe GameObject-klasse met zijn constructor zoals hieronder aangegeven, en teken het vervolgens op het canvas:
```javascript
@@ -205,9 +205,9 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
}
```
-2. **Voeg toetsgebeurtenis-handlers toe** om toetsnavigatie af te handelen (beweeg de held omhoog/omlaag, links/rechts).
+2. **Voeg handlers voor toetsenbordgebeurtenissen toe** om navigatie met toetsen te verwerken (beweeg de held omhoog/omlaag links/rechts).
- *ONTHOUD*: het is een cartesiaans systeem, linksboven is `0,0`. Vergeet ook niet code toe te voegen om *standaardgedrag* te stoppen.
+ *ONTHOUD* het is een cartesiaans systeem, linksboven is `0,0`. Vergeet ook niet code toe te voegen om *standaardgedrag* te stoppen.
>tip: maak je onKeyDown-functie en koppel deze aan het venster:
@@ -221,13 +221,13 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
window.addEventListener("keydown", onKeyDown);
```
- Controleer op dit punt je browserconsole en bekijk de geregistreerde toetsaanslagen.
+ Controleer op dit punt je browserconsole en bekijk de toetsaanslagen die worden geregistreerd.
-3. **Implementeer** het [Pub-sub patroon](../README.md), dit houdt je code overzichtelijk terwijl je de resterende delen volgt.
+3. **Implementeer** het [Pub sub patroon](../README.md), dit houdt je code schoon terwijl je de resterende delen volgt.
Om dit laatste deel te doen, kun je:
- 1. **Een gebeurtenislistener toevoegen** aan het venster:
+ 1. **Voeg een event listener toe** aan het venster:
```javascript
window.addEventListener("keyup", (evt) => {
@@ -243,7 +243,7 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
});
```
- 1. **Een EventEmitter-klasse maken** om berichten te publiceren en te abonneren:
+ 1. **Maak een EventEmitter-klasse** om berichten te publiceren en te abonneren:
```javascript
class EventEmitter {
@@ -266,7 +266,7 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
}
```
- 1. **Constanten toevoegen** en de EventEmitter instellen:
+ 1. **Voeg constanten toe** en stel de EventEmitter in:
```javascript
const Messages = {
@@ -285,7 +285,7 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
eventEmitter = new EventEmitter();
```
- 1. **Het spel initialiseren**
+ 1. **Initialiseer het spel**
```javascript
function initGame() {
@@ -311,9 +311,9 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
}
```
-1. **De spelloop instellen**
+1. **Stel de spel-lus in**
- Refactor de window.onload-functie om het spel te initialiseren en een spelloop in te stellen op een goed interval. Je voegt ook een laserstraal toe:
+ Refactor de window.onload-functie om het spel te initialiseren en een spel-lus op een goed interval in te stellen. Je voegt ook een laserstraal toe:
```javascript
window.onload = async () => {
@@ -334,7 +334,7 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
};
```
-5. **Voeg code toe** om vijanden met een bepaald interval te laten bewegen.
+5. **Voeg code toe** om vijanden op een bepaald interval te bewegen
Refactor de `createEnemies()`-functie om de vijanden te maken en ze in de nieuwe gameObjects-klasse te plaatsen:
@@ -355,7 +355,7 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
}
```
- en voeg een `createHero()`-functie toe om een soortgelijk proces voor de held uit te voeren.
+ en voeg een `createHero()`-functie toe om een vergelijkbaar proces voor de held uit te voeren.
```javascript
function createHero() {
@@ -376,21 +376,21 @@ Hiermee start je een HTTP-server op adres `http://localhost:5000`. Open een brow
}
```
- Je vijanden zouden nu je heldenruimteschip moeten naderen!
+ Je vijanden zouden nu je heldenruimteschip moeten beginnen te benaderen!
---
## 🚀 Uitdaging
-Zoals je kunt zien, kan je code veranderen in 'spaghetticode' wanneer je functies, variabelen en klassen toevoegt. Hoe kun je je code beter organiseren zodat deze leesbaarder wordt? Schets een systeem om je code te organiseren, zelfs als het nog steeds in één bestand staat.
+Zoals je kunt zien, kan je code veranderen in 'spaghetti-code' wanneer je functies, variabelen en klassen begint toe te voegen. Hoe kun je je code beter organiseren zodat deze beter leesbaar is? Schets een systeem om je code te organiseren, zelfs als het nog steeds in één bestand staat.
-## Quiz Na de Les
+## Quiz na de les
[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/34)
-## Herziening & Zelfstudie
+## Review & Zelfstudie
-Hoewel we ons spel schrijven zonder frameworks, zijn er veel op JavaScript gebaseerde canvas-frameworks voor game-ontwikkeling. Neem de tijd om wat [te lezen over deze](https://github.com/collections/javascript-game-engines).
+Hoewel we ons spel schrijven zonder frameworks, zijn er veel op JavaScript gebaseerde canvas-frameworks voor gameontwikkeling. Neem de tijd om [hierover te lezen](https://github.com/collections/javascript-game-engines).
## Opdracht
@@ -399,4 +399,4 @@ Hoewel we ons spel schrijven zonder frameworks, zijn er veel op JavaScript gebas
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/6-space-game/4-collision-detection/README.md b/translations/nl/6-space-game/4-collision-detection/README.md
index f7ac683a..14b3b20b 100644
--- a/translations/nl/6-space-game/4-collision-detection/README.md
+++ b/translations/nl/6-space-game/4-collision-detection/README.md
@@ -1,26 +1,26 @@
# Bouw een Ruimtespel Deel 4: Een Laser Toevoegen en Botsingen Detecteren
-## Pre-Lecture Quiz
+## Quiz Voorafgaand aan de Les
-[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/35)
+[Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/web/quiz/35)
In deze les leer je hoe je lasers kunt afvuren met JavaScript! We voegen twee dingen toe aan ons spel:
- **Een laser**: deze laser wordt afgevuurd vanuit het ruimteschip van de held en beweegt verticaal omhoog.
-- **Botsingsdetectie**, als onderdeel van het implementeren van de mogelijkheid om te *schieten* voegen we ook enkele leuke spelregels toe:
- - **Laser raakt vijand**: Vijand sterft als hij wordt geraakt door een laser.
+- **Botsingsdetectie**: als onderdeel van het implementeren van de mogelijkheid om te *schieten*, voegen we ook enkele leuke spelregels toe:
+ - **Laser raakt vijand**: Een vijand sterft als hij wordt geraakt door een laser.
- **Laser raakt bovenkant scherm**: Een laser wordt vernietigd als hij de bovenkant van het scherm raakt.
- **Botsing tussen vijand en held**: Een vijand en de held worden vernietigd als ze elkaar raken.
- - **Vijand raakt onderkant scherm**: Een vijand en de held worden vernietigd als de vijand de onderkant van het scherm raakt.
+ - **Vijand raakt onderkant scherm**: Een vijand en de held worden vernietigd als de vijand de onderkant van het scherm bereikt.
Kortom, jij -- *de held* -- moet alle vijanden raken met een laser voordat ze de onderkant van het scherm bereiken.
@@ -32,7 +32,7 @@ Laten we samen heldhaftig zijn!
Hoe doen we botsingsdetectie? We moeten onze spelobjecten zien als rechthoeken die bewegen. Waarom, vraag je je misschien af? Nou, de afbeelding die wordt gebruikt om een spelobject te tekenen is een rechthoek: het heeft een `x`, `y`, `breedte` en `hoogte`.
-Als twee rechthoeken, bijvoorbeeld een held en een vijand, *overlappen*, heb je een botsing. Wat er dan moet gebeuren, hangt af van de spelregels. Om botsingsdetectie te implementeren, heb je het volgende nodig:
+Als twee rechthoeken, bijvoorbeeld een held en een vijand, elkaar *snijden*, heb je een botsing. Wat er dan moet gebeuren, hangt af van de regels van het spel. Om botsingsdetectie te implementeren, heb je het volgende nodig:
1. Een manier om een rechthoekrepresentatie van een spelobject te krijgen, zoals dit:
@@ -47,7 +47,7 @@ Als twee rechthoeken, bijvoorbeeld een held en een vijand, *overlappen*, heb je
}
```
-2. Een vergelijkingsfunctie, deze functie kan er als volgt uitzien:
+2. Een vergelijkingsfunctie, deze functie kan er zo uitzien:
```javascript
function intersectRect(r1, r2) {
@@ -60,7 +60,7 @@ Als twee rechthoeken, bijvoorbeeld een held en een vijand, *overlappen*, heb je
## Hoe vernietigen we dingen
-Om dingen in een spel te vernietigen, moet je het spel laten weten dat het dit object niet langer moet tekenen in de spelcyclus die op een bepaald interval wordt geactiveerd. Een manier om dit te doen is door een spelobject als *dood* te markeren wanneer er iets gebeurt, zoals dit:
+Om dingen in een spel te vernietigen, moet je het spel laten weten dat het dit object niet langer moet tekenen in de gameloop die op een bepaald interval wordt geactiveerd. Een manier om dit te doen is door een spelobject als *dood* te markeren wanneer er iets gebeurt, zoals dit:
```javascript
// collision happened
@@ -113,15 +113,15 @@ class Weapon {
## Wat te bouwen
-Je neemt de bestaande code (die je zou moeten hebben opgeschoond en gerefactord) van de vorige les en breidt deze uit. Begin met de code van deel II of gebruik de code bij [Deel III - starter](../../../../../../../../../your-work).
+Je gaat de bestaande code (die je zou moeten hebben opgeschoond en gerefactord) van de vorige les uitbreiden. Begin met de code van deel II of gebruik de code van [Deel III - starter](../../../../../../../../../your-work).
> tip: de laser waarmee je gaat werken bevindt zich al in je assets-map en wordt door je code verwezen.
- **Voeg botsingsdetectie toe**, wanneer een laser iets raakt, moeten de volgende regels gelden:
1. **Laser raakt vijand**: vijand sterft als hij wordt geraakt door een laser.
- 2. **Laser raakt bovenkant scherm**: Een laser wordt vernietigd als hij de bovenkant van ons scherm raakt.
+ 2. **Laser raakt bovenkant scherm**: Een laser wordt vernietigd als hij de bovenkant van het scherm raakt.
3. **Botsing tussen vijand en held**: een vijand en de held worden vernietigd als ze elkaar raken.
- 4. **Vijand raakt onderkant scherm**: Een vijand en de held worden vernietigd als de vijand de onderkant van het scherm raakt.
+ 4. **Vijand raakt onderkant scherm**: Een vijand en de held worden vernietigd als de vijand de onderkant van het scherm bereikt.
## Aanbevolen stappen
@@ -144,7 +144,7 @@ cd your-work
npm start
```
-Hiermee wordt een HTTP-server gestart op adres `http://localhost:5000`. Open een browser en voer dat adres in, op dit moment zou het de held en alle vijanden moeten weergeven, maar er beweegt nog niets :).
+Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open een browser en voer dat adres in. Op dit moment zou het de held en alle vijanden moeten weergeven, maar er beweegt nog niets :).
### Code toevoegen
@@ -161,7 +161,7 @@ Hiermee wordt een HTTP-server gestart op adres `http://localhost:5000`. Open een
}
```
-2. **Voeg code toe die botsingen controleert**. Dit wordt een nieuwe functie die test of twee rechthoeken elkaar overlappen:
+2. **Voeg code toe die botsingen controleert**. Dit wordt een nieuwe functie die test of twee rechthoeken elkaar snijden:
```javascript
function intersectRect(r1, r2) {
@@ -174,8 +174,8 @@ Hiermee wordt een HTTP-server gestart op adres `http://localhost:5000`. Open een
}
```
-3. **Voeg de mogelijkheid toe om een laser af te vuren**
- 1. **Voeg een toetsgebeurtenis toe**. De *spatiebalk* moet een laser creëren net boven het ruimteschip van de held. Voeg drie constanten toe in het Messages-object:
+3. **Voeg de mogelijkheid toe om lasers af te vuren**
+ 1. **Voeg een toetsgebeurtenis toe**. De *spatiebalk* moet een laser creëren net boven het ruimteschip van de held. Voeg drie constanten toe aan het Messages-object:
```javascript
KEY_EVENT_SPACE: "KEY_EVENT_SPACE",
@@ -252,7 +252,7 @@ Hiermee wordt een HTTP-server gestart op adres `http://localhost:5000`. Open een
}
```
- Zorg ervoor dat je `updateGameObjects()` toevoegt aan je spelcyclus in `window.onload`.
+ Zorg ervoor dat je `updateGameObjects()` toevoegt aan je gameloop in `window.onload`.
4. **Implementeer cooldown** voor de laser, zodat deze slechts met een bepaalde frequentie kan worden afgevuurd.
@@ -285,7 +285,7 @@ Hiermee wordt een HTTP-server gestart op adres `http://localhost:5000`. Open een
}
```
-Op dit punt heeft je spel enige functionaliteit! Je kunt navigeren met je pijltjestoetsen, een laser afvuren met je spatiebalk en vijanden verdwijnen wanneer je ze raakt. Goed gedaan!
+Op dit punt heeft je spel al wat functionaliteit! Je kunt navigeren met je pijltjestoetsen, een laser afvuren met je spatiebalk, en vijanden verdwijnen wanneer je ze raakt. Goed gedaan!
---
@@ -293,9 +293,9 @@ Op dit punt heeft je spel enige functionaliteit! Je kunt navigeren met je pijltj
Voeg een explosie toe! Bekijk de spelassets in [de Space Art-repo](../../../../6-space-game/solution/spaceArt/readme.txt) en probeer een explosie toe te voegen wanneer de laser een alien raakt.
-## Post-Lecture Quiz
+## Quiz Na de Les
-[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/36)
+[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/36)
## Review & Zelfstudie
@@ -303,9 +303,9 @@ Experimenteer met de intervallen in je spel tot nu toe. Wat gebeurt er als je ze
## Opdracht
-[Ontdek botsingen](assignment.md)
+[Verken botsingen](assignment.md)
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/6-space-game/5-keeping-score/README.md b/translations/nl/6-space-game/5-keeping-score/README.md
index baeed7f0..1baab0b5 100644
--- a/translations/nl/6-space-game/5-keeping-score/README.md
+++ b/translations/nl/6-space-game/5-keeping-score/README.md
@@ -1,23 +1,23 @@
# Bouw een Ruimtespel Deel 5: Score en Levens
-## Pre-Lecture Quiz
+## Pre-Les Quiz
-[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/37)
+[Pre-les quiz](https://ff-quizzes.netlify.app/web/quiz/37)
In deze les leer je hoe je een score toevoegt aan een spel en levens berekent.
## Tekst op het scherm weergeven
-Om een spelscore op het scherm te tonen, moet je weten hoe je tekst op het scherm plaatst. Het antwoord is het gebruik van de `fillText()`-methode op het canvas-object. Je kunt ook andere aspecten regelen, zoals welk lettertype je gebruikt, de kleur van de tekst en zelfs de uitlijning (links, rechts, midden). Hieronder staat wat code die tekst op het scherm tekent.
+Om een spelscore op het scherm te kunnen weergeven, moet je weten hoe je tekst op het scherm plaatst. Het antwoord is het gebruik van de methode `fillText()` op het canvas-object. Je kunt ook andere aspecten aanpassen, zoals welk lettertype je wilt gebruiken, de kleur van de tekst en zelfs de uitlijning (links, rechts, midden). Hieronder staat wat code die tekst op het scherm tekent.
```javascript
ctx.font = "30px Arial";
@@ -26,13 +26,13 @@ ctx.textAlign = "right";
ctx.fillText("show this on the screen", 0, 0);
```
-✅ Lees meer over [hoe je tekst toevoegt aan een canvas](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_text), en voel je vrij om het er mooier uit te laten zien!
+✅ Lees meer over [hoe je tekst toevoegt aan een canvas](https://developer.mozilla.org/docs/Web/API/Canvas_API/Tutorial/Drawing_text), en maak jouw versie gerust wat mooier!
-## Leven, als spelconcept
+## Levens, als spelconcept
-Het concept van een leven in een spel is simpelweg een getal. In de context van een ruimtespel is het gebruikelijk om een aantal levens toe te wijzen die één voor één worden afgetrokken wanneer je schip schade oploopt. Het is leuk als je dit grafisch kunt weergeven, bijvoorbeeld met mini-schepen of hartjes in plaats van een getal.
+Het concept van levens in een spel is simpelweg een getal. In de context van een ruimtespel is het gebruikelijk om een aantal levens toe te wijzen die één voor één worden afgetrokken wanneer je schip schade oploopt. Het is leuk als je een grafische weergave hiervan kunt tonen, zoals kleine scheepjes of hartjes in plaats van een getal.
-## Wat gaan we bouwen
+## Wat gaan we bouwen?
Laten we het volgende aan je spel toevoegen:
@@ -60,11 +60,11 @@ cd your-work
npm start
```
-Hiermee start je een HTTP-server op het adres `http://localhost:5000`. Open een browser en voer dat adres in. Op dit moment zou het de held en alle vijanden moeten weergeven, en als je op de linker- en rechterpijltjes drukt, beweegt de held en kan hij vijanden neerschieten.
+Bovenstaande start een HTTP-server op het adres `http://localhost:5000`. Open een browser en voer dat adres in. Op dit moment zou het de held en alle vijanden moeten weergeven, en als je op de linker- en rechterpijltjes drukt, beweegt de held en kan hij vijanden neerschieten.
### Code toevoegen
-1. **Kopieer de benodigde assets** van de map `solution/assets/` naar de map `your-work`; je voegt een `life.png`-asset toe. Voeg de lifeImg toe aan de window.onload-functie:
+1. **Kopieer de benodigde assets** van de map `solution/assets/` naar de map `your-work`; je voegt een `life.png` asset toe. Voeg de lifeImg toe aan de window.onload functie:
```javascript
lifeImg = await loadTexture("assets/life.png");
@@ -80,9 +80,9 @@ Hiermee start je een HTTP-server op het adres `http://localhost:5000`. Open een
eventEmitter = new EventEmitter();
```
-2. **Voeg variabelen toe**. Voeg code toe die je totale score (0) en resterende levens (3) vertegenwoordigt, en toon deze scores op het scherm.
+2. **Voeg variabelen toe**. Voeg code toe die je totale score (0) en resterende levens (3) vertegenwoordigt, en geef deze scores weer op het scherm.
-3. **Breid de `updateGameObjects()`-functie uit**. Breid de `updateGameObjects()`-functie uit om vijandelijke botsingen af te handelen:
+3. **Breid de functie `updateGameObjects()` uit**. Breid de functie `updateGameObjects()` uit om vijandelijke botsingen af te handelen:
```javascript
enemies.forEach(enemy => {
@@ -93,15 +93,15 @@ Hiermee start je een HTTP-server op het adres `http://localhost:5000`. Open een
})
```
-4. **Voeg `life` en `points` toe**.
- 1. **Initialiseer variabelen**. Onder `this.cooldown = 0` in de `Hero`-klasse, stel life en points in:
+4. **Voeg levens en punten toe**.
+ 1. **Initialiseer variabelen**. Onder `this.cooldown = 0` in de `Hero`-klasse, stel levens en punten in:
```javascript
this.life = 3;
this.points = 0;
```
- 1. **Teken variabelen op het scherm**. Teken deze waarden op het scherm:
+ 1. **Teken variabelen op het scherm**. Geef deze waarden weer op het scherm:
```javascript
function drawLife() {
@@ -128,7 +128,7 @@ Hiermee start je een HTTP-server op het adres `http://localhost:5000`. Open een
```
- 1. **Voeg methoden toe aan de gameloop**. Zorg ervoor dat je deze functies toevoegt aan je window.onload-functie onder `updateGameObjects()`:
+ 1. **Voeg methoden toe aan de gameloop**. Zorg ervoor dat je deze functies toevoegt aan je window.onload functie onder `updateGameObjects()`:
```javascript
drawPoints();
@@ -177,7 +177,7 @@ Hiermee start je een HTTP-server op het adres `http://localhost:5000`. Open een
✅ Doe wat onderzoek naar andere spellen die zijn gemaakt met JavaScript/Canvas. Wat zijn hun gemeenschappelijke kenmerken?
-Aan het einde van dit werk zou je de kleine 'leven'-schepen rechtsonder moeten zien, punten linksonder, en je zou je levensaantal moeten zien afnemen wanneer je met vijanden botst en je punten zien toenemen wanneer je vijanden neerschiet. Goed gedaan! Je spel is bijna klaar.
+Aan het einde van dit werk zou je de kleine 'leven'-scheepjes rechtsonder moeten zien, punten linksonder, en je zou moeten zien dat je levens afnemen wanneer je met vijanden botst en je punten toenemen wanneer je vijanden neerschiet. Goed gedaan! Je spel is bijna klaar.
---
@@ -185,9 +185,9 @@ Aan het einde van dit werk zou je de kleine 'leven'-schepen rechtsonder moeten z
Je code is bijna compleet. Kun je je volgende stappen bedenken?
-## Post-Lecture Quiz
+## Post-Les Quiz
-[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/38)
+[Post-les quiz](https://ff-quizzes.netlify.app/web/quiz/38)
## Review & Zelfstudie
@@ -195,9 +195,9 @@ Onderzoek enkele manieren waarop je spelscores en levens kunt verhogen en verlag
## Opdracht
-[Bouw een Scoringsspel](assignment.md)
+[Bouw een Scoring Game](assignment.md)
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/6-space-game/6-end-condition/README.md b/translations/nl/6-space-game/6-end-condition/README.md
index 14535acf..af34a18d 100644
--- a/translations/nl/6-space-game/6-end-condition/README.md
+++ b/translations/nl/6-space-game/6-end-condition/README.md
@@ -1,41 +1,41 @@
# Bouw een Ruimtespel Deel 6: Einde en Herstart
-## Quiz voor de les
+## Quiz voor de Les
[Quiz voor de les](https://ff-quizzes.netlify.app/web/quiz/39)
-Er zijn verschillende manieren om een *eindconditie* in een spel uit te drukken. Het is aan jou als maker van het spel om te bepalen waarom het spel eindigt. Hier zijn enkele redenen, ervan uitgaande dat we het hebben over het ruimtespel dat je tot nu toe hebt gebouwd:
+Er zijn verschillende manieren om een *eindconditie* in een spel te definiëren. Het is aan jou als maker van het spel om te bepalen waarom het spel eindigt. Hier zijn enkele redenen, ervan uitgaande dat we het hebben over het ruimtespel dat je tot nu toe hebt gebouwd:
-- **`N` Vijandelijke schepen zijn vernietigd**: Het is vrij gebruikelijk dat je een spel in verschillende niveaus verdeelt en dat je `N` vijandelijke schepen moet vernietigen om een niveau te voltooien.
-- **Je schip is vernietigd**: Er zijn zeker spellen waarin je verliest als je schip wordt vernietigd. Een andere veelvoorkomende aanpak is het concept van levens. Elke keer dat je schip wordt vernietigd, verlies je een leven. Zodra alle levens verloren zijn, verlies je het spel.
-- **Je hebt `N` punten verzameld**: Een andere veelvoorkomende eindconditie is dat je punten verzamelt. Hoe je punten krijgt, is aan jou, maar het is vrij gebruikelijk om punten toe te kennen aan verschillende activiteiten, zoals het vernietigen van een vijandelijk schip of het verzamelen van items die worden *gedropt* wanneer ze worden vernietigd.
-- **Voltooi een niveau**: Dit kan verschillende voorwaarden omvatten, zoals `X` vijandelijke schepen vernietigd, `Y` punten verzameld of misschien dat een specifiek item is verzameld.
+- **`N` Vijandelijke schepen zijn vernietigd**: Het is vrij gebruikelijk dat je, als je een spel in verschillende niveaus verdeelt, `N` vijandelijke schepen moet vernietigen om een niveau te voltooien.
+- **Je schip is vernietigd**: Er zijn zeker spellen waarin je verliest als je schip wordt vernietigd. Een andere veelvoorkomende aanpak is het concept van levens. Elke keer dat je schip wordt vernietigd, verlies je een leven. Als alle levens op zijn, verlies je het spel.
+- **Je hebt `N` punten verzameld**: Een andere veelvoorkomende eindconditie is dat je punten verzamelt. Hoe je punten verdient, is aan jou, maar het is vrij gebruikelijk om punten toe te kennen aan verschillende activiteiten, zoals het vernietigen van een vijandelijk schip of het verzamelen van items die verschijnen wanneer ze worden vernietigd.
+- **Voltooi een niveau**: Dit kan verschillende voorwaarden omvatten, zoals `X` vijandelijke schepen vernietigd, `Y` punten verzameld of misschien een specifiek item dat is verzameld.
## Herstarten
-Als mensen je spel leuk vinden, willen ze het waarschijnlijk opnieuw spelen. Zodra het spel om welke reden dan ook eindigt, moet je een optie bieden om opnieuw te starten.
+Als mensen je spel leuk vinden, willen ze het waarschijnlijk opnieuw spelen. Zodra het spel om welke reden dan ook eindigt, moet je een optie bieden om opnieuw te beginnen.
-✅ Denk eens na over de voorwaarden waaronder een spel eindigt en hoe je wordt gevraagd om opnieuw te starten.
+✅ Denk eens na over de voorwaarden waaronder een spel eindigt en hoe je wordt aangespoord om opnieuw te beginnen.
## Wat te bouwen
Je gaat deze regels aan je spel toevoegen:
1. **Het spel winnen**. Zodra alle vijandelijke schepen zijn vernietigd, win je het spel. Toon daarnaast een soort overwinningsbericht.
-1. **Herstarten**. Zodra al je levens verloren zijn of het spel is gewonnen, moet je een manier bieden om het spel opnieuw te starten. Vergeet niet! Je moet het spel opnieuw initialiseren en de vorige spelstatus wissen.
+1. **Herstarten**. Zodra al je levens op zijn of het spel is gewonnen, moet je een manier bieden om het spel opnieuw te starten. Vergeet niet! Je moet het spel opnieuw initialiseren en de vorige spelstatus wissen.
## Aanbevolen stappen
-Vind de bestanden die voor je zijn gemaakt in de submap `your-work`. Deze map zou het volgende moeten bevatten:
+Zoek de bestanden die voor je zijn aangemaakt in de map `your-work`. Deze map zou het volgende moeten bevatten:
```bash
-| assets
@@ -55,13 +55,13 @@ cd your-work
npm start
```
-Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open een browser en voer dat adres in. Je spel zou in een speelbare staat moeten zijn.
+Hiermee start je een HTTP-server op het adres `http://localhost:5000`. Open een browser en voer dat adres in. Je spel zou speelbaar moeten zijn.
-> tip: om waarschuwingen in Visual Studio Code te vermijden, bewerk de functie `window.onload` zodat deze `gameLoopId` aanroept zoals het is (zonder `let`), en declareer de gameLoopId bovenaan het bestand, onafhankelijk: `let gameLoopId;`
+> tip: om waarschuwingen in Visual Studio Code te vermijden, bewerk de functie `window.onload` zodat deze `gameLoopId` aanroept zoals het is (zonder `let`), en declareer `gameLoopId` bovenaan het bestand, onafhankelijk: `let gameLoopId;`
### Code toevoegen
-1. **Eindconditie bijhouden**. Voeg code toe die het aantal vijanden bijhoudt of controleert of het heldenschip is vernietigd door deze twee functies toe te voegen:
+1. **Eindconditie bijhouden**. Voeg code toe die het aantal vijanden bijhoudt, of of het heldenschip is vernietigd door deze twee functies toe te voegen:
```javascript
function isHeroDead() {
@@ -117,7 +117,7 @@ Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open
2. **Herstartcode toevoegen**. Voeg code toe die het spel opnieuw start bij het indrukken van een geselecteerde knop.
- 1. **Luister naar toetsdruk `Enter`**. Bewerk de eventListener van je venster om naar deze toetsdruk te luisteren:
+ 1. **Luister naar toetsdruk `Enter`**. Bewerk de eventListener van je venster om naar deze toets te luisteren:
```javascript
else if(evt.key === "Enter") {
@@ -133,7 +133,7 @@ Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open
1. **Spelregels implementeren**. Implementeer de volgende spelregels:
- 1. **Winconditie voor speler**. Wanneer alle vijandelijke schepen zijn vernietigd, toon een overwinningsbericht.
+ 1. **Winconditie speler**. Wanneer alle vijandelijke schepen zijn vernietigd, toon een overwinningsbericht.
1. Maak eerst een functie `displayMessage()`:
@@ -171,7 +171,7 @@ Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open
}
```
- 1. **Herstartlogica**. Wanneer alle levens verloren zijn of de speler het spel heeft gewonnen, toon dat het spel opnieuw kan worden gestart. Start het spel opnieuw wanneer de *herstart* toets wordt ingedrukt (je kunt zelf bepalen welke toets hiervoor wordt gebruikt).
+ 1. **Herstartlogica**. Wanneer alle levens op zijn of de speler het spel heeft gewonnen, geef aan dat het spel opnieuw kan worden gestart. Start het spel opnieuw wanneer de *herstart*-toets wordt ingedrukt (je kunt zelf bepalen welke toets wordt toegewezen aan herstart).
1. Maak de functie `resetGame()`:
@@ -194,7 +194,7 @@ Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open
}
```
- 1. Voeg een oproep toe aan de `eventEmitter` om het spel opnieuw in te stellen in `initGame()`:
+ 1. Voeg een aanroep toe aan de `eventEmitter` om het spel opnieuw in te stellen in `initGame()`:
```javascript
eventEmitter.on(Messages.KEY_EVENT_ENTER, () => {
@@ -202,7 +202,7 @@ Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open
});
```
- 1. Voeg een functie `clear()` toe aan de EventEmitter:
+ 1. Voeg een `clear()`-functie toe aan de EventEmitter:
```javascript
clear() {
@@ -216,21 +216,21 @@ Hiermee wordt een HTTP-server gestart op het adres `http://localhost:5000`. Open
## 🚀 Uitdaging
-Voeg een geluid toe! Kun je een geluid toevoegen om je spelervaring te verbeteren, bijvoorbeeld wanneer er een laser wordt geraakt, of wanneer de held sterft of wint? Bekijk deze [sandbox](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play) om te leren hoe je geluid afspeelt met JavaScript.
+Voeg een geluid toe! Kun je een geluid toevoegen om je gameplay te verbeteren, bijvoorbeeld wanneer er een laser raakt, of wanneer de held sterft of wint? Bekijk deze [sandbox](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play) om te leren hoe je geluid afspeelt met JavaScript.
-## Quiz na de les
+## Quiz na de Les
[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/40)
-## Review & Zelfstudie
+## Herziening & Zelfstudie
Je opdracht is om een nieuw voorbeeldspel te maken, dus verken enkele interessante spellen om te zien wat voor soort spel je zou kunnen bouwen.
## Opdracht
-[Maak een voorbeeldspel](assignment.md)
+[Bouw een Voorbeeldspel](assignment.md)
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/7-bank-project/1-template-route/README.md b/translations/nl/7-bank-project/1-template-route/README.md
index 59df5a89..7f24f3df 100644
--- a/translations/nl/7-bank-project/1-template-route/README.md
+++ b/translations/nl/7-bank-project/1-template-route/README.md
@@ -1,23 +1,23 @@
-# Bouw een Bankapp Deel 1: HTML-sjablonen en Routes in een Webapp
+# Een Bankapp Bouwen Deel 1: HTML-sjablonen en Routes in een Webapp
-## Pre-Lecture Quiz
+## Quiz Voorafgaand aan de Les
-[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/41)
+[Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/web/quiz/41)
### Introductie
-Sinds de komst van JavaScript in browsers worden websites interactiever en complexer dan ooit. Webtechnologieën worden nu vaak gebruikt om volledig functionele applicaties te maken die direct in een browser draaien, wat we [webapplicaties](https://en.wikipedia.org/wiki/Web_application) noemen. Omdat webapps zeer interactief zijn, willen gebruikers niet wachten op een volledige paginavernieuwing elke keer dat een actie wordt uitgevoerd. Daarom wordt JavaScript gebruikt om de HTML direct bij te werken via de DOM, om een soepelere gebruikerservaring te bieden.
+Sinds de komst van JavaScript in browsers worden websites interactiever en complexer dan ooit. Webtechnologieën worden nu vaak gebruikt om volledig functionele applicaties te maken die direct in een browser draaien, wat we [webapplicaties](https://en.wikipedia.org/wiki/Web_application) noemen. Omdat webapps zeer interactief zijn, willen gebruikers niet wachten op een volledige pagina-herlaadbeurt telkens wanneer een actie wordt uitgevoerd. Daarom wordt JavaScript gebruikt om de HTML direct bij te werken via de DOM, om een soepelere gebruikerservaring te bieden.
-In deze les leggen we de basis om een bankwebapp te maken, waarbij we HTML-sjablonen gebruiken om meerdere schermen te creëren die kunnen worden weergegeven en bijgewerkt zonder de hele HTML-pagina te herladen.
+In deze les leggen we de basis voor het maken van een bankwebapp, waarbij we HTML-sjablonen gebruiken om meerdere schermen te maken die kunnen worden weergegeven en bijgewerkt zonder de hele HTML-pagina te herladen.
### Vereisten
@@ -25,7 +25,7 @@ Je hebt een lokale webserver nodig om de webapp te testen die we in deze les gaa
### Voorbereiding
-Maak op je computer een map genaamd `bank` met daarin een bestand genaamd `index.html`. We beginnen met deze HTML [boilerplate](https://en.wikipedia.org/wiki/Boilerplate_code):
+Maak op je computer een map genaamd `bank` met daarin een bestand genaamd `index.html`. We beginnen met deze HTML-[boilerplate](https://en.wikipedia.org/wiki/Boilerplate_code):
```html
@@ -45,16 +45,16 @@ Maak op je computer een map genaamd `bank` met daarin een bestand genaamd `index
## HTML-sjablonen
-Als je meerdere schermen voor een webpagina wilt maken, zou een oplossing zijn om een apart HTML-bestand te maken voor elk scherm dat je wilt weergeven. Deze aanpak heeft echter enkele nadelen:
+Als je meerdere schermen voor een webpagina wilt maken, zou een oplossing kunnen zijn om een apart HTML-bestand te maken voor elk scherm dat je wilt weergeven. Deze aanpak heeft echter enkele nadelen:
- Je moet de hele HTML herladen bij het wisselen van scherm, wat traag kan zijn.
-- Het is moeilijk om gegevens te delen tussen de verschillende schermen.
+- Het is lastig om gegevens te delen tussen de verschillende schermen.
Een andere aanpak is om slechts één HTML-bestand te hebben en meerdere [HTML-sjablonen](https://developer.mozilla.org/docs/Web/HTML/Element/template) te definiëren met behulp van het `
`-element. Een sjabloon is een herbruikbaar HTML-blok dat niet door de browser wordt weergegeven en dat tijdens runtime met JavaScript moet worden geïnstantieerd.
### Taak
-We maken een bankapp met twee schermen: de inlogpagina en het dashboard. Laten we eerst in de HTML-body een tijdelijke aanduidingselement toevoegen dat we zullen gebruiken om de verschillende schermen van onze app te instantiëren:
+We maken een bankapp met twee schermen: de inlogpagina en het dashboard. Laten we eerst in de HTML-body een placeholder-element toevoegen dat we zullen gebruiken om de verschillende schermen van onze app te tonen:
```html
Loading...
@@ -62,9 +62,9 @@ We maken een bankapp met twee schermen: de inlogpagina en het dashboard. Laten w
We geven het een `id` om het later gemakkelijker met JavaScript te kunnen vinden.
-> Tip: omdat de inhoud van dit element wordt vervangen, kunnen we een laadbericht of indicator toevoegen die wordt weergegeven terwijl de app wordt geladen.
+> Tip: omdat de inhoud van dit element wordt vervangen, kun je een laadbericht of indicator toevoegen die wordt weergegeven terwijl de app laadt.
-Vervolgens voegen we onderaan de HTML-sjabloon voor de inlogpagina toe. Voor nu plaatsen we daar alleen een titel en een sectie met een link die we zullen gebruiken voor de navigatie.
+Vervolgens voegen we onder dit element de HTML-sjabloon voor de inlogpagina toe. Voor nu zetten we daar alleen een titel en een sectie met een link die we gebruiken om te navigeren.
```html
@@ -106,25 +106,25 @@ Daarna voegen we een andere HTML-sjabloon toe voor de dashboardpagina. Deze pagi
```
-> Tip: bij het maken van HTML-sjablonen, als je wilt zien hoe het eruit zal zien, kun je de ``- en ` `-regels uitcommentariëren door ze te omringen met ``.
+> Tip: als je wilt zien hoe een HTML-sjabloon eruitziet, kun je de ``- en ` `-regels tijdelijk uitcommentariëren door ze in te sluiten met ``.
-✅ Waarom denk je dat we `id`-attributen gebruiken op de sjablonen? Kunnen we iets anders gebruiken, zoals klassen?
+✅ Waarom denk je dat we `id`-attributen gebruiken op de sjablonen? Zou je iets anders kunnen gebruiken, zoals klassen?
## Sjablonen weergeven met JavaScript
-Als je je huidige HTML-bestand in een browser probeert, zie je dat het blijft hangen op `Loading...`. Dat komt omdat we wat JavaScript-code moeten toevoegen om de HTML-sjablonen te instantiëren en weer te geven.
+Als je je huidige HTML-bestand in een browser probeert, zie je dat het blijft hangen op `Loading...`. Dat komt omdat we wat JavaScript-code moeten toevoegen om de HTML-sjablonen te initialiseren en weer te geven.
-Het instantiëren van een sjabloon gebeurt meestal in 3 stappen:
+Het initialiseren van een sjabloon gebeurt meestal in drie stappen:
1. Haal het sjabloonelement op in de DOM, bijvoorbeeld met [`document.getElementById`](https://developer.mozilla.org/docs/Web/API/Document/getElementById).
-2. Kopieer het sjabloonelement met [`cloneNode`](https://developer.mozilla.org/docs/Web/API/Node/cloneNode).
+2. Clone het sjabloonelement met [`cloneNode`](https://developer.mozilla.org/docs/Web/API/Node/cloneNode).
3. Voeg het toe aan de DOM onder een zichtbaar element, bijvoorbeeld met [`appendChild`](https://developer.mozilla.org/docs/Web/API/Node/appendChild).
✅ Waarom moeten we het sjabloon klonen voordat we het aan de DOM toevoegen? Wat denk je dat er zou gebeuren als we deze stap overslaan?
### Taak
-Maak een nieuw bestand genaamd `app.js` in je projectmap en importeer dat bestand in de ``-sectie van je HTML:
+Maak een nieuw bestand genaamd `app.js` in je projectmap en importeer dat bestand in het ``-gedeelte van je HTML:
```html
@@ -142,7 +142,7 @@ function updateRoute(templateId) {
}
```
-Wat we hier doen, zijn precies de 3 hierboven beschreven stappen. We instantiëren het sjabloon met de id `templateId` en plaatsen de gekloonde inhoud binnen onze app-tijdelijke aanduiding. Merk op dat we `cloneNode(true)` moeten gebruiken om de hele substructuur van het sjabloon te kopiëren.
+Wat we hier doen, zijn precies de drie stappen die hierboven zijn beschreven. We initialiseren het sjabloon met de id `templateId` en plaatsen de gekloonde inhoud in onze app-placeholder. Merk op dat we `cloneNode(true)` moeten gebruiken om de volledige substructuur van het sjabloon te kopiëren.
Roep nu deze functie aan met een van de sjablonen en bekijk het resultaat.
@@ -150,11 +150,11 @@ Roep nu deze functie aan met een van de sjablonen en bekijk het resultaat.
updateRoute('login');
```
-✅ Wat is het doel van deze code `app.innerHTML = '';`? Wat gebeurt er zonder?
+✅ Wat is het doel van deze code `app.innerHTML = '';`? Wat gebeurt er zonder deze regel?
## Routes maken
-Bij een webapp noemen we *Routing* het proces waarbij **URL's** worden gekoppeld aan specifieke schermen die moeten worden weergegeven. Op een website met meerdere HTML-bestanden gebeurt dit automatisch omdat de bestandsstructuur wordt weerspiegeld in de URL. Bijvoorbeeld, met deze bestanden in je projectmap:
+Bij een webapp noemen we het *Routing* wanneer we **URL's** koppelen aan specifieke schermen die moeten worden weergegeven. Op een website met meerdere HTML-bestanden gebeurt dit automatisch, omdat de bestandsstructuur wordt weerspiegeld in de URL. Bijvoorbeeld, met deze bestanden in je projectmap:
```
mywebsite/index.html
@@ -162,7 +162,7 @@ mywebsite/login.html
mywebsite/admin/index.html
```
-Als je een webserver maakt met `mywebsite` als root, zal de URL-mapping zijn:
+Als je een webserver maakt met `mywebsite` als root, wordt de URL-mapping:
```
https://site.com --> mywebsite/index.html
@@ -170,7 +170,7 @@ https://site.com/login.html --> mywebsite/login.html
https://site.com/admin/ --> mywebsite/admin/index.html
```
-Voor onze webapp gebruiken we echter een enkel HTML-bestand dat alle schermen bevat, dus dit standaardgedrag helpt ons niet. We moeten deze mapping handmatig maken en het weergegeven sjabloon bijwerken met JavaScript.
+Voor onze webapp gebruiken we echter één HTML-bestand dat alle schermen bevat, dus dit standaardgedrag helpt ons niet. We moeten deze mapping handmatig maken en de weergegeven sjabloon bijwerken met JavaScript.
### Taak
@@ -183,7 +183,7 @@ const routes = {
};
```
-Laten we nu de `updateRoute`-functie een beetje aanpassen. In plaats van direct de `templateId` als argument door te geven, willen we deze ophalen door eerst naar de huidige URL te kijken en vervolgens onze map te gebruiken om de bijbehorende template-ID-waarde te krijgen. We kunnen [`window.location.pathname`](https://developer.mozilla.org/docs/Web/API/Location/pathname) gebruiken om alleen het padgedeelte van de URL te krijgen.
+Laten we nu de `updateRoute`-functie een beetje aanpassen. In plaats van direct de `templateId` door te geven als argument, willen we deze ophalen door eerst naar de huidige URL te kijken en vervolgens onze map te gebruiken om de bijbehorende template-ID-waarde te krijgen. We kunnen [`window.location.pathname`](https://developer.mozilla.org/docs/Web/API/Location/pathname) gebruiken om alleen het padgedeelte van de URL te krijgen.
```js
function updateRoute() {
@@ -198,20 +198,20 @@ function updateRoute() {
}
```
-Hier hebben we de routes die we hebben gedeclareerd gekoppeld aan het bijbehorende sjabloon. Je kunt testen of het correct werkt door de URL handmatig in je browser te wijzigen.
+Hier hebben we de routes die we hebben gedefinieerd gekoppeld aan de bijbehorende sjabloon. Je kunt testen of dit correct werkt door de URL handmatig in je browser te wijzigen.
✅ Wat gebeurt er als je een onbekend pad invoert in de URL? Hoe zouden we dit kunnen oplossen?
## Navigatie toevoegen
-De volgende stap voor onze app is om de mogelijkheid toe te voegen om tussen pagina's te navigeren zonder de URL handmatig te hoeven wijzigen. Dit houdt twee dingen in:
+De volgende stap voor onze app is het toevoegen van de mogelijkheid om tussen pagina's te navigeren zonder de URL handmatig te hoeven wijzigen. Dit houdt twee dingen in:
1. De huidige URL bijwerken
-2. Het weergegeven sjabloon bijwerken op basis van de nieuwe URL
+2. De weergegeven sjabloon bijwerken op basis van de nieuwe URL
-We hebben het tweede deel al afgehandeld met de `updateRoute`-functie, dus we moeten uitzoeken hoe we de huidige URL kunnen bijwerken.
+We hebben het tweede deel al afgehandeld met de `updateRoute`-functie, dus we moeten nu uitzoeken hoe we de huidige URL kunnen bijwerken.
-We zullen JavaScript moeten gebruiken, en meer specifiek [`history.pushState`](https://developer.mozilla.org/docs/Web/API/History/pushState), waarmee we de URL kunnen bijwerken en een nieuwe invoer in de browsegeschiedenis kunnen maken zonder de HTML te herladen.
+We gebruiken JavaScript, en meer specifiek [`history.pushState`](https://developer.mozilla.org/docs/Web/API/History/pushState), waarmee we de URL kunnen bijwerken en een nieuwe invoer in de browsegeschiedenis kunnen maken, zonder de HTML te herladen.
> Opmerking: Hoewel het HTML-anker-element [``](https://developer.mozilla.org/docs/Web/HTML/Element/a) op zichzelf kan worden gebruikt om hyperlinks naar verschillende URL's te maken, zal het standaard de HTML herladen. Het is noodzakelijk om dit gedrag te voorkomen bij het afhandelen van routing met aangepaste JavaScript, door de functie `preventDefault()` te gebruiken op het klikgebeurtenis.
@@ -226,9 +226,9 @@ function navigate(path) {
}
```
-Deze methode werkt eerst de huidige URL bij op basis van het opgegeven pad en werkt vervolgens het sjabloon bij. De eigenschap `window.location.origin` retourneert de root-URL, zodat we een volledige URL kunnen reconstrueren vanuit een opgegeven pad.
+Deze methode werkt eerst de huidige URL bij op basis van het opgegeven pad en werkt vervolgens de sjabloon bij. De eigenschap `window.location.origin` retourneert de root van de URL, zodat we een volledige URL kunnen reconstrueren vanuit een opgegeven pad.
-Nu we deze functie hebben, kunnen we het probleem aanpakken dat we hebben als een pad niet overeenkomt met een gedefinieerde route. We passen de `updateRoute`-functie aan door een fallback toe te voegen naar een van de bestaande routes als we geen overeenkomst kunnen vinden.
+Nu we deze functie hebben, kunnen we het probleem oplossen dat optreedt als een pad niet overeenkomt met een gedefinieerde route. We passen de `updateRoute`-functie aan door een fallback toe te voegen naar een van de bestaande routes als we geen overeenkomst kunnen vinden.
```js
function updateRoute() {
@@ -242,9 +242,9 @@ function updateRoute() {
...
```
-Als een route niet kan worden gevonden, worden we nu doorgestuurd naar de `login`-pagina.
+Als er geen route kan worden gevonden, worden we nu doorgestuurd naar de `login`-pagina.
-Laten we nu een functie maken om de URL te krijgen wanneer op een link wordt geklikt en om het standaardgedrag van de browserlink te voorkomen:
+Laten we nu een functie maken om de URL te verkrijgen wanneer op een link wordt geklikt en om het standaardgedrag van de browserlink te voorkomen:
```js
function onLinkClick(event) {
@@ -261,27 +261,27 @@ Laten we het navigatiesysteem voltooien door bindings toe te voegen aan onze *Lo
Logout
```
-Het `event`-object hierboven legt het `click`-gebeurtenis vast en geeft het door aan onze `onLinkClick`-functie.
+Het `event`-object hierboven vangt het `click`-gebeurtenis op en geeft het door aan onze `onLinkClick`-functie.
-Met behulp van het [`onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick)-attribuut binden we het `click`-gebeurtenis aan JavaScript-code, hier de aanroep van de `navigate()`-functie.
+Gebruik het [`onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick)-attribuut om het `click`-gebeurtenis te binden aan JavaScript-code, in dit geval de aanroep van de `navigate()`-functie.
-Probeer op deze links te klikken. Je zou nu tussen de verschillende schermen van je app moeten kunnen navigeren.
+Probeer op deze links te klikken; je zou nu moeten kunnen navigeren tussen de verschillende schermen van je app.
-✅ De `history.pushState`-methode maakt deel uit van de HTML5-standaard en is geïmplementeerd in [alle moderne browsers](https://caniuse.com/?search=pushState). Als je een webapp bouwt voor oudere browsers, is er een truc die je kunt gebruiken in plaats van deze API: door een [hash (`#`)](https://en.wikipedia.org/wiki/URI_fragment) voor het pad te gebruiken, kun je routing implementeren die werkt met reguliere anker-navigatie en de pagina niet herlaadt, omdat het bedoeld was om interne links binnen een pagina te maken.
+✅ De `history.pushState`-methode maakt deel uit van de HTML5-standaard en is geïmplementeerd in [alle moderne browsers](https://caniuse.com/?search=pushState). Als je een webapp bouwt voor oudere browsers, kun je in plaats van deze API een truc gebruiken: door een [hash (`#`)](https://en.wikipedia.org/wiki/URI_fragment) vóór het pad te gebruiken, kun je routing implementeren die werkt met reguliere anker-navigatie en de pagina niet herlaadt, omdat het bedoeld was om interne links binnen een pagina te maken.
## Omgaan met de terug- en vooruitknoppen van de browser
-Het gebruik van `history.pushState` maakt nieuwe invoeren in de navigatiegeschiedenis van de browser. Je kunt dat controleren door de *terugknop* van je browser ingedrukt te houden. Het zou iets moeten weergeven zoals dit:
+Het gebruik van `history.pushState` maakt nieuwe invoeren in de navigatiegeschiedenis van de browser. Je kunt dat controleren door de *terugknop* van je browser ingedrukt te houden; het zou iets moeten weergeven zoals dit:

Als je een paar keer op de terugknop klikt, zie je dat de huidige URL verandert en de geschiedenis wordt bijgewerkt, maar hetzelfde sjabloon blijft weergegeven.
-Dat komt omdat de applicatie niet weet dat we `updateRoute()` moeten aanroepen elke keer dat de geschiedenis verandert. Als je kijkt naar de [`history.pushState`-documentatie](https://developer.mozilla.org/docs/Web/API/History/pushState), zie je dat als de status verandert - wat betekent dat we naar een andere URL zijn gegaan - het [`popstate`](https://developer.mozilla.org/docs/Web/API/Window/popstate_event)-gebeurtenis wordt geactiveerd. We zullen dat gebruiken om dit probleem op te lossen.
+Dat komt omdat de applicatie niet weet dat we `updateRoute()` moeten aanroepen telkens wanneer de geschiedenis verandert. Als je kijkt naar de [`history.pushState`-documentatie](https://developer.mozilla.org/docs/Web/API/History/pushState), zie je dat als de staat verandert - wat betekent dat we naar een andere URL zijn gegaan - het [`popstate`](https://developer.mozilla.org/docs/Web/API/Window/popstate_event)-gebeurtenis wordt geactiveerd. We gebruiken dat om dit probleem op te lossen.
### Taak
-Om ervoor te zorgen dat het weergegeven sjabloon wordt bijgewerkt wanneer de browsegeschiedenis verandert, voegen we een nieuwe functie toe die `updateRoute()` aanroept. We doen dat onderaan ons `app.js`-bestand:
+Om ervoor te zorgen dat het weergegeven sjabloon wordt bijgewerkt wanneer de browsergeschiedenis verandert, voegen we een nieuwe functie toe die `updateRoute()` aanroept. We doen dit onderaan ons `app.js`-bestand:
```js
window.onpopstate = () => updateRoute();
@@ -302,15 +302,15 @@ Probeer nu de terug- en vooruitknoppen van je browser te gebruiken en controleer
## 🚀 Uitdaging
-Voeg een nieuw sjabloon en een route toe voor een derde pagina die de credits voor deze app toont.
+Voeg een nieuwe sjabloon en route toe voor een derde pagina die de credits voor deze app toont.
-## Post-Lecture Quiz
+## Quiz Na de Les
-[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/42)
+[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/42)
-## Review & Zelfstudie
+## Herziening & Zelfstudie
-Routing is een van de verrassend lastige onderdelen van webontwikkeling, vooral nu het web verschuift van paginavernieuwingen naar Single Page Application-paginavernieuwingen. Lees wat meer over [hoe de Azure Static Web App-service](https://docs.microsoft.com/azure/static-web-apps/routes/?WT.mc_id=academic-77807-sagibbon) omgaat met routing. Kun je uitleggen waarom sommige van de beslissingen die in dat document worden beschreven noodzakelijk zijn?
+Routing is een van de verrassend lastige onderdelen van webontwikkeling, vooral nu het web verschuift van pagina-herlaadgedrag naar Single Page Application-pagina's. Lees wat over [hoe de Azure Static Web App-service](https://docs.microsoft.com/azure/static-web-apps/routes/?WT.mc_id=academic-77807-sagibbon) routing afhandelt. Kun je uitleggen waarom sommige van de beslissingen die in dat document worden beschreven noodzakelijk zijn?
## Opdracht
@@ -319,4 +319,4 @@ Routing is een van de verrassend lastige onderdelen van webontwikkeling, vooral
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/7-bank-project/2-forms/README.md b/translations/nl/7-bank-project/2-forms/README.md
index 25d68990..db75bb39 100644
--- a/translations/nl/7-bank-project/2-forms/README.md
+++ b/translations/nl/7-bank-project/2-forms/README.md
@@ -1,23 +1,23 @@
# Bouw een Bankapp Deel 2: Maak een Login- en Registratieformulier
-## Quiz voorafgaand aan de les
+## Pre-Lecture Quiz
-[Quiz voorafgaand aan de les](https://ff-quizzes.netlify.app/web/quiz/43)
+[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/43)
### Introductie
-In bijna alle moderne webapps kun je een account aanmaken om je eigen privéruimte te hebben. Omdat meerdere gebruikers tegelijkertijd toegang kunnen hebben tot een webapp, heb je een mechanisme nodig om de persoonlijke gegevens van elke gebruiker afzonderlijk op te slaan en te bepalen welke informatie wordt weergegeven. We zullen niet behandelen hoe je [gebruikersidentiteit veilig beheert](https://en.wikipedia.org/wiki/Authentication), omdat dit een uitgebreid onderwerp op zich is, maar we zorgen ervoor dat elke gebruiker één (of meer) bankrekeningen kan aanmaken in onze app.
+In bijna alle moderne webapps kun je een account aanmaken om je eigen privéruimte te hebben. Aangezien meerdere gebruikers tegelijkertijd toegang kunnen hebben tot een webapp, heb je een mechanisme nodig om de persoonlijke gegevens van elke gebruiker afzonderlijk op te slaan en te bepalen welke informatie wordt weergegeven. We zullen niet behandelen hoe je [gebruikersidentiteit veilig beheert](https://en.wikipedia.org/wiki/Authentication), omdat dit een uitgebreid onderwerp op zich is, maar we zorgen ervoor dat elke gebruiker één (of meer) bankrekeningen kan aanmaken in onze app.
-In dit deel gebruiken we HTML-formulieren om login en registratie toe te voegen aan onze webapp. We zullen zien hoe we gegevens programmatisch naar een server-API kunnen sturen en uiteindelijk hoe we basisvalidatieregels voor gebruikersinvoer kunnen definiëren.
+In dit deel gebruiken we HTML-formulieren om login en registratie toe te voegen aan onze webapp. We zullen zien hoe we de gegevens programmatisch naar een server-API kunnen sturen en uiteindelijk hoe we basisvalidatieregels voor gebruikersinvoer kunnen definiëren.
### Vereisten
@@ -26,9 +26,9 @@ Je moet het onderdeel [HTML-sjablonen en routing](../1-template-route/README.md)
**Let op**
Je hebt twee terminals nodig die tegelijkertijd draaien, zoals hieronder vermeld:
1. Voor de hoofd-bankapp die we hebben gebouwd in de les [HTML-sjablonen en routing](../1-template-route/README.md)
-2. Voor de [Bankapp-server-API](../api/README.md) die we zojuist hebben opgezet.
+2. Voor de [Bank APP server-API](../api/README.md) die we hierboven hebben ingesteld.
-Je moet beide servers draaiende hebben om de rest van de les te kunnen volgen. Ze luisteren op verschillende poorten (poort `3000` en poort `5000`), dus alles zou goed moeten werken.
+Je moet beide servers actief hebben om de rest van de les te kunnen volgen. Ze luisteren op verschillende poorten (poort `3000` en poort `5000`), dus alles zou prima moeten werken.
Je kunt testen of de server correct draait door dit commando in een terminal uit te voeren:
@@ -41,7 +41,7 @@ curl http://localhost:5000/api
## Formulier en besturingselementen
-Het ``-element omvat een sectie van een HTML-document waarin de gebruiker gegevens kan invoeren en indienen met interactieve besturingselementen. Er zijn allerlei soorten gebruikersinterface (UI)-besturingselementen die binnen een formulier kunnen worden gebruikt, waarvan de meest voorkomende de ` `- en ``-elementen zijn.
+Het ``-element omvat een sectie van een HTML-document waarin de gebruiker gegevens kan invoeren en verzenden met interactieve besturingselementen. Er zijn allerlei soorten gebruikersinterface (UI)-besturingselementen die binnen een formulier kunnen worden gebruikt, waarvan de meest voorkomende de ` `- en ``-elementen zijn.
Er zijn veel verschillende [typen](https://developer.mozilla.org/docs/Web/HTML/Element/input) ` `. Om bijvoorbeeld een veld te maken waarin de gebruiker zijn gebruikersnaam kan invoeren, kun je dit gebruiken:
@@ -55,9 +55,9 @@ Het `name`-attribuut wordt gebruikt als de eigenschapsnaam wanneer de formulierg
✅ Merk op dat ` ` een [leeg element](https://developer.mozilla.org/docs/Glossary/Empty_element) is waarop je *geen* bijbehorend sluitend tag moet toevoegen. Je kunt echter de zelfsluitende ` `-notatie gebruiken, maar dit is niet verplicht.
-Het ``-element binnen een formulier is een beetje speciaal. Als je het `type`-attribuut niet specificeert, zal het automatisch de formuliergegevens naar de server verzenden wanneer erop wordt gedrukt. Hier zijn de mogelijke `type`-waarden:
+Het ``-element binnen een formulier is een beetje speciaal. Als je het `type`-attribuut niet specificeert, verzendt het automatisch de formuliergegevens naar de server wanneer erop wordt gedrukt. Hier zijn de mogelijke `type`-waarden:
-- `submit`: De standaardwaarde binnen een ``, de knop activeert de formulierverzendactie.
+- `submit`: De standaard binnen een ` `, de knop triggert de formulierverzendactie.
- `reset`: De knop reset alle formulierbesturingselementen naar hun oorspronkelijke waarden.
- `button`: Wijs geen standaardgedrag toe wanneer op de knop wordt gedrukt. Je kunt er vervolgens aangepaste acties aan toewijzen met JavaScript.
@@ -79,14 +79,14 @@ Laten we beginnen met het toevoegen van een formulier aan de `login`-sjabloon. W
```
-Als je goed kijkt, zie je dat we hier ook een `
`-element hebben toegevoegd. ``-elementen worden gebruikt om een naam toe te voegen aan UI-besturingselementen, zoals ons gebruikersnaamveld. Labels zijn belangrijk voor de leesbaarheid van je formulieren, maar bieden ook extra voordelen:
+Als je goed kijkt, kun je zien dat we hier ook een ``-element hebben toegevoegd. ``-elementen worden gebruikt om een naam toe te voegen aan UI-besturingselementen, zoals ons gebruikersnaamveld. Labels zijn belangrijk voor de leesbaarheid van je formulieren, maar bieden ook extra voordelen:
-- Door een label te koppelen aan een formulierbesturingselement, helpt het gebruikers die gebruik maken van hulpmiddelen (zoals een schermlezer) te begrijpen welke gegevens ze moeten invoeren.
-- Je kunt op het label klikken om direct de focus op het gekoppelde invoerveld te plaatsen, wat het gemakkelijker maakt om te gebruiken op apparaten met een touchscreen.
+- Door een label te koppelen aan een formulierbesturingselement, helpt het gebruikers die assistieve technologieën gebruiken (zoals een schermlezer) te begrijpen welke gegevens ze moeten invoeren.
+- Je kunt op het label klikken om direct de focus op het bijbehorende invoerveld te plaatsen, wat het gemakkelijker maakt om te gebruiken op apparaten met een touchscreen.
> [Toegankelijkheid](https://developer.mozilla.org/docs/Learn/Accessibility/What_is_accessibility) op het web is een zeer belangrijk onderwerp dat vaak over het hoofd wordt gezien. Dankzij [semantische HTML-elementen](https://developer.mozilla.org/docs/Learn/Accessibility/HTML) is het niet moeilijk om toegankelijke inhoud te maken als je ze correct gebruikt. Je kunt [meer lezen over toegankelijkheid](https://developer.mozilla.org/docs/Web/Accessibility) om veelgemaakte fouten te vermijden en een verantwoordelijke ontwikkelaar te worden.
-Nu voegen we een tweede formulier toe voor de registratie, direct onder het vorige:
+Nu voegen we een tweede formulier toe voor de registratie, net onder het vorige:
```html
@@ -104,9 +104,9 @@ Nu voegen we een tweede formulier toe voor de registratie, direct onder het vori
```
-Met het `value`-attribuut kunnen we een standaardwaarde definiëren voor een bepaald invoerveld. Merk ook op dat het invoerveld voor `balance` het type `number` heeft. Ziet het er anders uit dan de andere invoervelden? Probeer ermee te werken.
+Met het `value`-attribuut kunnen we een standaardwaarde definiëren voor een bepaald invoerveld. Merk ook op dat het invoerveld voor `balance` het type `number` heeft. Ziet het er anders uit dan de andere invoervelden? Probeer ermee te interageren.
-✅ Kun je navigeren en werken met de formulieren met alleen een toetsenbord? Hoe zou je dat doen?
+✅ Kun je navigeren en interageren met de formulieren met alleen een toetsenbord? Hoe zou je dat doen?
## Gegevens naar de server verzenden
@@ -114,7 +114,7 @@ Nu we een functionele UI hebben, is de volgende stap om de gegevens naar onze se
Merkte je de verandering in de URL-sectie van je browser op?
-
+
De standaardactie voor een `` is om het formulier naar de huidige server-URL te verzenden met behulp van de [GET-methode](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.3), waarbij de formuliergegevens direct aan de URL worden toegevoegd. Deze methode heeft echter enkele nadelen:
@@ -134,7 +134,7 @@ Voeg `action`- en `method`-eigenschappen toe aan het registratieformulier:
```
-Probeer nu een nieuw account te registreren met je naam. Na het klikken op de *Register*-knop zou je iets als dit moeten zien:
+Probeer nu een nieuw account te registreren met je naam. Na het klikken op de *Register*-knop zou je iets moeten zien zoals dit:

@@ -144,9 +144,9 @@ Als alles goed gaat, zou de server je verzoek moeten beantwoorden met een [JSON]
## Gegevens verzenden zonder de pagina te herladen
-Zoals je waarschijnlijk hebt gemerkt, is er een klein probleem met de aanpak die we zojuist hebben gebruikt: bij het indienen van het formulier verlaten we onze app en wordt de browser doorgestuurd naar de server-URL. We proberen alle paginareloads te vermijden met onze webapp, omdat we een [Single-page application (SPA)](https://en.wikipedia.org/wiki/Single-page_application) maken.
+Zoals je waarschijnlijk hebt gemerkt, is er een klein probleem met de aanpak die we zojuist hebben gebruikt: bij het verzenden van het formulier verlaten we onze app en wordt de browser doorgestuurd naar de server-URL. We proberen alle paginaherlaadacties te vermijden met onze webapp, omdat we een [Single-page application (SPA)](https://en.wikipedia.org/wiki/Single-page_application) maken.
-Om de formuliergegevens naar de server te sturen zonder een paginareload af te dwingen, moeten we JavaScript gebruiken. In plaats van een URL in de `action`-eigenschap van een ` `-element te plaatsen, kun je elke JavaScript-code gebruiken voorafgegaan door de string `javascript:` om een aangepaste actie uit te voeren. Dit betekent ook dat je enkele taken moet implementeren die eerder automatisch door de browser werden uitgevoerd:
+Om de formuliergegevens naar de server te sturen zonder een paginaherlaadactie af te dwingen, moeten we JavaScript-code gebruiken. In plaats van een URL in de `action`-eigenschap van een ` `-element te plaatsen, kun je elke JavaScript-code gebruiken voorafgegaan door de string `javascript:` om een aangepaste actie uit te voeren. Dit betekent ook dat je enkele taken moet implementeren die eerder automatisch door de browser werden uitgevoerd:
- De formuliergegevens ophalen.
- De formuliergegevens converteren en coderen naar een geschikt formaat.
@@ -160,7 +160,7 @@ Vervang de `action` van het registratieformulier door:
```
-Open `app.js` en voeg een nieuwe functie toe genaamd `register`:
+Open `app.js` en voeg een nieuwe functie genaamd `register` toe:
```js
function register() {
@@ -171,7 +171,7 @@ function register() {
}
```
-Hier halen we het formulier-element op met behulp van `getElementById()` en gebruiken we de [`FormData`](https://developer.mozilla.org/docs/Web/API/FormData)-helper om de waarden uit formulierbesturingselementen te halen als een set sleutel/waarde-paren. Vervolgens converteren we de gegevens naar een regulier object met [`Object.fromEntries()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries) en serialiseren we de gegevens uiteindelijk naar [JSON](https://www.json.org/json-en.html), een formaat dat vaak wordt gebruikt voor gegevensuitwisseling op het web.
+Hier halen we het formulier-element op met behulp van `getElementById()` en gebruiken we de [`FormData`](https://developer.mozilla.org/docs/Web/API/FormData)-helper om de waarden uit de formulierbesturingselementen te extraheren als een set sleutel/waarde-paren. Vervolgens converteren we de gegevens naar een regulier object met [`Object.fromEntries()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/fromEntries) en serialiseren we de gegevens uiteindelijk naar [JSON](https://www.json.org/json-en.html), een formaat dat vaak wordt gebruikt voor gegevensuitwisseling op het web.
De gegevens zijn nu klaar om naar de server te worden verzonden. Maak een nieuwe functie genaamd `createAccount`:
@@ -190,7 +190,7 @@ async function createAccount(account) {
}
```
-Wat doet deze functie? Merk eerst het `async`-trefwoord op. Dit betekent dat de functie code bevat die [**asynchroon**](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function) wordt uitgevoerd. Wanneer het samen met het `await`-trefwoord wordt gebruikt, kun je wachten tot asynchrone code wordt uitgevoerd - zoals wachten op de serverreactie hier - voordat je verdergaat.
+Wat doet deze functie? Merk eerst het `async`-trefwoord hier op. Dit betekent dat de functie code bevat die [**asynchroon**](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/async_function) wordt uitgevoerd. Wanneer het samen met het `await`-trefwoord wordt gebruikt, kun je wachten tot asynchrone code wordt uitgevoerd - zoals wachten op de serverrespons hier - voordat je verdergaat.
Hier is een korte video over het gebruik van `async/await`:
@@ -201,9 +201,9 @@ Hier is een korte video over het gebruik van `async/await`:
We gebruiken de `fetch()`-API om JSON-gegevens naar de server te sturen. Deze methode neemt 2 parameters:
- De URL van de server, dus we plaatsen hier `//localhost:5000/api/accounts`.
-- De instellingen van het verzoek. Hier stellen we de methode in op `POST` en geven we de `body` van het verzoek op. Omdat we JSON-gegevens naar de server sturen, moeten we ook de `Content-Type`-header instellen op `application/json`, zodat de server weet hoe de inhoud moet worden geïnterpreteerd.
+- De instellingen van het verzoek. Daar stellen we de methode in op `POST` en geven we de `body` voor het verzoek op. Omdat we JSON-gegevens naar de server sturen, moeten we ook de `Content-Type`-header instellen op `application/json`, zodat de server weet hoe de inhoud moet worden geïnterpreteerd.
-Omdat de server zal reageren op het verzoek met JSON, kunnen we `await response.json()` gebruiken om de JSON-inhoud te parseren en het resulterende object terug te geven. Merk op dat deze methode asynchroon is, dus we gebruiken hier het `await`-trefwoord voordat we verdergaan om ervoor te zorgen dat eventuele fouten tijdens het parseren ook worden opgevangen.
+Omdat de server zal reageren op het verzoek met JSON, kunnen we `await response.json()` gebruiken om de JSON-inhoud te parseren en het resulterende object terug te geven. Merk op dat deze methode asynchroon is, dus we gebruiken hier het `await`-trefwoord voordat we terugkeren om ervoor te zorgen dat eventuele fouten tijdens het parsen ook worden opgevangen.
Voeg nu wat code toe aan de `register`-functie om `createAccount()` aan te roepen:
@@ -217,7 +217,7 @@ Omdat we hier het `await`-trefwoord gebruiken, moeten we het `async`-trefwoord t
async function register() {
```
-Tot slot voegen we wat logs toe om het resultaat te controleren. De uiteindelijke functie zou er zo uit moeten zien:
+Laten we ten slotte wat logs toevoegen om het resultaat te controleren. De uiteindelijke functie zou er zo uit moeten zien:
```js
async function register() {
@@ -242,7 +242,7 @@ Dat was een beetje lang, maar we zijn er! Als je de [ontwikkelaarstools van je b
## Gegevensvalidatie
-Als je probeert een nieuw account te registreren zonder eerst een gebruikersnaam in te stellen, zie je dat de server een fout retourneert met statuscode [400 (Bad Request)](https://developer.mozilla.org/docs/Web/HTTP/Status/400#:~:text=The%20HyperText%20Transfer%20Protocol%20(HTTP,%2C%20or%20deceptive%20request%20routing).).
+Als je probeert een nieuw account te registreren zonder eerst een gebruikersnaam in te stellen, kun je zien dat de server een fout retourneert met statuscode [400 (Bad Request)](https://developer.mozilla.org/docs/Web/HTTP/Status/400#:~:text=The%20HyperText%20Transfer%20Protocol%20(HTTP,%2C%20or%20deceptive%20request%20routing).).
Voordat je gegevens naar een server stuurt, is het een goede gewoonte om [de formuliergegevens te valideren](https://developer.mozilla.org/docs/Learn/Forms/Form_validation) wanneer mogelijk, om ervoor te zorgen dat je een geldig verzoek verzendt. HTML5-formulierbesturingselementen bieden ingebouwde validatie met behulp van verschillende attributen:
@@ -250,8 +250,8 @@ Voordat je gegevens naar een server stuurt, is het een goede gewoonte om [de for
- `minlength` en `maxlength`: definieert het minimum- en maximumaantal tekens in tekstvelden.
- `min` en `max`: definieert de minimum- en maximumwaarde van een numeriek veld.
- `type`: definieert het soort gegevens dat wordt verwacht, zoals `number`, `email`, `file` of [andere ingebouwde typen](https://developer.mozilla.org/docs/Web/HTML/Element/input). Dit attribuut kan ook de visuele weergave van het formulierbesturingselement veranderen.
-- `pattern`: stelt je in staat om een [regular expression](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Regular_Expressions)-patroon te definiëren om te testen of de ingevoerde gegevens geldig zijn of niet.
-> Tip: je kunt de uitstraling van je formulierbesturingselementen aanpassen afhankelijk van of ze geldig of ongeldig zijn door gebruik te maken van de CSS-pseudoklassen `:valid` en `:invalid`.
+- `pattern`: maakt het mogelijk om een [reguliere expressie](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Regular_Expressions)-patroon te definiëren om te testen of de ingevoerde gegevens geldig zijn of niet.
+> Tip: je kunt het uiterlijk van je formulierbesturingselementen aanpassen, afhankelijk van of ze geldig of ongeldig zijn, met behulp van de CSS-pseudoklassen `:valid` en `:invalid`.
### Taak
Er zijn 2 verplichte velden nodig om een geldig nieuw account aan te maken: de gebruikersnaam en valuta. De andere velden zijn optioneel. Werk de HTML van het formulier bij door zowel het `required` attribuut als tekst in het label van het veld toe te voegen zodat:
@@ -280,7 +280,7 @@ Als je nu op de knop *Registreren* drukt en een veld voldoet niet aan een valida

-Validatie zoals deze, die wordt uitgevoerd *voordat* gegevens naar de server worden verzonden, wordt **client-side** validatie genoemd. Maar let op dat het niet altijd mogelijk is om alle controles uit te voeren zonder de gegevens te verzenden. Bijvoorbeeld, we kunnen hier niet controleren of er al een account bestaat met dezelfde gebruikersnaam zonder een verzoek naar de server te sturen. Extra validatie die op de server wordt uitgevoerd, wordt **server-side** validatie genoemd.
+Validatie zoals deze, die wordt uitgevoerd *voordat* er gegevens naar de server worden verzonden, wordt **client-side** validatie genoemd. Maar let op dat het niet altijd mogelijk is om alle controles uit te voeren zonder de gegevens te verzenden. Bijvoorbeeld, we kunnen hier niet controleren of er al een account bestaat met dezelfde gebruikersnaam zonder een verzoek naar de server te sturen. Extra validatie die op de server wordt uitgevoerd, wordt **server-side** validatie genoemd.
Meestal moeten beide worden geïmplementeerd, en hoewel het gebruik van client-side validatie de gebruikerservaring verbetert door directe feedback te geven, is server-side validatie cruciaal om ervoor te zorgen dat de gebruikersgegevens die je verwerkt betrouwbaar en veilig zijn.
@@ -300,7 +300,7 @@ Hier is een voorbeeld van hoe de uiteindelijke inlogpagina eruit kan zien na wat
## Review & Zelfstudie
-Ontwikkelaars zijn erg creatief geworden in hun inspanningen om formulieren te bouwen, vooral wat betreft validatiestrategieën. Leer meer over verschillende formulierstromen door te kijken op [CodePen](https://codepen.com); kun je interessante en inspirerende formulieren vinden?
+Ontwikkelaars zijn erg creatief geworden in hun inspanningen om formulieren te bouwen, vooral wat betreft validatiestrategieën. Leer meer over verschillende formulierflows door te kijken op [CodePen](https://codepen.com); kun je interessante en inspirerende formulieren vinden?
## Opdracht
@@ -309,4 +309,4 @@ Ontwikkelaars zijn erg creatief geworden in hun inspanningen om formulieren te b
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we ons best doen voor nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/7-bank-project/3-data/README.md b/translations/nl/7-bank-project/3-data/README.md
index cf7bd52a..c3975d93 100644
--- a/translations/nl/7-bank-project/3-data/README.md
+++ b/translations/nl/7-bank-project/3-data/README.md
@@ -1,23 +1,23 @@
# Bouw een Bankapp Deel 3: Methoden voor het Ophalen en Gebruiken van Gegevens
-## Pre-Les Quiz
+## Pre-Lecture Quiz
-[Pre-les quiz](https://ff-quizzes.netlify.app/web/quiz/45)
+[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/45)
### Introductie
-Aan de kern van elke webapplicatie staat *data*. Data kan vele vormen aannemen, maar het hoofddoel is altijd om informatie aan de gebruiker te tonen. Met webapps die steeds interactiever en complexer worden, is hoe de gebruiker toegang krijgt tot en interactie heeft met informatie een belangrijk onderdeel van webontwikkeling.
+Aan de kern van elke webapplicatie staat *data*. Data kan vele vormen aannemen, maar het hoofddoel is altijd om informatie aan de gebruiker te tonen. Nu webapps steeds interactiever en complexer worden, is de manier waarop gebruikers toegang krijgen tot en omgaan met informatie een belangrijk onderdeel van webontwikkeling.
-In deze les gaan we bekijken hoe we gegevens asynchroon van een server kunnen ophalen en deze gegevens kunnen gebruiken om informatie op een webpagina weer te geven zonder de HTML opnieuw te laden.
+In deze les gaan we zien hoe we gegevens asynchroon van een server kunnen ophalen en deze gegevens kunnen gebruiken om informatie op een webpagina weer te geven zonder de HTML opnieuw te laden.
### Vereisten
@@ -38,7 +38,7 @@ Traditionele websites werken de weergegeven inhoud bij wanneer de gebruiker een

-Toen webapplicaties complexer en interactiever begonnen te worden, ontstond een nieuwe techniek genaamd [AJAX (Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)). Deze techniek stelt webapps in staat om gegevens asynchroon van een server te verzenden en op te halen met JavaScript, zonder de HTML-pagina opnieuw te laden, wat resulteert in snellere updates en soepelere gebruikersinteracties. Wanneer nieuwe gegevens van de server worden ontvangen, kan de huidige HTML-pagina ook worden bijgewerkt met JavaScript via de [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API. In de loop van de tijd is deze aanpak geëvolueerd tot wat nu een [*Single-Page Application* of *SPA*](https://en.wikipedia.org/wiki/Single-page_application) wordt genoemd.
+Toen webapplicaties complexer en interactiever begonnen te worden, ontstond een nieuwe techniek genaamd [AJAX (Asynchronous JavaScript and XML)](https://en.wikipedia.org/wiki/Ajax_(programming)). Deze techniek stelt webapps in staat om gegevens asynchroon van een server te verzenden en op te halen met JavaScript, zonder de HTML-pagina opnieuw te laden, wat resulteert in snellere updates en soepelere gebruikersinteracties. Wanneer nieuwe gegevens van de server worden ontvangen, kan de huidige HTML-pagina ook worden bijgewerkt met JavaScript via de [DOM](https://developer.mozilla.org/docs/Web/API/Document_Object_Model) API. Na verloop van tijd is deze aanpak geëvolueerd tot wat nu een [*Single-Page Application* of *SPA*](https://en.wikipedia.org/wiki/Single-page_application) wordt genoemd.

@@ -59,7 +59,7 @@ async function login() {
Hier beginnen we met het ophalen van het formulier-element met `getElementById()`, en vervolgens halen we de gebruikersnaam op uit de invoer met `loginForm.user.value`. Elk formuliercontrole-element kan worden benaderd via zijn naam (ingesteld in de HTML met het `name`-attribuut) als een eigenschap van het formulier.
-Net zoals we deden voor de registratie, maken we een andere functie om een serververzoek uit te voeren, maar deze keer om de accountgegevens op te halen:
+Net zoals we deden voor de registratie, maken we een andere functie om een serveraanvraag uit te voeren, maar deze keer om de accountgegevens op te halen:
```js
async function getAccount(user) {
@@ -72,7 +72,7 @@ async function getAccount(user) {
}
```
-We gebruiken de `fetch` API om de gegevens asynchroon van de server op te halen, maar deze keer hebben we geen extra parameters nodig behalve de URL die we willen aanroepen, omdat we alleen gegevens opvragen. Standaard maakt `fetch` een [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP-verzoek, wat precies is wat we hier nodig hebben.
+We gebruiken de `fetch` API om de gegevens asynchroon van de server op te halen, maar deze keer hebben we geen extra parameters nodig behalve de URL die we willen aanroepen, omdat we alleen gegevens opvragen. Standaard maakt `fetch` een [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) HTTP-aanvraag, wat precies is wat we hier nodig hebben.
✅ `encodeURIComponent()` is een functie die speciale tekens voor een URL ontsnapt. Welke problemen zouden we kunnen tegenkomen als we deze functie niet aanroepen en de `user`-waarde direct in de URL gebruiken?
@@ -93,9 +93,9 @@ async function login() {
}
```
-Omdat `getAccount` een asynchrone functie is, moeten we deze combineren met het `await`-keyword om te wachten op het serverresultaat. Zoals bij elk serververzoek, moeten we ook omgaan met foutgevallen. Voor nu voegen we alleen een logbericht toe om de fout weer te geven en komen we hier later op terug.
+Omdat `getAccount` een asynchrone functie is, moeten we deze combineren met het `await`-keyword om te wachten op het serverresultaat. Zoals bij elke serveraanvraag, moeten we ook omgaan met foutgevallen. Voor nu voegen we alleen een logbericht toe om de fout weer te geven en komen we hier later op terug.
-Vervolgens moeten we de gegevens ergens opslaan zodat we ze later kunnen gebruiken om de dashboardinformatie weer te geven. Omdat de `account`-variabele nog niet bestaat, maken we een globale variabele bovenaan ons bestand:
+Vervolgens moeten we de gegevens ergens opslaan zodat we deze later kunnen gebruiken om de dashboardinformatie weer te geven. Aangezien de variabele `account` nog niet bestaat, maken we een globale variabele bovenaan ons bestand:
```js
let account = null;
@@ -118,7 +118,7 @@ account = result;
navigate('/dashboard');
```
-✅ Wist je dat je standaard alleen server-API's kunt aanroepen vanaf hetzelfde domein en dezelfde poort als de webpagina die je bekijkt? Dit is een beveiligingsmechanisme dat door browsers wordt afgedwongen. Maar wacht, onze webapp draait op `localhost:3000` terwijl de server-API draait op `localhost:5000`, waarom werkt het dan? Door gebruik te maken van een techniek genaamd [Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/docs/Web/HTTP/CORS), is het mogelijk om cross-origin HTTP-verzoeken uit te voeren als de server speciale headers toevoegt aan de respons, waardoor uitzonderingen voor specifieke domeinen worden toegestaan.
+✅ Wist je dat je standaard alleen server-API's kunt aanroepen vanaf hetzelfde domein en dezelfde poort als de webpagina die je bekijkt? Dit is een beveiligingsmechanisme dat door browsers wordt afgedwongen. Maar wacht, onze webapp draait op `localhost:3000` terwijl de server-API draait op `localhost:5000`, waarom werkt het dan? Door gebruik te maken van een techniek genaamd [Cross-Origin Resource Sharing (CORS)](https://developer.mozilla.org/docs/Web/HTTP/CORS), is het mogelijk om cross-origin HTTP-aanvragen uit te voeren als de server speciale headers toevoegt aan de respons, waardoor uitzonderingen voor specifieke domeinen worden toegestaan.
> Leer meer over API's door deze [les](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon) te volgen.
@@ -130,11 +130,11 @@ Nu we de gebruikersgegevens hebben, moeten we de bestaande HTML bijwerken om dez
- Met [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) in combinatie met de [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append)-methode kun je een of meer nieuwe kindelementen maken en toevoegen.
-✅ Met de [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML)-eigenschap van een element is het ook mogelijk om de HTML-inhoud te wijzigen, maar deze moet worden vermeden omdat het kwetsbaar is voor [cross-site scripting (XSS)](https://developer.mozilla.org/docs/Glossary/Cross-site_scripting)-aanvallen.
+✅ Met de [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML)-eigenschap van een element is het ook mogelijk om de HTML-inhoud ervan te wijzigen, maar deze moet worden vermeden omdat het kwetsbaar is voor [cross-site scripting (XSS)](https://developer.mozilla.org/docs/Glossary/Cross-site_scripting)-aanvallen.
### Taak
-Voordat we verder gaan met het dashboard-scherm, moeten we nog iets doen op de *login*-pagina. Momenteel, als je probeert in te loggen met een gebruikersnaam die niet bestaat, wordt er een bericht weergegeven in de console, maar voor een normale gebruiker verandert er niets en weet je niet wat er aan de hand is.
+Voordat we verder gaan met het dashboard-scherm, is er nog iets dat we moeten doen op de *login*-pagina. Op dit moment, als je probeert in te loggen met een gebruikersnaam die niet bestaat, wordt er een bericht weergegeven in de console, maar voor een normale gebruiker verandert er niets en weet je niet wat er aan de hand is.
Laten we een placeholder-element toevoegen in het loginformulier waar we indien nodig een foutmelding kunnen weergeven. Een goede plek zou net voor de login-`` zijn:
@@ -178,7 +178,7 @@ Implementeer hetzelfde gedrag voor de fouten in de `register`-functie (vergeet n
## Informatie weergeven op het dashboard
-Met dezelfde technieken die we zojuist hebben gezien, gaan we ook de accountinformatie weergeven op de dashboardpagina.
+Met dezelfde technieken die we zojuist hebben gezien, gaan we ook de accountinformatie op het dashboard weergeven.
Dit is hoe een accountobject dat van de server wordt ontvangen eruitziet:
@@ -214,7 +214,7 @@ We voegen ook een nieuwe sectie toe net eronder om de accountbeschrijving weer t
```
-✅ Omdat de accountbeschrijving functioneert als een titel voor de inhoud eronder, is deze semantisch gemarkeerd als een heading. Leer meer over hoe [heading-structuur](https://www.nomensa.com/blog/2017/how-structure-headings-web-accessibility) belangrijk is voor toegankelijkheid, en bekijk de pagina kritisch om te bepalen wat nog meer een heading zou kunnen zijn.
+✅ Omdat de accountbeschrijving functioneert als een titel voor de inhoud eronder, wordt deze semantisch gemarkeerd als een heading. Leer meer over hoe [heading-structuur](https://www.nomensa.com/blog/2017/how-structure-headings-web-accessibility) belangrijk is voor toegankelijkheid, en bekijk de pagina kritisch om te bepalen wat nog meer een heading zou kunnen zijn.
Vervolgens maken we een nieuwe functie in `app.js` om de placeholder in te vullen:
@@ -297,7 +297,7 @@ function createTransactionRow(transaction) {
}
```
-Deze functie doet precies wat de naam impliceert: met behulp van de sjabloon die we eerder hebben gemaakt, maakt het een nieuwe tabelrij en vult het de inhoud in met transactiegegevens. We gaan dit gebruiken in onze `updateDashboard()`-functie om de tabel in te vullen:
+Deze functie doet precies wat de naam aangeeft: met behulp van de sjabloon die we eerder hebben gemaakt, maakt het een nieuwe tabelrij en vult deze in met transactiegegevens. We gaan dit gebruiken in onze `updateDashboard()`-functie om de tabel in te vullen:
```js
const transactionsRows = document.createDocumentFragment();
@@ -320,7 +320,7 @@ function updateElement(id, textOrNode) {
}
```
-We gebruiken de [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append)-methode omdat deze het mogelijk maakt om zowel tekst als [DOM Nodes](https://developer.mozilla.org/docs/Web/API/Node) aan een ouderelement toe te voegen, wat perfect is voor al onze gebruiksscenario's.
+We gebruiken de [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append)-methode omdat deze het mogelijk maakt om zowel tekst als [DOM Nodes](https://developer.mozilla.org/docs/Web/API/Node) aan een ouderelement te koppelen, wat perfect is voor al onze gebruiksscenario's.
Als je probeert in te loggen met het `test` account, zou je nu een transactielijst op het dashboard moeten zien 🎉.
---
@@ -344,4 +344,4 @@ Hier is een voorbeeld van een gestylede dashboardpagina:
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/7-bank-project/4-state-management/README.md b/translations/nl/7-bank-project/4-state-management/README.md
index 1b7cc193..5ef5c956 100644
--- a/translations/nl/7-bank-project/4-state-management/README.md
+++ b/translations/nl/7-bank-project/4-state-management/README.md
@@ -1,29 +1,29 @@
# Bouw een Bankapp Deel 4: Concepten van State Management
-## Pre-Lecture Quiz
+## Quiz vóór de les
-[Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/47)
+[Quiz vóór de les](https://ff-quizzes.netlify.app/web/quiz/47)
### Introductie
-Naarmate een webapplicatie groeit, wordt het een uitdaging om alle datastromen bij te houden. Welke code haalt de data op, welke pagina gebruikt het, waar en wanneer moet het worden bijgewerkt... het is gemakkelijk om te eindigen met rommelige code die moeilijk te onderhouden is. Dit geldt vooral wanneer je data moet delen tussen verschillende pagina's van je app, zoals gebruikersgegevens. Het concept van *state management* heeft altijd bestaan in allerlei soorten programma's, maar nu webapps steeds complexer worden, is het een belangrijk punt om over na te denken tijdens de ontwikkeling.
+Naarmate een webapplicatie groeit, wordt het steeds moeilijker om alle datastromen bij te houden. Welke code haalt de data op, welke pagina gebruikt het, waar en wanneer moet het worden bijgewerkt... Het is makkelijk om te eindigen met rommelige code die moeilijk te onderhouden is. Dit geldt vooral wanneer je data moet delen tussen verschillende pagina's van je app, zoals gebruikersgegevens. Het concept van *state management* heeft altijd bestaan in allerlei soorten programma's, maar nu webapps steeds complexer worden, is het een belangrijk punt om over na te denken tijdens de ontwikkeling.
-In dit laatste deel bekijken we de app die we hebben gebouwd opnieuw om te heroverwegen hoe de state wordt beheerd, zodat ondersteuning voor browserverversing op elk moment mogelijk is en gegevens behouden blijven tussen gebruikerssessies.
+In dit laatste deel bekijken we de app die we hebben gebouwd opnieuw om te heroverwegen hoe de state wordt beheerd. Dit maakt ondersteuning voor browserverversingen op elk moment mogelijk en zorgt ervoor dat gegevens behouden blijven tussen gebruikerssessies.
### Vereisten
-Je moet het [data ophalen](../3-data/README.md) deel van de webapp hebben voltooid voor deze les. Je moet ook [Node.js](https://nodejs.org) installeren en de [server API](../api/README.md) lokaal draaien, zodat je accountgegevens kunt beheren.
+Je moet het [data ophalen](../3-data/README.md) deel van de webapp hebben voltooid voor deze les. Je moet ook [Node.js](https://nodejs.org) installeren en de [server-API](../api/README.md) lokaal uitvoeren, zodat je accountgegevens kunt beheren.
-Je kunt testen of de server correct draait door dit commando in een terminal uit te voeren:
+Je kunt controleren of de server correct werkt door dit commando in een terminal uit te voeren:
```sh
curl http://localhost:5000/api
@@ -32,30 +32,30 @@ curl http://localhost:5000/api
---
-## Herzie state management
+## State management heroverwegen
-In de [vorige les](../3-data/README.md) hebben we een basisconcept van state in onze app geïntroduceerd met de globale `account`-variabele die de bankgegevens bevat van de momenteel ingelogde gebruiker. Onze huidige implementatie heeft echter enkele gebreken. Probeer de pagina te verversen terwijl je op het dashboard bent. Wat gebeurt er?
+In de [vorige les](../3-data/README.md) hebben we een basisconcept van state in onze app geïntroduceerd met de globale `account`-variabele die de bankgegevens bevat van de momenteel ingelogde gebruiker. Onze huidige implementatie heeft echter enkele tekortkomingen. Probeer de pagina te verversen terwijl je op het dashboard bent. Wat gebeurt er?
-Er zijn 3 problemen met de huidige code:
+Er zijn drie problemen met de huidige code:
-- De state wordt niet behouden, omdat een browserverversing je terugbrengt naar de inlogpagina.
-- Er zijn meerdere functies die de state wijzigen. Naarmate de app groeit, kan dit het moeilijk maken om de wijzigingen bij te houden en is het gemakkelijk om te vergeten iets bij te werken.
-- De state wordt niet opgeruimd, dus wanneer je op *Uitloggen* klikt, zijn de accountgegevens er nog steeds, zelfs als je op de inlogpagina bent.
+- De state wordt niet behouden, want een browserverversing brengt je terug naar de inlogpagina.
+- Er zijn meerdere functies die de state wijzigen. Naarmate de app groeit, kan dit het moeilijk maken om de wijzigingen bij te houden en is het makkelijk om te vergeten iets bij te werken.
+- De state wordt niet opgeruimd, dus wanneer je op *Uitloggen* klikt, blijven de accountgegevens aanwezig, zelfs als je op de inlogpagina bent.
-We zouden onze code kunnen bijwerken om deze problemen één voor één aan te pakken, maar dat zou meer code duplicatie creëren en de app complexer en moeilijker te onderhouden maken. Of we zouden een paar minuten kunnen pauzeren en onze strategie heroverwegen.
+We zouden onze code kunnen bijwerken om deze problemen één voor één aan te pakken, maar dat zou leiden tot meer code duplicatie en de app complexer en moeilijker te onderhouden maken. Of we kunnen even pauzeren en onze strategie heroverwegen.
> Welke problemen proberen we hier echt op te lossen?
[State management](https://en.wikipedia.org/wiki/State_management) draait om het vinden van een goede aanpak om deze twee specifieke problemen op te lossen:
- Hoe houden we de datastromen in een app begrijpelijk?
-- Hoe houden we de state data altijd in sync met de gebruikersinterface (en vice versa)?
+- Hoe zorgen we ervoor dat de state data altijd synchroon loopt met de gebruikersinterface (en vice versa)?
-Als je deze hebt aangepakt, zijn eventuele andere problemen die je hebt mogelijk al opgelost of gemakkelijker op te lossen. Er zijn veel mogelijke benaderingen om deze problemen op te lossen, maar we kiezen voor een veelgebruikte oplossing die bestaat uit **het centraliseren van de data en de manieren om deze te wijzigen**. De datastromen zouden er als volgt uitzien:
+Als je deze problemen hebt aangepakt, zijn andere problemen die je mogelijk hebt, of al opgelost, of makkelijker op te lossen. Er zijn veel mogelijke benaderingen om deze problemen op te lossen, maar wij kiezen voor een veelgebruikte oplossing die bestaat uit **het centraliseren van de data en de manieren om deze te wijzigen**. De datastromen zouden er als volgt uitzien:
-
+
-> We behandelen hier niet het deel waarin de data automatisch de weergave bijwerkt, omdat dit gekoppeld is aan meer geavanceerde concepten van [Reactive Programming](https://en.wikipedia.org/wiki/Reactive_programming). Dit is een goed onderwerp om verder in te duiken als je er klaar voor bent.
+> We behandelen hier niet het deel waarin de data automatisch de weergave bijwerkt, omdat dit gekoppeld is aan meer geavanceerde concepten van [Reactive Programming](https://en.wikipedia.org/wiki/Reactive_programming). Dit is een goed vervolgonderwerp als je een diepere duik wilt nemen.
✅ Er zijn veel bibliotheken met verschillende benaderingen voor state management, waarbij [Redux](https://redux.js.org) een populaire optie is. Bekijk de concepten en patronen die worden gebruikt, omdat dit vaak een goede manier is om te leren welke potentiële problemen je kunt tegenkomen in grote webapps en hoe deze kunnen worden opgelost.
@@ -75,31 +75,31 @@ let state = {
};
```
-Het idee is om *alle appdata te centraliseren* in een enkel state-object. We hebben nu alleen `account` in de state, dus het verandert niet veel, maar het creëert een pad voor toekomstige uitbreidingen.
+Het idee is om *alle app-data te centraliseren* in een enkel state-object. Voor nu hebben we alleen `account` in de state, dus het verandert niet veel, maar het creëert een basis voor toekomstige uitbreidingen.
-We moeten ook de functies bijwerken die het gebruiken. Vervang in de functies `register()` en `login()` `account = ...` door `state.account = ...`;
+We moeten ook de functies die het gebruiken bijwerken. Vervang in de functies `register()` en `login()` `account = ...` door `state.account = ...`;
-Voeg aan het begin van de `updateDashboard()`-functie deze regel toe:
+Voeg aan het begin van de functie `updateDashboard()` deze regel toe:
```js
const account = state.account;
```
-Deze refactoring op zichzelf heeft niet veel verbeteringen gebracht, maar het idee was om de basis te leggen voor de volgende wijzigingen.
+Deze refactoring op zichzelf brengt niet veel verbeteringen, maar het idee was om de basis te leggen voor de volgende wijzigingen.
-## Houd dataveranderingen bij
+## Gegevenswijzigingen bijhouden
-Nu we het `state`-object hebben geïntroduceerd om onze data op te slaan, is de volgende stap om de updates te centraliseren. Het doel is om het gemakkelijker te maken om eventuele wijzigingen en wanneer ze plaatsvinden bij te houden.
+Nu we het `state`-object hebben geïntroduceerd om onze data op te slaan, is de volgende stap om de updates te centraliseren. Het doel is om het makkelijker te maken om wijzigingen en wanneer ze plaatsvinden bij te houden.
-Om te voorkomen dat wijzigingen worden aangebracht in het `state`-object, is het ook een goede gewoonte om het te beschouwen als [*immutable*](https://en.wikipedia.org/wiki/Immutable_object), wat betekent dat het helemaal niet kan worden gewijzigd. Dit betekent ook dat je een nieuw state-object moet maken als je iets wilt wijzigen. Door dit te doen, bouw je een bescherming tegen mogelijk ongewenste [bijwerkingen](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) en open je mogelijkheden voor nieuwe functies in je app, zoals het implementeren van ongedaan maken/herhalen, terwijl het ook gemakkelijker wordt om te debuggen. Je zou bijvoorbeeld elke wijziging in de state kunnen loggen en een geschiedenis van de wijzigingen kunnen bijhouden om de bron van een bug te begrijpen.
+Om te voorkomen dat wijzigingen worden aangebracht in het `state`-object, is het ook een goede gewoonte om het te beschouwen als [*immutable*](https://en.wikipedia.org/wiki/Immutable_object), wat betekent dat het helemaal niet kan worden gewijzigd. Dit betekent ook dat je een nieuw state-object moet maken als je iets wilt wijzigen. Door dit te doen, bouw je een bescherming tegen mogelijk ongewenste [bijwerkingen](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) en open je mogelijkheden voor nieuwe functies in je app, zoals het implementeren van ongedaan maken/herhalen, terwijl het ook makkelijker wordt om te debuggen. Bijvoorbeeld, je zou elke wijziging in de state kunnen loggen en een geschiedenis van de wijzigingen kunnen bijhouden om de bron van een bug te begrijpen.
-In JavaScript kun je [`Object.freeze()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) gebruiken om een immutable versie van een object te maken. Als je probeert wijzigingen aan te brengen in een immutable object, wordt er een uitzondering gegenereerd.
+In JavaScript kun je [`Object.freeze()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze) gebruiken om een onveranderlijke versie van een object te maken. Als je probeert wijzigingen aan te brengen in een onveranderlijk object, wordt er een uitzondering gegenereerd.
-✅ Weet je het verschil tussen een *shallow* en een *deep* immutable object? Je kunt er [hier](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze) meer over lezen.
+✅ Weet je het verschil tussen een *oppervlakkig* en een *diep* onveranderlijk object? Je kunt erover lezen [hier](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze#What_is_shallow_freeze).
### Taak
-Laten we een nieuwe `updateState()`-functie maken:
+Laten we een nieuwe functie `updateState()` maken:
```js
function updateState(property, newData) {
@@ -110,7 +110,7 @@ function updateState(property, newData) {
}
```
-In deze functie maken we een nieuw state-object en kopiëren we data van de vorige state met behulp van de [*spread (`...`) operator*](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals). Vervolgens overschrijven we een specifieke eigenschap van het state-object met de nieuwe data met behulp van de [bracket notatie](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties) `[property]` voor toewijzing. Ten slotte vergrendelen we het object om wijzigingen te voorkomen met `Object.freeze()`. We hebben momenteel alleen de `account`-eigenschap opgeslagen in de state, maar met deze aanpak kun je zoveel eigenschappen toevoegen als je nodig hebt.
+In deze functie maken we een nieuw state-object en kopiëren we data van de vorige state met behulp van de [*spread (`...`) operator*](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals). Vervolgens overschrijven we een specifieke eigenschap van het state-object met de nieuwe data met behulp van de [bracket notatie](https://developer.mozilla.org/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties) `[property]` voor toewijzing. Tot slot vergrendelen we het object om wijzigingen te voorkomen met `Object.freeze()`. Voor nu hebben we alleen de `account`-eigenschap opgeslagen in de state, maar met deze aanpak kun je zoveel eigenschappen toevoegen als je nodig hebt.
We zullen ook de `state`-initialisatie bijwerken om ervoor te zorgen dat de initiële state ook bevroren is:
@@ -132,7 +132,7 @@ Doe hetzelfde met de `login`-functie, vervang `state.account = data;` door:
updateState('account', data);
```
-We nemen nu de kans om het probleem op te lossen waarbij accountgegevens niet worden gewist wanneer de gebruiker op *Uitloggen* klikt.
+We grijpen nu de kans om het probleem op te lossen waarbij accountgegevens niet worden gewist wanneer de gebruiker op *Uitloggen* klikt.
Maak een nieuwe functie `logout()`:
@@ -149,29 +149,29 @@ Probeer een nieuw account te registreren, uit te loggen en opnieuw in te loggen
> Tip: je kunt alle state-wijzigingen bekijken door `console.log(state)` toe te voegen onderaan `updateState()` en de console in de ontwikkelaarstools van je browser te openen.
-## Bewaar de state
+## De state behouden
-De meeste webapps moeten data opslaan om correct te kunnen werken. Alle kritieke data wordt meestal opgeslagen in een database en benaderd via een server-API, zoals de gebruikersaccountgegevens in ons geval. Maar soms is het ook interessant om bepaalde data op te slaan in de client-app die in je browser draait, voor een betere gebruikerservaring of om de laadtijd te verbeteren.
+De meeste webapps moeten gegevens behouden om correct te kunnen werken. Alle kritieke gegevens worden meestal opgeslagen in een database en benaderd via een server-API, zoals de gebruikersaccountgegevens in ons geval. Maar soms is het ook interessant om bepaalde gegevens op te slaan in de client-app die in je browser draait, voor een betere gebruikerservaring of om de laadtijd te verbeteren.
-Wanneer je data in je browser wilt opslaan, zijn er een paar belangrijke vragen die je jezelf moet stellen:
+Wanneer je gegevens in je browser wilt opslaan, zijn er een paar belangrijke vragen die je jezelf moet stellen:
- *Zijn de gegevens gevoelig?* Je moet vermijden om gevoelige gegevens op de client op te slaan, zoals gebruikerswachtwoorden.
- *Hoe lang moet je deze gegevens bewaren?* Wil je deze gegevens alleen voor de huidige sessie gebruiken of wil je dat ze voor altijd worden opgeslagen?
-Er zijn meerdere manieren om informatie op te slaan in een webapp, afhankelijk van wat je wilt bereiken. Je kunt bijvoorbeeld de URL's gebruiken om een zoekopdracht op te slaan en deze deelbaar te maken tussen gebruikers. Je kunt ook [HTTP-cookies](https://developer.mozilla.org/docs/Web/HTTP/Cookies) gebruiken als de gegevens moeten worden gedeeld met de server, zoals [authenticatie](https://en.wikipedia.org/wiki/Authentication) informatie.
+Er zijn meerdere manieren om informatie op te slaan in een webapp, afhankelijk van wat je wilt bereiken. Bijvoorbeeld, je kunt de URL's gebruiken om een zoekopdracht op te slaan en deze deelbaar te maken tussen gebruikers. Je kunt ook [HTTP-cookies](https://developer.mozilla.org/docs/Web/HTTP/Cookies) gebruiken als de gegevens moeten worden gedeeld met de server, zoals [authenticatie](https://en.wikipedia.org/wiki/Authentication) informatie.
Een andere optie is om een van de vele browser-API's te gebruiken voor het opslaan van gegevens. Twee daarvan zijn bijzonder interessant:
-- [`localStorage`](https://developer.mozilla.org/docs/Web/API/Window/localStorage): een [Key/Value store](https://en.wikipedia.org/wiki/Key%E2%80%93value_database) waarmee je gegevens kunt opslaan die specifiek zijn voor de huidige website en die bewaard blijven tussen verschillende sessies. De opgeslagen gegevens verlopen nooit.
-- [`sessionStorage`](https://developer.mozilla.org/docs/Web/API/Window/sessionStorage): dit werkt hetzelfde als `localStorage`, behalve dat de gegevens die erin zijn opgeslagen worden gewist wanneer de sessie eindigt (wanneer de browser wordt gesloten).
+- [`localStorage`](https://developer.mozilla.org/docs/Web/API/Window/localStorage): een [Key/Value store](https://en.wikipedia.org/wiki/Key%E2%80%93value_database) waarmee je gegevens specifiek voor de huidige website kunt behouden over verschillende sessies. De opgeslagen gegevens verlopen nooit.
+- [`sessionStorage`](https://developer.mozilla.org/docs/Web/API/Window/sessionStorage): dit werkt hetzelfde als `localStorage`, behalve dat de opgeslagen gegevens worden gewist wanneer de sessie eindigt (wanneer de browser wordt gesloten).
-Merk op dat beide API's alleen [strings](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) toestaan. Als je complexe objecten wilt opslaan, moet je deze serialiseren naar het [JSON](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON)-formaat met behulp van [`JSON.stringify()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify).
+Merk op dat beide API's alleen [strings](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String) kunnen opslaan. Als je complexe objecten wilt opslaan, moet je ze serialiseren naar het [JSON](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON)-formaat met [`JSON.stringify()`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify).
-✅ Als je een webapp wilt maken die niet met een server werkt, is het ook mogelijk om een database op de client te maken met de [`IndexedDB` API](https://developer.mozilla.org/docs/Web/API/IndexedDB_API). Dit is gereserveerd voor geavanceerde use-cases of als je een aanzienlijke hoeveelheid gegevens moet opslaan, omdat het complexer is om te gebruiken.
+✅ Als je een webapp wilt maken die niet met een server werkt, is het ook mogelijk om een database op de client te maken met behulp van de [`IndexedDB` API](https://developer.mozilla.org/docs/Web/API/IndexedDB_API). Dit is gereserveerd voor geavanceerde gebruiksscenario's of als je een aanzienlijke hoeveelheid gegevens moet opslaan, omdat het complexer is om te gebruiken.
### Taak
-We willen dat onze gebruikers ingelogd blijven totdat ze expliciet op de knop *Uitloggen* klikken, dus we gebruiken `localStorage` om de accountgegevens op te slaan. Laten we eerst een sleutel definiëren die we zullen gebruiken om onze gegevens op te slaan.
+We willen dat onze gebruikers ingelogd blijven totdat ze expliciet op de *Uitloggen*-knop klikken, dus we gebruiken `localStorage` om de accountgegevens op te slaan. Laten we eerst een sleutel definiëren die we zullen gebruiken om onze gegevens op te slaan.
```js
const storageKey = 'savedAccount';
@@ -183,9 +183,9 @@ Voeg vervolgens deze regel toe aan het einde van de `updateState()`-functie:
localStorage.setItem(storageKey, JSON.stringify(state.account));
```
-Hiermee worden de gebruikersaccountgegevens opgeslagen en altijd up-to-date gehouden, omdat we eerder al onze state-updates hebben gecentraliseerd. Dit is waar we beginnen te profiteren van al onze eerdere refactors 🙂.
+Hiermee worden de gebruikersaccountgegevens opgeslagen en altijd up-to-date gehouden, omdat we eerder alle state-updates hebben gecentraliseerd. Dit is waar we beginnen te profiteren van al onze eerdere refactors 🙂.
-Omdat de gegevens worden opgeslagen, moeten we er ook voor zorgen dat ze worden hersteld wanneer de app wordt geladen. Aangezien we meer initialisatiecode beginnen te krijgen, is het misschien een goed idee om een nieuwe `init`-functie te maken, die ook onze eerdere code onderaan `app.js` bevat:
+Omdat de gegevens worden opgeslagen, moeten we ook zorgen voor het herstellen ervan wanneer de app wordt geladen. Aangezien we meer initialisatiecode beginnen te krijgen, is het misschien een goed idee om een nieuwe `init`-functie te maken, die ook onze eerdere code onderaan `app.js` bevat:
```js
function init() {
@@ -202,15 +202,15 @@ function init() {
init();
```
-Hier halen we de opgeslagen gegevens op, en als er gegevens zijn, werken we de state dienovereenkomstig bij. Het is belangrijk om dit *voor* het bijwerken van de route te doen, omdat er mogelijk code is die afhankelijk is van de state tijdens de pagina-update.
+Hier halen we de opgeslagen gegevens op, en als er gegevens zijn, werken we de state dienovereenkomstig bij. Het is belangrijk om dit *voordat* de route wordt bijgewerkt te doen, omdat er mogelijk code is die afhankelijk is van de state tijdens de pagina-update.
-We kunnen ook de *Dashboard*-pagina de standaardpagina van onze applicatie maken, aangezien we nu de accountgegevens opslaan. Als er geen gegevens worden gevonden, zorgt het dashboard ervoor dat er wordt omgeleid naar de *Login*-pagina. Vervang in `updateRoute()` de fallback `return navigate('/login');` door `return navigate('/dashboard');`.
+We kunnen ook de *Dashboard*-pagina de standaardpagina van onze applicatie maken, aangezien we nu de accountgegevens behouden. Als er geen gegevens worden gevonden, zorgt het dashboard er toch voor dat je wordt doorgestuurd naar de *Inlog*-pagina. Vervang in `updateRoute()` de fallback `return navigate('/login');` door `return navigate('/dashboard');`.
Log nu in op de app en probeer de pagina te verversen. Je zou op het dashboard moeten blijven. Met die update hebben we al onze initiële problemen opgelost...
-## Vernieuw de gegevens
+## De gegevens verversen
-...Maar we hebben misschien ook een nieuw probleem gecreëerd. Oeps!
+...Maar we hebben mogelijk ook een nieuw probleem gecreëerd. Oeps!
Ga naar het dashboard met het `test`-account en voer vervolgens dit commando uit in een terminal om een nieuwe transactie te maken:
@@ -223,7 +223,7 @@ curl --request POST \
Probeer nu de dashboardpagina in de browser te verversen. Wat gebeurt er? Zie je de nieuwe transactie?
-De state wordt oneindig bewaard dankzij de `localStorage`, maar dat betekent ook dat deze nooit wordt bijgewerkt totdat je uitlogt en opnieuw inlogt!
+De state wordt dankzij de `localStorage` voor onbepaalde tijd behouden, maar dat betekent ook dat deze nooit wordt bijgewerkt totdat je uitlogt en opnieuw inlogt!
Een mogelijke strategie om dit op te lossen is om de accountgegevens elke keer dat het dashboard wordt geladen opnieuw te laden, om verouderde gegevens te voorkomen.
@@ -273,22 +273,22 @@ Probeer nu het dashboard te verversen, het zou de bijgewerkte accountgegevens mo
## 🚀 Uitdaging
-Nu we de accountgegevens elke keer dat het dashboard wordt geladen opnieuw laden, denk je dat we nog steeds *alle accountgegevens* moeten opslaan?
+Nu we de accountgegevens elke keer dat het dashboard wordt geladen opnieuw ophalen, denk je dat we nog steeds *alle accountgegevens* moeten behouden?
-Probeer samen te werken om te veranderen wat wordt opgeslagen en geladen vanuit `localStorage`, zodat alleen wordt opgenomen wat absoluut nodig is voor de app om te werken.
+Probeer samen te werken om te wijzigen wat wordt opgeslagen en geladen vanuit `localStorage`, zodat alleen wordt opgeslagen wat absoluut noodzakelijk is voor de app om te werken.
-## Post-Lecture Quiz
-[Post-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/48)
+## Quiz na de les
-## Opdracht
+[Quiz na de les](https://ff-quizzes.netlify.app/web/quiz/48)
-[Implementeer de dialoog "Transactie toevoegen"](assignment.md)
+## Opdracht
+[Implementeer "Transactie toevoegen" dialoogvenster](assignment.md)
Hier is een voorbeeldresultaat na het voltooien van de opdracht:
-
+
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/8-code-editor/1-using-a-code-editor/README.md b/translations/nl/8-code-editor/1-using-a-code-editor/README.md
index 934d63a7..060ceb16 100644
--- a/translations/nl/8-code-editor/1-using-a-code-editor/README.md
+++ b/translations/nl/8-code-editor/1-using-a-code-editor/README.md
@@ -1,8 +1,8 @@
+
+
+
## Leerdoelen
In deze les leer je:
@@ -25,7 +36,7 @@ Voordat je begint, moet je een account aanmaken bij [GitHub](https://github.com)
### Introductie
-Een code-editor is een essentieel hulpmiddel voor het schrijven van programma's en het samenwerken aan bestaande codeprojecten. Zodra je de basisprincipes van een editor begrijpt en weet hoe je de functies kunt gebruiken, kun je deze toepassen bij het schrijven van code.
+Een code-editor is een essentieel hulpmiddel voor het schrijven van programma's en het samenwerken aan bestaande codeprojecten. Zodra je de basisprincipes van een editor begrijpt en weet hoe je de functies kunt gebruiken, kun je ze toepassen bij het schrijven van code.
## Aan de slag met VSCode.dev
@@ -35,7 +46,7 @@ Zodra het is geladen, zou het er ongeveer zo uit moeten zien:

-Er zijn drie hoofdsecties, van links naar rechts:
+Er zijn drie hoofdsecties, beginnend vanaf de meest linkse kant en bewegend naar rechts:
1. De _activiteitsbalk_ met enkele pictogrammen, zoals het vergrootglas 🔎, het tandwiel ⚙️, en een paar andere.
2. De uitgebreide activiteitsbalk die standaard de _Explorer_ toont, ook wel de _zijbalk_ genoemd.
@@ -43,7 +54,7 @@ Er zijn drie hoofdsecties, van links naar rechts:
Klik op elk van de pictogrammen om een ander menu weer te geven. Als je klaar bent, klik je op de _Explorer_ zodat je terug bent waar je begon.
-Wanneer je begint met het maken of wijzigen van code, gebeurt dit in het grootste gebied aan de rechterkant. Je gebruikt dit gebied ook om bestaande code te bekijken, wat je hierna zult doen.
+Wanneer je begint met het maken van code of het wijzigen van bestaande code, gebeurt dit in het grootste gebied aan de rechterkant. Je gebruikt dit gebied ook om bestaande code te visualiseren, wat je hierna zult doen.
## Een GitHub-repository openen
@@ -55,11 +66,11 @@ Gebruik de editor zelf om een externe repository te openen. Als je naar [VSCode.

-Je kunt ook de opdrachtpalet gebruiken. De opdrachtpalet is een invoerveld waarin je een woord kunt typen dat deel uitmaakt van een opdracht of actie om de juiste opdracht te vinden en uit te voeren. Gebruik het menu linksboven, selecteer _View_, en kies vervolgens _Command Palette_, of gebruik de volgende sneltoets: Ctrl-Shift-P (op MacOS is dat Command-Shift-P).
+Je kunt ook de opdrachtpalet gebruiken. De opdrachtpalet is een invoerveld waarin je een woord kunt typen dat deel uitmaakt van een opdracht of actie om de juiste opdracht te vinden en uit te voeren. Gebruik het menu linksboven, selecteer vervolgens _View_, en kies daarna _Command Palette_, of gebruik de volgende sneltoets: Ctrl-Shift-P (op MacOS is dat Command-Shift-P).

-Wanneer het menu opent, typ je _open remote repository_ en selecteer je de eerste optie. Meerdere repositories waar je deel van uitmaakt of die je onlangs hebt geopend, worden weergegeven. Je kunt ook een volledige GitHub-URL gebruiken om er een te selecteren. Gebruik de volgende URL en plak deze in het vak:
+Wanneer het menu opent, typ je _open remote repository_, en selecteer je de eerste optie. Meerdere repositories waar je deel van uitmaakt of die je onlangs hebt geopend, worden weergegeven. Je kunt ook een volledige GitHub-URL gebruiken om er een te selecteren. Gebruik de volgende URL en plak deze in het veld:
```
https://github.com/microsoft/Web-Dev-For-Beginners
@@ -69,15 +80,15 @@ https://github.com/microsoft/Web-Dev-For-Beginners
### 2. Met de URL
-Je kunt ook direct een URL gebruiken om een repository te laden. Bijvoorbeeld, de volledige URL voor de huidige repository is [https://github.com/microsoft/Web-Dev-For-Beginners](https://github.com/microsoft/Web-Dev-For-Beginners), maar je kunt het GitHub-domein vervangen door `VSCode.dev/github` en de repository direct laden. De resulterende URL zou zijn: [https://vscode.dev/github/microsoft/Web-Dev-For-Beginners](https://vscode.dev/github/microsoft/Web-Dev-For-Beginners).
+Je kunt ook direct een URL gebruiken om een repository te laden. Bijvoorbeeld, de volledige URL voor de huidige repository is [https://github.com/microsoft/Web-Dev-For-Beginners](https://github.com/microsoft/Web-Dev-For-Beginners), maar je kunt het GitHub-domein vervangen door `VSCode.dev/github` en de repository direct laden. De resulterende URL zou zijn [https://vscode.dev/github/microsoft/Web-Dev-For-Beginners](https://vscode.dev/github/microsoft/Web-Dev-For-Beginners).
## Bestanden bewerken
-Zodra je de repository hebt geopend in de browser/vscode.dev, is de volgende stap het maken van updates of wijzigingen in het project.
+Zodra je de repository in de browser/vscode.dev hebt geopend, is de volgende stap het maken van updates of wijzigingen aan het project.
### 1. Een nieuw bestand maken
-Je kunt een bestand maken in een bestaande map of in de hoofdmap. Om een nieuw bestand te maken, open je een locatie/map waar je het bestand wilt opslaan en selecteer je het pictogram _'New file ...'_ op de activiteitsbalk _(links)_, geef het een naam en druk op enter.
+Je kunt een bestand maken in een bestaande map of in de hoofdmap. Om een nieuw bestand te maken, open je een locatie/map waar je het bestand wilt opslaan en selecteer je het pictogram _'Nieuw bestand ...'_ op de activiteitsbalk _(links)_, geef het een naam en druk op enter.

@@ -91,17 +102,17 @@ Selecteer een bestand om het te openen in het codegebied, maak je wijzigingen en
Wanneer je klaar bent met het bijwerken van je project, selecteer je het pictogram _`source control`_, dat alle nieuwe wijzigingen bevat die je hebt aangebracht in je repository.
-Om de wijzigingen te bekijken die je hebt aangebracht, selecteer je de bestanden in de map `Changes` in de uitgebreide activiteitsbalk. Dit opent een 'Working Tree' waarin je visueel de wijzigingen kunt zien die je hebt aangebracht in het bestand. Rood toont een verwijdering in het project, terwijl groen een toevoeging aangeeft.
+Om de wijzigingen te bekijken die je hebt aangebracht, selecteer je de bestanden in de map `Changes` in de uitgebreide activiteitsbalk. Dit opent een 'Working Tree' waarin je visueel de wijzigingen kunt zien die je hebt aangebracht in het bestand. Rood geeft een verwijdering aan, terwijl groen een toevoeging aangeeft.

-Als je tevreden bent met de wijzigingen die je hebt aangebracht, hover je over de map `Changes` en klik je op de knop `+` om de wijzigingen te stage-en. Stage-en betekent simpelweg dat je je wijzigingen voorbereidt om ze te committen naar GitHub.
+Als je tevreden bent met de wijzigingen die je hebt aangebracht, beweeg je over de map `Changes` en klik je op de knop `+` om de wijzigingen te stage-en. Stage-en betekent simpelweg dat je je wijzigingen voorbereidt om ze te committen naar GitHub.
-Als je echter niet tevreden bent met sommige wijzigingen en ze wilt verwijderen, hover je over de map `Changes` en selecteer je het pictogram `undo`.
+Als je echter niet tevreden bent met sommige wijzigingen en ze wilt verwijderen, beweeg je over de map `Changes` en selecteer je het pictogram `undo`.
Typ vervolgens een `commit message` _(Een beschrijving van de wijziging die je hebt aangebracht in het project)_, klik op het `check-pictogram` om te committen en je wijzigingen te pushen.
-Wanneer je klaar bent met werken aan je project, selecteer je het `hamburgermenu-pictogram` linksboven om terug te keren naar de repository op github.com.
+Wanneer je klaar bent met werken aan je project, selecteer je het pictogram `hamburgermenu` linksboven om terug te keren naar de repository op github.com.

@@ -109,7 +120,7 @@ Wanneer je klaar bent met werken aan je project, selecteer je het `hamburgermenu
Het installeren van extensies in VSCode stelt je in staat om nieuwe functies en opties voor een aangepaste ontwikkelomgeving toe te voegen aan je editor om je ontwikkelworkflow te verbeteren. Deze extensies helpen je ook ondersteuning toe te voegen voor meerdere programmeertalen en zijn vaak generieke extensies of taalgebaseerde extensies.
-Om door de lijst van alle beschikbare extensies te bladeren, klik je op het pictogram _`Extensions`_ op de activiteitsbalk en begin je de naam van de extensie te typen in het tekstveld met het label _'Search Extensions in Marketplace'_.
+Om door de lijst van alle beschikbare extensies te bladeren, klik je op het pictogram _`Extensies`_ op de activiteitsbalk en begin je de naam van de extensie te typen in het tekstveld met het label _'Search Extensions in Marketplace'_.
Je ziet een lijst met extensies, elk met **de naam van de extensie, de naam van de uitgever, een korte beschrijving, het aantal downloads** en **een sterbeoordeling**.

@@ -128,7 +139,7 @@ Je kunt op de _blauwe install-knop_ klikken in de uitgebreide activiteitsbalk om
### 2. Extensies aanpassen
-Na het installeren van de extensie moet je mogelijk het gedrag aanpassen en personaliseren op basis van je voorkeuren. Om dit te doen, selecteer je het pictogram Extensions, en deze keer verschijnt je extensie in de map _Installed_. Klik op het _**tandwielpictogram**_ en navigeer naar _Extensions Setting_.
+Na het installeren van de extensie moet je mogelijk het gedrag aanpassen en personaliseren op basis van je voorkeuren. Om dit te doen, selecteer je het pictogram Extensies, en deze keer verschijnt je extensie in de map _Installed_, klik op het _**tandwielpictogram**_ en navigeer naar _Extensions Setting_.

@@ -136,11 +147,11 @@ Na het installeren van de extensie moet je mogelijk het gedrag aanpassen en pers
Na het installeren en gebruiken van je extensie biedt vscode.dev opties om je extensie te beheren op basis van verschillende behoeften. Bijvoorbeeld, je kunt ervoor kiezen om:
-- **Uitschakelen:** _(Je schakelt een extensie tijdelijk uit wanneer je deze niet meer nodig hebt, maar wilt deze niet volledig verwijderen.)_
+- **Uitschakelen:** _(Je schakelt een extensie tijdelijk uit wanneer je deze niet meer nodig hebt, maar niet volledig wilt verwijderen)_
- Selecteer de geïnstalleerde extensie in de uitgebreide activiteitsbalk > klik op het tandwielpictogram > selecteer 'Disable' of 'Disable (Workspace)' **OF** open de extensie in het codegebied en klik op de blauwe Disable-knop.
+ Selecteer de geïnstalleerde extensie in de uitgebreide activiteitsbalk > klik op het tandwielpictogram > selecteer 'Disable' of 'Disable (Workspace)' **OF** Open de extensie in het codegebied en klik op de blauwe Disable-knop.
-- **Verwijderen:** Selecteer de geïnstalleerde extensie in de uitgebreide activiteitsbalk > klik op het tandwielpictogram > selecteer 'Uninstall' **OF** open de extensie in het codegebied en klik op de blauwe Uninstall-knop.
+- **Verwijderen:** Selecteer de geïnstalleerde extensie in de uitgebreide activiteitsbalk > klik op het tandwielpictogram > selecteer 'Uninstall' **OF** Open de extensie in het codegebied en klik op de blauwe Uninstall-knop.
---
@@ -148,6 +159,11 @@ Na het installeren en gebruiken van je extensie biedt vscode.dev opties om je ex
[Maak een cv-website met vscode.dev](https://github.com/microsoft/Web-Dev-For-Beginners/blob/main/8-code-editor/1-using-a-code-editor/assignment.md)
+
+
## Review & Zelfstudie
Lees meer over [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web?WT.mc_id=academic-0000-alfredodeza) en enkele van de andere functies ervan.
@@ -155,4 +171,4 @@ Lees meer over [VSCode.dev](https://code.visualstudio.com/docs/editor/vscode-web
---
**Disclaimer**:
-Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in zijn oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor cruciale informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor eventuele misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, dient u zich ervan bewust te zijn dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/8-code-editor/1-using-a-code-editor/assignment.md b/translations/nl/8-code-editor/1-using-a-code-editor/assignment.md
index 6b753734..a534078a 100644
--- a/translations/nl/8-code-editor/1-using-a-code-editor/assignment.md
+++ b/translations/nl/8-code-editor/1-using-a-code-editor/assignment.md
@@ -1,8 +1,8 @@
- Schrijf een korte tekst over jezelf!
+ Schrijf een stukje over jezelf!
WERKERVARING
@@ -154,7 +154,7 @@ https://github.com/your-username/my-resume
Vervang de _placeholdertekst_ in de html-code door je cv-details.
-**Stap 5:** Beweeg over de My-Resume-map, klik op het `New File ...`-icoon en maak 2 nieuwe bestanden in je project: `style.css` en `codeswing.json`.
+**Stap 5:** Beweeg over de My-Resume-map, klik op het pictogram `New File ...` en maak 2 nieuwe bestanden in je project: `style.css` en `codeswing.json`.
**Stap 6:** Open het `style.css`-bestand, plak de onderstaande code en sla op.
@@ -230,23 +230,23 @@ Vervang de _placeholdertekst_ in de html-code door je cv-details.
**Stap 7:** Installeer de `Codeswing-extensie` om de cv-website te visualiseren in het codegebied.
-Klik op het _`Extensions`_-icoon in de activiteitenbalk en typ Codeswing. Klik op de _blauwe install-knop_ in de uitgebreide activiteitenbalk om te installeren of gebruik de install-knop die verschijnt in het codegebied zodra je de extensie selecteert om aanvullende informatie te laden. Direct na het installeren van de extensie zie je veranderingen in je project 😃
+Klik op het pictogram _`Extensions`_ in de activiteitenbalk en typ Codeswing. Klik op de _blauwe install-knop_ in de uitgebreide activiteitenbalk om te installeren of gebruik de install-knop die verschijnt in het codegebied zodra je de extensie selecteert om aanvullende informatie te laden. Direct na het installeren van de extensie zie je veranderingen in je project 😃.

-Dit is wat je ziet op je scherm nadat je de extensie hebt geïnstalleerd.
+Dit is wat je op je scherm ziet nadat je de extensie hebt geïnstalleerd.

-Als je tevreden bent met de veranderingen die je hebt aangebracht, beweeg over de `Changes`-map en klik op de `+`-knop om de veranderingen te stage-en.
+Als je tevreden bent met de veranderingen die je hebt aangebracht, beweeg over de map `Changes` en klik op de `+`-knop om de veranderingen te stage.
-Typ een commit-bericht _(Een beschrijving van de verandering die je hebt aangebracht in het project)_ en commit je veranderingen door op de `check` te klikken. Zodra je klaar bent met je project, selecteer je het hamburgermenu-icoon linksboven om terug te keren naar de repository op GitHub.
+Typ een commitbericht _(Een beschrijving van de verandering die je hebt aangebracht in het project)_ en commit je veranderingen door op de `check` te klikken. Zodra je klaar bent met je project, selecteer je het hamburgermenu-icoon linksboven om terug te keren naar de repository op GitHub.
Gefeliciteerd 🎉 Je hebt zojuist je cv-website gemaakt met vscode.dev in een paar stappen.
## 🚀 Uitdaging
-Open een remote repository waar je toestemming hebt om wijzigingen aan te brengen en werk enkele bestanden bij. Probeer vervolgens een nieuwe branch te maken met je wijzigingen en maak een Pull Request.
+Open een externe repository waar je toestemming hebt om wijzigingen aan te brengen en werk enkele bestanden bij. Probeer vervolgens een nieuwe branch te maken met je wijzigingen en maak een Pull Request.
+# Chatproject
+
+Dit chatproject laat zien hoe je een Chat Assistent kunt bouwen met behulp van GitHub Models.
+
+Hier is hoe het eindproject eruitziet:
+
+
+
+
+
+Wat context: het bouwen van chatassistenten met generatieve AI is een geweldige manier om te beginnen met leren over AI. In deze les leer je hoe je generatieve AI integreert in een webapplicatie. Laten we beginnen.
+
+## Verbinden met generatieve AI
+
+Voor de backend gebruiken we GitHub Models. Dit is een geweldige service waarmee je gratis AI kunt gebruiken. Ga naar de playground en haal de code op die overeenkomt met de door jou gekozen backend-taal. Hier is hoe het eruitziet op [GitHub Models Playground](https://github.com/marketplace/models/azure-openai/gpt-4o-mini/playground)
+
+
+
+
+
+Zoals gezegd, selecteer het tabblad "Code" en je gekozen runtime.
+
+
+
+
+
+In dit geval kiezen we Python, wat betekent dat we deze code selecteren:
+
+```python
+"""Run this model in Python
+
+> pip install openai
+"""
+import os
+from openai import OpenAI
+
+# To authenticate with the model you will need to generate a personal access token (PAT) in your GitHub settings.
+# Create your PAT token by following instructions here: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens
+client = OpenAI(
+ base_url="https://models.github.ai/inference",
+ api_key=os.environ["GITHUB_TOKEN"],
+)
+
+response = client.chat.completions.create(
+ messages=[
+ {
+ "role": "system",
+ "content": "",
+ },
+ {
+ "role": "user",
+ "content": "What is the capital of France?",
+ }
+ ],
+ model="openai/gpt-4o-mini",
+ temperature=1,
+ max_tokens=4096,
+ top_p=1
+)
+
+print(response.choices[0].message.content)
+```
+
+Laten we deze code een beetje opschonen zodat het herbruikbaar is:
+
+```python
+def call_llm(prompt: str, system_message: str):
+ response = client.chat.completions.create(
+ messages=[
+ {
+ "role": "system",
+ "content": system_message,
+ },
+ {
+ "role": "user",
+ "content": prompt,
+ }
+ ],
+ model="openai/gpt-4o-mini",
+ temperature=1,
+ max_tokens=4096,
+ top_p=1
+ )
+
+ return response.choices[0].message.content
+```
+
+Met deze functie `call_llm` kunnen we nu een prompt en een systeemprompt doorgeven, en de functie retourneert het resultaat.
+
+### AI Assistent aanpassen
+
+Als je de AI-assistent wilt aanpassen, kun je specificeren hoe je wilt dat deze zich gedraagt door de systeemprompt als volgt in te vullen:
+
+```python
+call_llm("Tell me about you", "You're Albert Einstein, you only know of things in the time you were alive")
+```
+
+## Exposeer het via een Web API
+
+Geweldig, we hebben het AI-gedeelte klaar. Laten we nu kijken hoe we dit kunnen integreren in een Web API. Voor de Web API kiezen we Flask, maar elk webframework zou geschikt moeten zijn. Hier is de code:
+
+```python
+# api.py
+from flask import Flask, request, jsonify
+from llm import call_llm
+from flask_cors import CORS
+
+app = Flask(__name__)
+CORS(app) # * example.com
+
+@app.route("/", methods=["GET"])
+def index():
+ return "Welcome to this API. Call POST /hello with 'message': 'my message' as JSON payload"
+
+
+@app.route("/hello", methods=["POST"])
+def hello():
+ # get message from request body { "message": "do this taks for me" }
+ data = request.get_json()
+ message = data.get("message", "")
+
+ response = call_llm(message, "You are a helpful assistant.")
+ return jsonify({
+ "response": response
+ })
+
+if __name__ == "__main__":
+ app.run(host="0.0.0.0", port=5000)
+```
+
+Hier maken we een Flask API en definiëren we een standaardroute "/" en "/chat". De laatste is bedoeld om door onze frontend gebruikt te worden om vragen door te geven.
+
+Om *llm.py* te integreren, moeten we het volgende doen:
+
+- Importeer de `call_llm` functie:
+
+ ```python
+ from llm import call_llm
+ from flask import Flask, request
+ ```
+
+- Roep het aan vanuit de "/chat" route:
+
+ ```python
+ @app.route("/hello", methods=["POST"])
+ def hello():
+ # get message from request body { "message": "do this taks for me" }
+ data = request.get_json()
+ message = data.get("message", "")
+
+ response = call_llm(message, "You are a helpful assistant.")
+ return jsonify({
+ "response": response
+ })
+ ```
+
+ Hier parseren we het binnenkomende verzoek om de eigenschap `message` uit de JSON-body te halen. Vervolgens roepen we de LLM aan met deze oproep:
+
+ ```python
+ response = call_llm(message, "You are a helpful assistant")
+
+ # return the response as JSON
+ return jsonify({
+ "response": response
+ })
+ ```
+
+Geweldig, nu hebben we gedaan wat nodig is.
+
+### Cors configureren
+
+We moeten vermelden dat we iets als CORS hebben ingesteld, cross-origin resource sharing. Dit betekent dat, omdat onze backend en frontend op verschillende poorten draaien, we de frontend moeten toestaan om de backend aan te roepen. Er is een stukje code in *api.py* dat dit instelt:
+
+```python
+from flask_cors import CORS
+
+app = Flask(__name__)
+CORS(app) # * example.com
+```
+
+Op dit moment is het ingesteld om "*" toe te staan, wat alle origins betekent, en dat is een beetje onveilig. We zouden dit moeten beperken zodra we naar productie gaan.
+
+## Voer je project uit
+
+Oké, we hebben *llm.py* en *api.py*. Hoe kunnen we dit laten werken met een backend? Er zijn twee dingen die we moeten doen:
+
+- Installeer afhankelijkheden:
+
+ ```sh
+ cd backend
+ python -m venv venv
+ source ./venv/bin/activate
+
+ pip install openai flask flask-cors openai
+ ```
+
+- Start de API:
+
+ ```sh
+ python api.py
+ ```
+
+ Als je in Codespaces werkt, moet je naar Ports gaan in het onderste deel van de editor, er met de rechtermuisknop op klikken en "Port Visibility" selecteren en "Public" kiezen.
+
+### Werk aan een frontend
+
+Nu we een API hebben draaien, laten we een frontend maken. Een minimale frontend die we stap voor stap zullen verbeteren. Maak in een *frontend* map het volgende:
+
+```text
+backend/
+frontend/
+index.html
+app.js
+styles.css
+```
+
+Laten we beginnen met **index.html**:
+
+```html
+
+
+
+
+
+
+
+
+ Send
+
+
+
+
+```
+
+Dit hierboven is het absolute minimum dat je nodig hebt om een chatvenster te ondersteunen. Het bestaat uit een tekstvak waarin berichten worden weergegeven, een invoerveld om het bericht te typen en een knop om je bericht naar de backend te sturen. Laten we nu naar de JavaScript kijken in *app.js*.
+
+**app.js**
+
+```js
+// app.js
+
+(function(){
+ // 1. set up elements
+ const messages = document.getElementById("messages");
+ const form = document.getElementById("form");
+ const input = document.getElementById("input");
+
+ const BASE_URL = "change this";
+ const API_ENDPOINT = `${BASE_URL}/hello`;
+
+ // 2. create a function that talks to our backend
+ async function callApi(text) {
+ const response = await fetch(API_ENDPOINT, {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ message: text })
+ });
+ let json = await response.json();
+ return json.response;
+ }
+
+ // 3. add response to our textarea
+ function appendMessage(text, role) {
+ const el = document.createElement("div");
+ el.className = `message ${role}`;
+ el.innerHTML = text;
+ messages.appendChild(el);
+ }
+
+ // 4. listen to submit events
+ form.addEventListener("submit", async(e) => {
+ e.preventDefault();
+ // someone clicked the button in the form
+
+ // get input
+ const text = input.value.trim();
+
+ appendMessage(text, "user")
+
+ // reset it
+ input.value = '';
+
+ const reply = await callApi(text);
+
+ // add to messages
+ appendMessage(reply, "assistant");
+
+ })
+})();
+```
+
+Laten we de code per sectie doornemen:
+
+- 1) Hier halen we een referentie op naar alle elementen die we later in de code zullen gebruiken.
+- 2) In deze sectie maken we een functie die de ingebouwde `fetch` methode gebruikt om onze backend aan te roepen.
+- 3) `appendMessage` helpt bij het toevoegen van reacties en wat jij als gebruiker typt.
+- 4) Hier luisteren we naar het submit-event en lezen we het invoerveld uit, plaatsen het bericht van de gebruiker in het tekstvak, roepen de API aan en renderen de reactie in het tekstvak.
+
+Laten we nu naar de styling kijken. Hier kun je helemaal losgaan en het eruit laten zien zoals je wilt, maar hier zijn wat suggesties:
+
+**styles.css**
+
+```
+.message {
+ background: #222;
+ box-shadow: 0 0 0 10px orange;
+ padding: 10px:
+ margin: 5px;
+}
+
+.message.user {
+ background: blue;
+}
+
+.message.assistant {
+ background: grey;
+}
+```
+
+Met deze drie klassen kun je berichten verschillend stylen, afhankelijk van of ze van de assistent of van jou als gebruiker komen. Als je inspiratie wilt, bekijk dan de map `solution/frontend/styles.css`.
+
+### Basis-URL wijzigen
+
+Er was één ding dat we hier niet hebben ingesteld, en dat was `BASE_URL`. Dit is niet bekend totdat je backend is gestart. Om dit in te stellen:
+
+- Als je de API lokaal draait, moet het iets zijn als `http://localhost:5000`.
+- Als je in Codespaces draait, zou het er ongeveer zo uit moeten zien: "[name]app.github.dev".
+
+## Opdracht
+
+Maak je eigen map *project* met inhoud zoals hieronder:
+
+```text
+project/
+ frontend/
+ index.html
+ app.js
+ styles.css
+ backend/
+ api.py
+ llm.py
+```
+
+Kopieer de inhoud van wat hierboven is uitgelegd, maar voel je vrij om het naar eigen wens aan te passen.
+
+## Oplossing
+
+[Oplossing](./solution/README.md)
+
+## Bonus
+
+Probeer de persoonlijkheid van de AI-assistent te veranderen. Wanneer je `call_llm` aanroept in *api.py*, kun je het tweede argument aanpassen naar wat je wilt, bijvoorbeeld:
+
+```python
+call_llm(message, "You are Captain Picard")
+```
+
+Pas ook de CSS en tekst aan naar jouw smaak, dus doe wijzigingen in *index.html* en *styles.css*.
+
+## Samenvatting
+
+Geweldig, je hebt geleerd hoe je vanaf nul een persoonlijke assistent kunt maken met behulp van AI. We hebben dit gedaan met GitHub Models, een backend in Python en een frontend in HTML, CSS en JavaScript.
+
+## Instellen met Codespaces
+
+- Navigeer naar: [Web Dev For Beginners repo](https://github.com/microsoft/Web-Dev-For-Beginners)
+- Maak een nieuwe repo vanuit een template (zorg ervoor dat je bent ingelogd op GitHub) in de rechterbovenhoek:
+
+ 
+
+- Zodra je in je repo bent, maak een Codespace:
+
+ 
+
+ Dit zou een omgeving moeten starten waarin je nu kunt werken.
+
+---
+
+**Disclaimer**:
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/9-chat-project/solution/README.md b/translations/nl/9-chat-project/solution/README.md
new file mode 100644
index 00000000..55d13a47
--- /dev/null
+++ b/translations/nl/9-chat-project/solution/README.md
@@ -0,0 +1,55 @@
+
+# Code uitvoeren
+
+## Instellen
+
+Maak een virtuele omgeving aan
+
+```sh
+cd backend
+python -m venv venv
+source ./venv/bin/activate
+```
+
+## Installeer afhankelijkheden
+
+```sh
+pip install openai flask flask-cors
+```
+
+## Start API
+
+```sh
+python api.py
+```
+
+## Start frontend
+
+Zorg ervoor dat je in de frontend-map staat
+
+Zoek *app.js*, wijzig `BASE_URL` naar de URL van je backend
+
+Start het
+
+```
+npx http-server -p 8000
+```
+
+Probeer een bericht in de chat te typen, je zou een reactie moeten zien (mits je dit in een Codespace uitvoert of een toegangstoken hebt ingesteld).
+
+## Stel toegangstoken in (als je dit niet in een Codespace uitvoert)
+
+Zie [Set up PAT](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)
+
+---
+
+**Disclaimer**:
+Dit document is vertaald met behulp van de AI-vertalingsservice [Co-op Translator](https://github.com/Azure/co-op-translator). Hoewel we streven naar nauwkeurigheid, willen we u erop wijzen dat geautomatiseerde vertalingen fouten of onnauwkeurigheden kunnen bevatten. Het originele document in de oorspronkelijke taal moet worden beschouwd als de gezaghebbende bron. Voor kritieke informatie wordt professionele menselijke vertaling aanbevolen. Wij zijn niet aansprakelijk voor misverstanden of verkeerde interpretaties die voortvloeien uit het gebruik van deze vertaling.
\ No newline at end of file
diff --git a/translations/nl/README.md b/translations/nl/README.md
index ec2ed215..76b0c375 100644
--- a/translations/nl/README.md
+++ b/translations/nl/README.md
@@ -1,8 +1,8 @@
# Создание доступных веб-страниц
-
+
> Скетчноут от [Tomomi Imura](https://twitter.com/girlie_mac)
-## Викторина перед лекцией
-[Викторина перед лекцией](https://ff-quizzes.netlify.app/web/quiz/5)
+## Викторина перед лекцией
+[Викторина перед лекцией](https://ff-quizzes.netlify.app/web/)
-> Сила Интернета заключается в его универсальности. Доступ для всех, независимо от ограничений, является важным аспектом.
->
-> \- Сэр Тимоти Бернерс-Ли, директор W3C и изобретатель Всемирной паутины
+> Сила Интернета заключается в его универсальности. Доступ для всех, независимо от ограничений, является важным аспектом.
+>
+> \- Сэр Тимоти Бернерс-Ли, директор W3C и изобретатель Всемирной паутины
Эта цитата прекрасно подчеркивает важность создания доступных веб-сайтов. Приложение, которое недоступно для всех, по определению является исключающим. Как веб-разработчики, мы всегда должны учитывать доступность. Если сосредоточиться на этом с самого начала, вы будете на правильном пути к тому, чтобы обеспечить доступность ваших страниц для всех. В этом уроке вы узнаете о инструментах, которые помогут вам убедиться, что ваши веб-ресурсы доступны, и о том, как создавать с учетом доступности.
@@ -31,25 +31,25 @@ CO_OP_TRANSLATOR_METADATA:
[Читатели экрана](https://en.wikipedia.org/wiki/Screen_reader) — это популярные клиенты для людей с нарушениями зрения. Как мы уделяем время тому, чтобы браузер правильно передавал информацию, которую мы хотим поделиться, так же важно убедиться, что читатель экрана делает то же самое.
-В своей базовой форме читатель экрана будет озвучивать страницу сверху вниз. Если ваша страница состоит только из текста, читатель передаст информацию аналогично браузеру. Однако веб-страницы редко состоят только из текста; они содержат ссылки, графику, цвета и другие визуальные компоненты. Необходимо позаботиться о том, чтобы эта информация правильно воспринималась читателем экрана.
+В своей базовой форме читатель экрана будет озвучивать страницу сверху вниз. Если ваша страница состоит только из текста, читатель передаст информацию аналогично браузеру. Однако веб-страницы редко бывают исключительно текстовыми; они содержат ссылки, графику, цвета и другие визуальные компоненты. Необходимо позаботиться о том, чтобы эта информация правильно воспринималась читателем экрана.
-Каждый веб-разработчик должен ознакомиться с работой читателя экрана. Как было отмечено выше, это клиент, которым будут пользоваться ваши пользователи. Точно так же, как вы знакомы с работой браузера, вы должны изучить, как работает читатель экрана. К счастью, читатели экрана встроены в большинство операционных систем.
+Каждый веб-разработчик должен ознакомиться с работой читателя экрана. Как было отмечено выше, это клиент, которым будут пользоваться ваши пользователи. Так же, как вы знакомы с работой браузера, вы должны изучить, как работает читатель экрана. К счастью, читатели экрана встроены в большинство операционных систем.
-Некоторые браузеры также имеют встроенные инструменты и расширения, которые могут озвучивать текст или предоставлять базовые функции навигации, например [эти инструменты для браузера Edge, ориентированные на доступность](https://support.microsoft.com/help/4000734/microsoft-edge-accessibility-features). Эти инструменты также важны для доступности, но работают иначе, чем читатели экрана, и их не следует путать с инструментами тестирования читателей экрана.
+Некоторые браузеры также имеют встроенные инструменты и расширения, которые могут озвучивать текст или предоставлять базовые функции навигации, например [эти инструменты доступности для браузера Edge](https://support.microsoft.com/help/4000734/microsoft-edge-accessibility-features). Эти инструменты также важны для доступности, но работают иначе, чем читатели экрана, и их не следует путать с инструментами тестирования читателей экрана.
✅ Попробуйте читатель экрана и инструмент озвучивания текста в браузере. В Windows по умолчанию включен [Narrator](https://support.microsoft.com/windows/complete-guide-to-narrator-e4397a0d-ef4f-b386-d8ae-c172f109bdb1/?WT.mc_id=academic-77807-sagibbon), а также можно установить [JAWS](https://webaim.org/articles/jaws/) и [NVDA](https://www.nvaccess.org/about-nvda/). В macOS и iOS по умолчанию установлен [VoiceOver](https://support.apple.com/guide/voiceover/welcome/10).
### Увеличение
-Еще одним инструментом, часто используемым людьми с нарушениями зрения, является увеличение. Самый простой тип увеличения — это статическое увеличение, управляемое через `Control + плюс (+)` или уменьшение разрешения экрана. Этот тип увеличения изменяет размер всей страницы, поэтому использование [адаптивного дизайна](https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Responsive_Design) важно для обеспечения хорошего пользовательского опыта при увеличении.
+Еще одним инструментом, часто используемым людьми с нарушениями зрения, является увеличение. Самый простой тип увеличения — статическое увеличение, управляемое через `Control + плюс (+)` или уменьшение разрешения экрана. Этот тип увеличения изменяет размер всей страницы, поэтому использование [адаптивного дизайна](https://developer.mozilla.org/docs/Learn/CSS/CSS_layout/Responsive_Design) важно для обеспечения хорошего пользовательского опыта при увеличении.
-Другой тип увеличения использует специализированное программное обеспечение для увеличения одной области экрана и панорамирования, как при использовании настоящей лупы. В Windows встроен [Magnifier](https://support.microsoft.com/windows/use-magnifier-to-make-things-on-the-screen-easier-to-see-414948ba-8b1c-d3bd-8615-0e5e32204198), а [ZoomText](https://www.freedomscientific.com/training/zoomtext/getting-started/) — это стороннее программное обеспечение для увеличения с большим количеством функций и широкой базой пользователей. В macOS и iOS есть встроенное программное обеспечение для увеличения под названием [Zoom](https://www.apple.com/accessibility/mac/vision/).
+Другой тип увеличения использует специализированное программное обеспечение для увеличения одной области экрана и панорамирования, как при использовании настоящей лупы. В Windows встроен [Magnifier](https://support.microsoft.com/windows/use-magnifier-to-make-things-on-the-screen-easier-to-see-414948ba-8b1c-d3bd-8615-0e5e32204198), а [ZoomText](https://www.freedomscientific.com/training/zoomtext/getting-started/) — это стороннее программное обеспечение с большим количеством функций и широкой базой пользователей. В macOS и iOS есть встроенное программное обеспечение для увеличения под названием [Zoom](https://www.apple.com/accessibility/mac/vision/).
### Проверка контраста
Цвета на веб-сайтах должны быть тщательно подобраны, чтобы удовлетворить потребности пользователей с дальтонизмом или тех, кто испытывает трудности с восприятием цветов с низким контрастом.
-✅ Проверьте веб-сайт, который вам нравится, на использование цветов с помощью расширения для браузера, например [проверки контраста цветов WCAG](https://microsoftedge.microsoft.com/addons/detail/wcag-color-contrast-check/idahaggnlnekelhgplklhfpchbfdmkjp?hl=en-US&WT.mc_id=academic-77807-sagibbon). Что вы узнали?
+✅ Проверьте веб-сайт, который вам нравится, на использование цветов с помощью расширения браузера, например [проверки контраста цветов WCAG](https://microsoftedge.microsoft.com/addons/detail/wcag-color-contrast-check/idahaggnlnekelhgplklhfpchbfdmkjp?hl=en-US&WT.mc_id=academic-77807-sagibbon). Что вы узнали?
### Lighthouse
@@ -69,37 +69,37 @@ CO_OP_TRANSLATOR_METADATA:
### Безопасные цветовые палитры
-Люди видят мир по-разному, и это касается цветов. При выборе цветовой схемы для вашего сайта вы должны убедиться, что она доступна для всех. Один отличный [инструмент для создания цветовых палитр — Color Safe](http://colorsafe.co/).
+Люди видят мир по-разному, и это включает восприятие цветов. При выборе цветовой схемы для вашего сайта вы должны убедиться, что она доступна для всех. Один отличный [инструмент для генерации цветовых палитр — Color Safe](http://colorsafe.co/).
-✅ Найдите веб-сайт, который имеет серьезные проблемы с использованием цветов. Почему?
+✅ Найдите веб-сайт, который вызывает проблемы из-за использования цветов. Почему?
### Используйте правильный HTML
С помощью CSS и JavaScript можно сделать любой элемент похожим на любой тип управления. `` можно использовать для создания ``, а `` может стать гиперссылкой. Хотя это может считаться более простым для стилизации, это ничего не передает читателю экрана. Используйте соответствующий HTML при создании элементов управления на странице. Если вам нужна гиперссылка, используйте ``. Использование правильного HTML для правильного элемента управления называется использованием семантического HTML.
-✅ Перейдите на любой веб-сайт и посмотрите, правильно ли дизайнеры и разработчики используют HTML. Можете ли вы найти кнопку, которая должна быть ссылкой? Подсказка: щелкните правой кнопкой мыши и выберите "Просмотреть исходный код страницы" в вашем браузере, чтобы посмотреть исходный код.
+✅ Перейдите на любой веб-сайт и посмотрите, правильно ли дизайнеры и разработчики используют HTML. Можете ли вы найти кнопку, которая должна быть ссылкой? Подсказка: щелкните правой кнопкой мыши и выберите "Просмотреть исходный код страницы" в вашем браузере, чтобы увидеть исходный код.
-### Создавайте описательную иерархию заголовков
+### Создайте описательную иерархию заголовков
-Пользователи читателей экрана [сильно зависят от заголовков](https://webaim.org/projects/screenreadersurvey8/#finding) для поиска информации и навигации по странице. Написание описательного содержания заголовков и использование семантических тегов заголовков важны для создания легко навигационного сайта для пользователей читателей экрана.
+Пользователи читателей экрана [сильно зависят от заголовков](https://webaim.org/projects/screenreadersurvey8/#finding) для поиска информации и навигации по странице. Написание описательного содержания заголовков и использование семантических тегов заголовков важны для создания легко навигационной страницы для пользователей читателей экрана.
### Используйте хорошие визуальные подсказки
-CSS предоставляет полный контроль над внешним видом любого элемента на странице. Вы можете создать текстовые поля без контура или гиперссылки без подчеркивания. К сожалению, удаление этих подсказок может усложнить задачу для тех, кто зависит от них, чтобы распознать тип элемента управления.
+CSS предоставляет полный контроль над внешним видом любого элемента на странице. Вы можете создать текстовые поля без контура или гиперссылки без подчеркивания. К сожалению, удаление этих подсказок может затруднить распознавание типа элемента управления для тех, кто зависит от них.
## Важность текста ссылок
-Гиперссылки являются основой навигации в Интернете. Поэтому обеспечение того, чтобы читатель экрана мог правильно читать ссылки, позволяет всем пользователям перемещаться по вашему сайту.
+Гиперссылки являются основой навигации в Интернете. Поэтому важно, чтобы читатель экрана мог правильно читать ссылки, чтобы все пользователи могли перемещаться по вашему сайту.
### Читатели экрана и ссылки
-Как и ожидалось, читатели экрана читают текст ссылок так же, как любой другой текст на странице. С учетом этого, текст, показанный ниже, может показаться вполне приемлемым.
+Как и ожидалось, читатели экрана читают текст ссылок так же, как они читают любой другой текст на странице. С учетом этого, приведенный ниже текст может показаться вполне приемлемым.
-> Маленький пингвин, иногда называемый фейри-пингвином, является самым маленьким пингвином в мире. [Нажмите здесь](https://en.wikipedia.org/wiki/Little_penguin) для получения дополнительной информации.
+> Маленький пингвин, иногда называемый фейским пингвином, является самым маленьким пингвином в мире. [Нажмите здесь](https://en.wikipedia.org/wiki/Little_penguin) для получения дополнительной информации.
-> Маленький пингвин, иногда называемый фейри-пингвином, является самым маленьким пингвином в мире. Посетите https://en.wikipedia.org/wiki/Little_penguin для получения дополнительной информации.
+> Маленький пингвин, иногда называемый фейским пингвином, является самым маленьким пингвином в мире. Посетите https://en.wikipedia.org/wiki/Little_penguin для получения дополнительной информации.
-> **NOTE** Как вы скоро узнаете, **никогда** не создавайте ссылки, которые выглядят как приведенные выше.
+> **NOTE** Как вы скоро узнаете, **никогда** не создавайте ссылки, которые выглядят, как приведенные выше.
Помните, что читатели экрана — это другой интерфейс, отличающийся от браузеров, с другим набором функций.
@@ -109,19 +109,19 @@ CSS предоставляет полный контроль над внешни
### Проблема с "нажмите здесь"
-Читатели экрана также могут читать только гиперссылки на странице, так же как зрячий человек сканирует страницу в поисках ссылок. Если текст ссылки всегда "нажмите здесь", пользователь услышит только "нажмите здесь, нажмите здесь, нажмите здесь, нажмите здесь, нажмите здесь, ...". Все ссылки теперь неразличимы друг от друга.
+Читатели экрана также могут читать только гиперссылки на странице, так же как человек с нормальным зрением сканирует страницу в поисках ссылок. Если текст ссылки всегда "нажмите здесь", пользователь услышит только "нажмите здесь, нажмите здесь, нажмите здесь, нажмите здесь, нажмите здесь, ...". Все ссылки теперь неразличимы друг от друга.
### Хороший текст ссылок
Хороший текст ссылок кратко описывает, что находится на другой стороне ссылки. В приведенном выше примере, где речь идет о маленьких пингвинах, ссылка ведет на страницу Википедии о данном виде. Фраза *маленькие пингвины* идеально подходит для текста ссылки, так как она ясно дает понять, что пользователь узнает, если нажмет на ссылку — о маленьких пингвинах.
-> [Маленький пингвин](https://en.wikipedia.org/wiki/Little_penguin), иногда называемый фейри-пингвином, является самым маленьким пингвином в мире.
+> [Маленький пингвин](https://en.wikipedia.org/wiki/Little_penguin), иногда называемый фейским пингвином, является самым маленьким пингвином в мире.
-✅ Проведите несколько минут в Интернете, чтобы найти страницы, использующие неясные стратегии ссылок. Сравните их с другими, лучше организованными сайтами. Что вы узнали?
+✅ Проведите несколько минут в Интернете, чтобы найти страницы, использующие неудачные стратегии ссылок. Сравните их с другими, более удачно связанными сайтами. Что вы узнали?
#### Заметки для поисковых систем
-Дополнительным бонусом за обеспечение доступности вашего сайта для всех является помощь поисковым системам в навигации по вашему сайту. Поисковые системы используют текст ссылок для изучения тем страниц. Таким образом, использование хорошего текста ссылок помогает всем!
+Дополнительным преимуществом обеспечения доступности вашего сайта для всех является помощь поисковым системам в навигации по вашему сайту. Поисковые системы используют текст ссылок для изучения тем страниц. Таким образом, использование хорошего текста ссылок помогает всем!
### ARIA
@@ -132,13 +132,13 @@ CSS предоставляет полный контроль над внешни
| Виджет | [Описание](../../../../1-getting-started-lessons/3-accessibility/') | [Заказ](../../../../1-getting-started-lessons/3-accessibility/') |
| Супер-виджет | [Описание](../../../../1-getting-started-lessons/3-accessibility/') | [Заказ](../../../../1-getting-started-lessons/3-accessibility/') |
-В этом примере дублирование текста "описание" и "заказ" имеет смысл для пользователя браузера. Однако пользователь читателя экрана услышит только слова *описание* и *заказ*, повторяющиеся без контекста.
+В этом примере дублирование текста "описание" и "заказ" имеет смысл для пользователя браузера. Однако пользователь читателя экрана услышит только слова *описание* и *заказ* без контекста.
Для поддержки таких сценариев HTML поддерживает набор атрибутов, известных как [Доступные богатые интернет-приложения (ARIA)](https://developer.mozilla.org/docs/Web/Accessibility/ARIA). Эти атрибуты позволяют предоставлять дополнительную информацию читателям экрана.
> **NOTE**: Как и многие аспекты HTML, поддержка браузеров и читателей экрана может варьироваться. Однако большинство основных клиентов поддерживают атрибуты ARIA.
-Вы можете использовать `aria-label`, чтобы описать ссылку, если формат страницы не позволяет вам это сделать. Описание для виджета можно задать как
+Вы можете использовать `aria-label`, чтобы описать ссылку, если формат страницы не позволяет вам это сделать. Описание для виджета может быть задано как
``` html
description
@@ -155,10 +155,10 @@ CSS предоставляет полный контроль над внешни
## Изображения
-Само собой разумеется, что читатели экрана не могут автоматически читать, что находится на изображении. Обеспечение доступности изображений не требует больших усилий — для этого предназначен атрибут `alt`. Все значимые изображения должны иметь `alt`, чтобы описать, что они собой представляют.
+Само собой разумеется, что читатели экрана не могут автоматически читать, что изображено на картинке. Обеспечение доступности изображений не требует больших усилий — для этого существует атрибут `alt`. Все значимые изображения должны иметь `alt`, чтобы описать, что они представляют.
Изображения, которые являются чисто декоративными, должны иметь атрибут `alt`, установленный в пустую строку: `alt=""`. Это предотвращает ненужное объявление декоративного изображения читателем экрана.
-✅ Как вы могли ожидать, поисковые системы также не могут понять, что находится на изображении. Они также используют текст `alt`. Таким образом, обеспечение доступности вашей страницы дает дополнительные бонусы!
+✅ Как вы могли ожидать, поисковые системы также не могут понять, что изображено на картинке. Они также используют текст `alt`. Таким образом, обеспечение доступности вашей страницы приносит дополнительные бонусы!
## Клавиатура
@@ -166,7 +166,7 @@ CSS предоставляет полный контроль над внешни
✅ Перейдите на любой веб-сайт и попробуйте перемещаться по нему, используя только клавиатуру. Что работает, а что нет? Почему?
-## Резюме
+## Итог
Веб, доступный только для некоторых, не является по-настоящему "всемирной паутиной". Лучший способ обеспечить доступность создаваемых вами сайтов — это внедрять лучшие практики доступности с самого начала. Хотя это требует дополнительных шагов, включение этих навыков в ваш рабочий процесс сейчас означает, что все страницы, которые вы создаете, будут доступны.
@@ -174,7 +174,7 @@ CSS предоставляет полный контроль над внешни
## 🚀 Задание
-Возьмите этот HTML и перепишите его, чтобы он был максимально доступным, используя стратегии, которые вы изучили.
+Возьмите этот HTML и перепишите его, чтобы он был максимально доступным, учитывая стратегии, которые вы изучили.
```html
@@ -220,23 +220,25 @@ CSS предоставляет полный контроль над внешни
Semantic Example
-
```
-## Викторина после лекции
-[Викторина после лекции](https://ff-quizzes.netlify.app/web/quiz/6)
+## Викторина после лекции
+[Викторина после лекции](https://ff-quizzes.netlify.app/web/en/)
## Обзор и самостоятельное изучение
-Многие правительства имеют законы, касающиеся требований доступности. Ознакомьтесь с законами о доступности в вашей стране. Что охватывается, а что нет? Примером может служить [этот правительственный веб-сайт](https://accessibility.blog.gov.uk/).
+У многих стран есть законы, касающиеся требований доступности. Ознакомьтесь с законами о доступности в вашей стране. Что охватывается, а что нет? Примером может служить [этот сайт правительства](https://accessibility.blog.gov.uk/).
## Задание
[Проанализируйте недоступный веб-сайт](assignment.md)
-Благодарности: [Turtle Ipsum](https://github.com/Instrument/semantic-html-sample) от Instrument
+Источник: [Turtle Ipsum](https://github.com/Instrument/semantic-html-sample) от Instrument
+
+---
**Отказ от ответственности**:
-Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.
\ No newline at end of file
+Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.
\ No newline at end of file
diff --git a/translations/ru/2-js-basics/1-data-types/README.md b/translations/ru/2-js-basics/1-data-types/README.md
index 990e152b..f4624a7d 100644
--- a/translations/ru/2-js-basics/1-data-types/README.md
+++ b/translations/ru/2-js-basics/1-data-types/README.md
@@ -1,8 +1,8 @@
-# Основы JavaScript: Принятие решений
+# Основы JavaScript: принятие решений

@@ -17,7 +17,7 @@ CO_OP_TRANSLATOR_METADATA:
[Викторина перед лекцией](https://ff-quizzes.netlify.app/web/quiz/11)
-Принятие решений и управление порядком выполнения кода делает ваш код более универсальным и надежным. В этом разделе рассматривается синтаксис управления потоком данных в JavaScript и его значение при работе с булевыми типами данных.
+Принятие решений и управление порядком выполнения вашего кода делает его более универсальным и надежным. В этом разделе рассматривается синтаксис управления потоком данных в JavaScript и его важность при работе с булевыми типами данных.
[](https://youtube.com/watch?v=SxTp8j-fMMY "Принятие решений")
@@ -27,9 +27,9 @@ CO_OP_TRANSLATOR_METADATA:
## Краткий обзор булевых значений
-Булевые значения могут быть только двух типов: `true` или `false`. Булевы значения помогают принимать решения о том, какие строки кода должны выполняться при выполнении определенных условий.
+Булевы значения могут принимать только два значения: `true` или `false`. Булевы значения помогают принимать решения о том, какие строки кода должны выполняться при выполнении определенных условий.
-Задайте булевое значение как true или false следующим образом:
+Задайте булевое значение как `true` или `false` следующим образом:
`let myTrueBool = true`
`let myFalseBool = false`
@@ -38,10 +38,10 @@ CO_OP_TRANSLATOR_METADATA:
## Операторы сравнения и булевы значения
-Операторы используются для оценки условий путем выполнения сравнений, которые создают булевое значение. Вот список часто используемых операторов.
+Операторы используются для оценки условий путем сравнения, которое создает булевое значение. Ниже приведен список часто используемых операторов.
| Символ | Описание | Пример |
-| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------ |
+| ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ |
| `<` | **Меньше чем**: Сравнивает два значения и возвращает булевое значение `true`, если значение слева меньше значения справа | `5 < 6 // true` |
| `<=` | **Меньше или равно**: Сравнивает два значения и возвращает булевое значение `true`, если значение слева меньше или равно значению справа | `5 <= 6 // true` |
| `>` | **Больше чем**: Сравнивает два значения и возвращает булевое значение `true`, если значение слева больше значения справа | `5 > 6 // false` |
@@ -49,7 +49,7 @@ CO_OP_TRANSLATOR_METADATA:
| `===` | **Строгое равенство**: Сравнивает два значения и возвращает булевое значение `true`, если значения слева и справа равны И имеют одинаковый тип данных | `5 === 6 // false` |
| `!==` | **Неравенство**: Сравнивает два значения и возвращает противоположное булевое значение тому, что вернул бы оператор строгого равенства | `5 !== 6 // true` |
-✅ Проверьте свои знания, написав несколько сравнений в консоли браузера. Удивил ли вас какой-либо из возвращенных результатов?
+✅ Проверьте свои знания, написав несколько сравнений в консоли вашего браузера. Удивил ли вас какой-либо возвращенный результат?
## Оператор if
@@ -73,9 +73,9 @@ if (currentMoney >= laptopPrice) {
}
```
-## Оператор If..Else
+## Оператор if..else
-Оператор `else` выполнит код внутри своих блоков, если условие ложно. Он является необязательным для оператора `if`.
+Оператор `else` выполнит код внутри своих блоков, если условие ложно. Он является необязательным в сочетании с оператором `if`.
```javascript
let currentMoney;
@@ -92,9 +92,9 @@ if (currentMoney >= laptopPrice) {
✅ Проверьте свое понимание этого кода и следующего кода, запустив его в консоли браузера. Измените значения переменных currentMoney и laptopPrice, чтобы изменить результат `console.log()`.
-## Оператор Switch
+## Оператор switch
-Оператор `switch` используется для выполнения различных действий в зависимости от различных условий. Используйте оператор `switch`, чтобы выбрать один из нескольких блоков кода для выполнения.
+Оператор `switch` используется для выполнения различных действий в зависимости от различных условий. Используйте оператор `switch`, чтобы выбрать один из множества блоков кода для выполнения.
```javascript
switch (expression) {
@@ -131,17 +131,17 @@ console.log(`The value is ${a}`);
## Логические операторы и булевы значения
-Принятие решений может требовать более одного сравнения, и их можно объединять с помощью логических операторов для получения булевого значения.
+Принятие решений может требовать более одного сравнения, и их можно объединить с помощью логических операторов для получения булевого значения.
| Символ | Описание | Пример |
-| ------ | -------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
-| `&&` | **Логическое И**: Сравнивает два булевых выражения. Возвращает true **только**, если обе стороны истинны | `(5 > 6) && (5 < 6 ) //Одна сторона ложна, другая истинна. Возвращает false` |
+| ------ | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
+| `&&` | **Логическое И**: Сравнивает два булевых выражения. Возвращает true **только** если обе стороны истинны | `(5 > 6) && (5 < 6 ) //Одна сторона ложна, другая истинна. Возвращает false` |
| `\|\|` | **Логическое ИЛИ**: Сравнивает два булевых выражения. Возвращает true, если хотя бы одна сторона истинна | `(5 > 6) \|\| (5 < 6) //Одна сторона ложна, другая истинна. Возвращает true` |
-| `!` | **Логическое НЕ**: Возвращает противоположное значение булевого выражения | `!(5 > 6) // 5 не больше 6, но "!" вернет true` |
+| `!` | **Логическое НЕ**: Возвращает противоположное значение булевого выражения | `!(5 > 6) // 5 не больше 6, но "!" вернет true` |
## Условия и решения с логическими операторами
-Логические операторы можно использовать для формирования условий в операторах if..else.
+Логические операторы могут использоваться для формирования условий в операторах if..else.
```javascript
let currentMoney;
@@ -189,7 +189,7 @@ let biggestNumber = firstNumber > secondNumber ? firstNumber : secondNumber;
В приведенном выше примере говорится:
-- если `firstNumber` больше `secondNumber`
+- если `firstNumber` больше, чем `secondNumber`
- тогда присвойте `firstNumber` переменной `biggestNumber`
- иначе присвойте `secondNumber`.
@@ -220,11 +220,13 @@ if (firstNumber > secondNumber) {
Прочитайте больше о множестве доступных операторов [на MDN](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Operators).
-Изучите замечательный [справочник по операторам](https://joshwcomeau.com/operator-lookup/) от Джоша Комо!
+Ознакомьтесь с замечательным [справочником операторов](https://joshwcomeau.com/operator-lookup/) от Джоша Комо!
## Задание
[Операторы](assignment.md)
+---
+
**Отказ от ответственности**:
-Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.
\ No newline at end of file
+Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
diff --git a/translations/ru/2-js-basics/4-arrays-loops/README.md b/translations/ru/2-js-basics/4-arrays-loops/README.md
index 0bd7e6ac..f52c0a1a 100644
--- a/translations/ru/2-js-basics/4-arrays-loops/README.md
+++ b/translations/ru/2-js-basics/4-arrays-loops/README.md
@@ -1,21 +1,21 @@
-# Основы JavaScript: Массивы и циклы
+# Основы JavaScript: массивы и циклы
-
+
> Скетчноут от [Tomomi Imura](https://twitter.com/girlie_mac)
## Викторина перед лекцией
[Викторина перед лекцией](https://ff-quizzes.netlify.app/web/quiz/13)
-Этот урок охватывает основы JavaScript — языка, который обеспечивает интерактивность в интернете. В этом уроке вы узнаете о массивах и циклах, которые используются для работы с данными.
+Этот урок охватывает основы JavaScript — языка, который обеспечивает интерактивность в вебе. В этом уроке вы узнаете о массивах и циклах, которые используются для работы с данными.
[](https://youtube.com/watch?v=1U4qTyq02Xw "Массивы")
@@ -27,9 +27,9 @@ CO_OP_TRANSLATOR_METADATA:
## Массивы
-Работа с данными — это распространённая задача в любом языке программирования, и она становится намного проще, если данные организованы в структурированном формате, таком как массивы. С помощью массивов данные хранятся в структуре, похожей на список. Одним из главных преимуществ массивов является то, что в одном массиве можно хранить данные разных типов.
+Работа с данными — это распространённая задача для любого языка программирования, и она становится намного проще, если данные организованы в структурированном формате, таком как массивы. С помощью массивов данные хранятся в структуре, похожей на список. Одним из главных преимуществ массивов является то, что в одном массиве можно хранить данные разных типов.
-✅ Массивы повсюду вокруг нас! Можете ли вы придумать пример массива из реальной жизни, например, массив солнечных панелей?
+✅ Массивы окружают нас повсюду! Можете ли вы придумать пример массива из реальной жизни, например, массив солнечных панелей?
Синтаксис массива — это пара квадратных скобок.
@@ -43,28 +43,28 @@ let myArray = [];
let iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
```
-Значения массива получают уникальное значение, называемое **индексом** — целое число, которое присваивается в зависимости от его расстояния от начала массива. В приведённом выше примере строковое значение "Chocolate" имеет индекс 0, а индекс "Rocky Road" равен 4. Используйте индекс с квадратными скобками, чтобы получить, изменить или вставить значения массива.
+Значения массива получают уникальное значение, называемое **индексом** — целое число, которое присваивается на основе расстояния от начала массива. В приведённом выше примере строковое значение "Chocolate" имеет индекс 0, а индекс "Rocky Road" равен 4. Используйте индекс с квадратными скобками, чтобы извлечь, изменить или вставить значения массива.
-✅ Удивляет ли вас, что индексация в массивах начинается с нуля? В некоторых языках программирования индексация начинается с 1. Это связано с интересной историей, о которой вы можете [прочитать на Википедии](https://en.wikipedia.org/wiki/Zero-based_numbering).
+✅ Вас удивляет, что индексация массивов начинается с нуля? В некоторых языках программирования индексация начинается с 1. Это связано с интересной историей, о которой можно [прочитать на Википедии](https://en.wikipedia.org/wiki/Zero-based_numbering).
```javascript
let iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
iceCreamFlavors[2]; //"Vanilla"
```
-Вы можете использовать индекс, чтобы изменить значение, например так:
+Вы можете использовать индекс, чтобы изменить значение, например:
```javascript
iceCreamFlavors[4] = "Butter Pecan"; //Changed "Rocky Road" to "Butter Pecan"
```
-Или вставить новое значение в заданный индекс, например так:
+И можете вставить новое значение в заданный индекс вот так:
```javascript
iceCreamFlavors[5] = "Cookie Dough"; //Added "Cookie Dough"
```
-✅ Более распространённый способ добавления значений в массив — использование операторов массива, таких как array.push().
+✅ Более распространённый способ добавления значений в массив — использование операторов массива, таких как array.push()
Чтобы узнать, сколько элементов находится в массиве, используйте свойство `length`.
@@ -73,18 +73,18 @@ let iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky
iceCreamFlavors.length; //5
```
-✅ Попробуйте сами! Используйте консоль вашего браузера, чтобы создать и изменить массив по вашему выбору.
+✅ Попробуйте сами! Используйте консоль вашего браузера, чтобы создать и изменить массив собственного создания.
## Циклы
-Циклы позволяют выполнять повторяющиеся или **итеративные** задачи, что может сэкономить много времени и кода. Каждая итерация может отличаться своими переменными, значениями и условиями. В JavaScript существует несколько типов циклов, которые имеют небольшие различия, но по сути выполняют одну и ту же задачу: перебирают данные.
+Циклы позволяют выполнять повторяющиеся или **итеративные** задачи, что экономит много времени и кода. Каждая итерация может отличаться своими переменными, значениями и условиями. В JavaScript существуют разные типы циклов, которые имеют небольшие различия, но по сути выполняют одну и ту же задачу — перебор данных.
### Цикл for
Цикл `for` требует 3 части для итерации:
-- `счётчик` Переменная, которая обычно инициализируется числом и отслеживает количество итераций
-- `условие` Выражение, использующее операторы сравнения, чтобы остановить цикл, когда оно становится `false`
-- `выражение-итерация` Выполняется в конце каждой итерации, обычно используется для изменения значения счётчика
+- `counter` Переменная, которая обычно инициализируется числом и отсчитывает количество итераций
+- `condition` Выражение, использующее операторы сравнения, чтобы остановить цикл, когда оно становится `false`
+- `iteration-expression` Выполняется в конце каждой итерации, обычно используется для изменения значения счётчика
```javascript
// Counting up to 10
@@ -93,11 +93,11 @@ for (let i = 0; i < 10; i++) {
}
```
-✅ Запустите этот код в консоли браузера. Что произойдёт, если вы внесёте небольшие изменения в счётчик, условие или выражение-итерацию? Можете ли вы заставить цикл работать в обратном порядке, создавая обратный отсчёт?
+✅ Запустите этот код в консоли браузера. Что произойдёт, если вы внесёте небольшие изменения в счётчик, условие или выражение итерации? Можете ли вы заставить цикл работать в обратном порядке, создавая обратный отсчёт?
### Цикл while
-В отличие от синтаксиса цикла `for`, циклы `while` требуют только условия, которое остановит цикл, когда оно станет `false`. Условия в циклах обычно зависят от других значений, таких как счётчики, и должны управляться в процессе выполнения цикла. Начальные значения для счётчиков должны быть созданы вне цикла, а любые выражения для выполнения условия, включая изменение счётчика, должны поддерживаться внутри цикла.
+В отличие от синтаксиса цикла `for`, цикл `while` требует только условия, которое остановит цикл, когда оно станет `false`. Условия в циклах обычно зависят от других значений, таких как счётчики, и должны управляться во время выполнения цикла. Начальные значения для счётчиков должны быть созданы вне цикла, а любые выражения для выполнения условия, включая изменение счётчика, должны поддерживаться внутри цикла.
```javascript
//Counting up to 10
@@ -108,11 +108,11 @@ while (i < 10) {
}
```
-✅ Почему вы выбрали бы цикл for вместо while и наоборот? 17 тысяч пользователей задали тот же вопрос на StackOverflow, и некоторые из [мнений могут быть вам интересны](https://stackoverflow.com/questions/39969145/while-loops-vs-for-loops-in-javascript).
+✅ Почему вы выбрали бы цикл for вместо while? 17 тысяч пользователей задали тот же вопрос на StackOverflow, и некоторые мнения [могут быть вам интересны](https://stackoverflow.com/questions/39969145/while-loops-vs-for-loops-in-javascript).
## Циклы и массивы
-Массивы часто используются с циклами, потому что большинство условий требуют длины массива, чтобы остановить цикл, а индекс может также быть значением счётчика.
+Массивы часто используются с циклами, потому что большинство условий требуют длины массива для остановки цикла, а индекс также может быть значением счётчика.
```javascript
let iceCreamFlavors = ["Chocolate", "Strawberry", "Vanilla", "Pistachio", "Rocky Road"];
@@ -122,24 +122,26 @@ for (let i = 0; i < iceCreamFlavors.length; i++) {
} //Ends when all flavors are printed
```
-✅ Поэкспериментируйте с перебором массива, созданного вами, в консоли браузера.
+✅ Попробуйте перебрать массив собственного создания в консоли вашего браузера.
---
## 🚀 Задание
-Существуют и другие способы перебора массивов, помимо циклов for и while. Это [forEach](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach), [for-of](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for...of) и [map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map). Перепишите ваш цикл для массива, используя один из этих методов.
+Существуют и другие способы перебора массивов, кроме циклов for и while. Это [forEach](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach), [for-of](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Statements/for...of) и [map](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array/map). Перепишите ваш цикл для массива, используя один из этих методов.
## Викторина после лекции
[Викторина после лекции](https://ff-quizzes.netlify.app/web/quiz/14)
## Обзор и самостоятельное изучение
-Массивы в JavaScript имеют множество методов, которые чрезвычайно полезны для работы с данными. [Изучите эти методы](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array) и попробуйте некоторые из них (например, push, pop, slice и splice) на массиве, созданном вами.
+Массивы в JavaScript имеют множество методов, которые чрезвычайно полезны для работы с данными. [Прочитайте о этих методах](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array) и попробуйте некоторые из них (например, push, pop, slice и splice) на массиве собственного создания.
## Задание
[Перебор массива](assignment.md)
+---
+
**Отказ от ответственности**:
-Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, имейте в виду, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
+Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
diff --git a/translations/ru/3-terrarium/1-intro-to-html/README.md b/translations/ru/3-terrarium/1-intro-to-html/README.md
index 63d6220d..c84d77b7 100644
--- a/translations/ru/3-terrarium/1-intro-to-html/README.md
+++ b/translations/ru/3-terrarium/1-intro-to-html/README.md
@@ -1,37 +1,37 @@
# Проект "Террариум", Часть 1: Введение в HTML
-
+
> Скетчноут от [Tomomi Imura](https://twitter.com/girlie_mac)
-## Предварительный тест
+## Викторина перед лекцией
-[Предварительный тест](https://ff-quizzes.netlify.app/web/quiz/15)
+[Викторина перед лекцией](https://ff-quizzes.netlify.app/web/quiz/15)
> Посмотрите видео
>
-> [](https://www.youtube.com/watch?v=1TvxJKBzhyQ)
+> [](https://www.youtube.com/watch?v=1TvxJKBzhyQ)
### Введение
HTML, или язык гипертекстовой разметки, — это "скелет" веба. Если CSS "одевает" ваш HTML, а JavaScript оживляет его, то HTML — это тело вашего веб-приложения. Синтаксис HTML даже отражает эту идею, так как включает теги "head", "body" и "footer".
-В этом уроке мы будем использовать HTML для создания "скелета" интерфейса нашего виртуального террариума. Он будет включать заголовок и три колонки: правую и левую, где будут находиться перетаскиваемые растения, и центральную область, которая станет стеклянным террариумом. К концу этого урока вы сможете увидеть растения в колонках, но интерфейс будет выглядеть немного странно; не переживайте, в следующем разделе вы добавите стили CSS, чтобы улучшить внешний вид.
+В этом уроке мы будем использовать HTML, чтобы создать "скелет" интерфейса нашего виртуального террариума. Он будет включать заголовок и три колонки: правую и левую, где будут находиться перетаскиваемые растения, и центральную область, которая будет выглядеть как стеклянный террариум. К концу урока вы сможете увидеть растения в колонках, но интерфейс будет выглядеть немного странно; не переживайте, в следующем разделе вы добавите стили CSS, чтобы улучшить внешний вид интерфейса.
### Задание
-На вашем компьютере создайте папку с названием 'terrarium', а внутри нее файл с именем 'index.html'. Вы можете сделать это в Visual Studio Code, открыв новое окно VS Code, нажав "открыть папку" и выбрав вашу новую папку. Затем нажмите на маленькую кнопку "файл" в панели проводника и создайте новый файл:
+На вашем компьютере создайте папку с названием 'terrarium', а внутри нее файл 'index.html'. Вы можете сделать это в Visual Studio Code, открыв новое окно VS Code, нажав 'open folder' и выбрав вашу новую папку. Затем нажмите на маленькую кнопку 'file' в панели проводника и создайте новый файл:
-
+
Или
@@ -41,17 +41,17 @@ HTML, или язык гипертекстовой разметки, — это
* `touch index.html`
* `code index.html` или `nano index.html`
-> Файлы index.html указывают браузеру, что это файл по умолчанию в папке; URL-адреса, такие как `https://anysite.com/test`, могут быть построены с использованием структуры папок, включающей папку с именем `test` и файлом `index.html` внутри; `index.html` не обязательно должен отображаться в URL.
+> Файлы index.html указывают браузеру, что это файл по умолчанию в папке; URL, такие как `https://anysite.com/test`, могут быть построены с использованием структуры папок, включая папку с названием `test` и файлом `index.html` внутри; `index.html` не обязательно должен отображаться в URL.
---
-## Doctype и теги html
+## DocType и теги html
-Первая строка HTML-файла — это его doctype. Это может показаться неожиданным, но эта строка должна быть в самом верху файла, так как она сообщает старым браузерам, что страница должна отображаться в стандартном режиме, следуя текущей спецификации HTML.
+Первая строка HTML-файла — это его doctype. Это немного удивительно, но эта строка должна быть в самом верху файла, так как она сообщает старым браузерам, что страница должна отображаться в стандартном режиме, следуя текущей спецификации HTML.
-> Подсказка: в VS Code вы можете навести курсор на тег, чтобы получить информацию о его использовании из справочников MDN.
+> Совет: в VS Code вы можете навести курсор на тег и получить информацию о его использовании из справочников MDN.
-Вторая строка должна быть открывающим тегом ``, за которым сразу следует его закрывающий тег ``. Эти теги являются корневыми элементами вашего интерфейса.
+Вторая строка должна быть открывающим тегом ``, за которым сразу следует закрывающий тег ``. Эти теги являются корневыми элементами вашего интерфейса.
### Задание
@@ -62,19 +62,19 @@ HTML, или язык гипертекстовой разметки, — это
```
-✅ Существуют разные режимы, которые можно определить, задав Doctype с помощью строки запроса: [Quirks Mode и Standards Mode](https://developer.mozilla.org/docs/Web/HTML/Quirks_Mode_and_Standards_Mode). Эти режимы использовались для поддержки очень старых браузеров, которые сейчас практически не используются (Netscape Navigator 4 и Internet Explorer 5). Вы можете придерживаться стандартного объявления doctype.
+✅ Существует несколько режимов, которые можно определить, установив DocType с помощью строки запроса: [Quirks Mode и Standards Mode](https://developer.mozilla.org/docs/Web/HTML/Quirks_Mode_and_Standards_Mode). Эти режимы использовались для поддержки очень старых браузеров, которые сейчас практически не используются (Netscape Navigator 4 и Internet Explorer 5). Вы можете придерживаться стандартного объявления doctype.
---
-## 'Head' документа
+## 'head' документа
-Область 'head' HTML-документа включает важную информацию о вашей веб-странице, также известную как [метаданные](https://developer.mozilla.org/docs/Web/HTML/Element/meta). В нашем случае мы указываем веб-серверу, на который будет отправлена эта страница, следующие четыре вещи:
+Область 'head' HTML-документа включает важную информацию о вашей веб-странице, также известную как [метаданные](https://developer.mozilla.org/docs/Web/HTML/Element/meta). В нашем случае мы сообщаем веб-серверу, который будет отображать эту страницу, следующие четыре вещи:
- заголовок страницы
- метаданные страницы, включая:
- 'character set', указывающий, какая кодировка символов используется на странице
- информацию о браузере, включая `x-ua-compatible`, который указывает, что поддерживается браузер IE=edge
- - информацию о том, как должен вести себя viewport при загрузке. Установка начального масштаба viewport в 1 контролирует уровень масштабирования при первой загрузке страницы.
+ - информацию о том, как должен вести себя viewport при загрузке. Установка начального масштаба viewport в 1 контролирует уровень увеличения при первой загрузке страницы.
### Задание
@@ -89,15 +89,15 @@ HTML, или язык гипертекстовой разметки, — это
```
-✅ Что произойдет, если вы установите мета-тег viewport, например, так: `
`? Узнайте больше о [viewport](https://developer.mozilla.org/docs/Web/HTML/Viewport_meta_tag).
+✅ Что произойдет, если вы установите мета-тег viewport следующим образом: `
`? Узнайте больше о [viewport](https://developer.mozilla.org/docs/Web/HTML/Viewport_meta_tag).
---
-## `Body` документа
+## 'body' документа
### Теги HTML
-В HTML вы добавляете теги в ваш .html файл, чтобы создавать элементы веб-страницы. Каждый тег обычно имеет открывающий и закрывающий теги, например: `
hello
` для обозначения абзаца. Создайте тело вашего интерфейса, добавив набор тегов `` внутри пары тегов ``; теперь ваша разметка выглядит так:
+В HTML вы добавляете теги в ваш .html файл, чтобы создать элементы веб-страницы. Каждый тег обычно имеет открывающий и закрывающий тег, например: `
hello
` для обозначения абзаца. Создайте тело вашего интерфейса, добавив набор тегов `` внутри пары тегов ``; теперь ваша разметка выглядит так:
### Задание
@@ -114,13 +114,13 @@ HTML, или язык гипертекстовой разметки, — это
```
-Теперь вы можете начать создавать вашу страницу. Обычно для создания отдельных элементов на странице используются теги `
`. Мы создадим серию элементов `
`, которые будут содержать изображения.
+Теперь вы можете начать создавать вашу страницу. Обычно вы используете теги `
` для создания отдельных элементов на странице. Мы создадим серию элементов `
`, которые будут содержать изображения.
### Изображения
Один из тегов HTML, который не требует закрывающего тега, — это `
`, так как он имеет элемент `src`, содержащий всю информацию, необходимую для отображения элемента на странице.
-Создайте папку в вашем приложении с названием `images` и добавьте туда все изображения из [папки с исходным кодом](../../../../3-terrarium/solution/images); (всего 14 изображений растений).
+Создайте папку в вашем приложении с названием `images` и добавьте в нее все изображения из [папки исходного кода](../../../../3-terrarium/solution/images); (всего 14 изображений растений).
### Задание
@@ -177,29 +177,29 @@ HTML, или язык гипертекстовой разметки, — это
```
-> Примечание: Spans vs. Divs. Divs считаются блочными элементами, а Spans — встроенными. Что произойдет, если вы замените эти div на span?
+> Примечание: Spans vs. Divs. Divs считаются 'блочными' элементами, а Spans — 'встроенными'. Что произойдет, если вы преобразуете эти divs в spans?
-С этой разметкой растения теперь отображаются на экране. Выглядит это пока плохо, так как они еще не стилизованы с помощью CSS, но мы займемся этим в следующем уроке.
+С этой разметкой растения теперь отображаются на экране. Это выглядит довольно плохо, так как они еще не стилизованы с помощью CSS, и мы займемся этим в следующем уроке.
-Каждое изображение имеет альтернативный текст (alt), который будет отображаться, даже если вы не можете увидеть или отобразить изображение. Это важный атрибут для обеспечения доступности. Узнайте больше о доступности в будущих уроках; пока запомните, что атрибут alt предоставляет альтернативную информацию для изображения, если пользователь по какой-либо причине не может его увидеть (из-за медленного соединения, ошибки в атрибуте src или если пользователь использует экранный диктор).
+Каждое изображение имеет альтернативный текст, который будет отображаться, даже если вы не можете увидеть или отобразить изображение. Это важный атрибут для обеспечения доступности. Узнайте больше о доступности в будущих уроках; пока запомните, что атрибут alt предоставляет альтернативную информацию для изображения, если пользователь по какой-либо причине не может его увидеть (из-за медленного соединения, ошибки в атрибуте src или если пользователь использует экранный диктор).
-✅ Обратили ли вы внимание, что у каждого изображения одинаковый alt-тег? Это хорошая практика? Почему или почему нет? Можете ли вы улучшить этот код?
+✅ Вы заметили, что у каждого изображения одинаковый alt-тег? Это хорошая практика? Почему или почему нет? Можете ли вы улучшить этот код?
---
## Семантическая разметка
-В общем, предпочтительнее использовать осмысленную "семантику" при написании HTML. Что это значит? Это значит, что вы используете HTML-теги для представления типа данных или взаимодействия, для которых они были разработаны. Например, основной заголовок текста на странице должен использовать тег `
`.
+В общем, предпочтительно использовать осмысленную 'семантику' при написании HTML. Что это значит? Это значит, что вы используете HTML-теги для представления типа данных или взаимодействия, для которых они были разработаны. Например, основной заголовок текста на странице должен использовать тег ``.
-Добавьте следующую строку сразу под открывающим тегом ``:
+Добавьте следующую строку сразу под вашим открывающим тегом ``:
```html
My Terrarium
```
-Использование семантической разметки, такой как заголовки `` и ненумерованные списки ``, помогает экранным дикторам ориентироваться на странице. В общем, кнопки должны быть написаны как ``, а списки — как ``. Хотя _возможно_ использовать специально стилизованные элементы `` с обработчиками кликов для имитации кнопок, для пользователей с ограниченными возможностями лучше, если технологии смогут определить, где на странице находится кнопка, и взаимодействовать с ней, если элемент отображается как кнопка. По этой причине старайтесь использовать семантическую разметку как можно чаще.
+Использование семантической разметки, такой как заголовки `` и неупорядоченные списки ``, помогает экранным дикторам ориентироваться на странице. В общем, кнопки должны быть написаны как ``, а списки — как ``. Хотя _возможно_ использовать специально стилизованные элементы `` с обработчиками кликов для имитации кнопок, лучше для пользователей с ограниченными возможностями использовать технологии, чтобы определить, где на странице находится кнопка, и взаимодействовать с ней, если элемент отображается как кнопка. По этой причине старайтесь использовать семантическую разметку как можно чаще.
-✅ Ознакомьтесь с экранным диктором и [тем, как он взаимодействует с веб-страницей](https://www.youtube.com/watch?v=OUDV1gqs9GA). Можете ли вы понять, почему несемантическая разметка может раздражать пользователя?
+✅ Ознакомьтесь с экранным диктором и [тем, как он взаимодействует с веб-страницей](https://www.youtube.com/watch?v=OUDV1gqs9GA). Можете ли вы понять, почему использование несемантической разметки может раздражать пользователя?
## Террариум
@@ -207,7 +207,7 @@ HTML, или язык гипертекстовой разметки, — это
### Задание:
-Добавьте эту разметку перед последним тегом ` `:
+Добавьте эту разметку выше последнего тега `
`:
```html
@@ -225,13 +225,13 @@ HTML, или язык гипертекстовой разметки, — это
---
-## 🚀Челлендж
+## 🚀Задача
-Существуют забавные "старые" теги в HTML, которые все еще можно использовать, хотя вы не должны использовать устаревшие теги, такие как [эти теги](https://developer.mozilla.org/docs/Web/HTML/Element#Obsolete_and_deprecated_elements) в вашей разметке. Тем не менее, можете ли вы использовать старый тег ``, чтобы заголовок h1 прокручивался горизонтально? (если сделаете это, не забудьте удалить его потом)
+Существуют некоторые забавные "старые" теги в HTML, которые все еще можно использовать, хотя не стоит применять устаревшие теги, такие как [эти](https://developer.mozilla.org/docs/Web/HTML/Element#Obsolete_and_deprecated_elements) в вашей разметке. Тем не менее, можете ли вы использовать старый тег ``, чтобы заголовок h1 прокручивался горизонтально? (если сделаете это, не забудьте удалить его потом)
-## Тест после лекции
+## Викторина после лекции
-[Тест после лекции](https://ff-quizzes.netlify.app/web/quiz/16)
+[Викторина после лекции](https://ff-quizzes.netlify.app/web/quiz/16)
## Обзор и самостоятельное изучение
@@ -241,7 +241,9 @@ HTML — это "проверенная временем" система стр
## Задание
-[Попрактикуйтесь в HTML: создайте макет блога](assignment.md)
+[Практикуйтесь в HTML: Создайте макет блога](assignment.md)
+
+---
**Отказ от ответственности**:
-Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.
\ No newline at end of file
+Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
diff --git a/translations/ru/3-terrarium/2-intro-to-css/README.md b/translations/ru/3-terrarium/2-intro-to-css/README.md
index 17c53872..d38c8a3e 100644
--- a/translations/ru/3-terrarium/2-intro-to-css/README.md
+++ b/translations/ru/3-terrarium/2-intro-to-css/README.md
@@ -1,8 +1,8 @@
-# Проект "Террариум", часть 3: Манипуляции с DOM и замыкание
+# Проект "Террариум", часть 3: Манипуляция DOM и замыкание

> Скетчноут от [Tomomi Imura](https://twitter.com/girlie_mac)
-## Предварительный тест
+## Викторина перед лекцией
-[Предварительный тест](https://ff-quizzes.netlify.app/web/quiz/19)
+[Викторина перед лекцией](https://ff-quizzes.netlify.app/web/quiz/19)
### Введение
-Манипуляция с DOM, или "Document Object Model" (объектная модель документа), является ключевым аспектом веб-разработки. Согласно [MDN](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction), "Document Object Model (DOM) — это представление данных объектов, составляющих структуру и содержимое документа в интернете". Сложности, связанные с манипуляцией DOM, часто становились причиной использования JavaScript-фреймворков вместо чистого JavaScript для управления DOM, но мы справимся самостоятельно!
+Манипуляция DOM, или "Document Object Model" (Модель Объекта Документа), является ключевым аспектом веб-разработки. Согласно [MDN](https://developer.mozilla.org/docs/Web/API/Document_Object_Model/Introduction), "Document Object Model (DOM) — это представление данных объектов, составляющих структуру и содержание документа в вебе". Сложности, связанные с манипуляцией DOM, часто становились причиной использования JavaScript-фреймворков вместо чистого JavaScript для управления DOM, но мы справимся самостоятельно!
Кроме того, в этом уроке будет введено понятие [замыкания в JavaScript](https://developer.mozilla.org/docs/Web/JavaScript/Closures), которое можно представить как функцию, заключённую внутри другой функции, так что внутренняя функция имеет доступ к области видимости внешней функции.
-> Замыкания в JavaScript — это обширная и сложная тема. В этом уроке мы затронем самую базовую идею: в коде террариума вы найдёте замыкание — внутреннюю и внешнюю функции, сконструированные таким образом, чтобы внутренняя функция имела доступ к области видимости внешней. Для более подробной информации о том, как это работает, посетите [обширную документацию](https://developer.mozilla.org/docs/Web/JavaScript/Closures).
+> Замыкания в JavaScript — это обширная и сложная тема. В этом уроке рассматривается самая базовая идея: в коде террариума вы найдете замыкание — внутреннюю функцию и внешнюю функцию, сконструированные таким образом, чтобы внутренняя функция имела доступ к области видимости внешней функции. Для получения более подробной информации о том, как это работает, посетите [обширную документацию](https://developer.mozilla.org/docs/Web/JavaScript/Closures).
-Мы будем использовать замыкание для манипуляции с DOM.
+Мы будем использовать замыкание для манипуляции DOM.
-Представьте DOM как дерево, которое отображает все способы, с помощью которых можно манипулировать документом веб-страницы. Были разработаны различные API (интерфейсы прикладного программирования), чтобы программисты могли с помощью выбранного языка программирования получить доступ к DOM и редактировать, изменять, перестраивать и управлять им.
+Представьте DOM как дерево, которое отображает все способы, которыми можно манипулировать документом веб-страницы. Были разработаны различные API (интерфейсы прикладного программирования), чтобы программисты могли использовать выбранный язык программирования для доступа к DOM и его редактирования, изменения, перестановки и управления.

-> Представление DOM и HTML-разметки, которая на него ссылается. Автор: [Olfa Nasraoui](https://www.researchgate.net/publication/221417012_Profile-Based_Focused_Crawler_for_Social_Media-Sharing_Websites)
+> Представление DOM и HTML-разметки, которая ссылается на него. Автор [Olfa Nasraoui](https://www.researchgate.net/publication/221417012_Profile-Based_Focused_Crawler_for_Social_Media-Sharing_Websites)
-В этом уроке мы завершим наш интерактивный проект террариума, создав JavaScript-код, который позволит пользователю манипулировать растениями на странице.
+В этом уроке мы завершим наш интерактивный проект террариума, создав JavaScript, который позволит пользователю манипулировать растениями на странице.
### Предварительные требования
-У вас должны быть готовы HTML и CSS для вашего террариума. К концу этого урока вы сможете перемещать растения в террариум и из него, перетаскивая их.
+У вас должны быть готовы HTML и CSS для вашего террариума. К концу этого урока вы сможете перемещать растения внутрь и наружу террариума, перетаскивая их.
-### Задание
+### Задача
-В папке террариума создайте новый файл с именем `script.js`. Подключите этот файл в секции ``:
+В папке террариума создайте новый файл с именем `script.js`. Импортируйте этот файл в секцию ``:
```html
```
-> Примечание: используйте `defer` при подключении внешнего JavaScript-файла в HTML, чтобы JavaScript выполнялся только после полной загрузки HTML-файла. Вы также можете использовать атрибут `async`, который позволяет скрипту выполняться во время парсинга HTML-файла, но в нашем случае важно, чтобы HTML-элементы были полностью доступны для перетаскивания до выполнения скрипта.
+> Примечание: используйте `defer` при импорте внешнего JavaScript-файла в HTML, чтобы JavaScript выполнялся только после полной загрузки HTML-файла. Вы также можете использовать атрибут `async`, который позволяет скрипту выполняться во время парсинга HTML-файла, но в нашем случае важно, чтобы HTML-элементы были полностью доступны для перетаскивания перед выполнением скрипта.
---
@@ -54,7 +54,7 @@ CO_OP_TRANSLATOR_METADATA:
Первое, что вам нужно сделать, — это создать ссылки на элементы, которые вы хотите манипулировать в DOM. В нашем случае это 14 растений, которые сейчас находятся в боковых панелях.
-### Задание
+### Задача
```html
dragElement(document.getElementById('plant1'));
@@ -73,17 +73,17 @@ dragElement(document.getElementById('plant13'));
dragElement(document.getElementById('plant14'));
```
-Что здесь происходит? Вы ссылаетесь на документ и ищете в его DOM элемент с определённым Id. Помните, что в первом уроке по HTML вы присвоили каждому изображению растения уникальный Id (`id="plant1"`)? Теперь вы воспользуетесь этой работой. После идентификации каждого элемента вы передаёте этот элемент в функцию `dragElement`, которую вы создадите через минуту. Таким образом, элемент в HTML становится доступным для перетаскивания или станет таким в ближайшее время.
+Что здесь происходит? Вы обращаетесь к документу и ищете в его DOM элемент с определённым идентификатором. Помните, что в первом уроке по HTML вы присвоили каждому изображению растения уникальный идентификатор (`id="plant1"`)? Теперь вы воспользуетесь этим. После идентификации каждого элемента вы передаете этот элемент в функцию `dragElement`, которую вы скоро создадите. Таким образом, элемент в HTML становится доступным для перетаскивания, или скоро станет.
-✅ Почему мы ссылаемся на элементы по Id? Почему не по их CSS-классу? Вы можете обратиться к предыдущему уроку по CSS, чтобы ответить на этот вопрос.
+✅ Почему мы ссылаемся на элементы по идентификатору? Почему не по их CSS-классу? Вы можете обратиться к предыдущему уроку по CSS, чтобы ответить на этот вопрос.
---
## Замыкание
-Теперь вы готовы создать замыкание `dragElement`, которое представляет собой внешнюю функцию, заключающую одну или несколько внутренних функций (в нашем случае их будет три).
+Теперь вы готовы создать замыкание `dragElement`, которое является внешней функцией, заключающей внутреннюю функцию или функции (в нашем случае их будет три).
-Замыкания полезны, когда одной или нескольким функциям нужно получить доступ к области видимости внешней функции. Вот пример:
+Замыкания полезны, когда одна или несколько функций должны иметь доступ к области видимости внешней функции. Вот пример:
```javascript
function displayCandy(){
@@ -97,11 +97,11 @@ displayCandy();
console.log(candy)
```
-В этом примере функция `displayCandy` окружает функцию, которая добавляет новый тип конфет в массив, уже существующий в функции. Если вы выполните этот код, массив `candy` будет неопределённым, так как он является локальной переменной (локальной для замыкания).
+В этом примере функция `displayCandy` окружает функцию, которая добавляет новый тип конфет в массив, который уже существует в функции. Если вы выполните этот код, массив `candy` будет неопределённым, так как он является локальной переменной (локальной для замыкания).
✅ Как сделать массив `candy` доступным? Попробуйте переместить его за пределы замыкания. Таким образом, массив станет глобальным, а не останется доступным только в локальной области видимости замыкания.
-### Задание
+### Задача
Под объявлениями элементов в `script.js` создайте функцию:
@@ -116,19 +116,19 @@ function dragElement(terrariumElement) {
}
```
-`dragElement` получает объект `terrariumElement` из объявлений в начале скрипта. Затем вы устанавливаете несколько локальных позиций на `0` для объекта, переданного в функцию. Это локальные переменные, которые будут изменяться для каждого элемента, когда вы добавите функциональность перетаскивания в замыкание для каждого элемента. Террариум будет заполняться этими перетаскиваемыми элементами, поэтому приложению нужно отслеживать, где они размещены.
+`dragElement` получает свой объект `terrariumElement` из объявлений в начале скрипта. Затем вы устанавливаете некоторые локальные позиции на `0` для объекта, переданного в функцию. Это локальные переменные, которые будут изменяться для каждого элемента, когда вы добавите функциональность перетаскивания в замыкание для каждого элемента. Террариум будет заполнен этими перетаскиваемыми элементами, поэтому приложению нужно отслеживать, где они размещены.
-Кроме того, элемент `terrariumElement`, переданный в эту функцию, получает событие `pointerdown`, которое является частью [веб-API](https://developer.mozilla.org/docs/Web/API), разработанных для управления DOM. `onpointerdown` срабатывает, когда нажимается кнопка или, в нашем случае, когда касаются перетаскиваемого элемента. Этот обработчик событий работает как в [веб-браузерах, так и в мобильных](https://caniuse.com/?search=onpointerdown), за исключением нескольких случаев.
+Кроме того, элемент террариума, переданный в эту функцию, получает событие `pointerdown`, которое является частью [веб-API](https://developer.mozilla.org/docs/Web/API), предназначенных для управления DOM. `onpointerdown` срабатывает, когда нажата кнопка или, в нашем случае, когда выбран перетаскиваемый элемент. Этот обработчик событий работает как в [веб-браузерах, так и в мобильных](https://caniuse.com/?search=onpointerdown), с некоторыми исключениями.
-✅ [Обработчик событий `onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick) имеет гораздо большую поддержку в разных браузерах; почему бы не использовать его здесь? Подумайте о том, какой именно тип взаимодействия с экраном вы пытаетесь создать.
+✅ [Обработчик событий `onclick`](https://developer.mozilla.org/docs/Web/API/GlobalEventHandlers/onclick) имеет гораздо большую поддержку в разных браузерах; почему бы не использовать его здесь? Подумайте о точном типе взаимодействия с экраном, который вы пытаетесь создать.
---
## Функция Pointerdrag
-Элемент `terrariumElement` готов к перетаскиванию; когда срабатывает событие `onpointerdown`, вызывается функция `pointerDrag`. Добавьте эту функцию сразу под строкой: `terrariumElement.onpointerdown = pointerDrag;`:
+Элемент `terrariumElement` готов к перетаскиванию; когда событие `onpointerdown` срабатывает, вызывается функция `pointerDrag`. Добавьте эту функцию сразу под строкой: `terrariumElement.onpointerdown = pointerDrag;`:
-### Задание
+### Задача
```javascript
function pointerDrag(e) {
@@ -139,31 +139,31 @@ function pointerDrag(e) {
}
```
-Происходит несколько вещей. Во-первых, вы предотвращаете выполнение стандартных событий, которые обычно происходят при `pointerdown`, с помощью `e.preventDefault();`. Таким образом, у вас больше контроля над поведением интерфейса.
+Происходит несколько вещей. Во-первых, вы предотвращаете выполнение стандартных событий, которые обычно происходят при pointerdown, используя `e.preventDefault();`. Таким образом, у вас больше контроля над поведением интерфейса.
-> Вернитесь к этой строке, когда полностью создадите файл скрипта, и попробуйте убрать `e.preventDefault()` — что произойдёт?
+> Вернитесь к этой строке, когда полностью создадите файл скрипта, и попробуйте убрать `e.preventDefault()` — что произойдет?
-Во-вторых, откройте `index.html` в окне браузера и исследуйте интерфейс. Когда вы кликаете на растение, вы можете увидеть, как событие 'e' захватывается. Изучите событие, чтобы увидеть, сколько информации собирается при одном событии pointerdown!
+Во-вторых, откройте `index.html` в окне браузера и исследуйте интерфейс. Когда вы нажимаете на растение, вы можете увидеть, как событие 'e' захватывается. Изучите событие, чтобы увидеть, сколько информации собирается одним событием pointerdown!
-Далее обратите внимание, как локальные переменные `pos3` и `pos4` устанавливаются в `e.clientX`. Вы можете найти значения `e` в панели инспекции. Эти значения фиксируют координаты x и y растения в момент, когда вы на него нажимаете или касаетесь. Вам нужен детальный контроль над поведением растений при их перетаскивании, поэтому вы отслеживаете их координаты.
+Далее обратите внимание, как локальные переменные `pos3` и `pos4` устанавливаются в e.clientX. Вы можете найти значения `e` в панели инспекции. Эти значения фиксируют координаты x и y растения в момент, когда вы нажимаете на него или касаетесь его. Вам потребуется тонкий контроль над поведением растений при их перемещении, поэтому вы отслеживаете их координаты.
-✅ Становится ли более понятно, почему всё приложение построено с использованием одного большого замыкания? Если бы его не было, как бы вы поддерживали область видимости для каждого из 14 перетаскиваемых растений?
+✅ Становится ли более понятно, почему всё приложение построено на одном большом замыкании? Если бы его не было, как бы вы поддерживали область видимости для каждого из 14 перетаскиваемых растений?
-Завершите начальную функцию, добавив ещё две манипуляции с событиями указателя под `pos4 = e.clientY`:
+Завершите начальную функцию, добавив ещё две манипуляции событий pointer под `pos4 = e.clientY`:
```html
document.onpointermove = elementDrag;
document.onpointerup = stopElementDrag;
```
-Теперь вы указываете, что хотите, чтобы растение перемещалось вместе с указателем при его перемещении, и чтобы жест перетаскивания завершался, когда вы убираете выделение с растения. `onpointermove` и `onpointerup` являются частью того же API, что и `onpointerdown`. Интерфейс будет выдавать ошибки сейчас, так как вы ещё не определили функции `elementDrag` и `stopElementDrag`, поэтому создайте их далее.
+Теперь вы указываете, что хотите, чтобы растение перемещалось вместе с указателем при его перемещении, и чтобы жест перетаскивания прекращался, когда вы снимаете выделение с растения. `onpointermove` и `onpointerup` являются частью того же API, что и `onpointerdown`. Интерфейс будет выдавать ошибки сейчас, так как вы ещё не определили функции `elementDrag` и `stopElementDrag`, поэтому создайте их далее.
## Функции elementDrag и stopElementDrag
-Вы завершите своё замыкание, добавив ещё две внутренние функции, которые будут обрабатывать то, что происходит, когда вы перетаскиваете растение и прекращаете его перетаскивание. Желаемое поведение заключается в том, чтобы вы могли перетаскивать любое растение в любое время и размещать его в любом месте на экране. Этот интерфейс довольно гибкий (например, нет зоны сброса), чтобы вы могли настроить свой террариум так, как вам нравится, добавляя, удаляя и перемещая растения.
+Вы завершите своё замыкание, добавив ещё две внутренние функции, которые будут управлять тем, что происходит при перетаскивании растения и прекращении его перетаскивания. Поведение, которое вы хотите, заключается в том, чтобы вы могли перетаскивать любое растение в любое время и размещать его где угодно на экране. Этот интерфейс довольно нейтральный (например, нет зоны сброса), чтобы вы могли настроить свой террариум так, как вам нравится, добавляя, удаляя и перемещая растения.
-### Задание
+### Задача
-Добавьте функцию `elementDrag` сразу после закрывающей фигурной скобки `pointerDrag`:
+Добавьте функцию `elementDrag` сразу после закрывающей фигурной скобки функции `pointerDrag`:
```javascript
function elementDrag(e) {
@@ -176,17 +176,17 @@ function elementDrag(e) {
terrariumElement.style.left = terrariumElement.offsetLeft - pos1 + 'px';
}
```
-В этой функции вы много работаете с изменением начальных позиций 1-4, которые вы установили как локальные переменные во внешней функции. Что здесь происходит?
+В этой функции вы много редактируете начальные позиции 1-4, которые вы установили как локальные переменные во внешней функции. Что здесь происходит?
-Во время перетаскивания вы переназначаете `pos1`, делая его равным `pos3` (который вы ранее установили как `e.clientX`) минус текущее значение `e.clientX`. Аналогичную операцию вы выполняете с `pos2`. Затем вы сбрасываете `pos3` и `pos4` на новые координаты X и Y элемента. Вы можете наблюдать эти изменения в консоли во время перетаскивания. Затем вы изменяете стиль CSS растения, чтобы установить его новую позицию на основе новых значений `pos1` и `pos2`, рассчитывая координаты X и Y растения (верх и левый край) на основе сравнения его смещения с этими новыми позициями.
+При перетаскивании вы переназначаете `pos1`, делая его равным `pos3` (который вы ранее установили как `e.clientX`) минус текущее значение `e.clientX`. Вы выполняете аналогичную операцию для `pos2`. Затем вы сбрасываете `pos3` и `pos4` на новые координаты X и Y элемента. Вы можете наблюдать эти изменения в консоли при перетаскивании. Затем вы изменяете стиль CSS растения, чтобы установить его новую позицию на основе новых позиций `pos1` и `pos2`, вычисляя верхние и левые координаты X и Y растения, сравнивая его смещение с этими новыми позициями.
-> `offsetTop` и `offsetLeft` — это CSS-свойства, которые задают позицию элемента относительно его родителя; родителем может быть любой элемент, который не имеет позиционирования `static`.
+> `offsetTop` и `offsetLeft` — это CSS-свойства, которые устанавливают позицию элемента относительно его родителя; его родителем может быть любой элемент, который не имеет позиционирования `static`.
-Все эти пересчёты позиций позволяют вам точно настроить поведение террариума и его растений.
+Всё это пересчитывание позиций позволяет вам точно настроить поведение террариума и его растений.
-### Задание
+### Задача
-Последнее задание для завершения интерфейса — добавить функцию `stopElementDrag` после закрывающей фигурной скобки `elementDrag`:
+Последняя задача для завершения интерфейса — добавить функцию `stopElementDrag` после закрывающей фигурной скобки функции `elementDrag`:
```javascript
function stopElementDrag() {
@@ -195,9 +195,9 @@ function stopElementDrag() {
}
```
-Эта небольшая функция сбрасывает события `onpointerup` и `onpointermove`, чтобы вы могли либо начать заново перемещать растение, либо начать перетаскивать новое растение.
+Эта небольшая функция сбрасывает события `onpointerup` и `onpointermove`, чтобы вы могли либо перезапустить перемещение растения, начав его перетаскивание снова, либо начать перетаскивание нового растения.
-✅ Что произойдёт, если вы не установите эти события в null?
+✅ Что произойдет, если вы не установите эти события в null?
Теперь ваш проект завершён!
@@ -207,23 +207,25 @@ function stopElementDrag() {
## 🚀Челлендж
-Добавьте новый обработчик событий в своё замыкание, чтобы сделать что-то ещё с растениями; например, двойной клик по растению, чтобы переместить его на передний план. Проявите креативность!
+Добавьте новый обработчик событий в своё замыкание, чтобы сделать что-то ещё с растениями; например, двойной щелчок по растению, чтобы переместить его на передний план. Проявите креативность!
-## Тест после лекции
+## Викторина после лекции
-[Тест после лекции](https://ff-quizzes.netlify.app/web/quiz/20)
+[Викторина после лекции](https://ff-quizzes.netlify.app/web/quiz/20)
## Обзор и самостоятельное изучение
-Хотя перетаскивание элементов по экрану кажется тривиальной задачей, существует множество способов сделать это и множество подводных камней, в зависимости от желаемого эффекта. На самом деле существует целый [API для перетаскивания и сброса](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API), который вы можете попробовать. Мы не использовали его в этом модуле, так как эффект, который мы хотели, был несколько другим, но попробуйте этот API в своём собственном проекте и посмотрите, чего вы сможете достичь.
+Хотя перемещение элементов по экрану кажется тривиальным, существует множество способов сделать это и множество подводных камней, в зависимости от желаемого эффекта. На самом деле существует целый [API для перетаскивания и сброса](https://developer.mozilla.org/docs/Web/API/HTML_Drag_and_Drop_API), который вы можете попробовать. Мы не использовали его в этом модуле, так как эффект, который мы хотели, был немного другим, но попробуйте этот API в своём собственном проекте и посмотрите, чего вы сможете добиться.
Найдите больше информации о событиях указателя в [документации W3C](https://www.w3.org/TR/pointerevents1/) и на [MDN web docs](https://developer.mozilla.org/docs/Web/API/Pointer_events).
-Всегда проверяйте возможности браузеров с помощью [CanIUse.com](https://caniuse.com/).
+Всегда проверяйте возможности браузеров, используя [CanIUse.com](https://caniuse.com/).
## Задание
[Поработайте немного больше с DOM](assignment.md)
+---
+
**Отказ от ответственности**:
-Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
+Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
diff --git a/translations/ru/4-typing-game/typing-game/README.md b/translations/ru/4-typing-game/typing-game/README.md
index 912dd1a7..1f5f0bfe 100644
--- a/translations/ru/4-typing-game/typing-game/README.md
+++ b/translations/ru/4-typing-game/typing-game/README.md
@@ -1,8 +1,8 @@
# Проект расширения для браузера, часть 1: Всё о браузерах
-
-> Скетчноут от [Wassim Chegham](https://dev.to/wassimchegham/ever-wondered-what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser-3dob)
+
+> Скетч от [Wassim Chegham](https://dev.to/wassimchegham/ever-wondered-what-happens-when-you-type-in-a-url-in-an-address-bar-in-a-browser-3dob)
## Викторина перед лекцией
@@ -18,94 +18,94 @@ CO_OP_TRANSLATOR_METADATA:
### Введение
-Расширения для браузеров добавляют дополнительный функционал в браузер. Но прежде чем создавать своё расширение, стоит немного узнать о том, как работают браузеры.
+Расширения для браузеров добавляют дополнительный функционал в браузер. Но прежде чем создавать одно из них, стоит немного узнать о том, как работают браузеры.
### О браузере
-В этом цикле уроков вы научитесь создавать расширение для браузера, которое будет работать в Chrome, Firefox и Edge. В этой части вы узнаете, как работают браузеры, и создадите основу для элементов расширения.
+В этом цикле уроков вы научитесь создавать расширение для браузера, которое будет работать в Chrome, Firefox и Edge. В этой части вы узнаете, как работают браузеры, и создадите структуру элементов расширения для браузера.
Но что такое браузер? Это программное приложение, которое позволяет пользователю получать контент с сервера и отображать его на веб-страницах.
✅ Немного истории: первый браузер назывался 'WorldWideWeb' и был создан сэром Тимоти Бернерс-Ли в 1990 году.
-
-> Некоторые из ранних браузеров, источник: [Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing)
+
+> Некоторые ранние браузеры, источник: [Karen McGrane](https://www.slideshare.net/KMcGrane/week-4-ixd-history-personal-computing)
Когда пользователь подключается к интернету, используя адрес URL (Uniform Resource Locator), обычно через протокол передачи гипертекста `http` или `https`, браузер связывается с веб-сервером и получает веб-страницу.
На этом этапе движок рендеринга браузера отображает её на устройстве пользователя, будь то мобильный телефон, настольный компьютер или ноутбук.
-Браузеры также могут кэшировать контент, чтобы не загружать его с сервера каждый раз. Они могут записывать историю посещений, сохранять "куки" — небольшие фрагменты данных, содержащие информацию о действиях пользователя, и многое другое.
+Браузеры также могут кэшировать контент, чтобы не загружать его с сервера каждый раз. Они могут записывать историю активности пользователя, сохранять "куки" — небольшие фрагменты данных, содержащие информацию о действиях пользователя, и многое другое.
-Важно помнить, что браузеры не одинаковы! У каждого свои сильные и слабые стороны, и профессиональный веб-разработчик должен понимать, как сделать веб-страницы удобными для работы в разных браузерах. Это включает в себя адаптацию для небольших экранов, таких как экраны мобильных телефонов, а также для пользователей, которые находятся в оффлайн-режиме.
+Важно помнить, что браузеры не одинаковы! У каждого есть свои сильные и слабые стороны, и профессиональный веб-разработчик должен понимать, как сделать веб-страницы удобными для работы в разных браузерах. Это включает в себя адаптацию для небольших экранов, таких как мобильные телефоны, а также для пользователей, находящихся в оффлайн-режиме.
-Очень полезный сайт, который стоит добавить в закладки в вашем любимом браузере, — это [caniuse.com](https://www.caniuse.com). При создании веб-страниц списки поддерживаемых технологий на этом сайте помогут вам лучше поддерживать ваших пользователей.
+Очень полезный сайт, который стоит добавить в закладки в вашем любимом браузере — [caniuse.com](https://www.caniuse.com). Когда вы создаёте веб-страницы, списки поддерживаемых технологий на этом сайте помогут вам лучше поддерживать ваших пользователей.
-✅ Как узнать, какие браузеры наиболее популярны среди пользователей вашего сайта? Проверьте аналитику — вы можете установить различные аналитические пакеты в рамках процесса разработки, и они покажут, какие браузеры чаще всего используются.
+✅ Как узнать, какие браузеры наиболее популярны среди пользователей вашего сайта? Проверьте аналитику — вы можете установить различные пакеты аналитики в рамках процесса веб-разработки, и они покажут, какие браузеры чаще всего используются.
## Расширения для браузеров
-Почему стоит создавать расширение для браузера? Это удобный инструмент, который позволяет быстро выполнять повторяющиеся задачи. Например, если вам часто нужно проверять цвета на веб-страницах, вы можете установить расширение для выбора цвета. Если вы забываете пароли, вам может помочь расширение для управления паролями.
+Почему стоит создавать расширение для браузера? Это удобный инструмент, который можно прикрепить к браузеру для быстрого доступа к задачам, которые вы часто повторяете. Например, если вам нужно проверять цвета на различных веб-страницах, вы можете установить расширение для выбора цвета. Если вам сложно запоминать пароли, вы можете использовать расширение для управления паролями.
-Создавать расширения для браузеров тоже интересно. Они обычно выполняют ограниченное количество задач, но делают это хорошо.
+Создавать расширения для браузеров тоже весело. Они обычно выполняют ограниченное количество задач, но делают это эффективно.
✅ Какие ваши любимые расширения для браузеров? Какие задачи они выполняют?
### Установка расширений
-Прежде чем начать разработку, ознакомьтесь с процессом создания и развертывания расширения для браузера. Хотя у каждого браузера есть свои особенности, процесс в Chrome и Firefox похож на этот пример для Edge:
+Прежде чем начать разработку, ознакомьтесь с процессом создания и развертывания расширения для браузера. Хотя каждый браузер немного отличается в управлении этим процессом, в Chrome и Firefox он похож на пример для Edge:
-
+
-> Примечание: Убедитесь, что включён режим разработчика и разрешена установка расширений из других магазинов.
+> Примечание: Убедитесь, что включен режим разработчика и разрешена установка расширений из других магазинов.
В общем, процесс будет следующим:
-- создайте расширение с помощью команды `npm run build`
-- откройте в браузере панель расширений через кнопку "Настройки и другое" (значок `...`) в правом верхнем углу
-- если это новая установка, выберите `load unpacked`, чтобы загрузить свежее расширение из папки сборки (в нашем случае это `/dist`)
-- или нажмите `reload`, если вы обновляете уже установленное расширение
+- создайте расширение, используя `npm run build`
+- откройте в браузере панель расширений через кнопку "Настройки и другое" (значок `...`) в правом верхнем углу
+- если это новая установка, выберите `load unpacked`, чтобы загрузить свежее расширение из папки сборки (в нашем случае это `/dist`)
+- или нажмите `reload`, если вы обновляете уже установленное расширение
-✅ Эти инструкции относятся к расширениям, которые вы создаёте сами; чтобы установить расширения из магазина расширений браузера, перейдите в соответствующий [магазин](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home) и установите нужное расширение.
+✅ Эти инструкции относятся к расширениям, которые вы создаёте сами; чтобы установить расширения, опубликованные в магазине расширений браузера, перейдите в соответствующие [магазины](https://microsoftedge.microsoft.com/addons/Microsoft-Edge-Extensions-Home) и установите нужное расширение.
### Начнём
-Вы создадите расширение для браузера, которое будет отображать углеродный след вашего региона, показывая энергопотребление и источник энергии. Расширение будет содержать форму для ввода API-ключа, чтобы вы могли получить доступ к API CO2 Signal.
+Вы создадите расширение для браузера, которое будет отображать углеродный след вашего региона, показывая энергопотребление и источник энергии. Расширение будет содержать форму для ввода ключа API, чтобы вы могли получить доступ к API CO2 Signal.
-**Вам понадобится:**
+**Вам потребуется:**
-- [API-ключ](https://www.co2signal.com/); введите ваш email на этой странице, и ключ будет отправлен вам
-- [код вашего региона](http://api.electricitymap.org/v3/zones), соответствующий [Electricity Map](https://www.electricitymap.org/map) (например, для Бостона используется 'US-NEISO')
-- [стартовый код](../../../../5-browser-extension/start). Скачайте папку `start`; вы будете дополнять код в этой папке
-- [NPM](https://www.npmjs.com) — инструмент для управления пакетами; установите его локально, и пакеты, указанные в вашем файле `package.json`, будут установлены для использования в вашем проекте
+- [ключ API](https://www.co2signal.com/); введите ваш email в поле на этой странице, и ключ будет отправлен вам
+- [код вашего региона](http://api.electricitymap.org/v3/zones), соответствующий [Electricity Map](https://www.electricitymap.org/map) (например, для Бостона используется 'US-NEISO')
+- [стартовый код](../../../../5-browser-extension/start). Скачайте папку `start`; вы будете дополнять код в этой папке.
+- [NPM](https://www.npmjs.com) — NPM — это инструмент управления пакетами; установите его локально, и пакеты, указанные в вашем файле `package.json`, будут установлены для использования в вашем веб-активе
-✅ Узнайте больше о пакетных менеджерах в этом [отличном модуле Learn](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon)
+✅ Узнайте больше о управлении пакетами в этом [отличном модуле Learn](https://docs.microsoft.com/learn/modules/create-nodejs-project-dependencies/?WT.mc_id=academic-77807-sagibbon)
Посмотрите на структуру кода:
-dist
- -|manifest.json (здесь задаются настройки по умолчанию)
- -|index.html (здесь разметка HTML для фронтенда)
- -|background.js (здесь фоновый JS)
- -|main.js (собранный JS)
-src
- -|index.js (здесь ваш JS-код)
+dist
+ -|manifest.json (здесь задаются настройки по умолчанию)
+ -|index.html (HTML-разметка фронтенда)
+ -|background.js (фоновые JS-скрипты)
+ -|main.js (собранный JS)
+src
+ -|index.js (ваш JS-код)
-✅ Как только у вас будут API-ключ и код региона, сохраните их где-нибудь для дальнейшего использования.
+✅ Как только у вас будут ключ API и код региона, сохраните их где-нибудь для дальнейшего использования.
### Создание HTML для расширения
-У этого расширения будет два представления. Одно для ввода API-ключа и кода региона:
+У этого расширения есть два представления. Одно для ввода ключа API и кода региона:
-
+
И второе для отображения углеродного следа региона:
-
+
Начнём с создания HTML для формы и её стилизации с помощью CSS.
-В папке `/dist` создайте форму и область для результатов. В файле `index.html` заполните область формы:
+В папке `/dist` вы создадите форму и область для результатов. В файле `index.html` заполните область формы:
```HTML
@@ -122,7 +122,7 @@ src
Submit
-```
+```
Это форма, где сохранённая информация будет вводиться и сохраняться в локальном хранилище.
Затем создайте область для результатов; под последним тегом формы добавьте несколько div:
@@ -139,12 +139,12 @@ src
Change region
-```
+```
На этом этапе вы можете попробовать сборку. Убедитесь, что установили зависимости пакетов для этого расширения:
```
npm install
-```
+```
Эта команда использует npm, менеджер пакетов Node, для установки webpack для процесса сборки вашего расширения. Вы можете увидеть результат этого процесса, заглянув в `/dist/main.js` — вы увидите, что код был собран.
@@ -156,7 +156,7 @@ npm install
## 🚀 Задание
-Зайдите в магазин расширений для браузера и установите одно из них. Вы можете изучить его файлы интересными способами. Что вы обнаружите?
+Посмотрите магазин расширений для браузеров и установите одно из них в ваш браузер. Вы можете изучить его файлы интересными способами. Что вы обнаружили?
## Викторина после лекции
@@ -164,17 +164,19 @@ npm install
## Обзор и самостоятельное изучение
-В этом уроке вы узнали немного о истории веб-браузеров; воспользуйтесь этой возможностью, чтобы узнать больше о том, как изобретатели Всемирной паутины представляли её использование, прочитав больше о её истории. Полезные ресурсы:
+На этом уроке вы узнали немного о истории веб-браузеров; воспользуйтесь этой возможностью, чтобы узнать, как создатели Всемирной паутины представляли её использование, прочитав больше о её истории. Полезные сайты:
-[История веб-браузеров](https://www.mozilla.org/firefox/browsers/browser-history/)
+[История веб-браузеров](https://www.mozilla.org/firefox/browsers/browser-history/)
-[История Интернета](https://webfoundation.org/about/vision/history-of-the-web/)
+[История веба](https://webfoundation.org/about/vision/history-of-the-web/)
-[Интервью с Тимом Бернерсом-Ли](https://www.theguardian.com/technology/2019/mar/12/tim-berners-lee-on-30-years-of-the-web-if-we-dream-a-little-we-can-get-the-web-we-want)
+[Интервью с Тимом Бернерсом-Ли](https://www.theguardian.com/technology/2019/mar/12/tim-berners-lee-on-30-years-of-the-web-if-we-dream-a-little-we-can-get-the-web-we-want)
-## Задание
+## Задание
-[Измените стиль вашего расширения](assignment.md)
+[Измените стиль вашего расширения](assignment.md)
+
+---
**Отказ от ответственности**:
-Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.
\ No newline at end of file
+Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
diff --git a/translations/ru/5-browser-extension/2-forms-browsers-local-storage/README.md b/translations/ru/5-browser-extension/2-forms-browsers-local-storage/README.md
index 92e254e7..808a5916 100644
--- a/translations/ru/5-browser-extension/2-forms-browsers-local-storage/README.md
+++ b/translations/ru/5-browser-extension/2-forms-browsers-local-storage/README.md
@@ -1,8 +1,8 @@
-# Создание космической игры. Часть 1: Введение
+# Создание космической игры, часть 1: Введение

@@ -17,28 +17,28 @@ CO_OP_TRANSLATOR_METADATA:
### Наследование и композиция в разработке игр
-В предыдущих уроках не было необходимости задумываться о проектировании архитектуры приложений, так как проекты были небольшими по масштабу. Однако, когда ваши приложения становятся больше и сложнее, архитектурные решения начинают играть более важную роль. В JavaScript есть два основных подхода к созданию крупных приложений: *композиция* и *наследование*. У каждого из них есть свои плюсы и минусы, но давайте рассмотрим их в контексте игры.
+В предыдущих уроках не было особой необходимости задумываться о архитектуре приложений, которые вы создавали, так как проекты были небольшими по масштабу. Однако, когда ваши приложения становятся больше, архитектурные решения начинают играть более важную роль. Существует два основных подхода к созданию крупных приложений на JavaScript: *композиция* или *наследование*. У каждого из них есть свои плюсы и минусы, но давайте рассмотрим их в контексте игры.
✅ Одна из самых известных книг по программированию посвящена [шаблонам проектирования](https://en.wikipedia.org/wiki/Design_Patterns).
-В игре есть `игровые объекты`, которые представляют собой объекты, существующие на экране. Это означает, что у них есть местоположение в декартовой системе координат, характеризуемое координатами `x` и `y`. В процессе разработки игры вы заметите, что все игровые объекты имеют стандартные свойства, общие для каждой создаваемой вами игры. Это элементы, которые:
+В игре есть `игровые объекты`, которые представляют собой объекты, существующие на экране. Это означает, что они имеют местоположение в декартовой системе координат, характеризуемое наличием координат `x` и `y`. В процессе разработки игры вы заметите, что все игровые объекты имеют стандартные свойства, общие для каждой игры, а именно элементы, которые:
-- **привязаны к местоположению**. Большинство, если не все, игровые элементы привязаны к местоположению. Это означает, что у них есть координаты `x` и `y`.
-- **подвижные**. Это объекты, которые могут перемещаться в новое местоположение. Обычно это герой, монстр или NPC (неигровой персонаж), но не, например, статичный объект вроде дерева.
-- **самоуничтожающиеся**. Эти объекты существуют только в течение определенного времени, после чего они помечаются для удаления. Обычно это представлено булевым значением `dead` или `destroyed`, которое сигнализирует игровому движку, что объект больше не нужно отображать.
-- **с "перезарядкой"**. "Перезарядка" — это типичное свойство для объектов с коротким сроком жизни. Примером может быть текст или графический эффект, например, взрыв, который должен отображаться только несколько миллисекунд.
+- **основаны на местоположении** Большинство, если не все, игровые элементы основаны на местоположении. Это означает, что у них есть местоположение, `x` и `y`.
+- **подвижные** Это объекты, которые могут перемещаться в новое местоположение. Обычно это герой, монстр или NPC (персонаж, не управляемый игроком), но не, например, статичный объект, такой как дерево.
+- **самоуничтожающиеся** Эти объекты существуют только в течение определенного времени, после чего они подготавливаются к удалению. Обычно это представлено булевым значением `dead` или `destroyed`, которое сигнализирует игровому движку, что этот объект больше не должен отображаться.
+- **с задержкой** 'Задержка' — это типичное свойство для объектов с коротким сроком жизни. Типичный пример — текст или графический эффект, например, взрыв, который должен быть виден только несколько миллисекунд.
-✅ Подумайте об игре Pac-Man. Можете ли вы определить четыре типа объектов, перечисленных выше, в этой игре?
+✅ Подумайте о такой игре, как Pac-Man. Можете ли вы определить четыре типа объектов, перечисленных выше, в этой игре?
### Выражение поведения
-Все описанное выше — это поведение, которое могут иметь игровые объекты. Как же это закодировать? Мы можем выразить это поведение как методы, связанные с классами или объектами.
+Все, что мы описали выше, — это поведение, которое могут иметь игровые объекты. Как же мы можем закодировать это? Мы можем выразить это поведение как методы, связанные либо с классами, либо с объектами.
**Классы**
Идея заключается в использовании `классов` в сочетании с `наследованием`, чтобы добавить определенное поведение к классу.
-✅ Наследование — это важная концепция для понимания. Узнайте больше из [статьи MDN о наследовании](https://developer.mozilla.org/docs/Web/JavaScript/Inheritance_and_the_prototype_chain).
+✅ Наследование — важная концепция для понимания. Узнайте больше в [статье MDN о наследовании](https://developer.mozilla.org/docs/Web/JavaScript/Inheritance_and_the_prototype_chain).
В коде игровой объект может выглядеть примерно так:
@@ -88,11 +88,11 @@ hero.moveTo(5,5);
const tree = new Tree();
```
-✅ Потратьте несколько минут, чтобы представить героя из Pac-Man (например, Инки, Пинки или Блинки) и подумать, как он мог бы быть написан на JavaScript.
+✅ Потратьте несколько минут, чтобы представить героя Pac-Man (например, Inky, Pinky или Blinky) и как он мог бы быть написан на JavaScript.
**Композиция**
-Другой способ работы с наследованием объектов — использование *композиции*. В этом случае объекты выражают свое поведение следующим образом:
+Другой способ обработки наследования объектов — использование *композиции*. Тогда объекты выражают свое поведение следующим образом:
```javascript
//create a constant gameObject
@@ -139,23 +139,23 @@ const tree = createStatic(0,0, 'Tree');
**Какой шаблон выбрать?**
-Выбор за вами. JavaScript поддерживает оба этих подхода.
+Выбор за вами, какой шаблон использовать. JavaScript поддерживает оба этих подхода.
--
-Еще один распространенный шаблон в разработке игр решает проблему управления пользовательским опытом и производительностью игры.
+Еще один шаблон, часто используемый в разработке игр, решает проблему управления пользовательским интерфейсом игры и производительностью.
## Шаблон Pub/Sub
-✅ Pub/Sub расшифровывается как 'publish-subscribe' (публикация-подписка).
+✅ Pub/Sub означает 'publish-subscribe' (публикация-подписка)
-Этот шаблон предполагает, что различные части вашего приложения не должны знать друг о друге. Почему это важно? Это значительно упрощает понимание происходящего в целом, если различные части приложения разделены. Это также упрощает внесение изменений в поведение, если это потребуется. Как это реализовать? Для этого вводятся следующие концепции:
+Этот шаблон предполагает, что различные части вашего приложения не должны знать друг о друге. Почему это важно? Это значительно упрощает понимание происходящего в целом, если различные части разделены. Это также облегчает внезапное изменение поведения, если это необходимо. Как мы можем это реализовать? Мы делаем это, вводя несколько концепций:
-- **сообщение**: Сообщение обычно представляет собой строку текста с необязательным полезным грузом (данными, уточняющими, о чем сообщение). Типичное сообщение в игре может быть `KEY_PRESSED_ENTER`.
+- **сообщение**: Сообщение обычно представляет собой строку текста, сопровождаемую необязательной полезной нагрузкой (данными, уточняющими, о чем сообщение). Типичное сообщение в игре может быть `KEY_PRESSED_ENTER`.
- **издатель**: Этот элемент *публикует* сообщение и отправляет его всем подписчикам.
-- **подписчик**: Этот элемент *слушает* определенные сообщения и выполняет задачу в результате получения этого сообщения, например, стреляет лазером.
+- **подписчик**: Этот элемент *слушает* определенные сообщения и выполняет какую-либо задачу в результате получения этого сообщения, например, стрельбу лазером.
-Реализация этого шаблона довольно компактна, но он очень мощный. Вот как это можно реализовать:
+Реализация довольно компактна, но это очень мощный шаблон. Вот как он может быть реализован:
```javascript
//set up an EventEmitter class that contains listeners
@@ -180,7 +180,7 @@ class EventEmitter {
```
-Чтобы использовать приведенный выше код, мы можем создать небольшую реализацию:
+Чтобы использовать приведенный выше код, мы можем создать очень небольшую реализацию:
```javascript
//set up a message structure
@@ -204,7 +204,7 @@ window.addEventListener('keyup', (evt) => {
});
```
-В приведенном выше примере мы связываем событие клавиатуры `ArrowLeft` и отправляем сообщение `HERO_MOVE_LEFT`. Мы слушаем это сообщение и перемещаем `героя` в результате. Сила этого шаблона в том, что обработчик событий и герой ничего не знают друг о друге. Вы можете переназначить `ArrowLeft` на клавишу `A`. Кроме того, можно сделать что-то совершенно другое на `ArrowLeft`, внеся несколько изменений в функцию `on` объекта eventEmitter:
+В приведенном выше примере мы связываем событие клавиатуры, `ArrowLeft`, и отправляем сообщение `HERO_MOVE_LEFT`. Мы слушаем это сообщение и перемещаем `hero` в результате. Сила этого шаблона заключается в том, что обработчик событий и герой не знают друг о друге. Вы можете переназначить `ArrowLeft` на клавишу `A`. Кроме того, можно сделать что-то совершенно другое на `ArrowLeft`, внеся несколько изменений в функцию `on` объекта eventEmitter:
```javascript
eventEmitter.on(Messages.HERO_MOVE_LEFT, () => {
@@ -212,13 +212,13 @@ eventEmitter.on(Messages.HERO_MOVE_LEFT, () => {
});
```
-Когда ваша игра становится сложнее, этот шаблон остается неизменным по сложности, а ваш код остается чистым. Очень рекомендуется использовать этот шаблон.
+Когда игра становится сложнее, этот шаблон сохраняет свою простоту, а ваш код остается чистым. Очень рекомендуется использовать этот шаблон.
---
## 🚀 Задание
-Подумайте, как шаблон pub-sub может улучшить игру. Какие части должны отправлять события, и как игра должна на них реагировать? Сейчас у вас есть возможность проявить креативность, придумав новую игру и то, как ее части могут взаимодействовать.
+Подумайте, как шаблон pub-sub может улучшить игру. Какие части должны генерировать события, и как игра должна на них реагировать? Сейчас у вас есть возможность проявить творческий подход, придумав новую игру и то, как ее части могут взаимодействовать.
## Викторина после лекции
@@ -232,5 +232,7 @@ eventEmitter.on(Messages.HERO_MOVE_LEFT, () => {
[Создайте макет игры](assignment.md)
+---
+
**Отказ от ответственности**:
-Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
+Этот документ был переведен с помощью сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Хотя мы стремимся к точности, пожалуйста, учитывайте, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
diff --git a/translations/ru/6-space-game/2-drawing-to-canvas/README.md b/translations/ru/6-space-game/2-drawing-to-canvas/README.md
index 2dc6cf44..5dcfee97 100644
--- a/translations/ru/6-space-game/2-drawing-to-canvas/README.md
+++ b/translations/ru/6-space-game/2-drawing-to-canvas/README.md
@@ -1,8 +1,8 @@
-# Создание космической игры. Часть 6: Завершение и перезапуск
+# Создание космической игры, часть 6: завершение и перезапуск
## Викторина перед лекцией
[Викторина перед лекцией](https://ff-quizzes.netlify.app/web/quiz/39)
-Существует множество способов задать *условие завершения* игры. Как создатель игры, вы сами решаете, почему игра должна закончиться. Вот несколько возможных причин, если мы говорим о космической игре, которую вы разрабатывали до сих пор:
+Существует множество способов задать *условие завершения* игры. Как создатель игры, вы сами решаете, почему игра должна закончиться. Вот несколько возможных причин, если мы говорим о космической игре, которую вы создавали до этого момента:
-- **Уничтожено `N` вражеских кораблей**: Это довольно распространенный вариант, если вы делите игру на уровни, где для завершения уровня нужно уничтожить `N` вражеских кораблей.
-- **Ваш корабль уничтожен**: Есть игры, где вы проигрываете, если ваш корабль уничтожен. Другой распространенный подход — это концепция жизней. Каждый раз, когда ваш корабль уничтожается, вы теряете одну жизнь. Когда все жизни исчерпаны, игра заканчивается.
-- **Вы набрали `N` очков**: Еще одно популярное условие завершения — это набор определенного количества очков. Как именно вы их зарабатываете, зависит от вас, но обычно очки начисляются за различные действия, например, за уничтожение вражеского корабля или сбор предметов, которые выпадают при уничтожении.
-- **Завершение уровня**: Это может включать несколько условий, таких как уничтожение `X` вражеских кораблей, сбор `Y` очков или, возможно, нахождение определенного предмета.
+- **Уничтожено `N` вражеских кораблей**: Это довольно распространенный подход, если игра разделена на уровни, где для завершения уровня нужно уничтожить `N` вражеских кораблей.
+- **Ваш корабль уничтожен**: Есть игры, где вы проигрываете, если ваш корабль уничтожен. Другой популярный подход — это концепция жизней. Каждый раз, когда ваш корабль уничтожается, вы теряете одну жизнь. Когда все жизни исчерпаны, игра заканчивается.
+- **Вы набрали `N` очков**: Еще одно распространенное условие завершения — это набор определенного количества очков. Как именно вы получаете очки, зависит от вас, но обычно очки присваиваются за различные действия, например, уничтожение вражеского корабля или сбор предметов, которые выпадают при их уничтожении.
+- **Завершение уровня**: Это может включать несколько условий, таких как уничтожение `X` вражеских кораблей, сбор `Y` очков или, возможно, сбор определенного предмета.
## Перезапуск
-Если ваша игра понравится игрокам, они, скорее всего, захотят сыграть снова. Когда игра заканчивается, по любой причине, вы должны предложить возможность перезапуска.
+Если людям нравится ваша игра, они, скорее всего, захотят сыграть снова. Когда игра заканчивается по какой-либо причине, вы должны предложить возможность перезапуска.
-✅ Подумайте, при каких условиях игра заканчивается, и как вам предлагают ее перезапустить.
+✅ Подумайте, при каких условиях игра заканчивается, и как игроку предлагается ее перезапустить.
## Что нужно сделать
-Вы добавите в игру следующие правила:
+Вы добавите следующие правила в свою игру:
-1. **Победа в игре**. Когда все вражеские корабли уничтожены, вы выигрываете. Также отобразите сообщение о победе.
-1. **Перезапуск**. Когда все жизни потеряны или игра выиграна, предложите возможность перезапуска. Помните! Вам нужно будет заново инициализировать игру, очистив предыдущее состояние.
+1. **Победа в игре**. Когда все вражеские корабли уничтожены, игрок выигрывает. Также необходимо отобразить сообщение о победе.
+1. **Перезапуск**. Когда все жизни потеряны или игра выиграна, нужно предложить способ перезапуска игры. Помните! Вам нужно будет заново инициализировать игру, очистив предыдущее состояние.
## Рекомендуемые шаги
@@ -55,13 +55,13 @@ cd your-work
npm start
```
-Это запустит HTTP-сервер по адресу `http://localhost:5000`. Откройте браузер и введите этот адрес. Ваша игра должна быть в рабочем состоянии.
+Это запустит HTTP-сервер по адресу `http://localhost:5000`. Откройте браузер и введите этот адрес. Ваша игра должна быть готова к игре.
-> совет: чтобы избежать предупреждений в Visual Studio Code, измените функцию `window.onload`, чтобы вызывать `gameLoopId` как есть (без `let`), и объявите `gameLoopId` в начале файла отдельно: `let gameLoopId;`
+> совет: чтобы избежать предупреждений в Visual Studio Code, измените функцию `window.onload`, чтобы она вызывала `gameLoopId` как есть (без `let`), и объявите `gameLoopId` в начале файла отдельно: `let gameLoopId;`
### Добавление кода
-1. **Отслеживание условий завершения**. Добавьте код, который отслеживает количество врагов или уничтожение корабля героя, добавив эти две функции:
+1. **Отслеживание условия завершения**. Добавьте код, который отслеживает количество врагов или уничтожение корабля героя, добавив эти две функции:
```javascript
function isHeroDead() {
@@ -74,7 +74,7 @@ npm start
}
```
-1. **Добавьте логику в обработчики сообщений**. Измените `eventEmitter`, чтобы обрабатывать эти условия:
+1. **Добавьте логику в обработчики сообщений**. Измените `eventEmitter`, чтобы он обрабатывал эти условия:
```javascript
eventEmitter.on(Messages.COLLISION_ENEMY_LASER, (_, { first, second }) => {
@@ -115,9 +115,9 @@ npm start
GAME_END_WIN: "GAME_END_WIN",
```
-2. **Добавьте код перезапуска**. Реализуйте перезапуск игры при нажатии выбранной кнопки.
+2. **Добавьте код для перезапуска**. Напишите код, который перезапускает игру при нажатии выбранной кнопки.
- 1. **Слушайте нажатие клавиши `Enter`**. Измените обработчик событий окна, чтобы слушать это нажатие:
+ 1. **Слушайте нажатие клавиши `Enter`**. Измените обработчик событий окна, чтобы он реагировал на это нажатие:
```javascript
else if(evt.key === "Enter") {
@@ -131,7 +131,7 @@ npm start
KEY_EVENT_ENTER: "KEY_EVENT_ENTER",
```
-1. **Реализуйте игровые правила**. Реализуйте следующие правила:
+1. **Реализуйте правила игры**. Реализуйте следующие правила игры:
1. **Условие победы игрока**. Когда все вражеские корабли уничтожены, отобразите сообщение о победе.
@@ -171,7 +171,7 @@ npm start
}
```
- 1. **Логика перезапуска**. Когда все жизни потеряны или игрок выиграл, отобразите сообщение о возможности перезапуска. Также перезапустите игру при нажатии клавиши перезапуска (вы можете выбрать, какая клавиша будет использоваться).
+ 1. **Логика перезапуска**. Когда все жизни потеряны или игрок выиграл игру, отобразите сообщение о возможности перезапуска. Также перезапустите игру при нажатии клавиши *перезапуска* (вы можете сами выбрать, какая клавиша будет использоваться для перезапуска).
1. Создайте функцию `resetGame()`:
@@ -210,13 +210,13 @@ npm start
}
```
-👽 💥 🚀 Поздравляем, Капитан! Ваша игра завершена! Отличная работа! 🚀 💥 👽
+👽 💥 🚀 Поздравляем, капитан! Ваша игра завершена! Отличная работа! 🚀 💥 👽
---
## 🚀 Задание
-Добавьте звук! Можете ли вы добавить звук, чтобы улучшить игровой процесс? Например, при попадании лазера, гибели героя или победе. Ознакомьтесь с этим [примером](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play), чтобы узнать, как воспроизводить звук с помощью JavaScript.
+Добавьте звук! Можете ли вы добавить звук, чтобы улучшить игровой процесс, например, при попадании лазера, гибели героя или победе? Ознакомьтесь с этим [примером](https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_audio_play), чтобы узнать, как воспроизводить звук с помощью JavaScript.
## Викторина после лекции
@@ -224,11 +224,13 @@ npm start
## Обзор и самостоятельное изучение
-Ваше задание — создать новую пробную игру, поэтому изучите интересные игры, чтобы понять, какую игру вы могли бы разработать.
+Ваше задание — создать новую пробную игру, поэтому изучите некоторые интересные игры, чтобы понять, какую игру вы могли бы создать.
## Задание
[Создайте пробную игру](assignment.md)
+---
+
**Отказ от ответственности**:
-Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникающие в результате использования данного перевода.
\ No newline at end of file
+Этот документ был переведен с использованием сервиса автоматического перевода [Co-op Translator](https://github.com/Azure/co-op-translator). Несмотря на наши усилия обеспечить точность, автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его родном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется профессиональный перевод человеком. Мы не несем ответственности за любые недоразумения или неправильные интерпретации, возникшие в результате использования данного перевода.
\ No newline at end of file
diff --git a/translations/ru/7-bank-project/1-template-route/README.md b/translations/ru/7-bank-project/1-template-route/README.md
index 462f5f9f..efdd3710 100644
--- a/translations/ru/7-bank-project/1-template-route/README.md
+++ b/translations/ru/7-bank-project/1-template-route/README.md
@@ -1,8 +1,8 @@
`.
+> Совет: при создании HTML-шаблонов, если вы хотите увидеть, как они будут выглядеть, вы можете закомментировать строки `