From a4d80d3ba0869e434175e7a3b123b7ff1a06d513 Mon Sep 17 00:00:00 2001 From: Andriy Redko Date: Tue, 4 Jun 2024 06:10:16 -0400 Subject: [PATCH] uk: Concurrency (afternoon) (#2117) uk: Concurrency (afternoon) Signed-off-by: Andriy Redko --- po/uk.po | 490 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 260 insertions(+), 230 deletions(-) diff --git a/po/uk.po b/po/uk.po index 3f35a091fe6..6ff838c0810 100644 --- a/po/uk.po +++ b/po/uk.po @@ -1131,7 +1131,7 @@ msgstr "`Pin`" #: src/SUMMARY.md src/async/pitfalls/async-traits.md msgid "Async Traits" -msgstr "Асинхронні Трейти" +msgstr "Асинхронні трейти" #: src/SUMMARY.md src/async/pitfalls/cancellation.md msgid "Cancellation" @@ -21591,7 +21591,7 @@ msgstr "\"Піфагор\"" #: src/exercises/concurrency/dining-philosophers-async.md #: src/exercises/concurrency/solutions-afternoon.md msgid "// Create forks\n" -msgstr "// Створюємо вилки\n" +msgstr "// Створюємо виделки\n" #: src/exercises/concurrency/dining-philosophers.md #: src/exercises/concurrency/dining-philosophers-async.md @@ -21803,7 +21803,7 @@ msgid "" " // either of them.\n" msgstr "" "// Щоб уникнути глухого кута, ми повинні порушити симетрію\n" -" // десь. Це дозволить поміняти місцями вилки без деініціалізації\n" +" // десь. Це дозволить поміняти місцями виделки без деініціалізації\n" " // жодної з них.\n" #: src/exercises/concurrency/solutions-morning.md @@ -21845,7 +21845,7 @@ msgstr "\"Неправильні URL-адреси: {:#?}\"" #: src/async.md msgid "Async Rust" -msgstr "Асинхронний Rust" +msgstr "Асинхронний (Async) Rust" #: src/async.md msgid "" @@ -21856,13 +21856,13 @@ msgid "" "per-task overhead is typically very low and operating systems provide " "primitives for efficiently identifying I/O that is able to proceed." msgstr "" -"«Асинхронна» — це модель паралелізму, у якій кілька завдань виконуються " -"одночасно, кожне завдання виконується, доки воно не заблокується, а потім " -"перемикається на інше завдання, яке готове до виконання. Модель дозволяє " -"виконувати більшу кількість завдань на обмеженій кількості потоків. Це " -"пояснюється тим, що накладні витрати на кожне завдання зазвичай дуже низькі, " -"а операційні системи забезпечують примітиви для ефективної ідентифікації " -"вводу-виводу, який може продовжуватися." +"\"Async\" — це модель одночасного виконання декількох завдань, при якій " +"кожне завдання виконується одночасно доти, доки воно не заблокується, а " +"потім перемикається на інше завдання, яке готове до виконання. Модель " +"дозволяє виконувати більшу кількість завдань на обмеженій кількості потоків. " +"Це пов'язано з тим, що накладні витрати на кожну задачу зазвичай дуже " +"низькі, а операційні системи надають примітиви для ефективного визначення " +"вводу/виводу, який може продовжувати роботу." #: src/async.md msgid "" @@ -21870,7 +21870,7 @@ msgid "" "that may be completed in the future. Futures are \"polled\" until they " "signal that they are complete." msgstr "" -"Асинхронна робота Rust базується на «ф’ючерсах», які представляють роботу, " +"Асинхронна робота Rust базується на \"ф'ючерсах\", які представляють роботу, " "яка може бути завершена в майбутньому. Ф'ючерси \"опитуються\", доки вони не " "сигналізують, що вони завершені." @@ -21890,7 +21890,7 @@ msgid "" msgstr "" "Python має подібну модель у своєму `asyncio`. Однак його тип `Future` " "базується на зворотному виклику, а не опитується. Програми на асинхронному " -"Python вимагають «циклу», подібного до середовища виконання в Rust." +"Python вимагають \"циклу\", подібного до середовища виконання в Rust." #: src/async.md msgid "" @@ -21898,21 +21898,21 @@ msgid "" "runtime implements the event loop, so many of the details of Promise " "resolution are hidden." msgstr "" -"`Promise` JavaScript подібний, але знову ж таки на основі зворотного " +"Тип `Promise` JavaScript подібний, але знову ж таки на основі зворотного " "виклику. Середовище виконання мови реалізує цикл подій, тому багато деталей " -"вирішення Promise приховані." +"вирішення `Promise` приховані." #: src/async/async-await.md msgid "" "At a high level, async Rust code looks very much like \"normal\" sequential " "code:" msgstr "" -"На високому рівні асинхронний код Rust дуже схожий на «звичайний» " +"На високому рівні асинхронний код Rust дуже схожий на \"звичайний\" " "послідовний код:" #: src/async/async-await.md msgid "\"Count is: {i}!\"" -msgstr "" +msgstr "\"Підрахунок: {i}!\"" #: src/async/async-await.md msgid "" @@ -21920,7 +21920,7 @@ msgid "" "running operation or any real concurrency in it!" msgstr "" "Зауважте, що це спрощений приклад для демонстрації синтаксису. У ньому немає " -"тривалої операції чи реального паралелізму!" +"тривалої операції чи реального одночасного виконання!" #: src/async/async-await.md msgid "What is the return type of an async call?" @@ -21929,15 +21929,15 @@ msgstr "Який тип повернення асинхронного викли #: src/async/async-await.md msgid "Use `let future: () = async_main(10);` in `main` to see the type." msgstr "" +"Використовуйте `let future: () = async_main(10);` в `main`, щоб побачити тип." #: src/async/async-await.md -#, fuzzy msgid "" "The \"async\" keyword is syntactic sugar. The compiler replaces the return " "type with a future." msgstr "" "Ключове слово \"async\" - це синтаксичний цукор. Компілятор замінює тип " -"повернення майбутнім." +"повернення на ф'ючерс." #: src/async/async-await.md msgid "" @@ -21945,16 +21945,15 @@ msgid "" "compiler on how to use the returned future." msgstr "" "Ви не можете зробити `main` асинхронним без додаткових інструкцій для " -"компілятора щодо використання повернутого майбутнього." +"компілятора щодо використання повернутого ф'ючерса." #: src/async/async-await.md -#, fuzzy msgid "" "You need an executor to run async code. `block_on` blocks the current thread " "until the provided future has run to completion." msgstr "" "Вам потрібен виконавець для запуску асинхронного коду. `block_on` блокує " -"поточний потік, доки наданий майбутній не завершиться." +"поточний потік, доки наданий ф'ючерс не завершиться." #: src/async/async-await.md msgid "" @@ -21969,6 +21968,8 @@ msgid "" "`.await` can only be used inside an `async` function (or block; these are " "introduced later)." msgstr "" +"`.await` можна використовувати тільки всередині функції `async` (або блоку; " +"вони будуть представлені пізніше)." #: src/async/futures.md msgid "" @@ -21977,9 +21978,9 @@ msgid "" "complete yet. A future can be polled, and `poll` returns a [`Poll`](https://" "doc.rust-lang.org/std/task/enum.Poll.html)." msgstr "" -"[`Майбутнє`](https://doc.rust-lang.org/std/future/trait.Future.html) — це " -"ознака, реалізована об’єктами, які представляють операцію, яка може бути ще " -"не завершеною. Майбутнє можна опитувати, і `poll` повертає [`Poll`](https://" +"[`Future`](https://doc.rust-lang.org/std/future/trait.Future.html) — це " +"трейт, реалізований об’єктами, які представляють операцію, яка може бути ще " +"не завершеною. Ф'ючерс можна опитувати, і `poll` повертає [`Poll`](https://" "doc.rust-lang.org/std/task/enum.Poll.html)." #: src/async/futures.md @@ -21999,15 +22000,17 @@ msgid "" "The `.await` keyword, applied to a Future, causes the current async function " "to pause until that Future is ready, and then evaluates to its output." msgstr "" -"Ключове слово `.await`, застосоване до Future, змушує поточну асинхронну " -"функцію призупиняти, доки це Future не буде готове, а потім обчислює її " -"вихід." +"Ключове слово `.await`, застосоване до `Future`, змушує поточну асинхронну " +"функцію призупинятися, доки це `Future` не буде готове, а потім обчислює її " +"вихідні дані." #: src/async/futures.md msgid "" "The `Future` and `Poll` types are implemented exactly as shown; click the " "links to show the implementations in the docs." msgstr "" +"Типи `Future` та `Poll` реалізовано саме так, як показано на малюнку; " +"натисніть на лінки, щоб переглянути реалізацію в документації." #: src/async/futures.md msgid "" @@ -22023,8 +22026,8 @@ msgid "" "`Context` allows a Future to schedule itself to be polled again when an " "event occurs." msgstr "" -"`Контекст` дозволяє Future запланувати повторне опитування, коли відбудеться " -"подія." +"`Context` дозволяє Future запланувати повторне опитування, при настанні " +"певної події." #: src/async/futures.md msgid "" @@ -22032,8 +22035,8 @@ msgid "" "that future remain valid. This is required to allow references to remain " "valid after an `.await`." msgstr "" -"`Pin` гарантує, що майбутнє не буде переміщено в пам'яті, тому покажчики на " -"це майбутнє залишатимуться дійсними. Це потрібно, щоб дозволити посиланням " +"`Pin` гарантує, що Future не буде переміщено в пам'яті, тому покажчики на " +"цей ф'ючерс залишатимуться дійсними. Це потрібно, щоб дозволити посиланням " "залишатися дійсними після `.await`." #: src/async/runtimes.md @@ -22042,9 +22045,9 @@ msgid "" "_reactor_) and is responsible for executing futures (an _executor_). Rust " "does not have a \"built-in\" runtime, but several options are available:" msgstr "" -"_Runtime_ забезпечує підтримку асинхронного виконання операцій (_reactor_) і " -"відповідає за виконання ф’ючерсів (_executor_). Rust не має «вбудованого» " -"середовища виконання, але доступні кілька варіантів:" +"_Середовище виконанняe_ забезпечує підтримку асинхронного виконання операцій " +"(_реактор_) і відповідає за виконання ф’ючерсів (_виконавець_). Rust не має " +"\"вбудованого\" середовища виконання, але доступні кілька варіантів:" #: src/async/runtimes.md msgid "" @@ -22054,15 +22057,15 @@ msgid "" msgstr "" "[Tokio](https://tokio.rs/): ефективний, із добре розвиненою екосистемою " "функціональності, наприклад [Hyper](https://hyper.rs/) для HTTP або [Tonic]" -"(https://github) .com/hyperium/tonic) для gRPC." +"(https://github.com/hyperium/tonic) для gRPC." #: src/async/runtimes.md msgid "" "[async-std](https://async.rs/): aims to be a \"std for async\", and includes " "a basic runtime in `async::task`." msgstr "" -"[async-std](https://async.rs/): прагне бути \"стандартом для асинхронного\" " -"та включає базове середовище виконання в `async::task`." +"[async-std](https://async.rs/): прагне бути \"std for async\" та включає " +"базове середовище виконання в `async::task`." #: src/async/runtimes.md msgid "[smol](https://docs.rs/smol/latest/smol/): simple and lightweight" @@ -22076,7 +22079,7 @@ msgid "" msgstr "" "Кілька великих програм мають власний час виконання. Наприклад, [Fuchsia]" "(https://fuchsia.googlesource.com/fuchsia/+/refs/heads/main/src/lib/fuchsia-" -"async/src/lib.rs) уже має один." +"async/src/lib.rs) вже має один." #: src/async/runtimes.md msgid "" @@ -22096,7 +22099,7 @@ msgid "" "Promises, for example, which will run to completion even if they are never " "used." msgstr "" -"Ф'ючерси «інертні» в тому, що вони нічого не роблять (навіть не починають " +"Ф'ючерси \"інертні\" в тому, що вони нічого не роблять (навіть не починають " "операцію вводу-виводу), якщо немає виконавця, який їх опитує. Це " "відрізняється від, наприклад, JS Promises, які виконуватимуться до кінця, " "навіть якщо їх ніколи не використовувати." @@ -22112,29 +22115,29 @@ msgstr "Багатопотокове середовище виконання д #: src/async/runtimes/tokio.md msgid "An asynchronous version of the standard library." -msgstr "Асинхронна версія стандартної бібліотеки." +msgstr "Асинхронну версію стандартної бібліотеки." #: src/async/runtimes/tokio.md msgid "A large ecosystem of libraries." -msgstr "Велика екосистема бібліотек." +msgstr "Велику екосистему бібліотек." #: src/async/runtimes/tokio.md msgid "\"Count in task: {i}!\"" -msgstr "" +msgstr "\"Підрахунок у завданні: {i}!\"" #: src/async/runtimes/tokio.md msgid "\"Main task: {i}\"" -msgstr "" +msgstr "\"Основне завдання: {i}\"" #: src/async/runtimes/tokio.md msgid "With the `tokio::main` macro we can now make `main` async." msgstr "" "За допомогою макросу `tokio::main` ми тепер можемо зробити `main` " -"асинхронним." +"асинхронною." #: src/async/runtimes/tokio.md msgid "The `spawn` function creates a new, concurrent \"task\"." -msgstr "Функція `spawn` створює нове одночасне \"завдання\"." +msgstr "Функція `spawn` створює нове, одночасне \"завдання\"." #: src/async/runtimes/tokio.md msgid "Note: `spawn` takes a `Future`, you don't call `.await` on `count_to`." @@ -22153,7 +22156,7 @@ msgid "" msgstr "" "Чому `count_to` (зазвичай) не досягає 10? Це приклад асинхронного " "скасування. `tokio::spawn` повертає дескриптор, який можна чекати, поки він " -"завершиться." +"не завершиться." #: src/async/runtimes/tokio.md msgid "Try `count_to(10).await` instead of spawning." @@ -22165,7 +22168,8 @@ msgstr "Спробуйте дочекатися завдання, поверну #: src/async/tasks.md msgid "Rust has a task system, which is a form of lightweight threading." -msgstr "У Rust є система завдань, яка є формою легкого потоку." +msgstr "" +"У Rust є система завдань, яка є формою полегшеного потокового програмування." #: src/async/tasks.md msgid "" @@ -22175,35 +22179,36 @@ msgid "" "task is possible by polling multiple child futures, such as racing a timer " "and an I/O operation." msgstr "" -"Завдання має єдине майбутнє верхнього рівня, яке виконавець опитує для " -"прогресу. Це майбутнє може мати один або декілька вкладених ф’ючерсів, які " +"Завдання має єдиний ф'ючерс верхнього рівня, яке виконавець опитує для " +"прогресу. Цей ф'ючерс може мати один або декілька вкладених ф’ючерсів, які " "опитує його метод `poll`, що приблизно відповідає стеку викликів. " -"Паралельність у межах завдання можлива за допомогою опитування кількох " -"дочірніх ф’ючерсів, таких як змагання таймера та операції введення/виведення." +"Одночасність виконання у межах завдання можлива за допомогою опитування " +"кількох дочірніх ф’ючерсів, таких як перегони таймера та операції введення/" +"виведення." #: src/async/tasks.md msgid "\"127.0.0.1:0\"" -msgstr "" +msgstr "\"127.0.0.1:0\"" #: src/async/tasks.md msgid "\"listening on port {}\"" -msgstr "" +msgstr "\"слухаємо на порту {}\"" #: src/async/tasks.md msgid "\"connection from {addr:?}\"" -msgstr "" +msgstr "\"з'єднання з {addr:?}\"" #: src/async/tasks.md msgid "b\"Who are you?\\n\"" -msgstr "" +msgstr "b\"Хто ви?\\n\"" #: src/async/tasks.md msgid "\"socket error\"" -msgstr "" +msgstr "\"помилка сокета\"" #: src/async/tasks.md msgid "\"Thanks for dialing in, {name}!\\n\"" -msgstr "" +msgstr "\"Дякуємо за дзвінок, {name}!\\n\"" #: src/async/tasks.md src/async/control-flow/join.md msgid "" @@ -22218,6 +22223,9 @@ msgid "" "com/man-page/linux/1/nc/) or [telnet](https://www.unix.com/man-page/linux/1/" "telnet/)." msgstr "" +"Спробуйте підключитися до нього за допомогою TCP-з'єднання, наприклад, [nc]" +"(https://www.unix.com/man-page/linux/1/nc/) або [telnet](https://www.unix." +"com/man-page/linux/1/telnet/)." #: src/async/tasks.md msgid "" @@ -22225,57 +22233,54 @@ msgid "" "a few connected clients. What tasks exist? What are their Futures?" msgstr "" "Попросіть студентів візуалізувати стан сервера прикладу з кількома " -"підключеними клієнтами. Які існують завдання? Яке їхнє майбутнє?" +"підключеними клієнтами. Які існують завдання? Які їхні Futures?" #: src/async/tasks.md -#, fuzzy msgid "" "This is the first time we've seen an `async` block. This is similar to a " "closure, but does not take any arguments. Its return value is a Future, " "similar to an `async fn`." msgstr "" "Це перший раз, коли ми бачимо блок `async`. Це схоже на закриття, але не " -"приймає жодних аргументів. Його повертається значення Future, подібне до " -"`async fn`." +"приймає жодних аргументів. Він повертає значення Future, подібно до `async " +"fn`." #: src/async/tasks.md -#, fuzzy msgid "" "Refactor the async block into a function, and improve the error handling " "using `?`." msgstr "" -"Перетворіть асинхронний блок у функцію та покращте обробку помилок за " +"Перетворіть асинхронний блок у функцію та покращіть обробку помилок за " "допомогою `?`." #: src/async/channels.md msgid "" "Several crates have support for asynchronous channels. For instance `tokio`:" -msgstr "Кілька ящиків підтримують асинхронні канали. Наприклад `tokio`:" +msgstr "Кілька крейтів підтримують асинхронні канали. Наприклад `tokio`:" #: src/async/channels.md msgid "\"Received {count} pings so far.\"" -msgstr "" +msgstr "\"Отримано {count} пінгів до цього часу.\"" #: src/async/channels.md msgid "\"ping_handler complete\"" -msgstr "" +msgstr "\"ping_handler завершено\"" #: src/async/channels.md msgid "\"Failed to send ping.\"" -msgstr "" +msgstr "\"Не вдалося надіслати пінг.\"" #: src/async/channels.md msgid "\"Sent {} pings so far.\"" -msgstr "" +msgstr "\"Поки що надіслано {} пінгів.\"" #: src/async/channels.md msgid "\"Something went wrong in ping handler task.\"" -msgstr "" +msgstr "\"Щось пішло не так у завданні обробника пінгу.\"" #: src/async/channels.md msgid "Change the channel size to `3` and see how it affects the execution." -msgstr "" -"Змініть розмір каналу на \"3\" і подивіться, як це вплине на виконання." +msgstr "Змініть розмір каналу на `3` і подивіться, як це вплине на виконання." #: src/async/channels.md msgid "" @@ -22287,7 +22292,7 @@ msgstr "" #: src/async/channels.md msgid "Try removing the `std::mem::drop` call. What happens? Why?" -msgstr "Спробуйте видалити виклик `std::mem::drop`. Що сталося? чому" +msgstr "Спробуйте видалити виклик `std::mem::drop`. Що сталося? Чому?" #: src/async/channels.md msgid "" @@ -22295,9 +22300,10 @@ msgid "" "implement both `sync` and `async` `send` and `recv`. This can be convenient " "for complex applications with both IO and heavy CPU processing tasks." msgstr "" -"Ящик [Flume](https://docs.rs/flume/latest/flume/) має канали, які реалізують " -"як `sync`, так і `async` `send` і `recv`. Це може бути зручно для складних " -"додатків із як введенням вводу-виводу, так і з важкими завданнями обробки ЦП." +"Крейт [Flume](https://docs.rs/flume/latest/flume/) має канали, які " +"реалізують як `sync`, так і `async` `send` і `recv`. Це може бути зручно для " +"складних програм, що використовують як ввід-вивід, так і важкі процесорні " +"завдання." #: src/async/channels.md msgid "" @@ -22305,9 +22311,9 @@ msgid "" "combine them with other `future`s to combine them and create complex control " "flow." msgstr "" -"Те, що робить роботу з «асинхронними» каналами кращою, це можливість " -"комбінувати їх з іншими «майбутніми», щоб поєднати їх і створити складний " -"потік керування." +"Що робить роботу з `async` каналами більш кращою, так це можливість " +"комбінувати їх з іншими `future`, щоб об'єднувати їх і створювати складні " +"потоки управління." #: src/async/control-flow.md msgid "Futures Control Flow" @@ -22319,17 +22325,17 @@ msgid "" "We have already seen tasks, that function as independent threads of " "execution." msgstr "" -"Ф’ючерси можна об’єднувати, щоб створювати графіки потоків одночасних " +"Ф’ючерси можна об’єднувати, щоб створювати графи потоків одночасних " "обчислень. Ми вже бачили завдання, які функціонують як незалежні потоки " "виконання." #: src/async/control-flow.md msgid "[Join](control-flow/join.md)" -msgstr "[Приєднатися](control-flow/join.md)" +msgstr "[Join](control-flow/join.md)" #: src/async/control-flow.md msgid "[Select](control-flow/select.md)" -msgstr "[Вибрати](control-flow/select.md)" +msgstr "[Select](control-flow/select.md)" #: src/async/control-flow/join.md msgid "" @@ -22343,19 +22349,19 @@ msgstr "" #: src/async/control-flow/join.md msgid "\"https://google.com\"" -msgstr "" +msgstr "\"https://google.com\"" #: src/async/control-flow/join.md msgid "\"https://httpbin.org/ip\"" -msgstr "" +msgstr "\"https://httpbin.org/ip\"" #: src/async/control-flow/join.md msgid "\"https://play.rust-lang.org/\"" -msgstr "" +msgstr "\"https://play.rust-lang.org/\"" #: src/async/control-flow/join.md msgid "\"BAD_URL\"" -msgstr "" +msgstr "\"BAD_URL\"" #: src/async/control-flow/join.md msgid "" @@ -22365,17 +22371,16 @@ msgid "" msgstr "" "Для кількох ф’ючерсів непересічних типів ви можете використовувати `std::" "future::join!`, але ви повинні знати, скільки ф’ючерсів у вас буде під час " -"компіляції. Наразі це в ящику `futures`, незабаром буде стабілізовано в " +"компіляції. Наразі це в коейті `futures`, незабаром буде стабілізовано в " "`std::future`." #: src/async/control-flow/join.md -#, fuzzy msgid "" "The risk of `join` is that one of the futures may never resolve, this would " "cause your program to stall." msgstr "" "Ризик `join` полягає в тому, що один із ф'ючерсів може ніколи не вирішитися, " -"це призведе до зупинки вашої програми." +"це призведе до зависання вашої програми." #: src/async/control-flow/join.md msgid "" @@ -22387,8 +22392,8 @@ msgid "" msgstr "" "Ви також можете поєднати `join_all` з `join!`, наприклад, щоб об’єднати всі " "запити до служби http, а також запит до бази даних. Спробуйте додати `tokio::" -"time::sleep` до майбутнього, використовуючи `futures::join!`. Це не тайм-аут " -"(який вимагає `select!`, пояснюється в наступному розділі), а демонструє " +"time::sleep` до ф'ючерсу, використовуючи `futures::join!`. Це не тайм-аут " +"(який вимагає `select!`, пояснюється в наступному розділі), але демонструє " "`join!`." #: src/async/control-flow/select.md @@ -22398,13 +22403,12 @@ msgid "" "race`. In Python, it compares to `asyncio.wait(task_set, return_when=asyncio." "FIRST_COMPLETED)`." msgstr "" -"Операція вибору очікує, поки будь-який із набору ф’ючерсів буде готовий, і " +"Операція select очікує, поки будь-який із набору ф’ючерсів буде готовий, і " "відповідає на результат цього ф’ючерсу. У JavaScript це схоже на `Promise." "race`. У Python це порівнюється з `asyncio.wait(task_set, " "return_when=asyncio.FIRST_COMPLETED)`." #: src/async/control-flow/select.md -#, fuzzy msgid "" "Similar to a match statement, the body of `select!` has a number of arms, " "each of the form `pattern = future => statement`. When a `future` is ready, " @@ -22412,33 +22416,35 @@ msgid "" "run with the resulting variables. The `statement` result becomes the result " "of the `select!` macro." msgstr "" -"Подібно до оператора збігу, тіло `select!` має кілька гілок, кожна з яких " -"має форму `pattern = future => statement`. Коли «майбутнє» готове, «заява» " -"виконується зі змінними в «шаблоні», пов’язаними з результатом «майбутнього»." +"Подібно до оператора порівняння, тіло `select!` має кілька гілок, кожен з " +"яких має вигляд `pattern = future => statement`. Коли `future` готовий, його " +"значення, що повертається, деструктурується за допомогою `pattern`. Потім " +"виконується `statement` з отриманими змінними. Результат `statement` стає " +"результатом макросу `select!`." #: src/async/control-flow/select.md msgid "\"Felix\"" -msgstr "" +msgstr "\"Фелікс\"" #: src/async/control-flow/select.md msgid "\"Failed to send cat.\"" -msgstr "" +msgstr "\"Не вдалося відправити кота.\"" #: src/async/control-flow/select.md msgid "\"Rex\"" -msgstr "" +msgstr "\"Рекс\"" #: src/async/control-flow/select.md msgid "\"Failed to send dog.\"" -msgstr "" +msgstr "\"Не вдалося відправити собаку.\"" #: src/async/control-flow/select.md msgid "\"Failed to receive winner\"" -msgstr "" +msgstr "\"Не вдалося отримати переможця\"" #: src/async/control-flow/select.md msgid "\"Winner is {winner:?}\"" -msgstr "" +msgstr "\"Переможцем стає {winner:?}\"" #: src/async/control-flow/select.md msgid "" @@ -22448,8 +22454,8 @@ msgid "" "that take 500ms." msgstr "" "У цьому прикладі ми маємо перегони між котом і собакою. " -"`first_animal_to_finish_race` слухає обидва канали та вибере той, який " -"прибуде першим. Оскільки собаці потрібно 50 мс, вона виграє кішку, якій " +"`first_animal_to_finish_race` слухає обидва канали та вибере того, який " +"прибуде першим. Оскільки собаці потрібно 50 мс, вона виграє у кота, якому " "потрібно 500 мс." #: src/async/control-flow/select.md @@ -22458,7 +22464,7 @@ msgid "" "to receive only one `send`." msgstr "" "У цьому прикладі ви можете використовувати канали `oneshot`, оскільки канали " -"мають отримувати лише одне `посилання`." +"мають отримувати лише один `send`." #: src/async/control-flow/select.md msgid "" @@ -22473,17 +22479,17 @@ msgid "" "Note that `select!` drops unmatched branches, which cancels their futures. " "It is easiest to use when every execution of `select!` creates new futures." msgstr "" -"Зауважте, що `select!` скидає невідповідні гілки, що скасовує їхні ф’ючерси. " -"Його найлегше використовувати, коли кожне виконання команди `select!` " -"створює нові ф’ючерси." +"Зауважте, що `select!` відкидає непорівнянні гілки, що скасовує їхні " +"ф’ючерси. Його найлегше використовувати, коли кожне виконання команди " +"`select!` створює нові ф’ючерси." #: src/async/control-flow/select.md msgid "" "An alternative is to pass `&mut future` instead of the future itself, but " "this can lead to issues, further discussed in the pinning slide." msgstr "" -"Альтернативою є передача `&mut future` замість самого майбутнього, але це " -"може призвести до проблем, які далі обговорюються на слайді закріплення." +"Альтернативою є передача `&mut future` замість самого ф’ючерса, але це може " +"призвести до проблем, які далі обговорюються на слайді про закріплення." #: src/async/pitfalls.md msgid "Pitfalls of async/await" @@ -22496,9 +22502,10 @@ msgid "" "with its share of pitfalls and footguns. We illustrate some of them in this " "chapter:" msgstr "" -"Async / await забезпечує зручну та ефективну абстракцію для паралельного " -"асинхронного програмування. Однак модель async/await у Rust також має певну " -"частку пасток і пістолетів. Ми проілюструємо деякі з них у цьому розділі:" +"Async / await забезпечує зручну та ефективну абстракцію для асинхронного " +"програмування з одночасним виконанням. Однак, модель async/await у Rust " +"також має свої підводні камені та пастки. Ми проілюструємо деякі з них у " +"цьому розділі:" #: src/async/pitfalls.md msgid "[Blocking the Executor](pitfalls/blocking-executor.md)" @@ -22510,7 +22517,7 @@ msgstr "[Pin](pitfalls/pin.md)" #: src/async/pitfalls.md msgid "[Async Traits](pitfalls/async-traits.md)" -msgstr "[Асинхронні особливості](pitfalls/async-traits.md)" +msgstr "[Асинхронні трейти](pitfalls/async-traits.md)" #: src/async/pitfalls.md msgid "[Cancellation](pitfalls/cancellation.md)" @@ -22528,24 +22535,26 @@ msgid "" "possible." msgstr "" "Більшість асинхронних середовищ виконання дозволяють лише одночасний запуск " -"завдань вводу/виводу. Це означає, що завдання, що блокують ЦП, блокуватимуть " -"виконавця та запобігатимуть виконанню інших завдань. Простим обхідним шляхом " -"є використання асинхронних еквівалентних методів, де це можливо." +"завдань вводу/виводу. Це означає, що завдання, що блокують процесор, " +"блокуватимуть виконавця та запобігатимуть виконанню інших завдань. Простим " +"обхідним шляхом є використання еквівалентних асинхронних методів, де це " +"можливо." #: src/async/pitfalls/blocking-executor.md msgid "\"future {id} slept for {duration_ms}ms, finished after {}ms\"" -msgstr "" +msgstr "\"ф'ючерс {id} спав протягом {duration_ms}ms, закінчив після {}ms\"" #: src/async/pitfalls/blocking-executor.md msgid "\"current_thread\"" -msgstr "" +msgstr "\"current_thread\"" #: src/async/pitfalls/blocking-executor.md msgid "" "Run the code and see that the sleeps happen consecutively rather than " "concurrently." msgstr "" -"Запустіть код і подивіться, що сни відбуваються послідовно, а не одночасно." +"Запустіть код і подивіться, що засинання відбуваються послідовно, а не " +"одночасно." #: src/async/pitfalls/blocking-executor.md msgid "" @@ -22554,13 +22563,14 @@ msgid "" "threaded flavor." msgstr "" "Варіант `\"current_thread\"` поміщає всі завдання в один потік. Це робить " -"ефект більш очевидним, але помилка все ще присутня в багатопоточному ароматі." +"ефект більш очевидним, але помилка все ще присутня в багатопоточному " +"варіанті." #: src/async/pitfalls/blocking-executor.md msgid "" "Switch the `std::thread::sleep` to `tokio::time::sleep` and await its result." msgstr "" -"Перемкніть `std::thread::sleep` на `tokio::time::sleep` і дочекайтеся " +"Переключіть `std::thread::sleep` на `tokio::time::sleep` і дочекайтеся " "результату." #: src/async/pitfalls/blocking-executor.md @@ -22569,7 +22579,7 @@ msgid "" "thread and transforms its handle into a future without blocking the executor." msgstr "" "Іншим виправленням було б `tokio::task::spawn_blocking`, який породжує " -"фактичний потік і перетворює його дескриптор у майбутнє, не блокуючи " +"фактичний потік і перетворює його дескриптор у ф'ючерс, не блокуючи " "виконавця." #: src/async/pitfalls/blocking-executor.md @@ -22581,7 +22591,7 @@ msgid "" "OS threads (e.g., CUDA). Prefer `tokio::task::spawn_blocking` in such " "situations." msgstr "" -"Ви не повинні думати про завдання як про потоки ОС. Вони не відображають 1 " +"Ви не повинні думати про завдання як про потоки ОС. Вони не відображаються 1 " "до 1, і більшість виконавців дозволять виконувати багато завдань в одному " "потоці ОС. Це особливо проблематично під час взаємодії з іншими бібліотеками " "через FFI, де ця бібліотека може залежати від локального сховища потоку або " @@ -22603,6 +22613,9 @@ msgid "" "type returned is the result of a compiler transformation which turns local " "variables into data stored inside the future." msgstr "" +"Асинхронні блоки та функції повертають типи, що реалізують трейт `Future`. " +"Тип, що повертається, є результатом трансформації компілятора, який " +"перетворює локальні змінні на дані, що зберігаються у ф'ючерсі." #: src/async/pitfalls/pin.md msgid "" @@ -22610,6 +22623,9 @@ msgid "" "of that, the future should never be moved to a different memory location, as " "it would invalidate those pointers." msgstr "" +"Деякі з цих змінних можуть містити вказівники на інші локальні змінні. Через " +"це ф'ючерс ніколи не слід переміщувати в іншу комірку пам'яті, оскільки це " +"зробить ці вказівники недійсними." #: src/async/pitfalls/pin.md msgid "" @@ -22618,44 +22634,52 @@ msgid "" "operations that would move the instance it points to into a different memory " "location." msgstr "" +"Щоб запобігти переміщенню ф'ючерсного типу у пам'яті, його можна опитувати " +"лише через закріплений вказівник. Закріплення - це обгортка навколо " +"посилання, яка забороняє всі операції, що можуть перемістити екземпляр, на " +"який воно вказує, в іншу ділянку пам'яті." #: src/async/pitfalls/pin.md msgid "" "// A work item. In this case, just sleep for the given time and respond\n" "// with a message on the `respond_on` channel.\n" msgstr "" +"// Робочий елемент. У цьому випадку просто заснути на заданий час і\n" +"// відповісти повідомленням на каналі `respond_on`.\n" #: src/async/pitfalls/pin.md msgid "// A worker which listens for work on a queue and performs it.\n" -msgstr "" +msgstr "// Робочий, який чекає на роботу у черзі та виконує її.\n" #: src/async/pitfalls/pin.md msgid "// Pretend to work.\n" -msgstr "" +msgstr "// Вдається, що працює.\n" #: src/async/pitfalls/pin.md msgid "\"failed to send response\"" -msgstr "" +msgstr "\"не вдалося надіслати відповідь\"" #: src/async/pitfalls/pin.md msgid "// TODO: report number of iterations every 100ms\n" -msgstr "" +msgstr "// TODO: виводити кількість ітерацій кожні 100 мс\n" #: src/async/pitfalls/pin.md msgid "// A requester which requests work and waits for it to complete.\n" msgstr "" +"// Запитувач, який надсилає запит на виконання роботи і чекає на її " +"завершення.\n" #: src/async/pitfalls/pin.md msgid "\"failed to send on work queue\"" -msgstr "" +msgstr "\"не вдалося відправити в робочу чергу\"" #: src/async/pitfalls/pin.md msgid "\"failed waiting for response\"" -msgstr "" +msgstr "\"не вдалося дочекатися відповіді\"" #: src/async/pitfalls/pin.md msgid "\"work result for iteration {i}: {resp}\"" -msgstr "" +msgstr "\"результат роботи для ітерації {i}: {resp}\"" #: src/async/pitfalls/pin.md msgid "" @@ -22677,13 +22701,14 @@ msgid "" "the `select!`. This will never execute. Why?" msgstr "" "Наївно додайте `_ = sleep(Duration::from_millis(100)) => { println!(..) }` " -"до `select!`. Це ніколи не буде виконано. чому" +"до `select!`. Це ніколи не буде виконано. Чому?" #: src/async/pitfalls/pin.md msgid "" "Instead, add a `timeout_fut` containing that future outside of the `loop`:" msgstr "" -"Замість цього додайте `timeout_fut`, що містить це майбутнє за межами `loop`:" +"Замість цього додайте `timeout_fut`, що містить цей ф'юсчерс за межами " +"`loop`:" #: src/async/pitfalls/pin.md msgid "" @@ -22691,7 +22716,7 @@ msgid "" "`timeout_fut` in the `select!` to work around the move, then using `Box::" "pin`:" msgstr "" -"Це все ще не працює. Дотримуйтеся помилок компілятора, додавши `&mut` до " +"Це все ще не працює. Слідкуйте за помилками компілятора, додавши `&mut` до " "`timeout_fut` у `select!`, щоб обійти переміщення, а потім використовуючи " "`Box::pin`:" @@ -22702,8 +22727,8 @@ msgid "" "`timeout_fut` every time it expires." msgstr "" "Це компілюється, але після закінчення часу очікування на кожній ітерації " -"відображається `Poll::Ready` (у цьому допоможе об’єднане майбутнє). Оновіть, " -"щоб скидати `timeout_fut` кожного разу, коли він закінчується." +"відображається `Poll::Ready` (злитий ф'ючерс міг би допомогти в цьому). " +"Оновіть, щоб скидати `timeout_fut` кожного разу, коли він спливає." #: src/async/pitfalls/pin.md msgid "" @@ -22711,10 +22736,9 @@ msgid "" "stabilized, with older code often using `tokio::pin!`) is also an option, " "but that is difficult to use for a future that is reassigned." msgstr "" -"Коробка виділяється на купу. У деяких випадках `std::pin::pin!` (лише " -"нещодавно стабілізований, у старому коді часто використовується `tokio::pin!" -"`) також є варіантом, але це важко використовувати для майбутнього, яке буде " -"перепризначено." +"Box виділяє у купі. У деяких випадках, `std::pin::pin!` (лише нещодавно " +"стабілізовано, у старому коді часто використовується `tokio::pin!`) також є " +"варіантом, але його важко використовувати для фьючерсів, які перепризначено." #: src/async/pitfalls/pin.md msgid "" @@ -22722,7 +22746,7 @@ msgid "" "will send to a `oneshot` channel every 100ms." msgstr "" "Інша альтернатива — взагалі не використовувати `pin`, а створювати інше " -"завдання, яке надсилатиметься на канал `oneshot` кожні 100 мс." +"завдання, яке буде надсилати на канал `oneshot` кожні 100 мс." #: src/async/pitfalls/pin.md msgid "" @@ -22732,6 +22756,11 @@ msgid "" "code transformation for async blocks and functions is not verified by the " "borrow checker." msgstr "" +"Дані, які містять вказівники на себе, називаються самопосилальними. " +"Зазвичай, перевірка запозичень у Rust запобігає переміщенню самопосилань, " +"оскільки посилання не можуть пережити дані, на які вони вказують. Однак, " +"перетворення коду для асинхронних блоків і функцій не перевіряється " +"перевіркою запозичень." #: src/async/pitfalls/pin.md msgid "" @@ -22739,6 +22768,9 @@ msgid "" "place using a pinned pointer. However, it can still be moved through an " "unpinned pointer." msgstr "" +"`Pin` - це обгортка навколо вказівника. Об'єкт не можна перемістити з його " +"місця за допомогою закріпленого вказівника. Однак, його можна переміщати за " +"допомогою незакріпленого вказівника." #: src/async/pitfalls/pin.md msgid "" @@ -22746,6 +22778,9 @@ msgid "" "`&mut Self` to refer to the instance. That's why it can only be called on a " "pinned pointer." msgstr "" +"Метод `poll` трейту `Future` використовує `Pin<&mut Self>` замість `&mut " +"Self` для посилання на екземпляр. Тому його можна викликати лише на " +"закріпленому покажчику." #: src/async/pitfalls/async-traits.md msgid "" @@ -22754,26 +22789,26 @@ msgid "" "term.](https://blog.rust-lang.org/inside-rust/2022/11/17/async-fn-in-trait-" "nightly.html))" msgstr "" -"Асинхронні методи в ознаках ще не підтримуються в стабільному каналі " -"([Експериментальна функція існує в nightly і має бути стабілізована в " -"середньому.](https://blog.rust-lang.org/inside-rust/2022/11) /17/async-fn-in-" -"trait-nightly.html))" +"Асинхронні методи в трейтах ще не підтримуються в стабільному каналі " +"([Експериментальна можливість існує в nightly і має бути стабілізована в " +"середньостроковій перспективі.](https://blog.rust-lang.org/inside-" +"rust/2022/11)/17/async-fn-in-trait-nightly.html))" #: src/async/pitfalls/async-traits.md msgid "" "The crate [async_trait](https://docs.rs/async-trait/latest/async_trait/) " "provides a workaround through a macro:" msgstr "" -"Ящик [async_trait](https://docs.rs/async-trait/latest/async_trait/) надає " +"Крейт [async_trait](https://docs.rs/async-trait/latest/async_trait/) надає " "обхідний шлях за допомогою макросу:" #: src/async/pitfalls/async-traits.md msgid "\"running all sleepers..\"" -msgstr "" +msgstr "\"запуск всіх сплячих..\"" #: src/async/pitfalls/async-traits.md msgid "\"slept for {}ms\"" -msgstr "" +msgstr "\"проспав {}мс\"" #: src/async/pitfalls/async-traits.md msgid "" @@ -22781,7 +22816,7 @@ msgid "" "achieve this. This heap allocation has performance overhead." msgstr "" "`async_trait` простий у використанні, але зауважте, що для цього він " -"використовує розподіл пам’яті. Цей розподіл купи має накладні витрати на " +"використовує виділення в купі. Цей розподіл купи має накладні витрати на " "продуктивність." #: src/async/pitfalls/async-traits.md @@ -22792,7 +22827,7 @@ msgid "" "blog/2019/10/26/async-fn-in-traits-are-hard/) if you are interested in " "digging deeper." msgstr "" -"Проблеми з мовною підтримкою для `async trait` глибокі Rust і, мабуть, не " +"Проблеми з мовною підтримкою для `async trait` глибокі в Rust і, мабуть, не " "варті детального опису. Ніко Мацакіс добре пояснив їх у [цій публікації]" "(https://smallcultfollowing.com/babysteps/blog/2019/10/26/async-fn-in-traits-" "are-hard/), якщо вам цікаво копати глибше." @@ -22812,24 +22847,23 @@ msgid "" "ensure the system works correctly even when futures are cancelled. For " "example, it shouldn't deadlock or lose data." msgstr "" -"Відмова від майбутнього означає, що його більше ніколи не можна буде " -"опитувати. Це називається _скасуванням_ і може статися в будь-який момент " -"очікування. Потрібно бути обережним, щоб переконатися, що система працює " -"належним чином, навіть якщо ф’ючерси скасовано. Наприклад, він не повинен " -"блокуватися або втрачати дані." +"Видалення ф'ючерсу означає, що він більше ніколи не може бути опитаний. Це " +"називається _скасуванням_, і воно може відбутися в будь-який `await` момент. " +"Потрібно бути обережним, щоб система працювала правильно, навіть якщо " +"ф'ючерс скасовано. Наприклад, вона не повинна зайти в глухий кут або " +"втратити дані." #: src/async/pitfalls/cancellation.md -#, fuzzy msgid "\"not UTF-8\"" -msgstr "UTF-8" +msgstr "\"не UTF-8\"" #: src/async/pitfalls/cancellation.md msgid "\"hi\\nthere\\n\"" -msgstr "" +msgstr "\"всім\\привіт\\n\"" #: src/async/pitfalls/cancellation.md msgid "\"tick!\"" -msgstr "" +msgstr "\"тік!\"" #: src/async/pitfalls/cancellation.md msgid "" @@ -22837,7 +22871,8 @@ msgid "" "documentation and consider what state your `async fn` holds." msgstr "" "Компілятор не допомагає з безпекою скасування. Вам потрібно прочитати " -"документацію API та розглянути, який стан має ваш `async fn`." +"документацію до API і звернути увагу на те, який стан містить ваша `async " +"fn`." #: src/async/pitfalls/cancellation.md msgid "" @@ -22869,7 +22904,7 @@ msgstr "" #: src/async/pitfalls/cancellation.md msgid "// prefix buf and bytes with self.\n" -msgstr "" +msgstr "// префікс buf та байти з self.\n" #: src/async/pitfalls/cancellation.md msgid "" @@ -22878,8 +22913,8 @@ msgid "" "tick has been 'delivered'." msgstr "" "[`Interval::tick`](https://docs.rs/tokio/latest/tokio/time/struct.Interval." -"html#method.tick) є безпечним для скасування, оскільки він відстежує, чи " -"була позначка ' доставлено'." +"html#method.tick) є безпечним для скасування, оскільки він відстежує, чи був " +"тік 'доставлений'." #: src/async/pitfalls/cancellation.md msgid "" @@ -22898,8 +22933,8 @@ msgid "" "cancellation-safe. See its documentation for details and alternatives." msgstr "" "[`AsyncBufReadExt::read_line`](https://docs.rs/tokio/latest/tokio/io/trait." -"AsyncBufReadExt.html#method.read_line) схожий на приклад і _не_ безпечний " -"для скасування. Подробиці та альтернативи див. у його документації." +"AsyncBufReadExt.html#method.read_line) схожий на приклад і _не є_ безпечним " +"для скасування. Подробиці та альтернативи дивится у його документації." #: src/exercises/concurrency/afternoon.md msgid "" @@ -22912,7 +22947,7 @@ msgid "" "Dining philosophers: we already saw this problem in the morning. This time " "you are going to implement it with Async Rust." msgstr "" -"Обідні філософи: ми вже бачили цю проблему вранці. Цього разу ви збираєтеся " +"Вечеря філософів: ми вже бачили цю проблему вранці. Цього разу ви збираєтеся " "реалізувати це за допомогою Async Rust." #: src/exercises/concurrency/afternoon.md @@ -22925,16 +22960,15 @@ msgstr "" #: src/exercises/concurrency/dining-philosophers-async.md #: src/exercises/concurrency/solutions-afternoon.md -#, fuzzy msgid "Dining Philosophers --- Async" -msgstr "Dining Philosophers - Async" +msgstr "Вечеря філософів --- Async" #: src/exercises/concurrency/dining-philosophers-async.md msgid "" "See [dining philosophers](dining-philosophers.md) for a description of the " "problem." msgstr "" -"Перегляньте [dining philosophers](dining-philosophers.md) для опису проблеми." +"Перегляньте [вечерю філософів](dining-philosophers.md) для опису проблеми." #: src/exercises/concurrency/dining-philosophers-async.md msgid "" @@ -22942,15 +22976,15 @@ msgid "" "locally.md) for this exercise. Copy the code below to a file called `src/" "main.rs`, fill out the blanks, and test that `cargo run` does not deadlock:" msgstr "" -"Як і раніше, для виконання цієї вправи вам знадобиться локальна " -"[встановлення Cargo](../../cargo/running-locally.md). Скопіюйте наведений " +"Як і раніше, для виконання цієї вправи вам знадобиться локальний " +"[встановленний Cargo](../../cargo/running-locally.md). Скопіюйте наведений " "нижче код у файл під назвою `src/main.rs`, заповніть порожні поля та " "перевірте, чи `cargo run` не блокує:" #: src/exercises/concurrency/dining-philosophers-async.md #: src/exercises/concurrency/solutions-afternoon.md msgid "// Make them think and eat\n" -msgstr "" +msgstr "// Змусимо їх думати і їсти\n" #: src/exercises/concurrency/dining-philosophers-async.md msgid "" @@ -22980,12 +23014,11 @@ msgid "" "from the `tokio` crate." msgstr "" "Також зауважте, що цього разу вам доведеться використовувати `Mutex` і " -"модуль `mpsc` з ящика `tokio`." +"модуль `mpsc` з крейту `tokio`." #: src/exercises/concurrency/dining-philosophers-async.md -#, fuzzy msgid "Can you make your implementation single-threaded?" -msgstr "Чи можете ви зробити свою реалізацію однопоточною?" +msgstr "Чи можете ви зробити вашу реалізацію однопотоковою?" #: src/exercises/concurrency/chat-app.md msgid "" @@ -22995,14 +23028,13 @@ msgid "" "input, and sends them to the server. The chat server broadcasts each message " "that it receives to all the clients." msgstr "" -"У цій вправі ми хочемо використати наші нові знання для впровадження " -"програми широкомовного чату. У нас є чат-сервер, до якого підключаються " -"клієнти та публікують свої повідомлення. Клієнт читає повідомлення " -"користувача зі стандартного вводу і відправляє їх на сервер. Сервер чату " -"транслює кожне отримане повідомлення всім клієнтам." +"У цій вправі ми хочемо використати наші нові знання для реалізації програми " +"чату. У нас є чат-сервер, до якого підключаються клієнти і публікують свої " +"повідомлення. Клієнт читає повідомлення користувача зі стандартного вводу і " +"надсилає їх на сервер. Сервер чату транслює кожне повідомлення, яке він " +"отримує, усім клієнтам." #: src/exercises/concurrency/chat-app.md -#, fuzzy msgid "" "For this, we use [a broadcast channel](https://docs.rs/tokio/latest/tokio/" "sync/broadcast/fn.channel.html) on the server, and [`tokio_websockets`]" @@ -23011,17 +23043,16 @@ msgid "" msgstr "" "Для цього ми використовуємо [трансляційний канал](https://docs.rs/tokio/" "latest/tokio/sync/broadcast/fn.channel.html) на сервері та " -"[`tokio_websockets`](https:// docs.rs/tokio-websockets/0.4.0/" -"tokio_websockets/) для зв’язку між клієнтом і сервером." +"[`tokio_websockets`](https://docs.rs/tokio_websockets/) для зв’язку між " +"клієнтом і сервером." #: src/exercises/concurrency/chat-app.md msgid "Create a new Cargo project and add the following dependencies:" msgstr "Створіть новий проект Cargo та додайте такі залежності:" #: src/exercises/concurrency/chat-app.md -#, fuzzy msgid "_Cargo.toml_:" -msgstr "`Cargo.toml`:" +msgstr "_Cargo.toml_:" #: src/exercises/concurrency/chat-app.md msgid "" @@ -23045,18 +23076,16 @@ msgid "The required APIs" msgstr "Необхідні API" #: src/exercises/concurrency/chat-app.md -#, fuzzy msgid "" "You are going to need the following functions from `tokio` and " "[`tokio_websockets`](https://docs.rs/tokio-websockets/). Spend a few minutes " "to familiarize yourself with the API." msgstr "" "Вам знадобляться такі функції з `tokio` і [`tokio_websockets`](https://docs." -"rs/tokio-websockets/0.4.0/tokio_websockets/). Витратьте кілька хвилин на " +"rs/tokio-websockets/tokio-websockets/). Витратьте кілька хвилин на " "ознайомлення з API." #: src/exercises/concurrency/chat-app.md -#, fuzzy msgid "" "[StreamExt::next()](https://docs.rs/futures-util/0.3.28/futures_util/stream/" "trait.StreamExt.html#method.next) implemented by `WebSocketStream`: for " @@ -23064,10 +23093,9 @@ msgid "" msgstr "" "[StreamExt::next()](https://docs.rs/futures-util/0.3.28/futures_util/stream/" "trait.StreamExt.html#method.next), реалізований `WebsocketStream`: для " -"асинхронного читання повідомлень із потік Websocket." +"асинхронного читання повідомлень з потоку Websocket." #: src/exercises/concurrency/chat-app.md -#, fuzzy msgid "" "[SinkExt::send()](https://docs.rs/futures-util/0.3.28/futures_util/sink/" "trait.SinkExt.html#method.send) implemented by `WebSocketStream`: for " @@ -23075,7 +23103,7 @@ msgid "" msgstr "" "[SinkExt::send()](https://docs.rs/futures-util/0.3.28/futures_util/sink/" "trait.SinkExt.html#method.send), реалізований `WebsocketStream`: для " -"асинхронного надсилання повідомлень на потік Websocket." +"асинхронного надсилання повідомлень у потоці Websocket." #: src/exercises/concurrency/chat-app.md msgid "" @@ -23085,7 +23113,7 @@ msgid "" msgstr "" "[Lines::next_line()](https://docs.rs/tokio/latest/tokio/io/struct.Lines." "html#method.next_line): для асинхронного читання повідомлень користувача зі " -"стандартного введення." +"стандартного вводу." #: src/exercises/concurrency/chat-app.md msgid "" @@ -23100,7 +23128,6 @@ msgid "Two binaries" msgstr "Два бінарні файли" #: src/exercises/concurrency/chat-app.md -#, fuzzy msgid "" "Normally in a Cargo project, you can have only one binary, and one `src/main." "rs` file. In this project, we need two binaries. One for the client, and one " @@ -23110,64 +23137,62 @@ msgid "" "(see the [documentation](https://doc.rust-lang.org/cargo/reference/cargo-" "targets.html#binaries))." msgstr "" -"Зазвичай у проекті Cargo ви можете мати лише один бінарний файл і один файл " -"`src/main.rs`. У цьому проекті нам потрібні два бінарні файли. Один для " -"клієнта, а інший для сервера. Ви потенційно можете зробити їх двома окремими " +"Зазвичай у проекті Cargo можна мати лише один бінарний файл і один файл `rc/" +"main.rs`. У цьому проекті нам потрібні два бінарних файли. Один для клієнта " +"і один для сервера. Потенційно ви могли б зробити їх двома окремими " "проектами Cargo, але ми збираємося помістити їх в один проект Cargo з двома " -"бінарними файлами. Щоб це працювало, код клієнта та сервера має бути " -"розміщено в `src/bin` (див. [документацію](https://doc.rust-lang.org/cargo/" -"reference/cargo-targets.html#binaries) )." +"бінарними файлами. Для того, щоб це працювало, клієнтський і серверний код " +"має знаходитися у каталозі `src/bin` (дивиться [документацію](https://doc." +"rust-lang.org/cargo/reference/cargo-targets.html#binaries))." #: src/exercises/concurrency/chat-app.md -#, fuzzy msgid "" "Copy the following server and client code into `src/bin/server.rs` and `src/" "bin/client.rs`, respectively. Your task is to complete these files as " "described below." msgstr "" -"Скопіюйте наступний код сервера та клієнта в `src/bin/server.rs` та `src/bin/" -"client.rs` відповідно. Ваше завдання — заповнити ці файли, як описано нижче." +"Скопіюйте наступний серверний та клієнтський код у файли `src/bin/server.rs` " +"та `src/bin/client.rs` відповідно. Ваше завдання - доповнити ці файли, як " +"описано нижче." #: src/exercises/concurrency/chat-app.md #: src/exercises/concurrency/solutions-afternoon.md -#, fuzzy msgid "_src/bin/server.rs_:" -msgstr "`src/bin/server.rs`:" +msgstr "_src/bin/server.rs_:" #: src/exercises/concurrency/chat-app.md msgid "// TODO: For a hint, see the description of the task below.\n" -msgstr "" +msgstr "// TODO: Підказку дивіться в описі завдання нижче.\n" #: src/exercises/concurrency/chat-app.md #: src/exercises/concurrency/solutions-afternoon.md msgid "\"127.0.0.1:2000\"" -msgstr "" +msgstr "\"127.0.0.1:2000\"" #: src/exercises/concurrency/chat-app.md #: src/exercises/concurrency/solutions-afternoon.md msgid "\"listening on port 2000\"" -msgstr "" +msgstr "\"слухаємо на порту 2000\"" #: src/exercises/concurrency/chat-app.md #: src/exercises/concurrency/solutions-afternoon.md msgid "\"New connection from {addr:?}\"" -msgstr "" +msgstr "\"Нове з'єднання з {addr:?}\"" #: src/exercises/concurrency/chat-app.md #: src/exercises/concurrency/solutions-afternoon.md msgid "// Wrap the raw TCP stream into a websocket.\n" -msgstr "" +msgstr "// Обернути необроблений TCP потік у веб-сокет.\n" #: src/exercises/concurrency/chat-app.md #: src/exercises/concurrency/solutions-afternoon.md -#, fuzzy msgid "_src/bin/client.rs_:" -msgstr "`src/bin/client.rs`:" +msgstr "_src/bin/client.rs_:" #: src/exercises/concurrency/chat-app.md #: src/exercises/concurrency/solutions-afternoon.md msgid "\"ws://127.0.0.1:2000\"" -msgstr "" +msgstr "\"ws://127.0.0.1:2000\"" #: src/exercises/concurrency/chat-app.md msgid "Running the binaries" @@ -23179,7 +23204,7 @@ msgstr "Запустіть сервер за допомогою:" #: src/exercises/concurrency/chat-app.md msgid "and the client with:" -msgstr "і клієнт з:" +msgstr "і клієнт за допомогою:" #: src/exercises/concurrency/chat-app.md msgid "Implement the `handle_connection` function in `src/bin/server.rs`." @@ -23193,12 +23218,12 @@ msgid "" msgstr "" "Підказка: використовуйте `tokio::select!` для одночасного виконання двох " "завдань у безперервному циклі. Одне завдання отримує повідомлення від " -"клієнта і транслює їх. Інший надсилає повідомлення, отримані сервером, " +"клієнта і транслює їх. Інше надсилає повідомлення, отримані сервером, " "клієнту." #: src/exercises/concurrency/chat-app.md msgid "Complete the main function in `src/bin/client.rs`." -msgstr "Виконайте основну функцію в `src/bin/client.rs`." +msgstr "Завершіть основну функцію в `src/bin/client.rs`." #: src/exercises/concurrency/chat-app.md msgid "" @@ -23209,7 +23234,7 @@ msgid "" msgstr "" "Підказка: як і раніше, використовуйте `tokio::select!` у безперервному циклі " "для одночасного виконання двох завдань: (1) читання повідомлень користувача " -"зі стандартного введення та надсилання їх на сервер, і (2) отримання " +"зі стандартного вводу та надсилання їх на сервер, і (2) отримання " "повідомлень від сервера, і відображення їх для користувача." #: src/exercises/concurrency/chat-app.md @@ -23222,7 +23247,7 @@ msgstr "" #: src/exercises/concurrency/solutions-afternoon.md msgid "Concurrency Afternoon Exercise" -msgstr "Одночасна післяобідня вправа" +msgstr "Вправа з одночасного виконання: Полудень" #: src/exercises/concurrency/solutions-afternoon.md msgid "([back to exercise](dining-philosophers-async.md))" @@ -23233,10 +23258,12 @@ msgid "" "// Add a delay before picking the second fork to allow the execution\n" " // to transfer to another task\n" msgstr "" +"// Додати затримку перед вибором другої розвилки, щоб дати можливість\n" +" // перевести виконання на інше завдання\n" #: src/exercises/concurrency/solutions-afternoon.md msgid "// The locks are dropped here\n" -msgstr "" +msgstr "// Тут скидаються блокування\n" #: src/exercises/concurrency/solutions-afternoon.md msgid "" @@ -23244,14 +23271,18 @@ msgid "" " // somewhere. This will swap the forks without deinitializing\n" " // either of them.\n" msgstr "" +"// Щоб уникнути глухого кута, ми повинні порушити симетрію\n" +" // десь. Це дозволить поміняти місцями виделки без\n" +" // деініціалізації жодної з них.\n" #: src/exercises/concurrency/solutions-afternoon.md msgid "// tx is dropped here, so we don't need to explicitly drop it later\n" msgstr "" +"// tx відкидається тут, тому нам не потрібно явно відкидати його пізніше\n" #: src/exercises/concurrency/solutions-afternoon.md msgid "\"Here is a thought: {thought}\"" -msgstr "" +msgstr "\"Є така думка: {thought}\"" #: src/exercises/concurrency/solutions-afternoon.md msgid "([back to exercise](chat-app.md))" @@ -23259,39 +23290,38 @@ msgstr "([назад до вправи](chat-app.md))" #: src/exercises/concurrency/solutions-afternoon.md msgid "\"Welcome to chat! Type a message\"" -msgstr "" +msgstr "\"Ласкаво просимо до чату! Введіть повідомлення\"" #: src/exercises/concurrency/solutions-afternoon.md -#, fuzzy msgid "" "// A continuous loop for concurrently performing two tasks: (1) receiving\n" " // messages from `ws_stream` and broadcasting them, and (2) receiving\n" " // messages on `bcast_rx` and sending them to the client.\n" msgstr "" -"Підказка: як і раніше, використовуйте `tokio::select!` у безперервному циклі " -"для одночасного виконання двох завдань: (1) читання повідомлень користувача " -"зі стандартного введення та надсилання їх на сервер, і (2) отримання " -"повідомлень від сервера, і відображення їх для користувача." +"// Безперервний цикл для одночасного виконання двох задач: (1) отримання\n" +" // повідомлень з `ws_stream` та їх трансляції, та (2) отримання\n" +" // повідомлень на `bcast_rx` і відправлення їх клієнту.\n" #: src/exercises/concurrency/solutions-afternoon.md msgid "\"From client {addr:?} {text:?}\"" -msgstr "" +msgstr "\"Від клієнта {addr:?} {text:?}\"" #: src/exercises/concurrency/solutions-afternoon.md msgid "// Continuous loop for concurrently sending and receiving messages.\n" msgstr "" +"// Безперервний цикл для одночасної відправки та отримання повідомлень.\n" #: src/exercises/concurrency/solutions-afternoon.md msgid "\"From server: {}\"" -msgstr "" +msgstr "\"З сервера: {}\"" #: src/thanks.md msgid "" "_Thank you for taking Comprehensive Rust 🦀!_ We hope you enjoyed it and " "that it was useful." msgstr "" -"_Дякуємо, що взяли Comprehensive Rust 🦀!_ Сподіваємося, вам сподобалось і " -"було корисно." +"_Дякуємо, що прослухали курс Comprehensive Rust 🦀!_ Сподіваємося, вам " +"сподобалось і було корисно." #: src/thanks.md msgid ""