diff --git a/src-russian/01_introduction.md b/src-russian/01_introduction.md
index 1378e1c..621fe49 100644
--- a/src-russian/01_introduction.md
+++ b/src-russian/01_introduction.md
@@ -5,9 +5,9 @@
начиная от простого приложения с рендерингом в браузере и постепенно перейдём к full-stack
приложению с рендерингом на стороне сервера и гидратацией.
-Данное руководство не ждёт, что вы знаете что-либо о мелкозернистой реактивности (англ. [fine-grained reactivity](https://www.google.com/search?q=fine-grained+reactivity))
+Данное руководство не ждёт, что вы что-либо знаете о мелкозернистой реактивности (_англ. [fine-grained reactivity](https://www.google.com/search?q=fine-grained+reactivity)_)
или о особенностях современных Веб-фреймворков. Оно подразумевает, что вы знакомы
-с Rust, HTML, CSS, а также DOM и простые Web API.
+с Rust, HTML, CSS, а также с DOM и с простыми Web API.
Leptos больше всего похож на такие фреймворки как [Solid](https://www.solidjs.com) (JavaScript)
и [Sycamore](https://sycamore-rs.netlify.app/) (Rust). У него также есть схожие черты с другими фреймворками,
diff --git a/src-russian/SUMMARY.md b/src-russian/SUMMARY.md
index fac4c6b..d13d5c9 100644
--- a/src-russian/SUMMARY.md
+++ b/src-russian/SUMMARY.md
@@ -13,8 +13,8 @@
- [Формы и поля ввода](./view/05_forms.md)
- [Порядок выполнения](./view/06_control_flow.md)
- [Обработка ошибок](./view/07_errors.md)
- - [Общение Родитель-Ребёнок в дереве компонентов](./view/08_parent_child.md)
- - [Передача Детей другим компонентам](./view/09_component_children.md)
+ - [Коммуникация Родитель-Ребёнок](./view/08_parent_child.md)
+ - [Передача дочерних элементов другим компонентам](./view/09_component_children.md)
- [Без макросов: синтаксис билдера View](./view/builder.md)
- [Реактивность](./reactivity/README.md)
- [Работа с сигналами](./reactivity/working_with_signals.md)
diff --git a/src-russian/getting_started/leptos_dx.md b/src-russian/getting_started/leptos_dx.md
index c095350..fb779e6 100644
--- a/src-russian/getting_started/leptos_dx.md
+++ b/src-russian/getting_started/leptos_dx.md
@@ -16,7 +16,7 @@
1. Выполните `cargo add console_error_panic_hook` в вашем проекте
2. В вашей функции main добавьте вызов `console_error_panic_hook::set_once();`
-> Если это непонятно, [вот пример](https://github.com/leptos-rs/leptos/blob/main/examples/counter/src/main.rs#L4-L15).
+> Если это не понятно, [вот пример](https://github.com/leptos-rs/leptos/blob/main/examples/counter/src/main.rs#L4-L15).
Теперь сообщения о паниках в консоле браузере будут намного лучше!
diff --git a/src-russian/view/01_basic_component.md b/src-russian/view/01_basic_component.md
index 225e310..6155319 100644
--- a/src-russian/view/01_basic_component.md
+++ b/src-russian/view/01_basic_component.md
@@ -158,7 +158,7 @@ move |_| {
[Кликните чтобы открыть CodeSandbox.](https://codesandbox.io/p/sandbox/1-basic-component-3d74p3?file=%2Fsrc%2Fmain.rs%3A1%2C1)
> Чтобы увидеть браузер в песочнице вам может понадобиться нажать `Add DevTools >
diff --git a/src-russian/view/02_dynamic_attributes.md b/src-russian/view/02_dynamic_attributes.md
index 5c2f0e9..bfd5526 100644
--- a/src-russian/view/02_dynamic_attributes.md
+++ b/src-russian/view/02_dynamic_attributes.md
@@ -166,7 +166,7 @@ let double_count = move || count() * 2;
> #### Продвинутая тема: Вставка Сырого HTML
>
> Макрос `view` поддерживает дополнительный атрибут, `inner_html`, который можно использовать для прямого задания
-> тела любого элемента в виде HTML, затирая при этом любых Детей, которые могли в нём находиться.
+> тела любого элемента в виде HTML, затирая при этом любых дочерние элементы, которые могли в нём находиться.
> Обратите внимание, что он **не** экранирует HTML, который вы передаете. Вам следует убедиться в том, что передаваемый HTML
> собран из доверенных источников или что все HTML-сущности экранированы, дабы предотвратить cross-site scripting (XSS) атаки.
>
@@ -184,7 +184,7 @@ let double_count = move || count() * 2;
[Click to open CodeSandbox.](https://codesandbox.io/p/sandbox/2-dynamic-attributes-0-5-lwdrpm?file=%2Fsrc%2Fmain.rs%3A1%2C1)
diff --git a/src-russian/view/03_components.md b/src-russian/view/03_components.md
index dc2157b..68917c0 100644
--- a/src-russian/view/03_components.md
+++ b/src-russian/view/03_components.md
@@ -396,7 +396,7 @@ fn ProgressBar(
[Click to open CodeSandbox.](https://codesandbox.io/p/sandbox/3-components-0-5-5vvl69?file=%2Fsrc%2Fmain.rs%3A1%2C1)
diff --git a/src-russian/view/04_iteration.md b/src-russian/view/04_iteration.md
index b81630f..99e7b05 100644
--- a/src-russian/view/04_iteration.md
+++ b/src-russian/view/04_iteration.md
@@ -104,7 +104,7 @@ view! {
[Click to open CodeSandbox.](https://codesandbox.io/p/sandbox/4-iteration-0-5-pwdn2y?file=%2Fsrc%2Fmain.rs%3A1%2C1)
diff --git a/src-russian/view/04b_iteration.md b/src-russian/view/04b_iteration.md
index 4f23958..7f6d282 100644
--- a/src-russian/view/04b_iteration.md
+++ b/src-russian/view/04b_iteration.md
@@ -125,7 +125,7 @@ pub fn App() -> impl IntoView {
## Вариант 2: Вложенные Сигналы
-Если мы всё же хотим мелкозернистую реактивность (англ. [fine-grained reactivity](https://www.google.com/search?q=fine-grained+reactivity))
+Если мы всё же хотим мелкозернистую реактивность (_англ. [fine-grained reactivity](https://www.google.com/search?q=fine-grained+reactivity)_)
для значения, одним из вариантов явлется обернуть `value` каждого ряда в сигнал.
```rust
diff --git a/src-russian/view/05_forms.md b/src-russian/view/05_forms.md
new file mode 100644
index 0000000..32a252c
--- /dev/null
+++ b/src-russian/view/05_forms.md
@@ -0,0 +1,328 @@
+# Формы и поля ввода
+
+Формы и поля ввода — важная часть интерактивных приложений. Есть два паттерна взаимодействия
+с полями ввода в Leptos. Вы, возможно, уже их знаете, если вы знакомы с React, SolidJS или похожим фреймворком:
+использование **контролируемых** или **неконтролируемых** элементов форм.
+
+## Контролируемые поля ввода
+
+В случае с "контролируемым полем ввода" фреймворк контролирует состояние элемента. При каждом `input` событии, он
+обновляет локальный сигнал, хранящий текущее состояние, который, в свою очередь, обновляет значение свойства `value`.
+
+Есть две важные вещи, которые нужно запомнить:
+
+1. Событие `input` срабатывает (почти) при каждом изменении элемента, когда как `change` (обычно) срабатывает только
+после того, как вы сняли фокус с поля ввода. Вам наверно подойдёт `on:input`, но мы хотим дать вам свободу выбирать.
+
+2. Значение _атрибута_ `value` лишь задает первоначальное значение поля ввода, то есть, оно обновляет значение поля ввода
+лишь до тех пор, пока вы не начали печатать. _Свойство_ `value` продолжает обновлять поле вода и после этого.
+По этой причине, обычно вам стоит использовать `prop:value`. (Это также справедливо для `checked` и `prop:checked`
+ в ``.)
+
+```rust
+let (name, set_name) = create_signal("Controlled".to_string());
+
+view! {
+
+
"Name is: " {name}
+}
+```
+
+> #### Зачем нужно `prop:value`?
+>
+> Веб-браузеры это самая вездесущая и стабильная платформа рендеринга графических пользовательских интерфейсов из всех существующих.
+
+> Они также сохранили невероятную обратную совместимость на протяжении трёх десятков лет. Это неизбежно означает, что есть и странности.
+>
+> Одна из странностей состоит в том, что есть разница между HTML атрибутами и свойствами DOM элемента, то есть,
+> между так называемым "атрибутом", что берется из HTML и может быть задан DOM-элементу с помощью `.setAttribute()`,
+> и между "свойством" — полем в JavaScript-представлении этого элемента HTML.
+>
+> В случае с ``, _атрибут_ `value` задаёт первоначальное значение этого поля ввода,
+> а _свойство_ `value` задаёт его текущее значение. Возможно самый простой способ разобраться с этим это открыть `about:blank`
+> и выполнить следующий код на JavaScript в консоли браузера строчка за строчкой:
+>
+>
+> ```js
+> // создадим поле ввода и добавим его в DOM
+> const el = document.createElement("input");
+> document.body.appendChild(el);
+>
+> el.setAttribute("value", "тест"); // изменяет значение поля ввода
+> el.setAttribute("value", "тест тест"); // тоже изменяет значение поля ввода
+>
+> // теперь напечайте что-нибудь в поле ввода: удалите какие-нибудь символы и т. д.
+>
+> el.setAttribute("value", "ещё разок?");
+> // ничего не должно было измениться. смена "первоначального значения" теперь ни на что не влияет
+>
+> // однако...
+> el.value = "А это работает";
+> ```
+>
+> Многие другие frontend фреймворки объединяют атрибуты и свойства или в порядке исключения для полей ввода устанавливают
+> значение корректно. Может Leptos'у тоже стоит так делать; но пока что я предпочитаю давать пользователям максимальную
+> степень контроля над тем что они задают — атрибут или свойство, и делаю всё, что в моих силах, чтобы рассказать людям
+> о реальном поведении браузера, вместо того, чтобы скрывать его.
+
+## Неконтролируемые поля ввода
+
+В случае "неконтролируемого поля ввода" браузера сам управляет состояние элемента поля ввода.
+Вместо того чтобы постоянно обновлять сигнал, чтобы он содержал значение поля, мы используем [`NodeRef`](https://docs.rs/leptos/latest/leptos/struct.NodeRef.html) для
+получения доступа к полю ввода когда мы хотим получить его значение.
+
+В данном примере мы уведомляем фреймворк лишь когда `
}
+ >
+
"Oddment"
+
+
+ // d. Because `bool::then()` converts a `bool` to
+ // `Option`, you can use it to create a show/hide toggled
+ {move || is_odd().then(|| view! {
"Oddity!"
})}
+
+
"Converting between Types"
+ // e. Note: if branches return different types,
+ // you can convert between them with
+ // `.into_any()` (for different HTML element types)
+ // or `.into_view()` (for all view types)
+ {move || match is_odd() {
+ true if value() == 1 => {
+ //
+ // so we convert into a more generic type
+ view! {
"Two"
}.into_any()
+ }
+ _ => view! { }.into_any()
+ }}
+ }
+}
+
+fn main() {
+ leptos::mount_to_body(App)
+}
+```
+
+
+
diff --git a/src-russian/view/07_errors.md b/src-russian/view/07_errors.md
new file mode 100644
index 0000000..8e604b2
--- /dev/null
+++ b/src-russian/view/07_errors.md
@@ -0,0 +1,188 @@
+# Обработка ошибок
+
+[В предыдущей главе](./06_control_flow.md), мы рассмотрели что вы можете рендерить `Option`:
+в случае `None`, ничего не будет выведено, а в случае `Some(T)`, будет отображён `T`
+(если `T` реализует `IntoView`). Вы можете очень похожим образом обойтись с `Result`.
+В случае `Err(_)`, ничего не будет выведено. В случае `Ok(T)` будет отображён `T`.
+
+Давайте начнем с простого компонента, осуществляющего захват числового поля ввода.
+
+```rust
+#[component]
+fn NumericInput() -> impl IntoView {
+ let (value, set_value) = create_signal(Ok(0));
+
+ // when input changes, try to parse a number from the input
+ let on_input = move |ev| set_value(event_target_value(&ev).parse::());
+
+ view! {
+
+ }
+}
+```
+
+Каждый раз когда вы меняете значение поля ввода, `on_input` попытается превратить это значение в 32-битное число (`i32`)
+и сохранить его в наш сигнал `value` с типом `Result`. Если вы введёте число `42`, UI отобразит
+
+```
+You entered 42
+```
+
+Но если введете строку `foo`, он отобразит
+
+```
+You entered
+```
+
+Выглядит так себе. Это экономит нам вызов `.unwrap_or_default()` или чего-то подобного, но было бы намного лучше, если
+мы могли бы поймать эту ошибку и что-нибудь с ней сделать.
+
+Вы можете это сделать, используя компонент [``](https://docs.rs/leptos/latest/leptos/fn.ErrorBoundary.html)
+
+```admonish note
+Люди часто пытаются указать на то, что `
+
+ }
+}
+```
+
+Теперь если вы введёте `42`, `value` примет значение `Ok(42)` и вы увидите
+
+```
+You entered 42
+```
+
+Если вы введёте `foo`, `value` будет `Err(_)` и отобразится `fallback`. Мы предпочли вывести список ошибок в виде `String`,
+так что вы увидите что-то вроде
+
+```
+Not a number! Errors:
+- cannot parse integer from empty string
+```
+
+Если вы исправите эту ошибку, сообщение об ошибке исчезнет и контент обёрнутый в
+ `` появится снова.
+
+```admonish sandbox title="Live example" collapsible=true
+
+[Click to open CodeSandbox.](https://codesandbox.io/p/sandbox/7-errors-0-5-5mptv9?file=%2Fsrc%2Fmain.rs%3A1%2C1)
+
+
+
+
+
+
+```
+
+
+Код примера CodeSandbox
+
+```rust
+use leptos::*;
+
+#[component]
+fn App() -> impl IntoView {
+ let (value, set_value) = create_signal(Ok(0));
+
+ // when input changes, try to parse a number from the input
+ let on_input = move |ev| set_value(event_target_value(&ev).parse::());
+
+ view! {
+
"Error Handling"
+
+ }
+}
+
+fn main() {
+ leptos::mount_to_body(App)
+}
+```
+
+
+
diff --git a/src-russian/view/08_parent_child.md b/src-russian/view/08_parent_child.md
new file mode 100644
index 0000000..fc7c95e
--- /dev/null
+++ b/src-russian/view/08_parent_child.md
@@ -0,0 +1,454 @@
+# Коммуникация Родитель-Ребёнок
+
+Вы можете представлять ваше приложение как вложенное дерево компонентов. Каждый компонент
+управляется со собственным локальным состоянием и управляет разделом пользовательского интерфейса,
+так что компоненты склонны быть относительно самодостаточными.
+
+Хотя иногда вам захочется наладить коммуникацию между родительным компонентом и его дочерними компонентами.
+Представьте, например, что вы объявили компонент ``, добавляющий какие-то стили, логирование или что-то ещё к ``.
+Вы хотите использовать `` в вашем компоненте ``. Но как вам наладить коммуникацию между ими двумя?
+
+Передать состояние из родителя в дочерний компонент легко. Мы частично рассматривали это в материале про [компоненты и свойства](./03_components.md).
+Попросту говоря если вы хотите чтобы родитель общался с дочерним компонентом, вы можете передать
+[`ReadSignal`](https://docs.rs/leptos/latest/leptos/struct.ReadSignal.html),
+[`Signal`](https://docs.rs/leptos/latest/leptos/struct.Signal.html), или
+[`MaybeSignal`](https://docs.rs/leptos/latest/leptos/enum.MaybeSignal.html) в качестве свойства.
+
+Но как быть с обратным направлением? Как дочерний элемент может уведомлять родителя о событиях или изменениях состояния?
+
+Есть четыре простых паттерна коммуникации Родитель-Ребёнок в Leptos.
+
+## 1. Передавать [`WriteSignal`](https://docs.rs/leptos/latest/leptos/struct.WriteSignal.html)
+
+Один из подходов это просто передавать `WriteSignal` из родителя в дочерний компонент и в нём обновлять сигнал.
+Это позволяет вам управлять состоянием родителя из дочернего компонента.
+
+```rust
+#[component]
+pub fn App() -> impl IntoView {
+ let (toggled, set_toggled) = create_signal(false);
+ view! {
+
"Toggled? " {toggled}
+
+ }
+}
+
+#[component]
+pub fn ButtonA(setter: WriteSignal) -> impl IntoView {
+ view! {
+
+ }
+}
+```
+
+Этот паттерн прост, но будьте с ним осторожны: передача `WriteSignal` может усложить понимание вашего кода.
+Читая `` из этого примера, вполне ясно, что даёте возможность изменять значение `toggled`,
+но совершенно неясно когда и как это происходит. В этом простом, локальном примере это легко понять, но если вы
+видите, что передаёте сигналы `WriteSignal` как этот по всему вашему коду, вам следует всерьёз задуматься о том не
+упрощает ли этот подход донельзя написание спагетти-кода.
+
+## 2. Использовать `Callback` (функцию обратного вызова)
+
+Ещё один подход это передавать `Callback` в дочерний компонент: скажем, `on_click`.
+
+```rust
+#[component]
+pub fn App() -> impl IntoView {
+ let (toggled, set_toggled) = create_signal(false);
+ view! {
+
"Toggled? " {toggled}
+
+ }
+}
+
+
+#[component]
+pub fn ButtonB(#[prop(into)] on_click: Callback) -> impl IntoView
+{
+ view! {
+
+ }
+}
+```
+
+Вы заметите что когда как `` получил `WriteSignal` и решает как его мутировать,
+`` просто порождает событие: мутация происходит в ``. Преимущество этого в том, что мы локальное состояние
+остаётся локальным, предотвращая проблему спагетти мутации. Но это также означает, что логика мутации сигнала должна находиться в
+``, а не в ``. Это настоящие компромиссы, а не простой выбор между правильно/неправильно.
+
+> Обратите внимание на способ, которым мы используем тип `Callback`. Это просто обёртка вокруг замыкания
+> `Fn(In) -> Out`, которая реализует `Copy`, что упрощает её передачу.
+>
+> Мы также использовали атрибут `#[prop(into)]` чтобы мы могли передавать обычное замыкание в `on_click`.
+> Пожалуйста, посмотрите [главу "Свойства с `into`"](./03_components.md#into-props) для более подробной информации.
+
+### 2.1 Использование замыкание вместо `Callback`
+
+Вы можете использовать Rust замыкание `Fn(MouseEvent)` напрямую вместо `Callback`:
+
+```rust
+#[component]
+pub fn App() -> impl IntoView {
+ let (toggled, set_toggled) = create_signal(false);
+ view! {
+
"Toggled? " {toggled}
+
+ }
+}
+
+
+#[component]
+pub fn ButtonB(on_click: F) -> impl IntoView
+where
+ F: Fn(MouseEvent) + 'static
+{
+ view! {
+
+ }
+}
+```
+
+В данном случае код почти не изменился. В более продвинутых случаях использование замыкания может потребовать клонирования,
+в отличие от варианта с использованием `Callback`.
+
+> Обратите внимание, что мы объявили обобщенный тип `F` ради функции обратного вызова. Если вас это смутило,
+> вернитесь к разделу [Свойства с обобщенными типами](./03_components.html#свойства-с-обобщенными-типами)
+> главы о компонентах.
+
+## 3. Использование слушателя событий _(англ. Event Listener)_
+
+По правде говоря, вы можете Вариант 2 немного другим способом. Если функция обратного вызова напрямую накладывается на нативный DOM элементом,
+вы можете добавить `on:` слушатель прямо в место где вы используете этот компонент в макрос `view` в ``.
+
+```rust
+#[component]
+pub fn App() -> impl IntoView {
+ let (toggled, set_toggled) = create_signal(false);
+ view! {
+
"Toggled? " {toggled}
+ // note the on:click instead of on_click
+ // this is the same syntax as an HTML element event listener
+
+ }
+}
+
+
+#[component]
+pub fn ButtonC() -> impl IntoView {
+ view! {
+
+ }
+}
+```
+
+Это позволяет вам написать намного меньше кода для ``, чем вы написали для ``, и всё даёт слушателю
+ правильно типизированное событие. Это работает так, что слушатель событий `on:` добавляется к каждому возвращаемому ``:
+ в данном случае только `