Skip to content

Commit ab1f07c

Browse files
authored
docs: add uk translations (#4732)
1 parent 7562b95 commit ab1f07c

34 files changed

+9255
-8
lines changed

docs/astro.config.mjs

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const locales = {
1818
'pt-br': { label: 'Português', lang: 'pt-BR' },
1919
ru: { label: 'Русский', lang: 'ru' },
2020
'zh-cn': { label: '简体中文', lang: 'zh-CN' },
21+
uk: { label: 'Українська', lang: 'uk' },
2122
ar: { label: 'العربية', lang: 'ar', dir: 'rtl' },
2223
fa: { label: 'فارسی', lang: 'fa', dir: 'rtl' },
2324
bn: { label: 'বাংলা', lang: 'bn' },
@@ -58,6 +59,7 @@ export default defineConfig({
5859
es: 'Introducción',
5960
ja: '紹介',
6061
ru: 'Введение',
62+
uk: 'Вступ',
6163
},
6264
items: [
6365
{
@@ -69,6 +71,7 @@ export default defineConfig({
6971
es: 'Empezando',
7072
ja: 'はじめに',
7173
ru: 'Начало работы',
74+
uk: 'Початок роботи',
7275
},
7376
},
7477
{
@@ -80,6 +83,7 @@ export default defineConfig({
8083
es: '¿Por qué Bloc?',
8184
ja: 'なぜBloc?',
8285
ru: 'Почему Bloc?',
86+
uk: 'Чому Bloc?',
8387
},
8488
},
8589
{
@@ -91,6 +95,7 @@ export default defineConfig({
9195
es: 'Conceptos de Bloc',
9296
ja: 'Blocのコンセプト',
9397
ru: 'Концепции Bloc',
98+
uk: 'Концепції Bloc',
9499
},
95100
},
96101
{
@@ -102,6 +107,7 @@ export default defineConfig({
102107
es: 'Conceptos de Flutter Bloc',
103108
ja: 'Flutter Blocのコンセプト',
104109
ru: 'Концепции Flutter Bloc',
110+
uk: 'Концепції Flutter Bloc',
105111
},
106112
},
107113
{
@@ -112,6 +118,7 @@ export default defineConfig({
112118
es: 'Arquitectura',
113119
ja: 'アーキテクチャー',
114120
ru: 'Архитектура',
121+
uk: 'Архітектура',
115122
},
116123
},
117124
{
@@ -122,12 +129,19 @@ export default defineConfig({
122129
es: 'Modelando el Estado',
123130
ja: '状態のモデリング',
124131
ru: 'Моделирование состояния',
132+
uk: 'Моделювання стану',
125133
},
126134
},
127135
{
128136
label: 'Testing',
129137
link: '/testing/',
130-
translations: { fa: 'آزمایش کردن', es: 'Pruebas', ja: 'テスト', ru: 'Тестирование' },
138+
translations: {
139+
fa: 'آزمایش کردن',
140+
es: 'Pruebas',
141+
ja: 'テスト',
142+
ru: 'Тестирование',
143+
uk: 'Тестування',
144+
},
131145
},
132146
{
133147
label: 'Naming Conventions',
@@ -137,6 +151,7 @@ export default defineConfig({
137151
es: 'Convenciones de Nomenclatura',
138152
ja: '命名規則',
139153
ru: 'Соглашения об именовании',
154+
uk: 'Угоди про іменування',
140155
},
141156
},
142157
{
@@ -147,6 +162,7 @@ export default defineConfig({
147162
es: 'Guía de Migración',
148163
ja: '移行ガイド',
149164
ru: 'Руководство по миграции',
165+
uk: 'Посібник з міграції',
150166
},
151167
},
152168
{
@@ -157,38 +173,44 @@ export default defineConfig({
157173
es: 'Preguntas Frecuentes',
158174
ja: 'よくある質問',
159175
ru: 'Часто задаваемые вопросы',
176+
uk: 'Часті запитання',
160177
},
161178
},
162179
],
163180
},
164181
{
165182
label: 'Linter',
166183
badge: { text: 'new' },
184+
translations: { uk: 'Лінтер' },
167185
items: [
168186
{
169187
label: 'Overview ',
170188
link: '/lint/',
171-
translations: { fa: 'بررسی اجمالی', ru: 'Обзор' },
189+
translations: { fa: 'بررسی اجمالی', ru: 'Обзор', uk: 'Огляд' },
172190
},
173191
{
174192
label: 'Installation ',
175193
link: '/lint/installation/',
176-
translations: { fa: 'نصب', ru: 'Установка' },
194+
translations: { fa: 'نصب', ru: 'Установка', uk: 'Встановлення' },
177195
},
178196
{
179197
label: 'Configuration ',
180198
link: '/lint/configuration/',
181-
translations: { fa: 'پیکربندی', ru: 'Конфигурация' },
199+
translations: { fa: 'پیکربندی', ru: 'Конфигурация', uk: 'Конфігурація' },
182200
},
183201
{
184202
label: 'Customizing Rules ',
185203
link: '/lint/customizing-rules/',
186-
translations: { fa: 'سفارشی سازی قوانین', ru: 'Настройка правил' },
204+
translations: {
205+
fa: 'سفارشی سازی قوانین',
206+
ru: 'Настройка правил',
207+
uk: 'Налаштування правил',
208+
},
187209
},
188210
{
189211
label: 'Rules',
190212
autogenerate: { directory: '/lint-rules' },
191-
translations: { fa: 'قوانین', ru: 'Правила' },
213+
translations: { fa: 'قوانین', ru: 'Правила', uk: 'Правила' },
192214
},
193215
],
194216
},
@@ -199,12 +221,19 @@ export default defineConfig({
199221
es: 'Tutoriales',
200222
ja: 'チュートリアル',
201223
ru: 'Руководства',
224+
uk: 'Посібники',
202225
},
203226
autogenerate: { directory: 'tutorials' },
204227
},
205228
{
206229
label: 'Tools',
207-
translations: { fa: 'ابزار', es: 'Herramientas', ja: 'ツール', ru: 'Инструменты' },
230+
translations: {
231+
fa: 'ابزار',
232+
es: 'Herramientas',
233+
ja: 'ツール',
234+
ru: 'Инструменты',
235+
uk: 'Інструменти',
236+
},
208237
items: [
209238
{
210239
label: 'IntelliJ Plugin',
@@ -213,6 +242,7 @@ export default defineConfig({
213242
fa: 'پلاگین IntelliJ',
214243
es: 'Plugin de IntelliJ',
215244
ru: 'Плагин IntelliJ',
245+
uk: 'Плагін IntelliJ',
216246
},
217247
},
218248
{
@@ -222,13 +252,20 @@ export default defineConfig({
222252
fa: 'پلاگین VSCode',
223253
es: 'Extensión de VSCode',
224254
ru: 'Расширение VSCode',
255+
uk: 'Розширення VSCode',
225256
},
226257
},
227258
],
228259
},
229260
{
230261
label: 'Reference',
231-
translations: { fa: 'مرجع', es: 'Referencia', ja: 'APIリファレンス', ru: 'Справочник' },
262+
translations: {
263+
fa: 'مرجع',
264+
es: 'Referencia',
265+
ja: 'APIリファレンス',
266+
ru: 'Справочник',
267+
uk: 'Довідник',
268+
},
232269
items: [
233270
{
234271
label: 'angular_bloc',
Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
---
2+
title: Архітектура
3+
description: Огляд рекомендованих архітектурних шаблонів при використанні bloc.
4+
---
5+
6+
import DataProviderSnippet from '~/components/architecture/DataProviderSnippet.astro';
7+
import RepositorySnippet from '~/components/architecture/RepositorySnippet.astro';
8+
import BusinessLogicComponentSnippet from '~/components/architecture/BusinessLogicComponentSnippet.astro';
9+
import BlocTightCouplingSnippet from '~/components/architecture/BlocTightCouplingSnippet.astro';
10+
import BlocLooseCouplingPresentationSnippet from '~/components/architecture/BlocLooseCouplingPresentationSnippet.astro';
11+
import AppIdeasRepositorySnippet from '~/components/architecture/AppIdeasRepositorySnippet.astro';
12+
import AppIdeaRankingBlocSnippet from '~/components/architecture/AppIdeaRankingBlocSnippet.astro';
13+
import PresentationComponentSnippet from '~/components/architecture/PresentationComponentSnippet.astro';
14+
15+
![Архітектура Bloc](~/assets/concepts/bloc_architecture_full.png)
16+
17+
Використання бібліотеки bloc дозволяє нам розділити наш додаток на три шари:
18+
19+
- Представлення
20+
- Бізнес-логіка
21+
- Дані
22+
- Сховище
23+
- Постачальник даних
24+
25+
Ми почнемо з найнижчого шару (найбільш віддаленого від користувацького
26+
інтерфейсу) та рухатимемося вгору до шару представлення.
27+
28+
## Шар даних
29+
30+
Відповідальність шару даних полягає в отриманні/маніпулюванні даними з одного
31+
або кількох джерел.
32+
33+
Шар даних можна розділити на дві частини:
34+
35+
- Сховище
36+
- Постачальник даних
37+
38+
Цей шар є найнижчим рівнем додатку та взаємодіє з базами даних, мережевими
39+
запитами та іншими асинхронними джерелами даних.
40+
41+
### Постачальник даних
42+
43+
Відповідальність постачальника даних полягає в наданні необроблених даних.
44+
Постачальник даних повинен бути універсальним та багатофункціональним.
45+
46+
Постачальник даних зазвичай надає прості API для виконання
47+
[CRUD](https://uk.wikipedia.org/wiki/CRUD) операцій. Ми можемо мати методи
48+
`createData`, `readData`, `updateData` та `deleteData` як частину нашого шару
49+
даних.
50+
51+
<DataProviderSnippet />
52+
53+
### Сховище
54+
55+
Шар сховища — це обгортка навколо одного або кількох постачальників даних, з
56+
якими спілкується шар Bloc.
57+
58+
<RepositorySnippet />
59+
60+
Як ви можете бачити, наш шар сховища може взаємодіяти з кількома постачальниками
61+
даних та виконувати перетворення даних перед передачею результату на шар
62+
бізнес-логіки.
63+
64+
## Шар бізнес-логіки
65+
66+
Відповідальність шару бізнес-логіки полягає у відповіді на введення з шару
67+
представлення новими станами. Цей шар може залежати від одного або кількох
68+
сховищ для отримання даних, необхідних для побудови стану додатку.
69+
70+
Думайте про шар бізнес-логіки як про міст між користувацьким інтерфейсом (шар
71+
представлення) та шаром даних. Шар бізнес-логіки сповіщається про події/дії з
72+
шару представлення, а потім взаємодіє зі сховищем, щоб побудувати новий стан для
73+
використання шаром представлення.
74+
75+
<BusinessLogicComponentSnippet />
76+
77+
### Взаємодія між блоками
78+
79+
Оскільки блоки надають потоки, може виникнути спокуса створити блок, який
80+
прослуховує інший блок. Ви **не повинні** робити цього. Існують кращі
81+
альтернативи, ніж вдаватися до коду нижче:
82+
83+
<BlocTightCouplingSnippet />
84+
85+
Хоча наведений вище код не містить помилок (і навіть очищується за собою), він
86+
має більш серйозну проблему: він створює залежність між двома блоками.
87+
88+
Як правило, залежностей між двома сутностями на одному архітектурному шарі слід
89+
уникати за будь-яку ціну, оскільки це створює тісний зв'язок, який важко
90+
підтримувати. Оскільки блоки знаходяться на архітектурному шарі бізнес-логіки,
91+
жоден блок не повинен знати про будь-який інший блок.
92+
93+
![Шари архітектури додатку](~/assets/architecture/architecture.png)
94+
95+
Блок повинен отримувати інформацію лише через події та з впроваджених сховищ
96+
(тобто сховищ, переданих блоку в його конструкторі).
97+
98+
Якщо ви перебуваєте в ситуації, коли блок повинен реагувати на інший блок, у вас
99+
є два інших варіанти. Ви можете перемістити проблему на шар вище (у шар
100+
представлення) або на шар нижче (у шар домену).
101+
102+
#### З'єднання блоків через представлення
103+
104+
Ви можете використовувати `BlocListener` для прослуховування одного блоку та
105+
додавання події до іншого блоку щоразу, коли перший блок змінюється.
106+
107+
<BlocLooseCouplingPresentationSnippet />
108+
109+
Наведений вище код запобігає необхідності `SecondBloc` знати про `FirstBloc`,
110+
заохочуючи слабкий зв'язок. Додаток
111+
[flutter_weather](/uk/tutorials/flutter-weather)
112+
[використовує цю техніку](https://github.com/felangel/bloc/blob/b4c8db938ad71a6b60d4a641ec357905095c3965/examples/flutter_weather/lib/weather/view/weather_page.dart#L38-L42)
113+
для зміни теми додатку на основі отриманої інформації про погоду.
114+
115+
У деяких ситуаціях ви можете не захотіти зв'язувати два блоки в шарі
116+
представлення. Замість цього часто має сенс, щоб два блоки використовували одне
117+
й те саме джерело даних та оновлювалися при зміні даних.
118+
119+
#### З'єднання блоків через домен
120+
121+
Два блоки можуть прослуховувати потік зі сховища та оновлювати свої стани
122+
незалежно один від одного щоразу, коли змінюються дані сховища. Використання
123+
реактивних сховищ для синхронізації стану є поширеним у великомасштабних
124+
корпоративних додатках.
125+
126+
Спочатку створіть або використовуйте сховище, яке надає `Stream` даних.
127+
Наприклад, наступне сховище надає нескінченний потік тих самих кількох ідей
128+
додатків:
129+
130+
<AppIdeasRepositorySnippet />
131+
132+
Те саме сховище може бути впроваджене в кожний блок, який повинен реагувати на
133+
нові ідеї додатків. Нижче наведено `AppIdeaRankingBloc`, який видає стан для
134+
кожної вхідної ідеї додатку зі сховища вище:
135+
136+
<AppIdeaRankingBlocSnippet />
137+
138+
Докладніше про використання потоків з Bloc див. у статті
139+
[Як використовувати Bloc з потоками та конкурентністю](https://verygood.ventures/blog/how-to-use-bloc-with-streams-and-concurrency).
140+
141+
## Шар представлення
142+
143+
Відповідальність шару представлення полягає у визначенні того, як відмалювати
144+
себе на основі одного або кількох станів блоків. Крім того, він повинен
145+
обробляти введення користувача та події життєвого циклу додатку.
146+
147+
Більшість потоків додатків починаються з події `AppStart`, яка запускає додаток
148+
для отримання деяких даних для представлення користувачеві.
149+
150+
У цьому сценарії шар представлення додасть подію `AppStart`.
151+
152+
Крім того, шар представлення повинен буде визначити, що відмалювати на екрані на
153+
основі стану з шару bloc.
154+
155+
<PresentationComponentSnippet />
156+
157+
До цього моменту, хоча у нас були деякі фрагменти коду, все це було досить
158+
високорівневим. У розділі посібників ми об'єднаємо все це разом, коли будемо
159+
створювати кілька різних прикладів додатків.

0 commit comments

Comments
 (0)