From 05f7f07477cb8012979819961feb749209154051 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Tue, 1 Nov 2016 18:25:08 +0700
Subject: [PATCH 01/73] Table of contents

---
 Definitions.md |  8 ++++++
 README.md      | 26 ++++++++++++++++++
 READMEeng.md   | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 108 insertions(+)
 create mode 100644 Definitions.md
 create mode 100644 READMEeng.md

diff --git a/Definitions.md b/Definitions.md
new file mode 100644
index 0000000..2c40973
--- /dev/null
+++ b/Definitions.md
@@ -0,0 +1,8 @@
+Термины и определения
+
+package - пакет
+https://ru.wikipedia.org/wiki/Package_(Java)
+
+class - класс
+
+Type Checking - Типизация
diff --git a/README.md b/README.md
index 27cfdaa..67f9c63 100644
--- a/README.md
+++ b/README.md
@@ -56,6 +56,32 @@ The code of this tutorial works on Linux, macOS, and Windows.
 
 [12 - Type Checking with Flow](/tutorial/12-flow)
 
+## Содержание
+
+[1 - Node, NPM, Yarn, и package.json](/tutorial/1-node-npm-yarn-package-json)
+
+[2 - Установка и использование пакетов](/tutorial/2-packages)
+
+[3 - Настройка ES6 с Babel и Gulp](/tutorial/3-es6-babel-gulp)
+
+[4 - Использование ES6 синтактиса ~с классами~](/tutorial/4-es6-syntax-class)
+
+[5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
+
+[6 - ESLint](/tutorial/6-eslint)
+
+[7 - Клиентское приложение ~на основе Webpack~](/tutorial/7-client-webpack)
+
+[8 - React](/tutorial/8-react)
+
+[9 - Redux](/tutorial/9-redux)
+
+[10 - Immutable JS and ~Redux Improvements~](/tutorial/10-immutable-redux-improvements)
+
+[11 - Тестировние с Mocha, Chai, и Sinon](/tutorial/11-testing-mocha-chai-sinon)
+
+[12 - ~Типизация с~ Flow](/tutorial/12-flow)
+
 ## Coming up next
 
 Production / development environments, Express, React Router, Server-Side Rendering, Styling, Enzyme, Git Hooks.
diff --git a/READMEeng.md b/READMEeng.md
new file mode 100644
index 0000000..27cfdaa
--- /dev/null
+++ b/READMEeng.md
@@ -0,0 +1,74 @@
+# JavaScript Stack from Scratch
+
+[![Yarn](/img/yarn.png)](https://yarnpkg.com/)
+[![React](/img/react.png)](https://facebook.github.io/react/)
+[![Gulp](/img/gulp.png)](http://gulpjs.com/)
+[![Redux](/img/redux.png)](http://redux.js.org/)
+[![ESLint](/img/eslint.png)](http://eslint.org/)
+[![Webpack](/img/webpack.png)](https://webpack.github.io/)
+[![Mocha](/img/mocha.png)](https://mochajs.org/)
+[![Chai](/img/chai.png)](http://chaijs.com/)
+[![Flow](/img/flow.png)](https://flowtype.org/)
+
+[![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch)
+
+Welcome to my modern JavaScript stack tutorial: **JavaScript Stack from Scratch**.
+
+This is a minimalistic and straight-to-the-point guide to assembling a JavaScript stack. It requires some general programming knowledge, and JavaScript basics. **It focuses on wiring tools together** and giving you the **simplest possible example** for each tool. You can see this tutorial as *a way to write your own boilerplate from scratch*.
+
+You don't need to use this entire stack if you build a simple web page with a few JS interactions of course (a combination of Babel + jQuery is enough!), but if you want to build a web app that scales, and need help setting things up, this tutorial will work great for you.
+
+Since the goal of this tutorial is to assemble various tools, I do not go into details about how these tools work individually. Refer to their documentation or find other tutorials if you want to acquire deeper knowledge in them.
+
+A big chunk of the stack described in this tutorial uses React. If you are beginning and just want to learn React, [create-react-app](https://github.com/facebookincubator/create-react-app) will get you up and running with a React environment very quickly with a premade configuration. I would for instance recommend this approach to someone who arrives in a team that's using React and needs to catch up with a learning playground. In this tutorial you won't use a premade configuration, because I want you to understand everything that's happening under the hood.
+
+Code examples are available for each chapter, and you can run them all with `yarn && yarn start` or `npm install && npm start`. I recommend writing everything from scratch yourself by following the **step-by-step instructions** of each chapter.
+
+**Every chapter contains the code of previous chapters**, so if you are simply looking for a boilerplate project containing everything, just clone the last chapter and you're good to go.
+
+Note: The order of chapters is not necessarily the most educational. For instance, testing / type checking could have been done before introducing React. It is quite difficult to move chapters around or edit past ones, since I need to apply those changes to every following chapter. If things settle down, I might reorganize the whole thing in a better way.
+
+The code of this tutorial works on Linux, macOS, and Windows.
+
+## Table of contents
+
+[1 - Node, NPM, Yarn, and package.json](/tutorial/1-node-npm-yarn-package-json)
+
+[2 - Installing and using a package](/tutorial/2-packages)
+
+[3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
+
+[4 - Using the ES6 syntax with a class](/tutorial/4-es6-syntax-class)
+
+[5 - The ES6 modules syntax](/tutorial/5-es6-modules-syntax)
+
+[6 - ESLint](/tutorial/6-eslint)
+
+[7 - Client app with Webpack](/tutorial/7-client-webpack)
+
+[8 - React](/tutorial/8-react)
+
+[9 - Redux](/tutorial/9-redux)
+
+[10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
+
+[11 - Testing with Mocha, Chai, and Sinon](/tutorial/11-testing-mocha-chai-sinon)
+
+[12 - Type Checking with Flow](/tutorial/12-flow)
+
+## Coming up next
+
+Production / development environments, Express, React Router, Server-Side Rendering, Styling, Enzyme, Git Hooks.
+
+## Translations
+
+- [Chinese](https://github.com/pd4d10/js-stack-from-scratch) by [@pd4d10](http://github.com/pd4d10)
+- [Italian](https://github.com/fbertone/js-stack-from-scratch) by [Fabrizio Bertone](https://github.com/fbertone)
+
+If you want to add your translation, please read the [translation recommendations](/how-to-translate.md) to get started!
+
+## Credits
+
+Created by [@verekia](https://twitter.com/verekia) – [verekia.com](http://verekia.com/).
+
+License: MIT
-- 
GitLab


From 187d2177c32b3762fa7800bc3b0b8f6acd65f397 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Tue, 1 Nov 2016 18:26:28 +0700
Subject: [PATCH 02/73] upd

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 67f9c63..bda49ff 100644
--- a/README.md
+++ b/README.md
@@ -64,7 +64,7 @@ The code of this tutorial works on Linux, macOS, and Windows.
 
 [3 - Настройка ES6 с Babel и Gulp](/tutorial/3-es6-babel-gulp)
 
-[4 - Использование ES6 синтактиса ~с классами~](/tutorial/4-es6-syntax-class)
+[4 - Использование ES6 синтактиса ~~с классами~~](/tutorial/4-es6-syntax-class)
 
 [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
 
-- 
GitLab


From 7ad291cc262416fa9183f36514ac68629a7ff575 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Tue, 1 Nov 2016 20:14:25 +0700
Subject: [PATCH 03/73] section 4

---
 Definitions.md                           | 12 +++++++
 README.md                                |  2 +-
 tutorial/4-es6-syntax-class/README.md    | 20 ++++++------
 tutorial/4-es6-syntax-class/READMEeng.md | 41 ++++++++++++++++++++++++
 4 files changed, 64 insertions(+), 11 deletions(-)
 create mode 100644 tutorial/4-es6-syntax-class/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index 2c40973..83bab5a 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -6,3 +6,15 @@ https://ru.wikipedia.org/wiki/Package_(Java)
 class - класс
 
 Type Checking - Типизация
+
+OOP - объектно-ориентированное программирование
+
+JavaScript
+
+template strings - Шаблонные строки
+https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/template_strings
+
+arrow functions - стрелочные функции
+https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/Arrow_functions
+
+
diff --git a/README.md b/README.md
index bda49ff..05f98b2 100644
--- a/README.md
+++ b/README.md
@@ -64,7 +64,7 @@ The code of this tutorial works on Linux, macOS, and Windows.
 
 [3 - Настройка ES6 с Babel и Gulp](/tutorial/3-es6-babel-gulp)
 
-[4 - Использование ES6 синтактиса ~~с классами~~](/tutorial/4-es6-syntax-class)
+[4 - Использование ES6 синтактиса ~~и классов~~](/tutorial/4-es6-syntax-class)
 
 [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
 
diff --git a/tutorial/4-es6-syntax-class/README.md b/tutorial/4-es6-syntax-class/README.md
index 4dc8c7c..73d5976 100644
--- a/tutorial/4-es6-syntax-class/README.md
+++ b/tutorial/4-es6-syntax-class/README.md
@@ -1,6 +1,6 @@
-# 4 - Using the ES6 syntax with a class
+# 4 - Использование ES6 синтактиса ~~и классов~~
 
-- Create a new file, `src/dog.js`, containing the following ES6 class:
+- Создайте новый файл, `src/dog.js`, содержащий сделующий ES6 класс:
 
 ```javascript
 class Dog {
@@ -16,11 +16,11 @@ class Dog {
 module.exports = Dog;
 ```
 
-It should not look surprising to you if you've done OOP in the past in any language. It's relatively recent for JavaScript though. The class is exposed to the outside world via the `module.exports` assignment.
+Это не должно вас смущать, если вы сталкивались с ООП в любом другом языке программирования. Хотя в JavaScript  классы появились относительно недавно. Класс взаимодействует с окружающим миром, путем определения `module.exports`.
 
-Typical ES6 code uses classes, `const` and `let`, "template strings" (with back ticks) like the one in `bark()`, and arrow functions (`(param) => { console.log('Hi'); }`), even though we're not using any in this example.
+Обычно в ES6 коде присутствуют классы, `const` и `let`, "шаблонные строки" (в обратных кавычках) как в функции `bark()` и стрелочные функции (`(param) => { console.log('Hi'); }`), хотя мы их не используем в нашем примере.
 
-In `src/index.js`, write the following:
+В `src/index.js`, напишите следующее:
 
 ```javascript
 const Dog = require('./dog');
@@ -29,13 +29,13 @@ const toby = new Dog('Toby');
 
 console.log(toby.bark());
 ```
-As you can see, unlike the community-made package `color` that we used before, when we require one of our files, we use `./` in the `require()`.
+Как вы можете видеть в отличие от ~~community-made~~ пакета `color`, который мы использовали ранее, когда мы подключаем один из наших файлов, мы используем `./` в `require()`.
 
-- Run `yarn start` and it should print 'Wah wah, I am Toby'.
+- Запустите `yarn start` и должно отобразиться 'Wah wah, I am Toby'.
 
-- Take a look at the code generated in `lib` to see how your compiled code looks like (`var` instead of `const` for instance).
+- Посмотрите на код сгенерированный в директории `lib`, чтобы увидеть как он выглядит в скомпилированном виде (`var` вместо `const` например).
 
 
-Next section: [5 - The ES6 modules syntax](/tutorial/5-es6-modules-syntax)
+Следующий раздел: [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
 
-Back to the [previous section](/tutorial/3-es6-babel-gulp) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/3-es6-babel-gulp) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
diff --git a/tutorial/4-es6-syntax-class/READMEeng.md b/tutorial/4-es6-syntax-class/READMEeng.md
new file mode 100644
index 0000000..4dc8c7c
--- /dev/null
+++ b/tutorial/4-es6-syntax-class/READMEeng.md
@@ -0,0 +1,41 @@
+# 4 - Using the ES6 syntax with a class
+
+- Create a new file, `src/dog.js`, containing the following ES6 class:
+
+```javascript
+class Dog {
+  constructor(name) {
+    this.name = name;
+  }
+
+  bark() {
+    return `Wah wah, I am ${this.name}`;
+  }
+}
+
+module.exports = Dog;
+```
+
+It should not look surprising to you if you've done OOP in the past in any language. It's relatively recent for JavaScript though. The class is exposed to the outside world via the `module.exports` assignment.
+
+Typical ES6 code uses classes, `const` and `let`, "template strings" (with back ticks) like the one in `bark()`, and arrow functions (`(param) => { console.log('Hi'); }`), even though we're not using any in this example.
+
+In `src/index.js`, write the following:
+
+```javascript
+const Dog = require('./dog');
+
+const toby = new Dog('Toby');
+
+console.log(toby.bark());
+```
+As you can see, unlike the community-made package `color` that we used before, when we require one of our files, we use `./` in the `require()`.
+
+- Run `yarn start` and it should print 'Wah wah, I am Toby'.
+
+- Take a look at the code generated in `lib` to see how your compiled code looks like (`var` instead of `const` for instance).
+
+
+Next section: [5 - The ES6 modules syntax](/tutorial/5-es6-modules-syntax)
+
+Back to the [previous section](/tutorial/3-es6-babel-gulp) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
-- 
GitLab


From 796c3240e5532bb43839f9c8acd574e2913b5952 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Tue, 1 Nov 2016 20:59:24 +0700
Subject: [PATCH 04/73] section 5

---
 Definitions.md                             |  8 ++++
 tutorial/4-es6-syntax-class/README.md      |  4 +-
 tutorial/5-es6-modules-syntax/README.md    | 28 ++++++------
 tutorial/5-es6-modules-syntax/READMEeng.md | 50 ++++++++++++++++++++++
 4 files changed, 74 insertions(+), 16 deletions(-)
 create mode 100644 tutorial/5-es6-modules-syntax/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index 83bab5a..c0dc7da 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -17,4 +17,12 @@ https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/template_strings
 arrow functions - стрелочные функции
 https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/Arrow_functions
 
+CommonJS
 
+Gulp
+
+Node
+
+Babel
+
+синтаксический сахар - syntactic sugar
diff --git a/tutorial/4-es6-syntax-class/README.md b/tutorial/4-es6-syntax-class/README.md
index 73d5976..f9d8495 100644
--- a/tutorial/4-es6-syntax-class/README.md
+++ b/tutorial/4-es6-syntax-class/README.md
@@ -16,7 +16,7 @@ class Dog {
 module.exports = Dog;
 ```
 
-Это не должно вас смущать, если вы сталкивались с ООП в любом другом языке программирования. Хотя в JavaScript  классы появились относительно недавно. Класс взаимодействует с окружающим миром, путем определения `module.exports`.
+Это не должно вас смущать, если вы сталкивались с ООП в любом другом языке программирования, хотя в JavaScript  классы появились относительно недавно. Класс взаимодействует с окружающим миром, путем определения `module.exports`.
 
 Обычно в ES6 коде присутствуют классы, `const` и `let`, "шаблонные строки" (в обратных кавычках) как в функции `bark()` и стрелочные функции (`(param) => { console.log('Hi'); }`), хотя мы их не используем в нашем примере.
 
@@ -33,7 +33,7 @@ console.log(toby.bark());
 
 - Запустите `yarn start` и должно отобразиться 'Wah wah, I am Toby'.
 
-- Посмотрите на код сгенерированный в директории `lib`, чтобы увидеть как он выглядит в скомпилированном виде (`var` вместо `const` например).
+- Посмотрите на код сгенерированный в директории `lib`, чтобы увидеть как он выглядит в скомпилированном виде (`var` вместо `const`, например).
 
 
 Следующий раздел: [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 0d5ce9e..55b1530 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -1,10 +1,10 @@
-# 5 - The ES6 modules syntax
+# 5 - Синтаксис модулей ES6
 
-Here we simply replace `const Dog = require('./dog')` by `import Dog from './dog'`, which is the newer ES6 modules syntax (as opposed to "CommonJS" modules syntax).
+Здесь мы просто заменим `const Dog = require('./dog')` на `import Dog from './dog'`, что является более новым синтаксисом ES6 модулей (по сравнению с синтаксисом "CommonJS" модулей).
 
-In `dog.js`, we also replace `module.exports = Dog` by `export default Dog`.
+В `dog.js`, мы также заменим `module.exports = Dog` на `export default Dog`.
 
-Note that in `dog.js`, the name `Dog` is only used in the `export`. Therefore it could be possible to export directly an anonymous class like this instead:
+Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, вместо этого, можно напрямую экспортировать анонимный класс таким образом: 
 
 ```javascript
 export default class {
@@ -18,21 +18,21 @@ export default class {
 }
 ```
 
-You might now guess that the name 'Dog' used in the `import` in `index.js` is actually completely up to you. This would work just fine:
+Вы возможно уже догадались, что имя 'Dog' используется в `import` в `index.js` совершенно по вашему усмотрению. Вполне будет работать:
 
 ```javascript
 import Cat from './dog';
 
 const toby = new Cat('Toby');
 ```
-Obviously, most of the time you will use the same name as the class / module you're importing.
-A case where you don't do that is how we `const babel = require('gulp-babel')` in our Gulp file.
+Очевидно, что в основном вы будете всегда использовать тоже имя что и имя класса/модуля которого вы импортируете.
+Случай, когда вы не будете делать так, это когда мы ~~использовали~~ `const babel = require('gulp-babel')` в нашем Gulp файле.
 
-So what about those `require()`s in our `gulpfile.js`? Can we use `import` instead? The latest version of Node supports most ES6 features, but not ES6 modules yet. Luckily for us, Gulp is able to call Babel for help. If we rename our `gulpfile.js` to `gulpfile.babel.js`, Babel will take care of passing `import`ed modules to Gulp.
+Так что насчет тех `require()` в нашем `gulpfile.js`? Можем мы использовать `import` вместо них? Последняя версия Node поддерживает большую часть возможностей ES6, но не ES6 модули пока-что. К счастью для нас, Gulp способен призывать Babel на помощь. Если мы переименуем наш `gulpfile.js` в `gulpfile.babel.js`, Babel позаботится о передаче импортируемых через `import` модулей в Gulp.
 
-- Rename your `gulpfile.js` to `gulpfile.babel.js`
+- Переименуйте ваш `gulpfile.js` в `gulpfile.babel.js`
 
-- Replace your `require()`s by:
+- Замените все `require()` на:
 
 ```javascript
 import gulp from 'gulp';
@@ -41,10 +41,10 @@ import del from 'del';
 import { exec } from 'child_process';
 ```
 
-Note the syntactic sugar to extract `exec` directly from `child_process`. Pretty elegant!
+Обратите внимение на "синтаксический сахар", позволяющий получать `exec` напрямую из `child_process`. Довольно элегантно!
 
-- `yarn start` should still print "Wah wah, I am Toby".
+- `yarn start` должно по прежнему выводить "Wah wah, I am Toby".
 
-Next section: [6 - ESLint](/tutorial/6-eslint)
+Следующий раздел: [6 - ESLint](/tutorial/6-eslint)
 
-Back to the [previous section](/tutorial/4-es6-syntax-class) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/4-es6-syntax-class) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
diff --git a/tutorial/5-es6-modules-syntax/READMEeng.md b/tutorial/5-es6-modules-syntax/READMEeng.md
new file mode 100644
index 0000000..0d5ce9e
--- /dev/null
+++ b/tutorial/5-es6-modules-syntax/READMEeng.md
@@ -0,0 +1,50 @@
+# 5 - The ES6 modules syntax
+
+Here we simply replace `const Dog = require('./dog')` by `import Dog from './dog'`, which is the newer ES6 modules syntax (as opposed to "CommonJS" modules syntax).
+
+In `dog.js`, we also replace `module.exports = Dog` by `export default Dog`.
+
+Note that in `dog.js`, the name `Dog` is only used in the `export`. Therefore it could be possible to export directly an anonymous class like this instead:
+
+```javascript
+export default class {
+  constructor(name) {
+    this.name = name;
+  }
+
+  bark() {
+    return `Wah wah, I am ${this.name}`;
+  }
+}
+```
+
+You might now guess that the name 'Dog' used in the `import` in `index.js` is actually completely up to you. This would work just fine:
+
+```javascript
+import Cat from './dog';
+
+const toby = new Cat('Toby');
+```
+Obviously, most of the time you will use the same name as the class / module you're importing.
+A case where you don't do that is how we `const babel = require('gulp-babel')` in our Gulp file.
+
+So what about those `require()`s in our `gulpfile.js`? Can we use `import` instead? The latest version of Node supports most ES6 features, but not ES6 modules yet. Luckily for us, Gulp is able to call Babel for help. If we rename our `gulpfile.js` to `gulpfile.babel.js`, Babel will take care of passing `import`ed modules to Gulp.
+
+- Rename your `gulpfile.js` to `gulpfile.babel.js`
+
+- Replace your `require()`s by:
+
+```javascript
+import gulp from 'gulp';
+import babel from 'gulp-babel';
+import del from 'del';
+import { exec } from 'child_process';
+```
+
+Note the syntactic sugar to extract `exec` directly from `child_process`. Pretty elegant!
+
+- `yarn start` should still print "Wah wah, I am Toby".
+
+Next section: [6 - ESLint](/tutorial/6-eslint)
+
+Back to the [previous section](/tutorial/4-es6-syntax-class) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
-- 
GitLab


From 6ca983c4d20c7ec7c089b8f752b720c1e0f05963 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Wed, 2 Nov 2016 13:25:32 +0700
Subject: [PATCH 05/73] 6 sction typo

---
 Definitions.md                 |  10 +++
 tutorial/6-eslint/README.md    |  25 +++----
 tutorial/6-eslint/READMEeng.md | 117 +++++++++++++++++++++++++++++++++
 3 files changed, 140 insertions(+), 12 deletions(-)
 create mode 100644 tutorial/6-eslint/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index c0dc7da..50550eb 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -26,3 +26,13 @@ Node
 Babel
 
 синтаксический сахар - syntactic sugar
+
+lint - статический анализ, контроль качества кода
+https://ru.wikipedia.org/wiki/Lint
+
+linter - статический анализатор кода.
+
+Gulpfile
+
+linting errors
+
diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index 654f045..0cac9d2 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -1,12 +1,12 @@
 # 6 - ESLint
 
-We're going to lint our code to catch potential issues. ESLint is the linter of choice for ES6 code. Instead of configuring the rules we want for our code ourselves, we will use the config created by Airbnb. This config uses a few plugins, so we need to install those as well to use their config.
+Мы собираемся контролировать качество кода (англ. lint - прим. переводчика) чтобы перехватывать потенциальные проблемы. ESLint - предпочтительный анализатор кода (англ. linter - прим. переводчика) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
 
-- Run `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
+- Запустите `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
 
-As you can see, you can install several packages in one command. It will add all of these to your `package.json`, as usual.
+Как вы видите, вы можете установить несколько пакетов одной командой. Как обычно, они все добавятся в ваш `package.json`.
 
-In `package.json`, add an `eslintConfig` field like so:
+В `package.json`, добавьте свойство `eslintConfig` с таким содержанием:
 ```json
 "eslintConfig": {
   "extends": "airbnb",
@@ -15,15 +15,15 @@ In `package.json`, add an `eslintConfig` field like so:
   ]
 },
 ```
-The `plugins` part is to tell ESLint that we use the ES6 import syntax.
+В разделе `plugins` мы сообщаем ESLint что используем синтакисис ES6 `import`.
 
-**Note**: An `.eslintrc.js` file at the root of your project could also be used instead of the `eslintConfig` field of `package.json`. Just like for the Babel configuration, we try to avoid bloating the root folder with too many files, but if you have a complex ESLint config, consider this alternative.
+**Замечание**: Вместо свойства `eslintConfig` в `package.json` можно использовать файл `.eslintrc.js` в корне вашего проекта. Так же как и с конфигурацией Babel, мы стараемся избегать загромождения корневой директории большим количеством файлов, но если у вас сложная конфигурация ESLint, рассмотрите такую альтернативу.
 
-We'll create a Gulp task that runs ESLint for us. So we'll install the ESLint Gulp plugin as well:
+Мы создадим задачу для Gulp, которая запускает ESLint для нас. Поэтому установим также плагин ESLint для Gulp:
 
-- Run `yarn add --dev gulp-eslint`
+- запустите `yarn add --dev gulp-eslint`
 
-Add the following task to your `gulpfile.babel.js`:
+Добавьте следующую задачу в ваш `gulpfile.babel.js`:
 
 ```javascript
 import eslint from 'gulp-eslint';
@@ -47,9 +47,9 @@ gulp.task('lint', () => {
 });
 ```
 
-Here we tell Gulp that for this task, we want to include `gulpfile.babel.js`, and the JS files located under `src`.
+Здесь мы говорм Gulp, что для этой задачи мы хотим подключить `gulpfile.babel.js` и JS файлы, расположенные в src`.
 
-Modify your `build` Gulp task by making the `lint` task a prerequisite to it, like so:
+Откорректируйте задачу `build` так, чтобы `lint` предваряла ее запуск:
 
 ```javascript
 gulp.task('build', ['lint', 'clean'], () => {
@@ -57,9 +57,10 @@ gulp.task('build', ['lint', 'clean'], () => {
 });
 ```
 
-- Run `yarn start`, and you should see a bunch of linting errors in this Gulpfile, and a warning for using `console.log()` in `index.js`.
+- Запустите `yarn start`. Вы должны увидеть набор ошибок кода (англ. linting errors - прим. переводчика) в этом Gulp-файле и предупреждений об использовании `console.log()` в `index.js`.
 
 One type of issue you will see is `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)`. That's actually a false negative. ESLint cannot know which JS files are part of the build only, and which ones aren't, so we'll need to help it a little bit using comments in code. In `gulpfile.babel.js`, at the very top, add:
+Один из видов ошибок будет: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. 
 
 ```javascript```
 /* eslint-disable import/no-extraneous-dependencies */
diff --git a/tutorial/6-eslint/READMEeng.md b/tutorial/6-eslint/READMEeng.md
new file mode 100644
index 0000000..ef29ef2
--- /dev/null
+++ b/tutorial/6-eslint/READMEeng.md
@@ -0,0 +1,117 @@
+# 6 - ESLint
+
+We're going to lint our code to catch potential issues. ESLint is the linter of choice for ES6 code. Instead of configuring the rules we want for our code ourselves, we will use the config created by Airbnb. This config uses a few plugins, so we need to install those as well to use their config.
+
+- Run `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
+
+As you can see, you can install several packages in one command. It will add all of these to your `package.json`, as usual.
+
+In `package.json`, add an `eslintConfig` field like so:
+```json
+"eslintConfig": {
+  "extends": "airbnb",
+  "plugins": [
+    "import"
+  ]
+},
+```
+The `plugins` part is to tell ESLint that we use the ES6 import syntax.
+
+**Note**: An `.eslintrc.js` file at the root of your project could also be used instead of the `eslintConfig` field of `package.json`. Just like for the Babel configuration, we try to avoid bloating the root folder with too many files, but if you have a complex ESLint config, consider this alternative.
+
+We'll create a Gulp task that runs ESLint for us. So we'll install the ESLint Gulp plugin as well:
+
+- Run `yarn add --dev gulp-eslint`
+
+Add the following task to your `gulpfile.babel.js`:
+
+```javascript
+import eslint from 'gulp-eslint';
+
+const paths = {
+  allSrcJs: 'src/**/*.js',
+  gulpFile: 'gulpfile.babel.js',
+  libDir: 'lib',
+};
+
+// [...]
+
+gulp.task('lint', () => {
+  return gulp.src([
+    paths.allSrcJs,
+    paths.gulpFile,
+  ])
+    .pipe(eslint())
+    .pipe(eslint.format())
+    .pipe(eslint.failAfterError());
+});
+```
+
+Here we tell Gulp that for this task, we want to include `gulpfile.babel.js`, and the JS files located under `src`.
+
+Modify your `build` Gulp task by making the `lint` task a prerequisite to it, like so:
+
+```javascript
+gulp.task('build', ['lint', 'clean'], () => {
+  // ...
+});
+```
+
+- Run `yarn start`, and you should see a bunch of linting errors in this Gulpfile, and a warning for using `console.log()` in `index.js`.
+
+One type of issue you will see is `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)`. That's actually a false negative. ESLint cannot know which JS files are part of the build only, and which ones aren't, so we'll need to help it a little bit using comments in code. In `gulpfile.babel.js`, at the very top, add:
+
+```javascript
+/* eslint-disable import/no-extraneous-dependencies */
+```
+
+This way, ESLint won't apply the rule `import/no-extraneous-dependencies` in this file.
+
+Now we are left with the issue `Unexpected block statement surrounding arrow body (arrow-body-style)`. That's a great one. ESLint is telling us that there is a better way to write the following code:
+
+```javascript
+() => {
+  return 1;
+}
+```
+
+It should be rewritten into:
+
+```javascript
+() => 1
+```
+
+Because when a function only contains a return statement, you can omit the curly braces, return statement, and semicolon in ES6.
+
+So let's update the Gulp file accordingly:
+
+```javascript
+gulp.task('lint', () =>
+  gulp.src([
+    paths.allSrcJs,
+    paths.gulpFile,
+  ])
+    .pipe(eslint())
+    .pipe(eslint.format())
+    .pipe(eslint.failAfterError())
+);
+
+gulp.task('clean', () => del(paths.libDir));
+
+gulp.task('build', ['lint', 'clean'], () =>
+  gulp.src(paths.allSrcJs)
+    .pipe(babel())
+    .pipe(gulp.dest(paths.libDir))
+);
+```
+
+The last issue left is about `console.log()`. Let's say that we want this `console.log()` to be valid in `index.js` instead of triggering a warning in this example. You might have guessed it, we'll put `/* eslint-disable no-console */` at the top of our `index.js` file.
+
+- Run `yarn start` and we are now all clear again.
+
+**Note**: This section sets you up with ESLint in the console. It is great for catching errors at build time / before pushing, but you also probably want it integrated to your IDE. Do NOT use your IDE's native linting for ES6. Configure it so the binary it uses for linting is the one in your `node_modules` folder. This way it can use all of your project's config, the Airbnb preset, etc. Otherwise you will just get a generic ES6 linting.
+
+
+Next section: [7 - Client app with Webpack](/tutorial/7-client-webpack)
+
+Back to the [previous section](/tutorial/5-es6-modules-syntax) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
-- 
GitLab


From 1d480b0a5c07d0b0fbbfb403e2024562f91d4ce9 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Wed, 2 Nov 2016 14:29:22 +0700
Subject: [PATCH 06/73] section 6

---
 tutorial/6-eslint/README.md | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index 0cac9d2..60d98b3 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -59,16 +59,15 @@ gulp.task('build', ['lint', 'clean'], () => {
 
 - Запустите `yarn start`. Вы должны увидеть набор ошибок кода (англ. linting errors - прим. переводчика) в этом Gulp-файле и предупреждений об использовании `console.log()` в `index.js`.
 
-One type of issue you will see is `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)`. That's actually a false negative. ESLint cannot know which JS files are part of the build only, and which ones aren't, so we'll need to help it a little bit using comments in code. In `gulpfile.babel.js`, at the very top, add:
-Один из видов ошибок будет: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. 
+Один из видов ошибок будет: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в ~~скомпилированное приложение~~ (англ. build - прим. переводчика ) а какие нет. Поэтому мы немного поможем ESLint используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
 
 ```javascript```
 /* eslint-disable import/no-extraneous-dependencies */
 ```
 
-This way, ESLint won't apply the rule `import/no-extraneous-dependencies` in this file.
+Таким образом, ESLint не будет применять правило `import/no-extraneous-dependencies` в этом файле.
 
-Now we are left with the issue `Unexpected block statement surrounding arrow body (arrow-body-style)`. That's a great one. ESLint is telling us that there is a better way to write the following code:
+Теперь у нас осталась проблема с `Unexpected block statement surrounding arrow body (arrow-body-style)` (Неожиданное определение блока, окружающего тело стрелочной функции). Это важно. ESLint сообщает нам, что существует лучший способ написать следующий код:
 
 ```javascript
 () => {
@@ -76,15 +75,15 @@ Now we are left with the issue `Unexpected block statement surrounding arrow bod
 }
 ```
 
-It should be rewritten into:
+Это нужно переписать так:
 
 ```javascript
 () => 1
 ```
 
-Because when a function only contains a return statement, you can omit the curly braces, return statement, and semicolon in ES6.
+Потому что, когда в ES6 функция содержит только возвращаемое выражение, вы можете опустить фигурные скобки, оператор return и точку с запятой.
 
-So let's update the Gulp file accordingly:
+Так что давайте обновим Gulp-файл соответственно:
 
 ```javascript
 gulp.task('lint', () =>
@@ -106,13 +105,13 @@ gulp.task('build', ['lint', 'clean'], () =>
 );
 ```
 
-The last issue left is about `console.log()`. Let's say that we want this `console.log()` to be valid in `index.js` instead of triggering a warning in this example. You might have guessed it, we'll put `/* eslint-disable no-console */` at the top of our `index.js` file.
+Последняя оставшаяся проблема связана с `console.log()`. Давайте скажем, что мы хотим в этом примере, чтобы использование `console.log()` в `index.js` было правомерным, а не вызывало предупреждение. Как вы, возможно, догадались мы поместим `/* eslint-disable no-console */` в начале нашего `index.js` файла.
 
-- Run `yarn start` and we are now all clear again.
+- Запустите `yarn start` - теперь все снова без ошибок.
 
-**Note**: This section sets you up with ESLint in the console. It is great for catching errors at build time / before pushing, but you also probably want it integrated to your IDE. Do NOT use your IDE's native linting for ES6. Configure it so the binary it uses for linting is the one in your `node_modules` folder. This way it can use all of your project's config, the Airbnb preset, etc. Otherwise you will just get a generic ES6 linting.
+**Замечание**: В этой части мы работали с ESLint через консоль. Это хорошо для поиска ошибок во время компиляции / перед ~~публикацией~~, но вы, так же, возможно, захотите интегрировать его в вашу IDE. НЕ ИСПОЛЬЗУЙТЕ встроенный в вашу среду анализатор кода для ES6. Сконфигурируйте ее так, чтобы для этого использовались модули, расположенные в директории `node_modules`. В этом случае будут использоваться все настройки вашего проекта, правила Airbnb и так далее. Иначе, вы получите лишь усредненный ES6 анализатор.
 
 
-Next section: [7 - Client app with Webpack](/tutorial/7-client-webpack)
+Следующий раздел: [7 - Клиентское приложение ~на основе Webpack~](/tutorial/7-client-webpack)
 
-Back to the [previous section](/tutorial/5-es6-modules-syntax) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/5-es6-modules-syntax) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
-- 
GitLab


From 787b73a8b244398db57f55a04c22ce5660dd038c Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Wed, 2 Nov 2016 20:39:24 +0700
Subject: [PATCH 07/73] section 7

---
 Definitions.md                         |  11 ++
 tutorial/7-client-webpack/README.md    |  85 +++++------
 tutorial/7-client-webpack/READMEeng.md | 193 +++++++++++++++++++++++++
 3 files changed, 248 insertions(+), 41 deletions(-)
 create mode 100644 tutorial/7-client-webpack/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index 50550eb..0c1698f 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -36,3 +36,14 @@ Gulpfile
 
 linting errors
 
+bundle - сборка
+
+polyfill
+https://remysharp.com/2010/10/08/what-is-a-polyfill
+
+TRANSPILING - транспилияция (трансляция)
+https://www.stevefenton.co.uk/2012/11/compiling-vs-transpiling/
+
+tutorial - руководство
+
+entry point file - файл, указывающий на начальную точку сборки
diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index f69dcdf..b9adc15 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -1,8 +1,9 @@
-# 7 - Client App with Webpack
+# 7 - Клиентское приложение ~на основе Webpack~
 
-## Structure of our app
+## Структура нашего приложения
 
 - Create a `dist` folder at the root of your project, and add the following `index.html` file to it:
+- Создайте директорию `dist` в корне вашего проекта, и добавьте туда файл `index.html` со следующим содержанием:
 
 ```html
 <!doctype html>
@@ -16,11 +17,12 @@
 </html>
 ```
 
-In your `src` folder, create the following subfolders: `server`, `shared`, `client`, and move your current `index.js` into `server`, and `dog.js` into `shared`. Create `app.js` in `client`.
+В директории `src` создайте следующие поддиректории: `server`, `shared`, `client` и переместите текущий `index.js`  в папку `server`, а `dog.js` в `shared`. Создайте `app.js` в директории `client`.
 
 We are not going to do any Node back-end yet, but this separation will help you see more clearly where things belong. You'll need to change the `import Dog from './dog';` in `server/index.js` to `import Dog from '../shared/dog';` though, or ESLint will detect errors for unresolved modules.
+Мы пока что не собираемся создавать на Node серверную часть, но это разделение поможет более ясно понять что к чему относится. Вам нужно заменить `import Dog from './dog';` в `server/index.js` на `import Dog from '../shared/dog';`, иначе ESLint обнаружит ошибки неразрешаемых модулей.
 
-Write this in `client/app.js`:
+Напишите в `client/app.js`:
 
 ```javascript
 import Dog from '../shared/dog';
@@ -30,36 +32,36 @@ const browserToby = new Dog('Browser Toby');
 document.querySelector('.app').innerText = browserToby.bark();
 ```
 
-Add the following to your `package.json`, under `eslintConfig`:
+Добавьте следующее в `package.json`, после `eslintConfig`:
 
 ```json
 "env": {
   "browser": true
 }
 ```
-This way we can use variables such as `window` or `document` which are always accessible in the browser without ESLint complaining about undeclared variables.
+Таким образом мы сможем использовать такие переменные как `window` или `document`, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
 
-If you want to use some of the most recent ES features in your client code, like `Promise`s, you need to include the [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) in your client code.
+Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания - прим. пер.), вам нужно включить [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
 
-- Run `yarn add babel-polyfill`
+- Запустите `yarn add babel-polyfill`
 
-And before anything else in `app.js`, add this import:
+И вставьте в самое начало `app.js` импорт этого модуля:
 
 ```javascript
 import 'babel-polyfill';
 ```
 
-Including the polyfill adds some weight to your bundle, so add it only if you use the features it covers. In order to provide some solid boilerplate code with this tutorial, I am including it and it will appear in code samples in the next chapters.
+Включение ~~полифила~~ (англ. polyfill) прибавляет объема вашей сборке, поэтому подключайте  его только когда применяете конструкции, которые он охватывает. Для того, чтобы показать более полный шаблон кода в этом руководстве, я его применяю, и он появится примерах в следующих частях.
 
 ## Webpack
 
-In a Node environment, you can freely `import` different files and Node will resolve these files using your filesystem. In a browser, there is no filesystem, and therefore your `import`s point to nowhere. In order for our entry point file `app.js` to retrieve the tree of imports it needs, we are going to "bundle" that entire tree of dependencies into one file. Webpack is a tool that does this.
+В среде Node вы можете свободно использовать `import` для различных файлов и Node разрешит (англ. resolve) их посредством файловой системы. В браузере файловая система отсутствует, следовательно `import` ведет в никуда. Для того чтобы `app.js`, являющийся точкой входа для приложения, получил всю древовидную структуру импортируемых файлов, мы собираемся "собрать" все это дерево зависимостей в один файл. Webpack - нужный для этого инструмент.
 
-Webpack uses a config file, just like Gulp, called `webpack.config.js`. It is possible to use ES6 imports and exports in it, in the exact same way that we made Gulp rely on Babel to do so: by naming this file `webpack.config.babel.js`.
+Webpack, как и Gulp, использует конфигурационные файлы вида `webpack.config.js`. В них возможно использование ES6 импорта и экспорта точно таким же способом, как мы делали с Gulp относительно Babel: обозначая этот файл как `webpack.config.babel.js`.
 
-- Create an empty `webpack.config.babel.js` file
+- Создайте пустой файл `webpack.config.babel.js`
 
-- While you're at it, add `webpack.config.babel.js` to your Gulp `lint` task, and a few more `paths` constants:
+- Пока вы в нем, добавьте `webpack.config.babel.js` в задачу `lint` в Gulp, и еще несколько констант с путями (`paths` - англ):
 
 ```javascript
 const paths = {
@@ -84,11 +86,11 @@ gulp.task('lint', () =>
 );
 ```
 
-We need to teach Webpack how to process ES6 files via Babel (just like we taught Gulp how to process ES6 files with `gulp-babel`). In Webpack, when you need to process files that are not plain old JavaScript, you use *loaders*. So let's install the Babel loader for Webpack:
+Мы должы научить Webpack обрабатывать ES6 файлы с помощью Babel (точно так же как мы показали Gulp как это делать через `gulp-babel`). Для Webpack, когда нужно обработать файлы, не являющиеся простым старым JavaScript, мы используем *загрузчики* (loaders). Давайте установим загрузчик Babel для Webpack:
 
-- Run `yarn add --dev babel-loader`
+- Запустите `yarn add --dev babel-loader`
 
-- Write the following to your `webpack.config.babel.js` file:
+- Напишите следующее в `webpack.config.babel.js` файле:
 
 ```javascript
 export default {
@@ -111,38 +113,39 @@ export default {
 };
 ```
 
-Let's analyze this a bit:
+Давайте это немного проанализируем:
 
-We need this file to `export` stuff for Webpack to read. `output.filename` is the name of the bundle we want to generate. `devtool: 'source-map'` will enable source maps for a better debugging experience in your browser. In `module.loaders`, we have a `test`, which is the JavaScript regex that will be used to test which files should be processed by the `babel-loader`. Since we will use both `.js` files and `.jsx` files (for React) in the next chapters, we have the following regex: `/\.jsx?$/`. The `node_modules` folder is excluded because there is no transpilation to do there. This way, when your code `import`s packages located in `node_modules`, Babel doesn't bother processing those files, which reduces build time. The `resolve` part is to tell Webpack what kind of file we want to be able to `import` in our code using extension-less paths like `import Foo from './foo'` where `foo` could be `foo.js` or `foo.jsx` for instance.
+Этот файл нужен чтобы сообщить Webpack некоторую информацию. `output.filename` - имя файла генерируемой сборки. `devtool: 'source-map'` - позволяет использовать source maps (карты кода) для упрощения отладки в браузере. В `module.loaders` есть свойство `test` с регулярным выражением, определяющим какие файлы должны обрабатываться загрузчиком `babel-loader`. Поскольку мы будем использовать как `.js` так и `.jsx` файлы (для React) в следующих частях, наше выражение выглядит как `/\.jsx?$/`. Директория `node_modules` исключена (exclude) поскольку ее не нужно транспилировать. Таким образом, когда код импортирует (`import`) пакеты, расположенные в `node_modules`, Babel не тратит время на обработку этих файлов. Раздел `resolve` сообщает Webpack файлы какого типа мы хотим подключать через `import`, позволяя тем самым опускать расширения в именах файлов, например как в `import Foo from './foo'`, где `foo` может быть `foo.js` или `foo.jsx`.
 
-Okay so now we have Webpack set up, but we still need a way to *run* it.
+И так, мы настроили Webpack, но нам до сих пор требуется способ *запустить* его.
 
-## Integrating Webpack to Gulp
+## Подключение Webpack к Gulp
 
-Webpack can do a lot of things. It can actually replace Gulp entirely if your project is mostly client-side. Gulp being a more general tool, it is better suited for things like linting, tests, and back-end tasks though. It is also simpler to understand for newcomers than a complex Webpack config. We have a pretty solid Gulp setup and workflow here, so integrating Webpack to our Gulp build is going to be easy peasy.
+Webpack может делать множество вещей. Он даже может полностью заменить Gulp, если проект в основном выполняется на стороне клиента. Gulp в свою очередь, как более общий инструмент, больше подходит для таких вещей как анализ кода (linting), тестирование, запуск задач на стороне сервера. Он так же проще в понимании для новичков чем чем сложное конфигурирование Webpack. У нас уже довольно хорошо настроен рабочий процесс на базе Gulp, так что интеграция Webpack в процес сборки пройдет проще простого.
 
-Let's create the Gulp task to run Webpack. Open your `gulpfile.babel.js`.
+Давайте создадим в Gulp задачу по запуску Webpack. Откройте `gulpfile.babel.js`.
 
-We don't need the `main` task to execute `node lib/` anymore, since we will open `index.html` to run our app.
+We don't need the `main` task to execute `node lib/` anymore, since we will open `index.html` to run our app. 
+Поскольку мы ~~will open~~ `index.html` чтобы запускать наше приложение, нам больше не требуется задача `main` чтобы выполнять `node lib/`.
 
-- Remove `import { exec } from 'child_process'`.
+- Уберите `import { exec } from 'child_process'`.
 
-Similarly to Gulp plugins, the `webpack-stream` package lets us integrate Webpack into Gulp very easily.
+Аналогично плагинам для Gulp, пакет `webpack-stream` позволяет очень просто интегрировать Webpack в Gulp.
 
-- Install the package with: `yarn add --dev webpack-stream`
+- Устанавливаем пакет: `yarn add --dev webpack-stream`
 
-- Add the following `import`s:
+- Добавляем следующие `import`:
 
 ```javascript
 import webpack from 'webpack-stream';
 import webpackConfig from './webpack.config.babel';
 ```
 
-The second line just grabs our config file.
+Вторая строчка просто подключает наш конфигурационный файл.
 
-Like I said earlier, in the next chapter we are going to use `.jsx` files (on the client, and even on the server later on), so let's set that up right now to have a bit of a head start.
+Как было сказанно ранее, в следующей части мы собираемся использовать `.jsx` файлы (на клиенте и даже позже на сервере), так что давайте настроим это сейчас, чтобы затем иметь фору.
 
-- Change the constants to the following:
+- Измените константы следующим образом:
 
 ```javascript
 const paths = {
@@ -157,11 +160,11 @@ const paths = {
 };
 ```
 
-The `.js?(x)` is just a pattern to match `.js` or `.jsx` files.
+Здесь `.js?(x)` - просто шаблон, соответсвующий `.js` и `.jsx` файлам.
 
-We now have constants for the different parts of our application, and an entry point file.
+Теперь у нас есть константы для различных частей приложения и файл, указывающий на начальную точку сборки (entry point file).
 
-- Modify the `main` task like so:
+- Измените задачу `main` так:
 
 ```javascript
 gulp.task('main', ['lint', 'clean'], () =>
@@ -171,13 +174,13 @@ gulp.task('main', ['lint', 'clean'], () =>
 );
 ```
 
-**Note**: Our `build` task currently transpiles ES6 code to ES5 for every `.js` file located under `src`. Now that we've split our code into `server`, `shared`, and `client` code, we could make this task only compile `server` and `shared` (since Webpack takes care of `client`). However, in the Testing chapter, we are going to need Gulp to also compile the `client` code to test it outside of Webpack. So until you reach that chapter, there is a bit of useless duplicated build being done. I'm sure we can all agree that it's fine for now. We actually aren't even going to be using the `build` task and `lib` folder anymore until that chapter, since all we care about right now is the client bundle.
+**Замечание**: Задача `build` сейчас транспилирует код ES6 в ES5 для каждого `.js` файла, расположенного в `src`. Поскольку мы разделили код на  `server`, `shared` и `client`, то мы могли бы компилировать только `server` и `shared` (поскольку Webpack позаботится о `client`). Тем не менее, в разделе Тестирование нам потребуется Gulp для компиляции клиентского кода чтобы тестировать его вне Webpack. Так что пока-что мы не дойдем до этого раздела, будет ~~несколько избыточное дублирование в~~ `build`. Давайте договоримся, что пока это нормально. Вообще мы даже не будем использовать `build` и директорию `lib` пока не доберемся до этой части, так что все что нас сейчас волнует - это клиентская сборка.
 
-- Run `yarn start`, you should now see Webpack building your `client-bundle.js` file. Opening `index.html` in your browser should display "Wah wah, I am Browser Toby".
+- Запустите `yarn start`, вы должны увидеть построенный Webpack файл `client-bundle.js`. Откройте `index.html` в браузере. Должно отобразиться "Wah wah, I am Browser Toby".
 
-One last thing: unlike our `lib` folder, the `dist/client-bundle.js` and `dist/client-bundle.js.map` files are not being cleaned up by our `clean` task before each build.
+Одна последняя вещь: в отличие от директории `lib`, файлы `dist/client-bundle.js` и `dist/client-bundle.js.map` не очищаются задачей `clean` перед каждой сборкой.
 
-- Add `clientBundle: 'dist/client-bundle.js?(.map)'` to our `paths` configuration, and tweak the `clean` task like so:
+- Добавьте `clientBundle: 'dist/client-bundle.js?(.map)'` в нашу конфигурацию путей (`paths`), и настройте задачу `clean` следующим образом:
 
 ```javascript
 gulp.task('clean', () => del([
@@ -186,8 +189,8 @@ gulp.task('clean', () => del([
 ]));
 ```
 
-- Add `/dist/client-bundle.js*` to your `.gitignore` file:
+- Добавьте `/dist/client-bundle.js*` в файл `.gitignore`:
 
-Next section: [8 - React](/tutorial/8-react)
+Следующий раздел: [8 - React](/tutorial/8-react)
 
-Back to the [previous section](/tutorial/6-eslint) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/6-eslint) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
diff --git a/tutorial/7-client-webpack/READMEeng.md b/tutorial/7-client-webpack/READMEeng.md
new file mode 100644
index 0000000..f69dcdf
--- /dev/null
+++ b/tutorial/7-client-webpack/READMEeng.md
@@ -0,0 +1,193 @@
+# 7 - Client App with Webpack
+
+## Structure of our app
+
+- Create a `dist` folder at the root of your project, and add the following `index.html` file to it:
+
+```html
+<!doctype html>
+<html>
+  <head>
+  </head>
+  <body>
+    <div class="app"></div>
+    <script src="client-bundle.js"></script>
+  </body>
+</html>
+```
+
+In your `src` folder, create the following subfolders: `server`, `shared`, `client`, and move your current `index.js` into `server`, and `dog.js` into `shared`. Create `app.js` in `client`.
+
+We are not going to do any Node back-end yet, but this separation will help you see more clearly where things belong. You'll need to change the `import Dog from './dog';` in `server/index.js` to `import Dog from '../shared/dog';` though, or ESLint will detect errors for unresolved modules.
+
+Write this in `client/app.js`:
+
+```javascript
+import Dog from '../shared/dog';
+
+const browserToby = new Dog('Browser Toby');
+
+document.querySelector('.app').innerText = browserToby.bark();
+```
+
+Add the following to your `package.json`, under `eslintConfig`:
+
+```json
+"env": {
+  "browser": true
+}
+```
+This way we can use variables such as `window` or `document` which are always accessible in the browser without ESLint complaining about undeclared variables.
+
+If you want to use some of the most recent ES features in your client code, like `Promise`s, you need to include the [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) in your client code.
+
+- Run `yarn add babel-polyfill`
+
+And before anything else in `app.js`, add this import:
+
+```javascript
+import 'babel-polyfill';
+```
+
+Including the polyfill adds some weight to your bundle, so add it only if you use the features it covers. In order to provide some solid boilerplate code with this tutorial, I am including it and it will appear in code samples in the next chapters.
+
+## Webpack
+
+In a Node environment, you can freely `import` different files and Node will resolve these files using your filesystem. In a browser, there is no filesystem, and therefore your `import`s point to nowhere. In order for our entry point file `app.js` to retrieve the tree of imports it needs, we are going to "bundle" that entire tree of dependencies into one file. Webpack is a tool that does this.
+
+Webpack uses a config file, just like Gulp, called `webpack.config.js`. It is possible to use ES6 imports and exports in it, in the exact same way that we made Gulp rely on Babel to do so: by naming this file `webpack.config.babel.js`.
+
+- Create an empty `webpack.config.babel.js` file
+
+- While you're at it, add `webpack.config.babel.js` to your Gulp `lint` task, and a few more `paths` constants:
+
+```javascript
+const paths = {
+  allSrcJs: 'src/**/*.js',
+  gulpFile: 'gulpfile.babel.js',
+  webpackFile: 'webpack.config.babel.js',
+  libDir: 'lib',
+  distDir: 'dist',
+};
+
+// [...]
+
+gulp.task('lint', () =>
+  gulp.src([
+    paths.allSrcJs,
+    paths.gulpFile,
+    paths.webpackFile,
+  ])
+    .pipe(eslint())
+    .pipe(eslint.format())
+    .pipe(eslint.failAfterError())
+);
+```
+
+We need to teach Webpack how to process ES6 files via Babel (just like we taught Gulp how to process ES6 files with `gulp-babel`). In Webpack, when you need to process files that are not plain old JavaScript, you use *loaders*. So let's install the Babel loader for Webpack:
+
+- Run `yarn add --dev babel-loader`
+
+- Write the following to your `webpack.config.babel.js` file:
+
+```javascript
+export default {
+  output: {
+    filename: 'client-bundle.js',
+  },
+  devtool: 'source-map',
+  module: {
+    loaders: [
+      {
+        test: /\.jsx?$/,
+        loader: 'babel-loader',
+        exclude: [/node_modules/],
+      },
+    ],
+  },
+  resolve: {
+    extensions: ['', '.js', '.jsx'],
+  },
+};
+```
+
+Let's analyze this a bit:
+
+We need this file to `export` stuff for Webpack to read. `output.filename` is the name of the bundle we want to generate. `devtool: 'source-map'` will enable source maps for a better debugging experience in your browser. In `module.loaders`, we have a `test`, which is the JavaScript regex that will be used to test which files should be processed by the `babel-loader`. Since we will use both `.js` files and `.jsx` files (for React) in the next chapters, we have the following regex: `/\.jsx?$/`. The `node_modules` folder is excluded because there is no transpilation to do there. This way, when your code `import`s packages located in `node_modules`, Babel doesn't bother processing those files, which reduces build time. The `resolve` part is to tell Webpack what kind of file we want to be able to `import` in our code using extension-less paths like `import Foo from './foo'` where `foo` could be `foo.js` or `foo.jsx` for instance.
+
+Okay so now we have Webpack set up, but we still need a way to *run* it.
+
+## Integrating Webpack to Gulp
+
+Webpack can do a lot of things. It can actually replace Gulp entirely if your project is mostly client-side. Gulp being a more general tool, it is better suited for things like linting, tests, and back-end tasks though. It is also simpler to understand for newcomers than a complex Webpack config. We have a pretty solid Gulp setup and workflow here, so integrating Webpack to our Gulp build is going to be easy peasy.
+
+Let's create the Gulp task to run Webpack. Open your `gulpfile.babel.js`.
+
+We don't need the `main` task to execute `node lib/` anymore, since we will open `index.html` to run our app.
+
+- Remove `import { exec } from 'child_process'`.
+
+Similarly to Gulp plugins, the `webpack-stream` package lets us integrate Webpack into Gulp very easily.
+
+- Install the package with: `yarn add --dev webpack-stream`
+
+- Add the following `import`s:
+
+```javascript
+import webpack from 'webpack-stream';
+import webpackConfig from './webpack.config.babel';
+```
+
+The second line just grabs our config file.
+
+Like I said earlier, in the next chapter we are going to use `.jsx` files (on the client, and even on the server later on), so let's set that up right now to have a bit of a head start.
+
+- Change the constants to the following:
+
+```javascript
+const paths = {
+  allSrcJs: 'src/**/*.js?(x)',
+  serverSrcJs: 'src/server/**/*.js?(x)',
+  sharedSrcJs: 'src/shared/**/*.js?(x)',
+  clientEntryPoint: 'src/client/app.js',
+  gulpFile: 'gulpfile.babel.js',
+  webpackFile: 'webpack.config.babel.js',
+  libDir: 'lib',
+  distDir: 'dist',
+};
+```
+
+The `.js?(x)` is just a pattern to match `.js` or `.jsx` files.
+
+We now have constants for the different parts of our application, and an entry point file.
+
+- Modify the `main` task like so:
+
+```javascript
+gulp.task('main', ['lint', 'clean'], () =>
+  gulp.src(paths.clientEntryPoint)
+    .pipe(webpack(webpackConfig))
+    .pipe(gulp.dest(paths.distDir))
+);
+```
+
+**Note**: Our `build` task currently transpiles ES6 code to ES5 for every `.js` file located under `src`. Now that we've split our code into `server`, `shared`, and `client` code, we could make this task only compile `server` and `shared` (since Webpack takes care of `client`). However, in the Testing chapter, we are going to need Gulp to also compile the `client` code to test it outside of Webpack. So until you reach that chapter, there is a bit of useless duplicated build being done. I'm sure we can all agree that it's fine for now. We actually aren't even going to be using the `build` task and `lib` folder anymore until that chapter, since all we care about right now is the client bundle.
+
+- Run `yarn start`, you should now see Webpack building your `client-bundle.js` file. Opening `index.html` in your browser should display "Wah wah, I am Browser Toby".
+
+One last thing: unlike our `lib` folder, the `dist/client-bundle.js` and `dist/client-bundle.js.map` files are not being cleaned up by our `clean` task before each build.
+
+- Add `clientBundle: 'dist/client-bundle.js?(.map)'` to our `paths` configuration, and tweak the `clean` task like so:
+
+```javascript
+gulp.task('clean', () => del([
+  paths.libDir,
+  paths.clientBundle,
+]));
+```
+
+- Add `/dist/client-bundle.js*` to your `.gitignore` file:
+
+Next section: [8 - React](/tutorial/8-react)
+
+Back to the [previous section](/tutorial/6-eslint) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
-- 
GitLab


From 7332b298c745e240f5b22c861f1f868af6769766 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Thu, 3 Nov 2016 19:02:11 +0700
Subject: [PATCH 08/73] section 8

---
 README.md                     |  3 ++
 tutorial/8-react/README.md    | 27 ++++++++--------
 tutorial/8-react/READMEeng.md | 61 +++++++++++++++++++++++++++++++++++
 3 files changed, 78 insertions(+), 13 deletions(-)
 create mode 100644 tutorial/8-react/READMEeng.md

diff --git a/README.md b/README.md
index 05f98b2..81fc864 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,9 @@
 
 [![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch)
 
+## Перевод еще полностью не завершен. Это не окончательная версия!
+перевод терминов см. [Definitions.md](Definitions.md)
+
 Welcome to my modern JavaScript stack tutorial: **JavaScript Stack from Scratch**.
 
 This is a minimalistic and straight-to-the-point guide to assembling a JavaScript stack. It requires some general programming knowledge, and JavaScript basics. **It focuses on wiring tools together** and giving you the **simplest possible example** for each tool. You can see this tutorial as *a way to write your own boilerplate from scratch*.
diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index b612b7d..f44b996 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -1,14 +1,14 @@
 # 8 - React
 
-We're now going to render our app using React.
+Теперь мы начнем генерировать наше приложение с помощью React.
 
-First, let's install React and ReactDOM:
+Сначала установим React и ReactDOM:
 
-- Run `yarn add react react-dom`
+- запустите `yarn add react react-dom`
 
-These 2 packages go to our `"dependencies"` and not `"devDependencies"` because unlike build tools, the client bundle needs them in production.
+Эти 2 пакета будут включены в раздел `"dependencies"` а не `"devDependencies"` потому что, в отличие от инструментов разработки, они должны быть в итоговой клиентской сборке (production).
 
-Let's rename our `src/client/app.js` file into `src/client/app.jsx` and write some React and JSX code in it:
+Давайте переименуем файл `src/client/app.js` в `src/client/app.jsx` и напишем там немного кода на React и JSX:
 
 ```javascript
 import 'babel-polyfill';
@@ -32,17 +32,17 @@ App.propTypes = {
 ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
 ```
 
-**Note**: If you are unfamiliar with React or its PropTypes, learn about React first and come back to this tutorial later. There is going to be quite some React things in the upcoming chapters, so you need a good understanding of it.
+**Замечание**: Если вы не знакомы с React или его PropTypes, ознакомьтесь сначала с ним и затем возвращайтесь в это руководство позже. В следующих частях мы будем использовать React, поэтому вам понадобится хорошее понимание его.
 
-In your Gulpfile, change the value of `clientEntryPoint` to give it a `.jsx` extension:
+В Gulp файле, измените в `clientEntryPoint` расширение на `.jsx`:
 
 ```javascript
 clientEntryPoint: 'src/client/app.jsx',
 ```
 
-Since we use the JSX syntax here, we have to tell Babel that it needs to transform it as well.
-Install the React Babel preset, which will teach Babel how to process the JSX syntax:
-`yarn add --dev babel-preset-react` and change the `babel` entry in your `package.json` file like so:
+Поскольку мы используем синтакс JSX, то нам так же нужен Babel для его обработки.
+Установите React Babel preset, который научит Babel обрабатывать JSX синтакс:
+`yarn add --dev babel-preset-react` и откорректируйте раздел `babel` в `package.json` таким образом:
 
 ```json
 "babel": {
@@ -53,9 +53,10 @@ Install the React Babel preset, which will teach Babel how to process the JSX sy
 },
 ```
 
-Now after running `yarn start`, if we open `index.html`, we should see "The dog says: Wah wah, I am Browser Toby" rendered by React.
+Теперь, после запуска `yarn start`, если мы откроем `index.html`, то должны увидеть "The dog says: Wah wah, I am Browser Toby" сгенерированное React.
 
 
-Next section: [9 - Redux](/tutorial/9-redux)
 
-Back to the [previous section](/tutorial/7-client-webpack) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Следующий раздел: [9 - Redux](/tutorial/9-redux)
+
+Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
diff --git a/tutorial/8-react/READMEeng.md b/tutorial/8-react/READMEeng.md
new file mode 100644
index 0000000..b612b7d
--- /dev/null
+++ b/tutorial/8-react/READMEeng.md
@@ -0,0 +1,61 @@
+# 8 - React
+
+We're now going to render our app using React.
+
+First, let's install React and ReactDOM:
+
+- Run `yarn add react react-dom`
+
+These 2 packages go to our `"dependencies"` and not `"devDependencies"` because unlike build tools, the client bundle needs them in production.
+
+Let's rename our `src/client/app.js` file into `src/client/app.jsx` and write some React and JSX code in it:
+
+```javascript
+import 'babel-polyfill';
+
+import React, { PropTypes } from 'react';
+import ReactDOM from 'react-dom';
+import Dog from '../shared/dog';
+
+const dogBark = new Dog('Browser Toby').bark();
+
+const App = props => (
+  <div>
+    The dog says: {props.message}
+  </div>
+);
+
+App.propTypes = {
+  message: PropTypes.string.isRequired,
+};
+
+ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
+```
+
+**Note**: If you are unfamiliar with React or its PropTypes, learn about React first and come back to this tutorial later. There is going to be quite some React things in the upcoming chapters, so you need a good understanding of it.
+
+In your Gulpfile, change the value of `clientEntryPoint` to give it a `.jsx` extension:
+
+```javascript
+clientEntryPoint: 'src/client/app.jsx',
+```
+
+Since we use the JSX syntax here, we have to tell Babel that it needs to transform it as well.
+Install the React Babel preset, which will teach Babel how to process the JSX syntax:
+`yarn add --dev babel-preset-react` and change the `babel` entry in your `package.json` file like so:
+
+```json
+"babel": {
+  "presets": [
+    "latest",
+    "react"
+  ]
+},
+```
+
+Now after running `yarn start`, if we open `index.html`, we should see "The dog says: Wah wah, I am Browser Toby" rendered by React.
+
+
+Next section: [9 - Redux](/tutorial/9-redux)
+
+Back to the [previous section](/tutorial/7-client-webpack) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
-- 
GitLab


From e27afc9a3f4d4ac8388700bc08a018956ac36560 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Thu, 3 Nov 2016 19:07:25 +0700
Subject: [PATCH 09/73] readme note

---
 README.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/README.md b/README.md
index 81fc864..26a186c 100644
--- a/README.md
+++ b/README.md
@@ -14,6 +14,7 @@
 
 ## Перевод еще полностью не завершен. Это не окончательная версия!
 перевод терминов см. [Definitions.md](Definitions.md)
+[вопросы, замечания, предложения](issues)
 
 Welcome to my modern JavaScript stack tutorial: **JavaScript Stack from Scratch**.
 
-- 
GitLab


From 99ab1d8b9eba618d65cd37d71358bd6b318b6249 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Thu, 3 Nov 2016 23:31:05 +0700
Subject: [PATCH 10/73] Intro

---
 README.md | 66 ++++++++++++++++++++-----------------------------------
 1 file changed, 24 insertions(+), 42 deletions(-)

diff --git a/README.md b/README.md
index 26a186c..797c91b 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
-# JavaScript Stack from Scratch
+# Стек технологий JavaScript с нуля
+## JavaScript Stack from Scratch
 
 [![Yarn](/img/yarn.png)](https://yarnpkg.com/)
 [![React](/img/react.png)](https://facebook.github.io/react/)
@@ -12,53 +13,32 @@
 
 [![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch)
 
-## Перевод еще полностью не завершен. Это не окончательная версия!
-перевод терминов см. [Definitions.md](Definitions.md)
-[вопросы, замечания, предложения](issues)
-
-Welcome to my modern JavaScript stack tutorial: **JavaScript Stack from Scratch**.
-
-This is a minimalistic and straight-to-the-point guide to assembling a JavaScript stack. It requires some general programming knowledge, and JavaScript basics. **It focuses on wiring tools together** and giving you the **simplest possible example** for each tool. You can see this tutorial as *a way to write your own boilerplate from scratch*.
-
-You don't need to use this entire stack if you build a simple web page with a few JS interactions of course (a combination of Babel + jQuery is enough!), but if you want to build a web app that scales, and need help setting things up, this tutorial will work great for you.
-
-Since the goal of this tutorial is to assemble various tools, I do not go into details about how these tools work individually. Refer to their documentation or find other tutorials if you want to acquire deeper knowledge in them.
-
-A big chunk of the stack described in this tutorial uses React. If you are beginning and just want to learn React, [create-react-app](https://github.com/facebookincubator/create-react-app) will get you up and running with a React environment very quickly with a premade configuration. I would for instance recommend this approach to someone who arrives in a team that's using React and needs to catch up with a learning playground. In this tutorial you won't use a premade configuration, because I want you to understand everything that's happening under the hood.
-
-Code examples are available for each chapter, and you can run them all with `yarn && yarn start` or `npm install && npm start`. I recommend writing everything from scratch yourself by following the **step-by-step instructions** of each chapter.
-
-**Every chapter contains the code of previous chapters**, so if you are simply looking for a boilerplate project containing everything, just clone the last chapter and you're good to go.
+Это русскоязычная версия руководства Джонатана Верекии (@verekia). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
 
-Note: The order of chapters is not necessarily the most educational. For instance, testing / type checking could have been done before introducing React. It is quite difficult to move chapters around or edit past ones, since I need to apply those changes to every following chapter. If things settle down, I might reorganize the whole thing in a better way.
+## Работа над переводом идет. Это не окончательная версия!
 
-The code of this tutorial works on Linux, macOS, and Windows.
+перевод терминов см. [Definitions.md](Definitions.md)
 
-## Table of contents
+[вопросы, замечания, предложения](https://github.com/UsulPro/js-stack-from-scratch/issues)
 
-[1 - Node, NPM, Yarn, and package.json](/tutorial/1-node-npm-yarn-package-json)
 
-[2 - Installing and using a package](/tutorial/2-packages)
+Добро пожаловать в мое современное руководство по стеку технологий JavaScript: **Стек технологий JavaScript с нуля**
 
-[3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
+Это минималистичное и практико-ориентированное пособие по применению JavaScript технологий. Вам потребуются общие знания по программированию и основы JavaScript. Это пособие **нацелено на интеграцию необходимых инструментов** и предоставляет **максимально простые примеры** для каждого инструмента. Вы можете рассматривать данный документ как *возможность создать свой собственный шаблонный проект с нуля*.
 
-[4 - Using the ES6 syntax with a class](/tutorial/4-es6-syntax-class)
+Вам, конечно, не нужны все эти технологии если вы делаете простую веб страницу с парой JS функций (достаточно комбинаци Babel + jQuery), но если вы собираетесь создать масштабируемое веб приложение, и вам нужно все правильно настроить, то это руководство отлично вам подходит.
 
-[5 - The ES6 modules syntax](/tutorial/5-es6-modules-syntax)
+Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить более глубокие знания по ним, изучайте их документацию или другие руководства.
 
-[6 - ESLint](/tutorial/6-eslint)
+В большой части технологий описываемых тут используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко проведет через среду React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду использующую React и наверстать свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы полностью понимали все, что происходит "под капотом".
 
-[7 - Client app with Webpack](/tutorial/7-client-webpack)
+Примеры кода доступны для каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждой части.
 
-[8 - React](/tutorial/8-react)
+**Каждая часть содержит код, написанный в предыдущих частях**, так что если вы просто хотите получить окончательный вариант проекта содержащий все, просто скопируйте последнюю часть и пользуйтесь наздоровье.
 
-[9 - Redux](/tutorial/9-redux)
+Замечание: Порядок частей не обязателен. К примеру, тестирование / типизация могут быть выполнены до введения в React. Довольно сложно перемещать или редактировать опубликованные разделы, поскольку приходится вносить изменения во все следующие за ними части. Возможно, когда все определится, я приведу всю документацию к более удобному виду.
 
-[10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
-
-[11 - Testing with Mocha, Chai, and Sinon](/tutorial/11-testing-mocha-chai-sinon)
-
-[12 - Type Checking with Flow](/tutorial/12-flow)
+Код, приведенный в примерах, работает под Linux, macOS, и Windows.
 
 ## Содержание
 
@@ -86,19 +66,21 @@ The code of this tutorial works on Linux, macOS, and Windows.
 
 [12 - ~Типизация с~ Flow](/tutorial/12-flow)
 
-## Coming up next
+## Далее следует
 
-Production / development environments, Express, React Router, Server-Side Rendering, Styling, Enzyme, Git Hooks.
+Production / development окружение, Express, React Router, Серверный Рендеринг, Стилизация, Enzyme, Приемы Git.
 
-## Translations
+## Переводы на другие языки
 
 - [Chinese](https://github.com/pd4d10/js-stack-from-scratch) by [@pd4d10](http://github.com/pd4d10)
 - [Italian](https://github.com/fbertone/js-stack-from-scratch) by [Fabrizio Bertone](https://github.com/fbertone)
 
-If you want to add your translation, please read the [translation recommendations](/how-to-translate.md) to get started!
+Если вы хотите добавить перевод на другой язык, пожалуйста читайте [рекомендации по переводу](/how-to-translate.md) чтобы начать!
+
+## Контакты
 
-## Credits
+Создано [@verekia](https://twitter.com/verekia) – [verekia.com](http://verekia.com/).
 
-Created by [@verekia](https://twitter.com/verekia) – [verekia.com](http://verekia.com/).
+Переведено [@usulpro](https://github.com/UsulPro) - [sm-react](https://github.com/sm-react)
 
-License: MIT
+Лицензия: MIT
-- 
GitLab


From bfa49b849e63018ab946b90907c4886d70ad0fde Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Fri, 4 Nov 2016 00:02:48 +0700
Subject: [PATCH 11/73] fix Intro

---
 README.md | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index 797c91b..61aa5f5 100644
--- a/README.md
+++ b/README.md
@@ -30,13 +30,13 @@
 
 Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить более глубокие знания по ним, изучайте их документацию или другие руководства.
 
-В большой части технологий описываемых тут используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко проведет через среду React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду использующую React и наверстать свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы полностью понимали все, что происходит "под капотом".
+В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду использующую React и наверстать свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
 
-Примеры кода доступны для каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждой части.
+Примеры кода имеются в каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждого раздела.
 
-**Каждая часть содержит код, написанный в предыдущих частях**, так что если вы просто хотите получить окончательный вариант проекта содержащий все, просто скопируйте последнюю часть и пользуйтесь наздоровье.
+**Каждая часть содержит код, написанный в предыдущих частях**, так что если вы просто хотите получить окончательный вариант проекта, содержащий все, просто скопируйте последний раздел и пользуйтесь на здоровье.
 
-Замечание: Порядок частей не обязателен. К примеру, тестирование / типизация могут быть выполнены до введения в React. Довольно сложно перемещать или редактировать опубликованные разделы, поскольку приходится вносить изменения во все следующие за ними части. Возможно, когда все определится, я приведу всю документацию к более удобному виду.
+Замечание: Порядок частей не всегда обязателен. К примеру, тестирование / типизация могут быть выполнены до введения в React. Довольно сложно перемещать или редактировать опубликованные разделы, поскольку приходится вносить изменения во все следующие за ними части. Возможно, когда все определится, я приведу всю документацию к более удобному виду.
 
 Код, приведенный в примерах, работает под Linux, macOS, и Windows.
 
-- 
GitLab


From 5dd0ab9a2ecf7942cc3f2318b7e71c1d62802104 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Fri, 4 Nov 2016 14:19:20 +0700
Subject: [PATCH 12/73] section 2

---
 Definitions.md                                |  5 ++
 .../1-node-npm-yarn-package-json/README.md    | 42 +++++++-------
 .../1-node-npm-yarn-package-json/READMEeng.md | 55 +++++++++++++++++++
 3 files changed, 81 insertions(+), 21 deletions(-)
 create mode 100644 tutorial/1-node-npm-yarn-package-json/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index 0c1698f..d73b133 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -47,3 +47,8 @@ https://www.stevefenton.co.uk/2012/11/compiling-vs-transpiling/
 tutorial - руководство
 
 entry point file - файл, указывающий на начальную точку сборки
+
+back-end - серверная часть
+
+trailing commas - завершающая запятая (/пробел)
+http://www.multitran.ru/c/m.exe?t=6766895_1_2&s1=trailing%20space
diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index 05d7484..1a9199c 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -1,35 +1,35 @@
 # 1 - Node, NPM, Yarn, and package.json
 
-In this section we will set up Node, NPM, Yarn, and a basic `package.json` file.
+В этой части мы настроим Node, NPM, Yarn, и простой `package.json`.
 
-First, we need to install Node, which is not only used for back-end JavaScript, but all the tools we need to build a modern Front-End stack.
+Прежде всего, нам нужно установить Node, который необходим не только для серверной части (back-end), но и для всех тех инструментов, которые входят в состав современных технологий для создания клиентской части (Front-End).
 
-Head to the [download page](https://nodejs.org/en/download/current/) for macOS or Windows binaries, or the [package manager installations page](https://nodejs.org/en/download/package-manager/) for Linux distributions.
+Зайдите на [страницу загрузки](https://nodejs.org/en/download/current/) дистрибутива для macOS или Windows, или установите [через менеджер пакетов](https://nodejs.org/en/download/package-manager/) для Linux.
 
-For instance, on **Ubuntu / Debian**, you would run the following commands to install Node:
+Например, на **Ubuntu / Debian**, чтобы установить Node нужно выполнить следующие команды:
 
 ```bash
 curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
 sudo apt-get install -y nodejs
 ```
-You want any version of Node > 6.5.0.
+Вам подойдет любая версия Node > 6.5.0.
 
-`npm`, the default package manager for Node, comes automatically with Node, so you don't have to install it yourself.
+`npm` - стандартный менеджер пакетов для Node, устанавливается автоматически, так что вам не нужно делать это вручную.
 
-**Note**: If Node is already installed, install `nvm` ([Node Version Manager](https://github.com/creationix/nvm)), make `nvm` install and use the latest version of Node for you.
+**Замечание**: Если Node уже установлен, установите `nvm` ([Node Version Manager](https://github.com/creationix/nvm))(Менеджер версий Node), выполните `nvm` install и пользуйтесь последней версией Node.
 
-[Yarn](https://yarnpkg.com/) is another package manager which is much faster than NPM, has offline support, and fetches dependencies [more predictably](https://yarnpkg.com/en/docs/yarn-lock). Since it [came out](https://code.facebook.com/posts/1840075619545360) in October 2016, it received a very quick adoption and is becoming the new package manager of choice of the JavaScript community. We are going to use Yarn in this tutorial. If you want to stick to NPM you can simply replace all `yarn add` and `yarn add --dev` commands of this tutorial by `npm install --save` and `npm install --dev`.
+[Yarn](https://yarnpkg.com/) - еще один менеджер пакетов. Он намного быстрее чем NPM, поддерживает работу офлайн и [лучше предугадывает](https://yarnpkg.com/en/docs/yarn-lock) подгрузку нужных зависимостей. С момента его [выхода](https://code.facebook.com/posts/1840075619545360) в Октябре 2016, он был очень быстро принят сообществом и постепенно становится лучшим решением для JavaScript. Мы будем использовать Yarn в этом руководстве. Если вы предпочетаете оставаться с NPM, просто замените все команды `yarn add` и `yarn add --dev` на `npm install --save` и `npm install --dev` в этом пособии.
 
-- Install Yarn by following the [instructions](https://yarnpkg.com/en/docs/install). You can likely install it with `npm install -g yarn` or `sudo npm install -g yarn` (yeah, we're using NPM to install Yarn, much like you would use Internet Explorer or Safari to install Chrome!).
+- Установите Yarn следуя [инструкциям](https://yarnpkg.com/en/docs/install). Проще всего это сделать через `npm install -g yarn` или `sudo npm install -g yarn` (ага, мы используем NPM чтобы установить Yarn, прям как использовать Internet Explorer или Safari чтобы установить Chrome!).
 
-- Create a new folder to work in, and `cd` in it.
-- Run `yarn init` and answer the questions (`yarn init -y` to skip all questions), to generate a `package.json` file automatically.
-- Create an `index.js` file containing `console.log('Hello world')`.
-- Run `node .` in this folder (`index.js` is the default file Node looks for in the current folder). It should print "Hello world".
+- Создайте новую директорию для работы и зайдите (`cd`) в нее.
+- Запустите `yarn init` и ответьте на вопросы (`yarn init -y` чтобы пропустить вопросы), чтобы создать файл `package.json` автоматически.
+- Создайте файл `index.js` содержащий `console.log('Hello world')`.
+- Запустите `node .` в этой директории (`index.js` - файл по умолчанию, который Node будет запускать в текущей папке). Должно выйти "Hello world".
 
-Running `node .` to execute our program is a bit too low-level. We are going to use an NPM/Yarn script to trigger the execution of that code instead. That will give us a nice abstraction to be able to always use `yarn start`, even when our program gets more complicated.
+Команда `node .` - слегка низкоуровневая для запуска программ. Вместо этого, мы будем использовать NPM/Yarn скрипты чтобы запускать выполнение нужного кода. Это даст нам хороший уровень абстракции, позволяющий всегда использовать `yarn start`, даже когда наша программа станет более сложной.
 
-- In `package.json`, add a `scripts` object to the root object like so:
+- В `package.json`, в корневом объекте создайте объект `scripts`, чтоб было так:
 
 ```
 "scripts": {
@@ -37,19 +37,19 @@ Running `node .` to execute our program is a bit too low-level. We are going to
 }
 ```
 
-`package.json` must be a valid JSON file, which means that you cannot have trailing commas. So be careful when editing manually your `package.json` file.
+`package.json` должен быть действительным JSON файлом, что значит, что он не может содержать завершающие запятые (trailing commas). Так что будьте внимательны, редактируя его вручную.
 
-- Run `yarn start`. It should print `Hello world`.
+- Запустите `yarn start`. Должно выйти `Hello world`.
 
-- Create a `.gitignore` file and add the following to it:
+- Создайте файл `.gitignore` и добавьте туда следующее:
 
 ```
 npm-debug.log
 yarn-error.log
 ```
 
-**Note**: If you take a look at the `package.json` files I provide, you will see a `tutorial-test` script in every chapter. Those scripts let me test that the chapter works fine when running `yarn && yarn start`. You can delete them in your own projects.
+**Замечание**: Если вы посмотрите на файлы `package.json`, которые я прилагаю к этому руководству, вы увидете там скрипт `tutorial-test`. Он есть в каждой части. Этот скрипт позволяет мне тестировать, что код правильно работает при запуске  `yarn && yarn start`. Вы можете удалять его из ваших проектов.
 
-Next section: [2 - Installing and using a package](/tutorial/2-packages)
+Следующий раздел: [2 - Installing and using a package](/tutorial/2-packages)
 
-Back to the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Назад в [Содержание](https://github.com/verekia/js-stack-from-scratch).
diff --git a/tutorial/1-node-npm-yarn-package-json/READMEeng.md b/tutorial/1-node-npm-yarn-package-json/READMEeng.md
new file mode 100644
index 0000000..05d7484
--- /dev/null
+++ b/tutorial/1-node-npm-yarn-package-json/READMEeng.md
@@ -0,0 +1,55 @@
+# 1 - Node, NPM, Yarn, and package.json
+
+In this section we will set up Node, NPM, Yarn, and a basic `package.json` file.
+
+First, we need to install Node, which is not only used for back-end JavaScript, but all the tools we need to build a modern Front-End stack.
+
+Head to the [download page](https://nodejs.org/en/download/current/) for macOS or Windows binaries, or the [package manager installations page](https://nodejs.org/en/download/package-manager/) for Linux distributions.
+
+For instance, on **Ubuntu / Debian**, you would run the following commands to install Node:
+
+```bash
+curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
+sudo apt-get install -y nodejs
+```
+You want any version of Node > 6.5.0.
+
+`npm`, the default package manager for Node, comes automatically with Node, so you don't have to install it yourself.
+
+**Note**: If Node is already installed, install `nvm` ([Node Version Manager](https://github.com/creationix/nvm)), make `nvm` install and use the latest version of Node for you.
+
+[Yarn](https://yarnpkg.com/) is another package manager which is much faster than NPM, has offline support, and fetches dependencies [more predictably](https://yarnpkg.com/en/docs/yarn-lock). Since it [came out](https://code.facebook.com/posts/1840075619545360) in October 2016, it received a very quick adoption and is becoming the new package manager of choice of the JavaScript community. We are going to use Yarn in this tutorial. If you want to stick to NPM you can simply replace all `yarn add` and `yarn add --dev` commands of this tutorial by `npm install --save` and `npm install --dev`.
+
+- Install Yarn by following the [instructions](https://yarnpkg.com/en/docs/install). You can likely install it with `npm install -g yarn` or `sudo npm install -g yarn` (yeah, we're using NPM to install Yarn, much like you would use Internet Explorer or Safari to install Chrome!).
+
+- Create a new folder to work in, and `cd` in it.
+- Run `yarn init` and answer the questions (`yarn init -y` to skip all questions), to generate a `package.json` file automatically.
+- Create an `index.js` file containing `console.log('Hello world')`.
+- Run `node .` in this folder (`index.js` is the default file Node looks for in the current folder). It should print "Hello world".
+
+Running `node .` to execute our program is a bit too low-level. We are going to use an NPM/Yarn script to trigger the execution of that code instead. That will give us a nice abstraction to be able to always use `yarn start`, even when our program gets more complicated.
+
+- In `package.json`, add a `scripts` object to the root object like so:
+
+```
+"scripts": {
+  "start": "node ."
+}
+```
+
+`package.json` must be a valid JSON file, which means that you cannot have trailing commas. So be careful when editing manually your `package.json` file.
+
+- Run `yarn start`. It should print `Hello world`.
+
+- Create a `.gitignore` file and add the following to it:
+
+```
+npm-debug.log
+yarn-error.log
+```
+
+**Note**: If you take a look at the `package.json` files I provide, you will see a `tutorial-test` script in every chapter. Those scripts let me test that the chapter works fine when running `yarn && yarn start`. You can delete them in your own projects.
+
+Next section: [2 - Installing and using a package](/tutorial/2-packages)
+
+Back to the [table of contents](https://github.com/verekia/js-stack-from-scratch).
-- 
GitLab


From 513117ebffa58608db995a3de4eb69a5cb1cd3d8 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Fri, 4 Nov 2016 17:51:39 +0700
Subject: [PATCH 13/73] section 2

---
 Definitions.md                                |  6 ++++
 README.md                                     |  2 +-
 .../1-node-npm-yarn-package-json/README.md    |  2 +-
 tutorial/2-packages/README.md                 | 33 ++++++++++---------
 tutorial/2-packages/READMEeng.md              | 31 +++++++++++++++++
 5 files changed, 56 insertions(+), 18 deletions(-)
 create mode 100644 tutorial/2-packages/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index d73b133..eb9c727 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -52,3 +52,9 @@ back-end - серверная часть
 
 trailing commas - завершающая запятая (/пробел)
 http://www.multitran.ru/c/m.exe?t=6766895_1_2&s1=trailing%20space
+
+repo/repository - репозиторий
+
+commit - фиксировать гл.
+commit - коммит сущ.
+
diff --git a/README.md b/README.md
index 61aa5f5..c6ccf63 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
 
 [![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch)
 
-Это русскоязычная версия руководства Джонатана Верекии (@verekia). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
+>Это русскоязычная версия руководства Джонатана Верекии (@verekia). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
 
 ## Работа над переводом идет. Это не окончательная версия!
 
diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index 1a9199c..46acd2e 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -52,4 +52,4 @@ yarn-error.log
 
 Следующий раздел: [2 - Installing and using a package](/tutorial/2-packages)
 
-Назад в [Содержание](https://github.com/verekia/js-stack-from-scratch).
+Назад в [Содержание](/tutorial).
diff --git a/tutorial/2-packages/README.md b/tutorial/2-packages/README.md
index 66b71a6..5d7fa41 100644
--- a/tutorial/2-packages/README.md
+++ b/tutorial/2-packages/README.md
@@ -1,31 +1,32 @@
 # 2 - Installing and using a package
 
-In this section we will install and use a package. A "package" is simply a piece of code that someone else wrote, and that you can use in your own code. It can be anything. Here, we're going to try a package that helps you manipulate colors for instance.
+В этой части мы установим и будем использовать один пакет (package). "Пакет" это просто кусок кода, написанный кем-то другим, и который вы можете использовать в своей программе. Это может быть что угодно. Например, мы сейчас попробуем воспользоваться пакетом, который помогает манипулировать цветами.
 
-- Install the community-made package called `color` by running `yarn add color`.
+- Установим созданный сообществом пакет, называемый `color`, путем запуска команды `yarn add color`.
 
-Open `package.json` to see how Yarn automatically added `color` in  `dependencies`.
+Откройте `package.json` чтобы увидеть как Yarn автоматически добавил `color` в  `dependencies` (зависимости).
 
-A `node_modules` folder has been created to store the package.
+Сам пакет находится в созданной для этого папке `node_modules`.
 
-- Add `node_modules/` to your `.gitignore` file (and `git init` a new repo if you haven't done that yet).
+- Добавьте `node_modules/` в файл `.gitignore` (и запустите `git init`, чтобы создать новый репозиторий, если вы еще этого не сделали)
 
-You will also notice that a `yarn.lock` file got generated by Yarn. You should commit this file to your repository, as it will ensure that everyone in your team uses the same version of your packages. If you're sticking to NPM instead of Yarn, the equivalent of this file is the *shrinkwrap*.
+Вы также могли заметить файл `yarn.lock`, сгенерированный Yarn. Вам нужно зафиксировать (commit) этот файл в репозитории, так как это позволит быть уверенным, что любой член вашей команды использует те же самые версии пакетов, что и вы. Если вы все еще предпочетаете NPM, а не Yarn, эквивалентом этого файла будет *shrinkwrap*.
 
-- Add `const Color = require('color');` in `index.js`
-- Use the package like this for instance: `const redHexa = Color({r: 255, g: 0, b: 0}).hexString();`
-- Add `console.log(redHexa)`.
-- Running `yarn start` should show `#FF0000`.
+- Добавьте `const Color = require('color');` в `index.js`
+- Используем пакет, например, таким образом: `const redHexa = Color({r: 255, g: 0, b: 0}).hexString();`
+- Добавьте `console.log(redHexa)`.
+- Запустите `yarn start` - должны увидеть `#FF0000`.
 
-Congratulations, you installed and used a package!
+Поздравляю! Вы установили и применили пакет!
 
-`color` is just used in this section to teach you how to use a simple package. We won't need it anymore, so you can uninstall it:
+`color` is just used in this section to teach you how to use a simple package. 
+`color` здесь просто как пример, чтобы научить вас использовать пакеты. Больше он нам не нужен, можно его удалить:
 
-- Run `yarn remove color`
+- Выполните `yarn remove color`
 
-**Note**: There are 2 kinds of package dependencies, `"dependencies"` and `"devDependencies"`. `"dependencies"` is more general than `"devDependencies"`, which are packages that you only need during development, not production (typically, build-related packages, linters, etc). For `"devDependencies"`, we will use `yarn add --dev [package]`.
+**Замечание**: Существует два вида зависимостей для подключения пакетов: `"dependencies"` и `"devDependencies"`. `"dependencies"` - более общее понятие, чем `"devDependencies"`, так как последние нужны только для разработки а не выпуска (production) приложения (обычно это пакеты связанные с процессом построения, анализаторы кода и т.п.). Для `"devDependencies"`, будем использовать `yarn add --dev [package]`. (прим. пер. `npm install [package] --save-dev`)
 
 
-Next section: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
+Следующий раздел: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
 
-Back to the [previous section](/tutorial/1-node-npm-yarn-package-json) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/tutorial).
diff --git a/tutorial/2-packages/READMEeng.md b/tutorial/2-packages/READMEeng.md
new file mode 100644
index 0000000..66b71a6
--- /dev/null
+++ b/tutorial/2-packages/READMEeng.md
@@ -0,0 +1,31 @@
+# 2 - Installing and using a package
+
+In this section we will install and use a package. A "package" is simply a piece of code that someone else wrote, and that you can use in your own code. It can be anything. Here, we're going to try a package that helps you manipulate colors for instance.
+
+- Install the community-made package called `color` by running `yarn add color`.
+
+Open `package.json` to see how Yarn automatically added `color` in  `dependencies`.
+
+A `node_modules` folder has been created to store the package.
+
+- Add `node_modules/` to your `.gitignore` file (and `git init` a new repo if you haven't done that yet).
+
+You will also notice that a `yarn.lock` file got generated by Yarn. You should commit this file to your repository, as it will ensure that everyone in your team uses the same version of your packages. If you're sticking to NPM instead of Yarn, the equivalent of this file is the *shrinkwrap*.
+
+- Add `const Color = require('color');` in `index.js`
+- Use the package like this for instance: `const redHexa = Color({r: 255, g: 0, b: 0}).hexString();`
+- Add `console.log(redHexa)`.
+- Running `yarn start` should show `#FF0000`.
+
+Congratulations, you installed and used a package!
+
+`color` is just used in this section to teach you how to use a simple package. We won't need it anymore, so you can uninstall it:
+
+- Run `yarn remove color`
+
+**Note**: There are 2 kinds of package dependencies, `"dependencies"` and `"devDependencies"`. `"dependencies"` is more general than `"devDependencies"`, which are packages that you only need during development, not production (typically, build-related packages, linters, etc). For `"devDependencies"`, we will use `yarn add --dev [package]`.
+
+
+Next section: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
+
+Back to the [previous section](/tutorial/1-node-npm-yarn-package-json) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
-- 
GitLab


From afc49cf95504b53b9a6af044fff8ccee91099b38 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Fri, 4 Nov 2016 17:59:06 +0700
Subject: [PATCH 14/73] fix content

---
 tutorial/1-node-npm-yarn-package-json/README.md | 2 +-
 tutorial/2-packages/README.md                   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index 46acd2e..081b59c 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -52,4 +52,4 @@ yarn-error.log
 
 Следующий раздел: [2 - Installing and using a package](/tutorial/2-packages)
 
-Назад в [Содержание](/tutorial).
+Назад в [Содержание](/).
diff --git a/tutorial/2-packages/README.md b/tutorial/2-packages/README.md
index 5d7fa41..e8ff97c 100644
--- a/tutorial/2-packages/README.md
+++ b/tutorial/2-packages/README.md
@@ -29,4 +29,4 @@
 
 Следующий раздел: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
 
-Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/tutorial).
+Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/).
-- 
GitLab


From 43ba0a58c3b2a5cc84c980693d22067792855b7c Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Fri, 4 Nov 2016 20:02:39 +0700
Subject: [PATCH 15/73] fix TOC links

---
 tutorial/1-node-npm-yarn-package-json/README.md    | 2 +-
 tutorial/10-immutable-redux-improvements/README.md | 2 +-
 tutorial/11-testing-mocha-chai-sinon/README.md     | 2 +-
 tutorial/12-flow/README.md                         | 2 +-
 tutorial/2-packages/README.md                      | 2 +-
 tutorial/3-es6-babel-gulp/README.md                | 2 +-
 tutorial/4-es6-syntax-class/README.md              | 2 +-
 tutorial/5-es6-modules-syntax/README.md            | 2 +-
 tutorial/6-eslint/README.md                        | 6 +++---
 tutorial/7-client-webpack/README.md                | 2 +-
 tutorial/8-react/README.md                         | 2 +-
 tutorial/9-redux/README.md                         | 2 +-
 12 files changed, 14 insertions(+), 14 deletions(-)

diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index 081b59c..6062fbe 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -52,4 +52,4 @@ yarn-error.log
 
 Следующий раздел: [2 - Installing and using a package](/tutorial/2-packages)
 
-Назад в [Содержание](/).
+Назад в [Содержание](/README.md).
diff --git a/tutorial/10-immutable-redux-improvements/README.md b/tutorial/10-immutable-redux-improvements/README.md
index 031409b..ca56507 100644
--- a/tutorial/10-immutable-redux-improvements/README.md
+++ b/tutorial/10-immutable-redux-improvements/README.md
@@ -99,4 +99,4 @@ export const makeBark = createAction(MAKE_BARK, () => true);
 
 Next section: [11 - Testing with Mocha, Chai, and Sinon](/tutorial/11-testing-mocha-chai-sinon)
 
-Back to the [previous section](/tutorial/9-redux) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/9-redux) or the [table of contents](/README.md).
diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index 0d0acd4..53a2766 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -154,4 +154,4 @@ If everything went well in this chapter, you should have 2 passing tests.
 
 Next section: [12 - Type Checking with Flow](/tutorial/12-flow)
 
-Back to the [previous section](/tutorial/10-immutable-redux-improvements) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/10-immutable-redux-improvements) or the [table of contents](/README.md).
diff --git a/tutorial/12-flow/README.md b/tutorial/12-flow/README.md
index 2cec7fb..f80e409 100644
--- a/tutorial/12-flow/README.md
+++ b/tutorial/12-flow/README.md
@@ -105,4 +105,4 @@ In my case, the `linter-flow` plugin for Atom was detecting type errors in the `
 
 You now have bullet-proof code that is linted, typechecked, and tested, good job!
 
-Back to the [previous section](/tutorial/11-testing-mocha-chai-sinon) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/11-testing-mocha-chai-sinon) or the [table of contents](/README.md).
diff --git a/tutorial/2-packages/README.md b/tutorial/2-packages/README.md
index e8ff97c..f58cf25 100644
--- a/tutorial/2-packages/README.md
+++ b/tutorial/2-packages/README.md
@@ -29,4 +29,4 @@
 
 Следующий раздел: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
 
-Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/).
+Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/README.md).
diff --git a/tutorial/3-es6-babel-gulp/README.md b/tutorial/3-es6-babel-gulp/README.md
index d1e062b..64543c1 100644
--- a/tutorial/3-es6-babel-gulp/README.md
+++ b/tutorial/3-es6-babel-gulp/README.md
@@ -90,4 +90,4 @@ Alright! Let's see if this works.
 
 Next section: [4 - Using the ES6 syntax with a class](/tutorial/4-es6-syntax-class)
 
-Back to the [previous section](/tutorial/2-packages) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/2-packages) or the [table of contents](/README.md).
diff --git a/tutorial/4-es6-syntax-class/README.md b/tutorial/4-es6-syntax-class/README.md
index f9d8495..64ab11e 100644
--- a/tutorial/4-es6-syntax-class/README.md
+++ b/tutorial/4-es6-syntax-class/README.md
@@ -38,4 +38,4 @@ console.log(toby.bark());
 
 Следующий раздел: [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
 
-Назад в [предыдущий раздел](/tutorial/3-es6-babel-gulp) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/3-es6-babel-gulp) или [Содержание](/README.md).
diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 55b1530..14018d2 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -47,4 +47,4 @@ import { exec } from 'child_process';
 
 Следующий раздел: [6 - ESLint](/tutorial/6-eslint)
 
-Назад в [предыдущий раздел](/tutorial/4-es6-syntax-class) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/4-es6-syntax-class) или [Содержание](/README.md).
diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index 60d98b3..aeecc4e 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -47,7 +47,7 @@ gulp.task('lint', () => {
 });
 ```
 
-Здесь мы говорм Gulp, что для этой задачи мы хотим подключить `gulpfile.babel.js` и JS файлы, расположенные в src`.
+Здесь мы говорм Gulp, что для этой задачи мы хотим подключить `gulpfile.babel.js` и JS файлы, расположенные в `src`.
 
 Откорректируйте задачу `build` так, чтобы `lint` предваряла ее запуск:
 
@@ -61,7 +61,7 @@ gulp.task('build', ['lint', 'clean'], () => {
 
 Один из видов ошибок будет: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в ~~скомпилированное приложение~~ (англ. build - прим. переводчика ) а какие нет. Поэтому мы немного поможем ESLint используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
 
-```javascript```
+```javascript
 /* eslint-disable import/no-extraneous-dependencies */
 ```
 
@@ -114,4 +114,4 @@ gulp.task('build', ['lint', 'clean'], () =>
 
 Следующий раздел: [7 - Клиентское приложение ~на основе Webpack~](/tutorial/7-client-webpack)
 
-Назад в [предыдущий раздел](/tutorial/5-es6-modules-syntax) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/5-es6-modules-syntax) или [Содержание](/README.md).
diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index b9adc15..896ce7e 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -193,4 +193,4 @@ gulp.task('clean', () => del([
 
 Следующий раздел: [8 - React](/tutorial/8-react)
 
-Назад в [предыдущий раздел](/tutorial/6-eslint) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/6-eslint) или [Содержание](/README.md).
diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index f44b996..721baf3 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -59,4 +59,4 @@ clientEntryPoint: 'src/client/app.jsx',
 
 Следующий раздел: [9 - Redux](/tutorial/9-redux)
 
-Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](https://github.com/verekia/js-stack-from-scratch).
+Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/README.md).
diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index 566175a..20bfe89 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -155,4 +155,4 @@ export default connect(mapStateToProps)(Message);
 
 Next section: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
 
-Back to the [previous section](/tutorial/8-react) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/8-react) or the [table of contents](/README.md).
-- 
GitLab


From 613db2379b6d1da1661cbf91be16eb89cef49b19 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Fri, 4 Nov 2016 22:54:26 +0700
Subject: [PATCH 16/73] section 12

---
 Definitions.md                                |   1 +
 README.md                                     |   2 +-
 .../10-immutable-redux-improvements/README.md |  55 ++++-----
 .../READMEeng.md                              | 102 +++++++++++++++++
 tutorial/12-flow/README.md                    |  53 ++++-----
 tutorial/12-flow/READMEeng.md                 | 108 ++++++++++++++++++
 6 files changed, 267 insertions(+), 54 deletions(-)
 create mode 100644 tutorial/10-immutable-redux-improvements/READMEeng.md
 create mode 100644 tutorial/12-flow/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index eb9c727..dfe9584 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -58,3 +58,4 @@ repo/repository - репозиторий
 commit - фиксировать гл.
 commit - коммит сущ.
 
+reducer functions - reducer-функции
diff --git a/README.md b/README.md
index c6ccf63..c104206 100644
--- a/README.md
+++ b/README.md
@@ -60,7 +60,7 @@
 
 [9 - Redux](/tutorial/9-redux)
 
-[10 - Immutable JS and ~Redux Improvements~](/tutorial/10-immutable-redux-improvements)
+[10 - Immutable JS и улучшения Redux](/tutorial/10-immutable-redux-improvements)
 
 [11 - Тестировние с Mocha, Chai, и Sinon](/tutorial/11-testing-mocha-chai-sinon)
 
diff --git a/tutorial/10-immutable-redux-improvements/README.md b/tutorial/10-immutable-redux-improvements/README.md
index ca56507..ccf02b3 100644
--- a/tutorial/10-immutable-redux-improvements/README.md
+++ b/tutorial/10-immutable-redux-improvements/README.md
@@ -1,26 +1,26 @@
-# 10 - Immutable JS and Redux Improvements
+# 10 - Immutable JS и улучшения Redux
 
 ## Immutable JS
 
-Unlike the previous chapter, this one is rather easy, and consists in minor improvements.
+В отличие от предыдущей части, эта довольно простая и состоит из незначительных улучшений.
 
-First, we are going to add **Immutable JS** to our codebase. Immutable is a library to manipulate objects without mutating them. Instead of doing:
+Сначала мы добавим **Immutable JS** в наш проект. Immutable - это библиотека, позволяющая манипулировать объектами не изменяя их. Вместо:
 
 ```javascript
 const obj = { a: 1 };
-obj.a = 2; // Mutates `obj`
+obj.a = 2; // Изменяет `obj`
 ```
-You would do:
+Мы можем сделать так:
 ```javascript
 const obj = Immutable.Map({ a: 1 });
-obj.set('a', 2); // Returns a new object without mutating `obj`
+obj.set('a', 2); // Возвращает новый объект не изменяя `obj`
 ```
 
-This approach follows the **functional programming** paradigm, which works really well with Redux. Your reducer functions actually *have* to be pure functions that don't alter the state passed as parameter, but return a brand new state object instead. Let's use Immutable to enforce this.
+Такой подход следует парадигме **функционального программирования**, которая хорошо подходит для работы с Redux. Ваши reducer-функции вообщето **должны** быть чистыми и не изменять состояние хранилища, переданное в качестве параметра, а возвращать вместо этого абсолютно новое. Давайте воспользуемся Immutable чтобы достичь этого.
 
-- Run `yarn add immutable`
+- Запустите `yarn add immutable`
 
-We are going to use `Map` in our codebase, but ESLint and the Airbnb config will complain about using a capitalized name without it being a class. Add the following to your `package.json` under `eslintConfig`:
+Мы будем использовать имя `Map` в нашем проекте, но ESLint и конфигурация Airbnb начнут жаловаться на использование capitalized (где первая буква заглавная) имен, если это не имя класса. Добавьте следующее в `package.json` после `eslintConfig`:
 
 ```json
 "rules": {
@@ -35,11 +35,11 @@ We are going to use `Map` in our codebase, but ESLint and the Airbnb config will
   ]
 }
 ```
-This makes `Map` and `List` (the 2 Immutable objects you'll use all the time) exceptions to that ESLint rule. This verbose JSON formatting is actually done automatically by Yarn/NPM, so we cannot make it more compact unfortunately.
+Таким образом мы внесли `Map` и `List` (два Immutable объекта, которые мы будем использовать постояно) в исключения к этому ESLint правилу. Такой подробный стиль форматирования JSON, выполняется автоматически Yarn/NPM, так что мы, к сожалению, не можем сделать его более компактным.
 
-Anyway, back to Immutable:
+В любом случае, вернемся к Immutable:
 
-In `dog-reducer.js` tweak your file so it looks like this:
+Настройте `dog-reducer.js`, чтобы он выглядел так:
 
 ```javascript
 import Immutable from 'immutable';
@@ -61,9 +61,9 @@ const dogReducer = (state = initialState, action) => {
 export default dogReducer;
 ```
 
-The initial state is now built using an Immutable Map, and the new state is generated using `set()`, preventing any mutation of the previous state.
+Теперь мы создаем исходное состояние, используя Immutable Map, а новое состояние получаем применяя `set()`, что исключает любые мутации предыдущего состояния.
 
-In `containers/bark-message.js`, update the `mapStateToProps` function to use `.get('hasBarked')` instead of `.hasBarked`:
+В `containers/bark-message.js`, обновите функцию `mapStateToProps` чтобы она использовала `.get('hasBarked')` вместо `.hasBarked`:
 
 ```javascript
 const mapStateToProps = state => ({
@@ -71,20 +71,20 @@ const mapStateToProps = state => ({
 });
 ```
 
-The app should still behave exactly the way it did before.
+Приложение должно себя вести точно так же как и до этого.
 
-**Note**: If Babel complains about Immutable exceeding 100KB, add `"compact": false` to your `package.json` under `babel`.
+**Замечание**: Если Babel жалуется на то, что Immutable превышает 100KB, добавьте `"compact": false` в `package.json` после `babel`.
 
-As you can see from the code snippet above, our state object still contains a plain old `dog` object attribute, which isn't immutable. It is fine this way, but if you want to only manipulate immutable objects, you could install the `redux-immutable` package to replace Redux's `combineReducers` function.
+Как вы можете видеть из предыдущего фрагмента кода, сам объект state все еще содержит старый атрибут `dog`, являющийся простым объектом и подверженный мутациям. В нашем случае это нормально, но если вы хотите манипулировать только немутируемыми объектами, можете установить пакет `redux-immutable` чтобы заменить функцию `combineReducers` у Redux.
 
-**Optional**:
-- Run `yarn add redux-immutable`
-- Replace your `combineReducers` function in `app.jsx` to use the one imported from `redux-immutable` instead.
-- In `bark-message.js` replace `state.dog.get('hasBarked')` by `state.getIn(['dog', 'hasBarked'])`.
+**Не обязательно**:
+- Запустите `yarn add redux-immutable`
+- Замените функцию `combineReducers` из `app.jsx` на ту, что мы импортировали из `redux-immutable`.
+- В `bark-message.js` замените `state.dog.get('hasBarked')` на `state.getIn(['dog', 'hasBarked'])`.
 
-## Redux Actions
+## Redux Действя (Actions)
 
-As you add more and more actions to your app, you will find yourself writing quite a lot of the same boilerplate. The `redux-actions` package helps reducing that boilerplate code. With `redux-actions` you can rewrite your `dog-actions.js` file in a more compact way:
+По мере того, как вы добавляете все больше и больше действий в ваше приложение, вы обнаружите, что приходится писать довольно много одного и того же кода. Пакет `redux-actions` помогает уменьшить этот повторяющийся код. С помощью `redux-actions` вы можете привести файл `dog-actions.js` к более компактному виду:
 
 ```javascript
 import { createAction } from 'redux-actions';
@@ -93,10 +93,11 @@ export const MAKE_BARK = 'MAKE_BARK';
 export const makeBark = createAction(MAKE_BARK, () => true);
 ```
 
-`redux-actions` implement the [Flux Standard Action](https://github.com/acdlite/flux-standard-action) model, just like the action we previously wrote, so integrating `redux-actions` is seamless if you follow this model.
+`redux-actions` внедряет модель [Flux Standard Action](https://github.com/acdlite/flux-standard-action), прям так же как, действия, которые мы писали до этого, так что интеграция `redux-actions` будет бесшовной если вы придерживаетесь этой модели.
 
-- Don't forget to run `yarn add redux-actions`.
+- Не забудьте запустить `yarn add redux-actions`.
 
-Next section: [11 - Testing with Mocha, Chai, and Sinon](/tutorial/11-testing-mocha-chai-sinon)
+Следующий раздел: [11 - Тестировние с Mocha, Chai, и Sinon](/tutorial/11-testing-mocha-chai-sinon)
+
+Назад в [предыдущий раздел](/tutorial/9-redux) или [Содержание](/README.md).
 
-Back to the [previous section](/tutorial/9-redux) or the [table of contents](/README.md).
diff --git a/tutorial/10-immutable-redux-improvements/READMEeng.md b/tutorial/10-immutable-redux-improvements/READMEeng.md
new file mode 100644
index 0000000..ca56507
--- /dev/null
+++ b/tutorial/10-immutable-redux-improvements/READMEeng.md
@@ -0,0 +1,102 @@
+# 10 - Immutable JS and Redux Improvements
+
+## Immutable JS
+
+Unlike the previous chapter, this one is rather easy, and consists in minor improvements.
+
+First, we are going to add **Immutable JS** to our codebase. Immutable is a library to manipulate objects without mutating them. Instead of doing:
+
+```javascript
+const obj = { a: 1 };
+obj.a = 2; // Mutates `obj`
+```
+You would do:
+```javascript
+const obj = Immutable.Map({ a: 1 });
+obj.set('a', 2); // Returns a new object without mutating `obj`
+```
+
+This approach follows the **functional programming** paradigm, which works really well with Redux. Your reducer functions actually *have* to be pure functions that don't alter the state passed as parameter, but return a brand new state object instead. Let's use Immutable to enforce this.
+
+- Run `yarn add immutable`
+
+We are going to use `Map` in our codebase, but ESLint and the Airbnb config will complain about using a capitalized name without it being a class. Add the following to your `package.json` under `eslintConfig`:
+
+```json
+"rules": {
+  "new-cap": [
+    2,
+    {
+      "capIsNewExceptions": [
+        "Map",
+        "List"
+      ]
+    }
+  ]
+}
+```
+This makes `Map` and `List` (the 2 Immutable objects you'll use all the time) exceptions to that ESLint rule. This verbose JSON formatting is actually done automatically by Yarn/NPM, so we cannot make it more compact unfortunately.
+
+Anyway, back to Immutable:
+
+In `dog-reducer.js` tweak your file so it looks like this:
+
+```javascript
+import Immutable from 'immutable';
+import { MAKE_BARK } from '../actions/dog-actions';
+
+const initialState = Immutable.Map({
+  hasBarked: false,
+});
+
+const dogReducer = (state = initialState, action) => {
+  switch (action.type) {
+    case MAKE_BARK:
+      return state.set('hasBarked', action.payload);
+    default:
+      return state;
+  }
+};
+
+export default dogReducer;
+```
+
+The initial state is now built using an Immutable Map, and the new state is generated using `set()`, preventing any mutation of the previous state.
+
+In `containers/bark-message.js`, update the `mapStateToProps` function to use `.get('hasBarked')` instead of `.hasBarked`:
+
+```javascript
+const mapStateToProps = state => ({
+  message: state.dog.get('hasBarked') ? 'The dog barked' : 'The dog did not bark',
+});
+```
+
+The app should still behave exactly the way it did before.
+
+**Note**: If Babel complains about Immutable exceeding 100KB, add `"compact": false` to your `package.json` under `babel`.
+
+As you can see from the code snippet above, our state object still contains a plain old `dog` object attribute, which isn't immutable. It is fine this way, but if you want to only manipulate immutable objects, you could install the `redux-immutable` package to replace Redux's `combineReducers` function.
+
+**Optional**:
+- Run `yarn add redux-immutable`
+- Replace your `combineReducers` function in `app.jsx` to use the one imported from `redux-immutable` instead.
+- In `bark-message.js` replace `state.dog.get('hasBarked')` by `state.getIn(['dog', 'hasBarked'])`.
+
+## Redux Actions
+
+As you add more and more actions to your app, you will find yourself writing quite a lot of the same boilerplate. The `redux-actions` package helps reducing that boilerplate code. With `redux-actions` you can rewrite your `dog-actions.js` file in a more compact way:
+
+```javascript
+import { createAction } from 'redux-actions';
+
+export const MAKE_BARK = 'MAKE_BARK';
+export const makeBark = createAction(MAKE_BARK, () => true);
+```
+
+`redux-actions` implement the [Flux Standard Action](https://github.com/acdlite/flux-standard-action) model, just like the action we previously wrote, so integrating `redux-actions` is seamless if you follow this model.
+
+- Don't forget to run `yarn add redux-actions`.
+
+Next section: [11 - Testing with Mocha, Chai, and Sinon](/tutorial/11-testing-mocha-chai-sinon)
+
+Back to the [previous section](/tutorial/9-redux) or the [table of contents](/README.md).
diff --git a/tutorial/12-flow/README.md b/tutorial/12-flow/README.md
index f80e409..fa82086 100644
--- a/tutorial/12-flow/README.md
+++ b/tutorial/12-flow/README.md
@@ -1,12 +1,12 @@
 # 12 - Flow
 
-[Flow](https://flowtype.org/) is a static type checker. It detects inconsistent types in your code and you can add explicit type declarations in it via annotations.
+[Flow](https://flowtype.org/) - статический типизатор (static type checker). Он определяет несоответствие типов в вашем коде и позволяет напрямую декларировать типы через аннотации. 
 
-- In order for Babel to understand and remove Flow annotations during the transpilation process, install the Flow preset for Babel by running `yarn add --dev babel-preset-flow`. Then, add `"flow"` under `babel.presets` in your `package.json`.
+- Для того, чтобы Babel мог понимать и убирать аннотации Flow в процессе транспиляции, установите плагин Flow для Babel выполнив `yarn add --dev babel-preset-flow`. Затем добавье `"flow"` после `babel.presets` в `package.json`.
 
-- Create an empty `.flowconfig` file at the root of your project
+- Создайте пустой файл `.flowconfig` в корне проекта.
 
-- Run `yarn add --dev gulp-flowtype` to install the Gulp plugin for Flow, and add `flow()` to your `lint` task:
+- Запустите `yarn add --dev gulp-flowtype` чтобы установить Gulp плагин для Flow, и добавьте `flow()` в задачу `lint`:
 
 ```javascript
 import flow from 'gulp-flowtype';
@@ -26,11 +26,11 @@ gulp.task('lint', () =>
 );
 ```
 
-The `abort` option is to interrupt the Gulp task if Flow detects an issue.
+Опция `abort` прерывает задачу Gulp если Flow обнаруживает проблему.
 
-Alright, we should be able to run Flow now.
+Отлично, теперь мы можем запустить Flow.
 
-- Add Flow annotations to `src/shared/dog.js` like so:
+- Добавьте аннотации Flow в `src/shared/dog.js` так, чтобы:
 
 ```javascript
 // @flow
@@ -57,52 +57,53 @@ class Dog {
 export default Dog;
 ```
 
-The `// @flow` comment tells Flow that we want this file to be typechecked. For the rest, Flow annotations are typically a colon after a function parameter or a function name. Check the documentation for more details.
+Комментарий `// @flow` говорит Flow что мы хотим проверять типы для этого файла. В остальном, аннотации Flow - это обычно двоеточие после параметра фукции или имени функции. Подробности посмотрите в документации.
 
-Now if you run `yarn start`, Flow will work fine, but ESLint is going to complain about that non-standard syntax we're using. Since Babel's parser is all up-and-running with parsing Flow content thanks to the `babel-preset-flow` plugin we installed, it'd be nice if ESLint could rely on Babel's parser instead of trying to understand Flow annotations on its own. That's actually possible using the `babel-eslint` package. Let's do this.
+Теперь, если вы запустите `yarn start`, Flow будет работать, но ESLint начнет жаловаться, что используется нестандартный синтаксис. 
+Поскольку парсер Babel отлично справляется с парсингом Flow контента (благодаря установленному нами плагину `babel-preset-flow`), было бы здорово, если бы ESLint мог опираться на парсер Babel, вместо того, чтобы пытаться самому понять аннотации Flow. Вообще, это возможно при использовании пакета `babel-eslint`. Давайте сделаем это.
 
-- Run `yarn add --dev babel-eslint`
+- Запустите `yarn add --dev babel-eslint`
 
-- In `package.json`, under `eslintConfig`, add the following property: `"parser": "babel-eslint"`
+- В `package.json`, после `eslintConfig`, добавьте следующее свойство: `"parser": "babel-eslint"`
 
-`yarn start` should now both lint and typecheck your code fine.
+Теперь `yarn start` должен одновременно анализировать код с помощью ESLint и проверять типы посредством Flow.
 
-Now that ESLint and Babel are able to share a common parser, we can actually get ESLint to lint our Flow annotations via the `eslint-plugin-flowtype` plugin.
+Теперь, поскольку ESLint и Babel совместно использовать общий парсер, мы можем заставить ESLint проверять наши Flow аннотации, используя плагин `eslint-plugin-flowtype`.
 
-- Run `yarn add --dev eslint-plugin-flowtype` and add `"flowtype"` under `eslintConfig.plugins` in `package.json`, and add `"plugin:flowtype/recommended"` under `eslintConfig.extends` in an array next to `"airbnb"`.
+- Запустите `yarn add --dev eslint-plugin-flowtype` и добавьте `"flowtype"` после `eslintConfig.plugins` в `package.json`, и добавьте `"plugin:flowtype/recommended"` после `eslintConfig.extends` в массив после `"airbnb"`.
 
-Now if you type `name:string` as an annotation, ESLint should complain that you forgot a space after the colon for instance.
+Теперь если вы, например, введете `name:string` в качестве аннотации, ESLint должен пожаловаться, что вы забыли пробел после двоеточия. 
 
-**Note**: The `"parser": "babel-eslint"` property that I made you write in `package.json` is actually included in the `"plugin:flowtype/recommended"` config, so you can now remove it for a more minimal `package.json`. Leaving it there is more explicit though, so that's up to your personal preference. Since this tutorial is about the most minimal setup, I removed it.
+**Замечание**: Свойство `"parser": "babel-eslint"` которое я заставил вас написать в `package.json` вообще-то входит в конфигурацию `"plugin:flowtype/recommended"`, так что теперь можете убрать его, чтобы сократить `package.json`. С другой стороны, оставить его здесь будет более наглядным, так что это на ваше предпочтение. Поскольку это руководство нацелено на максимальную краткость, я уберу.
 
-- You can now add `// @flow` in every `.js` and `.jsx` file under `src`, run `yarn test` or `yarn start`, and add type annotations everywhere Flow asks you to do so.
+- Вы можете теперь добавить `// @flow` в каждый `.js` и `.jsx` файл в папке `src`, запустить `yarn test` или `yarn start`, и добавлять аннотации везде где этого попросит Flow.
 
-One counterintuitive case is the following, for `src/client/component/message.jsx`:
+Вы можете обнаружить неожиданный случай в `src/client/component/message.jsx`:
 
 ```javascript
 const Message = ({ message }: { message: string }) => <div>{message}</div>;
 ```
 
-As you can see, when destructuring function parameters, you must annotate the extracted properties using a sort of object literal notation.
+Как можете видеть, при деструктурировании параметра функции, вы должны делать аннотации для выделяемых свойств в виде объекта в литеральной нотации.
 
-Another case you will encounter is that in `src/client/reducers/dog-reducer.js`, Flow will complain about Immutable not having a default export. This issue is discussed in [#863 on Immutable](https://github.com/facebook/immutable-js/issues/863), which highlights 2 workarounds:
+Другим случаем, с которым вы столкнетесь, будет в `src/client/reducers/dog-reducer.js`. Flow начнет жаловаться, что Immutable не имеет возвращаемого значения по умолчанию. Эта проблема описана тут: [#863 on Immutable](https://github.com/facebook/immutable-js/issues/863), и имеет два обходных путя:
 
 ```javascript
 import { Map as ImmutableMap } from 'immutable';
-// or
+// или
 import * as Immutable from 'immutable';
 ```
 
-Until Immutable officially adresses the issue, just pick whichever looks better to you when importing Immutable components. I'm personally going for `import * as Immutable from 'immutable'` since it's shorter and won't require refactoring the code when this issue gets fixed.
+Пока Immutable официально не разрешит проблему, просто выберите то, что вам больше нравится, когда импортируете компоненты Immutable. Лично я, буду использовать `import * as Immutable from 'immutable'`, поскольку это короче и не потребует рефакторинга кода после того, как проблема будет решена.
 
-**Note**: If Flow detects type errors in your `node_modules` folder, add an `[ignore]` section in your `.flowconfig` to ignore the packages causing issues specifically (do not ignore the entire `node_modules` directory). It could look like this:
+**Замечание**: Если Flow определяет ошибки типизации в папке `node_modules`, добавьте раздел `[ignore]` в файл `.flowconfig` чтобы указать какие именно пакеты игнорировать (не игнорируйте полностью директорию `node_modules`). Это может выглядеть так:
 ```
 [ignore]
 
 .*/node_modules/gulp-flowtype/.*
 ```
-In my case, the `linter-flow` plugin for Atom was detecting type errors in the `node_modules/gulp-flowtype` directory, which contains files annotated with `// @flow`.
+В моем случе плагин `linter-flow` для Atom обнаружил ошибки типизации в директории `node_modules/gulp-flowtype`, которая содержит файлы аннотированные `// @flow`.
 
-You now have bullet-proof code that is linted, typechecked, and tested, good job!
+Теперь у вас есть "пуленепробиваемый" код, который проанализирован, протипизирован и протестирован - отличная работа!
 
-Back to the [previous section](/tutorial/11-testing-mocha-chai-sinon) or the [table of contents](/README.md).
+Назад в [предыдущий раздел](/tutorial/11-testing-mocha-chai-sinon) или [Содержание](/README.md).
diff --git a/tutorial/12-flow/READMEeng.md b/tutorial/12-flow/READMEeng.md
new file mode 100644
index 0000000..f80e409
--- /dev/null
+++ b/tutorial/12-flow/READMEeng.md
@@ -0,0 +1,108 @@
+# 12 - Flow
+
+[Flow](https://flowtype.org/) is a static type checker. It detects inconsistent types in your code and you can add explicit type declarations in it via annotations.
+
+- In order for Babel to understand and remove Flow annotations during the transpilation process, install the Flow preset for Babel by running `yarn add --dev babel-preset-flow`. Then, add `"flow"` under `babel.presets` in your `package.json`.
+
+- Create an empty `.flowconfig` file at the root of your project
+
+- Run `yarn add --dev gulp-flowtype` to install the Gulp plugin for Flow, and add `flow()` to your `lint` task:
+
+```javascript
+import flow from 'gulp-flowtype';
+
+// [...]
+
+gulp.task('lint', () =>
+  gulp.src([
+    paths.allSrcJs,
+    paths.gulpFile,
+    paths.webpackFile,
+  ])
+    .pipe(eslint())
+    .pipe(eslint.format())
+    .pipe(eslint.failAfterError())
+    .pipe(flow({ abort: true })) // Add Flow here
+);
+```
+
+The `abort` option is to interrupt the Gulp task if Flow detects an issue.
+
+Alright, we should be able to run Flow now.
+
+- Add Flow annotations to `src/shared/dog.js` like so:
+
+```javascript
+// @flow
+
+class Dog {
+  name: string;
+
+  constructor(name: string) {
+    this.name = name;
+  }
+
+  bark(): string {
+    return `Wah wah, I am ${this.name}`;
+  }
+
+  barkInConsole() {
+    /* eslint-disable no-console */
+    console.log(this.bark());
+    /* eslint-enable no-console */
+  }
+
+}
+
+export default Dog;
+```
+
+The `// @flow` comment tells Flow that we want this file to be typechecked. For the rest, Flow annotations are typically a colon after a function parameter or a function name. Check the documentation for more details.
+
+Now if you run `yarn start`, Flow will work fine, but ESLint is going to complain about that non-standard syntax we're using. Since Babel's parser is all up-and-running with parsing Flow content thanks to the `babel-preset-flow` plugin we installed, it'd be nice if ESLint could rely on Babel's parser instead of trying to understand Flow annotations on its own. That's actually possible using the `babel-eslint` package. Let's do this.
+
+- Run `yarn add --dev babel-eslint`
+
+- In `package.json`, under `eslintConfig`, add the following property: `"parser": "babel-eslint"`
+
+`yarn start` should now both lint and typecheck your code fine.
+
+Now that ESLint and Babel are able to share a common parser, we can actually get ESLint to lint our Flow annotations via the `eslint-plugin-flowtype` plugin.
+
+- Run `yarn add --dev eslint-plugin-flowtype` and add `"flowtype"` under `eslintConfig.plugins` in `package.json`, and add `"plugin:flowtype/recommended"` under `eslintConfig.extends` in an array next to `"airbnb"`.
+
+Now if you type `name:string` as an annotation, ESLint should complain that you forgot a space after the colon for instance.
+
+**Note**: The `"parser": "babel-eslint"` property that I made you write in `package.json` is actually included in the `"plugin:flowtype/recommended"` config, so you can now remove it for a more minimal `package.json`. Leaving it there is more explicit though, so that's up to your personal preference. Since this tutorial is about the most minimal setup, I removed it.
+
+- You can now add `// @flow` in every `.js` and `.jsx` file under `src`, run `yarn test` or `yarn start`, and add type annotations everywhere Flow asks you to do so.
+
+One counterintuitive case is the following, for `src/client/component/message.jsx`:
+
+```javascript
+const Message = ({ message }: { message: string }) => <div>{message}</div>;
+```
+
+As you can see, when destructuring function parameters, you must annotate the extracted properties using a sort of object literal notation.
+
+Another case you will encounter is that in `src/client/reducers/dog-reducer.js`, Flow will complain about Immutable not having a default export. This issue is discussed in [#863 on Immutable](https://github.com/facebook/immutable-js/issues/863), which highlights 2 workarounds:
+
+```javascript
+import { Map as ImmutableMap } from 'immutable';
+// or
+import * as Immutable from 'immutable';
+```
+
+Until Immutable officially adresses the issue, just pick whichever looks better to you when importing Immutable components. I'm personally going for `import * as Immutable from 'immutable'` since it's shorter and won't require refactoring the code when this issue gets fixed.
+
+**Note**: If Flow detects type errors in your `node_modules` folder, add an `[ignore]` section in your `.flowconfig` to ignore the packages causing issues specifically (do not ignore the entire `node_modules` directory). It could look like this:
+```
+[ignore]
+
+.*/node_modules/gulp-flowtype/.*
+```
+In my case, the `linter-flow` plugin for Atom was detecting type errors in the `node_modules/gulp-flowtype` directory, which contains files annotated with `// @flow`.
+
+You now have bullet-proof code that is linted, typechecked, and tested, good job!
+
+Back to the [previous section](/tutorial/11-testing-mocha-chai-sinon) or the [table of contents](/README.md).
-- 
GitLab


From f73924b92329e1b8120e684d944653453d2d8ef3 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 5 Nov 2016 12:12:13 +0000
Subject: [PATCH 17/73] README.md edited online with Bitbucket

---
 .../1-node-npm-yarn-package-json/README.md     | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index 6062fbe..65b8cf1 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -1,6 +1,6 @@
 # 1 - Node, NPM, Yarn, and package.json
 
-В этой части мы настроим Node, NPM, Yarn, и простой `package.json`.
+В этой главе мы настроим Node, NPM, Yarn, и простой `package.json`.
 
 Прежде всего, нам нужно установить Node, который необходим не только для серверной части (back-end), но и для всех тех инструментов, которые входят в состав современных технологий для создания клиентской части (Front-End).
 
@@ -16,20 +16,20 @@ sudo apt-get install -y nodejs
 
 `npm` - стандартный менеджер пакетов для Node, устанавливается автоматически, так что вам не нужно делать это вручную.
 
-**Замечание**: Если Node уже установлен, установите `nvm` ([Node Version Manager](https://github.com/creationix/nvm))(Менеджер версий Node), выполните `nvm` install и пользуйтесь последней версией Node.
+**Примечание**: Если Node уже установлен, установите `nvm` ([Node Version Manager](https://github.com/creationix/nvm))(Менеджер версий Node), выполните `nvm` install и пользуйтесь последней версией Node.
 
-[Yarn](https://yarnpkg.com/) - еще один менеджер пакетов. Он намного быстрее чем NPM, поддерживает работу офлайн и [лучше предугадывает](https://yarnpkg.com/en/docs/yarn-lock) подгрузку нужных зависимостей. С момента его [выхода](https://code.facebook.com/posts/1840075619545360) в Октябре 2016, он был очень быстро принят сообществом и постепенно становится лучшим решением для JavaScript. Мы будем использовать Yarn в этом руководстве. Если вы предпочетаете оставаться с NPM, просто замените все команды `yarn add` и `yarn add --dev` на `npm install --save` и `npm install --dev` в этом пособии.
+[Yarn](https://yarnpkg.com/) - еще один менеджер пакетов. Он намного быстрее чем NPM, поддерживает работу офлайн и [лучше предугадывает](https://yarnpkg.com/en/docs/yarn-lock) подгрузку нужных зависимостей. С момента его [выхода](https://code.facebook.com/posts/1840075619545360) в Октябре 2016, он был очень быстро принят сообществом и постепенно становится лучшим решением для JavaScript. В данном руководстве мы будем использовать Yarn. Если вы предпочетаете оставаться с NPM, просто замените все команды `yarn add` и `yarn add --dev` на `npm install --save` и `npm install --dev` в этом пособии.
 
-- Установите Yarn следуя [инструкциям](https://yarnpkg.com/en/docs/install). Проще всего это сделать через `npm install -g yarn` или `sudo npm install -g yarn` (ага, мы используем NPM чтобы установить Yarn, прям как использовать Internet Explorer или Safari чтобы установить Chrome!).
+- Установите Yarn следуя [инструкциям](https://yarnpkg.com/en/docs/install). Проще всего это сделать через `npm install -g yarn` или `sudo npm install -g yarn` (Верно, мы используем NPM чтобы установить Yarn, все равно, что использовать Internet Explorer или Safari чтобы установить Chrome!).
 
 - Создайте новую директорию для работы и зайдите (`cd`) в нее.
-- Запустите `yarn init` и ответьте на вопросы (`yarn init -y` чтобы пропустить вопросы), чтобы создать файл `package.json` автоматически.
+- Запустите `yarn init` и ответьте на вопросы, чтобы создать файл `package.json` автоматически (`yarn init -y` чтобы пропустить вопросы).
 - Создайте файл `index.js` содержащий `console.log('Hello world')`.
 - Запустите `node .` в этой директории (`index.js` - файл по умолчанию, который Node будет запускать в текущей папке). Должно выйти "Hello world".
 
-Команда `node .` - слегка низкоуровневая для запуска программ. Вместо этого, мы будем использовать NPM/Yarn скрипты чтобы запускать выполнение нужного кода. Это даст нам хороший уровень абстракции, позволяющий всегда использовать `yarn start`, даже когда наша программа станет более сложной.
+Команда `node .` - слегка низкоуровневая для запуска программ. Вместо нее, мы будем использовать NPM/Yarn скрипты, чтобы запускать выполнение нужного кода. Это даст нам хороший уровень абстракции, позволяющий всегда использовать `yarn start`, даже когда наша программа станет более сложной.
 
-- В `package.json`, в корневом объекте создайте объект `scripts`, чтоб было так:
+- В файле `package.json`, в корневом объекте создайте объект `scripts`, чтоб было так:
 
 ```
 "scripts": {
@@ -37,7 +37,7 @@ sudo apt-get install -y nodejs
 }
 ```
 
-`package.json` должен быть действительным JSON файлом, что значит, что он не может содержать завершающие запятые (trailing commas). Так что будьте внимательны, редактируя его вручную.
+`package.json` должен быть действительным JSON файлом, это значит, что он не может содержать завершающие запятые (trailing commas). Так что будьте внимательны, редактируя его вручную.
 
 - Запустите `yarn start`. Должно выйти `Hello world`.
 
@@ -48,7 +48,7 @@ npm-debug.log
 yarn-error.log
 ```
 
-**Замечание**: Если вы посмотрите на файлы `package.json`, которые я прилагаю к этому руководству, вы увидете там скрипт `tutorial-test`. Он есть в каждой части. Этот скрипт позволяет мне тестировать, что код правильно работает при запуске  `yarn && yarn start`. Вы можете удалять его из ваших проектов.
+**Примечание**: Если вы посмотрите на файлы `package.json`, которые я прилагаю к этому руководству, вы увидете там скрипт `tutorial-test`. Он есть в каждой части. Этот скрипт позволяет тестировать код, на правильную работу при запуске  `yarn && yarn start`. Вы можете удалить его из вашего проекта.
 
 Следующий раздел: [2 - Installing and using a package](/tutorial/2-packages)
 
-- 
GitLab


From 47122309e74e80a9d65a57a9dcc62c86cdecaeab Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 5 Nov 2016 12:29:45 +0000
Subject: [PATCH 18/73] README.md edited online with Bitbucket

---
 tutorial/2-packages/README.md | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/tutorial/2-packages/README.md b/tutorial/2-packages/README.md
index f58cf25..4bb4e2a 100644
--- a/tutorial/2-packages/README.md
+++ b/tutorial/2-packages/README.md
@@ -1,16 +1,16 @@
 # 2 - Installing and using a package
 
-В этой части мы установим и будем использовать один пакет (package). "Пакет" это просто кусок кода, написанный кем-то другим, и который вы можете использовать в своей программе. Это может быть что угодно. Например, мы сейчас попробуем воспользоваться пакетом, который помогает манипулировать цветами.
+В этой части мы установим и будем использовать один пакет (package). "Пакет" это просто кусок кода, написанный кем-то другим, и который вы можете использовать в своей программе. Это может быть что угодно. Например, сейчас мы попробуем воспользоваться пакетом, который позволяет манипулировать цветами.
 
 - Установим созданный сообществом пакет, называемый `color`, путем запуска команды `yarn add color`.
 
-Откройте `package.json` чтобы увидеть как Yarn автоматически добавил `color` в  `dependencies` (зависимости).
+Откройте `package.json`, чтобы увидеть, как Yarn автоматически добавил `color` в  `dependencies` (зависимости).
 
-Сам пакет находится в созданной для этого папке `node_modules`.
+Сам пакет находится в созданной для него папке `node_modules`.
 
 - Добавьте `node_modules/` в файл `.gitignore` (и запустите `git init`, чтобы создать новый репозиторий, если вы еще этого не сделали)
 
-Вы также могли заметить файл `yarn.lock`, сгенерированный Yarn. Вам нужно зафиксировать (commit) этот файл в репозитории, так как это позволит быть уверенным, что любой член вашей команды использует те же самые версии пакетов, что и вы. Если вы все еще предпочетаете NPM, а не Yarn, эквивалентом этого файла будет *shrinkwrap*.
+Вы также могли заметить файл `yarn.lock`, сгенерированный Yarn. Вам необходимо зафиксировать (commit) этот файл в репозитории, так как это гарантирует, что любой член вашей команды использует те же самые версии пакетов, что и вы. Если вы все еще предпочетаете NPM, а не Yarn, эквивалентом этого файла будет *shrinkwrap*.
 
 - Добавьте `const Color = require('color');` в `index.js`
 - Используем пакет, например, таким образом: `const redHexa = Color({r: 255, g: 0, b: 0}).hexString();`
@@ -19,12 +19,12 @@
 
 Поздравляю! Вы установили и применили пакет!
 
-`color` is just used in this section to teach you how to use a simple package. 
-`color` здесь просто как пример, чтобы научить вас использовать пакеты. Больше он нам не нужен, можно его удалить:
+`color` is just used in this section to teach you how to use a simple package. - это надо оставить?
+`color` здесь просто пример, чтобы научить вас использовать пакеты. Больше он нам не нужен, можно его удалить:
 
 - Выполните `yarn remove color`
 
-**Замечание**: Существует два вида зависимостей для подключения пакетов: `"dependencies"` и `"devDependencies"`. `"dependencies"` - более общее понятие, чем `"devDependencies"`, так как последние нужны только для разработки а не выпуска (production) приложения (обычно это пакеты связанные с процессом построения, анализаторы кода и т.п.). Для `"devDependencies"`, будем использовать `yarn add --dev [package]`. (прим. пер. `npm install [package] --save-dev`)
+**Примечание**: Существует два вида зависимостей для подключения пакетов: `"dependencies"` и `"devDependencies"`. `"dependencies"` - более общее понятие, чем `"devDependencies"`, так как последние используються только для разработки, а не выпуска (production) приложения (обычно это пакеты связанные с процессом построения, анализаторы кода и т.п.). Для `"devDependencies"`, будем использовать `yarn add --dev [package]`. (прим. пер. `npm install [package] --save-dev`)
 
 
 Следующий раздел: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
-- 
GitLab


From e260775318b4f0b5f43e8b450dabaf16e003fde7 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 5 Nov 2016 12:41:33 +0000
Subject: [PATCH 19/73] README.md edited online with Bitbucket

---
 tutorial/8-react/README.md | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index 721baf3..36266f9 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -6,7 +6,7 @@
 
 - запустите `yarn add react react-dom`
 
-Эти 2 пакета будут включены в раздел `"dependencies"` а не `"devDependencies"` потому что, в отличие от инструментов разработки, они должны быть в итоговой клиентской сборке (production).
+Эти два пакета будут включены в раздел `"dependencies"`, а не `"devDependencies"`, потому что, в отличие от инструментов разработки, они должны быть в итоговой клиентской сборке (production).
 
 Давайте переименуем файл `src/client/app.js` в `src/client/app.jsx` и напишем там немного кода на React и JSX:
 
@@ -32,7 +32,7 @@ App.propTypes = {
 ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
 ```
 
-**Замечание**: Если вы не знакомы с React или его PropTypes, ознакомьтесь сначала с ним и затем возвращайтесь в это руководство позже. В следующих частях мы будем использовать React, поэтому вам понадобится хорошее понимание его.
+**Примечание**: Если вы не знакомы с React или его PropTypes, ознакомьтесь сначала с ним и затем возвращайтесь в это руководство. В следующих главах мы будем использовать React, поэтому вам понадобится хорошее (его) понимание этой библиотеки.
 
 В Gulp файле, измените в `clientEntryPoint` расширение на `.jsx`:
 
@@ -40,9 +40,9 @@ ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
 clientEntryPoint: 'src/client/app.jsx',
 ```
 
-Поскольку мы используем синтакс JSX, то нам так же нужен Babel для его обработки.
+Поскольку мы используем синтакс JSX, нам так же нужен Babel для его обработки.
 Установите React Babel preset, который научит Babel обрабатывать JSX синтакс:
-`yarn add --dev babel-preset-react` и откорректируйте раздел `babel` в `package.json` таким образом:
+`yarn add --dev babel-preset-react` и откорректируйте раздел `babel` в `package.json` следующим образом:
 
 ```json
 "babel": {
@@ -53,7 +53,7 @@ clientEntryPoint: 'src/client/app.jsx',
 },
 ```
 
-Теперь, после запуска `yarn start`, если мы откроем `index.html`, то должны увидеть "The dog says: Wah wah, I am Browser Toby" сгенерированное React.
+Теперь, после запуска `yarn start`, открыв `index.html`, мы должны увидеть "The dog says: Wah wah, I am Browser Toby" сгенерированное React.
 
 
 
-- 
GitLab


From 11a4999a37e91fcb6696902f270c05bb8f98a6e2 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 5 Nov 2016 12:43:41 +0000
Subject: [PATCH 20/73] README.md edited online with Bitbucket

---
 tutorial/8-react/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index 36266f9..72337f6 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -8,7 +8,7 @@
 
 Эти два пакета будут включены в раздел `"dependencies"`, а не `"devDependencies"`, потому что, в отличие от инструментов разработки, они должны быть в итоговой клиентской сборке (production).
 
-Давайте переименуем файл `src/client/app.js` в `src/client/app.jsx` и напишем там немного кода на React и JSX:
+Давайте переименуем файл `src/client/app.js` в `src/client/app.jsx` и напишем в нем немного кода на React и JSX:
 
 ```javascript
 import 'babel-polyfill';
-- 
GitLab


From 29033ea38cb159cb03596d32791c5781f5d45a21 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 5 Nov 2016 13:24:58 +0000
Subject: [PATCH 21/73] README.md edited online with Bitbucket

---
 tutorial/10-immutable-redux-improvements/README.md | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/tutorial/10-immutable-redux-improvements/README.md b/tutorial/10-immutable-redux-improvements/README.md
index ccf02b3..2bb44b1 100644
--- a/tutorial/10-immutable-redux-improvements/README.md
+++ b/tutorial/10-immutable-redux-improvements/README.md
@@ -4,7 +4,7 @@
 
 В отличие от предыдущей части, эта довольно простая и состоит из незначительных улучшений.
 
-Сначала мы добавим **Immutable JS** в наш проект. Immutable - это библиотека, позволяющая манипулировать объектами не изменяя их. Вместо:
+Сначала мы добавим **Immutable JS** в наш проект. Immutable - это библиотека, позволяющая манипулировать объектами, не изменяя их. Вместо:
 
 ```javascript
 const obj = { a: 1 };
@@ -16,7 +16,7 @@ const obj = Immutable.Map({ a: 1 });
 obj.set('a', 2); // Возвращает новый объект не изменяя `obj`
 ```
 
-Такой подход следует парадигме **функционального программирования**, которая хорошо подходит для работы с Redux. Ваши reducer-функции вообщето **должны** быть чистыми и не изменять состояние хранилища, переданное в качестве параметра, а возвращать вместо этого абсолютно новое. Давайте воспользуемся Immutable чтобы достичь этого.
+Такой подход соответствует парадигме **функционального программирования**, которая хорошо подходит для работы с Redux. Ваши reducer-функции вообщето **должны** быть чистыми и не изменять состояние хранилища (переданного в качестве параметра), а вместо этого возвращать абсолютно новое. Давайте воспользуемся Immutable чтобы достичь этого.
 
 - Запустите `yarn add immutable`
 
@@ -63,7 +63,7 @@ export default dogReducer;
 
 Теперь мы создаем исходное состояние, используя Immutable Map, а новое состояние получаем применяя `set()`, что исключает любые мутации предыдущего состояния.
 
-В `containers/bark-message.js`, обновите функцию `mapStateToProps` чтобы она использовала `.get('hasBarked')` вместо `.hasBarked`:
+В `containers/bark-message.js`, обновите функцию `mapStateToProps`, чтобы она использовала `.get('hasBarked')` вместо `.hasBarked`:
 
 ```javascript
 const mapStateToProps = state => ({
@@ -71,11 +71,11 @@ const mapStateToProps = state => ({
 });
 ```
 
-Приложение должно себя вести точно так же как и до этого.
+Приложение должно вести себя точно так же, как и до этого.
 
-**Замечание**: Если Babel жалуется на то, что Immutable превышает 100KB, добавьте `"compact": false` в `package.json` после `babel`.
+**Примечание**: Если Babel жалуется на то, что Immutable превышает 100KB, добавьте `"compact": false` в `package.json` после `babel`.
 
-Как вы можете видеть из предыдущего фрагмента кода, сам объект state все еще содержит старый атрибут `dog`, являющийся простым объектом и подверженный мутациям. В нашем случае это нормально, но если вы хотите манипулировать только немутируемыми объектами, можете установить пакет `redux-immutable` чтобы заменить функцию `combineReducers` у Redux.
+Как вы можете видеть из предыдущего фрагмента кода, сам объект state все еще содержит старый атрибут `dog`, являющийся простым объектом и подверженный мутациям. В нашем случае это нормально, но если вы хотите манипулировать только немутируемыми объектами, можете установить пакет `redux-immutable`, чтобы заменить функцию `combineReducers` у Redux.
 
 **Не обязательно**:
 - Запустите `yarn add redux-immutable`
@@ -93,7 +93,7 @@ export const MAKE_BARK = 'MAKE_BARK';
 export const makeBark = createAction(MAKE_BARK, () => true);
 ```
 
-`redux-actions` внедряет модель [Flux Standard Action](https://github.com/acdlite/flux-standard-action), прям так же как, действия, которые мы писали до этого, так что интеграция `redux-actions` будет бесшовной если вы придерживаетесь этой модели.
+`redux-actions` основывается на молели [Flux Standard Action](https://github.com/acdlite/flux-standard-action),так же, как и действия, которые мы создавали до этого, так что интеграция `redux-actions` будет бесшовной, если вы придерживаетесь этой модели.
 
 - Не забудьте запустить `yarn add redux-actions`.
 
-- 
GitLab


From be4df6f88144243e755bcba50cded2246ea4e098 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 5 Nov 2016 13:58:21 +0000
Subject: [PATCH 22/73] README.md edited online with Bitbucket

---
 tutorial/12-flow/README.md | 34 +++++++++++++++++-----------------
 1 file changed, 17 insertions(+), 17 deletions(-)

diff --git a/tutorial/12-flow/README.md b/tutorial/12-flow/README.md
index fa82086..cfcf5c1 100644
--- a/tutorial/12-flow/README.md
+++ b/tutorial/12-flow/README.md
@@ -2,11 +2,11 @@
 
 [Flow](https://flowtype.org/) - статический типизатор (static type checker). Он определяет несоответствие типов в вашем коде и позволяет напрямую декларировать типы через аннотации. 
 
-- Для того, чтобы Babel мог понимать и убирать аннотации Flow в процессе транспиляции, установите плагин Flow для Babel выполнив `yarn add --dev babel-preset-flow`. Затем добавье `"flow"` после `babel.presets` в `package.json`.
+- Для того, чтобы Babel мог понимать и убирать аннотации Flow в процессе транспиляции, установите плагин Flow для Babel, выполнив `yarn add --dev babel-preset-flow`. Затем добавье `"flow"` после `babel.presets` в `package.json`.
 
 - Создайте пустой файл `.flowconfig` в корне проекта.
 
-- Запустите `yarn add --dev gulp-flowtype` чтобы установить Gulp плагин для Flow, и добавьте `flow()` в задачу `lint`:
+- Запустите `yarn add --dev gulp-flowtype`, чтобы установить Gulp плагин для Flow, и добавьте `flow()` в задачу `lint`:
 
 ```javascript
 import flow from 'gulp-flowtype';
@@ -26,7 +26,7 @@ gulp.task('lint', () =>
 );
 ```
 
-Опция `abort` прерывает задачу Gulp если Flow обнаруживает проблему.
+Опция `abort` прерывает задачу Gulp, если Flow обнаруживает проблему.
 
 Отлично, теперь мы можем запустить Flow.
 
@@ -57,10 +57,10 @@ class Dog {
 export default Dog;
 ```
 
-Комментарий `// @flow` говорит Flow что мы хотим проверять типы для этого файла. В остальном, аннотации Flow - это обычно двоеточие после параметра фукции или имени функции. Подробности посмотрите в документации.
+Комментарий `// @flow` говорит Flow, что мы хотим проверять типы для этого файла. Сами анатации Flow предваряються двоеточием и обычно добавляються после параметра функции или имени функции. Подробности смотрите в документации.
 
 Теперь, если вы запустите `yarn start`, Flow будет работать, но ESLint начнет жаловаться, что используется нестандартный синтаксис. 
-Поскольку парсер Babel отлично справляется с парсингом Flow контента (благодаря установленному нами плагину `babel-preset-flow`), было бы здорово, если бы ESLint мог опираться на парсер Babel, вместо того, чтобы пытаться самому понять аннотации Flow. Вообще, это возможно при использовании пакета `babel-eslint`. Давайте сделаем это.
+Поскольку парсер Babel отлично справляется с парсингом Flow контента (благодаря установленному нами плагину `babel-preset-flow`), было бы здорово, если бы ESLint мог опираться на парсер Babel, вместо того, чтобы пытаться самому понять аннотации Flow. Это возможно при использовании пакета `babel-eslint`. Давайте сделаем это.
 
 - Запустите `yarn add --dev babel-eslint`
 
@@ -68,25 +68,25 @@ export default Dog;
 
 Теперь `yarn start` должен одновременно анализировать код с помощью ESLint и проверять типы посредством Flow.
 
-Теперь, поскольку ESLint и Babel совместно использовать общий парсер, мы можем заставить ESLint проверять наши Flow аннотации, используя плагин `eslint-plugin-flowtype`.
+Далее, поскольку ESLint и Babel совместно используют общий парсер, мы можем заставить ESLint проверять наши Flow аннотации, используя плагин `eslint-plugin-flowtype`.
 
-- Запустите `yarn add --dev eslint-plugin-flowtype` и добавьте `"flowtype"` после `eslintConfig.plugins` в `package.json`, и добавьте `"plugin:flowtype/recommended"` после `eslintConfig.extends` в массив после `"airbnb"`.
+- Запустите `yarn add --dev eslint-plugin-flowtype` и добавьте `"flowtype"` после `eslintConfig.plugins` в `package.json`. Затем добавьте `"plugin:flowtype/recommended"` после `eslintConfig.extends` в массив после `"airbnb"`.
 
-Теперь если вы, например, введете `name:string` в качестве аннотации, ESLint должен пожаловаться, что вы забыли пробел после двоеточия. 
+Теперь, если вы, например, введете `name:string` в качестве аннотации, ESLint должен пожаловаться, что вы забыли пробел после двоеточия. 
 
-**Замечание**: Свойство `"parser": "babel-eslint"` которое я заставил вас написать в `package.json` вообще-то входит в конфигурацию `"plugin:flowtype/recommended"`, так что теперь можете убрать его, чтобы сократить `package.json`. С другой стороны, оставить его здесь будет более наглядным, так что это на ваше предпочтение. Поскольку это руководство нацелено на максимальную краткость, я уберу.
+**Примечание**: Свойство `"parser": "babel-eslint"`, которое я заставил вас написать в `package.json`, вообще-то входит в конфигурацию `"plugin:flowtype/recommended"`, так что теперь можете убрать его, чтобы сократить `package.json`. С другой стороны, оставить его здесь будет более наглядным, так что это на ваше усмотрение. Поскольку это руководство нацелено на максимальную краткость, я его уберу.
 
-- Вы можете теперь добавить `// @flow` в каждый `.js` и `.jsx` файл в папке `src`, запустить `yarn test` или `yarn start`, и добавлять аннотации везде где этого попросит Flow.
+- Теперь вы можете добавить `// @flow` в каждый `.js` и `.jsx` файл в папке `src`, запустить `yarn test` или `yarn start`, и добавлять аннотации везде, где этого попросит Flow.
 
-Вы можете обнаружить неожиданный случай в `src/client/component/message.jsx`:
+Вы можете обнаружить неожиданный случай (результат) в `src/client/component/message.jsx`: (предлажение кривое надо заменить - неожиданную проблему?)
 
 ```javascript
 const Message = ({ message }: { message: string }) => <div>{message}</div>;
 ```
 
-Как можете видеть, при деструктурировании параметра функции, вы должны делать аннотации для выделяемых свойств в виде объекта в литеральной нотации.
+Как вы видите, при деструктурировании параметра функции, необходимо делать аннотации для выделяемых свойств в виде объекта в литеральной нотации.
 
-Другим случаем, с которым вы столкнетесь, будет в `src/client/reducers/dog-reducer.js`. Flow начнет жаловаться, что Immutable не имеет возвращаемого значения по умолчанию. Эта проблема описана тут: [#863 on Immutable](https://github.com/facebook/immutable-js/issues/863), и имеет два обходных путя:
+Другой случай, с которым вы столкнетесь, будет в `src/client/reducers/dog-reducer.js`. Flow начнет жаловаться, что Immutable не имеет возвращаемого значения по умолчанию. Эта проблема описана тут: [#863 on Immutable](https://github.com/facebook/immutable-js/issues/863), и имеет два обходных пути:
 
 ```javascript
 import { Map as ImmutableMap } from 'immutable';
@@ -94,16 +94,16 @@ import { Map as ImmutableMap } from 'immutable';
 import * as Immutable from 'immutable';
 ```
 
-Пока Immutable официально не разрешит проблему, просто выберите то, что вам больше нравится, когда импортируете компоненты Immutable. Лично я, буду использовать `import * as Immutable from 'immutable'`, поскольку это короче и не потребует рефакторинга кода после того, как проблема будет решена.
+Пока Immutable официально не решит проблему, просто выберите то, что вам больше нравится, когда импортируете компоненты Immutable. Лично я, буду использовать `import * as Immutable from 'immutable'`, поскольку это короче и не потребует рефакторинга кода, после того, как проблема будет решена.
 
-**Замечание**: Если Flow определяет ошибки типизации в папке `node_modules`, добавьте раздел `[ignore]` в файл `.flowconfig` чтобы указать какие именно пакеты игнорировать (не игнорируйте полностью директорию `node_modules`). Это может выглядеть так:
+**Примечание**: Если Flow выявляет ошибки типизации в папке `node_modules`, добавьте раздел `[ignore]` в файл `.flowconfig`, чтобы указать какие именно пакеты игнорировать (не игнорируйте полностью директорию `node_modules`). Это может выглядеть так:
 ```
 [ignore]
 
 .*/node_modules/gulp-flowtype/.*
 ```
-В моем случе плагин `linter-flow` для Atom обнаружил ошибки типизации в директории `node_modules/gulp-flowtype`, которая содержит файлы аннотированные `// @flow`.
+В моем случе, плагин `linter-flow` для Atom обнаружил ошибки типизации в директории `node_modules/gulp-flowtype`, которая содержит файлы аннотированные `// @flow`.
 
-Теперь у вас есть "пуленепробиваемый" код, который проанализирован, протипизирован и протестирован - отличная работа!
+Теперь, у вас есть "пуленепробиваемый" код, который проанализирован, протипизирован и протестирован - отличная работа!
 
 Назад в [предыдущий раздел](/tutorial/11-testing-mocha-chai-sinon) или [Содержание](/README.md).
-- 
GitLab


From 856aae14547c8ae7b20f5824ff04df22515968b8 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Sun, 6 Nov 2016 11:24:31 +0700
Subject: [PATCH 23/73] it's not a final ver

---
 README.md                                       | 2 +-
 tutorial/1-node-npm-yarn-package-json/README.md | 2 +-
 tutorial/2-packages/README.md                   | 1 -
 3 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index c104206..0ddfb91 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@
 
 Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить более глубокие знания по ним, изучайте их документацию или другие руководства.
 
-В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду использующую React и наверстать свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
+В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомится с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду использующую React и наверстать свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
 
 Примеры кода имеются в каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждого раздела.
 
diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index 65b8cf1..da7272c 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -1,6 +1,6 @@
 # 1 - Node, NPM, Yarn, and package.json
 
-В этой главе мы настроим Node, NPM, Yarn, и простой `package.json`.
+В этой части мы настроим Node, NPM, Yarn, и простой `package.json`.
 
 Прежде всего, нам нужно установить Node, который необходим не только для серверной части (back-end), но и для всех тех инструментов, которые входят в состав современных технологий для создания клиентской части (Front-End).
 
diff --git a/tutorial/2-packages/README.md b/tutorial/2-packages/README.md
index 4bb4e2a..02064f5 100644
--- a/tutorial/2-packages/README.md
+++ b/tutorial/2-packages/README.md
@@ -19,7 +19,6 @@
 
 Поздравляю! Вы установили и применили пакет!
 
-`color` is just used in this section to teach you how to use a simple package. - это надо оставить?
 `color` здесь просто пример, чтобы научить вас использовать пакеты. Больше он нам не нужен, можно его удалить:
 
 - Выполните `yarn remove color`
-- 
GitLab


From 2ff7e80dbed7e372858770da870231275eff78fa Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Mon, 7 Nov 2016 13:57:38 +0700
Subject: [PATCH 24/73] section 3

---
 Definitions.md                         |  8 ++-
 README.md                              |  2 +-
 tutorial/2-packages/README.md          |  2 +-
 tutorial/3-es6-babel-gulp/README.md    | 54 ++++++++-------
 tutorial/3-es6-babel-gulp/READMEeng.md | 93 ++++++++++++++++++++++++++
 5 files changed, 129 insertions(+), 30 deletions(-)
 create mode 100644 tutorial/3-es6-babel-gulp/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index dfe9584..70f3c67 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -19,9 +19,13 @@ https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Functions/Arrow_f
 
 CommonJS
 
-Gulp
+Gulp - сборщик проектов
+https://habrahabr.ru/post/208890/
 
-Node
+Task Runner - менеджер задач.
+(диспетчер запуска задач)
+
+Node - сервер Node
 
 Babel
 
diff --git a/README.md b/README.md
index 0ddfb91..0785f32 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,7 @@
 
 [3 - Настройка ES6 с Babel и Gulp](/tutorial/3-es6-babel-gulp)
 
-[4 - Использование ES6 синтактиса ~~и классов~~](/tutorial/4-es6-syntax-class)
+[4 - Использование ES6 классов](/tutorial/4-es6-syntax-class)
 
 [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
 
diff --git a/tutorial/2-packages/README.md b/tutorial/2-packages/README.md
index 02064f5..83ef30e 100644
--- a/tutorial/2-packages/README.md
+++ b/tutorial/2-packages/README.md
@@ -28,4 +28,4 @@
 
 Следующий раздел: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
 
-Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/README.md).
+Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/../../).
diff --git a/tutorial/3-es6-babel-gulp/README.md b/tutorial/3-es6-babel-gulp/README.md
index 64543c1..7e9e6aa 100644
--- a/tutorial/3-es6-babel-gulp/README.md
+++ b/tutorial/3-es6-babel-gulp/README.md
@@ -1,11 +1,11 @@
-# 3 - Setting up ES6 with Babel and Gulp
+# 3 - Настройка ES6 с Babel и Gulp]
 
-We're now going to use ES6 syntax, which is a great improvement over the "old" ES5 syntax. All browsers and JS environments understand ES5 well, but not ES6. So we're going to use a tool called Babel to transform ES6 files into ES5 files. To run Babel, we are going to use Gulp, a task runner. It is similar to the tasks located under `scripts` in `package.json`, but writing your task in a JS file is simpler and clearer than a JSON file, so we'll install Gulp, and the Babel plugin for Gulp too:
+Мы начинаем использовать синтаксис ES6, представляющий значительное продвижение относительно "старого" ES5. Все браузеры и JS окружения хорошо понимают ES5, но не ES6. Поэтому мы будем использовать инструмент, называемый Babel, чтобы преобразовать файлы ES6 в ES5 формат. Чтобы запускать Babel, мы будем использовать Gulp - менеджер задач. Это похоже на создание задач, расположенных в `scripts` файла `package.json`, но написание задач в JS файле проще и понятнее чем в JSON, поэтому установим Gulp и плагин Babel для него.
 
-- Run `yarn add --dev gulp`
-- Run `yarn add --dev gulp-babel`
-- Run `yarn add --dev babel-preset-latest`
-- In `package.json`, add a `babel` field for the babel configuration. Make it use the latest Babel preset like this:
+- Запустите `yarn add --dev gulp`
+- Запустите `yarn add --dev gulp-babel`
+- Запустите `yarn add --dev babel-preset-latest`
+- В `package.json`, добавьте поле `babel` для конфигурации Babel. Укажем следующим образом, что хотим использовать новейшую конфигурацию Babel:
 
 ```json
 "babel": {
@@ -15,18 +15,18 @@ We're now going to use ES6 syntax, which is a great improvement over the "old" E
 },
 ```
 
-**Note**: A `.babelrc` file at the root of your project could also be used instead of the `babel` field of `package.json`. Your root folder will get more and more bloated over time, so keep the Babel config in `package.json` until it grows too large.
+**Примечание**: Файл `.babelrc` в корне проекта так же может быть использован вместо свойства `babel` в `package.json`. Но поскольку корневая директория вашего проекта будет все больше и больше раздуваться с течением времени, лучше храните конфигурацию Babel в `package.json`, до тех пор, пока она не станет слишком большой.
 
-- Move your `index.js` into a new `src` folder. This is where you will write your ES6 code. A `lib` folder is where the compiled ES5 code will go. Gulp and Babel will take care of creating it. Remove the previous `color`-related code in `index.js`, and replace it with a simple:
+- Переместите файл `index.js` в директорию `src`. Там вы будете писать ES6 код. А папка `lib` будет местом, куда ваш код будет компилироваться в ES5. Gulp и Babel позаботятся о ее создании. Уберите предыдущий, относящийся к `color`, код из `index.js`, и замените его на нечто простое, например такое:
 
 ```javascript
 const str = 'ES6';
 console.log(`Hello ${str}`);
 ```
 
-We're using a *template string* here, which is an ES6 feature that lets us inject variables directly inside the string without concatenation using `${}`. Note that template strings are created using **backquotes**.
+Мы здесь использовали *шаблонную строку* - возможость ES6 внедрять с помощью `${}` переменные прямо в строки без использования конкантенации. Обратите внимание, что шаблонные строки пишутся в **\`обратных кавычках\`**
 
-- Create a `gulpfile.js` containing:
+- Создайте `gulpfile.js`, содержащий:
 
 ```javascript
 const gulp = require('gulp');
@@ -64,30 +64,32 @@ gulp.task('default', ['watch', 'main']);
 
 ```
 
-Let's take a moment to understand all this.
+Давайте приостановимся и разберемся с этим.
 
-The API of Gulp itself is pretty straightforward. It defines `gulp.task`s, that can reference `gulp.src` files, applies a chain of treatments to them with `.pipe()` (like `babel()` in our case) and outputs the new files to `gulp.dest`. It can also `gulp.watch` for changes on your filesystem. Gulp tasks can run prerequisite tasks before them, by passing an array (like `['build']`) as a second parameter to `gulp.task`. Refer to the [documentation](https://github.com/gulpjs/gulp) for a more thorough presentation.
+Gulp сам по себе имеет довольно понятный API. Он определяет задачи `gulp.task`, которые могут брать файы из `gulp.src`, применять к ним цепочки обработчиков - `.pipe()` (как `babel()` в нашем случае), и сохранять новые файлы в `gulp.dest`. Так же от может отслеживать (`gulp.watch`) изменения в файловой системе. Одни задачи Gulp могут предварять запуск других, если указать их в массиве (как `['build']`) в качестве второго аргумента в `gulp.task`. В [документации](https://github.com/gulpjs/gulp) все изложено более основательно.
 
-First we define a `paths` object to store all our different file paths and keep things DRY.
+Сначала мы определили объект `paths`, что бы хранить в одном месте все нужные пути и использовать принцип "не повторяйся" (DRY).
 
-Then we define 5 tasks: `build`, `clean`, `main`, `watch`, and `default`.
+Затем мы определили пять задач: `build` *(создать)*, `clean` *(очистить)*, `main` *(основная)*, `watch` *(наблюдать)*, and `default` *(по умолчанию)*.
 
-- `build` is where Babel is called to transform all of our source files located under `src` and write the transformed ones to `lib`.
-- `clean` is a task that simply deletes our entire auto-generated `lib` folder before every `build`. This is typically useful to get rid of old compiled files after renaming or deleting some in `src`, or to make sure the `lib` folder is in sync with the `src` folder if your build fails and you don't notice. We use the `del` package to delete files in a way that integrates well with Gulp's stream (this is the [recommended](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) way to delete files with Gulp). Run `yarn add --dev del` to install that package.
-- `main` is the equivalent of running `node .` in the previous chapter, except this time, we want to run it on `lib/index.js`. Since `index.js` is the default file Node looks for, we can simply write `node lib` (we use the `libDir` variable to keep things DRY). The `require('child_process').exec` and `exec` part in the task is a native Node function that executes a shell command. We forward `stdout` to `console.log()` and return a potential error using `gulp.task`'s callback function. Don't worry if this part is not super clear to you, remember that this task is basically just running `node lib`.
-- `watch` runs the `main` task when filesystem changes happen in the specified files.
-- `default` is a special task that will be run if you simply call `gulp` from the CLI. In our case we want it to run both `watch` and `main` (for the first execution).
+- `build` вызывает Babel, чтобы преобразовать все исходные файлы из `src`, и записывает результат в `lib`.
+- We use the `del` package to delete files in a way that integrates well with Gulp's stream (this is the [recommended](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) way to delete files with Gulp). Run `yarn add --dev del` to install that package.
 
-**Note**: You might be wondering how come we're using some ES6 code in this Gulp file, since it doesn't get transpiled into ES5 by Babel. This is because we're using a version of Node that supports ES6 features out of the box (make sure you are running Node > 6.5.0 by running `node -v`).
+- `clean` - задача, которая просто удаляет всю нашу автоматически сгенерированную директорию `lib` перед каждым `build`. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то в `src`) или для того, чтобы быть уверенным, что директория `lib` всегда синхронна с `src`, даже если `build` не завершился успешно, а вы этого не заметили. Мы используем пакет `del` чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это [рекомендованый](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) для Gulp способ)
+- `main` - аналогично запуску `node .` из предыдущией части, за исключением, что теперь мы используем `lib/index.js`. Мы можем просто писать `node lib`, потому что по умолчанию Node найдет и запустит `index.js` из указанной папки (мы используем переменную `libDir` чтоб соответствовать принципу DRY). `require('child_process').exec` и `exec` - это функции самого Node, вызывающие консольные команды. Мы перенаправим `stdout` в `console.log()` и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается в `gulp.task` в качестве аргумента. Не переживайте если эта команда не совсем ясна для вас, помните, что эта задача просто лишь запускает `node lib`.
+- `watch` запускает задчу `main`, когда происходят изменения файловой системы для указанных файлов.
+- `default` - это специальная задача, которая запускается, если вы просто вызываете `gulp` из CLI (коммандной строки). В нашем случае мы хотим сначала запустить `main` (один раз), а затем `watch`.
 
-Alright! Let's see if this works.
+**Примечание**: Возможно вы удивитесь, что мы используем синтаксис ES6 в этом Gulp файле, хотя он не транспилируется в ES5 со помощью Babel. Это потому, что мы используем версию Node, которая поддерживает возможности ES6 из коробки (убедитесь, Что вы используете версию Node > 6.5.0, запустив `node -v`).
 
-- In `package.json`, change your `start` script to: `"start": "gulp"`.
-- Run `yarn start`. It should print "Hello ES6" and start watching for changes. Try writing bad code in `src/index.js` to see Gulp automatically showing you the error when you save.
+Отлично! Посмотрим как это работает.
 
-- Add `/lib/` to your `.gitignore`
+- В `package.json`, замените скрипт `start` на: `"start": "gulp"`.
+- Запустите `yarn start`. Должно вывестись "Hello ES6" и запустится автоматическое отслеживание изменений. Попробуйте ввести неверный код в `src/index.js` и увидите после сохранения, как  Gulp автоматически указывает на ошибку.
 
+- Добавьте `/lib/` в `.gitignore`
 
-Next section: [4 - Using the ES6 syntax with a class](/tutorial/4-es6-syntax-class)
 
-Back to the [previous section](/tutorial/2-packages) or the [table of contents](/README.md).
+Следующий раздел: [4 - Использование ES6 классов](/tutorial/4-es6-syntax-class)
+
+Назад в [предыдущий раздел](/tutorial/2-packages)или [Содержание](/../../)..
diff --git a/tutorial/3-es6-babel-gulp/READMEeng.md b/tutorial/3-es6-babel-gulp/READMEeng.md
new file mode 100644
index 0000000..64543c1
--- /dev/null
+++ b/tutorial/3-es6-babel-gulp/READMEeng.md
@@ -0,0 +1,93 @@
+# 3 - Setting up ES6 with Babel and Gulp
+
+We're now going to use ES6 syntax, which is a great improvement over the "old" ES5 syntax. All browsers and JS environments understand ES5 well, but not ES6. So we're going to use a tool called Babel to transform ES6 files into ES5 files. To run Babel, we are going to use Gulp, a task runner. It is similar to the tasks located under `scripts` in `package.json`, but writing your task in a JS file is simpler and clearer than a JSON file, so we'll install Gulp, and the Babel plugin for Gulp too:
+
+- Run `yarn add --dev gulp`
+- Run `yarn add --dev gulp-babel`
+- Run `yarn add --dev babel-preset-latest`
+- In `package.json`, add a `babel` field for the babel configuration. Make it use the latest Babel preset like this:
+
+```json
+"babel": {
+  "presets": [
+    "latest"
+  ]
+},
+```
+
+**Note**: A `.babelrc` file at the root of your project could also be used instead of the `babel` field of `package.json`. Your root folder will get more and more bloated over time, so keep the Babel config in `package.json` until it grows too large.
+
+- Move your `index.js` into a new `src` folder. This is where you will write your ES6 code. A `lib` folder is where the compiled ES5 code will go. Gulp and Babel will take care of creating it. Remove the previous `color`-related code in `index.js`, and replace it with a simple:
+
+```javascript
+const str = 'ES6';
+console.log(`Hello ${str}`);
+```
+
+We're using a *template string* here, which is an ES6 feature that lets us inject variables directly inside the string without concatenation using `${}`. Note that template strings are created using **backquotes**.
+
+- Create a `gulpfile.js` containing:
+
+```javascript
+const gulp = require('gulp');
+const babel = require('gulp-babel');
+const del = require('del');
+const exec = require('child_process').exec;
+
+const paths = {
+  allSrcJs: 'src/**/*.js',
+  libDir: 'lib',
+};
+
+gulp.task('clean', () => {
+  return del(paths.libDir);
+});
+
+gulp.task('build', ['clean'], () => {
+  return gulp.src(paths.allSrcJs)
+    .pipe(babel())
+    .pipe(gulp.dest(paths.libDir));
+});
+
+gulp.task('main', ['build'], (callback) => {
+  exec(`node ${paths.libDir}`, (error, stdout) => {
+    console.log(stdout);
+    return callback(error);
+  });
+});
+
+gulp.task('watch', () => {
+  gulp.watch(paths.allSrcJs, ['main']);
+});
+
+gulp.task('default', ['watch', 'main']);
+
+```
+
+Let's take a moment to understand all this.
+
+The API of Gulp itself is pretty straightforward. It defines `gulp.task`s, that can reference `gulp.src` files, applies a chain of treatments to them with `.pipe()` (like `babel()` in our case) and outputs the new files to `gulp.dest`. It can also `gulp.watch` for changes on your filesystem. Gulp tasks can run prerequisite tasks before them, by passing an array (like `['build']`) as a second parameter to `gulp.task`. Refer to the [documentation](https://github.com/gulpjs/gulp) for a more thorough presentation.
+
+First we define a `paths` object to store all our different file paths and keep things DRY.
+
+Then we define 5 tasks: `build`, `clean`, `main`, `watch`, and `default`.
+
+- `build` is where Babel is called to transform all of our source files located under `src` and write the transformed ones to `lib`.
+- `clean` is a task that simply deletes our entire auto-generated `lib` folder before every `build`. This is typically useful to get rid of old compiled files after renaming or deleting some in `src`, or to make sure the `lib` folder is in sync with the `src` folder if your build fails and you don't notice. We use the `del` package to delete files in a way that integrates well with Gulp's stream (this is the [recommended](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) way to delete files with Gulp). Run `yarn add --dev del` to install that package.
+- `main` is the equivalent of running `node .` in the previous chapter, except this time, we want to run it on `lib/index.js`. Since `index.js` is the default file Node looks for, we can simply write `node lib` (we use the `libDir` variable to keep things DRY). The `require('child_process').exec` and `exec` part in the task is a native Node function that executes a shell command. We forward `stdout` to `console.log()` and return a potential error using `gulp.task`'s callback function. Don't worry if this part is not super clear to you, remember that this task is basically just running `node lib`.
+- `watch` runs the `main` task when filesystem changes happen in the specified files.
+- `default` is a special task that will be run if you simply call `gulp` from the CLI. In our case we want it to run both `watch` and `main` (for the first execution).
+
+**Note**: You might be wondering how come we're using some ES6 code in this Gulp file, since it doesn't get transpiled into ES5 by Babel. This is because we're using a version of Node that supports ES6 features out of the box (make sure you are running Node > 6.5.0 by running `node -v`).
+
+Alright! Let's see if this works.
+
+- In `package.json`, change your `start` script to: `"start": "gulp"`.
+- Run `yarn start`. It should print "Hello ES6" and start watching for changes. Try writing bad code in `src/index.js` to see Gulp automatically showing you the error when you save.
+
+- Add `/lib/` to your `.gitignore`
+
+
+Next section: [4 - Using the ES6 syntax with a class](/tutorial/4-es6-syntax-class)
+
+Back to the [previous section](/tutorial/2-packages) or the [table of contents](/README.md).
-- 
GitLab


From e257bbb2b7ea2ace473ce34f7f117fbfd9ad141c Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Mon, 7 Nov 2016 08:13:20 +0000
Subject: [PATCH 25/73] README.md edited online with Bitbucket

---
 README.md | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/README.md b/README.md
index 0785f32..405e4c1 100644
--- a/README.md
+++ b/README.md
@@ -24,19 +24,19 @@
 
 Добро пожаловать в мое современное руководство по стеку технологий JavaScript: **Стек технологий JavaScript с нуля**
 
-Это минималистичное и практико-ориентированное пособие по применению JavaScript технологий. Вам потребуются общие знания по программированию и основы JavaScript. Это пособие **нацелено на интеграцию необходимых инструментов** и предоставляет **максимально простые примеры** для каждого инструмента. Вы можете рассматривать данный документ как *возможность создать свой собственный шаблонный проект с нуля*.
+Это минималистичное и практико-ориентированное пособие по применению JavaScript технологий. Вам потребуются общие знания по программированию и основы JavaScript. Это пособие **нацелено на интеграцию необходимых инструментов** и предоставляет **максимально простые примеры** для каждого инструмента. Вы можете рассматривать данный документ, как *возможность создать свой собственный шаблонный проект с нуля*.
 
-Вам, конечно, не нужны все эти технологии если вы делаете простую веб страницу с парой JS функций (достаточно комбинаци Babel + jQuery), но если вы собираетесь создать масштабируемое веб приложение, и вам нужно все правильно настроить, то это руководство отлично вам подходит.
+Конечно, вам не нужны все эти технологии, если вы делаете простую веб страницу с парой JS функций (достаточно комбинаци Babel + jQuery), но если вы собираетесь создать масштабируемое веб приложение, и вам нужно все правильно настроить, то это руководство отлично вам подходит.
 
 Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить более глубокие знания по ним, изучайте их документацию или другие руководства.
 
-В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомится с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду использующую React и наверстать свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
+В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду, использующую React и на чем-то потренироваться, что бы подтянуть свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
 
 Примеры кода имеются в каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждого раздела.
 
-**Каждая часть содержит код, написанный в предыдущих частях**, так что если вы просто хотите получить окончательный вариант проекта, содержащий все, просто скопируйте последний раздел и пользуйтесь на здоровье.
+**Каждая часть содержит код, написанный в предыдущих частях**, так что, если вы просто хотите получить окончательный вариант проекта, содержащий все необходимое, просто скопируйте последний раздел и пользуйтесь на здоровье.
 
-Замечание: Порядок частей не всегда обязателен. К примеру, тестирование / типизация могут быть выполнены до введения в React. Довольно сложно перемещать или редактировать опубликованные разделы, поскольку приходится вносить изменения во все следующие за ними части. Возможно, когда все определится, я приведу всю документацию к более удобному виду.
+Примечание: Порядок частей не всегда обязателен. К примеру, тестирование / типизация могут быть выполнены до введения в React. Довольно сложно перемещать или редактировать опубликованные разделы, поскольку приходится вносить изменения во все следующие за ними части. Возможно, когда все определится, я приведу всю документацию к более удобному виду.
 
 Код, приведенный в примерах, работает под Linux, macOS, и Windows.
 
-- 
GitLab


From 63a5455b9f4d5b3df47d3e310c46f780b28caadd Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Mon, 7 Nov 2016 20:19:15 +0700
Subject: [PATCH 26/73] section 9

---
 Definitions.md                      |   2 +
 tutorial/3-es6-babel-gulp/README.md |   4 +-
 tutorial/8-react/README.md          |   2 +-
 tutorial/9-redux/README.md          |  58 +++++-----
 tutorial/9-redux/READMEeng.md       | 164 ++++++++++++++++++++++++++++
 5 files changed, 200 insertions(+), 30 deletions(-)
 create mode 100644 tutorial/9-redux/READMEeng.md

diff --git a/Definitions.md b/Definitions.md
index 70f3c67..2995be0 100644
--- a/Definitions.md
+++ b/Definitions.md
@@ -27,6 +27,8 @@ Task Runner - менеджер задач.
 
 Node - сервер Node
 
+plain JavaScript object - простой JavaScript объект
+
 Babel
 
 синтаксический сахар - syntactic sugar
diff --git a/tutorial/3-es6-babel-gulp/README.md b/tutorial/3-es6-babel-gulp/README.md
index 7e9e6aa..603685b 100644
--- a/tutorial/3-es6-babel-gulp/README.md
+++ b/tutorial/3-es6-babel-gulp/README.md
@@ -1,4 +1,4 @@
-# 3 - Настройка ES6 с Babel и Gulp]
+# 3 - Настройка ES6 с Babel и Gulp
 
 Мы начинаем использовать синтаксис ES6, представляющий значительное продвижение относительно "старого" ES5. Все браузеры и JS окружения хорошо понимают ES5, но не ES6. Поэтому мы будем использовать инструмент, называемый Babel, чтобы преобразовать файлы ES6 в ES5 формат. Чтобы запускать Babel, мы будем использовать Gulp - менеджер задач. Это похоже на создание задач, расположенных в `scripts` файла `package.json`, но написание задач в JS файле проще и понятнее чем в JSON, поэтому установим Gulp и плагин Babel для него.
 
@@ -73,8 +73,6 @@ Gulp сам по себе имеет довольно понятный API. Он
 Затем мы определили пять задач: `build` *(создать)*, `clean` *(очистить)*, `main` *(основная)*, `watch` *(наблюдать)*, and `default` *(по умолчанию)*.
 
 - `build` вызывает Babel, чтобы преобразовать все исходные файлы из `src`, и записывает результат в `lib`.
-- We use the `del` package to delete files in a way that integrates well with Gulp's stream (this is the [recommended](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) way to delete files with Gulp). Run `yarn add --dev del` to install that package.
-
 - `clean` - задача, которая просто удаляет всю нашу автоматически сгенерированную директорию `lib` перед каждым `build`. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то в `src`) или для того, чтобы быть уверенным, что директория `lib` всегда синхронна с `src`, даже если `build` не завершился успешно, а вы этого не заметили. Мы используем пакет `del` чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это [рекомендованый](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) для Gulp способ)
 - `main` - аналогично запуску `node .` из предыдущией части, за исключением, что теперь мы используем `lib/index.js`. Мы можем просто писать `node lib`, потому что по умолчанию Node найдет и запустит `index.js` из указанной папки (мы используем переменную `libDir` чтоб соответствовать принципу DRY). `require('child_process').exec` и `exec` - это функции самого Node, вызывающие консольные команды. Мы перенаправим `stdout` в `console.log()` и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается в `gulp.task` в качестве аргумента. Не переживайте если эта команда не совсем ясна для вас, помните, что эта задача просто лишь запускает `node lib`.
 - `watch` запускает задчу `main`, когда происходят изменения файловой системы для указанных файлов.
diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index 72337f6..d2db020 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -59,4 +59,4 @@ clientEntryPoint: 'src/client/app.jsx',
 
 Следующий раздел: [9 - Redux](/tutorial/9-redux)
 
-Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/README.md).
+Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index 20bfe89..7e2c73c 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -1,16 +1,22 @@
 # 9 - Redux
 
-In this chapter (which is the most difficult so far) we will be adding [Redux](http://redux.js.org/) to our application and will hook it up with React. Redux manages the state of your application. It is composed of a **store** which is a plain JavaScript object representing the state of your app, **actions** which are typically triggered by users, and **reducers** which can be seen as action handlers. Reducers affect your application state (the *store*), and when the application state is modified, things happen in your app. A good visual demonstration of Redux can be found [here](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
+В этой части (которая наиболее сложная из пройденных), мы добавим в наше приложение [Redux](http://redux.js.org/) ([документация на Русском](https://www.gitbook.com/book/rajdee/redux-in-russian/details)) и подключим его к React. Redux управляет состоянием приложения. Он включает в себя такие понятия, как:  
 
-In order to demonstrate how to use Redux in the simplest possible way, our app will consist of a message and a button. The message says whether the dog has barked or not (it initially hasn't), and the button makes the dog bark, which should update the message.
+- **хранилище** (store) - простой JavaScript объект, представляющий состояние вашего приложения;
+- **действия** (actions), которые обычно запускаются пользователем;
+- **редюсеры** (reducers), которые можно рассматривать как обработчики действий.
 
-We are going to need 2 packages in this part, `redux` and `react-redux`.
+Редюсеры воздествуют на состояние приложения (**хранилище**), и когда состояние приложения изменяется, что-то происходит в вашем приложении. Хорошая визуальная демонстрация Redux находится [здесь](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
 
-- Run `yarn add redux react-redux`.
+Для того, чтобы продемонстрировать использование Redux наиболее доступным способом, наше приложение будет состоять и сообщения и кнопки. Сообщение будет показывать лает собака или нет (изначально - нет), а кнопка будет заставлять ее лаять, что должно будет отразиться в сообщении.
 
-Lets start by creating 2 folders: `src/client/actions` and `src/client/reducers`.
+Нам потребуется два пакета в этой части: `redux` и `react-redux`.
 
-- In `actions`, create `dog-actions.js`:
+- Запустите `yarn add redux react-redux`.
+
+Давайте начнем с создания двух папок: `src/client/actions` и `src/client/reducers`.
+
+- В `actions`, создайте `dog-actions.js`:
 
 ```javascript
 export const MAKE_BARK = 'MAKE_BARK';
@@ -20,9 +26,9 @@ export const makeBark = () => ({
   payload: true,
 });
 ```
-Here we define an action type, `MAKE_BARK`, and a function (also known as *action creator*) that triggers a `MAKE_BARK` action called `makeBark`. Both are exported because we'll need them both in other files. This action implements the [Flux Standard Action](https://github.com/acdlite/flux-standard-action) model, which is why it has `type` and `payload` attributes.
+Тут мы определяем тип действия - `MAKE_BARK`, и функцию `makeBark` (именуемую *генератор действий*), которая запускает действие `MAKE_BARK`. Мы их экспортируем т.к. они нам понадобятся в других файлах. Это действие построено на основе модели [Flux Standard Action](https://github.com/acdlite/flux-standard-action), вот почему оно имеет атрибуты `type` и `payload`.
 
-- In `reducers`, create `dog-reducer.js`:
+- В `reducers`, создайте `dog-reducer.js`:
 
 ```javascript
 import { MAKE_BARK } from '../actions/dog-actions';
@@ -43,9 +49,9 @@ const dogReducer = (state = initialState, action) => {
 export default dogReducer;
 ```
 
-Here we define the initial state of our app, which is an object containing the `hasBarked` property set to `false`, and the `dogReducer`, which is the function responsible for altering the state based on which action happened. The state cannot be modified in this function, a brand new state object must be returned.
+Здесь мы определили исходное состояние приложения, являющееся объектом, содержащим свойство `hasBarked`, установленное в `false`, и `dogReducer` - функцию, ответсвенную за перемену состояния в зависимости от того, какое действие произошло. Состояние не может быть изменено в этой функции, но должн быть возвращен совершенно новый объект состояния.
 
-- We are now going to modify `app.jsx` to create the *store*. You can replace the entire content of that file by the following:
+- Изменим `app.jsx` чтобы создать *хранилище*. Можете заменить весь файл следующим содержимым:
 
 ```javascript
 import React from 'react';
@@ -71,19 +77,19 @@ ReactDOM.render(
 );
 ```
 
-Our store is created by the Redux function `createStore`, pretty explicit. The store object is assembled by combining all our reducers (in our case, only one) using Redux's `combineReducers` function. Each reducer is named here, and we'll name ours `dog`.
+Наше хранилище создано функцией Redux `createStore`, вполне наглядно. Объект хранилища собирается путем комбинирования всх редюсеров (в нашем случае одного) с помощью функции Redux `combineReducers`. Каждый редюсер в ней имеет имя, наш назовем `dog`.
 
-That's pretty much it for the pure Redux part.
+Мы сделали достаточно, в части, относящейся к чистому Redux.
 
-Now we are going to hook up Redux with React using `react-redux`. In order for `react-redux` to pass the store to our React app, it needs to wrap the entire app in a `<Provider>` component. This component must have a single child, so we created a `<div>`, and this `<div>` contains the 2 main elements of our app, a `BarkMessage` and a `BarkButton`.
+Теперь мы подключим Redux к React, используя пакет `react-redux`. Для того, чтобы `react-redux`, могу передать хранилище в наше приложения на React, нам нужно обернуть все приложение в компонент `<Provider>`. Этот компонент должен содержать единственный дочерний элемент, так что мы добавли `<div>`, и этот `<div>` содержит два основных элемента нашего приложения: `BarkMessage` и `BarkButton`.
 
-As you can tell in the `import` section, `BarkMessage` and `BarkButton` are imported from a `containers` folder. Now is a good time to introduce the concept of **Components** and **Containers**.
+Как вы могли заметить в разделе `import`, мы импортируем `BarkMessage` and `BarkButton` из директории `containers`. Сейчас самое время представить концепцию **Компонентов** и **Контейнеров**.
 
-*Components* are *dumb* React components, in a sense that they don't know anything about the Redux state. *Containers* are *smart* components that know about the state and that we are going to *connect* to our dumb components.
+*Компоненты* - это *"глупые"* компоненты React, в том смысле, что они ничего не знают о состоянии Redux. *Контейнеры* - *"умные"*, знают о состоянии и о том, что мы собираемся *подключиться* (*connect*) к "глупым" компонентам.
 
-- Create 2 folders, `src/client/components` and `src/client/containers`.
+- Создайте 2 папки, `src/client/components` и `src/client/containers`.
 
-- In `components`, create the following files:
+- В `components` создайте следующие файлы:
 
 **button.jsx**
 
@@ -100,7 +106,7 @@ Button.propTypes = {
 export default Button;
 ```
 
-and **message.jsx**:
+и **message.jsx**:
 
 ```javascript
 import React, { PropTypes } from 'react';
@@ -115,11 +121,11 @@ export default Message;
 
 ```
 
-These are examples of *dumb* components. They are logic-less, and just show whatever they are asked to show via React **props**. The main difference between `button.jsx` and `message.jsx` is that `Button` contains an **action** in its props. That action is bound on the `onClick` event. In the context of our app, the `Button` label is never going to change, however, the `Message` component is going to reflect the state of our app, and will vary based on the state.
+Это примеры *"глупых"* компонентов. Они практически лишены логики и просто оборажают то, что потребуется путем передачи им **свойств** (props) React. Основное отличие `button.jsx` от `message.jsx`, в том, что последний содержит **действие** в качестве одного из параметров. Это действие срабатывет по событию `onClick`. В контексте нашего приложения, надпись `Button` никогда не будет изменяться, однако компонент `Message`  должен отражать состояние нашего приложения, и будет изменяться на основе этого.
 
-Again, *components* don't know anything about Redux **actions** or the **state** of our app, which is why we are going to create smart **containers** that will feed the proper *actions* and *data* to these 2 dumb components.
+Опять же, *компоненты* ничего не знают о Redux **действиях** или о **состоянии** нашего приложения, вот почему мы собираемся создать "умные" **контейнеры** которые "подведут" нужные *действия* и *данные* к этим двум "глупым" компонентам. 
 
-- In `containers`, create the following files:
+- В `containers`, создайте следующие файлы:
 
 **bark-button.js**
 
@@ -136,7 +142,7 @@ const mapDispatchToProps = dispatch => ({
 export default connect(null, mapDispatchToProps)(Button);
 ```
 
-and **bark-message.js**:
+и **bark-message.js**:
 
 ```javascript
 import { connect } from 'react-redux';
@@ -149,10 +155,10 @@ const mapStateToProps = state => ({
 export default connect(mapStateToProps)(Message);
 ```
 
-`BarkButton` will hook up `Button` with the `makeBark` action and Redux's `dispatch` method, and `BarkMessage` will hook up the app state with `Message`. When the state changes, `Message` will now automatically re-render with the proper `message` prop. These connections are done via the `connect` function of `react-redux`.
+`BarkButton` подключает действие `makeBark` и метод Redux `dispatch` к `Button`. А `BarkMessage` подключает `Message` к состоянию приложения. Когда состояние изменится, `Message` автоматически перегенерируется с нужным значением свойства `message`. Эти подключения выполнены через функцию `connect` пакета `react-redux`.
 
-- You can now run `yarn start` and open `index.html`. You should see "The dog did not bark" and a button. When you click the button, the message should show "The dog barked".
+- Теперь можете запустить `yarn start` и открыть `index.html`. Вы должны увидеть надпись "The dog did not bark" и кнопку. Когда вы нажмете на кнопку, сообщение должно измениться на "The dog barked".
 
-Next section: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
+Следующий раздел: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
 
-Back to the [previous section](/tutorial/8-react) or the [table of contents](/README.md).
+Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
diff --git a/tutorial/9-redux/READMEeng.md b/tutorial/9-redux/READMEeng.md
new file mode 100644
index 0000000..6d174d6
--- /dev/null
+++ b/tutorial/9-redux/READMEeng.md
@@ -0,0 +1,164 @@
+# 9 - Redux
+
+В этой части (которая наиболее сложная из пройденных), мы добавим в наше приложение [Redux](http://redux.js.org/) ([документация на Русском](https://www.gitbook.com/book/rajdee/redux-in-russian/details)) и подключим его к React. Redux управляет состоянием приложения. Он включает в себя такие понятия, как:  
+
+- **хранилище** (store) - простой JavaScript объект, представляющий состояние вашего приложения;
+- **действия** (actions), которые обычно запускаются пользователем;
+- **редюсеры** (reducers), которые можно рассматривать как обработчики действий.
+
+Редюсеры воздествуют на состояние приложения (**хранилище**), и когда состояние приложения изменяется, что-то происходит в вашем приложении. Хорошая визуальная демонстрация Redux находится [здесь](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
+
+In order to demonstrate how to use Redux in the simplest possible way, our app will consist of a message and a button. The message says whether the dog has barked or not (it initially hasn't), and the button makes the dog bark, which should update the message.
+
+We are going to need 2 packages in this part, `redux` and `react-redux`.
+
+- Run `yarn add redux react-redux`.
+
+Lets start by creating 2 folders: `src/client/actions` and `src/client/reducers`.
+
+- In `actions`, create `dog-actions.js`:
+
+```javascript
+export const MAKE_BARK = 'MAKE_BARK';
+
+export const makeBark = () => ({
+  type: MAKE_BARK,
+  payload: true,
+});
+```
+Here we define an action type, `MAKE_BARK`, and a function (also known as *action creator*) that triggers a `MAKE_BARK` action called `makeBark`. Both are exported because we'll need them both in other files. This action implements the [Flux Standard Action](https://github.com/acdlite/flux-standard-action) model, which is why it has `type` and `payload` attributes.
+
+- In `reducers`, create `dog-reducer.js`:
+
+```javascript
+import { MAKE_BARK } from '../actions/dog-actions';
+
+const initialState = {
+  hasBarked: false,
+};
+
+const dogReducer = (state = initialState, action) => {
+  switch (action.type) {
+    case MAKE_BARK:
+      return { hasBarked: action.payload };
+    default:
+      return state;
+  }
+};
+
+export default dogReducer;
+```
+
+Here we define the initial state of our app, which is an object containing the `hasBarked` property set to `false`, and the `dogReducer`, which is the function responsible for altering the state based on which action happened. The state cannot be modified in this function, a brand new state object must be returned.
+
+- We are now going to modify `app.jsx` to create the *store*. You can replace the entire content of that file by the following:
+
+```javascript
+import React from 'react';
+import ReactDOM from 'react-dom';
+import { createStore, combineReducers } from 'redux';
+import { Provider } from 'react-redux';
+import dogReducer from './reducers/dog-reducer';
+import BarkMessage from './containers/bark-message';
+import BarkButton from './containers/bark-button';
+
+const store = createStore(combineReducers({
+  dog: dogReducer,
+}));
+
+ReactDOM.render(
+  <Provider store={store}>
+    <div>
+      <BarkMessage />
+      <BarkButton />
+    </div>
+  </Provider>
+  , document.querySelector('.app')
+);
+```
+
+Our store is created by the Redux function `createStore`, pretty explicit. The store object is assembled by combining all our reducers (in our case, only one) using Redux's `combineReducers` function. Each reducer is named here, and we'll name ours `dog`.
+
+That's pretty much it for the pure Redux part.
+
+Now we are going to hook up Redux with React using `react-redux`. In order for `react-redux` to pass the store to our React app, it needs to wrap the entire app in a `<Provider>` component. This component must have a single child, so we created a `<div>`, and this `<div>` contains the 2 main elements of our app, a `BarkMessage` and a `BarkButton`.
+
+As you can tell in the `import` section, `BarkMessage` and `BarkButton` are imported from a `containers` folder. Now is a good time to introduce the concept of **Components** and **Containers**.
+
+*Components* are *dumb* React components, in a sense that they don't know anything about the Redux state. *Containers* are *smart* components that know about the state and that we are going to *connect* to our dumb components.
+
+- Create 2 folders, `src/client/components` and `src/client/containers`.
+
+- In `components`, create the following files:
+
+**button.jsx**
+
+```javascript
+import React, { PropTypes } from 'react';
+
+const Button = ({ action, actionLabel }) => <button onClick={action}>{actionLabel}</button>;
+
+Button.propTypes = {
+  action: PropTypes.func.isRequired,
+  actionLabel: PropTypes.string.isRequired,
+};
+
+export default Button;
+```
+
+and **message.jsx**:
+
+```javascript
+import React, { PropTypes } from 'react';
+
+const Message = ({ message }) => <div>{message}</div>;
+
+Message.propTypes = {
+  message: PropTypes.string.isRequired,
+};
+
+export default Message;
+
+```
+
+These are examples of *dumb* components. They are logic-less, and just show whatever they are asked to show via React **props**. The main difference between `button.jsx` and `message.jsx` is that `Button` contains an **action** in its props. That action is bound on the `onClick` event. In the context of our app, the `Button` label is never going to change, however, the `Message` component is going to reflect the state of our app, and will vary based on the state.
+
+Again, *components* don't know anything about Redux **actions** or the **state** of our app, which is why we are going to create smart **containers** that will feed the proper *actions* and *data* to these 2 dumb components.
+
+- In `containers`, create the following files:
+
+**bark-button.js**
+
+```javascript
+import { connect } from 'react-redux';
+import Button from '../components/button';
+import { makeBark } from '../actions/dog-actions';
+
+const mapDispatchToProps = dispatch => ({
+  action: () => { dispatch(makeBark()); },
+  actionLabel: 'Bark',
+});
+
+export default connect(null, mapDispatchToProps)(Button);
+```
+
+and **bark-message.js**:
+
+```javascript
+import { connect } from 'react-redux';
+import Message from '../components/message';
+
+const mapStateToProps = state => ({
+  message: state.dog.hasBarked ? 'The dog barked' : 'The dog did not bark',
+});
+
+export default connect(mapStateToProps)(Message);
+```
+
+`BarkButton` will hook up `Button` with the `makeBark` action and Redux's `dispatch` method, and `BarkMessage` will hook up the app state with `Message`. When the state changes, `Message` will now automatically re-render with the proper `message` prop. These connections are done via the `connect` function of `react-redux`.
+
+- You can now run `yarn start` and open `index.html`. You should see "The dog did not bark" and a button. When you click the button, the message should show "The dog barked".
+
+Next section: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
+
+Back to the [previous section](/tutorial/8-react) or the [table of contents](/README.md).
-- 
GitLab


From 0a2ed91707277a0f8fabf010998dba2d2e5afa31 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Mon, 7 Nov 2016 23:15:34 +0700
Subject: [PATCH 27/73] section 11

---
 README.md                                     |   2 +-
 .../10-immutable-redux-improvements/README.md |   2 +-
 .../11-testing-mocha-chai-sinon/README.md     |  61 +++----
 .../11-testing-mocha-chai-sinon/READMEeng.md  | 157 ++++++++++++++++++
 4 files changed, 190 insertions(+), 32 deletions(-)
 create mode 100644 tutorial/11-testing-mocha-chai-sinon/READMEeng.md

diff --git a/README.md b/README.md
index 405e4c1..dee43c4 100644
--- a/README.md
+++ b/README.md
@@ -64,7 +64,7 @@
 
 [11 - Тестировние с Mocha, Chai, и Sinon](/tutorial/11-testing-mocha-chai-sinon)
 
-[12 - ~Типизация с~ Flow](/tutorial/12-flow)
+[12 - Типизация с Flow](/tutorial/12-flow)
 
 ## Далее следует
 
diff --git a/tutorial/10-immutable-redux-improvements/README.md b/tutorial/10-immutable-redux-improvements/README.md
index 2bb44b1..69c2d38 100644
--- a/tutorial/10-immutable-redux-improvements/README.md
+++ b/tutorial/10-immutable-redux-improvements/README.md
@@ -99,5 +99,5 @@ export const makeBark = createAction(MAKE_BARK, () => true);
 
 Следующий раздел: [11 - Тестировние с Mocha, Chai, и Sinon](/tutorial/11-testing-mocha-chai-sinon)
 
-Назад в [предыдущий раздел](/tutorial/9-redux) или [Содержание](/README.md).
+Назад в [предыдущий раздел](/tutorial/9-redux) или [Содержание](/../../).
 
diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index 53a2766..810d483 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -1,16 +1,16 @@
-# 11 - Testing with Mocha, Chai, and Sinon
+# 11 - Тестировние с Mocha, Chai, и Sinon
 
 ## Mocha and Chai
 
-- Create an `src/test` folder. This folder will mirror our application folder structure, so create a `src/test/client` folder as well (feel free to add `server` and `shared` if you want, but we're not going to write tests for these).
+- Создайте директорию `src/test`. Эта папка будет отражать структуру директорий нашего приложения, поэтому создайте также `src/test/client` (можете так же добавить `server` и `shared`, если хотите, но мы не будем писать тесты для них).
 
-- In `src/test/client`, create a `state-test.js` file, which we are going to use to test our Redux application life cycle.
+- В `src/test/client`, создайте файл `state-test.js` , в котором мы будем тестировать жизненный цикл нашего Redux приложеия.
 
-We are going to use [Mocha](http://mochajs.org/) as our main testing framework. Mocha is easy to use, has tons of features, and is currently the [most popular JavaScript testing framework](http://stateofjs.com/2016/testing/). It is very flexible and modular. In particular, it lets you use any assertion library you want. [Chai](http://chaijs.com/) is a great assertion library that has a lot of [plugins](http://chaijs.com/plugins/) available and lets you choose between different assertion styles.
+Мы будем использовать [Mocha](http://mochajs.org/) в качесве основного фреймворка для тестирования. Mocha прост в использовании, имеет множество возможностей, и на данный момент [самый популярный фреймворк для тестирования](http://stateofjs.com/2016/testing/). Он модульный и очень гибкий. В частности, он позволяет использовать любые библиотеки утверждений (assertion) на ваше пожелание. [Chai](http://chaijs.com/) - замечательная библиотека утверждений, имеющая много доступных [плагинов](http://chaijs.com/plugins/) и позволяющая вам выбирать между различными стилями утверждений.
 
-- Let's install Mocha and Chai by running `yarn add --dev mocha chai`
+- Установим Mocha и Chai выполним `yarn add --dev mocha chai`
 
-In `state-test.js`, write the following:
+В `state-test.js`, напишите следующее:
 
 ```javascript
 /* eslint-disable import/no-extraneous-dependencies, no-unused-expressions */
@@ -42,17 +42,17 @@ describe('App State', () => {
   });
 });
 ```
-Alright, let's analyze this whole thing.
+Хорошо, давайте все это проанализируем.
 
-First, notice how we import the `should` assertion style from `chai`. This lets us assert things using a syntax like `mynumber.should.equal(3)`, pretty neat. In order to be able to call `should` on any object, we need to run the function `should()` before anything. Some of these assertion are *expressions*, like `mybook.should.be.true`, which will make ESLint grumpy, so we've added an ESLint comment at the top to disable the `no-unused-expressions` rule in this file.
+Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, что бы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавили для него комментарий в начале чтобы отключить правило `no-unused-expressions` для этого файла.
 
-Mocha tests work like a tree. In our case, we want to test the `makeBark` function which should affect the `dog` attribute of the application state, so it makes sense to use the following hierarchy of tests: `App State > Dog > makeBark`, that we declare using `describe()`. `it()` is the actual test function and `beforeEach()` is a function that is executed before each `it()` test. In our case, we want a fresh new store before running each test. We declare a `store` variable at the top of the file because it should be useful in every test of this file.
+Тесты Mocha устроены наподобие дерева. В нашем случае, мы хотим протестировать функцию `makeBark`, которая должна воздействовать на атрибут `dog` состояния нашего приложения, поэтому имеет смысл использовать следующую иерархию тестов: `App State > Dog > makeBark`, что мы и описали используя `describe()`. `it()`  - это собственно, тестирующая функция, а `beforeEach()` - это функция, вызываемая перед каждым вызовом теста `it()`. В нашем случае мы хотим иметь новую чистую версию хранилища перед запуском каждого теста. Мы обявили переменную `store` в начале файла, поскольку она нам пригодится в кадом тесте.
 
-Our `makeBark` test is very explicit, and the description provided as a string in `it()` makes it even clearer: we test that `hasBarked` go from `false` to `true` after calling `makeBark`.
+Тест `makeBark` вполне понятен, а строка с описанием в `it()` делает его еще яснее: мы проверяем, что `hasBarked` меняется с `false` на `true` после вызова  `makeBark`.
 
-Alright, let's run this test!
+Отлично, запустим этот тест!
 
-- Create the following `test` task, which relies on the `gulp-mocha` plugin:
+- Создайте следующую задачу `test`, которая основывается на плагине `gulp-mocha`:
 
 ```javascript
 import mocha from 'gulp-mocha';
@@ -70,27 +70,29 @@ gulp.task('test', ['build'], () =>
 );
 ```
 
-- Run `yarn add --dev gulp-mocha` of course.
+- Конечно же, выполните `yarn add --dev gulp-mocha`.
 
-As you can see, tests are run on transpiled code in `lib`, which is why `build` is a prerequisite task of `test`. `build` also has a prerequisite, `lint`, and finally, we are making `test` a prerequisite of `main`, which gives us the following task cascade for the `default` task: `lint` > `build` > `test` > `main`.
+Как вы можете видеть, тесты запускаются на транспилированом коде из папки `lib`, вот почему задачу `test` предваряет запуск `build`. `build`,  в свою очередь, предваряется задачей `lint`, а сам `test` мы будем запускать перед `main`, что в итоге даст нам следующий каскад задач для `default`: `lint` > `build` > `test` > `main`.
 
-- Change the prerequisite of `main` to `test`:
+`build` also has a prerequisite, `lint`, and finally, we are making `test` a prerequisite of `main`, which gives us the following task cascade for the `default` task: `lint` > `build` > `test` > `main`.
+
+- Установите в `main` предварительный запуск команды `test`:
 
 ```javascript
 gulp.task('main', ['test'], () => /* ... */ );
 ```
 
-- In `package.json`, replace the current `"test"` script by: `"test": "gulp test"`. This way you can use `yarn test` to just run your tests. `test` is also the standard script that will be automatically called by tools like continuous integration services for instance, so you should always bind your test task to it. `yarn start` will run the tests before building the Webpack client bundle as well, so it will only build it if all tests pass.
+- В `package.json`, текущее значение скрипта `"test"` на следующее: `"test": "gulp test"`. Таким образом мы можем использовать `yarn test` чтобы просто запустить наши тесты. Так же `test` - это стандартный скрипт, который автоматически запускается такими инструментами, как, например, сервисы непрерывной интеграции (continuous integration services, CI), так что всегда добавляйте запуск тестов через него. `yarn start` также запустит тестирование перед построением сборки Webpack, так что сборка сгенерируется только если все тесты будут пройдены.
 
-- Run `yarn test` or `yarn start`, and it should print the result for our test, hopefully green.
+- Запустите `yarn test` или `yarn start`, и должны будут выйти результаты ваших тестов, предпочтительно зеленые.
 
 ## Sinon
 
-In some cases, we want to be able to *fake* things in a unit test. For instance, let's say we have a function, `deleteEverything`, which contains a call to `deleteDatabases()`. Running `deleteDatabases()` causes a lot of side-effects, which we absolutely don't want to happen when running our test suite.
+В некоторых случаях, мы хотим иметь возможность *эмулировать* некоторые вещи в юнит тестах. Например, давайте скажем, у нас есть функция `deleteEverything`, которая содержит вызов `deleteDatabases()`. Запуск `deleteDatabases()` вызовет много побочных эффектов, которые нам абсолютно не желательны, во время тестирования.
 
-[Sinon](http://sinonjs.org/) is a testing library that offers **Stubs** (and a lot of other things), which allow us to neutralize `deleteDatabases` and simply monitor it without actually calling it. This way we can test if it got called, or which parameters it got called with for instance. This is typically very useful to fake or avoid AJAX calls - which can cause side-effects on the back-end.
+[Sinon](http://sinonjs.org/) - библиотека тестирования, предлагающая **Заглушки** (и многие другие вещи), позволяет нейтрализовать `deleteDatabases` и просто мониторить ее не запуская на самом деле. Таким образом, к примеру, мы можем тестировать была ли она запущена или с какими параметрами она была запущена. Обычно, это очень полезно эмуляции или исключения AJAX вызовов, которые могут вызвать побочные эффекты на сервере. 
 
-In the context of our app, we are going to add a `barkInConsole` method to our `Dog` class in `src/shared/dog.js`:
+В рамках нашего приложения, мы добавим метод `barkInConsole` в класс `Dog` в файле `src/shared/dog.js`:
 
 ```javascript
 class Dog {
@@ -111,10 +113,9 @@ class Dog {
 
 export default Dog;
 ```
+Если мы запустим `barkInConsole` в нашем юнит тесте, то `console.log()` выведет что-то в терминал. Давайте мы будем это рассматривать, как нежелательный побочный эффект в рамках нашего юнит теста. Тем не менее мы желаем, знать была ли `console.log()` *нормально запущена*, и какие параметры были *переданы ей при вызове*.
 
-If we run `barkInConsole` in a unit test, `console.log()` will print things in the terminal. We are going to consider this to be an undesired side-effect in the context of our unit tests. We are interested in knowing if `console.log()` *would have normally been called* though, and we want to test what parameters it *would have been called with*.
-
-- Create a new `src/test/shared/dog-test.js` file, and add write the following:
+- Создайте новый файл `src/test/shared/dog-test.js` и добавьте туда следующее:
 
 ```javascript
 /* eslint-disable import/no-extraneous-dependencies, no-console */
@@ -142,16 +143,16 @@ describe('Shared', () => {
 });
 ```
 
-Here, we are using *stubs* from Sinon, and a Chai plugin to be able to use Chai assertions on Sinon stubs and such.
+Тут мы используем *заглушки* от Sinon и плагин для Chai, посволяющий использовать его утверждения на таких заглушках и им подобных.
 
-- Run `yarn add --dev sinon sinon-chai` to install these libraries.
+- Запустите `yarn add --dev sinon sinon-chai` чтобы установить эти библиотеки.
 
-So what is new here? Well first of all, we call `chai.use(sinonChai)` to activate the Chai plugin. Then, all the magic happens in the `it()` statement: `stub(console, 'log')` is going to neutralize `console.log` and monitor it. When `new Dog('Test Toby').barkInConsole()` is executed, a `console.log` is normally supposed to happen. We test this call to `console.log` with `console.log.should.have.been.calledWith()`, and finally, we `restore` the neutralized `console.log` to make it work normally again.
+Что здесь нового? Ну прежде всего, мы вызываем `chai.use(sinonChai)`, чтобы активировать плагин для Chai. Затем, вся магия происходит внутри `it()`: `stub(console, 'log')` нейтрализует `console.log` и следит за ней. Когда `new Dog('Test Toby').barkInConsole()` выполнен, `console.log` должна была бы сработать. Мы проверяем этот вызов `console.log` с помощью `console.log.should.have.been.calledWith()`, а затем, восстанавливаем с помощью `restore` нейтрализированную `console.log`, чтобы позволить ей дальше работать нормльно.
 
-**Important note**: Stubbing `console.log` is not recommended, because if the test fails, `console.log.restore()` is never called, and therefore `console.log` will remain broken for the rest of the command you executed in your terminal! It won't even print the error message that caused the test to fail, so it leaves you with very little information about what happened. That can be quite confusing. It is a good example to illustrate stubs in this simple app though.
+**Важное замечание**: Заглушать `console.log` не рекомендуется, потому, что если тест провалится, то `console.log.restore()` никогда не запустится, и следовательно `console.log` останется неисправной для всех остальных команд, выполняемых в терминале. При этом даже не выйдет сообщения об ошибке прохождения теста, так что вы останетесь с очень малой информацией о том, что же произошло. Это может оказаться достаточно не приятно. Тем не менее, это хороший пример, иллюстрирующий применение заглушек в этом простом приложении.
 
-If everything went well in this chapter, you should have 2 passing tests.
+Если в этом разделе прошло хорошо, то у вас должно быть два пройденых теста.
 
-Next section: [12 - Type Checking with Flow](/tutorial/12-flow)
+Следующий раздел:  [12 - Типизация с Flow](/tutorial/12-flow)
 
-Back to the [previous section](/tutorial/10-immutable-redux-improvements) or the [table of contents](/README.md).
+Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
diff --git a/tutorial/11-testing-mocha-chai-sinon/READMEeng.md b/tutorial/11-testing-mocha-chai-sinon/READMEeng.md
new file mode 100644
index 0000000..53a2766
--- /dev/null
+++ b/tutorial/11-testing-mocha-chai-sinon/READMEeng.md
@@ -0,0 +1,157 @@
+# 11 - Testing with Mocha, Chai, and Sinon
+
+## Mocha and Chai
+
+- Create an `src/test` folder. This folder will mirror our application folder structure, so create a `src/test/client` folder as well (feel free to add `server` and `shared` if you want, but we're not going to write tests for these).
+
+- In `src/test/client`, create a `state-test.js` file, which we are going to use to test our Redux application life cycle.
+
+We are going to use [Mocha](http://mochajs.org/) as our main testing framework. Mocha is easy to use, has tons of features, and is currently the [most popular JavaScript testing framework](http://stateofjs.com/2016/testing/). It is very flexible and modular. In particular, it lets you use any assertion library you want. [Chai](http://chaijs.com/) is a great assertion library that has a lot of [plugins](http://chaijs.com/plugins/) available and lets you choose between different assertion styles.
+
+- Let's install Mocha and Chai by running `yarn add --dev mocha chai`
+
+In `state-test.js`, write the following:
+
+```javascript
+/* eslint-disable import/no-extraneous-dependencies, no-unused-expressions */
+
+import { createStore } from 'redux';
+import { combineReducers } from 'redux-immutable';
+import { should } from 'chai';
+import { describe, it, beforeEach } from 'mocha';
+import dogReducer from '../../client/reducers/dog-reducer';
+import { makeBark } from '../../client/actions/dog-actions';
+
+should();
+let store;
+
+describe('App State', () => {
+  describe('Dog', () => {
+    beforeEach(() => {
+      store = createStore(combineReducers({
+        dog: dogReducer,
+      }));
+    });
+    describe('makeBark', () => {
+      it('should make hasBarked go from false to true', () => {
+        store.getState().getIn(['dog', 'hasBarked']).should.be.false;
+        store.dispatch(makeBark());
+        store.getState().getIn(['dog', 'hasBarked']).should.be.true;
+      });
+    });
+  });
+});
+```
+Alright, let's analyze this whole thing.
+
+First, notice how we import the `should` assertion style from `chai`. This lets us assert things using a syntax like `mynumber.should.equal(3)`, pretty neat. In order to be able to call `should` on any object, we need to run the function `should()` before anything. Some of these assertion are *expressions*, like `mybook.should.be.true`, which will make ESLint grumpy, so we've added an ESLint comment at the top to disable the `no-unused-expressions` rule in this file.
+
+Mocha tests work like a tree. In our case, we want to test the `makeBark` function which should affect the `dog` attribute of the application state, so it makes sense to use the following hierarchy of tests: `App State > Dog > makeBark`, that we declare using `describe()`. `it()` is the actual test function and `beforeEach()` is a function that is executed before each `it()` test. In our case, we want a fresh new store before running each test. We declare a `store` variable at the top of the file because it should be useful in every test of this file.
+
+Our `makeBark` test is very explicit, and the description provided as a string in `it()` makes it even clearer: we test that `hasBarked` go from `false` to `true` after calling `makeBark`.
+
+Alright, let's run this test!
+
+- Create the following `test` task, which relies on the `gulp-mocha` plugin:
+
+```javascript
+import mocha from 'gulp-mocha';
+
+const paths = {
+  // [...]
+  allLibTests: 'lib/test/**/*.js',
+};
+
+// [...]
+
+gulp.task('test', ['build'], () =>
+  gulp.src(paths.allLibTests)
+    .pipe(mocha())
+);
+```
+
+- Run `yarn add --dev gulp-mocha` of course.
+
+As you can see, tests are run on transpiled code in `lib`, which is why `build` is a prerequisite task of `test`. `build` also has a prerequisite, `lint`, and finally, we are making `test` a prerequisite of `main`, which gives us the following task cascade for the `default` task: `lint` > `build` > `test` > `main`.
+
+- Change the prerequisite of `main` to `test`:
+
+```javascript
+gulp.task('main', ['test'], () => /* ... */ );
+```
+
+- In `package.json`, replace the current `"test"` script by: `"test": "gulp test"`. This way you can use `yarn test` to just run your tests. `test` is also the standard script that will be automatically called by tools like continuous integration services for instance, so you should always bind your test task to it. `yarn start` will run the tests before building the Webpack client bundle as well, so it will only build it if all tests pass.
+
+- Run `yarn test` or `yarn start`, and it should print the result for our test, hopefully green.
+
+## Sinon
+
+In some cases, we want to be able to *fake* things in a unit test. For instance, let's say we have a function, `deleteEverything`, which contains a call to `deleteDatabases()`. Running `deleteDatabases()` causes a lot of side-effects, which we absolutely don't want to happen when running our test suite.
+
+[Sinon](http://sinonjs.org/) is a testing library that offers **Stubs** (and a lot of other things), which allow us to neutralize `deleteDatabases` and simply monitor it without actually calling it. This way we can test if it got called, or which parameters it got called with for instance. This is typically very useful to fake or avoid AJAX calls - which can cause side-effects on the back-end.
+
+In the context of our app, we are going to add a `barkInConsole` method to our `Dog` class in `src/shared/dog.js`:
+
+```javascript
+class Dog {
+  constructor(name) {
+    this.name = name;
+  }
+
+  bark() {
+    return `Wah wah, I am ${this.name}`;
+  }
+
+  barkInConsole() {
+    /* eslint-disable no-console */
+    console.log(this.bark());
+    /* eslint-enable no-console */
+  }
+}
+
+export default Dog;
+```
+
+If we run `barkInConsole` in a unit test, `console.log()` will print things in the terminal. We are going to consider this to be an undesired side-effect in the context of our unit tests. We are interested in knowing if `console.log()` *would have normally been called* though, and we want to test what parameters it *would have been called with*.
+
+- Create a new `src/test/shared/dog-test.js` file, and add write the following:
+
+```javascript
+/* eslint-disable import/no-extraneous-dependencies, no-console */
+
+import chai from 'chai';
+import { stub } from 'sinon';
+import sinonChai from 'sinon-chai';
+import { describe, it } from 'mocha';
+import Dog from '../../shared/dog';
+
+chai.should();
+chai.use(sinonChai);
+
+describe('Shared', () => {
+  describe('Dog', () => {
+    describe('barkInConsole', () => {
+      it('should print a bark string with its name', () => {
+        stub(console, 'log');
+        new Dog('Test Toby').barkInConsole();
+        console.log.should.have.been.calledWith('Wah wah, I am Test Toby');
+        console.log.restore();
+      });
+    });
+  });
+});
+```
+
+Here, we are using *stubs* from Sinon, and a Chai plugin to be able to use Chai assertions on Sinon stubs and such.
+
+- Run `yarn add --dev sinon sinon-chai` to install these libraries.
+
+So what is new here? Well first of all, we call `chai.use(sinonChai)` to activate the Chai plugin. Then, all the magic happens in the `it()` statement: `stub(console, 'log')` is going to neutralize `console.log` and monitor it. When `new Dog('Test Toby').barkInConsole()` is executed, a `console.log` is normally supposed to happen. We test this call to `console.log` with `console.log.should.have.been.calledWith()`, and finally, we `restore` the neutralized `console.log` to make it work normally again.
+
+**Important note**: Stubbing `console.log` is not recommended, because if the test fails, `console.log.restore()` is never called, and therefore `console.log` will remain broken for the rest of the command you executed in your terminal! It won't even print the error message that caused the test to fail, so it leaves you with very little information about what happened. That can be quite confusing. It is a good example to illustrate stubs in this simple app though.
+
+If everything went well in this chapter, you should have 2 passing tests.
+
+Next section: [12 - Type Checking with Flow](/tutorial/12-flow)
+
+Back to the [previous section](/tutorial/10-immutable-redux-improvements) or the [table of contents](/README.md).
-- 
GitLab


From 6046c0aa22bff3c5b8ca32698c27554018c540c3 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Mon, 7 Nov 2016 16:26:24 +0000
Subject: [PATCH 28/73] README.md edited online with Bitbucket

---
 tutorial/3-es6-babel-gulp/README.md | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/tutorial/3-es6-babel-gulp/README.md b/tutorial/3-es6-babel-gulp/README.md
index 603685b..40a2bfd 100644
--- a/tutorial/3-es6-babel-gulp/README.md
+++ b/tutorial/3-es6-babel-gulp/README.md
@@ -1,11 +1,11 @@
 # 3 - Настройка ES6 с Babel и Gulp
 
-Мы начинаем использовать синтаксис ES6, представляющий значительное продвижение относительно "старого" ES5. Все браузеры и JS окружения хорошо понимают ES5, но не ES6. Поэтому мы будем использовать инструмент, называемый Babel, чтобы преобразовать файлы ES6 в ES5 формат. Чтобы запускать Babel, мы будем использовать Gulp - менеджер задач. Это похоже на создание задач, расположенных в `scripts` файла `package.json`, но написание задач в JS файле проще и понятнее чем в JSON, поэтому установим Gulp и плагин Babel для него.
+Мы начинаем использовать синтаксис ES6, значительно более продвинутый относительно "старого" ES5. Все браузеры и JS окружения хорошо понимают ES5, но не ES6. Поэтому мы будем использовать инструмент, называемый Babel, чтобы преобразовать файлы ES6 в ES5 формат. Чтобы запустить Babel, мы будем использовать Gulp - менеджер задач. Это похоже на создание задач, расположенных в `scripts` файла `package.json`, но написание задач в JS файле проще и понятнее чем в JSON, поэтому установим Gulp и плагин Babel для него.
 
 - Запустите `yarn add --dev gulp`
 - Запустите `yarn add --dev gulp-babel`
 - Запустите `yarn add --dev babel-preset-latest`
-- В `package.json`, добавьте поле `babel` для конфигурации Babel. Укажем следующим образом, что хотим использовать новейшую конфигурацию Babel:
+- В `package.json`, добавьте поле `babel` для конфигурации Babel. Укажем, что хотим использовать новейшую конфигурацию Babel,следующим образом:
 
 ```json
 "babel": {
@@ -15,16 +15,16 @@
 },
 ```
 
-**Примечание**: Файл `.babelrc` в корне проекта так же может быть использован вместо свойства `babel` в `package.json`. Но поскольку корневая директория вашего проекта будет все больше и больше раздуваться с течением времени, лучше храните конфигурацию Babel в `package.json`, до тех пор, пока она не станет слишком большой.
+**Примечание**: Файл `.babelrc` в корне проекта так же может быть использован вместо свойства `babel` в `package.json`. Но поскольку корневая директория вашего проекта, с течением времени, будет все больше и больше раздуваться, лучше храните конфигурацию Babel в `package.json`, до тех пор, пока она не станет слишком большой.
 
-- Переместите файл `index.js` в директорию `src`. Там вы будете писать ES6 код. А папка `lib` будет местом, куда ваш код будет компилироваться в ES5. Gulp и Babel позаботятся о ее создании. Уберите предыдущий, относящийся к `color`, код из `index.js`, и замените его на нечто простое, например такое:
+- Переместите файл `index.js` в директорию `src`. Там вы будете писать ES6 код. А папка `lib` будет местом, куда ваш код будет компилироваться в ES5. Gulp и Babel позаботятся о ее создании. Уберите предыдущий, относящийся к `color`, код из `index.js`, и замените его на нечто простое, например:
 
 ```javascript
 const str = 'ES6';
 console.log(`Hello ${str}`);
 ```
 
-Мы здесь использовали *шаблонную строку* - возможость ES6 внедрять с помощью `${}` переменные прямо в строки без использования конкантенации. Обратите внимание, что шаблонные строки пишутся в **\`обратных кавычках\`**
+Здесь мы использовали *шаблонную строку* - возможость ES6 внедрять с помощью `${}` переменные прямо в строки, без использования конкантенации. Обратите внимание, что шаблонные строки пишутся в **\`обратных кавычках\`**
 
 - Создайте `gulpfile.js`, содержащий:
 
@@ -64,21 +64,21 @@ gulp.task('default', ['watch', 'main']);
 
 ```
 
-Давайте приостановимся и разберемся с этим.
+Давайте приостановимся и разберемся.
 
-Gulp сам по себе имеет довольно понятный API. Он определяет задачи `gulp.task`, которые могут брать файы из `gulp.src`, применять к ним цепочки обработчиков - `.pipe()` (как `babel()` в нашем случае), и сохранять новые файлы в `gulp.dest`. Так же от может отслеживать (`gulp.watch`) изменения в файловой системе. Одни задачи Gulp могут предварять запуск других, если указать их в массиве (как `['build']`) в качестве второго аргумента в `gulp.task`. В [документации](https://github.com/gulpjs/gulp) все изложено более основательно.
+Gulp, сам по себе, имеет довольно понятный API. Он определяет задачи `gulp.task`, которые могут брать файы из `gulp.src`, применять к ним цепочки обработчиков - `.pipe()` (как `babel()` в нашем случае), и сохранять новые файлы в `gulp.dest`. Так же он может отслеживать (`gulp.watch`) изменения в файловой системе. Одни задачи Gulp могут предварять запуск других, если указать их в массиве (как `['build']`) в качестве второго аргумента в `gulp.task`. В [документации](https://github.com/gulpjs/gulp) все изложено более основательно.
 
 Сначала мы определили объект `paths`, что бы хранить в одном месте все нужные пути и использовать принцип "не повторяйся" (DRY).
 
 Затем мы определили пять задач: `build` *(создать)*, `clean` *(очистить)*, `main` *(основная)*, `watch` *(наблюдать)*, and `default` *(по умолчанию)*.
 
 - `build` вызывает Babel, чтобы преобразовать все исходные файлы из `src`, и записывает результат в `lib`.
-- `clean` - задача, которая просто удаляет всю нашу автоматически сгенерированную директорию `lib` перед каждым `build`. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то в `src`) или для того, чтобы быть уверенным, что директория `lib` всегда синхронна с `src`, даже если `build` не завершился успешно, а вы этого не заметили. Мы используем пакет `del` чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это [рекомендованый](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) для Gulp способ)
-- `main` - аналогично запуску `node .` из предыдущией части, за исключением, что теперь мы используем `lib/index.js`. Мы можем просто писать `node lib`, потому что по умолчанию Node найдет и запустит `index.js` из указанной папки (мы используем переменную `libDir` чтоб соответствовать принципу DRY). `require('child_process').exec` и `exec` - это функции самого Node, вызывающие консольные команды. Мы перенаправим `stdout` в `console.log()` и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается в `gulp.task` в качестве аргумента. Не переживайте если эта команда не совсем ясна для вас, помните, что эта задача просто лишь запускает `node lib`.
+- `clean` - задача, которая просто удаляет всю нашу автоматически сгенерированную директорию `lib` перед каждым `build`. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то в `src`) для того, чтобы быть уверенным, что директория `lib` всегда синхронна с `src`, даже если `build` не завершился успешно, а вы этого не заметили. Мы используем пакет `del` чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это [рекомендованый](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) для Gulp способ)
+- `main` - аналогично запуску `node .` из предыдущией части, за исключением того, что теперь мы используем `lib/index.js`. Мы можем просто писать `node lib`, потому что по умолчанию Node найдет и запустит `index.js` из указанной папки (мы используем переменную `libDir` чтоб соответствовать принципу DRY). `require('child_process').exec` и `exec` - это функции самого Node, вызывающие консольные команды. Мы перенаправим `stdout` в `console.log()` и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается в `gulp.task` в качестве аргумента. Не переживайте, если эта команда не совсем ясна для вас, помните, что эта задача просто лишь запускает `node lib`.
 - `watch` запускает задчу `main`, когда происходят изменения файловой системы для указанных файлов.
-- `default` - это специальная задача, которая запускается, если вы просто вызываете `gulp` из CLI (коммандной строки). В нашем случае мы хотим сначала запустить `main` (один раз), а затем `watch`.
+- `default` - это специальная задача, которая запускается, если вы просто вызываете `gulp` из CLI (коммандной строки). В нашем случае, мы хотим сначала запустить `main` (один раз), а затем `watch`.
 
-**Примечание**: Возможно вы удивитесь, что мы используем синтаксис ES6 в этом Gulp файле, хотя он не транспилируется в ES5 со помощью Babel. Это потому, что мы используем версию Node, которая поддерживает возможности ES6 из коробки (убедитесь, Что вы используете версию Node > 6.5.0, запустив `node -v`).
+**Примечание**: Возможно вы удивились тому, что мы используем синтаксис ES6 в этом Gulp файле, хотя он не транспилируется в ES5 со помощью Babel. Это потому, что мы используем версию Node, которая поддерживает возможности ES6 из коробки (убедитесь, что вы используете версию Node > 6.5.0, запустив `node -v`).
 
 Отлично! Посмотрим как это работает.
 
-- 
GitLab


From 3a943bfc6b83440e2f494eb064d0fc20cd1a2e2e Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Mon, 7 Nov 2016 16:43:06 +0000
Subject: [PATCH 29/73] README.md edited online with Bitbucket

---
 tutorial/9-redux/README.md | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index 7e2c73c..4420c38 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -8,9 +8,9 @@
 
 Редюсеры воздествуют на состояние приложения (**хранилище**), и когда состояние приложения изменяется, что-то происходит в вашем приложении. Хорошая визуальная демонстрация Redux находится [здесь](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
 
-Для того, чтобы продемонстрировать использование Redux наиболее доступным способом, наше приложение будет состоять и сообщения и кнопки. Сообщение будет показывать лает собака или нет (изначально - нет), а кнопка будет заставлять ее лаять, что должно будет отразиться в сообщении.
+Для того, чтобы продемонстрировать использование Redux наиболее доступным способом, наше приложение будет состоять из сообщения и кнопки. Сообщение будет показывать лает собака или нет (изначально - нет), а кнопка будет заставлять ее лаять, что должно будет отражаться в сообщении.
 
-Нам потребуется два пакета в этой части: `redux` и `react-redux`.
+В этой части нам потребуется два пакета: `redux` и `react-redux`.
 
 - Запустите `yarn add redux react-redux`.
 
@@ -49,9 +49,9 @@ const dogReducer = (state = initialState, action) => {
 export default dogReducer;
 ```
 
-Здесь мы определили исходное состояние приложения, являющееся объектом, содержащим свойство `hasBarked`, установленное в `false`, и `dogReducer` - функцию, ответсвенную за перемену состояния в зависимости от того, какое действие произошло. Состояние не может быть изменено в этой функции, но должн быть возвращен совершенно новый объект состояния.
+Здесь мы определили исходное состояние приложения, являющееся объектом, содержащим свойство `hasBarked`, установленное в `false`, и `dogReducer` - функцию, ответсвенную за перемену состояния, в зависимости от того, какое действие произошло. Состояние не может быть изменено в этой функции, но должен быть возвращен совершенно новый объект состояния.
 
-- Изменим `app.jsx` чтобы создать *хранилище*. Можете заменить весь файл следующим содержимым:
+- Изменим `app.jsx`, чтобы создать *хранилище*. Можете заменить весь файл следующим содержимым:
 
 ```javascript
 import React from 'react';
@@ -77,13 +77,13 @@ ReactDOM.render(
 );
 ```
 
-Наше хранилище создано функцией Redux `createStore`, вполне наглядно. Объект хранилища собирается путем комбинирования всх редюсеров (в нашем случае одного) с помощью функции Redux `combineReducers`. Каждый редюсер в ней имеет имя, наш назовем `dog`.
+Наше хранилище создано функцией Redux `createStore`, вполне наглядно. Объект хранилища собирается путем комбинирования всех редюсеров (в нашем случае одного) с помощью функции Redux `combineReducers`. Каждый редюсер в ней имеет имя, наш назовем `dog`.
 
 Мы сделали достаточно, в части, относящейся к чистому Redux.
 
-Теперь мы подключим Redux к React, используя пакет `react-redux`. Для того, чтобы `react-redux`, могу передать хранилище в наше приложения на React, нам нужно обернуть все приложение в компонент `<Provider>`. Этот компонент должен содержать единственный дочерний элемент, так что мы добавли `<div>`, и этот `<div>` содержит два основных элемента нашего приложения: `BarkMessage` и `BarkButton`.
+Теперь мы подключим Redux к React, используя пакет `react-redux`. Для того, чтобы `react-redux`, мог передать хранилище в наше приложение на React, нам нужно обернуть все приложение в компонент `<Provider>`. Этот компонент должен содержать единственный дочерний элемент, так что мы добавли `<div>`, и этот `<div>` содержит два основных элемента нашего приложения: `BarkMessage` и `BarkButton`.
 
-Как вы могли заметить в разделе `import`, мы импортируем `BarkMessage` and `BarkButton` из директории `containers`. Сейчас самое время представить концепцию **Компонентов** и **Контейнеров**.
+Как вы могли заметить, в разделе `import`, мы импортируем `BarkMessage` and `BarkButton` из директории `containers`. Сейчас самое время представить концепцию **Компонентов** и **Контейнеров**.
 
 *Компоненты* - это *"глупые"* компоненты React, в том смысле, что они ничего не знают о состоянии Redux. *Контейнеры* - *"умные"*, знают о состоянии и о том, что мы собираемся *подключиться* (*connect*) к "глупым" компонентам.
 
@@ -121,9 +121,9 @@ export default Message;
 
 ```
 
-Это примеры *"глупых"* компонентов. Они практически лишены логики и просто оборажают то, что потребуется путем передачи им **свойств** (props) React. Основное отличие `button.jsx` от `message.jsx`, в том, что последний содержит **действие** в качестве одного из параметров. Это действие срабатывет по событию `onClick`. В контексте нашего приложения, надпись `Button` никогда не будет изменяться, однако компонент `Message`  должен отражать состояние нашего приложения, и будет изменяться на основе этого.
+Это примеры *"глупых"* компонентов. Они практически лишены логики и просто оборажают то, что потребуется, путем передачи им **свойств** (props) React. Основное отличие `button.jsx` от `message.jsx`, в том, что последний содержит **действие** в качестве одного из параметров. Это действие срабатывет по событию `onClick`. В контексте нашего приложения, надпись `Button` никогда не будет изменяться, однако, компонент `Message`  должен отражать состояние нашего приложения и будет изменяться на основе этого.
 
-Опять же, *компоненты* ничего не знают о Redux **действиях** или о **состоянии** нашего приложения, вот почему мы собираемся создать "умные" **контейнеры** которые "подведут" нужные *действия* и *данные* к этим двум "глупым" компонентам. 
+Опять же, *компоненты* ничего не знают о Redux **действиях** или о **состоянии** нашего приложения. Вот почему мы собираемся создать "умные" **контейнеры** которые "подведут" нужные *действия* и *данные* к этим двум "глупым" компонентам. 
 
 - В `containers`, создайте следующие файлы:
 
-- 
GitLab


From e9c13b7c22d9fca2850fb59a90f71d5cfa1b6288 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Tue, 8 Nov 2016 00:46:43 +0700
Subject: [PATCH 30/73] pre-release

---
 README.md                                     | 24 ++++++++---------
 .../10-immutable-redux-improvements/README.md |  3 +--
 .../11-testing-mocha-chai-sinon/README.md     | 26 +++++++++----------
 tutorial/12-flow/README.md                    |  6 ++---
 tutorial/2-packages/README.md                 |  2 +-
 tutorial/4-es6-syntax-class/README.md         | 13 +++++-----
 tutorial/5-es6-modules-syntax/README.md       | 12 ++++-----
 tutorial/6-eslint/README.md                   | 22 ++++++++--------
 tutorial/7-client-webpack/README.md           |  2 +-
 tutorial/8-react/README.md                    |  2 +-
 tutorial/9-redux/README.md                    | 20 +++++++-------
 11 files changed, 66 insertions(+), 66 deletions(-)

diff --git a/README.md b/README.md
index dee43c4..3401419 100644
--- a/README.md
+++ b/README.md
@@ -13,14 +13,13 @@
 
 [![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch)
 
->Это русскоязычная версия руководства Джонатана Верекии (@verekia). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
+>Это русскоязычная версия руководства Джонатана Верекии ([@verekia](https://twitter.com/verekia)). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
 
-## Работа над переводом идет. Это не окончательная версия!
+## Перевод практически завершен. Идет правка текста.
 
-перевод терминов см. [Definitions.md](Definitions.md)
-
-[вопросы, замечания, предложения](https://github.com/UsulPro/js-stack-from-scratch/issues)
+[будем благодарны за помощь в обнаружении опечаток и неточностей](https://github.com/UsulPro/js-stack-from-scratch/issues)
 
+**Далее текст автора**
 
 Добро пожаловать в мое современное руководство по стеку технологий JavaScript: **Стек технологий JavaScript с нуля**
 
@@ -30,7 +29,7 @@
 
 Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить более глубокие знания по ним, изучайте их документацию или другие руководства.
 
-В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду, использующую React и на чем-то потренироваться, что бы подтянуть свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
+В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду, использующую React, и на чем-то потренироваться, что бы подтянуть свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
 
 Примеры кода имеются в каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждого раздела.
 
@@ -54,7 +53,7 @@
 
 [6 - ESLint](/tutorial/6-eslint)
 
-[7 - Клиентское приложение ~на основе Webpack~](/tutorial/7-client-webpack)
+[7 - Клиентское приложение на основе Webpack](/tutorial/7-client-webpack)
 
 [8 - React](/tutorial/8-react)
 
@@ -66,21 +65,22 @@
 
 [12 - Типизация с Flow](/tutorial/12-flow)
 
-## Далее следует
+## Далее планируется:
 
 Production / development окружение, Express, React Router, Серверный Рендеринг, Стилизация, Enzyme, Приемы Git.
 
 ## Переводы на другие языки
 
-- [Chinese](https://github.com/pd4d10/js-stack-from-scratch) by [@pd4d10](http://github.com/pd4d10)
-- [Italian](https://github.com/fbertone/js-stack-from-scratch) by [Fabrizio Bertone](https://github.com/fbertone)
+- [Китайский](https://github.com/pd4d10/js-stack-from-scratch) by [@pd4d10](http://github.com/pd4d10)
+- [Итальянский](https://github.com/fbertone/js-stack-from-scratch) by [Fabrizio Bertone](https://github.com/fbertone)
+- [Японский](https://github.com/takahashim/js-stack-from-scratch) by [@takahashim](https://github.com/takahashim)
 
 Если вы хотите добавить перевод на другой язык, пожалуйста читайте [рекомендации по переводу](/how-to-translate.md) чтобы начать!
 
-## Контакты
+## Сведения
 
 Создано [@verekia](https://twitter.com/verekia) – [verekia.com](http://verekia.com/).
 
-Переведено [@usulpro](https://github.com/UsulPro) - [sm-react](https://github.com/sm-react)
+Переведено [@usulpro](https://github.com/UsulPro) - [react-theming](https://github.com/sm-react/react-theming)
 
 Лицензия: MIT
diff --git a/tutorial/10-immutable-redux-improvements/README.md b/tutorial/10-immutable-redux-improvements/README.md
index 69c2d38..8e3f539 100644
--- a/tutorial/10-immutable-redux-improvements/README.md
+++ b/tutorial/10-immutable-redux-improvements/README.md
@@ -93,11 +93,10 @@ export const MAKE_BARK = 'MAKE_BARK';
 export const makeBark = createAction(MAKE_BARK, () => true);
 ```
 
-`redux-actions` основывается на молели [Flux Standard Action](https://github.com/acdlite/flux-standard-action),так же, как и действия, которые мы создавали до этого, так что интеграция `redux-actions` будет бесшовной, если вы придерживаетесь этой модели.
+`redux-actions` основывается на модели [Flux Standard Action](https://github.com/acdlite/flux-standard-action),так же, как и действия, которые мы создавали до этого, так что интеграция `redux-actions` будет бесшовной, если вы придерживаетесь этой модели.
 
 - Не забудьте запустить `yarn add redux-actions`.
 
 Следующий раздел: [11 - Тестировние с Mocha, Chai, и Sinon](/tutorial/11-testing-mocha-chai-sinon)
 
 Назад в [предыдущий раздел](/tutorial/9-redux) или [Содержание](/../../).
-
diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index 810d483..5cd74c5 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -6,7 +6,7 @@
 
 - В `src/test/client`, создайте файл `state-test.js` , в котором мы будем тестировать жизненный цикл нашего Redux приложеия.
 
-Мы будем использовать [Mocha](http://mochajs.org/) в качесве основного фреймворка для тестирования. Mocha прост в использовании, имеет множество возможностей, и на данный момент [самый популярный фреймворк для тестирования](http://stateofjs.com/2016/testing/). Он модульный и очень гибкий. В частности, он позволяет использовать любые библиотеки утверждений (assertion) на ваше пожелание. [Chai](http://chaijs.com/) - замечательная библиотека утверждений, имеющая много доступных [плагинов](http://chaijs.com/plugins/) и позволяющая вам выбирать между различными стилями утверждений.
+Мы будем использовать [Mocha](http://mochajs.org/) в качесве основного фреймворка для тестирования. Mocha прост в использовании, имеет множество возможностей, и на данный момент [самый популярный фреймворк для тестирования](http://stateofjs.com/2016/testing/). Он модульный и очень гибкий. В частности, он позволяет использовать любые библиотеки утверждений (assertion) по вашему желанию. [Chai](http://chaijs.com/) - замечательная библиотека утверждений, имеющая много доступных [плагинов](http://chaijs.com/plugins/) и позволяющая вам выбирать между различными стилями утверждений.
 
 - Установим Mocha и Chai выполним `yarn add --dev mocha chai`
 
@@ -44,9 +44,9 @@ describe('App State', () => {
 ```
 Хорошо, давайте все это проанализируем.
 
-Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, что бы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавили для него комментарий в начале чтобы отключить правило `no-unused-expressions` для этого файла.
+Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, что бы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавляем для него комментарий в начале, чтобы отключить правило `no-unused-expressions` для этого файла.
 
-Тесты Mocha устроены наподобие дерева. В нашем случае, мы хотим протестировать функцию `makeBark`, которая должна воздействовать на атрибут `dog` состояния нашего приложения, поэтому имеет смысл использовать следующую иерархию тестов: `App State > Dog > makeBark`, что мы и описали используя `describe()`. `it()`  - это собственно, тестирующая функция, а `beforeEach()` - это функция, вызываемая перед каждым вызовом теста `it()`. В нашем случае мы хотим иметь новую чистую версию хранилища перед запуском каждого теста. Мы обявили переменную `store` в начале файла, поскольку она нам пригодится в кадом тесте.
+Тесты Mocha устроены наподобие дерева. В нашем случае, мы хотим протестировать функцию `makeBark`, которая должна воздействовать на атрибут `dog` состояния нашего приложения, поэтому имеет смысл использовать следующую иерархию тестов: `App State > Dog > makeBark`, что мы и описали используя `describe()`. `it()`  - это собственно, тестирующая функция, а `beforeEach()` - это функция, вызываемая перед каждым вызовом теста `it()`. В нашем случае, мы хотим иметь новую чистую версию хранилища перед запуском каждого теста. Мы обявили переменную `store` в начале файла, поскольку она нам пригодится в каждом тесте.
 
 Тест `makeBark` вполне понятен, а строка с описанием в `it()` делает его еще яснее: мы проверяем, что `hasBarked` меняется с `false` на `true` после вызова  `makeBark`.
 
@@ -74,7 +74,7 @@ gulp.task('test', ['build'], () =>
 
 Как вы можете видеть, тесты запускаются на транспилированом коде из папки `lib`, вот почему задачу `test` предваряет запуск `build`. `build`,  в свою очередь, предваряется задачей `lint`, а сам `test` мы будем запускать перед `main`, что в итоге даст нам следующий каскад задач для `default`: `lint` > `build` > `test` > `main`.
 
-`build` also has a prerequisite, `lint`, and finally, we are making `test` a prerequisite of `main`, which gives us the following task cascade for the `default` task: `lint` > `build` > `test` > `main`.
+`build` also has a prerequisite, `lint`, and finally, we are making `test` a prerequisite of `main`, which gives us the following task cascade for the `default` task: `lint` > `build` > `test` > `main`. -удалить строчку?
 
 - Установите в `main` предварительный запуск команды `test`:
 
@@ -82,7 +82,7 @@ gulp.task('test', ['build'], () =>
 gulp.task('main', ['test'], () => /* ... */ );
 ```
 
-- В `package.json`, текущее значение скрипта `"test"` на следующее: `"test": "gulp test"`. Таким образом мы можем использовать `yarn test` чтобы просто запустить наши тесты. Так же `test` - это стандартный скрипт, который автоматически запускается такими инструментами, как, например, сервисы непрерывной интеграции (continuous integration services, CI), так что всегда добавляйте запуск тестов через него. `yarn start` также запустит тестирование перед построением сборки Webpack, так что сборка сгенерируется только если все тесты будут пройдены.
+- В `package.json`, замените текущее значение скрипта `"test"` на следующее: `"test": "gulp test"`. Таким образом мы можем использовать `yarn test`, чтобы просто запустить наши тесты. Так же `test` - это стандартный скрипт, который автоматически запускается такими инструментами, как, например, сервисы непрерывной интеграции (continuous integration services, CI), так что всегда добавляйте запуск тестов через него. `yarn start` также запустит тестирование перед построением сборки Webpack, так что сборка сгенерируется только если все тесты будут пройдены.
 
 - Запустите `yarn test` или `yarn start`, и должны будут выйти результаты ваших тестов, предпочтительно зеленые.
 
@@ -90,7 +90,7 @@ gulp.task('main', ['test'], () => /* ... */ );
 
 В некоторых случаях, мы хотим иметь возможность *эмулировать* некоторые вещи в юнит тестах. Например, давайте скажем, у нас есть функция `deleteEverything`, которая содержит вызов `deleteDatabases()`. Запуск `deleteDatabases()` вызовет много побочных эффектов, которые нам абсолютно не желательны, во время тестирования.
 
-[Sinon](http://sinonjs.org/) - библиотека тестирования, предлагающая **Заглушки** (и многие другие вещи), позволяет нейтрализовать `deleteDatabases` и просто мониторить ее не запуская на самом деле. Таким образом, к примеру, мы можем тестировать была ли она запущена или с какими параметрами она была запущена. Обычно, это очень полезно эмуляции или исключения AJAX вызовов, которые могут вызвать побочные эффекты на сервере. 
+[Sinon](http://sinonjs.org/) - библиотека тестирования, предлагающая **Заглушки** (и многие другие вещи), позволяет нейтрализовать `deleteDatabases` и просто мониторить ее, не запуская на самом деле. Таким образом, к примеру, мы можем проверить была ли она запущена или с какими параметрами она была запущена. Обычно, это очень полезно для эмуляции или исключения AJAX вызовов, которые могут вызвать побочные эффекты на сервере. 
 
 В рамках нашего приложения, мы добавим метод `barkInConsole` в класс `Dog` в файле `src/shared/dog.js`:
 
@@ -113,7 +113,7 @@ class Dog {
 
 export default Dog;
 ```
-Если мы запустим `barkInConsole` в нашем юнит тесте, то `console.log()` выведет что-то в терминал. Давайте мы будем это рассматривать, как нежелательный побочный эффект в рамках нашего юнит теста. Тем не менее мы желаем, знать была ли `console.log()` *нормально запущена*, и какие параметры были *переданы ей при вызове*.
+Если мы запустим `barkInConsole` в нашем юнит тесте, то `console.log()` выведет что-то в терминал. Давайте мы будем это рассматривать, как нежелательный побочный эффект в рамках нашего юнит теста. Тем не менее, мы желаем знать, была ли `console.log()` *нормально запущена*, и какие параметры были *переданы ей при вызове*.
 
 - Создайте новый файл `src/test/shared/dog-test.js` и добавьте туда следующее:
 
@@ -143,16 +143,16 @@ describe('Shared', () => {
 });
 ```
 
-Тут мы используем *заглушки* от Sinon и плагин для Chai, посволяющий использовать его утверждения на таких заглушках и им подобных.
+Тут мы используем *заглушки* от Sinon и плагин для Chai, позволяющий использовать его утверждения на и им подобных заглушках.
 
-- Запустите `yarn add --dev sinon sinon-chai` чтобы установить эти библиотеки.
+- Запустите `yarn add --dev sinon sinon-chai`, чтобы установить эти библиотеки.
 
-Что здесь нового? Ну прежде всего, мы вызываем `chai.use(sinonChai)`, чтобы активировать плагин для Chai. Затем, вся магия происходит внутри `it()`: `stub(console, 'log')` нейтрализует `console.log` и следит за ней. Когда `new Dog('Test Toby').barkInConsole()` выполнен, `console.log` должна была бы сработать. Мы проверяем этот вызов `console.log` с помощью `console.log.should.have.been.calledWith()`, а затем, восстанавливаем с помощью `restore` нейтрализированную `console.log`, чтобы позволить ей дальше работать нормльно.
+Что здесь нового? Ну прежде всего, мы вызываем `chai.use(sinonChai)`, чтобы активировать плагин для Chai. Затем, вся магия происходит внутри `it()`: `stub(console, 'log')` нейтрализует `console.log` и следит за ней. Во время выполнения `new Dog('Test Toby').barkInConsole()`, `console.log` должна была бы сработать. Мы проверяем этот вызов `console.log` с помощью `console.log.should.have.been.calledWith()`, а затем, восстанавливаем с помощью `restore` нейтрализированную `console.log`, чтобы позволить ей дальше работать нормльно.
 
-**Важное замечание**: Заглушать `console.log` не рекомендуется, потому, что если тест провалится, то `console.log.restore()` никогда не запустится, и следовательно `console.log` останется неисправной для всех остальных команд, выполняемых в терминале. При этом даже не выйдет сообщения об ошибке прохождения теста, так что вы останетесь с очень малой информацией о том, что же произошло. Это может оказаться достаточно не приятно. Тем не менее, это хороший пример, иллюстрирующий применение заглушек в этом простом приложении.
+**Важное замечание**: Заглушать `console.log` не рекомендуется, потому что, если тест провалится, то `console.log.restore()` никогда не запустится, и следовательно `console.log` останется неисправной для всех остальных команд, выполняемых в терминале. При этом, даже не выйдет сообщения об ошибке прохождения теста, так что вы останетесь с очень малой информацией о том, что же произошло. Это может оказаться достаточно не приятно. Тем не менее, это хороший пример, иллюстрирующий применение заглушек в этом простом приложении.
 
-Если в этом разделе прошло хорошо, то у вас должно быть два пройденых теста.
+Если в этом разделе все прошло хорошо, то у вас должно быть два пройденых теста.
 
 Следующий раздел:  [12 - Типизация с Flow](/tutorial/12-flow)
 
-Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
\ No newline at end of file
diff --git a/tutorial/12-flow/README.md b/tutorial/12-flow/README.md
index cfcf5c1..9aa06db 100644
--- a/tutorial/12-flow/README.md
+++ b/tutorial/12-flow/README.md
@@ -57,7 +57,7 @@ class Dog {
 export default Dog;
 ```
 
-Комментарий `// @flow` говорит Flow, что мы хотим проверять типы для этого файла. Сами анатации Flow предваряються двоеточием и обычно добавляються после параметра функции или имени функции. Подробности смотрите в документации.
+Комментарий `// @flow` говорит Flow, что мы хотим проверять типы для этого файла. Сами аннотации Flow предваряются двоеточием и обычно добавляются после параметра функции или имени функции. Подробности смотрите в документации.
 
 Теперь, если вы запустите `yarn start`, Flow будет работать, но ESLint начнет жаловаться, что используется нестандартный синтаксис. 
 Поскольку парсер Babel отлично справляется с парсингом Flow контента (благодаря установленному нами плагину `babel-preset-flow`), было бы здорово, если бы ESLint мог опираться на парсер Babel, вместо того, чтобы пытаться самому понять аннотации Flow. Это возможно при использовании пакета `babel-eslint`. Давайте сделаем это.
@@ -78,7 +78,7 @@ export default Dog;
 
 - Теперь вы можете добавить `// @flow` в каждый `.js` и `.jsx` файл в папке `src`, запустить `yarn test` или `yarn start`, и добавлять аннотации везде, где этого попросит Flow.
 
-Вы можете обнаружить неожиданный случай (результат) в `src/client/component/message.jsx`: (предлажение кривое надо заменить - неожиданную проблему?)
+Вы можете обнаружить неожиданный пример в `src/client/component/message.jsx`:
 
 ```javascript
 const Message = ({ message }: { message: string }) => <div>{message}</div>;
@@ -106,4 +106,4 @@ import * as Immutable from 'immutable';
 
 Теперь, у вас есть "пуленепробиваемый" код, который проанализирован, протипизирован и протестирован - отличная работа!
 
-Назад в [предыдущий раздел](/tutorial/11-testing-mocha-chai-sinon) или [Содержание](/README.md).
+Назад в [предыдущий раздел](/tutorial/11-testing-mocha-chai-sinon) или [Содержание](/README.md).
\ No newline at end of file
diff --git a/tutorial/2-packages/README.md b/tutorial/2-packages/README.md
index 83ef30e..d5ebf1e 100644
--- a/tutorial/2-packages/README.md
+++ b/tutorial/2-packages/README.md
@@ -6,7 +6,7 @@
 
 Откройте `package.json`, чтобы увидеть, как Yarn автоматически добавил `color` в  `dependencies` (зависимости).
 
-Сам пакет находится в созданной для него папке `node_modules`.
+Сам пакет находится в созданной папке `node_modules`, в которой хранятся импортируемые пакеты.
 
 - Добавьте `node_modules/` в файл `.gitignore` (и запустите `git init`, чтобы создать новый репозиторий, если вы еще этого не сделали)
 
diff --git a/tutorial/4-es6-syntax-class/README.md b/tutorial/4-es6-syntax-class/README.md
index 64ab11e..f976a31 100644
--- a/tutorial/4-es6-syntax-class/README.md
+++ b/tutorial/4-es6-syntax-class/README.md
@@ -1,6 +1,6 @@
-# 4 - Использование ES6 синтактиса ~~и классов~~
+# 4 - Использование ES6 классов
 
-- Создайте новый файл, `src/dog.js`, содержащий сделующий ES6 класс:
+- Создайте новый файл `src/dog.js`, содержащий следующий ES6 класс:
 
 ```javascript
 class Dog {
@@ -16,9 +16,9 @@ class Dog {
 module.exports = Dog;
 ```
 
-Это не должно вас смущать, если вы сталкивались с ООП в любом другом языке программирования, хотя в JavaScript  классы появились относительно недавно. Класс взаимодействует с окружающим миром, путем определения `module.exports`.
+Это не должно вас смутить, если вы сталкивались с ООП в любом другом языке программирования, хотя в JavaScript  классы появились относительно недавно. Класс взаимодействует с окружающим миром, путем определения `module.exports`.
 
-Обычно в ES6 коде присутствуют классы, `const` и `let`, "шаблонные строки" (в обратных кавычках) как в функции `bark()` и стрелочные функции (`(param) => { console.log('Hi'); }`), хотя мы их не используем в нашем примере.
+Обычно в ES6 коде присутствуют классы, `const` и `let`, "шаблонные строки" (в обратных кавычках) как в функции `bark()` и стрелочные функции (`(param) => { console.log('Hi'); }`) (последнее мы не используем в нашем примере).
 
 В `src/index.js`, напишите следующее:
 
@@ -29,11 +29,12 @@ const toby = new Dog('Toby');
 
 console.log(toby.bark());
 ```
-Как вы можете видеть в отличие от ~~community-made~~ пакета `color`, который мы использовали ранее, когда мы подключаем один из наших файлов, мы используем `./` в `require()`.
+
+Как вы видите, в отличие от созданного сообществом пакета `color`, который мы использовали ранее, когда мы подключаем один из наших файлов, мы используем `./` в `require()`.
 
 - Запустите `yarn start` и должно отобразиться 'Wah wah, I am Toby'.
 
-- Посмотрите на код сгенерированный в директории `lib`, чтобы увидеть как он выглядит в скомпилированном виде (`var` вместо `const`, например).
+- Посмотрите на код сгенерированный в директории `lib`, чтобы увидеть как он выглядит в скомпилированном виде (например `var` вместо `const`).
 
 
 Следующий раздел: [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 14018d2..4b5ccdf 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -4,7 +4,7 @@
 
 В `dog.js`, мы также заменим `module.exports = Dog` на `export default Dog`.
 
-Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, вместо этого, можно напрямую экспортировать анонимный класс таким образом: 
+Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, можно напрямую экспортировать анонимный класс. Таким образом:  
 
 ```javascript
 export default class {
@@ -18,17 +18,17 @@ export default class {
 }
 ```
 
-Вы возможно уже догадались, что имя 'Dog' используется в `import` в `index.js` совершенно по вашему усмотрению. Вполне будет работать:
+ВВы возможно уже догадались, что имя 'Dog' используется в строке`import` файла `index.js` абсолютно по вашему усмотрению. Вполне будет работать:
 
 ```javascript
 import Cat from './dog';
 
 const toby = new Cat('Toby');
 ```
-Очевидно, что в основном вы будете всегда использовать тоже имя что и имя класса/модуля которого вы импортируете.
-Случай, когда вы не будете делать так, это когда мы ~~использовали~~ `const babel = require('gulp-babel')` в нашем Gulp файле.
+Очевидно, что в основном вы будете использовать тоже имя, что и имя класса/модуля который вы импортируете.
+Один из примеров когда можно сделать по-другому, это то как мы применили `const babel = require('gulp-babel')` в нашем Gulp файле.
 
-Так что насчет тех `require()` в нашем `gulpfile.js`? Можем мы использовать `import` вместо них? Последняя версия Node поддерживает большую часть возможностей ES6, но не ES6 модули пока-что. К счастью для нас, Gulp способен призывать Babel на помощь. Если мы переименуем наш `gulpfile.js` в `gulpfile.babel.js`, Babel позаботится о передаче импортируемых через `import` модулей в Gulp.
+Так что насчет `require()` в нашем `gulpfile.js`? Можем ли мы использовать вместо них `import` ? Последняя версия Node поддерживает большую часть возможностей ES6, но пока что не ES6 модули. К счастью для нас, Gulp способен призывать Babel на помощь. Если мы переименуем наш `gulpfile.js` в `gulpfile.babel.js`, Babel позаботится о передаче импортируемых через `import` модулей в Gulp.
 
 - Переименуйте ваш `gulpfile.js` в `gulpfile.babel.js`
 
@@ -43,7 +43,7 @@ import { exec } from 'child_process';
 
 Обратите внимение на "синтаксический сахар", позволяющий получать `exec` напрямую из `child_process`. Довольно элегантно!
 
-- `yarn start` должно по прежнему выводить "Wah wah, I am Toby".
+- `yarn start` должно по прежнему выдавать "Wah wah, I am Toby".
 
 Следующий раздел: [6 - ESLint](/tutorial/6-eslint)
 
diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index aeecc4e..c021ecb 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -1,12 +1,12 @@
 # 6 - ESLint
 
-Мы собираемся контролировать качество кода (англ. lint - прим. переводчика) чтобы перехватывать потенциальные проблемы. ESLint - предпочтительный анализатор кода (англ. linter - прим. переводчика) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
+Мы собираемся контролировать качество кода (англ. lint - прим. переводчика), чтобы перехватывать потенциальные проблемы. ESLint - наиболее предпочтительный анализатор кода (англ. linter - прим. переводчика) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
 
 - Запустите `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
 
 Как вы видите, вы можете установить несколько пакетов одной командой. Как обычно, они все добавятся в ваш `package.json`.
 
-В `package.json`, добавьте свойство `eslintConfig` с таким содержанием:
+В `package.json`, добавьте свойство `eslintConfig` со следующим содержанием:
 ```json
 "eslintConfig": {
   "extends": "airbnb",
@@ -15,11 +15,11 @@
   ]
 },
 ```
-В разделе `plugins` мы сообщаем ESLint что используем синтакисис ES6 `import`.
+В разделе `plugins` мы сообщаем ESLint, что используем синтакисис ES6 `import`.
 
-**Замечание**: Вместо свойства `eslintConfig` в `package.json` можно использовать файл `.eslintrc.js` в корне вашего проекта. Так же как и с конфигурацией Babel, мы стараемся избегать загромождения корневой директории большим количеством файлов, но если у вас сложная конфигурация ESLint, рассмотрите такую альтернативу.
+**Примечание**: Вместо свойства `eslintConfig` в `package.json` можно использовать файл `.eslintrc.js` в корне вашего проекта. Так же как и с конфигурацией Babel, мы стараемся избегать загромождения корневой директории большим количеством файлов, но если у вас сложная конфигурация ESLint, рассмотрите такую альтернативу.
 
-Мы создадим задачу для Gulp, которая запускает ESLint для нас. Поэтому установим также плагин ESLint для Gulp:
+Создадим задачу для Gulp, которая будет запускать ESLint. Поэтому установим плагин ESLint для Gulp: (Для этого также установим плагин ESLint для Gulp)
 
 - запустите `yarn add --dev gulp-eslint`
 
@@ -47,7 +47,7 @@ gulp.task('lint', () => {
 });
 ```
 
-Здесь мы говорм Gulp, что для этой задачи мы хотим подключить `gulpfile.babel.js` и JS файлы, расположенные в `src`.
+Здесь мы сообщаем Gulp, что для этой задачи хотим подключить `gulpfile.babel.js` и JS файлы, расположенные в `src`.
 
 Откорректируйте задачу `build` так, чтобы `lint` предваряла ее запуск:
 
@@ -57,9 +57,9 @@ gulp.task('build', ['lint', 'clean'], () => {
 });
 ```
 
-- Запустите `yarn start`. Вы должны увидеть набор ошибок кода (англ. linting errors - прим. переводчика) в этом Gulp-файле и предупреждений об использовании `console.log()` в `index.js`.
+- Запустите `yarn start`. Вы должны увидеть набор ошибок кода (англ. linting errors - прим. переводчика) в этом Gulp-файле и предупреждения об использовании `console.log()` в `index.js`.
 
-Один из видов ошибок будет: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в ~~скомпилированное приложение~~ (англ. build - прим. переводчика ) а какие нет. Поэтому мы немного поможем ESLint используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
+Один из видов ошибок будет выглядить следующим образом: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в ~~скомпилированное приложение~~ (англ. build - прим. переводчика ) а какие нет. Поэтому мы немного поможем ESLint используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
 
 ```javascript
 /* eslint-disable import/no-extraneous-dependencies */
@@ -75,13 +75,13 @@ gulp.task('build', ['lint', 'clean'], () => {
 }
 ```
 
-Это нужно переписать так:
+Это нужно переписать следующим образом:
 
 ```javascript
 () => 1
 ```
 
-Потому что, когда в ES6 функция содержит только возвращаемое выражение, вы можете опустить фигурные скобки, оператор return и точку с запятой.
+Потому что, когда в ES6 функция содержит только возвращаемое выражение, можно опустить фигурные скобки, оператор return и точку с запятой.
 
 Так что давайте обновим Gulp-файл соответственно:
 
@@ -109,7 +109,7 @@ gulp.task('build', ['lint', 'clean'], () =>
 
 - Запустите `yarn start` - теперь все снова без ошибок.
 
-**Замечание**: В этой части мы работали с ESLint через консоль. Это хорошо для поиска ошибок во время компиляции / перед ~~публикацией~~, но вы, так же, возможно, захотите интегрировать его в вашу IDE. НЕ ИСПОЛЬЗУЙТЕ встроенный в вашу среду анализатор кода для ES6. Сконфигурируйте ее так, чтобы для этого использовались модули, расположенные в директории `node_modules`. В этом случае будут использоваться все настройки вашего проекта, правила Airbnb и так далее. Иначе, вы получите лишь усредненный ES6 анализатор.
+**Примечание**: В этой части мы работали с ESLint через консоль. Это хорошо для поиска ошибок во время компиляции / перед ~~публикацией~~, но вы, так же, возможно, захотите интегрировать его в вашу IDE. НЕ ИСПОЛЬЗУЙТЕ встроенный в вашу среду анализатор кода для ES6. Сконфигурируйте ее так, чтобы для этого использовались модули, расположенные в директории `node_modules`. В этом случае будут использоваться все настройки вашего проекта, правила Airbnb и так далее. Иначе, вы получите лишь усредненный ES6 анализатор.
 
 
 Следующий раздел: [7 - Клиентское приложение ~на основе Webpack~](/tutorial/7-client-webpack)
diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index 896ce7e..365cc2d 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -1,4 +1,4 @@
-# 7 - Клиентское приложение ~на основе Webpack~
+# 7 - Клиентское приложение на основе Webpack
 
 ## Структура нашего приложения
 
diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index d2db020..0f9f67f 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -59,4 +59,4 @@ clientEntryPoint: 'src/client/app.jsx',
 
 Следующий раздел: [9 - Redux](/tutorial/9-redux)
 
-Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
\ No newline at end of file
diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index 7e2c73c..4d30928 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -8,9 +8,9 @@
 
 Редюсеры воздествуют на состояние приложения (**хранилище**), и когда состояние приложения изменяется, что-то происходит в вашем приложении. Хорошая визуальная демонстрация Redux находится [здесь](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
 
-Для того, чтобы продемонстрировать использование Redux наиболее доступным способом, наше приложение будет состоять и сообщения и кнопки. Сообщение будет показывать лает собака или нет (изначально - нет), а кнопка будет заставлять ее лаять, что должно будет отразиться в сообщении.
+Для того, чтобы продемонстрировать использование Redux наиболее доступным способом, наше приложение будет состоять из сообщения и кнопки. Сообщение будет показывать лает собака или нет (изначально - нет), а кнопка будет заставлять ее лаять, что должно будет отражаться в сообщении.
 
-Нам потребуется два пакета в этой части: `redux` и `react-redux`.
+В этой части нам потребуется два пакета: `redux` и `react-redux`.
 
 - Запустите `yarn add redux react-redux`.
 
@@ -49,9 +49,9 @@ const dogReducer = (state = initialState, action) => {
 export default dogReducer;
 ```
 
-Здесь мы определили исходное состояние приложения, являющееся объектом, содержащим свойство `hasBarked`, установленное в `false`, и `dogReducer` - функцию, ответсвенную за перемену состояния в зависимости от того, какое действие произошло. Состояние не может быть изменено в этой функции, но должн быть возвращен совершенно новый объект состояния.
+Здесь мы определили исходное состояние приложения, являющееся объектом, содержащим свойство `hasBarked`, установленное в `false`, и `dogReducer` - функцию, ответсвенную за перемену состояния, в зависимости от того, какое действие произошло. Состояние не может быть изменено в этой функции, но должен быть возвращен совершенно новый объект состояния.
 
-- Изменим `app.jsx` чтобы создать *хранилище*. Можете заменить весь файл следующим содержимым:
+- Изменим `app.jsx`, чтобы создать *хранилище*. Можете заменить весь файл следующим содержимым:
 
 ```javascript
 import React from 'react';
@@ -77,13 +77,13 @@ ReactDOM.render(
 );
 ```
 
-Наше хранилище создано функцией Redux `createStore`, вполне наглядно. Объект хранилища собирается путем комбинирования всх редюсеров (в нашем случае одного) с помощью функции Redux `combineReducers`. Каждый редюсер в ней имеет имя, наш назовем `dog`.
+Наше хранилище создано функцией Redux `createStore`, вполне наглядно. Объект хранилища собирается путем комбинирования всех редюсеров (в нашем случае одного) с помощью функции Redux `combineReducers`. Каждый редюсер в ней имеет имя, наш назовем `dog`.
 
 Мы сделали достаточно, в части, относящейся к чистому Redux.
 
-Теперь мы подключим Redux к React, используя пакет `react-redux`. Для того, чтобы `react-redux`, могу передать хранилище в наше приложения на React, нам нужно обернуть все приложение в компонент `<Provider>`. Этот компонент должен содержать единственный дочерний элемент, так что мы добавли `<div>`, и этот `<div>` содержит два основных элемента нашего приложения: `BarkMessage` и `BarkButton`.
+Теперь мы подключим Redux к React, используя пакет `react-redux`. Для того, чтобы `react-redux`, мог передать хранилище в наше приложение на React, нам нужно обернуть все приложение в компонент `<Provider>`. Этот компонент должен содержать единственный дочерний элемент, так что мы добавли `<div>`, и этот `<div>` содержит два основных элемента нашего приложения: `BarkMessage` и `BarkButton`.
 
-Как вы могли заметить в разделе `import`, мы импортируем `BarkMessage` and `BarkButton` из директории `containers`. Сейчас самое время представить концепцию **Компонентов** и **Контейнеров**.
+Как вы могли заметить, в разделе `import`, мы импортируем `BarkMessage` and `BarkButton` из директории `containers`. Сейчас самое время представить концепцию **Компонентов** и **Контейнеров**.
 
 *Компоненты* - это *"глупые"* компоненты React, в том смысле, что они ничего не знают о состоянии Redux. *Контейнеры* - *"умные"*, знают о состоянии и о том, что мы собираемся *подключиться* (*connect*) к "глупым" компонентам.
 
@@ -121,9 +121,9 @@ export default Message;
 
 ```
 
-Это примеры *"глупых"* компонентов. Они практически лишены логики и просто оборажают то, что потребуется путем передачи им **свойств** (props) React. Основное отличие `button.jsx` от `message.jsx`, в том, что последний содержит **действие** в качестве одного из параметров. Это действие срабатывет по событию `onClick`. В контексте нашего приложения, надпись `Button` никогда не будет изменяться, однако компонент `Message`  должен отражать состояние нашего приложения, и будет изменяться на основе этого.
+Это примеры *"глупых"* компонентов. Они практически лишены логики и просто оборажают то, что потребуется, путем передачи им **свойств** (props) React. Основное отличие `button.jsx` от `message.jsx`, в том, что последний содержит **действие** в качестве одного из параметров. Это действие срабатывет по событию `onClick`. В контексте нашего приложения, надпись `Button` никогда не будет изменяться, однако, компонент `Message`  должен отражать состояние нашего приложения и будет изменяться на основе этого.
 
-Опять же, *компоненты* ничего не знают о Redux **действиях** или о **состоянии** нашего приложения, вот почему мы собираемся создать "умные" **контейнеры** которые "подведут" нужные *действия* и *данные* к этим двум "глупым" компонентам. 
+Опять же, *компоненты* ничего не знают о Redux **действиях** или о **состоянии** нашего приложения. Вот почему мы собираемся создать "умные" **контейнеры** которые "подведут" нужные *действия* и *данные* к этим двум "глупым" компонентам. 
 
 - В `containers`, создайте следующие файлы:
 
@@ -161,4 +161,4 @@ export default connect(mapStateToProps)(Message);
 
 Следующий раздел: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
 
-Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
\ No newline at end of file
-- 
GitLab


From e2de4f192f6c6045b02512a1bf30e9a975675dfb Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Tue, 8 Nov 2016 00:49:39 +0700
Subject: [PATCH 31/73] pre-release 2

---
 tutorial/12-flow/README.md              | 2 +-
 tutorial/4-es6-syntax-class/README.md   | 2 +-
 tutorial/5-es6-modules-syntax/README.md | 2 +-
 tutorial/6-eslint/README.md             | 2 +-
 tutorial/7-client-webpack/README.md     | 2 +-
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/tutorial/12-flow/README.md b/tutorial/12-flow/README.md
index 9aa06db..f9de5bf 100644
--- a/tutorial/12-flow/README.md
+++ b/tutorial/12-flow/README.md
@@ -106,4 +106,4 @@ import * as Immutable from 'immutable';
 
 Теперь, у вас есть "пуленепробиваемый" код, который проанализирован, протипизирован и протестирован - отличная работа!
 
-Назад в [предыдущий раздел](/tutorial/11-testing-mocha-chai-sinon) или [Содержание](/README.md).
\ No newline at end of file
+Назад в [предыдущий раздел](/tutorial/11-testing-mocha-chai-sinon) или [Содержание](/../../).
\ No newline at end of file
diff --git a/tutorial/4-es6-syntax-class/README.md b/tutorial/4-es6-syntax-class/README.md
index f976a31..ea2f82d 100644
--- a/tutorial/4-es6-syntax-class/README.md
+++ b/tutorial/4-es6-syntax-class/README.md
@@ -39,4 +39,4 @@ console.log(toby.bark());
 
 Следующий раздел: [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
 
-Назад в [предыдущий раздел](/tutorial/3-es6-babel-gulp) или [Содержание](/README.md).
+Назад в [предыдущий раздел](/tutorial/3-es6-babel-gulp) или [Содержание](/../../).
diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 4b5ccdf..55818ac 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -47,4 +47,4 @@ import { exec } from 'child_process';
 
 Следующий раздел: [6 - ESLint](/tutorial/6-eslint)
 
-Назад в [предыдущий раздел](/tutorial/4-es6-syntax-class) или [Содержание](/README.md).
+Назад в [предыдущий раздел](/tutorial/4-es6-syntax-class) или [Содержание](/../../).
diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index c021ecb..5374caf 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -114,4 +114,4 @@ gulp.task('build', ['lint', 'clean'], () =>
 
 Следующий раздел: [7 - Клиентское приложение ~на основе Webpack~](/tutorial/7-client-webpack)
 
-Назад в [предыдущий раздел](/tutorial/5-es6-modules-syntax) или [Содержание](/README.md).
+Назад в [предыдущий раздел](/tutorial/5-es6-modules-syntax) или [Содержание](/../../).
diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index 365cc2d..4577e48 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -193,4 +193,4 @@ gulp.task('clean', () => del([
 
 Следующий раздел: [8 - React](/tutorial/8-react)
 
-Назад в [предыдущий раздел](/tutorial/6-eslint) или [Содержание](/README.md).
+Назад в [предыдущий раздел](/tutorial/6-eslint) или [Содержание](/../../).
-- 
GitLab


From 658dd74b04adc75bf9162a3138c7059af90f39bb Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 19:22:03 +0700
Subject: [PATCH 32/73] Update README.md

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 3401419..14b288d 100644
--- a/README.md
+++ b/README.md
@@ -27,9 +27,9 @@
 
 Конечно, вам не нужны все эти технологии, если вы делаете простую веб страницу с парой JS функций (достаточно комбинаци Babel + jQuery), но если вы собираетесь создать масштабируемое веб приложение, и вам нужно все правильно настроить, то это руководство отлично вам подходит.
 
-Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить более глубокие знания по ним, изучайте их документацию или другие руководства.
+Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить по ним более глубокие знания, изучайте их документацию или другие руководства.
 
-В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду, использующую React, и на чем-то потренироваться, что бы подтянуть свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
+В большой части технологий, описываемых здесь, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду, использующую React, и на чем-то потренироваться, что бы подтянуть свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
 
 Примеры кода имеются в каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждого раздела.
 
-- 
GitLab


From e7f527ce13eff8bd90396167de3df48beb28b3c7 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 19:28:52 +0700
Subject: [PATCH 33/73] Update README.md

---
 tutorial/1-node-npm-yarn-package-json/README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index da7272c..3918d7a 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -20,7 +20,7 @@ sudo apt-get install -y nodejs
 
 [Yarn](https://yarnpkg.com/) - еще один менеджер пакетов. Он намного быстрее чем NPM, поддерживает работу офлайн и [лучше предугадывает](https://yarnpkg.com/en/docs/yarn-lock) подгрузку нужных зависимостей. С момента его [выхода](https://code.facebook.com/posts/1840075619545360) в Октябре 2016, он был очень быстро принят сообществом и постепенно становится лучшим решением для JavaScript. В данном руководстве мы будем использовать Yarn. Если вы предпочетаете оставаться с NPM, просто замените все команды `yarn add` и `yarn add --dev` на `npm install --save` и `npm install --dev` в этом пособии.
 
-- Установите Yarn следуя [инструкциям](https://yarnpkg.com/en/docs/install). Проще всего это сделать через `npm install -g yarn` или `sudo npm install -g yarn` (Верно, мы используем NPM чтобы установить Yarn, все равно, что использовать Internet Explorer или Safari чтобы установить Chrome!).
+- Установите Yarn следуя [инструкциям](https://yarnpkg.com/en/docs/install). Проще всего это сделать через `npm install -g yarn` или `sudo npm install -g yarn` (Верно, мы используем NPM, чтобы установить Yarn, все равно, что использовать Internet Explorer или Safari, чтобы установить Chrome!).
 
 - Создайте новую директорию для работы и зайдите (`cd`) в нее.
 - Запустите `yarn init` и ответьте на вопросы, чтобы создать файл `package.json` автоматически (`yarn init -y` чтобы пропустить вопросы).
@@ -29,7 +29,7 @@ sudo apt-get install -y nodejs
 
 Команда `node .` - слегка низкоуровневая для запуска программ. Вместо нее, мы будем использовать NPM/Yarn скрипты, чтобы запускать выполнение нужного кода. Это даст нам хороший уровень абстракции, позволяющий всегда использовать `yarn start`, даже когда наша программа станет более сложной.
 
-- В файле `package.json`, в корневом объекте создайте объект `scripts`, чтоб было так:
+- В файле `package.json`, в корневом объекте создайте объект `scripts`, чтобы было так:
 
 ```
 "scripts": {
-- 
GitLab


From 8b08968394a38be984a8d52f1e1498bb7bb276fc Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 19:54:35 +0700
Subject: [PATCH 34/73] Update README.md

---
 tutorial/3-es6-babel-gulp/README.md | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/tutorial/3-es6-babel-gulp/README.md b/tutorial/3-es6-babel-gulp/README.md
index 40a2bfd..b3c8931 100644
--- a/tutorial/3-es6-babel-gulp/README.md
+++ b/tutorial/3-es6-babel-gulp/README.md
@@ -5,7 +5,7 @@
 - Запустите `yarn add --dev gulp`
 - Запустите `yarn add --dev gulp-babel`
 - Запустите `yarn add --dev babel-preset-latest`
-- В `package.json`, добавьте поле `babel` для конфигурации Babel. Укажем, что хотим использовать новейшую конфигурацию Babel,следующим образом:
+- В `package.json` добавьте поле `babel` для конфигурации Babel. Укажем, что хотим использовать новейшую конфигурацию Babel, следующим образом:
 
 ```json
 "babel": {
@@ -73,8 +73,8 @@ Gulp, сам по себе, имеет довольно понятный API. О
 Затем мы определили пять задач: `build` *(создать)*, `clean` *(очистить)*, `main` *(основная)*, `watch` *(наблюдать)*, and `default` *(по умолчанию)*.
 
 - `build` вызывает Babel, чтобы преобразовать все исходные файлы из `src`, и записывает результат в `lib`.
-- `clean` - задача, которая просто удаляет всю нашу автоматически сгенерированную директорию `lib` перед каждым `build`. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то в `src`) для того, чтобы быть уверенным, что директория `lib` всегда синхронна с `src`, даже если `build` не завершился успешно, а вы этого не заметили. Мы используем пакет `del` чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это [рекомендованый](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) для Gulp способ)
-- `main` - аналогично запуску `node .` из предыдущией части, за исключением того, что теперь мы используем `lib/index.js`. Мы можем просто писать `node lib`, потому что по умолчанию Node найдет и запустит `index.js` из указанной папки (мы используем переменную `libDir` чтоб соответствовать принципу DRY). `require('child_process').exec` и `exec` - это функции самого Node, вызывающие консольные команды. Мы перенаправим `stdout` в `console.log()` и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается в `gulp.task` в качестве аргумента. Не переживайте, если эта команда не совсем ясна для вас, помните, что эта задача просто лишь запускает `node lib`.
+- `clean` - задача, которая просто удаляет всю нашу автоматически сгенерированную директорию `lib` перед каждым `build`. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то в `src`) для того, чтобы быть уверенным, что директория `lib` всегда синхронна с `src`, даже если `build` не завершился успешно, а вы этого не заметили. Мы используем пакет `del`, чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это [рекомендованый](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) для Gulp способ)
+- `main` - аналогично запуску `node .` из предыдущией части, за исключением того, что теперь мы используем `lib/index.js`. Мы можем просто писать `node lib`, потому что по умолчанию Node найдет и запустит `index.js` из указанной папки (мы используем переменную `libDir`, чтобы соответствовать принципу DRY). `require('child_process').exec` и `exec` - это функции самого Node, вызывающие консольные команды. Мы перенаправим `stdout` в `console.log()` и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается в `gulp.task` в качестве аргумента. Не переживайте, если эта команда не совсем ясна для вас, помните, что эта задача просто запускает `node lib`.
 - `watch` запускает задчу `main`, когда происходят изменения файловой системы для указанных файлов.
 - `default` - это специальная задача, которая запускается, если вы просто вызываете `gulp` из CLI (коммандной строки). В нашем случае, мы хотим сначала запустить `main` (один раз), а затем `watch`.
 
@@ -83,7 +83,7 @@ Gulp, сам по себе, имеет довольно понятный API. О
 Отлично! Посмотрим как это работает.
 
 - В `package.json`, замените скрипт `start` на: `"start": "gulp"`.
-- Запустите `yarn start`. Должно вывестись "Hello ES6" и запустится автоматическое отслеживание изменений. Попробуйте ввести неверный код в `src/index.js` и увидите после сохранения, как  Gulp автоматически указывает на ошибку.
+- Запустите `yarn start`. Должно выйти "Hello ES6" и запуститься автоматическое отслеживание изменений. Попробуйте ввести неверный код в `src/index.js` и увидите после сохранения, как  Gulp автоматически указывает на ошибку.
 
 - Добавьте `/lib/` в `.gitignore`
 
-- 
GitLab


From 8a1fcf13e7f5fb22fd80da80941efc84fbce7803 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 20:12:01 +0700
Subject: [PATCH 35/73] Update README.md

---
 tutorial/5-es6-modules-syntax/README.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 55818ac..1c5257a 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -4,7 +4,7 @@
 
 В `dog.js`, мы также заменим `module.exports = Dog` на `export default Dog`.
 
-Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, можно напрямую экспортировать анонимный класс. Таким образом:  
+Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, можно напрямую экспортировать анонимный класс. Таким образом:  (Поэтому, можно напрямую экспортировать анонимный класс следующим образом:)
 
 ```javascript
 export default class {
@@ -18,7 +18,7 @@ export default class {
 }
 ```
 
-ВВы возможно уже догадались, что имя 'Dog' используется в строке`import` файла `index.js` абсолютно по вашему усмотрению. Вполне будет работать:
+Вы, возможно, уже догадались, что имя 'Dog' используется в строке`import` файла `index.js` абсолютно по вашему усмотрению. Вполне будет работать:
 
 ```javascript
 import Cat from './dog';
@@ -43,7 +43,7 @@ import { exec } from 'child_process';
 
 Обратите внимение на "синтаксический сахар", позволяющий получать `exec` напрямую из `child_process`. Довольно элегантно!
 
-- `yarn start` должно по прежнему выдавать "Wah wah, I am Toby".
+- `yarn start` должно по-прежнему выдавать "Wah wah, I am Toby".
 
 Следующий раздел: [6 - ESLint](/tutorial/6-eslint)
 
-- 
GitLab


From 99c99520942a0109c4a607fa44f2c75c185029b0 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 20:24:36 +0700
Subject: [PATCH 36/73] Update README.md

---
 tutorial/6-eslint/README.md | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index 5374caf..d733e14 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -1,6 +1,6 @@
 # 6 - ESLint
 
-Мы собираемся контролировать качество кода (англ. lint - прим. переводчика), чтобы перехватывать потенциальные проблемы. ESLint - наиболее предпочтительный анализатор кода (англ. linter - прим. переводчика) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
+Мы собираемся контролировать качество кода (lint), чтобы перехватывать потенциальные проблемы. ESLint - наиболее предпочтительный анализатор кода (linter) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
 
 - Запустите `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
 
@@ -19,7 +19,7 @@
 
 **Примечание**: Вместо свойства `eslintConfig` в `package.json` можно использовать файл `.eslintrc.js` в корне вашего проекта. Так же как и с конфигурацией Babel, мы стараемся избегать загромождения корневой директории большим количеством файлов, но если у вас сложная конфигурация ESLint, рассмотрите такую альтернативу.
 
-Создадим задачу для Gulp, которая будет запускать ESLint. Поэтому установим плагин ESLint для Gulp: (Для этого также установим плагин ESLint для Gulp)
+Создадим задачу для Gulp, которая будет запускать ESLint. Для этого также установим плагин ESLint для Gulp:
 
 - запустите `yarn add --dev gulp-eslint`
 
@@ -57,9 +57,9 @@ gulp.task('build', ['lint', 'clean'], () => {
 });
 ```
 
-- Запустите `yarn start`. Вы должны увидеть набор ошибок кода (англ. linting errors - прим. переводчика) в этом Gulp-файле и предупреждения об использовании `console.log()` в `index.js`.
+- Запустите `yarn start`. Вы должны увидеть набор ошибок кода (linting errors) в этом Gulp-файле и предупреждения об использовании `console.log()` в `index.js`.
 
-Один из видов ошибок будет выглядить следующим образом: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в ~~скомпилированное приложение~~ (англ. build - прим. переводчика ) а какие нет. Поэтому мы немного поможем ESLint используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
+Один из видов ошибок будет выглядить следующим образом: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в ~~скомпилированное приложение~~ (build), а какие нет. Поэтому мы немного поможем ESLint, используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
 
 ```javascript
 /* eslint-disable import/no-extraneous-dependencies */
@@ -81,7 +81,7 @@ gulp.task('build', ['lint', 'clean'], () => {
 () => 1
 ```
 
-Потому что, когда в ES6 функция содержит только возвращаемое выражение, можно опустить фигурные скобки, оператор return и точку с запятой.
+Потому что, когда ES6 функция содержит только возвращаемое выражение, можно опустить фигурные скобки, оператор return и точку с запятой.
 
 Так что давайте обновим Gulp-файл соответственно:
 
@@ -105,7 +105,7 @@ gulp.task('build', ['lint', 'clean'], () =>
 );
 ```
 
-Последняя оставшаяся проблема связана с `console.log()`. Давайте скажем, что мы хотим в этом примере, чтобы использование `console.log()` в `index.js` было правомерным, а не вызывало предупреждение. Как вы, возможно, догадались мы поместим `/* eslint-disable no-console */` в начале нашего `index.js` файла.
+Последняя оставшаяся проблема связана с `console.log()`. Давайте скажем, что мы хотим в этом примере, чтобы использование `console.log()` в `index.js` было правомерным, а не вызывало предупреждение. Как вы, возможно, догадались, мы поместим `/* eslint-disable no-console */` в начале нашего `index.js` файла.
 
 - Запустите `yarn start` - теперь все снова без ошибок.
 
-- 
GitLab


From 201818c4528ecec3c2ee19a70043a82be23b19ca Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 21:35:11 +0700
Subject: [PATCH 37/73] Update README.md

---
 tutorial/7-client-webpack/README.md | 31 +++++++++++++----------------
 1 file changed, 14 insertions(+), 17 deletions(-)

diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index 4577e48..63f1a2d 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -2,7 +2,6 @@
 
 ## Структура нашего приложения
 
-- Create a `dist` folder at the root of your project, and add the following `index.html` file to it:
 - Создайте директорию `dist` в корне вашего проекта, и добавьте туда файл `index.html` со следующим содержанием:
 
 ```html
@@ -19,8 +18,7 @@
 
 В директории `src` создайте следующие поддиректории: `server`, `shared`, `client` и переместите текущий `index.js`  в папку `server`, а `dog.js` в `shared`. Создайте `app.js` в директории `client`.
 
-We are not going to do any Node back-end yet, but this separation will help you see more clearly where things belong. You'll need to change the `import Dog from './dog';` in `server/index.js` to `import Dog from '../shared/dog';` though, or ESLint will detect errors for unresolved modules.
-Мы пока что не собираемся создавать на Node серверную часть, но это разделение поможет более ясно понять что к чему относится. Вам нужно заменить `import Dog from './dog';` в `server/index.js` на `import Dog from '../shared/dog';`, иначе ESLint обнаружит ошибки неразрешаемых модулей.
+Мы пока не собираемся создавать на Node серверную часть, но это разделение поможет более ясно понять, что к чему относится. Вам нужно заменить `import Dog from './dog';` в `server/index.js` на `import Dog from '../shared/dog';`, иначе ESLint обнаружит ошибки неразрешаемых модулей.
 
 Напишите в `client/app.js`:
 
@@ -39,9 +37,9 @@ document.querySelector('.app').innerText = browserToby.bark();
   "browser": true
 }
 ```
-Таким образом мы сможем использовать такие переменные как `window` или `document`, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
+Таким образом мы можем использовать такие переменные как `window` или `document`, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
 
-Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания - прим. пер.), вам нужно включить [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
+Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания), вам нужно включить [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
 
 - Запустите `yarn add babel-polyfill`
 
@@ -51,17 +49,17 @@ document.querySelector('.app').innerText = browserToby.bark();
 import 'babel-polyfill';
 ```
 
-Включение ~~полифила~~ (англ. polyfill) прибавляет объема вашей сборке, поэтому подключайте  его только когда применяете конструкции, которые он охватывает. Для того, чтобы показать более полный шаблон кода в этом руководстве, я его применяю, и он появится примерах в следующих частях.
+Включение полизаполнения (polyfill) прибавляет объема вашей сборке, поэтому подключайте его только тогда, когда применяете конструкции, которые оно охватывает. Для того, чтобы показать более полный шаблон кода в этом руководстве, я буду его прменять. Оно появится примерах в следующих частях.
 
 ## Webpack
 
-В среде Node вы можете свободно использовать `import` для различных файлов и Node разрешит (англ. resolve) их посредством файловой системы. В браузере файловая система отсутствует, следовательно `import` ведет в никуда. Для того чтобы `app.js`, являющийся точкой входа для приложения, получил всю древовидную структуру импортируемых файлов, мы собираемся "собрать" все это дерево зависимостей в один файл. Webpack - нужный для этого инструмент.
+В среде Node вы можете свободно использовать `import` для различных файлов, и Node разрешит (англ. resolve) их посредством файловой системы. В браузере файловая система отсутствует, следовательно `import` ведет в никуда. Для того чтобы `app.js`, являющийся точкой входа для приложения, получил всю древовидную структуру импортируемых файлов, мы собираемся "собрать" все это дерево зависимостей в один файл. Webpack - нужный для этого инструмент.
 
 Webpack, как и Gulp, использует конфигурационные файлы вида `webpack.config.js`. В них возможно использование ES6 импорта и экспорта точно таким же способом, как мы делали с Gulp относительно Babel: обозначая этот файл как `webpack.config.babel.js`.
 
 - Создайте пустой файл `webpack.config.babel.js`
 
-- Пока вы в нем, добавьте `webpack.config.babel.js` в задачу `lint` в Gulp, и еще несколько констант с путями (`paths` - англ):
+- Пока вы в нем, добавьте `webpack.config.babel.js` в задачу `lint` в Gulp, и еще несколько констант с путями (`paths`):
 
 ```javascript
 const paths = {
@@ -86,7 +84,7 @@ gulp.task('lint', () =>
 );
 ```
 
-Мы должы научить Webpack обрабатывать ES6 файлы с помощью Babel (точно так же как мы показали Gulp как это делать через `gulp-babel`). Для Webpack, когда нужно обработать файлы, не являющиеся простым старым JavaScript, мы используем *загрузчики* (loaders). Давайте установим загрузчик Babel для Webpack:
+Мы должы научить Webpack обрабатывать ES6 файлы с помощью Babel (точно так же, как мы показали Gulp, как это делать через `gulp-babel`). Для Webpack, когда нужно обработать файлы, не являющиеся простым старым JavaScript, мы используем *загрузчики* (loaders). Давайте установим загрузчик Babel для Webpack:
 
 - Запустите `yarn add --dev babel-loader`
 
@@ -115,18 +113,17 @@ export default {
 
 Давайте это немного проанализируем:
 
-Этот файл нужен чтобы сообщить Webpack некоторую информацию. `output.filename` - имя файла генерируемой сборки. `devtool: 'source-map'` - позволяет использовать source maps (карты кода) для упрощения отладки в браузере. В `module.loaders` есть свойство `test` с регулярным выражением, определяющим какие файлы должны обрабатываться загрузчиком `babel-loader`. Поскольку мы будем использовать как `.js` так и `.jsx` файлы (для React) в следующих частях, наше выражение выглядит как `/\.jsx?$/`. Директория `node_modules` исключена (exclude) поскольку ее не нужно транспилировать. Таким образом, когда код импортирует (`import`) пакеты, расположенные в `node_modules`, Babel не тратит время на обработку этих файлов. Раздел `resolve` сообщает Webpack файлы какого типа мы хотим подключать через `import`, позволяя тем самым опускать расширения в именах файлов, например как в `import Foo from './foo'`, где `foo` может быть `foo.js` или `foo.jsx`.
+Этот файл нужен, чтобы сообщить Webpack некоторую информацию. `output.filename` - имя файла генерируемой сборки. `devtool: 'source-map'` - позволяет использовать source maps (карты кода) для упрощения отладки в браузере. В `module.loaders` есть свойство `test` с регулярным выражением, определяющим какие файлы должны обрабатываться загрузчиком `babel-loader`. Поскольку мы будем использовать как `.js` так и `.jsx` файлы (для React) в следующих частях, наше выражение выглядит как `/\.jsx?$/`. Директория `node_modules` исключена (exclude), поскольку ее не нужно транспилировать. Таким образом, когда код импортирует (`import`) пакеты, расположенные в `node_modules`, Babel не тратит время на обработку этих файлов. Раздел `resolve` сообщает Webpack, файлы какого типа мы хотим подключать через `import`, позволяя тем самым опускать расширения в именах файлов, например как в `import Foo from './foo'`, где `foo` может быть `foo.js` или `foo.jsx`.
 
-И так, мы настроили Webpack, но нам до сих пор требуется способ *запустить* его.
+Итак, мы настроили Webpack, но нам до сих пор требуется способ *запустить* его.
 
 ## Подключение Webpack к Gulp
 
-Webpack может делать множество вещей. Он даже может полностью заменить Gulp, если проект в основном выполняется на стороне клиента. Gulp в свою очередь, как более общий инструмент, больше подходит для таких вещей как анализ кода (linting), тестирование, запуск задач на стороне сервера. Он так же проще в понимании для новичков чем чем сложное конфигурирование Webpack. У нас уже довольно хорошо настроен рабочий процесс на базе Gulp, так что интеграция Webpack в процес сборки пройдет проще простого.
+Webpack может делать множество вещей. Он даже может полностью заменить Gulp, если проект в основном выполняется на стороне клиента. Gulp в свою очередь, как более общий инструмент, больше подходит для таких вещей как анализ кода (linting), тестирование, запуск задач на стороне сервера. Он так же проще в понимании для новичков, чем сложное конфигурирование Webpack. У нас уже довольно хорошо настроен рабочий процесс на базе Gulp, так что интеграция Webpack в процесс сборки пройдет проще простого.
 
 Давайте создадим в Gulp задачу по запуску Webpack. Откройте `gulpfile.babel.js`.
-
-We don't need the `main` task to execute `node lib/` anymore, since we will open `index.html` to run our app. 
-Поскольку мы ~~will open~~ `index.html` чтобы запускать наше приложение, нам больше не требуется задача `main` чтобы выполнять `node lib/`.
+ 
+Поскольку мы будем использовать `index.html`, чтобы запускать наше приложение, нам больше не требуется задача `main` чтобы выполнять `node lib/`.
 
 - Уберите `import { exec } from 'child_process'`.
 
@@ -174,11 +171,11 @@ gulp.task('main', ['lint', 'clean'], () =>
 );
 ```
 
-**Замечание**: Задача `build` сейчас транспилирует код ES6 в ES5 для каждого `.js` файла, расположенного в `src`. Поскольку мы разделили код на  `server`, `shared` и `client`, то мы могли бы компилировать только `server` и `shared` (поскольку Webpack позаботится о `client`). Тем не менее, в разделе Тестирование нам потребуется Gulp для компиляции клиентского кода чтобы тестировать его вне Webpack. Так что пока-что мы не дойдем до этого раздела, будет ~~несколько избыточное дублирование в~~ `build`. Давайте договоримся, что пока это нормально. Вообще мы даже не будем использовать `build` и директорию `lib` пока не доберемся до этой части, так что все что нас сейчас волнует - это клиентская сборка.
+**Примечание**: Задача `build` сейчас транспилирует код ES6 в ES5 для каждого `.js` файла, расположенного в `src`. Поскольку мы разделили код на  `server`, `shared` и `client`, мы могли бы компилировать только `server` и `shared` (т.к. Webpack позаботится о `client`). Тем не менее, в разделе Тестирование нам потребуется Gulp для компиляции клиентского кода, чтобы тестировать его вне Webpack. Так что, пока мы не дойдем до этого раздела, будет ~~несколько избыточное дублирование в~~ `build`. Давайте договоримся, что пока это нормально. Вообще, мы даже не будем использовать `build` и директории `lib` пока не доберемся до этой части, так что, все, что нас сейчас волнует - это клиентская сборка.
 
 - Запустите `yarn start`, вы должны увидеть построенный Webpack файл `client-bundle.js`. Откройте `index.html` в браузере. Должно отобразиться "Wah wah, I am Browser Toby".
 
-Одна последняя вещь: в отличие от директории `lib`, файлы `dist/client-bundle.js` и `dist/client-bundle.js.map` не очищаются задачей `clean` перед каждой сборкой.
+Еще одна вещь: в отличие от директории `lib`, файлы `dist/client-bundle.js` и `dist/client-bundle.js.map` не очищаются задачей `clean` перед каждой сборкой.
 
 - Добавьте `clientBundle: 'dist/client-bundle.js?(.map)'` в нашу конфигурацию путей (`paths`), и настройте задачу `clean` следующим образом:
 
-- 
GitLab


From 88823b05c31f7eb2d21a837f2574ae629200197e Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 21:44:19 +0700
Subject: [PATCH 38/73] Update README.md

---
 tutorial/8-react/README.md | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index 0f9f67f..2664b49 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -32,7 +32,7 @@ App.propTypes = {
 ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
 ```
 
-**Примечание**: Если вы не знакомы с React или его PropTypes, ознакомьтесь сначала с ним и затем возвращайтесь в это руководство. В следующих главах мы будем использовать React, поэтому вам понадобится хорошее (его) понимание этой библиотеки.
+**Примечание**: Если вы не знакомы с React или его PropTypes, ознакомьтесь сначала с ним и затем возвращайтесь в это руководство. В следующих главах мы будем использовать React, поэтому вам понадобится хорошее его понимание.
 
 В Gulp файле, измените в `clientEntryPoint` расширение на `.jsx`:
 
@@ -40,9 +40,9 @@ ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
 clientEntryPoint: 'src/client/app.jsx',
 ```
 
-Поскольку мы используем синтакс JSX, нам так же нужен Babel для его обработки.
-Установите React Babel preset, который научит Babel обрабатывать JSX синтакс:
-`yarn add --dev babel-preset-react` и откорректируйте раздел `babel` в `package.json` следующим образом:
+Поскольку мы используем синтаксис JSX, нам так же нужен Babel для его обработки.
+Установите React Babel preset, который научит Babel обрабатывать JSX синтаксис
+`yarn add --dev babel-preset-react`, и откорректируйте раздел `babel` в `package.json` следующим образом:
 
 ```json
 "babel": {
@@ -53,10 +53,10 @@ clientEntryPoint: 'src/client/app.jsx',
 },
 ```
 
-Теперь, после запуска `yarn start`, открыв `index.html`, мы должны увидеть "The dog says: Wah wah, I am Browser Toby" сгенерированное React.
+Теперь, после запуска `yarn start`, открыв `index.html`, мы должны увидеть "The dog says: Wah wah, I am Browser Toby", сгенерированное React.
 
 
 
 Следующий раздел: [9 - Redux](/tutorial/9-redux)
 
-Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
\ No newline at end of file
+Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
-- 
GitLab


From 1117b0a3ba4bde009b7e961fd4fe0fceca1f2b7b Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 21:50:17 +0700
Subject: [PATCH 39/73] Update README.md

---
 tutorial/9-redux/README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index 4d30928..c90a6b3 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -4,7 +4,7 @@
 
 - **хранилище** (store) - простой JavaScript объект, представляющий состояние вашего приложения;
 - **действия** (actions), которые обычно запускаются пользователем;
-- **редюсеры** (reducers), которые можно рассматривать как обработчики действий.
+- **редюсеры** (reducers), которые можно рассматривать, как обработчики действий.
 
 Редюсеры воздествуют на состояние приложения (**хранилище**), и когда состояние приложения изменяется, что-то происходит в вашем приложении. Хорошая визуальная демонстрация Redux находится [здесь](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
 
@@ -161,4 +161,4 @@ export default connect(mapStateToProps)(Message);
 
 Следующий раздел: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
 
-Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
\ No newline at end of file
+Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
-- 
GitLab


From da036a11bfda578bcf4c617cc49e053c4c1c4159 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 21:57:10 +0700
Subject: [PATCH 40/73] Update README.md

---
 tutorial/10-immutable-redux-improvements/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/10-immutable-redux-improvements/README.md b/tutorial/10-immutable-redux-improvements/README.md
index 8e3f539..ba49d76 100644
--- a/tutorial/10-immutable-redux-improvements/README.md
+++ b/tutorial/10-immutable-redux-improvements/README.md
@@ -16,7 +16,7 @@ const obj = Immutable.Map({ a: 1 });
 obj.set('a', 2); // Возвращает новый объект не изменяя `obj`
 ```
 
-Такой подход соответствует парадигме **функционального программирования**, которая хорошо подходит для работы с Redux. Ваши reducer-функции вообщето **должны** быть чистыми и не изменять состояние хранилища (переданного в качестве параметра), а вместо этого возвращать абсолютно новое. Давайте воспользуемся Immutable чтобы достичь этого.
+Такой подход соответствует парадигме **функционального программирования**, которая хорошо подходит для работы с Redux. Ваши reducer-функции вообще-то **должны** быть чистыми и не изменять состояние хранилища (переданного в качестве параметра), а вместо этого возвращать абсолютно новое. Давайте воспользуемся Immutable, чтобы достичь этого.
 
 - Запустите `yarn add immutable`
 
-- 
GitLab


From 3da403ae16e2ac5e15bc4ab83a1fe3e30f8e5f6b Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Fri, 11 Nov 2016 22:09:59 +0700
Subject: [PATCH 41/73] Update README.md

---
 tutorial/11-testing-mocha-chai-sinon/README.md | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index 5cd74c5..f189d55 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -2,7 +2,7 @@
 
 ## Mocha and Chai
 
-- Создайте директорию `src/test`. Эта папка будет отражать структуру директорий нашего приложения, поэтому создайте также `src/test/client` (можете так же добавить `server` и `shared`, если хотите, но мы не будем писать тесты для них).
+- Создайте директорию `src/test`. Эта папка будет отражать структуру директорий нашего приложения, поэтому создайте также `src/test/client` (можете также добавить `server` и `shared`, если хотите, но мы не будем писать тесты для них).
 
 - В `src/test/client`, создайте файл `state-test.js` , в котором мы будем тестировать жизненный цикл нашего Redux приложеия.
 
@@ -42,9 +42,9 @@ describe('App State', () => {
   });
 });
 ```
-Хорошо, давайте все это проанализируем.
+Хорошо, теперь давайте все это проанализируем.
 
-Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, что бы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавляем для него комментарий в начале, чтобы отключить правило `no-unused-expressions` для этого файла.
+Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, чтобы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавляем для него комментарий в начале, чтобы отключить правило `no-unused-expressions` для этого файла.
 
 Тесты Mocha устроены наподобие дерева. В нашем случае, мы хотим протестировать функцию `makeBark`, которая должна воздействовать на атрибут `dog` состояния нашего приложения, поэтому имеет смысл использовать следующую иерархию тестов: `App State > Dog > makeBark`, что мы и описали используя `describe()`. `it()`  - это собственно, тестирующая функция, а `beforeEach()` - это функция, вызываемая перед каждым вызовом теста `it()`. В нашем случае, мы хотим иметь новую чистую версию хранилища перед запуском каждого теста. Мы обявили переменную `store` в начале файла, поскольку она нам пригодится в каждом тесте.
 
@@ -74,15 +74,13 @@ gulp.task('test', ['build'], () =>
 
 Как вы можете видеть, тесты запускаются на транспилированом коде из папки `lib`, вот почему задачу `test` предваряет запуск `build`. `build`,  в свою очередь, предваряется задачей `lint`, а сам `test` мы будем запускать перед `main`, что в итоге даст нам следующий каскад задач для `default`: `lint` > `build` > `test` > `main`.
 
-`build` also has a prerequisite, `lint`, and finally, we are making `test` a prerequisite of `main`, which gives us the following task cascade for the `default` task: `lint` > `build` > `test` > `main`. -удалить строчку?
-
 - Установите в `main` предварительный запуск команды `test`:
 
 ```javascript
 gulp.task('main', ['test'], () => /* ... */ );
 ```
 
-- В `package.json`, замените текущее значение скрипта `"test"` на следующее: `"test": "gulp test"`. Таким образом мы можем использовать `yarn test`, чтобы просто запустить наши тесты. Так же `test` - это стандартный скрипт, который автоматически запускается такими инструментами, как, например, сервисы непрерывной интеграции (continuous integration services, CI), так что всегда добавляйте запуск тестов через него. `yarn start` также запустит тестирование перед построением сборки Webpack, так что сборка сгенерируется только если все тесты будут пройдены.
+- В `package.json`, замените текущее значение скрипта `"test"` на следующее: `"test": "gulp test"`. Таким образом мы можем использовать `yarn test`, чтобы просто запустить наши тесты. Так же `test` - это стандартный скрипт, который автоматически запускается такими инструментами, как, например, сервисы непрерывной интеграции (continuous integration services, CI), так что всегда добавляйте запуск тестов через него. `yarn start` также запустит тестирование перед построением сборки Webpack, так что сборка сгенерируется только, если все тесты будут пройдены.
 
 - Запустите `yarn test` или `yarn start`, и должны будут выйти результаты ваших тестов, предпочтительно зеленые.
 
@@ -143,7 +141,7 @@ describe('Shared', () => {
 });
 ```
 
-Тут мы используем *заглушки* от Sinon и плагин для Chai, позволяющий использовать его утверждения на и им подобных заглушках.
+Тут мы используем *заглушки* от Sinon и плагин для Chai, позволяющий использовать его утверждения на ЧЕМ???? и им подобных заглушках.
 
 - Запустите `yarn add --dev sinon sinon-chai`, чтобы установить эти библиотеки.
 
@@ -155,4 +153,4 @@ describe('Shared', () => {
 
 Следующий раздел:  [12 - Типизация с Flow](/tutorial/12-flow)
 
-Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
\ No newline at end of file
+Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
-- 
GitLab


From 584d94222dbd3c404bd863e2c4e39329bb1d1fa3 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 15:48:35 +0700
Subject: [PATCH 42/73] +

---
 tutorial/11-testing-mocha-chai-sinon/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index f189d55..d00f28a 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -141,7 +141,7 @@ describe('Shared', () => {
 });
 ```
 
-Тут мы используем *заглушки* от Sinon и плагин для Chai, позволяющий использовать его утверждения на ЧЕМ???? и им подобных заглушках.
+Тут мы используем заглушки от Sinon и плагин для Chai, позволяющий использовать Chai-утверждения на Sinon и им подобных заглушках.
 
 - Запустите `yarn add --dev sinon sinon-chai`, чтобы установить эти библиотеки.
 
-- 
GitLab


From bb39025d7a5e58e6b22c4ffea303050af2c1b636 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 15:49:33 +0700
Subject: [PATCH 43/73] ++

---
 tutorial/11-testing-mocha-chai-sinon/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index d00f28a..51bcbf7 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -141,7 +141,7 @@ describe('Shared', () => {
 });
 ```
 
-Тут мы используем заглушки от Sinon и плагин для Chai, позволяющий использовать Chai-утверждения на Sinon и им подобных заглушках.
+Тут мы используем *заглушки* от Sinon и плагин для Chai, позволяющий использовать Chai-утверждения на Sinon и им подобных заглушках.
 
 - Запустите `yarn add --dev sinon sinon-chai`, чтобы установить эти библиотеки.
 
-- 
GitLab


From 05ab5c59ebde6c46373f421ed7fce29618140e78 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 15:50:55 +0700
Subject: [PATCH 44/73] +

---
 tutorial/5-es6-modules-syntax/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 1c5257a..4311fea 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -4,7 +4,7 @@
 
 В `dog.js`, мы также заменим `module.exports = Dog` на `export default Dog`.
 
-Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, можно напрямую экспортировать анонимный класс. Таким образом:  (Поэтому, можно напрямую экспортировать анонимный класс следующим образом:)
+Заметьте, что в dog.js переменная Dog используется только в export. Поэтому, можно напрямую экспортировать анонимный класс следующим образом:
 
 ```javascript
 export default class {
-- 
GitLab


From 4720cd311c89f7d53ba2d6b2aadbb955d8065e05 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 15:56:56 +0700
Subject: [PATCH 45/73] +

---
 tutorial/6-eslint/README.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index d733e14..fdc827d 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -1,6 +1,6 @@
 # 6 - ESLint
 
-Мы собираемся контролировать качество кода (lint), чтобы перехватывать потенциальные проблемы. ESLint - наиболее предпочтительный анализатор кода (linter) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
+Мы собираемся контролировать качество кода (to lint), чтобы перехватывать потенциальные проблемы. ESLint - наиболее предпочтительный анализатор кода (linter) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
 
 - Запустите `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
 
@@ -19,7 +19,7 @@
 
 **Примечание**: Вместо свойства `eslintConfig` в `package.json` можно использовать файл `.eslintrc.js` в корне вашего проекта. Так же как и с конфигурацией Babel, мы стараемся избегать загромождения корневой директории большим количеством файлов, но если у вас сложная конфигурация ESLint, рассмотрите такую альтернативу.
 
-Создадим задачу для Gulp, которая будет запускать ESLint. Для этого также установим плагин ESLint для Gulp:
+Создадим задачу для Gulp, которая будет запускать ESLint. Для этого установим еще и плагин ESLint для Gulp:
 
 - запустите `yarn add --dev gulp-eslint`
 
@@ -59,7 +59,7 @@ gulp.task('build', ['lint', 'clean'], () => {
 
 - Запустите `yarn start`. Вы должны увидеть набор ошибок кода (linting errors) в этом Gulp-файле и предупреждения об использовании `console.log()` в `index.js`.
 
-Один из видов ошибок будет выглядить следующим образом: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в ~~скомпилированное приложение~~ (build), а какие нет. Поэтому мы немного поможем ESLint, используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
+Один из видов ошибок будет выглядить следующим образом: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в скомпилированное приложение (build), а какие нет. Поэтому мы немного поможем ESLint, используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
 
 ```javascript
 /* eslint-disable import/no-extraneous-dependencies */
-- 
GitLab


From ea71f4b7ce03fa85788f6585fcc028b799505ee7 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 16:06:20 +0700
Subject: [PATCH 46/73] +

---
 tutorial/7-client-webpack/README.md | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index 63f1a2d..604f7a0 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -37,9 +37,9 @@ document.querySelector('.app').innerText = browserToby.bark();
   "browser": true
 }
 ```
-Таким образом мы можем использовать такие переменные как `window` или `document`, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
+Таким образом мы сможем использовать такие переменные как window или document, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
 
-Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания), вам нужно включить [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
+Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания), вам нужно включить полифил (polyfill) [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
 
 - Запустите `yarn add babel-polyfill`
 
@@ -49,7 +49,7 @@ document.querySelector('.app').innerText = browserToby.bark();
 import 'babel-polyfill';
 ```
 
-Включение полизаполнения (polyfill) прибавляет объема вашей сборке, поэтому подключайте его только тогда, когда применяете конструкции, которые оно охватывает. Для того, чтобы показать более полный шаблон кода в этом руководстве, я буду его прменять. Оно появится примерах в следующих частях.
+Включение полифила (polyfill) прибавляет объема вашей сборке, поэтому подключайте его только тогда, когда применяете конструкции, которые он охватывает. Для того, чтобы показать более полный шаблон кода в этом руководстве, я буду его применять. Он появится в примерах в следующих частях.
 
 ## Webpack
 
@@ -123,7 +123,7 @@ Webpack может делать множество вещей. Он даже м
 
 Давайте создадим в Gulp задачу по запуску Webpack. Откройте `gulpfile.babel.js`.
  
-Поскольку мы будем использовать `index.html`, чтобы запускать наше приложение, нам больше не требуется задача `main` чтобы выполнять `node lib/`.
+Поскольку мы будем запускать наше приложение, открывая `index.html`, нам больше не требуется задача `main` чтобы выполнять `node lib/`.
 
 - Уберите `import { exec } from 'child_process'`.
 
@@ -171,7 +171,7 @@ gulp.task('main', ['lint', 'clean'], () =>
 );
 ```
 
-**Примечание**: Задача `build` сейчас транспилирует код ES6 в ES5 для каждого `.js` файла, расположенного в `src`. Поскольку мы разделили код на  `server`, `shared` и `client`, мы могли бы компилировать только `server` и `shared` (т.к. Webpack позаботится о `client`). Тем не менее, в разделе Тестирование нам потребуется Gulp для компиляции клиентского кода, чтобы тестировать его вне Webpack. Так что, пока мы не дойдем до этого раздела, будет ~~несколько избыточное дублирование в~~ `build`. Давайте договоримся, что пока это нормально. Вообще, мы даже не будем использовать `build` и директории `lib` пока не доберемся до этой части, так что, все, что нас сейчас волнует - это клиентская сборка.
+**Примечание**: Задача `build` сейчас транспилирует код ES6 в ES5 для каждого `.js` файла, расположенного в `src`. Поскольку мы разделили код на  `server`, `shared` и `client`, мы могли бы компилировать только `server` и `shared` (т.к. Webpack позаботится о `client`). Тем не менее, в разделе Тестирование нам потребуется Gulp для компиляции клиентского кода, чтобы тестировать его вне Webpack. Так что, пока мы не дойдем до этого раздела, будет несколько избыточное дублирование в `build`. Давайте договоримся, что пока это нормально. Вообще, мы даже не будем использовать `build` и директорию `lib` пока не доберемся до этой части, так что, все, что нас сейчас волнует - это клиентская сборка.
 
 - Запустите `yarn start`, вы должны увидеть построенный Webpack файл `client-bundle.js`. Откройте `index.html` в браузере. Должно отобразиться "Wah wah, I am Browser Toby".
 
-- 
GitLab


From ff7ff328fa176c2825005a2ad08c524a2cee088d Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 16:08:41 +0700
Subject: [PATCH 47/73] +

---
 tutorial/8-react/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index 2664b49..71375f9 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -32,7 +32,7 @@ App.propTypes = {
 ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
 ```
 
-**Примечание**: Если вы не знакомы с React или его PropTypes, ознакомьтесь сначала с ним и затем возвращайтесь в это руководство. В следующих главах мы будем использовать React, поэтому вам понадобится хорошее его понимание.
+**Примечание**: Если вы не знакомы с React или его PropTypes (типы параметров), ознакомьтесь сначала с ним и затем возвращайтесь в это руководство. В следующих главах мы будем использовать React, поэтому вам понадобится хорошее его понимание.
 
 В Gulp файле, измените в `clientEntryPoint` расширение на `.jsx`:
 
-- 
GitLab


From 8b3b88ec5936be67b2f08f68984f944474c7c3bb Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 16:09:33 +0700
Subject: [PATCH 48/73] +

---
 tutorial/9-redux/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index c90a6b3..a40498a 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -4,7 +4,7 @@
 
 - **хранилище** (store) - простой JavaScript объект, представляющий состояние вашего приложения;
 - **действия** (actions), которые обычно запускаются пользователем;
-- **редюсеры** (reducers), которые можно рассматривать, как обработчики действий.
+- **редюсеры** (reducers),которые можно рассматривать как обработчики действий.
 
 Редюсеры воздествуют на состояние приложения (**хранилище**), и когда состояние приложения изменяется, что-то происходит в вашем приложении. Хорошая визуальная демонстрация Redux находится [здесь](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
 
-- 
GitLab


From 20b04ee214b3f7931f6aab4a99c306df17d77229 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 16:20:40 +0700
Subject: [PATCH 49/73] +

---
 tutorial/5-es6-modules-syntax/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 4311fea..8d9933f 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -4,7 +4,7 @@
 
 В `dog.js`, мы также заменим `module.exports = Dog` на `export default Dog`.
 
-Заметьте, что в dog.js переменная Dog используется только в export. Поэтому, можно напрямую экспортировать анонимный класс следующим образом:
+Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, можно напрямую экспортировать анонимный класс следующим образом:
 
 ```javascript
 export default class {
-- 
GitLab


From 5a75dea346dbd1327d4bedffb0e6ae46648f7e36 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sat, 12 Nov 2016 16:25:55 +0700
Subject: [PATCH 50/73] fix (#2)

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* +

* ++

* +

* +

* +

* +

* +

* +
---
 README.md                                     |  4 +--
 .../1-node-npm-yarn-package-json/README.md    |  4 +--
 .../10-immutable-redux-improvements/README.md |  2 +-
 .../11-testing-mocha-chai-sinon/README.md     | 14 ++++-----
 tutorial/3-es6-babel-gulp/README.md           |  8 ++---
 tutorial/5-es6-modules-syntax/README.md       |  6 ++--
 tutorial/6-eslint/README.md                   | 12 +++----
 tutorial/7-client-webpack/README.md           | 31 +++++++++----------
 tutorial/8-react/README.md                    | 12 +++----
 tutorial/9-redux/README.md                    |  4 +--
 10 files changed, 46 insertions(+), 51 deletions(-)

diff --git a/README.md b/README.md
index 3401419..14b288d 100644
--- a/README.md
+++ b/README.md
@@ -27,9 +27,9 @@
 
 Конечно, вам не нужны все эти технологии, если вы делаете простую веб страницу с парой JS функций (достаточно комбинаци Babel + jQuery), но если вы собираетесь создать масштабируемое веб приложение, и вам нужно все правильно настроить, то это руководство отлично вам подходит.
 
-Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить более глубокие знания по ним, изучайте их документацию или другие руководства.
+Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить по ним более глубокие знания, изучайте их документацию или другие руководства.
 
-В большой части технологий, описываемых тут, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду, использующую React, и на чем-то потренироваться, что бы подтянуть свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
+В большой части технологий, описываемых здесь, используется React. Если вы только начинаете использовать React и просто хотите изучить его, то [create-react-app](https://github.com/facebookincubator/create-react-app) поможет вам и кратко ознакомит с инфраструктурой React на основе предустановленной конфигурации. Я бы, например, порекомендовал такой подход для тех, кому нужно влиться в команду, использующую React, и на чем-то потренироваться, что бы подтянуть свои знания. В этом руководстве мы не будем пользоваться предустановленными конфигурациями, поскольку я хочу, чтобы вы полностью понимали все, что происходит "под капотом".
 
 Примеры кода имеются в каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждого раздела.
 
diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index da7272c..3918d7a 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -20,7 +20,7 @@ sudo apt-get install -y nodejs
 
 [Yarn](https://yarnpkg.com/) - еще один менеджер пакетов. Он намного быстрее чем NPM, поддерживает работу офлайн и [лучше предугадывает](https://yarnpkg.com/en/docs/yarn-lock) подгрузку нужных зависимостей. С момента его [выхода](https://code.facebook.com/posts/1840075619545360) в Октябре 2016, он был очень быстро принят сообществом и постепенно становится лучшим решением для JavaScript. В данном руководстве мы будем использовать Yarn. Если вы предпочетаете оставаться с NPM, просто замените все команды `yarn add` и `yarn add --dev` на `npm install --save` и `npm install --dev` в этом пособии.
 
-- Установите Yarn следуя [инструкциям](https://yarnpkg.com/en/docs/install). Проще всего это сделать через `npm install -g yarn` или `sudo npm install -g yarn` (Верно, мы используем NPM чтобы установить Yarn, все равно, что использовать Internet Explorer или Safari чтобы установить Chrome!).
+- Установите Yarn следуя [инструкциям](https://yarnpkg.com/en/docs/install). Проще всего это сделать через `npm install -g yarn` или `sudo npm install -g yarn` (Верно, мы используем NPM, чтобы установить Yarn, все равно, что использовать Internet Explorer или Safari, чтобы установить Chrome!).
 
 - Создайте новую директорию для работы и зайдите (`cd`) в нее.
 - Запустите `yarn init` и ответьте на вопросы, чтобы создать файл `package.json` автоматически (`yarn init -y` чтобы пропустить вопросы).
@@ -29,7 +29,7 @@ sudo apt-get install -y nodejs
 
 Команда `node .` - слегка низкоуровневая для запуска программ. Вместо нее, мы будем использовать NPM/Yarn скрипты, чтобы запускать выполнение нужного кода. Это даст нам хороший уровень абстракции, позволяющий всегда использовать `yarn start`, даже когда наша программа станет более сложной.
 
-- В файле `package.json`, в корневом объекте создайте объект `scripts`, чтоб было так:
+- В файле `package.json`, в корневом объекте создайте объект `scripts`, чтобы было так:
 
 ```
 "scripts": {
diff --git a/tutorial/10-immutable-redux-improvements/README.md b/tutorial/10-immutable-redux-improvements/README.md
index 8e3f539..ba49d76 100644
--- a/tutorial/10-immutable-redux-improvements/README.md
+++ b/tutorial/10-immutable-redux-improvements/README.md
@@ -16,7 +16,7 @@ const obj = Immutable.Map({ a: 1 });
 obj.set('a', 2); // Возвращает новый объект не изменяя `obj`
 ```
 
-Такой подход соответствует парадигме **функционального программирования**, которая хорошо подходит для работы с Redux. Ваши reducer-функции вообщето **должны** быть чистыми и не изменять состояние хранилища (переданного в качестве параметра), а вместо этого возвращать абсолютно новое. Давайте воспользуемся Immutable чтобы достичь этого.
+Такой подход соответствует парадигме **функционального программирования**, которая хорошо подходит для работы с Redux. Ваши reducer-функции вообще-то **должны** быть чистыми и не изменять состояние хранилища (переданного в качестве параметра), а вместо этого возвращать абсолютно новое. Давайте воспользуемся Immutable, чтобы достичь этого.
 
 - Запустите `yarn add immutable`
 
diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index 5cd74c5..51bcbf7 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -2,7 +2,7 @@
 
 ## Mocha and Chai
 
-- Создайте директорию `src/test`. Эта папка будет отражать структуру директорий нашего приложения, поэтому создайте также `src/test/client` (можете так же добавить `server` и `shared`, если хотите, но мы не будем писать тесты для них).
+- Создайте директорию `src/test`. Эта папка будет отражать структуру директорий нашего приложения, поэтому создайте также `src/test/client` (можете также добавить `server` и `shared`, если хотите, но мы не будем писать тесты для них).
 
 - В `src/test/client`, создайте файл `state-test.js` , в котором мы будем тестировать жизненный цикл нашего Redux приложеия.
 
@@ -42,9 +42,9 @@ describe('App State', () => {
   });
 });
 ```
-Хорошо, давайте все это проанализируем.
+Хорошо, теперь давайте все это проанализируем.
 
-Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, что бы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавляем для него комментарий в начале, чтобы отключить правило `no-unused-expressions` для этого файла.
+Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, чтобы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавляем для него комментарий в начале, чтобы отключить правило `no-unused-expressions` для этого файла.
 
 Тесты Mocha устроены наподобие дерева. В нашем случае, мы хотим протестировать функцию `makeBark`, которая должна воздействовать на атрибут `dog` состояния нашего приложения, поэтому имеет смысл использовать следующую иерархию тестов: `App State > Dog > makeBark`, что мы и описали используя `describe()`. `it()`  - это собственно, тестирующая функция, а `beforeEach()` - это функция, вызываемая перед каждым вызовом теста `it()`. В нашем случае, мы хотим иметь новую чистую версию хранилища перед запуском каждого теста. Мы обявили переменную `store` в начале файла, поскольку она нам пригодится в каждом тесте.
 
@@ -74,15 +74,13 @@ gulp.task('test', ['build'], () =>
 
 Как вы можете видеть, тесты запускаются на транспилированом коде из папки `lib`, вот почему задачу `test` предваряет запуск `build`. `build`,  в свою очередь, предваряется задачей `lint`, а сам `test` мы будем запускать перед `main`, что в итоге даст нам следующий каскад задач для `default`: `lint` > `build` > `test` > `main`.
 
-`build` also has a prerequisite, `lint`, and finally, we are making `test` a prerequisite of `main`, which gives us the following task cascade for the `default` task: `lint` > `build` > `test` > `main`. -удалить строчку?
-
 - Установите в `main` предварительный запуск команды `test`:
 
 ```javascript
 gulp.task('main', ['test'], () => /* ... */ );
 ```
 
-- В `package.json`, замените текущее значение скрипта `"test"` на следующее: `"test": "gulp test"`. Таким образом мы можем использовать `yarn test`, чтобы просто запустить наши тесты. Так же `test` - это стандартный скрипт, который автоматически запускается такими инструментами, как, например, сервисы непрерывной интеграции (continuous integration services, CI), так что всегда добавляйте запуск тестов через него. `yarn start` также запустит тестирование перед построением сборки Webpack, так что сборка сгенерируется только если все тесты будут пройдены.
+- В `package.json`, замените текущее значение скрипта `"test"` на следующее: `"test": "gulp test"`. Таким образом мы можем использовать `yarn test`, чтобы просто запустить наши тесты. Так же `test` - это стандартный скрипт, который автоматически запускается такими инструментами, как, например, сервисы непрерывной интеграции (continuous integration services, CI), так что всегда добавляйте запуск тестов через него. `yarn start` также запустит тестирование перед построением сборки Webpack, так что сборка сгенерируется только, если все тесты будут пройдены.
 
 - Запустите `yarn test` или `yarn start`, и должны будут выйти результаты ваших тестов, предпочтительно зеленые.
 
@@ -143,7 +141,7 @@ describe('Shared', () => {
 });
 ```
 
-Тут мы используем *заглушки* от Sinon и плагин для Chai, позволяющий использовать его утверждения на и им подобных заглушках.
+Тут мы используем *заглушки* от Sinon и плагин для Chai, позволяющий использовать Chai-утверждения на Sinon и им подобных заглушках.
 
 - Запустите `yarn add --dev sinon sinon-chai`, чтобы установить эти библиотеки.
 
@@ -155,4 +153,4 @@ describe('Shared', () => {
 
 Следующий раздел:  [12 - Типизация с Flow](/tutorial/12-flow)
 
-Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
\ No newline at end of file
+Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
diff --git a/tutorial/3-es6-babel-gulp/README.md b/tutorial/3-es6-babel-gulp/README.md
index 40a2bfd..b3c8931 100644
--- a/tutorial/3-es6-babel-gulp/README.md
+++ b/tutorial/3-es6-babel-gulp/README.md
@@ -5,7 +5,7 @@
 - Запустите `yarn add --dev gulp`
 - Запустите `yarn add --dev gulp-babel`
 - Запустите `yarn add --dev babel-preset-latest`
-- В `package.json`, добавьте поле `babel` для конфигурации Babel. Укажем, что хотим использовать новейшую конфигурацию Babel,следующим образом:
+- В `package.json` добавьте поле `babel` для конфигурации Babel. Укажем, что хотим использовать новейшую конфигурацию Babel, следующим образом:
 
 ```json
 "babel": {
@@ -73,8 +73,8 @@ Gulp, сам по себе, имеет довольно понятный API. О
 Затем мы определили пять задач: `build` *(создать)*, `clean` *(очистить)*, `main` *(основная)*, `watch` *(наблюдать)*, and `default` *(по умолчанию)*.
 
 - `build` вызывает Babel, чтобы преобразовать все исходные файлы из `src`, и записывает результат в `lib`.
-- `clean` - задача, которая просто удаляет всю нашу автоматически сгенерированную директорию `lib` перед каждым `build`. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то в `src`) для того, чтобы быть уверенным, что директория `lib` всегда синхронна с `src`, даже если `build` не завершился успешно, а вы этого не заметили. Мы используем пакет `del` чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это [рекомендованый](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) для Gulp способ)
-- `main` - аналогично запуску `node .` из предыдущией части, за исключением того, что теперь мы используем `lib/index.js`. Мы можем просто писать `node lib`, потому что по умолчанию Node найдет и запустит `index.js` из указанной папки (мы используем переменную `libDir` чтоб соответствовать принципу DRY). `require('child_process').exec` и `exec` - это функции самого Node, вызывающие консольные команды. Мы перенаправим `stdout` в `console.log()` и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается в `gulp.task` в качестве аргумента. Не переживайте, если эта команда не совсем ясна для вас, помните, что эта задача просто лишь запускает `node lib`.
+- `clean` - задача, которая просто удаляет всю нашу автоматически сгенерированную директорию `lib` перед каждым `build`. Как правило, полезно избавляться от старых скомпилированых файлов (которые могут остаться после переименования или удаления чего-то в `src`) для того, чтобы быть уверенным, что директория `lib` всегда синхронна с `src`, даже если `build` не завершился успешно, а вы этого не заметили. Мы используем пакет `del`, чтобы удалять файлы путем, наиболее подходящим для задач Gulp (это [рекомендованый](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) для Gulp способ)
+- `main` - аналогично запуску `node .` из предыдущией части, за исключением того, что теперь мы используем `lib/index.js`. Мы можем просто писать `node lib`, потому что по умолчанию Node найдет и запустит `index.js` из указанной папки (мы используем переменную `libDir`, чтобы соответствовать принципу DRY). `require('child_process').exec` и `exec` - это функции самого Node, вызывающие консольные команды. Мы перенаправим `stdout` в `console.log()` и возвратим возможную ошибку через функцию обратного вызова (callback), которая передается в `gulp.task` в качестве аргумента. Не переживайте, если эта команда не совсем ясна для вас, помните, что эта задача просто запускает `node lib`.
 - `watch` запускает задчу `main`, когда происходят изменения файловой системы для указанных файлов.
 - `default` - это специальная задача, которая запускается, если вы просто вызываете `gulp` из CLI (коммандной строки). В нашем случае, мы хотим сначала запустить `main` (один раз), а затем `watch`.
 
@@ -83,7 +83,7 @@ Gulp, сам по себе, имеет довольно понятный API. О
 Отлично! Посмотрим как это работает.
 
 - В `package.json`, замените скрипт `start` на: `"start": "gulp"`.
-- Запустите `yarn start`. Должно вывестись "Hello ES6" и запустится автоматическое отслеживание изменений. Попробуйте ввести неверный код в `src/index.js` и увидите после сохранения, как  Gulp автоматически указывает на ошибку.
+- Запустите `yarn start`. Должно выйти "Hello ES6" и запуститься автоматическое отслеживание изменений. Попробуйте ввести неверный код в `src/index.js` и увидите после сохранения, как  Gulp автоматически указывает на ошибку.
 
 - Добавьте `/lib/` в `.gitignore`
 
diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 55818ac..8d9933f 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -4,7 +4,7 @@
 
 В `dog.js`, мы также заменим `module.exports = Dog` на `export default Dog`.
 
-Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, можно напрямую экспортировать анонимный класс. Таким образом:  
+Заметьте, что в `dog.js` переменная `Dog` используется только в `export`. Поэтому, можно напрямую экспортировать анонимный класс следующим образом:
 
 ```javascript
 export default class {
@@ -18,7 +18,7 @@ export default class {
 }
 ```
 
-ВВы возможно уже догадались, что имя 'Dog' используется в строке`import` файла `index.js` абсолютно по вашему усмотрению. Вполне будет работать:
+Вы, возможно, уже догадались, что имя 'Dog' используется в строке`import` файла `index.js` абсолютно по вашему усмотрению. Вполне будет работать:
 
 ```javascript
 import Cat from './dog';
@@ -43,7 +43,7 @@ import { exec } from 'child_process';
 
 Обратите внимение на "синтаксический сахар", позволяющий получать `exec` напрямую из `child_process`. Довольно элегантно!
 
-- `yarn start` должно по прежнему выдавать "Wah wah, I am Toby".
+- `yarn start` должно по-прежнему выдавать "Wah wah, I am Toby".
 
 Следующий раздел: [6 - ESLint](/tutorial/6-eslint)
 
diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index 5374caf..fdc827d 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -1,6 +1,6 @@
 # 6 - ESLint
 
-Мы собираемся контролировать качество кода (англ. lint - прим. переводчика), чтобы перехватывать потенциальные проблемы. ESLint - наиболее предпочтительный анализатор кода (англ. linter - прим. переводчика) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
+Мы собираемся контролировать качество кода (to lint), чтобы перехватывать потенциальные проблемы. ESLint - наиболее предпочтительный анализатор кода (linter) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
 
 - Запустите `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
 
@@ -19,7 +19,7 @@
 
 **Примечание**: Вместо свойства `eslintConfig` в `package.json` можно использовать файл `.eslintrc.js` в корне вашего проекта. Так же как и с конфигурацией Babel, мы стараемся избегать загромождения корневой директории большим количеством файлов, но если у вас сложная конфигурация ESLint, рассмотрите такую альтернативу.
 
-Создадим задачу для Gulp, которая будет запускать ESLint. Поэтому установим плагин ESLint для Gulp: (Для этого также установим плагин ESLint для Gulp)
+Создадим задачу для Gulp, которая будет запускать ESLint. Для этого установим еще и плагин ESLint для Gulp:
 
 - запустите `yarn add --dev gulp-eslint`
 
@@ -57,9 +57,9 @@ gulp.task('build', ['lint', 'clean'], () => {
 });
 ```
 
-- Запустите `yarn start`. Вы должны увидеть набор ошибок кода (англ. linting errors - прим. переводчика) в этом Gulp-файле и предупреждения об использовании `console.log()` в `index.js`.
+- Запустите `yarn start`. Вы должны увидеть набор ошибок кода (linting errors) в этом Gulp-файле и предупреждения об использовании `console.log()` в `index.js`.
 
-Один из видов ошибок будет выглядить следующим образом: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в ~~скомпилированное приложение~~ (англ. build - прим. переводчика ) а какие нет. Поэтому мы немного поможем ESLint используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
+Один из видов ошибок будет выглядить следующим образом: `'gulp' should be listed in the project's dependencies, not devDependencies (import/no-extraneous-dependencies)` ('gulp' должен подключаться в разделе `dependencies`, а не `devDependencies`). Вообще-то это неверная ошибка. ESLint не может знать какие JS файлы будут входить только в скомпилированное приложение (build), а какие нет. Поэтому мы немного поможем ESLint, используя комментарии в коде. В `gulpfile.babel.js`, в самом верху, добавьте:
 
 ```javascript
 /* eslint-disable import/no-extraneous-dependencies */
@@ -81,7 +81,7 @@ gulp.task('build', ['lint', 'clean'], () => {
 () => 1
 ```
 
-Потому что, когда в ES6 функция содержит только возвращаемое выражение, можно опустить фигурные скобки, оператор return и точку с запятой.
+Потому что, когда ES6 функция содержит только возвращаемое выражение, можно опустить фигурные скобки, оператор return и точку с запятой.
 
 Так что давайте обновим Gulp-файл соответственно:
 
@@ -105,7 +105,7 @@ gulp.task('build', ['lint', 'clean'], () =>
 );
 ```
 
-Последняя оставшаяся проблема связана с `console.log()`. Давайте скажем, что мы хотим в этом примере, чтобы использование `console.log()` в `index.js` было правомерным, а не вызывало предупреждение. Как вы, возможно, догадались мы поместим `/* eslint-disable no-console */` в начале нашего `index.js` файла.
+Последняя оставшаяся проблема связана с `console.log()`. Давайте скажем, что мы хотим в этом примере, чтобы использование `console.log()` в `index.js` было правомерным, а не вызывало предупреждение. Как вы, возможно, догадались, мы поместим `/* eslint-disable no-console */` в начале нашего `index.js` файла.
 
 - Запустите `yarn start` - теперь все снова без ошибок.
 
diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index 4577e48..604f7a0 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -2,7 +2,6 @@
 
 ## Структура нашего приложения
 
-- Create a `dist` folder at the root of your project, and add the following `index.html` file to it:
 - Создайте директорию `dist` в корне вашего проекта, и добавьте туда файл `index.html` со следующим содержанием:
 
 ```html
@@ -19,8 +18,7 @@
 
 В директории `src` создайте следующие поддиректории: `server`, `shared`, `client` и переместите текущий `index.js`  в папку `server`, а `dog.js` в `shared`. Создайте `app.js` в директории `client`.
 
-We are not going to do any Node back-end yet, but this separation will help you see more clearly where things belong. You'll need to change the `import Dog from './dog';` in `server/index.js` to `import Dog from '../shared/dog';` though, or ESLint will detect errors for unresolved modules.
-Мы пока что не собираемся создавать на Node серверную часть, но это разделение поможет более ясно понять что к чему относится. Вам нужно заменить `import Dog from './dog';` в `server/index.js` на `import Dog from '../shared/dog';`, иначе ESLint обнаружит ошибки неразрешаемых модулей.
+Мы пока не собираемся создавать на Node серверную часть, но это разделение поможет более ясно понять, что к чему относится. Вам нужно заменить `import Dog from './dog';` в `server/index.js` на `import Dog from '../shared/dog';`, иначе ESLint обнаружит ошибки неразрешаемых модулей.
 
 Напишите в `client/app.js`:
 
@@ -39,9 +37,9 @@ document.querySelector('.app').innerText = browserToby.bark();
   "browser": true
 }
 ```
-Таким образом мы сможем использовать такие переменные как `window` или `document`, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
+Таким образом мы сможем использовать такие переменные как window или document, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
 
-Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания - прим. пер.), вам нужно включить [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
+Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания), вам нужно включить полифил (polyfill) [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
 
 - Запустите `yarn add babel-polyfill`
 
@@ -51,17 +49,17 @@ document.querySelector('.app').innerText = browserToby.bark();
 import 'babel-polyfill';
 ```
 
-Включение ~~полифила~~ (англ. polyfill) прибавляет объема вашей сборке, поэтому подключайте  его только когда применяете конструкции, которые он охватывает. Для того, чтобы показать более полный шаблон кода в этом руководстве, я его применяю, и он появится примерах в следующих частях.
+Включение полифила (polyfill) прибавляет объема вашей сборке, поэтому подключайте его только тогда, когда применяете конструкции, которые он охватывает. Для того, чтобы показать более полный шаблон кода в этом руководстве, я буду его применять. Он появится в примерах в следующих частях.
 
 ## Webpack
 
-В среде Node вы можете свободно использовать `import` для различных файлов и Node разрешит (англ. resolve) их посредством файловой системы. В браузере файловая система отсутствует, следовательно `import` ведет в никуда. Для того чтобы `app.js`, являющийся точкой входа для приложения, получил всю древовидную структуру импортируемых файлов, мы собираемся "собрать" все это дерево зависимостей в один файл. Webpack - нужный для этого инструмент.
+В среде Node вы можете свободно использовать `import` для различных файлов, и Node разрешит (англ. resolve) их посредством файловой системы. В браузере файловая система отсутствует, следовательно `import` ведет в никуда. Для того чтобы `app.js`, являющийся точкой входа для приложения, получил всю древовидную структуру импортируемых файлов, мы собираемся "собрать" все это дерево зависимостей в один файл. Webpack - нужный для этого инструмент.
 
 Webpack, как и Gulp, использует конфигурационные файлы вида `webpack.config.js`. В них возможно использование ES6 импорта и экспорта точно таким же способом, как мы делали с Gulp относительно Babel: обозначая этот файл как `webpack.config.babel.js`.
 
 - Создайте пустой файл `webpack.config.babel.js`
 
-- Пока вы в нем, добавьте `webpack.config.babel.js` в задачу `lint` в Gulp, и еще несколько констант с путями (`paths` - англ):
+- Пока вы в нем, добавьте `webpack.config.babel.js` в задачу `lint` в Gulp, и еще несколько констант с путями (`paths`):
 
 ```javascript
 const paths = {
@@ -86,7 +84,7 @@ gulp.task('lint', () =>
 );
 ```
 
-Мы должы научить Webpack обрабатывать ES6 файлы с помощью Babel (точно так же как мы показали Gulp как это делать через `gulp-babel`). Для Webpack, когда нужно обработать файлы, не являющиеся простым старым JavaScript, мы используем *загрузчики* (loaders). Давайте установим загрузчик Babel для Webpack:
+Мы должы научить Webpack обрабатывать ES6 файлы с помощью Babel (точно так же, как мы показали Gulp, как это делать через `gulp-babel`). Для Webpack, когда нужно обработать файлы, не являющиеся простым старым JavaScript, мы используем *загрузчики* (loaders). Давайте установим загрузчик Babel для Webpack:
 
 - Запустите `yarn add --dev babel-loader`
 
@@ -115,18 +113,17 @@ export default {
 
 Давайте это немного проанализируем:
 
-Этот файл нужен чтобы сообщить Webpack некоторую информацию. `output.filename` - имя файла генерируемой сборки. `devtool: 'source-map'` - позволяет использовать source maps (карты кода) для упрощения отладки в браузере. В `module.loaders` есть свойство `test` с регулярным выражением, определяющим какие файлы должны обрабатываться загрузчиком `babel-loader`. Поскольку мы будем использовать как `.js` так и `.jsx` файлы (для React) в следующих частях, наше выражение выглядит как `/\.jsx?$/`. Директория `node_modules` исключена (exclude) поскольку ее не нужно транспилировать. Таким образом, когда код импортирует (`import`) пакеты, расположенные в `node_modules`, Babel не тратит время на обработку этих файлов. Раздел `resolve` сообщает Webpack файлы какого типа мы хотим подключать через `import`, позволяя тем самым опускать расширения в именах файлов, например как в `import Foo from './foo'`, где `foo` может быть `foo.js` или `foo.jsx`.
+Этот файл нужен, чтобы сообщить Webpack некоторую информацию. `output.filename` - имя файла генерируемой сборки. `devtool: 'source-map'` - позволяет использовать source maps (карты кода) для упрощения отладки в браузере. В `module.loaders` есть свойство `test` с регулярным выражением, определяющим какие файлы должны обрабатываться загрузчиком `babel-loader`. Поскольку мы будем использовать как `.js` так и `.jsx` файлы (для React) в следующих частях, наше выражение выглядит как `/\.jsx?$/`. Директория `node_modules` исключена (exclude), поскольку ее не нужно транспилировать. Таким образом, когда код импортирует (`import`) пакеты, расположенные в `node_modules`, Babel не тратит время на обработку этих файлов. Раздел `resolve` сообщает Webpack, файлы какого типа мы хотим подключать через `import`, позволяя тем самым опускать расширения в именах файлов, например как в `import Foo from './foo'`, где `foo` может быть `foo.js` или `foo.jsx`.
 
-И так, мы настроили Webpack, но нам до сих пор требуется способ *запустить* его.
+Итак, мы настроили Webpack, но нам до сих пор требуется способ *запустить* его.
 
 ## Подключение Webpack к Gulp
 
-Webpack может делать множество вещей. Он даже может полностью заменить Gulp, если проект в основном выполняется на стороне клиента. Gulp в свою очередь, как более общий инструмент, больше подходит для таких вещей как анализ кода (linting), тестирование, запуск задач на стороне сервера. Он так же проще в понимании для новичков чем чем сложное конфигурирование Webpack. У нас уже довольно хорошо настроен рабочий процесс на базе Gulp, так что интеграция Webpack в процес сборки пройдет проще простого.
+Webpack может делать множество вещей. Он даже может полностью заменить Gulp, если проект в основном выполняется на стороне клиента. Gulp в свою очередь, как более общий инструмент, больше подходит для таких вещей как анализ кода (linting), тестирование, запуск задач на стороне сервера. Он так же проще в понимании для новичков, чем сложное конфигурирование Webpack. У нас уже довольно хорошо настроен рабочий процесс на базе Gulp, так что интеграция Webpack в процесс сборки пройдет проще простого.
 
 Давайте создадим в Gulp задачу по запуску Webpack. Откройте `gulpfile.babel.js`.
-
-We don't need the `main` task to execute `node lib/` anymore, since we will open `index.html` to run our app. 
-Поскольку мы ~~will open~~ `index.html` чтобы запускать наше приложение, нам больше не требуется задача `main` чтобы выполнять `node lib/`.
+ 
+Поскольку мы будем запускать наше приложение, открывая `index.html`, нам больше не требуется задача `main` чтобы выполнять `node lib/`.
 
 - Уберите `import { exec } from 'child_process'`.
 
@@ -174,11 +171,11 @@ gulp.task('main', ['lint', 'clean'], () =>
 );
 ```
 
-**Замечание**: Задача `build` сейчас транспилирует код ES6 в ES5 для каждого `.js` файла, расположенного в `src`. Поскольку мы разделили код на  `server`, `shared` и `client`, то мы могли бы компилировать только `server` и `shared` (поскольку Webpack позаботится о `client`). Тем не менее, в разделе Тестирование нам потребуется Gulp для компиляции клиентского кода чтобы тестировать его вне Webpack. Так что пока-что мы не дойдем до этого раздела, будет ~~несколько избыточное дублирование в~~ `build`. Давайте договоримся, что пока это нормально. Вообще мы даже не будем использовать `build` и директорию `lib` пока не доберемся до этой части, так что все что нас сейчас волнует - это клиентская сборка.
+**Примечание**: Задача `build` сейчас транспилирует код ES6 в ES5 для каждого `.js` файла, расположенного в `src`. Поскольку мы разделили код на  `server`, `shared` и `client`, мы могли бы компилировать только `server` и `shared` (т.к. Webpack позаботится о `client`). Тем не менее, в разделе Тестирование нам потребуется Gulp для компиляции клиентского кода, чтобы тестировать его вне Webpack. Так что, пока мы не дойдем до этого раздела, будет несколько избыточное дублирование в `build`. Давайте договоримся, что пока это нормально. Вообще, мы даже не будем использовать `build` и директорию `lib` пока не доберемся до этой части, так что, все, что нас сейчас волнует - это клиентская сборка.
 
 - Запустите `yarn start`, вы должны увидеть построенный Webpack файл `client-bundle.js`. Откройте `index.html` в браузере. Должно отобразиться "Wah wah, I am Browser Toby".
 
-Одна последняя вещь: в отличие от директории `lib`, файлы `dist/client-bundle.js` и `dist/client-bundle.js.map` не очищаются задачей `clean` перед каждой сборкой.
+Еще одна вещь: в отличие от директории `lib`, файлы `dist/client-bundle.js` и `dist/client-bundle.js.map` не очищаются задачей `clean` перед каждой сборкой.
 
 - Добавьте `clientBundle: 'dist/client-bundle.js?(.map)'` в нашу конфигурацию путей (`paths`), и настройте задачу `clean` следующим образом:
 
diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index 0f9f67f..71375f9 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -32,7 +32,7 @@ App.propTypes = {
 ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
 ```
 
-**Примечание**: Если вы не знакомы с React или его PropTypes, ознакомьтесь сначала с ним и затем возвращайтесь в это руководство. В следующих главах мы будем использовать React, поэтому вам понадобится хорошее (его) понимание этой библиотеки.
+**Примечание**: Если вы не знакомы с React или его PropTypes (типы параметров), ознакомьтесь сначала с ним и затем возвращайтесь в это руководство. В следующих главах мы будем использовать React, поэтому вам понадобится хорошее его понимание.
 
 В Gulp файле, измените в `clientEntryPoint` расширение на `.jsx`:
 
@@ -40,9 +40,9 @@ ReactDOM.render(<App message={dogBark} />, document.querySelector('.app'));
 clientEntryPoint: 'src/client/app.jsx',
 ```
 
-Поскольку мы используем синтакс JSX, нам так же нужен Babel для его обработки.
-Установите React Babel preset, который научит Babel обрабатывать JSX синтакс:
-`yarn add --dev babel-preset-react` и откорректируйте раздел `babel` в `package.json` следующим образом:
+Поскольку мы используем синтаксис JSX, нам так же нужен Babel для его обработки.
+Установите React Babel preset, который научит Babel обрабатывать JSX синтаксис
+`yarn add --dev babel-preset-react`, и откорректируйте раздел `babel` в `package.json` следующим образом:
 
 ```json
 "babel": {
@@ -53,10 +53,10 @@ clientEntryPoint: 'src/client/app.jsx',
 },
 ```
 
-Теперь, после запуска `yarn start`, открыв `index.html`, мы должны увидеть "The dog says: Wah wah, I am Browser Toby" сгенерированное React.
+Теперь, после запуска `yarn start`, открыв `index.html`, мы должны увидеть "The dog says: Wah wah, I am Browser Toby", сгенерированное React.
 
 
 
 Следующий раздел: [9 - Redux](/tutorial/9-redux)
 
-Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
\ No newline at end of file
+Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index 4d30928..a40498a 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -4,7 +4,7 @@
 
 - **хранилище** (store) - простой JavaScript объект, представляющий состояние вашего приложения;
 - **действия** (actions), которые обычно запускаются пользователем;
-- **редюсеры** (reducers), которые можно рассматривать как обработчики действий.
+- **редюсеры** (reducers),которые можно рассматривать как обработчики действий.
 
 Редюсеры воздествуют на состояние приложения (**хранилище**), и когда состояние приложения изменяется, что-то происходит в вашем приложении. Хорошая визуальная демонстрация Redux находится [здесь](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
 
@@ -161,4 +161,4 @@ export default connect(mapStateToProps)(Message);
 
 Следующий раздел: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
 
-Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
\ No newline at end of file
+Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
-- 
GitLab


From c082c000180a2b55bc152126d9c4fc09632c2983 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Sun, 13 Nov 2016 18:19:33 +0700
Subject: [PATCH 51/73] check

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 14b288d..ec3aba5 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
 
 >Это русскоязычная версия руководства Джонатана Верекии ([@verekia](https://twitter.com/verekia)). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
 
-## Перевод практически завершен. Идет правка текста.
+### Перевод практически завершен. Идет правка текста.
 
 [будем благодарны за помощь в обнаружении опечаток и неточностей](https://github.com/UsulPro/js-stack-from-scratch/issues)
 
-- 
GitLab


From 963901cb422545622449327cfc3366f0ffcb2362 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Sun, 13 Nov 2016 18:57:33 +0700
Subject: [PATCH 52/73] check

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 14b288d..ec3aba5 100644
--- a/README.md
+++ b/README.md
@@ -15,7 +15,7 @@
 
 >Это русскоязычная версия руководства Джонатана Верекии ([@verekia](https://twitter.com/verekia)). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
 
-## Перевод практически завершен. Идет правка текста.
+### Перевод практически завершен. Идет правка текста.
 
 [будем благодарны за помощь в обнаружении опечаток и неточностей](https://github.com/UsulPro/js-stack-from-scratch/issues)
 
-- 
GitLab


From 30229fc4441e8caa911d43f23934c5d776638000 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Sun, 13 Nov 2016 19:15:56 +0700
Subject: [PATCH 53/73] upd enlish ver to
 11d7ac52647b602ba2d2840f600a05542e9f2845

---
 READMEeng.md                                  | 11 +++--
 how-to-translate.md                           |  8 +++-
 mdlint.js                                     | 23 ++++++++++
 package.json                                  |  5 +-
 .../1-node-npm-yarn-package-json/READMEeng.md |  7 +--
 .../READMEeng.md                              |  6 ++-
 .../11-testing-mocha-chai-sinon/READMEeng.md  |  5 +-
 tutorial/12-flow/READMEeng.md                 |  6 ++-
 tutorial/2-packages/READMEeng.md              |  3 +-
 tutorial/3-es6-babel-gulp/READMEeng.md        |  8 ++--
 tutorial/4-es6-syntax-class/READMEeng.md      |  6 +--
 tutorial/5-es6-modules-syntax/READMEeng.md    |  3 +-
 tutorial/6-eslint/READMEeng.md                |  9 ++--
 tutorial/7-client-webpack/READMEeng.md        |  3 +-
 tutorial/8-react/READMEeng.md                 |  3 +-
 tutorial/9-redux/READMEeng.md                 | 11 ++---
 yarn.lock                                     | 46 ++++++++++++++++++-
 17 files changed, 122 insertions(+), 41 deletions(-)
 create mode 100644 mdlint.js

diff --git a/READMEeng.md b/READMEeng.md
index 27cfdaa..d9ab0b2 100644
--- a/READMEeng.md
+++ b/READMEeng.md
@@ -1,5 +1,7 @@
 # JavaScript Stack from Scratch
 
+[![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch) [![Join the chat at https://gitter.im/js-stack-from-scratch/Lobby](https://badges.gitter.im/js-stack-from-scratch/Lobby.svg)](https://gitter.im/js-stack-from-scratch/Lobby)
+
 [![Yarn](/img/yarn.png)](https://yarnpkg.com/)
 [![React](/img/react.png)](https://facebook.github.io/react/)
 [![Gulp](/img/gulp.png)](http://gulpjs.com/)
@@ -10,13 +12,11 @@
 [![Chai](/img/chai.png)](http://chaijs.com/)
 [![Flow](/img/flow.png)](https://flowtype.org/)
 
-[![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch)
-
 Welcome to my modern JavaScript stack tutorial: **JavaScript Stack from Scratch**.
 
 This is a minimalistic and straight-to-the-point guide to assembling a JavaScript stack. It requires some general programming knowledge, and JavaScript basics. **It focuses on wiring tools together** and giving you the **simplest possible example** for each tool. You can see this tutorial as *a way to write your own boilerplate from scratch*.
 
-You don't need to use this entire stack if you build a simple web page with a few JS interactions of course (a combination of Babel + jQuery is enough!), but if you want to build a web app that scales, and need help setting things up, this tutorial will work great for you.
+You don't need to use this entire stack if you build a simple web page with a few JS interactions of course (a combination of Browserify/Webpack + Babel + jQuery is enough to be able to write ES6 code in different files with CLI compilation), but if you want to build a web app that scales, and need help setting things up, this tutorial will work great for you.
 
 Since the goal of this tutorial is to assemble various tools, I do not go into details about how these tools work individually. Refer to their documentation or find other tutorials if you want to acquire deeper knowledge in them.
 
@@ -62,8 +62,9 @@ Production / development environments, Express, React Router, Server-Side Render
 
 ## Translations
 
-- [Chinese](https://github.com/pd4d10/js-stack-from-scratch) by [@pd4d10](http://github.com/pd4d10)
-- [Italian](https://github.com/fbertone/js-stack-from-scratch) by [Fabrizio Bertone](https://github.com/fbertone)
+- [中文](https://github.com/pd4d10/js-stack-from-scratch) by [@pd4d10](http://github.com/pd4d10)
+- [Italiano](https://github.com/fbertone/js-stack-from-scratch) by [Fabrizio Bertone](https://github.com/fbertone)
+- [日本語](https://github.com/takahashim/js-stack-from-scratch) by [@takahashim](https://github.com/takahashim)
 
 If you want to add your translation, please read the [translation recommendations](/how-to-translate.md) to get started!
 
diff --git a/how-to-translate.md b/how-to-translate.md
index 28ac21e..102687c 100644
--- a/how-to-translate.md
+++ b/how-to-translate.md
@@ -6,10 +6,14 @@ This tutorial is in constant evolution to provide the best learning experience t
 
 Here is what I think is a good workflow:
 
-- Check if there is already a translation issue open for your language. If that's the case, get in touch with the folks who opened it and consider collaborating. All maintainers will be mentioned on the English repo, so team work is encouraged!
+- Check if there is already a translation issue open for your language. If that's the case, get in touch with the folks who opened it and consider collaborating. All maintainers will be mentioned on the English repo, so team work is encouraged! You can open issues on their translation fork project to offer your help on certain chapters for instance.
+
+- Join the [Translations Gitter room](https://gitter.im/js-stack-from-scratch/Translations) if you're feeling chatty.
 
 - Fork the main [English repository](https://github.com/verekia/js-stack-from-scratch).
 
+- Open an issue on the English repo to show you're currently working on a translation.
+
 - Translate the `README.md` files.
 
 - Add a note somewhere explaining on the main `README.md` that this is a translation, with a link to the English repository. If you don't plan to make the translation evolve over time, you can maybe add a little note saying to refer to the English one for an up-to-date version of the tutorial. I'll leave that up to your preference.
@@ -30,6 +34,8 @@ Since I want to reward you for your good work as much as possible, you can put a
 
 - After your original one-shot translation, if you want to update your repo with the latest change from the main English repo, [sync your fork](https://help.github.com/articles/syncing-a-fork/) with my repo. To make it easy to see what changed since your initial translation, you can use Github's feature to [compare commits](https://help.github.com/articles/comparing-commits-across-time/#comparing-commits). Set the **base** to the last commit from the English repo you used to translate, and compare it to **master**, like so:
 
+<!-- markdownlint-disable MD034 -->
 https://github.com/verekia/js-stack-from-scratch/compare/dfab78b581a3da800daeb3686b900dd9ea972da0...master
+<!-- markdownlint-enable MD034 -->
 
 That should give you a easy-to-read diff to see exactly what changed in `README.md` files since your translation!
diff --git a/mdlint.js b/mdlint.js
new file mode 100644
index 0000000..101582f
--- /dev/null
+++ b/mdlint.js
@@ -0,0 +1,23 @@
+const glob = require('glob');
+const markdownlint = require('markdownlint');
+
+const config = {
+  'default': true,
+  'line_length': false,
+  'no-emphasis-as-header': false
+}
+
+const files = glob.sync('**/*.md', { ignore: '**/node_modules/**' });
+
+markdownlint({ files, config }, (err, result) => {
+  if (!err) {
+    const resultString = result.toString();
+    console.log('== Linting Markdown Files...');
+    if (resultString) {
+      console.log(resultString);
+      process.exit(1);
+    } else {
+      console.log('== OK!');
+    }
+  }
+});
diff --git a/package.json b/package.json
index 41d42b2..e4aa2a3 100644
--- a/package.json
+++ b/package.json
@@ -3,9 +3,12 @@
   "version": "1.0.0",
   "description": "JavaScript Stack from Scratch - Step-by-step tutorial to build a modern JavaScript stack",
   "scripts": {
-    "test": "cd tutorial/1-node-npm-yarn-package-json && yarn && yarn run tutorial-test && cd ../2-packages && yarn && yarn run tutorial-test && cd ../3-es6-babel-gulp && yarn && yarn run tutorial-test && cd ../4-es6-syntax-class && yarn && yarn run tutorial-test && cd ../5-es6-modules-syntax && yarn && yarn run tutorial-test && cd ../6-eslint && yarn && yarn run tutorial-test && cd ../7-client-webpack && yarn && yarn run tutorial-test && cd ../8-react && yarn && yarn run tutorial-test && cd ../9-redux && yarn && yarn run tutorial-test && cd ../10-immutable-redux-improvements && yarn && yarn run tutorial-test && cd ../11-testing-mocha-chai-sinon && yarn && yarn run tutorial-test && cd ../12-flow && yarn && yarn run tutorial-test"
+    "test": "yarn run mdlint && cd tutorial/1-node-npm-yarn-package-json && yarn && yarn run tutorial-test && cd ../2-packages && yarn && yarn run tutorial-test && cd ../3-es6-babel-gulp && yarn && yarn run tutorial-test && cd ../4-es6-syntax-class && yarn && yarn run tutorial-test && cd ../5-es6-modules-syntax && yarn && yarn run tutorial-test && cd ../6-eslint && yarn && yarn run tutorial-test && cd ../7-client-webpack && yarn && yarn run tutorial-test && cd ../8-react && yarn && yarn run tutorial-test && cd ../9-redux && yarn && yarn run tutorial-test && cd ../10-immutable-redux-improvements && yarn && yarn run tutorial-test && cd ../11-testing-mocha-chai-sinon && yarn && yarn run tutorial-test && cd ../12-flow && yarn && yarn run tutorial-test",
+    "mdlint": "node mdlint.js"
   },
   "devDependencies": {
+    "glob": "^7.1.1",
+    "markdownlint": "^0.3.0",
     "yarn": "^0.16.1"
   },
   "repository": "verekia/js-stack-from-scratch",
diff --git a/tutorial/1-node-npm-yarn-package-json/READMEeng.md b/tutorial/1-node-npm-yarn-package-json/READMEeng.md
index 05d7484..2bdab96 100644
--- a/tutorial/1-node-npm-yarn-package-json/READMEeng.md
+++ b/tutorial/1-node-npm-yarn-package-json/READMEeng.md
@@ -12,6 +12,7 @@ For instance, on **Ubuntu / Debian**, you would run the following commands to in
 curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
 sudo apt-get install -y nodejs
 ```
+
 You want any version of Node > 6.5.0.
 
 `npm`, the default package manager for Node, comes automatically with Node, so you don't have to install it yourself.
@@ -31,7 +32,7 @@ Running `node .` to execute our program is a bit too low-level. We are going to
 
 - In `package.json`, add a `scripts` object to the root object like so:
 
-```
+```json
 "scripts": {
   "start": "node ."
 }
@@ -43,7 +44,7 @@ Running `node .` to execute our program is a bit too low-level. We are going to
 
 - Create a `.gitignore` file and add the following to it:
 
-```
+```gitignore
 npm-debug.log
 yarn-error.log
 ```
@@ -52,4 +53,4 @@ yarn-error.log
 
 Next section: [2 - Installing and using a package](/tutorial/2-packages)
 
-Back to the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/10-immutable-redux-improvements/READMEeng.md b/tutorial/10-immutable-redux-improvements/READMEeng.md
index ca56507..d0c2af4 100644
--- a/tutorial/10-immutable-redux-improvements/READMEeng.md
+++ b/tutorial/10-immutable-redux-improvements/READMEeng.md
@@ -10,7 +10,9 @@ First, we are going to add **Immutable JS** to our codebase. Immutable is a libr
 const obj = { a: 1 };
 obj.a = 2; // Mutates `obj`
 ```
+
 You would do:
+
 ```javascript
 const obj = Immutable.Map({ a: 1 });
 obj.set('a', 2); // Returns a new object without mutating `obj`
@@ -35,6 +37,7 @@ We are going to use `Map` in our codebase, but ESLint and the Airbnb config will
   ]
 }
 ```
+
 This makes `Map` and `List` (the 2 Immutable objects you'll use all the time) exceptions to that ESLint rule. This verbose JSON formatting is actually done automatically by Yarn/NPM, so we cannot make it more compact unfortunately.
 
 Anyway, back to Immutable:
@@ -78,6 +81,7 @@ The app should still behave exactly the way it did before.
 As you can see from the code snippet above, our state object still contains a plain old `dog` object attribute, which isn't immutable. It is fine this way, but if you want to only manipulate immutable objects, you could install the `redux-immutable` package to replace Redux's `combineReducers` function.
 
 **Optional**:
+
 - Run `yarn add redux-immutable`
 - Replace your `combineReducers` function in `app.jsx` to use the one imported from `redux-immutable` instead.
 - In `bark-message.js` replace `state.dog.get('hasBarked')` by `state.getIn(['dog', 'hasBarked'])`.
@@ -99,4 +103,4 @@ export const makeBark = createAction(MAKE_BARK, () => true);
 
 Next section: [11 - Testing with Mocha, Chai, and Sinon](/tutorial/11-testing-mocha-chai-sinon)
 
-Back to the [previous section](/tutorial/9-redux) or the [table of contents](/README.md).
+Back to the [previous section](/tutorial/9-redux) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/11-testing-mocha-chai-sinon/READMEeng.md b/tutorial/11-testing-mocha-chai-sinon/READMEeng.md
index 53a2766..08653bf 100644
--- a/tutorial/11-testing-mocha-chai-sinon/READMEeng.md
+++ b/tutorial/11-testing-mocha-chai-sinon/READMEeng.md
@@ -42,6 +42,7 @@ describe('App State', () => {
   });
 });
 ```
+
 Alright, let's analyze this whole thing.
 
 First, notice how we import the `should` assertion style from `chai`. This lets us assert things using a syntax like `mynumber.should.equal(3)`, pretty neat. In order to be able to call `should` on any object, we need to run the function `should()` before anything. Some of these assertion are *expressions*, like `mybook.should.be.true`, which will make ESLint grumpy, so we've added an ESLint comment at the top to disable the `no-unused-expressions` rule in this file.
@@ -52,7 +53,7 @@ Our `makeBark` test is very explicit, and the description provided as a string i
 
 Alright, let's run this test!
 
-- Create the following `test` task, which relies on the `gulp-mocha` plugin:
+- In `gulpfile.babel.js`, create the following `test` task, which relies on the `gulp-mocha` plugin:
 
 ```javascript
 import mocha from 'gulp-mocha';
@@ -154,4 +155,4 @@ If everything went well in this chapter, you should have 2 passing tests.
 
 Next section: [12 - Type Checking with Flow](/tutorial/12-flow)
 
-Back to the [previous section](/tutorial/10-immutable-redux-improvements) or the [table of contents](/README.md).
+Back to the [previous section](/tutorial/10-immutable-redux-improvements) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/12-flow/READMEeng.md b/tutorial/12-flow/READMEeng.md
index f80e409..694a1b0 100644
--- a/tutorial/12-flow/READMEeng.md
+++ b/tutorial/12-flow/READMEeng.md
@@ -96,13 +96,15 @@ import * as Immutable from 'immutable';
 Until Immutable officially adresses the issue, just pick whichever looks better to you when importing Immutable components. I'm personally going for `import * as Immutable from 'immutable'` since it's shorter and won't require refactoring the code when this issue gets fixed.
 
 **Note**: If Flow detects type errors in your `node_modules` folder, add an `[ignore]` section in your `.flowconfig` to ignore the packages causing issues specifically (do not ignore the entire `node_modules` directory). It could look like this:
-```
+
+```flowconfig
 [ignore]
 
 .*/node_modules/gulp-flowtype/.*
 ```
+
 In my case, the `linter-flow` plugin for Atom was detecting type errors in the `node_modules/gulp-flowtype` directory, which contains files annotated with `// @flow`.
 
 You now have bullet-proof code that is linted, typechecked, and tested, good job!
 
-Back to the [previous section](/tutorial/11-testing-mocha-chai-sinon) or the [table of contents](/README.md).
+Back to the [previous section](/tutorial/11-testing-mocha-chai-sinon) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/2-packages/READMEeng.md b/tutorial/2-packages/READMEeng.md
index 66b71a6..dd694b1 100644
--- a/tutorial/2-packages/READMEeng.md
+++ b/tutorial/2-packages/READMEeng.md
@@ -25,7 +25,6 @@ Congratulations, you installed and used a package!
 
 **Note**: There are 2 kinds of package dependencies, `"dependencies"` and `"devDependencies"`. `"dependencies"` is more general than `"devDependencies"`, which are packages that you only need during development, not production (typically, build-related packages, linters, etc). For `"devDependencies"`, we will use `yarn add --dev [package]`.
 
-
 Next section: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
 
-Back to the [previous section](/tutorial/1-node-npm-yarn-package-json) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/1-node-npm-yarn-package-json) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/3-es6-babel-gulp/READMEeng.md b/tutorial/3-es6-babel-gulp/READMEeng.md
index 64543c1..483e08e 100644
--- a/tutorial/3-es6-babel-gulp/READMEeng.md
+++ b/tutorial/3-es6-babel-gulp/READMEeng.md
@@ -5,7 +5,8 @@ We're now going to use ES6 syntax, which is a great improvement over the "old" E
 - Run `yarn add --dev gulp`
 - Run `yarn add --dev gulp-babel`
 - Run `yarn add --dev babel-preset-latest`
-- In `package.json`, add a `babel` field for the babel configuration. Make it use the latest Babel preset like this:
+- Run `yarn add --dev del` (for the `clean` task, as you will see below)
+- In `package.json`, add a `babel` field for the Babel configuration. Make it use the latest Babel preset like this:
 
 ```json
 "babel": {
@@ -73,7 +74,7 @@ First we define a `paths` object to store all our different file paths and keep
 Then we define 5 tasks: `build`, `clean`, `main`, `watch`, and `default`.
 
 - `build` is where Babel is called to transform all of our source files located under `src` and write the transformed ones to `lib`.
-- `clean` is a task that simply deletes our entire auto-generated `lib` folder before every `build`. This is typically useful to get rid of old compiled files after renaming or deleting some in `src`, or to make sure the `lib` folder is in sync with the `src` folder if your build fails and you don't notice. We use the `del` package to delete files in a way that integrates well with Gulp's stream (this is the [recommended](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) way to delete files with Gulp). Run `yarn add --dev del` to install that package.
+- `clean` is a task that simply deletes our entire auto-generated `lib` folder before every `build`. This is typically useful to get rid of old compiled files after renaming or deleting some in `src`, or to make sure the `lib` folder is in sync with the `src` folder if your build fails and you don't notice. We use the `del` package to delete files in a way that integrates well with Gulp's stream (this is the [recommended](https://github.com/gulpjs/gulp/blob/master/docs/recipes/delete-files-folder.md) way to delete files with Gulp).
 - `main` is the equivalent of running `node .` in the previous chapter, except this time, we want to run it on `lib/index.js`. Since `index.js` is the default file Node looks for, we can simply write `node lib` (we use the `libDir` variable to keep things DRY). The `require('child_process').exec` and `exec` part in the task is a native Node function that executes a shell command. We forward `stdout` to `console.log()` and return a potential error using `gulp.task`'s callback function. Don't worry if this part is not super clear to you, remember that this task is basically just running `node lib`.
 - `watch` runs the `main` task when filesystem changes happen in the specified files.
 - `default` is a special task that will be run if you simply call `gulp` from the CLI. In our case we want it to run both `watch` and `main` (for the first execution).
@@ -87,7 +88,6 @@ Alright! Let's see if this works.
 
 - Add `/lib/` to your `.gitignore`
 
-
 Next section: [4 - Using the ES6 syntax with a class](/tutorial/4-es6-syntax-class)
 
-Back to the [previous section](/tutorial/2-packages) or the [table of contents](/README.md).
+Back to the [previous section](/tutorial/2-packages) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/4-es6-syntax-class/READMEeng.md b/tutorial/4-es6-syntax-class/READMEeng.md
index 4dc8c7c..3a8848d 100644
--- a/tutorial/4-es6-syntax-class/READMEeng.md
+++ b/tutorial/4-es6-syntax-class/READMEeng.md
@@ -29,13 +29,13 @@ const toby = new Dog('Toby');
 
 console.log(toby.bark());
 ```
+
 As you can see, unlike the community-made package `color` that we used before, when we require one of our files, we use `./` in the `require()`.
 
 - Run `yarn start` and it should print 'Wah wah, I am Toby'.
 
-- Take a look at the code generated in `lib` to see how your compiled code looks like (`var` instead of `const` for instance).
-
+- Take a look at the code generated in `lib` to see what your compiled code looks like (`var` instead of `const` for instance).
 
 Next section: [5 - The ES6 modules syntax](/tutorial/5-es6-modules-syntax)
 
-Back to the [previous section](/tutorial/3-es6-babel-gulp) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/3-es6-babel-gulp) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/5-es6-modules-syntax/READMEeng.md b/tutorial/5-es6-modules-syntax/READMEeng.md
index 0d5ce9e..bdde0ab 100644
--- a/tutorial/5-es6-modules-syntax/READMEeng.md
+++ b/tutorial/5-es6-modules-syntax/READMEeng.md
@@ -25,6 +25,7 @@ import Cat from './dog';
 
 const toby = new Cat('Toby');
 ```
+
 Obviously, most of the time you will use the same name as the class / module you're importing.
 A case where you don't do that is how we `const babel = require('gulp-babel')` in our Gulp file.
 
@@ -47,4 +48,4 @@ Note the syntactic sugar to extract `exec` directly from `child_process`. Pretty
 
 Next section: [6 - ESLint](/tutorial/6-eslint)
 
-Back to the [previous section](/tutorial/4-es6-syntax-class) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/4-es6-syntax-class) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/6-eslint/READMEeng.md b/tutorial/6-eslint/READMEeng.md
index ef29ef2..cf781e0 100644
--- a/tutorial/6-eslint/READMEeng.md
+++ b/tutorial/6-eslint/READMEeng.md
@@ -2,11 +2,12 @@
 
 We're going to lint our code to catch potential issues. ESLint is the linter of choice for ES6 code. Instead of configuring the rules we want for our code ourselves, we will use the config created by Airbnb. This config uses a few plugins, so we need to install those as well to use their config.
 
-- Run `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
+- Run `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y@2.2.3 eslint-plugin-react`
 
 As you can see, you can install several packages in one command. It will add all of these to your `package.json`, as usual.
 
 In `package.json`, add an `eslintConfig` field like so:
+
 ```json
 "eslintConfig": {
   "extends": "airbnb",
@@ -15,9 +16,10 @@ In `package.json`, add an `eslintConfig` field like so:
   ]
 },
 ```
+
 The `plugins` part is to tell ESLint that we use the ES6 import syntax.
 
-**Note**: An `.eslintrc.js` file at the root of your project could also be used instead of the `eslintConfig` field of `package.json`. Just like for the Babel configuration, we try to avoid bloating the root folder with too many files, but if you have a complex ESLint config, consider this alternative.
+**Note**: An `.eslintrc.js`, `.eslintrc.json`, or `.eslintrc.yaml` file at the root of your project could also be used instead of the `eslintConfig` field of `package.json`. Just like for the Babel configuration, we try to avoid bloating the root folder with too many files, but if you have a complex ESLint config, consider this alternative.
 
 We'll create a Gulp task that runs ESLint for us. So we'll install the ESLint Gulp plugin as well:
 
@@ -111,7 +113,6 @@ The last issue left is about `console.log()`. Let's say that we want this `conso
 
 **Note**: This section sets you up with ESLint in the console. It is great for catching errors at build time / before pushing, but you also probably want it integrated to your IDE. Do NOT use your IDE's native linting for ES6. Configure it so the binary it uses for linting is the one in your `node_modules` folder. This way it can use all of your project's config, the Airbnb preset, etc. Otherwise you will just get a generic ES6 linting.
 
-
 Next section: [7 - Client app with Webpack](/tutorial/7-client-webpack)
 
-Back to the [previous section](/tutorial/5-es6-modules-syntax) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/5-es6-modules-syntax) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/7-client-webpack/READMEeng.md b/tutorial/7-client-webpack/READMEeng.md
index f69dcdf..c958dfb 100644
--- a/tutorial/7-client-webpack/READMEeng.md
+++ b/tutorial/7-client-webpack/READMEeng.md
@@ -37,6 +37,7 @@ Add the following to your `package.json`, under `eslintConfig`:
   "browser": true
 }
 ```
+
 This way we can use variables such as `window` or `document` which are always accessible in the browser without ESLint complaining about undeclared variables.
 
 If you want to use some of the most recent ES features in your client code, like `Promise`s, you need to include the [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) in your client code.
@@ -190,4 +191,4 @@ gulp.task('clean', () => del([
 
 Next section: [8 - React](/tutorial/8-react)
 
-Back to the [previous section](/tutorial/6-eslint) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/6-eslint) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/8-react/READMEeng.md b/tutorial/8-react/READMEeng.md
index b612b7d..3281bee 100644
--- a/tutorial/8-react/READMEeng.md
+++ b/tutorial/8-react/READMEeng.md
@@ -55,7 +55,6 @@ Install the React Babel preset, which will teach Babel how to process the JSX sy
 
 Now after running `yarn start`, if we open `index.html`, we should see "The dog says: Wah wah, I am Browser Toby" rendered by React.
 
-
 Next section: [9 - Redux](/tutorial/9-redux)
 
-Back to the [previous section](/tutorial/7-client-webpack) or the [table of contents](https://github.com/verekia/js-stack-from-scratch).
+Back to the [previous section](/tutorial/7-client-webpack) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/tutorial/9-redux/READMEeng.md b/tutorial/9-redux/READMEeng.md
index 6d174d6..82f94bf 100644
--- a/tutorial/9-redux/READMEeng.md
+++ b/tutorial/9-redux/READMEeng.md
@@ -1,12 +1,6 @@
 # 9 - Redux
 
-В этой части (которая наиболее сложная из пройденных), мы добавим в наше приложение [Redux](http://redux.js.org/) ([документация на Русском](https://www.gitbook.com/book/rajdee/redux-in-russian/details)) и подключим его к React. Redux управляет состоянием приложения. Он включает в себя такие понятия, как:  
-
-- **хранилище** (store) - простой JavaScript объект, представляющий состояние вашего приложения;
-- **действия** (actions), которые обычно запускаются пользователем;
-- **редюсеры** (reducers), которые можно рассматривать как обработчики действий.
-
-Редюсеры воздествуют на состояние приложения (**хранилище**), и когда состояние приложения изменяется, что-то происходит в вашем приложении. Хорошая визуальная демонстрация Redux находится [здесь](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
+In this chapter (which is the most difficult so far) we will be adding [Redux](http://redux.js.org/) to our application and will hook it up with React. Redux manages the state of your application. It is composed of a **store** which is a plain JavaScript object representing the state of your app, **actions** which are typically triggered by users, and **reducers** which can be seen as action handlers. Reducers affect your application state (the *store*), and when the application state is modified, things happen in your app. A good visual demonstration of Redux can be found [here](http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9).
 
 In order to demonstrate how to use Redux in the simplest possible way, our app will consist of a message and a button. The message says whether the dog has barked or not (it initially hasn't), and the button makes the dog bark, which should update the message.
 
@@ -26,6 +20,7 @@ export const makeBark = () => ({
   payload: true,
 });
 ```
+
 Here we define an action type, `MAKE_BARK`, and a function (also known as *action creator*) that triggers a `MAKE_BARK` action called `makeBark`. Both are exported because we'll need them both in other files. This action implements the [Flux Standard Action](https://github.com/acdlite/flux-standard-action) model, which is why it has `type` and `payload` attributes.
 
 - In `reducers`, create `dog-reducer.js`:
@@ -161,4 +156,4 @@ export default connect(mapStateToProps)(Message);
 
 Next section: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
 
-Back to the [previous section](/tutorial/8-react) or the [table of contents](/README.md).
+Back to the [previous section](/tutorial/8-react) or the [table of contents](https://github.com/verekia/js-stack-from-scratch#table-of-contents).
diff --git a/yarn.lock b/yarn.lock
index 82a0aec..7c581d5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -33,6 +33,12 @@ are-we-there-yet@~1.1.2:
     delegates "^1.0.0"
     readable-stream "^2.0.0 || ^1.1.13"
 
+argparse@^1.0.7:
+  version "1.0.9"
+  resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86"
+  dependencies:
+    sprintf-js "~1.0.2"
+
 array-find-index@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
@@ -262,6 +268,10 @@ end-of-stream@^1.0.0:
   dependencies:
     once "~1.3.0"
 
+entities@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
 err-code@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.1.tgz#739d71b6851f24d050ea18c79a5b722420771d59"
@@ -366,7 +376,7 @@ getpass@^0.1.1:
   dependencies:
     assert-plus "^1.0.0"
 
-glob@^7.0.3, glob@^7.0.5:
+glob, glob@^7.0.3, glob@^7.0.5:
   version "7.1.1"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8"
   dependencies:
@@ -546,6 +556,12 @@ leven@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/leven/-/leven-2.0.0.tgz#74c45744439550da185801912829f61d22071bc1"
 
+linkify-it@^2.0.0:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.2.tgz#994629a4adfa5a7d34e08c075611575ab9b6fcfc"
+  dependencies:
+    uc.micro "^1.0.1"
+
 loose-envify@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.2.0.tgz#69a65aad3de542cf4ee0f4fe74e8e33c709ccb0f"
@@ -559,6 +575,26 @@ loud-rejection@^1.2.0:
     currently-unhandled "^0.4.1"
     signal-exit "^3.0.0"
 
+markdown-it@^8.0.1:
+  version "8.0.1"
+  resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.0.1.tgz#ff60e2103d17896cb6c57407baa9766f916495cb"
+  dependencies:
+    argparse "^1.0.7"
+    entities "~1.1.1"
+    linkify-it "^2.0.0"
+    mdurl "^1.0.1"
+    uc.micro "^1.0.3"
+
+markdownlint:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/markdownlint/-/markdownlint-0.3.0.tgz#af428c09cf6a5dcc32fa561161d43981d6609bf2"
+  dependencies:
+    markdown-it "^8.0.1"
+
+mdurl@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
+
 mime-db@~1.24.0:
   version "1.24.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.24.0.tgz#e2d13f939f0016c6e4e9ad25a8652f126c467f0c"
@@ -832,6 +868,10 @@ spdx-license-ids@^1.0.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
 
+sprintf-js@~1.0.2:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
 sshpk@^1.7.0:
   version "1.10.1"
   resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.1.tgz#30e1a5d329244974a1af61511339d595af6638b0"
@@ -912,6 +952,10 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.3"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.3.tgz#3da382f670f25ded78d7b3d1792119bca0b7132d"
 
+uc.micro@^1.0.1, uc.micro@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.3.tgz#7ed50d5e0f9a9fb0a573379259f2a77458d50192"
+
 user-home@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
-- 
GitLab


From f4337f7ffc8dbf6fcf40ebf17553115f2b38ff89 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 19:35:20 +0700
Subject: [PATCH 54/73] up-to-date rus intro

---
 README.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/README.md b/README.md
index ec3aba5..20efe1f 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
 # Стек технологий JavaScript с нуля
 ## JavaScript Stack from Scratch
 
+[![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch) [![Join the chat at https://gitter.im/js-stack-from-scratch/Lobby](https://badges.gitter.im/js-stack-from-scratch/Lobby.svg)](https://gitter.im/js-stack-from-scratch/Lobby)
+ +
 [![Yarn](/img/yarn.png)](https://yarnpkg.com/)
 [![React](/img/react.png)](https://facebook.github.io/react/)
 [![Gulp](/img/gulp.png)](http://gulpjs.com/)
@@ -11,8 +13,6 @@
 [![Chai](/img/chai.png)](http://chaijs.com/)
 [![Flow](/img/flow.png)](https://flowtype.org/)
 
-[![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch)
-
 >Это русскоязычная версия руководства Джонатана Верекии ([@verekia](https://twitter.com/verekia)). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
 
 ### Перевод практически завершен. Идет правка текста.
@@ -25,7 +25,7 @@
 
 Это минималистичное и практико-ориентированное пособие по применению JavaScript технологий. Вам потребуются общие знания по программированию и основы JavaScript. Это пособие **нацелено на интеграцию необходимых инструментов** и предоставляет **максимально простые примеры** для каждого инструмента. Вы можете рассматривать данный документ, как *возможность создать свой собственный шаблонный проект с нуля*.
 
-Конечно, вам не нужны все эти технологии, если вы делаете простую веб страницу с парой JS функций (достаточно комбинаци Babel + jQuery), но если вы собираетесь создать масштабируемое веб приложение, и вам нужно все правильно настроить, то это руководство отлично вам подходит.
+Конечно, вам не нужны все эти технологии, если вы делаете простую веб страницу с парой JS функций (комбинаци Browserify/Webpack + Babel + jQuery достаточно чтобы написать ES6 код в нескольких файлах и скомпилировать все через командную строку), но если вы собираетесь создать масштабируемое веб приложение, и вам нужно все правильно настроить, то это руководство отлично вам подходит.
 
 Поскольку целью этого руководства является сборка различных инструментов, я не буду вдаваться в детали по каждому из них. Если вы хотите получить по ним более глубокие знания, изучайте их документацию или другие руководства.
 
-- 
GitLab


From a7179488cd426715909b4ccae6b8cdef2ec6f8d7 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 19:36:19 +0700
Subject: [PATCH 55/73] Update README.md

---
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 20efe1f..880eb5b 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 ## JavaScript Stack from Scratch
 
 [![Build Status](https://travis-ci.org/verekia/js-stack-from-scratch.svg?branch=master)](https://travis-ci.org/verekia/js-stack-from-scratch) [![Join the chat at https://gitter.im/js-stack-from-scratch/Lobby](https://badges.gitter.im/js-stack-from-scratch/Lobby.svg)](https://gitter.im/js-stack-from-scratch/Lobby)
- +
+ 
 [![Yarn](/img/yarn.png)](https://yarnpkg.com/)
 [![React](/img/react.png)](https://facebook.github.io/react/)
 [![Gulp](/img/gulp.png)](http://gulpjs.com/)
-- 
GitLab


From 8af26d20f45b6b3b4c2934adf748c70cd351ce2f Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 19:43:42 +0700
Subject: [PATCH 56/73] up-to-date rus section1

---
 tutorial/1-node-npm-yarn-package-json/README.md | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index 3918d7a..1b972ed 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -31,7 +31,7 @@ sudo apt-get install -y nodejs
 
 - В файле `package.json`, в корневом объекте создайте объект `scripts`, чтобы было так:
 
-```
+```json
 "scripts": {
   "start": "node ."
 }
@@ -43,7 +43,7 @@ sudo apt-get install -y nodejs
 
 - Создайте файл `.gitignore` и добавьте туда следующее:
 
-```
+```gitignore
 npm-debug.log
 yarn-error.log
 ```
@@ -52,4 +52,4 @@ yarn-error.log
 
 Следующий раздел: [2 - Installing and using a package](/tutorial/2-packages)
 
-Назад в [Содержание](/README.md).
+Назад в [Содержание](/../../#Содержание).
-- 
GitLab


From e912ed920d6f8cab3927d6940b5af9c77406d732 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 19:48:53 +0700
Subject: [PATCH 57/73] up-to-date rus section 10

---
 tutorial/10-immutable-redux-improvements/README.md | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/tutorial/10-immutable-redux-improvements/README.md b/tutorial/10-immutable-redux-improvements/README.md
index ba49d76..be4dc14 100644
--- a/tutorial/10-immutable-redux-improvements/README.md
+++ b/tutorial/10-immutable-redux-improvements/README.md
@@ -10,7 +10,9 @@
 const obj = { a: 1 };
 obj.a = 2; // Изменяет `obj`
 ```
+
 Мы можем сделать так:
+
 ```javascript
 const obj = Immutable.Map({ a: 1 });
 obj.set('a', 2); // Возвращает новый объект не изменяя `obj`
@@ -35,6 +37,7 @@ obj.set('a', 2); // Возвращает новый объект не измен
   ]
 }
 ```
+
 Таким образом мы внесли `Map` и `List` (два Immutable объекта, которые мы будем использовать постояно) в исключения к этому ESLint правилу. Такой подробный стиль форматирования JSON, выполняется автоматически Yarn/NPM, так что мы, к сожалению, не можем сделать его более компактным.
 
 В любом случае, вернемся к Immutable:
@@ -78,6 +81,7 @@ const mapStateToProps = state => ({
 Как вы можете видеть из предыдущего фрагмента кода, сам объект state все еще содержит старый атрибут `dog`, являющийся простым объектом и подверженный мутациям. В нашем случае это нормально, но если вы хотите манипулировать только немутируемыми объектами, можете установить пакет `redux-immutable`, чтобы заменить функцию `combineReducers` у Redux.
 
 **Не обязательно**:
+
 - Запустите `yarn add redux-immutable`
 - Замените функцию `combineReducers` из `app.jsx` на ту, что мы импортировали из `redux-immutable`.
 - В `bark-message.js` замените `state.dog.get('hasBarked')` на `state.getIn(['dog', 'hasBarked'])`.
@@ -99,4 +103,4 @@ export const makeBark = createAction(MAKE_BARK, () => true);
 
 Следующий раздел: [11 - Тестировние с Mocha, Chai, и Sinon](/tutorial/11-testing-mocha-chai-sinon)
 
-Назад в [предыдущий раздел](/tutorial/9-redux) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/9-redux) или [Содержание](/../../#Содержание).
-- 
GitLab


From a5fd6f6a521eca5ec20c829a0e74d0bfe885d9f0 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 19:54:54 +0700
Subject: [PATCH 58/73] up-to-date rus section 11

---
 tutorial/11-testing-mocha-chai-sinon/README.md | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index 51bcbf7..00dd879 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -42,6 +42,7 @@ describe('App State', () => {
   });
 });
 ```
+
 Хорошо, теперь давайте все это проанализируем.
 
 Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, чтобы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавляем для него комментарий в начале, чтобы отключить правило `no-unused-expressions` для этого файла.
@@ -52,7 +53,7 @@ describe('App State', () => {
 
 Отлично, запустим этот тест!
 
-- Создайте следующую задачу `test`, которая основывается на плагине `gulp-mocha`:
+- В файле `gulpfile.babel.js` создайте следующую задачу `test`, которая основывается на плагине `gulp-mocha`:
 
 ```javascript
 import mocha from 'gulp-mocha';
@@ -153,4 +154,4 @@ describe('Shared', () => {
 
 Следующий раздел:  [12 - Типизация с Flow](/tutorial/12-flow)
 
-Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../#Содержание).
-- 
GitLab


From f71dc6b1b43f21a7483f9ad227876f8b9a792125 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 19:58:09 +0700
Subject: [PATCH 59/73] up-to-date rus section 12

---
 tutorial/12-flow/README.md | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/tutorial/12-flow/README.md b/tutorial/12-flow/README.md
index f9de5bf..0aa86b5 100644
--- a/tutorial/12-flow/README.md
+++ b/tutorial/12-flow/README.md
@@ -97,13 +97,15 @@ import * as Immutable from 'immutable';
 Пока Immutable официально не решит проблему, просто выберите то, что вам больше нравится, когда импортируете компоненты Immutable. Лично я, буду использовать `import * as Immutable from 'immutable'`, поскольку это короче и не потребует рефакторинга кода, после того, как проблема будет решена.
 
 **Примечание**: Если Flow выявляет ошибки типизации в папке `node_modules`, добавьте раздел `[ignore]` в файл `.flowconfig`, чтобы указать какие именно пакеты игнорировать (не игнорируйте полностью директорию `node_modules`). Это может выглядеть так:
-```
+
+```flowconfig
 [ignore]
 
 .*/node_modules/gulp-flowtype/.*
 ```
+
 В моем случе, плагин `linter-flow` для Atom обнаружил ошибки типизации в директории `node_modules/gulp-flowtype`, которая содержит файлы аннотированные `// @flow`.
 
 Теперь, у вас есть "пуленепробиваемый" код, который проанализирован, протипизирован и протестирован - отличная работа!
 
-Назад в [предыдущий раздел](/tutorial/11-testing-mocha-chai-sinon) или [Содержание](/../../).
\ No newline at end of file
+Назад в [предыдущий раздел](/tutorial/11-testing-mocha-chai-sinon) или [Содержание](/../../#Содержание).
-- 
GitLab


From cad9fc537c8de0dc03dc71947f0d7cf856b7d91d Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 20:00:31 +0700
Subject: [PATCH 60/73] up-to-date rus section 2

---
 tutorial/2-packages/README.md | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tutorial/2-packages/README.md b/tutorial/2-packages/README.md
index d5ebf1e..5897b33 100644
--- a/tutorial/2-packages/README.md
+++ b/tutorial/2-packages/README.md
@@ -25,7 +25,6 @@
 
 **Примечание**: Существует два вида зависимостей для подключения пакетов: `"dependencies"` и `"devDependencies"`. `"dependencies"` - более общее понятие, чем `"devDependencies"`, так как последние используються только для разработки, а не выпуска (production) приложения (обычно это пакеты связанные с процессом построения, анализаторы кода и т.п.). Для `"devDependencies"`, будем использовать `yarn add --dev [package]`. (прим. пер. `npm install [package] --save-dev`)
 
-
 Следующий раздел: [3 - Setting up ES6 with Babel and Gulp](/tutorial/3-es6-babel-gulp)
 
-Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/1-node-npm-yarn-package-json) или [Содержание](/../../#Содержание).
-- 
GitLab


From ee0f631230754c1a11be00d7e59739926d378906 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 20:06:54 +0700
Subject: [PATCH 61/73] up-to-date rus section 3

---
 tutorial/3-es6-babel-gulp/README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/tutorial/3-es6-babel-gulp/README.md b/tutorial/3-es6-babel-gulp/README.md
index b3c8931..a6c74e9 100644
--- a/tutorial/3-es6-babel-gulp/README.md
+++ b/tutorial/3-es6-babel-gulp/README.md
@@ -5,6 +5,7 @@
 - Запустите `yarn add --dev gulp`
 - Запустите `yarn add --dev gulp-babel`
 - Запустите `yarn add --dev babel-preset-latest`
+- Запустите `yarn add --dev del` (для задачи `clean` - очистки, как вы увидете ниже)
 - В `package.json` добавьте поле `babel` для конфигурации Babel. Укажем, что хотим использовать новейшую конфигурацию Babel, следующим образом:
 
 ```json
@@ -87,7 +88,6 @@ Gulp, сам по себе, имеет довольно понятный API. О
 
 - Добавьте `/lib/` в `.gitignore`
 
-
 Следующий раздел: [4 - Использование ES6 классов](/tutorial/4-es6-syntax-class)
 
-Назад в [предыдущий раздел](/tutorial/2-packages)или [Содержание](/../../)..
+Назад в [предыдущий раздел](/tutorial/2-packages)или [Содержание](/../../#Содержание).
-- 
GitLab


From 9fe2b9cf57ebb7f4786fe3691a78c0f3caf23116 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 20:09:00 +0700
Subject: [PATCH 62/73] up-to-date rus section 4

---
 tutorial/4-es6-syntax-class/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/4-es6-syntax-class/README.md b/tutorial/4-es6-syntax-class/README.md
index ea2f82d..5bcdf8d 100644
--- a/tutorial/4-es6-syntax-class/README.md
+++ b/tutorial/4-es6-syntax-class/README.md
@@ -39,4 +39,4 @@ console.log(toby.bark());
 
 Следующий раздел: [5 - Синтаксис модулей ES6](/tutorial/5-es6-modules-syntax)
 
-Назад в [предыдущий раздел](/tutorial/3-es6-babel-gulp) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/3-es6-babel-gulp) или [Содержание](/../../#Содержание).
-- 
GitLab


From 1f7f224419462ec985b464943958ef8200108e46 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 20:10:16 +0700
Subject: [PATCH 63/73] up-to-date rus section 5

---
 tutorial/5-es6-modules-syntax/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tutorial/5-es6-modules-syntax/README.md b/tutorial/5-es6-modules-syntax/README.md
index 8d9933f..41dbe9e 100644
--- a/tutorial/5-es6-modules-syntax/README.md
+++ b/tutorial/5-es6-modules-syntax/README.md
@@ -25,6 +25,7 @@ import Cat from './dog';
 
 const toby = new Cat('Toby');
 ```
+
 Очевидно, что в основном вы будете использовать тоже имя, что и имя класса/модуля который вы импортируете.
 Один из примеров когда можно сделать по-другому, это то как мы применили `const babel = require('gulp-babel')` в нашем Gulp файле.
 
@@ -47,4 +48,4 @@ import { exec } from 'child_process';
 
 Следующий раздел: [6 - ESLint](/tutorial/6-eslint)
 
-Назад в [предыдущий раздел](/tutorial/4-es6-syntax-class) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/4-es6-syntax-class) или [Содержание](/../../#Содержание).
-- 
GitLab


From ab7f327fd170feef494b9644b6f52cd5903ea855 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 20:16:01 +0700
Subject: [PATCH 64/73] up-to-date rus section 6

---
 tutorial/6-eslint/README.md | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index fdc827d..b026c13 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -2,11 +2,12 @@
 
 Мы собираемся контролировать качество кода (to lint), чтобы перехватывать потенциальные проблемы. ESLint - наиболее предпочтительный анализатор кода (linter) для ES6. Вместо того чтобы самим определять правила для нашего кода, мы воспользуемся конфигурацией, созданной Airbnb. В этой конфигурации используется несколько плагинов, поэтому мы их тоже установим.
 
-- Запустите `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-react`
+- Запустите `yarn add --dev eslint eslint-config-airbnb eslint-plugin-import eslint-plugin-jsx-a11y@2.2.3 eslint-plugin-react`
 
 Как вы видите, вы можете установить несколько пакетов одной командой. Как обычно, они все добавятся в ваш `package.json`.
 
 В `package.json`, добавьте свойство `eslintConfig` со следующим содержанием:
+
 ```json
 "eslintConfig": {
   "extends": "airbnb",
@@ -15,9 +16,10 @@
   ]
 },
 ```
+
 В разделе `plugins` мы сообщаем ESLint, что используем синтакисис ES6 `import`.
 
-**Примечание**: Вместо свойства `eslintConfig` в `package.json` можно использовать файл `.eslintrc.js` в корне вашего проекта. Так же как и с конфигурацией Babel, мы стараемся избегать загромождения корневой директории большим количеством файлов, но если у вас сложная конфигурация ESLint, рассмотрите такую альтернативу.
+**Примечание**: Вместо свойства `eslintConfig` в `package.json` можно использовать файл `.eslintrc.js`, `.eslintrc.json` или `.eslintrc.yaml` в корне вашего проекта. Так же как и с конфигурацией Babel, мы стараемся избегать загромождения корневой директории большим количеством файлов, но если у вас сложная конфигурация ESLint, рассмотрите такую альтернативу.
 
 Создадим задачу для Gulp, которая будет запускать ESLint. Для этого установим еще и плагин ESLint для Gulp:
 
@@ -109,9 +111,9 @@ gulp.task('build', ['lint', 'clean'], () =>
 
 - Запустите `yarn start` - теперь все снова без ошибок.
 
-**Примечание**: В этой части мы работали с ESLint через консоль. Это хорошо для поиска ошибок во время компиляции / перед ~~публикацией~~, но вы, так же, возможно, захотите интегрировать его в вашу IDE. НЕ ИСПОЛЬЗУЙТЕ встроенный в вашу среду анализатор кода для ES6. Сконфигурируйте ее так, чтобы для этого использовались модули, расположенные в директории `node_modules`. В этом случае будут использоваться все настройки вашего проекта, правила Airbnb и так далее. Иначе, вы получите лишь усредненный ES6 анализатор.
+**Примечание**: В этой части мы работали с ESLint через консоль. Это хорошо для поиска ошибок во время компиляции / перед публикацией, но вы, так же, возможно, захотите интегрировать его в вашу IDE. НЕ ИСПОЛЬЗУЙТЕ встроенный в вашу среду анализатор кода для ES6. Сконфигурируйте ее так, чтобы для этого использовались модули, расположенные в директории `node_modules`. В этом случае будут использоваться все настройки вашего проекта, правила Airbnb и так далее. Иначе, вы получите лишь усредненный ES6 анализатор.
 
 
 Следующий раздел: [7 - Клиентское приложение ~на основе Webpack~](/tutorial/7-client-webpack)
 
-Назад в [предыдущий раздел](/tutorial/5-es6-modules-syntax) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/5-es6-modules-syntax) или [Содержание](/../../#Содержание).
-- 
GitLab


From d1cb2ce9f815a1dd082a3b76f8f9eadc2cb861ac Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 20:17:06 +0700
Subject: [PATCH 65/73] up-to-date rus section 7

---
 tutorial/7-client-webpack/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index 604f7a0..b209d5a 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -37,6 +37,7 @@ document.querySelector('.app').innerText = browserToby.bark();
   "browser": true
 }
 ```
+
 Таким образом мы сможем использовать такие переменные как window или document, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
 
 Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания), вам нужно включить полифил (polyfill) [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
@@ -190,4 +191,4 @@ gulp.task('clean', () => del([
 
 Следующий раздел: [8 - React](/tutorial/8-react)
 
-Назад в [предыдущий раздел](/tutorial/6-eslint) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/6-eslint) или [Содержание](/../../#Содержание).
-- 
GitLab


From 1be86a0ba40f021174f773862f3b0876f764688a Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 20:19:01 +0700
Subject: [PATCH 66/73] up-to-date rus section 8

---
 tutorial/8-react/README.md | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index 71375f9..53ac8b1 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -55,8 +55,6 @@ clientEntryPoint: 'src/client/app.jsx',
 
 Теперь, после запуска `yarn start`, открыв `index.html`, мы должны увидеть "The dog says: Wah wah, I am Browser Toby", сгенерированное React.
 
-
-
 Следующий раздел: [9 - Redux](/tutorial/9-redux)
 
-Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../#Содержание).
-- 
GitLab


From e923dbc5abecc22fea32add1421c59678ff2ebf1 Mon Sep 17 00:00:00 2001
From: dalikat <dalikat@mail.ru>
Date: Sun, 13 Nov 2016 20:21:21 +0700
Subject: [PATCH 67/73] up-to-date rus section 9

---
 tutorial/9-redux/README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index a40498a..17b8c36 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -26,6 +26,7 @@ export const makeBark = () => ({
   payload: true,
 });
 ```
+
 Тут мы определяем тип действия - `MAKE_BARK`, и функцию `makeBark` (именуемую *генератор действий*), которая запускает действие `MAKE_BARK`. Мы их экспортируем т.к. они нам понадобятся в других файлах. Это действие построено на основе модели [Flux Standard Action](https://github.com/acdlite/flux-standard-action), вот почему оно имеет атрибуты `type` и `payload`.
 
 - В `reducers`, создайте `dog-reducer.js`:
@@ -161,4 +162,4 @@ export default connect(mapStateToProps)(Message);
 
 Следующий раздел: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
 
-Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
+Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../#Содержание).
-- 
GitLab


From f9d97c7c67ca363436998afe517064beeaf0edd2 Mon Sep 17 00:00:00 2001
From: UsulPro <regx@usul.su>
Date: Sun, 13 Nov 2016 20:45:03 +0700
Subject: [PATCH 68/73] finish merge

---
 tutorial/11-testing-mocha-chai-sinon/README.md | 9 ---------
 tutorial/3-es6-babel-gulp/README.md            | 3 ---
 tutorial/7-client-webpack/README.md            | 5 -----
 tutorial/8-react/README.md                     | 9 ---------
 tutorial/9-redux/README.md                     | 4 ----
 5 files changed, 30 deletions(-)

diff --git a/tutorial/11-testing-mocha-chai-sinon/README.md b/tutorial/11-testing-mocha-chai-sinon/README.md
index 09e61d6..00dd879 100644
--- a/tutorial/11-testing-mocha-chai-sinon/README.md
+++ b/tutorial/11-testing-mocha-chai-sinon/README.md
@@ -42,14 +42,9 @@ describe('App State', () => {
   });
 });
 ```
-<<<<<<< HEAD
-Хорошо, теперь давайте все это проанализируем.
-
-=======
 
 Хорошо, теперь давайте все это проанализируем.
 
->>>>>>> e923dbc5abecc22fea32add1421c59678ff2ebf1
 Во-первых, заметьте, что мы импортировали стиль утверждений `should` из пакета `chai`. Это позволит нам делать утверждения, используя синтаксис вида `mynumber.should.equal(3)` (что в Русском переводе можно представить как: `моечисло.должно.ровняться(3)` - прим. пер.), довольно изящно. Для того, чтобы мы могли вызывать `should` на любом объекте, мы должны прежде всего запустить функцию `should()`. Некоторые из этих утверждений являются *выражениями*, как `mybook.should.be.true`, что заставляет ESLint сердиться, так что мы добавляем для него комментарий в начале, чтобы отключить правило `no-unused-expressions` для этого файла.
 
 Тесты Mocha устроены наподобие дерева. В нашем случае, мы хотим протестировать функцию `makeBark`, которая должна воздействовать на атрибут `dog` состояния нашего приложения, поэтому имеет смысл использовать следующую иерархию тестов: `App State > Dog > makeBark`, что мы и описали используя `describe()`. `it()`  - это собственно, тестирующая функция, а `beforeEach()` - это функция, вызываемая перед каждым вызовом теста `it()`. В нашем случае, мы хотим иметь новую чистую версию хранилища перед запуском каждого теста. Мы обявили переменную `store` в начале файла, поскольку она нам пригодится в каждом тесте.
@@ -159,8 +154,4 @@ describe('Shared', () => {
 
 Следующий раздел:  [12 - Типизация с Flow](/tutorial/12-flow)
 
-<<<<<<< HEAD
-Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../).
-=======
 Назад в [предыдущий раздел](/tutorial/10-immutable-redux-improvements) или [Содержание](/../../#Содержание).
->>>>>>> e923dbc5abecc22fea32add1421c59678ff2ebf1
diff --git a/tutorial/3-es6-babel-gulp/README.md b/tutorial/3-es6-babel-gulp/README.md
index a40c798..a6c74e9 100644
--- a/tutorial/3-es6-babel-gulp/README.md
+++ b/tutorial/3-es6-babel-gulp/README.md
@@ -5,10 +5,7 @@
 - Запустите `yarn add --dev gulp`
 - Запустите `yarn add --dev gulp-babel`
 - Запустите `yarn add --dev babel-preset-latest`
-<<<<<<< HEAD
-=======
 - Запустите `yarn add --dev del` (для задачи `clean` - очистки, как вы увидете ниже)
->>>>>>> e923dbc5abecc22fea32add1421c59678ff2ebf1
 - В `package.json` добавьте поле `babel` для конфигурации Babel. Укажем, что хотим использовать новейшую конфигурацию Babel, следующим образом:
 
 ```json
diff --git a/tutorial/7-client-webpack/README.md b/tutorial/7-client-webpack/README.md
index 56a62bc..b209d5a 100644
--- a/tutorial/7-client-webpack/README.md
+++ b/tutorial/7-client-webpack/README.md
@@ -37,14 +37,9 @@ document.querySelector('.app').innerText = browserToby.bark();
   "browser": true
 }
 ```
-<<<<<<< HEAD
-Таким образом мы сможем использовать такие переменные как window или document, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
-
-=======
 
 Таким образом мы сможем использовать такие переменные как window или document, которые всегда доступны в браузере, без предупреждений ESLint о необъявленных переменных.
 
->>>>>>> e923dbc5abecc22fea32add1421c59678ff2ebf1
 Если вы желаете использовать самые последние возможности ES6 в клиентском коде, такие как `Promise` (обещания), вам нужно включить полифил (polyfill) [Babel Polyfill](https://babeljs.io/docs/usage/polyfill/) в ваш код.
 
 - Запустите `yarn add babel-polyfill`
diff --git a/tutorial/8-react/README.md b/tutorial/8-react/README.md
index 99f5760..53ac8b1 100644
--- a/tutorial/8-react/README.md
+++ b/tutorial/8-react/README.md
@@ -54,16 +54,7 @@ clientEntryPoint: 'src/client/app.jsx',
 ```
 
 Теперь, после запуска `yarn start`, открыв `index.html`, мы должны увидеть "The dog says: Wah wah, I am Browser Toby", сгенерированное React.
-<<<<<<< HEAD
-
-
-
-Следующий раздел: [9 - Redux](/tutorial/9-redux)
-
-Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../).
-=======
 
 Следующий раздел: [9 - Redux](/tutorial/9-redux)
 
 Назад в [предыдущий раздел](/tutorial/7-client-webpack) или [Содержание](/../../#Содержание).
->>>>>>> e923dbc5abecc22fea32add1421c59678ff2ebf1
diff --git a/tutorial/9-redux/README.md b/tutorial/9-redux/README.md
index ece9932..17b8c36 100644
--- a/tutorial/9-redux/README.md
+++ b/tutorial/9-redux/README.md
@@ -162,8 +162,4 @@ export default connect(mapStateToProps)(Message);
 
 Следующий раздел: [10 - Immutable JS and Redux Improvements](/tutorial/10-immutable-redux-improvements)
 
-<<<<<<< HEAD
-Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../).
-=======
 Назад в [предыдущий раздел](/tutorial/8-react) или [Содержание](/../../#Содержание).
->>>>>>> e923dbc5abecc22fea32add1421c59678ff2ebf1
-- 
GitLab


From b94b13fcd416b5b5703fb7e030f0626fd5f0fa94 Mon Sep 17 00:00:00 2001
From: Oleg Proskurin <regx@usul.su>
Date: Sun, 13 Nov 2016 20:56:27 +0700
Subject: [PATCH 69/73] Update README.md

---
 README.md | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index 880eb5b..1c604b8 100644
--- a/README.md
+++ b/README.md
@@ -13,13 +13,8 @@
 [![Chai](/img/chai.png)](http://chaijs.com/)
 [![Flow](/img/flow.png)](https://flowtype.org/)
 
->Это русскоязычная версия руководства Джонатана Верекии ([@verekia](https://twitter.com/verekia)). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии.
-
-### Перевод практически завершен. Идет правка текста.
-
-[будем благодарны за помощь в обнаружении опечаток и неточностей](https://github.com/UsulPro/js-stack-from-scratch/issues)
-
-**Далее текст автора**
+>Это русскоязычная версия руководства Джонатана Верекии ([@verekia](https://twitter.com/verekia)). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии. Данный перевод соответствует английской версии по состоянию на [commit](https://github.com/verekia/js-stack-from-scratch/tree/11d7ac52647b602ba2d2840f600a05542e9f2845). 
+Мы будем рады вашим [замечаниям и вопросам](https://github.com/UsulPro/js-stack-from-scratch/issues)
 
 Добро пожаловать в мое современное руководство по стеку технологий JavaScript: **Стек технологий JavaScript с нуля**
 
@@ -33,7 +28,7 @@
 
 Примеры кода имеются в каждой части, и вы можете запускать их через `yarn && yarn start` или `npm install && npm start`. Я рекомендую писать все с нуля самостоятельно, следуя **пошаговым инструкциям** каждого раздела.
 
-**Каждая часть содержит код, написанный в предыдущих частях**, так что, если вы просто хотите получить окончательный вариант проекта, содержащий все необходимое, просто скопируйте последний раздел и пользуйтесь на здоровье.
+**Каждая часть содержит код, написанный в предыдущих частях**, так что, если вы просто хотите получить окончательный вариант проекта, содержащий все необходимое, просто скопируйте последний раздел и смело пользуйтесь.
 
 Примечание: Порядок частей не всегда обязателен. К примеру, тестирование / типизация могут быть выполнены до введения в React. Довольно сложно перемещать или редактировать опубликованные разделы, поскольку приходится вносить изменения во все следующие за ними части. Возможно, когда все определится, я приведу всю документацию к более удобному виду.
 
-- 
GitLab


From 2899ca9a3338be6a5c74a6f63935966d3fc2cae4 Mon Sep 17 00:00:00 2001
From: Oleg Proskurin <regx@usul.su>
Date: Tue, 22 Nov 2016 22:54:18 +0700
Subject: [PATCH 70/73] Update README.md

---
 tutorial/6-eslint/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/6-eslint/README.md b/tutorial/6-eslint/README.md
index b026c13..5f55ba3 100644
--- a/tutorial/6-eslint/README.md
+++ b/tutorial/6-eslint/README.md
@@ -114,6 +114,6 @@ gulp.task('build', ['lint', 'clean'], () =>
 **Примечание**: В этой части мы работали с ESLint через консоль. Это хорошо для поиска ошибок во время компиляции / перед публикацией, но вы, так же, возможно, захотите интегрировать его в вашу IDE. НЕ ИСПОЛЬЗУЙТЕ встроенный в вашу среду анализатор кода для ES6. Сконфигурируйте ее так, чтобы для этого использовались модули, расположенные в директории `node_modules`. В этом случае будут использоваться все настройки вашего проекта, правила Airbnb и так далее. Иначе, вы получите лишь усредненный ES6 анализатор.
 
 
-Следующий раздел: [7 - Клиентское приложение ~на основе Webpack~](/tutorial/7-client-webpack)
+Следующий раздел: [7 - Клиентское приложение на основе Webpack](/tutorial/7-client-webpack)
 
 Назад в [предыдущий раздел](/tutorial/5-es6-modules-syntax) или [Содержание](/../../#Содержание).
-- 
GitLab


From f0abc86d0d13ea850fd1c0169d780713575f9c92 Mon Sep 17 00:00:00 2001
From: Oleg Proskurin <regx@usul.su>
Date: Mon, 28 Nov 2016 12:59:19 +0700
Subject: [PATCH 71/73] Update README.md

---
 tutorial/1-node-npm-yarn-package-json/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/1-node-npm-yarn-package-json/README.md b/tutorial/1-node-npm-yarn-package-json/README.md
index 1b972ed..a65f1ab 100644
--- a/tutorial/1-node-npm-yarn-package-json/README.md
+++ b/tutorial/1-node-npm-yarn-package-json/README.md
@@ -18,7 +18,7 @@ sudo apt-get install -y nodejs
 
 **Примечание**: Если Node уже установлен, установите `nvm` ([Node Version Manager](https://github.com/creationix/nvm))(Менеджер версий Node), выполните `nvm` install и пользуйтесь последней версией Node.
 
-[Yarn](https://yarnpkg.com/) - еще один менеджер пакетов. Он намного быстрее чем NPM, поддерживает работу офлайн и [лучше предугадывает](https://yarnpkg.com/en/docs/yarn-lock) подгрузку нужных зависимостей. С момента его [выхода](https://code.facebook.com/posts/1840075619545360) в Октябре 2016, он был очень быстро принят сообществом и постепенно становится лучшим решением для JavaScript. В данном руководстве мы будем использовать Yarn. Если вы предпочетаете оставаться с NPM, просто замените все команды `yarn add` и `yarn add --dev` на `npm install --save` и `npm install --dev` в этом пособии.
+[Yarn](https://yarnpkg.com/) - еще один менеджер пакетов. Он намного быстрее чем NPM, поддерживает работу офлайн и [лучше предугадывает](https://yarnpkg.com/en/docs/yarn-lock) подгрузку нужных зависимостей. С момента его [выхода](https://code.facebook.com/posts/1840075619545360) в Октябре 2016, он был очень быстро принят сообществом и постепенно становится лучшим решением для JavaScript. В данном руководстве мы будем использовать Yarn. Если вы предпочетаете оставаться с NPM, просто замените все команды `yarn add` и `yarn add --dev` на `npm install --save` и `npm install --save-dev` в этом пособии.
 
 - Установите Yarn следуя [инструкциям](https://yarnpkg.com/en/docs/install). Проще всего это сделать через `npm install -g yarn` или `sudo npm install -g yarn` (Верно, мы используем NPM, чтобы установить Yarn, все равно, что использовать Internet Explorer или Safari, чтобы установить Chrome!).
 
-- 
GitLab


From e561a8d603de33e64f1274ad333645b4f4093b5c Mon Sep 17 00:00:00 2001
From: Oleg Proskurin <regx@usul.su>
Date: Mon, 28 Nov 2016 13:01:11 +0700
Subject: [PATCH 72/73] Update README.md

---
 tutorial/12-flow/README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tutorial/12-flow/README.md b/tutorial/12-flow/README.md
index 0aa86b5..eb00250 100644
--- a/tutorial/12-flow/README.md
+++ b/tutorial/12-flow/README.md
@@ -78,7 +78,7 @@ export default Dog;
 
 - Теперь вы можете добавить `// @flow` в каждый `.js` и `.jsx` файл в папке `src`, запустить `yarn test` или `yarn start`, и добавлять аннотации везде, где этого попросит Flow.
 
-Вы можете обнаружить неожиданный пример в `src/client/component/message.jsx`:
+Вы можете обнаружить неожиданный пример в `src/client/components/message.jsx`:
 
 ```javascript
 const Message = ({ message }: { message: string }) => <div>{message}</div>;
-- 
GitLab


From 287c40318bded74b190d92c0fab68c885f47b58a Mon Sep 17 00:00:00 2001
From: Oleg Proskurin <regx@usul.su>
Date: Mon, 28 Nov 2016 13:09:44 +0700
Subject: [PATCH 73/73] Update README.md

---
 README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 1c604b8..a76f70e 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
 [![Chai](/img/chai.png)](http://chaijs.com/)
 [![Flow](/img/flow.png)](https://flowtype.org/)
 
->Это русскоязычная версия руководства Джонатана Верекии ([@verekia](https://twitter.com/verekia)). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии. Данный перевод соответствует английской версии по состоянию на [commit](https://github.com/verekia/js-stack-from-scratch/tree/11d7ac52647b602ba2d2840f600a05542e9f2845). 
+>Это русскоязычная версия руководства Джонатана Верекии ([@verekia](https://twitter.com/verekia)). Оригинальное руководство расположено [здесь](https://github.com/verekia/js-stack-from-scratch). Данное пособие постоянно развивается и дополняется автором, предоставляя читателям максимально свежую и качественную информацию. Текст оригинального пособия и прилагаемый код будут меняться с течением времени. Мы так же будем стараться поддерживать русскоязычную версию в актуальном состоянии. Данный перевод соответствует английской версии по состоянию на [commit](https://github.com/verekia/js-stack-from-scratch/commit/343922149f136bbab2512b14a2fe5efe095d62b7). 
 Мы будем рады вашим [замечаниям и вопросам](https://github.com/UsulPro/js-stack-from-scratch/issues)
 
 Добро пожаловать в мое современное руководство по стеку технологий JavaScript: **Стек технологий JavaScript с нуля**
@@ -69,6 +69,7 @@ Production / development окружение, Express, React Router, Сервер
 - [Китайский](https://github.com/pd4d10/js-stack-from-scratch) by [@pd4d10](http://github.com/pd4d10)
 - [Итальянский](https://github.com/fbertone/js-stack-from-scratch) by [Fabrizio Bertone](https://github.com/fbertone)
 - [Японский](https://github.com/takahashim/js-stack-from-scratch) by [@takahashim](https://github.com/takahashim)
+- [Тайский](https://github.com/MicroBenz/js-stack-from-scratch) by [MicroBenz](https://github.com/MicroBenz)
 
 Если вы хотите добавить перевод на другой язык, пожалуйста читайте [рекомендации по переводу](/how-to-translate.md) чтобы начать!
 
-- 
GitLab