From dcacf567539325d121064b79c3d9af690ad040ab Mon Sep 17 00:00:00 2001
From: Ewoud Kohl van Wijngaarden
Date: Thu, 8 Sep 2022 14:04:39 +0200
Subject: [PATCH 1/4] Add a job to automatically update translations
---
.github/list_languages | 20 ++++++++++++
.github/workflows/translations.yml | 50 ++++++++++++++++++++++++++++++
2 files changed, 70 insertions(+)
create mode 100755 .github/list_languages
create mode 100644 .github/workflows/translations.yml
diff --git a/.github/list_languages b/.github/list_languages
new file mode 100755
index 00000000000..d319c0d4083
--- /dev/null
+++ b/.github/list_languages
@@ -0,0 +1,20 @@
+#!/usr/bin/env python3
+
+import json
+import os
+from pathlib import Path
+
+
+def main():
+ directory = Path(__file__).absolute().parent.parent
+ languages = sorted(x.name for x in directory.iterdir()
+ if x.is_dir() and len(x.name) == 2 and x.name != 'en')
+
+ if 'GITHUB_ACTION' in os.environ:
+ print(f'::set-output name=languages::{json.dumps(languages)}')
+ for language in languages:
+ print(language)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml
new file mode 100644
index 00000000000..239dbbcac31
--- /dev/null
+++ b/.github/workflows/translations.yml
@@ -0,0 +1,50 @@
+name: Update translations
+
+on:
+ workflow_dispatch:
+
+env:
+ GIT_AUTHOR_NAME: Django Girls Automation
+ GIT_AUTHOR_EMAIL: automation@djangogirls.org
+
+jobs:
+ list_languages:
+ name: List languages
+ runs-on: ubuntu-latest
+ if: github.repository_owner == 'djangogirls'
+ outputs:
+ languages: ${{ steps.set_list.outputs.languages }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set the language list
+ id: set_list
+ run: ./.github/list_languages
+
+ update_language:
+ name: 'Update ${{ matrix.language }} translations from Crowdin'
+ needs: list_languages
+ if: ${{ needs.list_languages.outputs.languages != '[]' }}
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ language: ${{ fromJson(needs.list_languages.outputs.languages) }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Update language
+ run: |
+ wget https://crowdin.com/backend/download/project/django-girls-tutorial/${{ matrix.language }}.zip
+ unzip ${{ matrix.language }}.zip
+ find ${{ matrix.language }} -name '*.md' -delete
+ rsync -av master/${{ matrix.language }}*/* ${{ matrix.language }}/
+ rm -rf ${{ matrix.language }}.zip master
+ - name: Open a PR
+ uses: peter-evans/create-pull-request@v3
+ with:
+ commit-message: "Update ${{ matrix.language }} translations from Crowdin"
+ branch: "update_translations/${{ matrix.language }}"
+ title: "Update ${{ matrix.language }} translations from Crowdin"
+ body: ''
+ delete-branch: true
From ecd3cec4abebfde3e5c5ea3e343e1feb579e2ddc Mon Sep 17 00:00:00 2001
From: Ewoud Kohl van Wijngaarden
Date: Thu, 8 Sep 2022 16:10:06 +0200
Subject: [PATCH 2/4] Ignore beta languages by default
---
.github/list_languages | 27 +++++++++++++++++++++------
.github/workflows/translations.yml | 7 ++++++-
2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/.github/list_languages b/.github/list_languages
index d319c0d4083..27ee2e7999e 100755
--- a/.github/list_languages
+++ b/.github/list_languages
@@ -1,19 +1,34 @@
#!/usr/bin/env python3
+import argparse
import json
import os
from pathlib import Path
+def parse_langs(langs, include_beta):
+ for line in langs.readlines():
+ description = line[3:-7]
+ code = line[-5:-3]
+
+ if include_beta or 'beta' not in description:
+ yield code, description
+
def main():
- directory = Path(__file__).absolute().parent.parent
- languages = sorted(x.name for x in directory.iterdir()
- if x.is_dir() and len(x.name) == 2 and x.name != 'en')
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--include-beta', help='Include beta languages', default='false',
+ choices=('true', 'false'))
+ parser.add_argument('--langs-file', help='LANGS.md to use',
+ type=argparse.FileType('r', encoding='UTF-8'),
+ default=(Path(__file__).absolute().parent.parent / 'LANGS.md').as_posix())
+ args = parser.parse_args()
+
+ languages = dict(parse_langs(args.langs_file, args.include_beta == 'true'))
if 'GITHUB_ACTION' in os.environ:
- print(f'::set-output name=languages::{json.dumps(languages)}')
- for language in languages:
- print(language)
+ print(f'::set-output name=languages::{json.dumps(list(languages.keys()))}')
+ for code, language in languages.items():
+ print(f'{language} ({code})')
if __name__ == '__main__':
diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml
index 239dbbcac31..7bd0fa417e0 100644
--- a/.github/workflows/translations.yml
+++ b/.github/workflows/translations.yml
@@ -2,6 +2,11 @@ name: Update translations
on:
workflow_dispatch:
+ inputs:
+ include_beta:
+ type: boolean
+ default: false
+ description: Include beta languages
env:
GIT_AUTHOR_NAME: Django Girls Automation
@@ -19,7 +24,7 @@ jobs:
uses: actions/checkout@v2
- name: Set the language list
id: set_list
- run: ./.github/list_languages
+ run: ./.github/list_languages --include-beta ${{ inputs.include_beta }}
update_language:
name: 'Update ${{ matrix.language }} translations from Crowdin'
From 065b877ab44bb371dcfa2f1a9b118226b4ff8da6 Mon Sep 17 00:00:00 2001
From: Ewoud Kohl van Wijngaarden
Date: Thu, 8 Sep 2022 16:14:31 +0200
Subject: [PATCH 3/4] fixup! Add a job to automatically update translations
---
.github/workflows/translations.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml
index 7bd0fa417e0..434e1f1aa4e 100644
--- a/.github/workflows/translations.yml
+++ b/.github/workflows/translations.yml
@@ -16,7 +16,6 @@ jobs:
list_languages:
name: List languages
runs-on: ubuntu-latest
- if: github.repository_owner == 'djangogirls'
outputs:
languages: ${{ steps.set_list.outputs.languages }}
steps:
From 45078fe813d8a546afb132d14c3d91f221118493 Mon Sep 17 00:00:00 2001
From: Django Girls Automation
Date: Thu, 8 Sep 2022 14:15:24 +0000
Subject: [PATCH 4/4] Update uk translations from Crowdin
---
uk/GLOSSARY.md | 3 +-
uk/README.md | 44 +-
uk/SUMMARY.md | 17 +-
uk/chromebook_setup/README.md | 5 +
uk/chromebook_setup/instructions.md | 158 +++
uk/code_editor/README.md | 10 +-
uk/code_editor/instructions.md | 35 +-
uk/css/README.md | 230 +++--
uk/deploy/README.md | 349 ++-----
uk/deploy/install_git.md | 79 +-
uk/deploy/pythonanywhere.md | 88 ++
uk/deploy/signup_pythonanywhere.md | 17 +-
uk/django/README.md | 24 +-
uk/django_admin/README.md | 42 +-
uk/django_forms/README.md | 328 +++---
uk/django_installation/README.md | 7 +-
uk/django_installation/instructions.md | 231 ++++-
uk/django_models/README.md | 142 ++-
uk/django_orm/README.md | 198 ++--
uk/django_start_project/README.md | 226 +++-
uk/django_templates/README.md | 100 +-
uk/django_urls/README.md | 123 ++-
uk/django_views/README.md | 27 +-
uk/dynamic_data_in_templates/README.md | 45 +-
uk/extend_your_application/README.md | 219 ++--
uk/how_the_internet_works/README.md | 47 +-
uk/html/README.md | 166 +--
uk/installation/README.md | 66 +-
uk/intro_to_command_line/README.md | 343 +++++--
uk/intro_to_command_line/open_instructions.md | 28 +
uk/python_installation/README.md | 11 +-
uk/python_installation/instructions.md | 105 +-
uk/python_introduction/README.md | 967 ++++++++++++------
uk/python_introduction/prompt.md | 17 +
uk/template_extending/README.md | 117 ++-
uk/whats_next/README.md | 49 +-
36 files changed, 3076 insertions(+), 1587 deletions(-)
create mode 100644 uk/chromebook_setup/README.md
create mode 100644 uk/chromebook_setup/instructions.md
mode change 100755 => 100644 uk/css/README.md
mode change 100755 => 100644 uk/deploy/README.md
create mode 100644 uk/deploy/pythonanywhere.md
mode change 100755 => 100644 uk/django/README.md
mode change 100755 => 100644 uk/django_admin/README.md
mode change 100755 => 100644 uk/django_forms/README.md
mode change 100755 => 100644 uk/django_models/README.md
mode change 100755 => 100644 uk/django_orm/README.md
mode change 100755 => 100644 uk/django_start_project/README.md
mode change 100755 => 100644 uk/django_templates/README.md
mode change 100755 => 100644 uk/django_urls/README.md
mode change 100755 => 100644 uk/django_views/README.md
mode change 100755 => 100644 uk/dynamic_data_in_templates/README.md
mode change 100755 => 100644 uk/extend_your_application/README.md
create mode 100644 uk/intro_to_command_line/open_instructions.md
create mode 100644 uk/python_introduction/prompt.md
mode change 100755 => 100644 uk/template_extending/README.md
mode change 100755 => 100644 uk/whats_next/README.md
diff --git a/uk/GLOSSARY.md b/uk/GLOSSARY.md
index 21fed491ffc..a5c11c32bd2 100644
--- a/uk/GLOSSARY.md
+++ b/uk/GLOSSARY.md
@@ -1,2 +1,3 @@
# Редактор коду
-Редактор коду - це програма, що дозволяє зберегти ваш код, так що можна повернутися до його редагування пізніше. Ви можете дізнатися, звідки його взяти з розділу [про текстовий редактор](./code_editor/README.md)
+
+Редактор коду - це додаток, що дозволяє зберегти ваш код, так що можна повернутися до його редагування пізніше. Ви можете дізнатися, де його знайти у розділі [Редактор коду](./code_editor/README.md)
\ No newline at end of file
diff --git a/uk/README.md b/uk/README.md
index 39af52cf8d7..806676d959c 100644
--- a/uk/README.md
+++ b/uk/README.md
@@ -1,45 +1,51 @@
-# Навчальний посібник Django Girls
-[](https://gitter.im/DjangoGirls/tutorial?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+# Посібник Django Girls
-> Ця робота ліцензована міжнародною ліцензією Creative Commons Attribution-ShareAlike 4.0
-International License. Щоб переглянути копію цієї ліцензії, відвідайте
-https://creativecommons.org/licenses/by-sa/4.0/
+[](https://gitter.im/DjangoGirls/tutorial)
-## Translation
+> Ця робота ліцензована міжнародною ліцензією Creative Commons Attribution-ShareAlike 4.0. Щоб переглянути копію цієї ліцензії, відвідайте https://creativecommons.org/licenses/by-sa/4.0/
-This tutorial has been translated from English by a group of awesome volunteers: [chupakabra](https://github.com/chupakabra), [Oleksandr Redko](https://github.com/alexandear), [Taras Bunyk](https://github.com/bunyk), [msihor](https://crowdin.com/profile/msihor), [Olesia Hrydzhuk](https://github.com/Zlira), [Andriy Kohut](https://github.com/andriykohut), [Artem Suchov](https://crowdin.com/profile/suchov), [Artem Godlevskyi](https://github.com/errno), [Alex Vykalyuk](https://crowdin.com/profile/alekzvik), [Kostyantyn Leschenko](https://crowdin.com/profile/kleschenko). Special thanks for all the free time they sacrificed to make that happen! <3
+## Вітаємо
+Вітаємо у посібнику Django Girls! Ми раді вас тут бачити. :) В цьому курсі ви побачите із середини, як працюють вебтехнології. Ми пропонуємо вам огляд усіх шматочків, які мають об'єднатись разом, щоб зробити мережу такою, як ми її знаємо.
+
+Як і з усім невідомим, це буде пригодою - але не хвилюйтесь, бо якщо у вас вистачило сміливості бути тут, ви впораєтесь. :)
## Вступ
-Чи ви коли-небудь відчували, що світ крутиться все більше і більше навколо технологій, а ви в певній мірі пасете задніх? Чи вас колись цікавило, як створити веб-сайт, однак, ніколи не вистачало достатньої мотивації, щоб почати? Чи ви колись вважали, що світ програмування є занадто складним для вас, щоб навіть пробувати робити щось самостійно?
+Чи ви колись відчували, що світ крутиться все більше і більше навколо технологій, про які ви (поки) нічого не знаєте? Чи вас колись цікавило, як створити вебсайт, але ніколи не вистачало достатньої мотивації, щоб почати? Чи ви колись вважали, що світ програмування є занадто складним для вас, щоб навіть пробувати робити щось самостійно?
-Що ж, маємо гарні новини для вас! Програмування - це не так складно, як може здатися, і ми хочемо вам показати, наскільки веселим цей процес може бути.
+Що ж, маємо гарні новини для вас! Програмування - це не так складно, як може здаватися, і ми хочемо вам показати, наскільки веселим може бути цей процес.
-Даний навчальний посібник не перетворить вас магічним чином на програміста. Якщо ви хочете розбиратися у цьому, то вам потрібні будуть для цього місяці або навіть роки теорії та практики. Однак ми хочемо показати вам, що програмування або створення веб сайтів не є настільки складним, як це здається. Спробуємо пояснити різні поняття настільки, наскільки зуміємо, то ж ви не будете почуватися заляканими технологіями.
+Даний навчальний посібник не перетворить вас магічним чином на програмістку. Якщо ви хочете розбиратися у цьому, то вам потрібні місяці або навіть роки навчання та практики. Але, наша мета показати вам, що програмування або створення вебсайтів не таке складне, як здається. Ми будемо намагатись так добре пояснити різні уривки та частини, як тільки зможемо, тож технології вас не лякатимуть.
-Сподіваємось, ми зможемо навчити вас полюбити технології настільки, наскільки любимо їх ми самі!
+Сподіваємось, що нам вдасться зробити так, щоб ви любили технологію як любимо її ми!
## Що ви вивчите під час освоєння посібника?
-По завершенню даного посібника, ви будете мати простий робочий веб-додаток - свій власний блог. Ми покажемо вам як опублікувати його в Інтернеті, тож інші також зможуть оцінити вашу роботу!
+По завершенню даного посібника, ви будете мати простий, робочий вебдодаток: свій власний блог. Ми покажемо вам, як опублікувати його в інтернеті, тож інші також зможуть оцінити вашу роботу!
-Це буде (в більшій чи меншій мірі) виглядати наступним чином:
+Це буде (більшою чи меншою мірою) виглядати таким чином:
-
+
-> Якщо ви працюєте над матеріалами самостійно і не маєте інструктора, що зміг би допомогти у разі певної проблеми, для вас існує чат: [](https://gitter.im/DjangoGirls/tutorial?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge). Ми попросили наших інструкторів і попередніх учасників бути там час від часу та допомагати іншим із освоєнням матеріалу! Не бійтеся задавати свої питання!
+> Якщо ви працюєте над матеріалами самостійно і не маєте інструктора, що зміг би допомогти у разі певної проблеми, ми маємо для вас чат: [](https://gitter.im/DjangoGirls/tutorial). Ми попросили наших інструкторів і попередніх учасників бути там час від часу і допомагати іншим із освоєнням матеріалу! Не бійтеся задавати свої питання!
Гаразд, [почнемо з самого початку...](./how_the_internet_works/README.md)
-## Коротка інформація та вклад
+## Робота з посібником вдома
+
+Це чудово - брати участь в Django Girls workshop, але ми розуміємо, що не завжди є можливість його відвідати. Тому ми за те, щоб ви намагались проходити цей посібник вдома. Для тих, хто навчається вдома, ми зараз готуємо відео, які можуть спростити використання посібника самостійно. Вони досі знаходяться в розробці, але з часом все більше цікавих речей можна буде знайти на каналі [Coding is for girls](https://www.youtube.com/channel/UC0hNd2uW8jTR5K3KBzRuG2A/feed) в YouTube.
+
+У кожному розділі, що вже готовий, є посилання на відповідне відео.
+
+## Про проєкт та як долучитись
-Цей посібник підтримується спільнотою [DjangoGirls](https://djangogirls.org/). Якщо ви знайдете якісь помилки або захочете зробити певні оновлення, будь ласка, [виконуйте вказівки з частини про вклад](https://github.com/DjangoGirls/tutorial/blob/master/README.md).
+Цей посібник підтримується спільнотою [DjangoGirls](https://djangogirls.org/). Якщо ви знайдете якісь помилки або захочете зробити певні оновлення, будь ласка, [виконуйте вказівки, як долучитись до проєкту](https://github.com/DjangoGirls/tutorial/blob/master/README.md).
## Чи не бажаєте допомогти нам із перекладом посібника на інші мови?
-На даний момент, переклади підтримуються на платформі crowdin.com:
+На цей момент переклади підтримуються на платформі crowdin.com :
https://crowdin.com/project/django-girls-tutorial
-Якщо ваша мова не перерахована на crowdin, будь ласка, [відкрийте нову тему](https://github.com/DjangoGirls/tutorial/issues/new), що інформує про мову, таким чином ми зможемо додати її.
+Якщо ваша мова не перерахована на [crowdin](https://crowdin.com/), будь ласка, відкрийте нову тему0>, що інформує про мову, таким чином ми зможемо додати її.
\ No newline at end of file
diff --git a/uk/SUMMARY.md b/uk/SUMMARY.md
index ea34bf8e38d..a333ad851f4 100644
--- a/uk/SUMMARY.md
+++ b/uk/SUMMARY.md
@@ -1,7 +1,16 @@
# Зміст
* [Вступ](README.md)
-* [Встановлення](installation/README.md)
+* [Встановлення](installation/README.md)
+ * [Командний рядок](installation/README.md#command-line)
+ * [Python](installation/README.md#python)
+ * [Редактор Коду](installation/README.md#code-editor)
+ * [Віртуальне середовище](installation/README.md#virtualenv)
+ * [Django](installation/README.md#django)
+ * [Git](installation/README.md#git)
+ * [GitHub](installation/README.md#github-account)
+ * [PythonAnywhere](installation/README.md#pythonanywhere-account)
+* [Встановлення (chromebook)](chromebook_setup/README.md)
* [Як працює Інтернет](how_the_internet_works/README.md)
* [Вступ до командного рядку](intro_to_command_line/README.md)
* [Встановлення Python](python_installation/README.md)
@@ -13,14 +22,14 @@
* [Django моделі](django_models/README.md)
* [Django адміністратор](django_admin/README.md)
* [Розгортання!](deploy/README.md)
-* [Django urls](django_urls/README.md)
+* [Django URL-адреси](django_urls/README.md)
* [Django відображення - час творити!](django_views/README.md)
* [Вступ до HTML](html/README.md)
* [Django ORM (Querysets)](django_orm/README.md)
* [Динамічні дані в шаблонах](dynamic_data_in_templates/README.md)
* [Django шаблони](django_templates/README.md)
* [CSS - зроби це красиво](css/README.md)
-* [Шаблонне розширення](template_extending/README.md)
+* [Розширення шаблону](template_extending/README.md)
* [Розширте свою програму](extend_your_application/README.md)
* [Django форми](django_forms/README.md)
-* [Що далі?](whats_next/README.md)
+* [Що далі?](whats_next/README.md)
\ No newline at end of file
diff --git a/uk/chromebook_setup/README.md b/uk/chromebook_setup/README.md
new file mode 100644
index 00000000000..5e76e25429c
--- /dev/null
+++ b/uk/chromebook_setup/README.md
@@ -0,0 +1,5 @@
+# Налаштування на Chromebook
+
+> **Примітка** Якщо ви вже виконали [кроки встановлення](../installation/README.md), не потрібно робити це знову – ви можете перейти безпосередньо до [Вступ до Python](../python_introduction/README.md).
+
+{% include "/chromebook_setup/instructions.md" %}
\ No newline at end of file
diff --git a/uk/chromebook_setup/instructions.md b/uk/chromebook_setup/instructions.md
new file mode 100644
index 00000000000..6c295bffbff
--- /dev/null
+++ b/uk/chromebook_setup/instructions.md
@@ -0,0 +1,158 @@
+Ви можете [перейти у цей розділ](http://tutorial.djangogirls.org/en/installation/#install-python), якщо ви не використовуєте Chromebook. Якщо ви використовуєте Chromebook, процес встановлення може відрізнятись. Ви можете ігнорувати інші інструкції з установки.
+
+### Cloud IDE (PaizaCloud Cloud IDE, AWS Cloud9, Glitch.com)
+
+Cloud IDE це інструмент який надає вам редактор коду та доступ до комп'ютера в мережі Інтернет де ви можете встановлювати, писати та запускати програми. Протягом курсу, сloud IDE буде виконувати функцію вашого *локального ком'ютера*. Ви будете запускати команди в терміналі як і ваші одногрупники на OS X, Ubuntu або Windows, але ваш термінал буде керувати комп'ютером виділеним для вас Cloud IDE. Тут ви знайдете інструкції для Cloud IDEs (PaizaCloud Cloud IDE, AWS Cloud9, Glitch.com). Ви можете обрати одне з cloud IDE і використовувати інструкції для нього.
+
+#### PaizaCloud Cloud ID
+
+1. Перейдіть на [PaizaCloud Cloud IDE](https://paiza.cloud/)
+2. Зареєструйте обліковий запис
+3. Клацніть«*New Server*» і оберіть «Django app»
+4. Натисніть на кнопку Terminal (в лівій частині вікна)
+
+Тепер ви маєте побачити інтерфейс з боковою панеллю так кнопками зліва. Натисніть кнопку Terminal щоб відкрити вікно терміналу з наступним виводом:
+
+{% filename %}Terminal{% endfilename %}
+
+ $
+
+
+Термінал на PaizaCloud IDE готовий до ваших інструкцій. Ви можете змінити розмір або максимізувати це вікно, щоб зробити його трохи більшим.
+
+#### AWS Cloud9
+
+В даний час Cloud 9 вимагає зареєструватися за допомогою AWS і ввести інформацію кредитної карти.
+
+1. Встановити Cloud 9 з [веб-магазину Chrome](https://chrome.google.com/webstore/detail/cloud9/nbdmccoknlfggadpfkmcpnamfnbkmkcp)
+2. Перейдіть до [c9.io](https://c9.io) та натисніть *Get started with AWS Cloud9*
+3. Створіть обліковий запис AWS (потрібна інформація про кредитну картку, але ви можете користуватись цим безкоштовно)
+4. В AWS-Dashboard, введіть *Cloud9* в рядку пошуку і клацніть на ньому
+5. У панелі Cloud9 натисніть *Create environment*
+6. Назвіть його *django-girls*
+7. Під час налаштування параметрів виберіть *Create a new instance for environment (EC2)* для "Environment Type" та *t2.micro* для "Instance type" (він має сказати "Free-tier eligible."). Економне налаштування за замовчуванням задовільне, а ви можете залишити інші значення також без змін.
+8. Натисніть *Next step*
+9. Натисніть *Create environment*
+
+Тепер ви повинні побачити інтерфейс із бічною панеллю, великим основним вікном з деяким текстом, і маленьке вікно внизу, що виглядає приблизно так:
+
+{% filename %}bash{% endfilename %}
+
+ yourusername:~/workspace $
+
+
+Ця нижня область є вашим терміналом. Ви можете використовувати термінал, щоб відправляти інструкції на віддалений комп'ютер Cloud9. Ви можете змінити розмір вікна, щоб зробити його трохи більшим.
+
+#### Glitch.com хмара IDE
+
+1. Перейдіть на Glitch.com
+2. Зареєструйтесь за обліковим записом ( https://glitch.com/signup) або використовуйте акаунт GitHub, якщо маєте. (Дивіться інструкцію до GitHub нижче)
+3. Натисніть Новий проект та оберіть Головна сторінка
+4. Натисніть на випадаючому списку інструментів (внизу лівої сторони вікна) , потім натисніть на конпку терміналу , щоб відкрити закладку командного рядка таким чином:
+
+{% filename %} Термінал {% endfilename %}
+
+ Програма@ ім'я твого проекту
+
+
+Тобі не потрібно створювати віртуальне середовище при використанні Glitch.com як Ваш Cloud.IDE
+
+{% filename %}glitch.json{% endfilename %}
+
+```json
+{
+ "install": "pip3 install -r requirements.txt --user",
+ "start": "bash start.sh",
+ "watch": {
+ "throttle": 1000
+ }
+}
+```
+
+{% filename %}requirements.txt{% endfilename %}
+
+ Django~={{ book.django_version }}
+
+
+{% filename %}.bash_profile{% endfilename %}
+
+```bash
+alias python=python3
+alias pip=pip3
+```
+
+{% filename %}start.sh{% endfilename %}
+
+```bash
+chmod 600 .bash_profile
+pip3 install -r requirements.txt --user
+python3 manage.py makemigrations
+python3 manage.py migrate
+python3 manage.py runserver $PORT
+```
+
+Once these files are created, go to the Terminal and execute the following commands to create your first Django project:
+
+{% filename %}Terminal{% endfilename %}
+
+ django-admin.py startproject mysite .
+ refresh
+
+
+In order to see detailed error messages, you can activate Django debug logs for your Glitch application. Simply add the following at the end of the `mysite/settings.py` file.
+
+{% filename %}mysite/settings.py{% endfilename %}
+
+```python
+LOGGING = {
+ 'version': 1,
+ 'disable_existing_loggers': False,
+ 'handlers': {
+ 'file': {
+ 'level': 'DEBUG',
+ 'class': 'logging.FileHandler',
+ 'filename': 'debug.log',
+ },
+ },
+ 'loggers': {
+ 'django': {
+ 'handlers': ['file'],
+ 'level': 'DEBUG',
+ 'propagate': True,
+ },
+ },
+}
+```
+
+This will create a `debug.log` file detailing Django operations and any error messages that might come up, making it much easier to fix if your website does not work.
+
+The initial restarting of the Glitch project should fail. (If you click on the top dropdown button `Show` then click on `In a New Window`, you will receive a `DisallowedHost` error message.) Do not worry about it at this stage, the tutorial will fix this as soon as you update the Django settings of your project in the `mysite/settings.py` file.
+
+### Віртуальне середовище
+
+Віртуальне середовище (також зване virtualenv) - це як приватна скриня, яку ми можемо наповнювати корисним комп'ютерним кодом для проекту, над яким ми працюємо. Ми використовуємо їх для зберігання різноманітних частин коду, які потрібні нам для різних проєктів як окремі частини, так щоб не було плутанини між проєктами.
+
+Запуск:
+
+{% filename %}Cloud 9{% endfilename %}
+
+ mkdir djangogirls
+ cd djangogirls
+ python3 -m venv myvenv
+ source myvenv/bin/activate
+ pip install django~={{ book.django_version }}
+
+
+(зверніть увагу на те що в останньому рядку ми використовуємо знак тильди слідом за яким йде знак рівності:`~=`).
+
+### GitHub
+
+Створіть [GitHub](https://github.com) обліковий запис.
+
+### PythonAnywhere
+
+Посібник Django Girls містить розділ по так званому Розгортанні, що є процесом отримання коду, який забезпечує роботу вашого нового веб-додатка і переміщення його на загальнодоступний комп’ютер (так званий сервер), отож люди можуть бачити вашу роботу.
+
+Ця частна є трохи дивною в навчанні по Chromebook, оскільки ми вже використовуємо комп'ютер, який знаходиться в Інтернеті (на відміну від, скажімо, ноутбука). Однак, це все ще корисно, оскільки ми можемо розглядати нашу робочий простір Cloud 9 як місце для нашої роботи "в процесі" і Python Anywhere як місце, де можна показати наші речі,коли вони стають більш завершеними.
+
+Таким чином, зареєструйте новий обліковий запис Python Anywhere на [www.pythonanywhere.com](https://www.pythonanywhere.com).
\ No newline at end of file
diff --git a/uk/code_editor/README.md b/uk/code_editor/README.md
index da85dfaae1c..38b3040be03 100644
--- a/uk/code_editor/README.md
+++ b/uk/code_editor/README.md
@@ -1,7 +1,11 @@
# Редактор коду
-Наближаємось до написання нашого першого рядка коду, отже, настав час завантажити редактор коду!
+> Для читачів вдома: відеоверсія цього розділу (разом із попереднім) - [Встановлення Python та редактора коду](https://www.youtube.com/watch?v=pVTaqzKZCdA&t=4m43s) (англ.).
-> **Примітка** Ви могли зробити це раніше у розділі "Встановлення" - якщо вже завантажили редактор, то можете відразу перейти до наступного розділу!
+Наближаємось до написання нашого першого рядка коду, отже настав час завантажити редактор коду!
-{% include "/code_editor/instructions.md" %}
+> **Примітка:** Якщо ви використовуєте хромбук, пропустіть цей розділ і переконайтеся, що ви слідуєте інструкції [ Встановлення (хромбук)](../chromebook_setup/README.md). Вибраний вами хмарний IDE (PaizaCloud Cloud IDE або AWS Cloud9) включає в себе редактор коду, і коли ви відкриваєте файл в IDE з меню Файл, ви автоматично запускаєте редактор.
+>
+> **Примітка:** Ви могли вже зробити це у розділі "Встановлення" – якщо так, можете одразу перейти до наступного розділу!
+
+{% include "/code_editor/instructions.md" %}
\ No newline at end of file
diff --git a/uk/code_editor/instructions.md b/uk/code_editor/instructions.md
index b877de82df1..d6b73af8686 100644
--- a/uk/code_editor/instructions.md
+++ b/uk/code_editor/instructions.md
@@ -1,34 +1,37 @@
-Існує багато різноманітних редакторів і здебільшого все зводиться до персональних вподобань. Більшість Python програмістів використовують складні, але надзвичайно потужні IDE (англ. Integrated Development Environments - інтегровані середовища розробки), такі як PyCharm. Однак, вони менш доцільні для початківців; ми пропонуємо такі ж потужні, але більш простіші інструменти.
+Серед великого різноманіття редакторів вибір залежить від особистих вподобань. Більшість програмістів Python користуються комплексними і дуже потужними IDE (англ. Integrated Development Environments - Інтегровані середовища розробки), наприклад, PyCharm. Хоча новачкам, мабуть, вони не дуже підходять; ми рекомендуємо такі ж потужні, але значно простіші.
-Нижче наведено перелік наших вподобань, але ви також можете попросити поради в своїх тренерів - тоді буде простіше отримувати від них допомогу.
+Нижче наведено наші пропозиції, але не соромтесь запитати вашого наставника якими є його вподобання - простіше буде отримувати допомогу від нього.
-## Gedit
+## Visual Studio Code
-Gedit є відкритим, безкоштовним редактором, доступним для усіх операційних систем.
+Visual Studio Code - це редактор для написання коду, який розробив Microsoft для Windows, Linux та macOS. Він включає підтримку налагодження, вбудоване керування Git, підсвітку синтаксису, інтелектуальне завершення коду, сніппети та рефакторинг коду.
-[Завантажте його можна тут](https://wiki.gnome.org/Apps/Gedit#Download)
+[Завантаження тут](https://code.visualstudio.com/)
-## Sublime Text
+## Gedit
-Sublime Text є дуже популярним редактором із безкоштовним пробним періодом. Він легко встановлюється та простий у використанні, а також доступний для усіх операційних систем.
+Gedit - це безкоштовний редактор з відкритим кодом, що доступний для всіх операційних систем.
-[Завантажити його можна тут](https://www.sublimetext.com/)
+[Завантаження тут](https://wiki.gnome.org/Apps/Gedit#Download)
-## Atom
+## Sublime Text
-Atom - це найновіший редактор коду, створений [GitHub](https://github.com/). Він є безкоштовним, відкритим, легко встановлюється та простий у користуванні. Доступний для Windows, OSX і Linux.
+Sublime Text - це дуже популярний редактор із безкоштовним періодом оцінювання та є доступним для всіх операційних систем.
-[Завантажити його можна тут](https://atom.io/)
+[Завантаження тут](https://www.sublimetext.com/)
+## Atom
+Atom - ще один поширений редактор. Він безкоштовний, має відкритий вихідний код та доступний для Windows, OS X та Linux. Atom розробили в [GitHub](https://github.com/).
-## Чому ми встановлюємо редактор коду?
+[Завантаження тут](https://atom.io/)
-Ви напевне запитуєте себе, чому ми встановлюємо спеціальний редактор для коду, а не використовуємо щось на зразок Word чи Notepad.
+## Яка причина встановлення редактора коду?
-По-перше, код повинен зберігатись як **звичайний текст**, а проблемою таких програм як Word чи Textedit є те, що вони не створюють звичайний текст, вони продукують так званий "збагачений" текст (зі шрифтами та форматуванням), використовуючи спеціальні формати, такі як [RTF (Rich Text Format)](https://en.wikipedia.org/wiki/Rich_Text_Format).
+Ви, мабуть, дивуєтесь чому ми інсталюємо особливе ПЗ редактора коду, замість того щоб використовувати щось на зразок Word або Notepad.
-Другою причиною є те, що редактори коду спеціалізуються саме на редагуванні коду, тому вони можуть запропонувати корисні функції на зразок підсвітки коду залежно від його значення чи автоматичного закривання дужок.
+По-перше, код має бути **простим текстом**, а проблема програм як Word або Textedit в тому, що вони загалом не створюють простий текст, вони створюють форматований текст (що має шрифти та форматування), використовуючи нестандартні формати на зразок [RTF (Rich Text Format)](https://en.wikipedia.org/wiki/Rich_Text_Format).
-Ми побачимо все це в дії пізніше. Скоро ви вважатимете свого вірного редактора коду одним із найулюбленіших інструментів :)
+По-друге, редактори коду мають спеціалізацію - редагування коду, вони забезпечують вас корисними функціями на зразок кольорової підсвітки коду відповідно його значення або автоматичного закриття дужок.
+Пізніше ми побачимо як це працює. Незабаром свій старий вірний редактор коду ви сприйматимете як один зі своїх улюблених інструментів. :)
\ No newline at end of file
diff --git a/uk/css/README.md b/uk/css/README.md
old mode 100755
new mode 100644
index 26c0c08e382..ace84122e58
--- a/uk/css/README.md
+++ b/uk/css/README.md
@@ -4,43 +4,41 @@
## Що таке CSS?
-Каскадні таблиці стилів (англ. Cascading Style Sheets, скорочено CSS) - спеціальна мова, що використовується для опису зовнішнього вигляду і форматування сайту написаного мовою розмітки (як HTML). Сприймайте це, як свого роду макіяж для нашої веб-сторінки;).
+Каскадні таблиці стилів (CSS) - це мова, яка використовується для опису вигляду та форматування веб-сайту, написаного на мові розмітки (наприклад, HTML). Розгляньте це як макіяж для нашої веб-сторінки. ;)
-Але ми ж не хочемо починати знову все з нуля, правда? А візьмемо знову щось, що вже було створене програмістами і опубліковано в Інтернеті для вільного користування. Ви ж знаєте, знову винаходити велосипед зовсім не весело.
+Але ми не хочемо починати з нуля, чи не так? Ще раз повторюємо: ми будемо використовувати те, що програмісти випускають в Інтернеті безкоштовно. Ви знаєте, що винаходити велосипед не весело.
## Скористаємось Bootstrap!
-Bootstrap - один з найбільш популярних HTML і CSS фреймворків для розробки прекрасних веб-сайтів: https://getbootstrap.com/
+Bootstrap - це один з найпопулярніших HTML-і CSS фреймворків для розробки гарних веб-сайтів: https://getbootstrap.com/
-Він був написаний програмістами, які працювали для Twitter'у і на сьогоднішній день удосконалюється волонтерами з усього світу.
+Цей фреймворк був написаний програмістами, які працювали у Twitter. Тепер він розробляється волонтерами з усього світу!
-## Встановлення Boostrap
+## Встановлюємо Boostrap
-Для встановлення Bootstrap, вам потрібно додати наступні рядки у розділ `` вашого `.html` файлу (`blog/templates/blog/post_list.html`):
+Для встановлення Bootstrap, відкрийте файл `.html` у редакторі коду і додайте наступний код в секцію ``»:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
```html
-
-
+
```
-Це не додасть жодного файлу до вашого проекту. Натомість ці рядки просто вказують на файли опубліковані в інтернеті.
-Просто рухайтесь вперед, відкрийте ваш веб-сайт і оновіть сторінку. Ось так!
+Це не додасть жодного файлу до вашого проекту. Натомість ці рядки просто вказують на файли опубліковані в інтернеті. Отже далі просто, відкрийте свій веб-сайт і оновіть сторінку. Ось так!

-Вже краще!
-
+Виглядає набагато краще!
## Статичні файли в Django
-Нарешті, ми детальніше розглянемо те, що ми називали __статичними файлами__. Статичні файли включають усі ваші CSS файли та картинки - файли, які не є динамічними, а отже, їхній вміст не залежить від змісту запиту і буде однаковим для усіх користувачів.
-
+Нарешті, ми детальніше розглянемо те, що ми називали **статичними файлами**. Статичні файли - це всі ваші CSS файли та зображення. Їх зміст не залежить від контексту запиту і буде однаковим для кожного користувача.
### Де помістити статичні файли для Django
-Як ви бачили, коли ми запускали `collectstatic` на сервері, Django вже знає, де знайти статичні файли для вбудованого додатку "admin". Тепер нам просто потрібно додати деякі статичні файли для нашого власного додатку `blog`.
+Як ви бачили, коли ми запускали collectstatic на сервері, Django вже знає, де знайти статичні файли для вбудованого додатку "admin". Тепер нам просто потрібно додати деякі статичні файли для нашого власного додатку, `blog`.
-Створимо директорію `static` всередині додатку blog:
+Створимо директорію з ім’ям `static` всередині додатку blog:
djangogirls
├── blog
@@ -48,118 +46,130 @@ Bootstrap - один з найбільш популярних HTML і CSS фре
│ ├── static
│ └── templates
└── mysite
+
-Django автоматично знайде всі "статичні" папки всередині будь-якої з папок з вашими додатками, і він буде мати можливість використовувати їх як статичні файли.
-
-
+Django автоматично знайде всі папки, які називаються "статичними", в папках з будь-якими вашими додатками, і він буде мати можливість використовувати їх вміст як статичні файли.
## Ваш перший CSS файл!
-Що ж, тепер давайте створимо CSS файл для того, щоб додати ваш власний стиль до вашої веб-сторінки. Створіть нову папку з назвою `css` всередині вашої папки `static`. Потім всередині цієї папки`css` створіть новий файл `blog.css`. Готові?
+Що ж, тепер створімо CSS файл для того, щоб додати ваш власний стиль до вашої вебсторінки. Створіть нову папку з назвою `css` всередині вашої папки `static`. Потім всередині папки `css` створіть новий файл з назвою `blog.css`. Готові?
djangogirls
└─── blog
└─── static
└─── css
└─── blog.css
+
-Настав час написати CSS! Відкрийте файл `static/css/blog.css` в редакторі коду.
+Настав час написати CSS! Відкрийте файл `static/css/blog.css` в вашому редакторі коду.
-Не будемо тут занурюватись надто глибоко в процес налаштування і вивчення CSS, оскільки це так просто, що ви можете вивчити цей матеріал самостійно після завершення воркшопу. Ми наполегливо рекомендуємо пройти курс [Codeacademy HTML & CSS course](https://www.codecademy.com/tracks/web) для того, щоб вивчити все, що вам потрібно знати про оформлення веб-сайтів за допомогою CSS.
+Ми не будемо занурюватись тут надто глибоко в процес налаштування і вивчення CSS. Ми рекомендуємо безкоштовний CSS-курс в кінці цієї сторінки, якщо ви бажаєте вивчити більше.
-Але принаймні попрацюємо трохи. Може ми могли б змінити колір заголовка?
-Щоб зрозуміти кольори, комп'ютери використовують спеціальні коди. Вони починаються з `#` і далі слідують 6 літер (A-F), а також цифри (0-9). Ви можете знайти коди кольорів, наприклад, тут: http://www.colorpicker.com/. Також можете користуватися вже [визначеними кольорами](http://www.w3schools.com/colors/colors_names.asp), такими як `red` та `green`.
+Але давайте зробимо хоча б трохи. Можливо, ми могли б змінити колір заголовків? Щоб зрозуміти кольори, комп'ютери використовують спеціальні коди. Ці коди починаються з `#` та складаються з шести літер (A-F) та цифр (0-9). Наприклад, код синього кольору `#0000FF`. Ви можете знайти інші коди тут: http://www.colorpicker.com/. Також можете користуватися вже [визначеними кольорами ](http://www.w3schools.com/colors/colors_names.asp), такими як `red` та `green`.
У вашому файлі `static/css/blog.css` потрібно додати наступний код:
+{% filename %}blog/static/css/blog.css{% endfilename %}
+
```css
-h1 a {
- color: #FCA205;
+h1 a, h2 a {
+ color: #C25100;
}
+
```
-`h1 a` - CSS селектор. Це означає, що ми застосовуємо наші стилі до кожного елементу `a` всередині елементу `h1` (наприклад, коли ми маємо в коді щось на зразок: `
`). У цьому випадку, ми повідомляємо про те, що треба змінити колір на `#FCA205`, тобто помаранчевий. Звичайно, ви можете визначити тут ваш власний колір!
+`h1 a` - це CSS селектор. Він означає, що ми застосовуємо наші стили до усіх тегів `a` всередині тега `h1`; для селектора `h2 a` ми робимо теж саме для тегів в `h2`. Отже, в прикладі `
+
{% endfor %}
```
-Добре, збережіть файл і перезавантажте сторінку!
+OK, збережіть файл і перезавантажте сторінку!

Чудова робота! Можливо, ми також хотіли б дати нашому веб-сайту трохи повітря і збільшити відступ зліва? Давайте спробуємо!
+{% filename %}blog/static/css/blog.css{% endfilename %}
+
```css
body {
padding-left: 15px;
}
```
-Додайте це до вашого CSS, збережіть файл і подивіться, як це працює!
+Додайте цей код до вашого CSS файлу, збережіть цей файл і подивіться як це працює!

-Може ми могли б також налаштувати шрифт нашого заголовка? Вставте це всередину розділу `` файлу `blog/templates/blog/post_list.html`:
+Можливо, ми могли б також налаштувати шрифт нашого заголовка? Вставте це всередину розділу `` файлу `blog/templates/blog/post_list.html`:
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
```html
-
+
```
-Цей рядок імпортує шрифт із назвою *Lobster* із колекції шрифтів Google (https://www.google.com/fonts).
+Як і раніше, перевірте порядок і місце перед посиланням на `blog/static/css/blog.css`. Цей рядок імпортує шрифт під назвою *Lobster* з шрифтів Google (https://www.google.com/fonts).
-Знайдіть блок визначення стилю `h1 a` (код між фігурними дужками `{` і `}`) в CSS файлі `blog/static/css/blog.css`. Тепер додайте Тепер додайте рядок `font-family: 'Lobster';` між дужками і перезавантажте сторінку:
+Знайдіть де оголошений блок `h1 a` (код між дужками `{` та `}`) у файлі CSS `blog/static/css/blog.css`. Тепер додайте рядок `font-family: 'Lobster';` між дужками та перезавантажте сторінку:
+
+{% filename %}blog/static/css/blog.css{% endfilename %}
```css
-h1 a {
- color: #FCA205;
+h1 a, h2 a {
+ color: #C25100;
font-family: 'Lobster';
}
```
@@ -168,52 +178,61 @@ h1 a {
Чудово!
+Як було зазначено вище, CSS має свою концепцію класів. Це дозволяє Вам іменувати частини HTML коду та застосовувати стилі лише до цих частин коду не впливаючи на інші частини. Це може бути дуже корисним! Можливо, у вас можуть бути два тега div, які виконують щось різне (наприклад ваш заголовок та пост). Клас може допомогти вам зробити їх різними.
-Як було зазначено вище, CSS має концепцію класів. Вона дозволяє вам іменувати частину HTML коду і застосовувати стилі лише до цієї частини без будь-якого ефекту на інші частини. Це буває надзвичайно корисним. Скажімо, у вас є два блоки div, але вони виконують зовсім різні функції (як ваш заголовок і пост). Клас дозволяє вам зробити їх вигляд різним.
+Наступним кроком треба дати ім'я деяким сніппетам HTML коду. Для цього треба замінити `header` , що містить ваш заголовок наступним чином:
-Дайте імена певним частинам HTML коду. Додайте клас `page-header` до блоку `div`, що містить ваш заголовок, як це зроблено тут:
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
```html
-
+
```
-А тепер додайте клас `post` до вашого блоку `div`, що містить сам допис.
+А тепер додайте клас `post` до вашого `article`, що містить пост блога.
+
+{% filename %}blog/templates/blog/post_list.html{% endfilename %}
```html
-
+
```
-Збережіть ці файли і перезавантажте веб-сайт.
+Збережіть файли і перезавантажте свій сайт.

-Юхууу! Виглядає прекрасно, чи не так?
-Код, який ми щойно вставили, насправді не є складним для розуміння і ви в змозі зрозуміти більшу його частину після прочитання.
-
-Не бійтеся трохи повозитися з цим CSS файлом і спробуйте поміняти деякий код. Якщо щось зламається, не хвилюйтесь, ви завжди можете відмінити попередню дію!
+Клас! Виглядає чудово, чи не так? Подивіться на цей код, який ми щойно вставили, щоб знайти місця де ми додали класи у HTML файл і використали їх у CSS файлі. Щоб б ви змінили у коді, якби ви хотіли, щоб дата відображалася бірюзового кольору?
-В будь-якому разі, дуже рекомендуємо пройти цей безкоштовний онлайн [Codeacademy HTML & CSS курс](https://www.codecademy.com/tracks/web). Він допоможе вам вивчити усе, що потрібно знати про оформлення веб-сайтів за допомогою CSS.
+Не бійтеся трохи поекспериментувати з цим CSS файлом, спробуйте щось змінити в ньому. Експерименти з CSS файлом можуть допомогти вам краще зрозуміти, що роблять різні частини коду. Якщо ви щось зламаєте, не хвилюйтеся - ви завжди можете повернутися до попередньої версії!
-Готові до наступного розділу?! :)
+Ми дійсно рекомендуємо пройти безкоштовні онлайн-курси "Basic HTML & HTML5" та "Basic CSS" на [freeCodeCamp](https://learn.freecodecamp.org/). Ці курси можуть допомогти вам дізнатись як зробити ваші сайти більш привабливими використовуючи HTML та CSS.
+Готові до наступного розділу?! :)
\ No newline at end of file
diff --git a/uk/deploy/README.md b/uk/deploy/README.md
old mode 100755
new mode 100644
index 8f35a4db6c9..d939f2bb0d0
--- a/uk/deploy/README.md
+++ b/uk/deploy/README.md
@@ -1,22 +1,18 @@
# Розгортання!
-> **Зауваження** Цей розділ може бути дещо складним для освоєння. Наполегливо продовжуйте і дійдіть до кінця; розгортання - важлива частина процесу розробки веб-сайту. Цей розділ розташований посередині посібника, щоб ваш наставник зміг допомогти із дещо хитрим процесом випуску веб-сайту в Інтернет. Це означає, що ви все ще можете завершити цей курс самостійно, якщо раптом не встигаєте.
+> **Зауваження** Цей розділ інколи може бути дещо складним для освоєння. Наполегливо продовжуйте і дійдіть до кінця; розгортання -- важлива частина процесу розробки веб-сайту. Цей розділ розташований посередині посібника, щоб ваш наставник зміг допомогти із дещо хитрим процесом випуску веб-сайту в Інтернет. Це означає, що ви все ще можете завершити цей курс самостійно, якщо раптом не встигаєте.
-До цього часу ваш веб-сайт був доступний лише локально на вашому комп'ютері, тепер ви дізнаєтесь, як його розгорнути! Розгортання - це процес публікації вашого додатку в Інтернеті таким чином, що люди можуть зайти і побачити його :).
+До цього часу, ваш вебсайт бул лише на вашому комп’ютері. Тепер прийшов час навчитися як розгорнути його (задеплоїти)! Розгортання -- це процес публікації вашого додатку в Інтернеті таким чином, що люди можуть зрештою зайти і побачити його. :)
-Як ви вже знаєте, веб-сайт має бути розміщений на сервері. В Інтернеті є багато компаній які пропонують такі послуги. Ми будемо використовувати той, який має відносно простий розгортання процес: [PythonAnywhere](https://www.pythonanywhere.com/). PythonAnywhere безкоштовний для малих додатків, в яких не дуже багато користувачів, тож нам цього точно буде достатньо.
+Як ви вже знаєте, веб-сайт має бути розміщений на сервері. В Інтернеті є багато хостингів (server providers), ми ж будемо використовувати [PythonAnywhere](https://www.pythonanywhere.com/). PythonAnywhere безкоштовний для малих додатків, в яких не дуже багато користувачів, тож нам цього точно буде достатньо.
Інший зовнішній інструмент, який ми будемо використовувати - це [GitHub](https://www.github.com), платформа для розміщення коду. У нього є альтернативи, але майже кожен програміст зараз має GitHub профіль, і скоро ви будете серед них!
-Ці три місця є дуже важливими для вас. Ваш локальний комп'ютер буде місцем, де ви розробляєте і тестуєте. Після того, як впевнитесь в змінах, ви перемістите копію програми на GitHub. Веб-сайт буде на PythonAnywhere і ви оновите його, роблячи нову копію коду з GitHub.
+These three places will be important to you. Your local computer will be the place where you do development and testing. When you're happy with the changes, you will place a copy of your program on GitHub. Your website will be on PythonAnywhere and you will update it by getting a new copy of your code from GitHub.
# Git
-Git - це "система контролю версій", яка використовується багатьма розробниками. Ця програма дозволяє відслідковувати зміни у файлах з часом так, що ви можете повернутись до певних версій пізніше. Схоже на функцію "слідкувати за змінами" в Microsoft Word, але набагато потужніше.
-
-## Встановлення Git
-
-> **Примітка** Якщо ви вже виконали процес встановлення, немає потреби робити це ще раз, - можете перейти до наступного кроку і почати створення свого Git репозиторію.
+> **Note** If you already did the [installation steps](../installation/README.md), there's no need to do this again – you can skip to the next section and start creating your Git repository.
{% include "/deploy/install_git.md" %}
@@ -24,285 +20,162 @@ Git - це "система контролю версій", яка викорис
Git відслідковує зміни певних файлів в репозиторії коду (коротко – "репо"). Давайте створимо "репо" для нашого проекту. Відкрийте вашу консоль та запустіть наступні команди в папці `djangogirls`:
-> **Примітка** Перевірте поточну директорію за допомогою команд `pwd` (OSX/Linux) або `cd` (Windows) перед стартом репозиторію. Ви маєте бути в папці `djangogirls`.
+> **Note** Check your current working directory with a `pwd` (Mac OS X/Linux) or `cd` (Windows) command before initializing the repository. Ви маєте бути в папці `djangogirls`.
+
+{% filename %}command-line{% endfilename %}
$ git init
Initialized empty Git repository in ~/djangogirls/.git/
$ git config --global user.name "Your Name"
$ git config --global user.email you@example.com
+
-Створення git-репозиторію відбувається тільки один раз на кожен проект (і тобі більше не потрібно буде заново вводити ім'я чи електронну пошту).
+Initializing the git repository is something we need to do only once per project (and you won't have to re-enter the username and email ever again).
-Git стежитиме за змінам всіх файлів у цій директорії, але є певні файли, які ми хочемо ігнорувати. Ми зробимо це шляхом створення файлу з назвою `.gitignore` в базовій директорії. Відкрий свій редактор і створи новий файл з наступним змістом:
+### Adjusting your branch name
-```
-*.pyc
-__pycache__
-myvenv
-db.sqlite3
-/static
-.DS_Store
-```
+If the version of Git that you are using is older than **2.28**, you will need to change the name of your branch to "main". To determine the version of Git, please enter the following command:
-І збережи його як `.gitignore` в директорії "djangogirls".
+{% filename %}command-line{% endfilename %}
-> **Примітка** Крапка на початку імені файлу важлива! У разі виникнення будь-яких труднощів при створенні (наприклад, Mac не любить, коли через Finder створюють файли, імена яких починаються з крапки), використовуйте "Зберегти як" у редакторі, це повинно спрацювати.
+ $ git --version
+ git version 2.xx...
+
-> **Примітка** Одним із файлів, вказаних в `.gitignore` є `db.sqlite3`. Цей файл є вашою локальною базою даних, де зберігаються пости. Ми не хочемо додавати його до нашого репозиторію, тому що веб-сайт на PythonAnywhere використовуватиме іншу базу. Ця база даних може бути SQLite, як на вашій локальній машині, але зазвичай, ми будемо використовувати базу MySQL, яка може обслуговувати набагато більше відвідувачів сайту, ніж SQLite. У всякому разі, ігнорування бази даних SQLite для копії коду на GitHub, означає, що всі створені вами пости залишаться і будуть доступні локально, але ви можете додати їх також і на продакшн. Ви повинні думати про локальну базу як про хороший майданчик, де можна тестувати різні речі і не боятися, що можна видалити реальні пости з блогу.
+Only if the second number of the version, shown as "xx" above, is less than 28, will you need to enter the following command to rename your branch. If it is 28 or higher, please continue to "Ignoring files". As in "Initializing", this is something we need to do only once per project, as well as only when your version of Git is less than 2.28:
-Перед тим, як виконати команду `git add` (також, коли ви просто не впевненні що змінилось) непоганою ідеєю буде виконати `git status`. Це допоможе уникнути сюрпризів, наприклад, додавання чи коміту небажаного файлу. Команда `git status` повертає інформацію про файли у вашому репозиторії: untracked (не додані до репозиторію файли), modified (змінені файли), staged (файл додані до коміту), статус поточної гілки і багато іншого. Вивід повинен бути схожий на:
+{% filename %}command-line{% endfilename %}
- $ git status
- On branch master
+ $ git branch -M main
+
- No commits yet
+### Ignoring files
+
+Git will track changes to all the files and folders in this directory, but there are some files we want it to ignore. We do this by creating a file called `.gitignore` in the base directory. Open up your editor and create a new file with the following contents:
+
+{% filename %}.gitignore{% endfilename %}
+ # Python
+ *.pyc
+ *~
+ __pycache__
+
+ # Env
+ .env
+ myvenv/
+ venv/
+
+ # Database
+ db.sqlite3
+
+ # Static folder at project root
+ /static/
+
+ # macOS
+ ._*
+ .DS_Store
+ .fseventsd
+ .Spotlight-V100
+
+ # Windows
+ Thumbs.db*
+ ehthumbs*.db
+ [Dd]esktop.ini
+ $RECYCLE.BIN/
+
+ # Visual Studio
+ .vscode/
+ .history/
+ *.code-workspace
+
+
+And save it as `.gitignore` in the "djangogirls" folder.
+
+> **Примітка** Крапка на початку імені файлу важлива! У разі виникнення будь-яких труднощів при створенні (наприклад Mac не любить коли створюють файли, імена яких починаються з крапки через Finder), тоді використати "Зберегти як" у редакторі, це повинно спрацювати. І впевніться, що не додали `.txt`, `.py` або будь-які інші розширення до імені файлу. Для Git потрібно саме назва `.gitignore`, так він її розпізнає. Linux and MacOS treat files with a name that starts with `.` (such as `.gitignore`) as hidden and the normal `ls` command won't show these files. Instead use `ls -a` to see the `.gitignore` file.
+>
+> **Note** One of the files you specified in your `.gitignore` file is `db.sqlite3`. That file is your local database, where all of your users and posts are stored. We'll follow standard web programming practice, meaning that we'll use separate databases for your local testing site and your live website on PythonAnywhere. The PythonAnywhere database could be SQLite, like your development machine, but usually you will use one called MySQL which can deal with a lot more site visitors than SQLite. Either way, by ignoring your SQLite database for the GitHub copy, it means that all of the posts and superuser you created so far are going to only be available locally, and you'll have to create new ones on production. You should think of your local database as a good playground where you can test different things and not be afraid that you're going to delete your real posts from your blog.
+
+It's a good idea to use a `git status` command before `git add` or whenever you find yourself unsure of what has changed. This will help prevent any surprises from happening, such as wrong files being added or committed. The `git status` command returns information about any untracked/modified/staged files, the branch status, and much more. The output should be similar to the following:
+
+{% filename %}command-line{% endfilename %}
+
+ $ git status
+ On branch main
+
+ No commits yet
+
Untracked files:
(use "git add ..." to include in what will be committed)
-
+
.gitignore
blog/
manage.py
mysite/
-
+ requirements.txt
+
nothing added to commit but untracked files present (use "git add" to track)
+
-Зрештою, зберігаємо наші зміни. Перейдіть до консолі і виконайте наступні команди:
+And finally we save our changes. Go to your console and run these commands:
- $ git add --all .
+{% filename %}command-line{% endfilename %}
+
+ $ git add .
$ git commit -m "My Django Girls app, first commit"
[...]
13 files changed, 200 insertions(+)
create mode 100644 .gitignore
[...]
create mode 100644 mysite/wsgi.py
+
+
+## Pushing your code to GitHub
+Go to [GitHub.com](https://www.github.com) and sign up for a new, free user account. (If you already did that in the workshop prep, that is great!) Be sure to remember your password (add it to your password manager, if you use one).
-## Викладемо наш код на GitHub
+Then, create a new repository, giving it the name "my-first-blog". Leave the "initialize with a README" checkbox unchecked, leave the .gitignore option blank (we've done that manually) and leave the License as None.
-Відкриємо [GitHub.com](https://www.github.com) і створимо новий безкоштовний обліковий запис. (Ті хто зробили це ще на етапі підготовки - справжні молодці!)
+
-Створимо новий репозиторій з назвою "my-first-blog". Залишимо опцію "initialise with a README" не вибраною, .gitignore порожньою (пізніше ми додамо це вручну) і License також залишимо як None.
+> **Note** The name `my-first-blog` is important – you could choose something else, but it's going to occur lots of times in the instructions below, and you'd have to substitute it each time. It's probably easier to stick with the name `my-first-blog`.
-
+On the next screen, you'll be shown your repo's clone URL, which you will use in some of the commands that follow:
-> **Примітка** Ім'я `my-first-blog` важливе - ви можете вибрати щось інше, але воно буде використовуватись багато разів в інструкціях нижче, і потрібно буде замінити його кожного разу. Мабуть легше просто його залишити як `my-first-blog`.
+
-В наступному екрані ми побачимо посилання для клонування репозиторію - clone URL, скопіюємо його і вставимо у термінал:
+Now we need to hook up the Git repository on your computer to the one up on GitHub.
-
+Type the following into your console (replace `` with the username you entered when you created your GitHub account, but without the angle-brackets -- the URL should match the clone URL you just saw).
-Зараз нам потрібно під'єднати Git репозиторій на локальному комп'ютері до щойно створеного на GitHub.
+{% filename %}command-line{% endfilename %}
-Введіть у вашій консолі (замінивши `<ваше-github-ім'я>` іменем користувача, вказаним під час створення облікового запису GitHub, але без кутових дужок):
+ $ git remote add origin https://github.com//my-first-blog.git
+ $ git push -u origin main
+
- $ git remote add origin https://github.com/<ваше-github-ім'я>/my-first-blog.git
- $ git push -u origin master
+When you push to GitHub, you'll be asked for your GitHub username and password (either right there in the command-line window or in a pop-up window), and after entering credentials you should see something like this:
-Введемо наше ім'я користувача та пароль від GitHub, і побачимо щось на зразок:
+{% filename %}command-line{% endfilename %}
- Username for 'https://github.com': hjwp
- Password for 'https://hjwp@github.com':
Counting objects: 6, done.
Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
- To https://github.com/hjwp/my-first-blog.git
- * [new branch] master -> master
- Branch master set up to track remote branch master from origin.
-
-
-
-Ваш код тепер на GitHub. Ходімо перевіримо! Виявляється, він у хорошій компанії - [Django](https://github.com/django/django), [Цей посібник](https://github.com/DjangoGirls/tutorial) і багато інших чудових проектів з відкритим вихідним кодом також публікуються на GitHub :)
-
-
-# Налаштування нашого блогу на PythonAnywhere
-
-> **Примітка** Можливо, ви вже створили обліковий запис на PythonAnywhere під час підготовки - якщо це так, немає необхідності робити це знову.
-
-{% include "/deploy/signup_pythonanywhere.md" %}
-
-
-## Завантажимо наш код на PythonAnywhere
-
-Після входу до PythonAnywhere, ми опинимось на головній панелі або сторінці "Consoles". Виберемо опцію почати нову "bash" консоль (Start a new console - bash) - це PythonAnywhere версія консолі, схожа на ту, що на вашому комп'ютері.
-
-> **Примітка** PythonAnywhere побудований на основі Linux, тому, якщо ви на Windows, консоль буде трохи відрізнятись від тієї, що на вашому комп'ютері.
-
-Давайте завантажимо наш код з GitHub у PythonAnywhere, клонувавши наш репозиторій. Наберіть наступне у консолі PythonAnywhere (не забудьте використовувати ім'я користувача GitHub замість `< ваше-github-ім'я>`):
-
- $ git clone https://github.com/<ваше-github-ім'я>/my-first-blog.git
-
-Ця команда завантажить копію вашого коду на PythonAnywhere. Давайте перевіримо, набравши `tree my-first-blog`:
-
- $ tree my-first-blog
- my-first-blog/
- ├── blog
- │ ├── __init__.py
- │ ├── admin.py
- │ ├── migrations
- │ │ ├── 0001_initial.py
- │ │ └── __init__.py
- │ ├── models.py
- │ ├── tests.py
- │ └── views.py
- ├── manage.py
- └── mysite
- ├── __init__.py
- ├── settings.py
- ├── urls.py
- └── wsgi.py
-
-
-### Створення virtualenv на PythonAnywhere
-
-Так само як і на власному комп'ютері, створіть virtualenv на PythonAnywhere. У консолі Bash введіть:
-
-```
-$ cd my-first-blog
-
-$ virtualenv --python=python3.4 myvenv
-Running virtualenv with interpreter /usr/bin/python3.4
-[...]
-Installing setuptools, pip...done.
-
-$ source myvenv/bin/activate
-
-(mvenv) $ pip install django whitenoise
-Collecting django
-[...]
-Successfully installed django-1.8.2 whitenoise-2.0
-```
-
-
-> **Примітка** Крок `pip install` може зайняти кілька хвилин. Терпіння і ще раз терпіння! Але якщо він займає більш ніж 5 хвилин, щось пішло шкереберть. Попросіть допомоги у вашого тренера.
-
-
-
-
-### Збирання статичних файлів.
-
-Можливо ви поцікавились, що за штука цей "whitenoise"? Це інструмент для обслуговування так званих "статичних файлів". Статичні файли - це файли, які зазвичай не змінюються і не виконують ніякого коду, наприклад, HTML чи CSS файли. На серверах вони працюють інакше, ніж на вашому локальному комп'ютері, щоб сервер міг їх віддавати, нам потрібен спеціальний інструмент, такий як "whitenoise".
-
-Пізніше, коли ми змінимо CSS для нашого сайту, ми дізнаємось трохи більше про статичні файли.
-
-Поки що нам просто потрібно виконати додаткову команду `collectstatic` на сервері. Ця команда каже Django про усі статичні файли на сервері, які йому потрібні. На даний момент це в основному файли, що допомагають зробити красивою сторінку адміністрування.
-
- (mvenv) $ python manage.py collectstatic
-
- You have requested to collect static files at the destination
- location as specified in your settings:
-
- /home/edith/my-first-blog/static
-
- This will overwrite existing files!
- Are you sure you want to do this?
-
- Type 'yes' to continue, or 'no' to cancel: yes
-
-Введемо "yes" і помчали! Чи не прекрасно, коли ми можемо змусити комп'ютер друкувати незрозумілий текст сторінка за сторінкою? Кожного разу я додаю невеликий звуковий супровід: дир-дир-дир...
-
- Copying '/home/edith/my-first-blog/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/js/actions.min.js'
- Copying '/home/edith/my-first-blog/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/js/inlines.min.js'
- [...]
- Copying '/home/edith/my-first-blog/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/css/changelists.css'
- Copying '/home/edith/my-first-blog/mvenv/lib/python3.4/site-packages/django/contrib/admin/static/admin/css/base.css'
- 62 static files copied to '/home/edith/my-first-blog/static'.
-
-
-### Створимо базу даних на PythonAnywhere
-
-Ось ще одна річ, яка відрізняється на локальному комп'ютері і на сервері: вони використовують різні бази даних. Так що облікові записи користувачів і статті блогу можуть відрізнятися на сервері і локальному комп'ютері.
-
-Ми можемо ініціалізувати базу даних на сервері таким самим чином, як і на локальному комп'ютері - з допомогою `migrate` і `createsuperuser`:
-
-
- (mvenv) $ python manage.py migrate
- Operations to perform:
- [...]
- Applying sessions.0001_initial... OK
-
-
- (mvenv) $ python manage.py createsuperuser
-
-
-## Опублікуємо наш блог як веб-додаток
-
-Тепер наш код на PythonAnywhere, віртуальне середовище готове, статичні файли зібрані, база даних встановлена. Ми готові до публікації веб-додатку!
-
-Перейдемо до панелі керування PythonAnywhere, натиснувши на лого сайту і виберемо вкладку **Web**. Тепер натиснемо **Add a new web app**.
-
-Після підтвердження нашого доменного імені, виберемо ручне налаштування (**manual configuration**) у діалоговому вікні, зверніть увагу: варіант "Django" нам *не годиться*. Далі виберемо **Python 3.4** і натиснемо Next для завершення.
-
-> **Примітка** Пересвідчіться, що ви вибрали варіант "Manual configuration", а не "Django". Ми занадто круті для стандартних налаштувань PythonAnywhere для Django ;-)
-
-
-### Налаштуємо virtualenv
-
-Ми опинились на сторінці налаштувань веб-додатку на PythonAnywhere. Сюди слід переходити, якщо ви хочете зробити якісь зміни до додатку на сервері.
-
-
-
-
-У розділі "Vitrualenv" натиснемо на червоний текст "Enter the path to a virtualenv" (введіть шлях до virtualenv) і напишемо: `/home//my-first-blog/myvenv/`. Перед тим, як продовжити, натиснемо синю кнопку з галочкою, щоб зберегти шлях.
-
-> **Примітка** Замініть на своє ім'я користувача. Якщо ви помилитесь, PythonAnywhere покаже вам невеличке попередження.
-
-
-### Сконфігуруємо WSGI файл
-
-Django використовує у роботі "WSGI протокол" - стандарт взаємодії веб-додатків на Python із веб-серверами. Він підтримується PythonAnywhere. Отже, поредагувавши конфігураційний файл WSGI, ми дозволимо PythonAnywhere розпізнати наш блог на Django.
-
-Перейдемо за посиланням напроти "WSGI configuration file" (у розділі "Code" близько до початку сторінки - посилання матиме якусь таку назву: `/var/www/_pythonanywhere_com_wsgi.py`). Ми опинились на сторінці з редактором.
-
-Зітремо весь вміст файлу і замінимо його таким:
-
-```python
-import os
-import sys
-
-path = '/home//my-first-blog' # use your own username here
-if path not in sys.path:
- sys.path.append(path)
-
-os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
-
-from django.core.wsgi import get_wsgi_application
-from whitenoise.django import DjangoWhiteNoise
-application = DjangoWhiteNoise(get_wsgi_application())
-```
-
-> **Примітка** Не забудьте вказати своє ім'я користувача замість ``
-> **Примітка** Третій рядок вказує PythonAnywhere, як знайти наш додаток. Дуже важливо, щоб цей шлях був коректним і щоб не було зайвих пробілів. Інакше ви побачите "ImportError" в логах помилок.
-
-Завдання цього файлу - розповісти PythonAnywhere, де живе наш веб-додаток і як знайти файл із налаштуванням Django. Також він налаштовує інструмент для статичних файлів "whitenoise".
-
-Натиснемо **Save** і перейдемо назад до вкладки **Web**.
-
-Готово! Натискаємо на велику зелену **Reload** кнопку і можемо глянути на свій веб-додаток. Посилання на нього вгорі сторінки.
-
-
-## Підказки для відлагодження (debug)
-
-Якщо відвідавши ваш сайт, побачили повідомлення про помилку, найперше, куди слід подивитись - це **лог помилок**. Перейти до нього можна із [вкладки Web](https://www.pythonanywhere.com/web_app_setup/) PythonAnywhere. Гляньте, чи є там повідомлення про помилки; найновіші будуть внизу файлу. Найчастіше трапляються такі проблеми:
-
-- Забули ввести одну із команд у консолі: створення віртуального середовища, його активацію, встановлення туди Django, збирання статичних файлів, міграцію бази даних.
-
-- Зробили опечатку в шляху до virtualenv на вкладці Web - в такому разі, там можна буде побачити маленьке червоне повідомлення про помилку.
-
-- Помилились у конфігураційному файлі WSGI - перевірте шлях до своєї директорії my-first-blog.
-
-- Ви точно вибрали таку ж версію Python для віртуального середовища, як і для веб-додатку? Обидві повинні мати версію 3.4.
-
-- Ось деякі [загальні підказки для налагодження у PythonAnywhere вікі](https://www.pythonanywhere.com/wiki/DebuggingImportError).
-
-Пам'ятайте, що ваш тренер може допомогти!
+ To https://github.com/ola/my-first-blog.git
+
+ * [new branch] main -> main
+ Branch main set up to track remote branch main from origin.
+
+
-# Ми вийшли у світ!
+Your code is now on GitHub. Go and check it out! You'll find it's in fine company – [Django](https://github.com/django/django), the [Django Girls Tutorial](https://github.com/DjangoGirls/tutorial), and many other great open source software projects also host their code on GitHub. :)
-На сторінці за замовчуванням нашого сайту має бути напис "Welcome to Django" так само, як і на вашому локальному комп'ютері. Спробуємо додати `admin` у кінці URL і опинимось у панелі адміністратора. Використаємо для входу логін і пароль та побачимо, що тут можна додавати нові пости на сервер.
+{% include "/deploy/pythonanywhere.md" %}
+# Check out your site!
-*ДОБРЯЧЕ* похваліть себе! Розгортання на сервер - один з найхитромудріших етапів веб-розробки. Зазвичай люди витрачають дні, щоб усе запрацювало. Але вам вдалось вийти у справжній інтернет, запросто!
+The default page for your site should say "It worked!", just like it does on your local computer. Try adding `/admin/` to the end of the URL, and you'll be taken to the admin site. Log in with the username and password, and you'll see you can add new Posts on the server -- remember, the posts from your local test database were not sent to your live blog.
+Once you have a few posts created, you can go back to your local setup (not PythonAnywhere). From here you should work on your local setup to make changes. This is a common workflow in web development – make changes locally, push those changes to GitHub, and pull your changes down to your live Web server. This allows you to work and experiment without breaking your live Web site. Pretty cool, huh?
+Give yourself a *HUGE* pat on the back! Server deployments are one of the trickiest parts of web development and it often takes people several days before they get them working. But you've got your site live, on the real Internet!
\ No newline at end of file
diff --git a/uk/deploy/install_git.md b/uk/deploy/install_git.md
index cd11f616a69..4156f616175 100644
--- a/uk/deploy/install_git.md
+++ b/uk/deploy/install_git.md
@@ -1,28 +1,83 @@
+Git - це "система контролю версій", яка використовується багатьма розробниками. Ця програма дозволяє відслідковувати зміни до файлів з часом так, що ви можете повернутись до певних версій пізніше. A bit like the "track changes" feature in word processor programs (e.g., Microsoft Word or LibreOffice Writer), but much more powerful.
-### Windows
+## Встановлення Git
-Git можна завантажити з [git-scm.com](https://git-scm.com/). Ви можете натискати "next next next" на всіх кроках окрім одного. На п’ятому кроці, названому "Adjusting your PATH environment", виберіть "Run Git and associated Unix tools from the Windows command-line" (нижня опція). Крім цього, стандартні налаштування добрі. Вимкніть закінчення рядків в стилі Windows, ввімкніть в стилі Unix, вони кращі.
+
-### Mac OS
+Ви можете завантажити Git з [git-scm.com](https://git-scm.com/). You can hit "next" on all steps except for two: in the step where it asks to choose your editor, you should pick Nano, and in the step entitled "Adjusting your PATH environment", choose "Use Git and optional Unix tools from the Windows Command Prompt" (the bottom option). Крім цього, стандартні налаштування добрі. Вимкніть закінчення рядків в стилі Windows, ввімкніть в стилі Unix, вони кращі.
-Завантажте Git з [git-scm.com](https://git-scm.com/) і просто слідуйте вказівкам.
+During installation, if you are presented with the option of "Adjusting the name of the initial branch in new repositories", please choose to "Override the default" and use "main". This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
+Do not forget to restart the command prompt or PowerShell after the installation finished successfully.
-### Linux
+
-Якщо Git не встановлений, то він має бути доступний через менеджер пакетів, тому спробуйте:
+Download Git from [git-scm.com](https://git-scm.com/) and follow the instructions.
+During installation, if you are presented with the option of "Adjusting the name of the initial branch in new repositories", please choose to "Override the default" and use "main". This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
-#### Debian або Ubuntu
+> **Note** If you are running OS X 10.6, 10.7, or 10.8, you will need to install the version of git from here: [Git installer for OS X Snow Leopard](https://sourceforge.net/projects/git-osx-installer/files/git-2.3.5-intel-universal-snow-leopard.dmg/download)
- $ sudo apt install git
+
+
-#### Fedora
+{% filename %}command-line{% endfilename %}
- $ sudo dnf install git
+```bash
+$ sudo apt install git
+```
+### Adjusting your default branch name
-#### openSUSE
+This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
- $ sudo zypper install git
+{% filename %}command-line{% endfilename %}
+
+ $ git config --global --add init.defaultBranch main
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+```bash
+$ sudo dnf install git
+```
+
+### Adjusting your default branch name
+
+This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
+
+{% filename %}command-line{% endfilename %}
+
+ $ git config --global --add init.defaultBranch main
+
+
+
+
+
+
+{% filename %}command-line{% endfilename %}
+
+```bash
+$ sudo zypper install git
+```
+
+### Adjusting your default branch name
+
+This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
+
+{% filename %}command-line{% endfilename %}
+
+ $ git config --global --add init.defaultBranch main
+
+
+
\ No newline at end of file
diff --git a/uk/deploy/pythonanywhere.md b/uk/deploy/pythonanywhere.md
new file mode 100644
index 00000000000..d3d63ae6ae4
--- /dev/null
+++ b/uk/deploy/pythonanywhere.md
@@ -0,0 +1,88 @@
+# Setting up our blog on PythonAnywhere
+
+## Sign up for a PythonAnywhere account
+
+> **Note** You might have already created a PythonAnywhere account earlier during the install steps – if so, no need to do it again.
+>
+> {% include "/deploy/signup_pythonanywhere.md" %}
+
+
+## Configuring our site on PythonAnywhere
+
+Go back to the main [PythonAnywhere Dashboard](https://www.pythonanywhere.com/) by clicking on the logo, and choose the option to start a "Bash" console – that's the PythonAnywhere version of a command line, just like the one on your computer.
+
+
+
+> **Note** PythonAnywhere is based on Linux, so if you're on Windows, the console will look a little different from the one on your computer. Deploying a web app on PythonAnywhere involves pulling down your code from GitHub, and then configuring PythonAnywhere to recognise it and start serving it as a web application. There are manual ways of doing it, but PythonAnywhere provides a helper tool that will do it all for you. Let's install it first:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+```
+$ pip{{ book.pa_py_version }} install --user pythonanywhere
+```
+
+That should print out some things like `Collecting pythonanywhere`, and eventually end with a line saying `Successfully installed (...) pythonanywhere- (...)`.
+
+Now we run the helper to automatically configure our app from GitHub. Type the following into the console on PythonAnywhere (don't forget to use your GitHub username in place of ``, so that the URL matches the clone URL from GitHub):
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+```
+$ pa_autoconfigure_django.py --python={{ book.pa_py_version }} https://github.com//my-first-blog.git
+```
+
+As you watch that running, you'll be able to see what it's doing:
+
+- Downloading your code from GitHub
+- Creating a virtualenv on PythonAnywhere, just like the one on your own computer
+- Updating your settings file with some deployment settings
+- Setting up a database on PythonAnywhere using the `manage.py migrate` command
+- Setting up your static files (we'll learn about these later)
+- And configuring PythonAnywhere to serve your web app via its API
+
+On PythonAnywhere all those steps are automated, but they're the same steps you would have to go through with any other server provider.
+
+The main thing to notice right now is that your database on PythonAnywhere is actually totally separate from your database on your own computer, so it can have different posts and admin accounts. As a result, just as we did on your own computer, we need to initialize the admin account with `createsuperuser`. PythonAnywhere has automatically activated your virtualenv for you, so all you need to do is run:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+```
+(ola.pythonanywhere.com) $ python manage.py createsuperuser
+```
+
+Type in the details for your admin user. Best to use the same ones as you're using on your own computer to avoid any confusion, unless you want to make the password on PythonAnywhere more secure.
+
+Now, if you like, you can also take a look at your code on PythonAnywhere using `ls`:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+```
+(ola.pythonanywhere.com) $ ls
+blog db.sqlite3 manage.py mysite requirements.txt static
+(ola.pythonanywhere.com) $ ls blog/
+__init__.py __pycache__ admin.py apps.py migrations models.py
+tests.py views.py
+```
+
+You can also go to the "Files" page and navigate around using PythonAnywhere's built-in file browser. (From the Console page, you can get to other PythonAnywhere pages from the menu button in the upper right corner. Once you're on one of the pages, there are links to the other ones near the top.)
+
+
+## You are now live!
+
+Your site should now be live on the public Internet! Click through to the PythonAnywhere "Web" page to get a link to it. You can share this with anyone you want. :)
+
+
+> **Note** This is a beginners' tutorial, and in deploying this site we've taken a few shortcuts which aren't ideal from a security point of view. If and when you decide to build on this project, or start a new project, you should review the [Django deployment checklist](https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/) for some tips on securing your site.
+
+## Debugging tips
+
+
+If you see an error while running the `pa_autoconfigure_django.py` script, here are a few common causes:
+
+- Forgetting to create your PythonAnywhere API token.
+- Making a mistake in your GitHub URL
+- If you see an error saying *"Could not find your settings.py"*, it's probably because you didn't manage to add all your files to Git, and/or you didn't push them up to GitHub successfully. Have another look at the Git section above
+- If you previously signed up for a PythonAnywhere account and had an error with collectstatic, you probably have an older version of SQLite (eg 3.8.2) for your account. In that case, sign up for a new account and try the commands in the PythonAnywhere section above.
+
+
+If you see an error when you try to visit your site, the first place to look for some debugging info is in your **error log**. You'll find a link to this on the PythonAnywhere ["Web" page](https://www.pythonanywhere.com/web_app_setup/). See if there are any error messages in there; the most recent ones are at the bottom.
+
+There are also some [general debugging tips on the PythonAnywhere help site](http://help.pythonanywhere.com/pages/DebuggingImportError).
+
+And remember, your coach is here to help!
diff --git a/uk/deploy/signup_pythonanywhere.md b/uk/deploy/signup_pythonanywhere.md
index 12ee7b6ca76..4123c088df3 100644
--- a/uk/deploy/signup_pythonanywhere.md
+++ b/uk/deploy/signup_pythonanywhere.md
@@ -1,8 +1,19 @@
+"Пайтон всюди" це сервіс для перевірки коду на мові Пайтон у "хмарному" середовищі. Ми використовуватимемо його для розміщення файлів веб-сайту, наживо та в Інтернеті.
-Тепер час для створення безкоштовного "Beginner" акаунту на PythonAnywhere.
+Ми запустимо блог, котрий написаний на "Пайтон всюди". Зареєструй профіль "Новачка" на "Пайтон всюди" (можна вибрати безкоштовну версію без реєстрації банківської карти).
-* [www.pythonanywhere.com](https://www.pythonanywhere.com/)
+* [www.pythonanywhere.com ](https://www.pythonanywhere.com/)
+
-> **Примітка** При виборі імені користувача, пам'ятайте, що URL-адреса блогу матиме вигляд `yourusername.pythonanywhere.com`, так що зупиніться або на вашому ніку, або на імені, пов'язаному з тематикою блогу.
+> **Примітка** При виборі назви користувача пам'ятай, що посилання твого блогу матиме наступний вигляд `назвакористувача.pythonanywhere.com`, тому обирай або своє власне ім'я, або назву тематики свого блогу. При цьому, запам'ятай свій пароль (додай його до свого менеджера паролів, якщо ти таким користуєшся).
+## Як створити токен API у "Пайтон всюди"
+
+Це одноразова дія. Коли зареєструєшся на сайті "Пайтон всюди", завантажиться сторінка робочої панелі. Знайди посилання до своєї "Профільної" сторінки у верхньому правому куті:
+
+
+
+потім вибери закладку "Токен API" та натисни клавішу із повідомленням "Створити новий токен API".
+
+
\ No newline at end of file
diff --git a/uk/django/README.md b/uk/django/README.md
old mode 100755
new mode 100644
index 2c30e036c46..302d6edcf50
--- a/uk/django/README.md
+++ b/uk/django/README.md
@@ -1,27 +1,27 @@
# Що таке Django?
-Django (_/ˈdʒæŋɡoʊ/ джанго_) - безкоштовний і відкритий фреймворк для створення веб додатків, написаний мовою програмування Python. Веб фреймворк - набір компонентів, які допомагають розробляти веб-сайти швидше і простіше.
+Django (/ˈdʒæŋɡoʊ/ *джан-го*) це безкоштовний та відкритий програмний каркас для створення вебзастосунків, написаний мовою Пайтон. Веб-каркас - це набір компонентів, які допомагають розробляти веб-сайти швидше і простіше.
-При побудові веб-сайту, ви завжди потребуєте схожого набору компонентів: спосіб управління авторизацією користувача (створення акаунту, вхід, вихід), панель управління, форми, спосіб завантажити файли, тощо.
+При побудові веб-сайту, ви завжди потребуєте схожого набору компонентів: способу управління авторизацією користувача (створення акаунту, вхід, вихід), панелі управління, форм, способу завантажити файли, тощо.
-На щастя для вас інші люди вже давно помітили, що веб розробники зіштовхуються з подібними проблемами під час розробки нового сайту, отже вони об'єднались в команду і створили фреймворки (Django є одним з таких), що дають вам вже готові до використання компоненти.
+На щастя, вже давно виявлено певні проблеми, із якими зіштовхуються веб-розробники під час написання нового сайту. Тому вони об'єднались та створили програмні каркаси (Джанго як один із них), що забезпечують готові компоненти для використання.
-Фреймворки існують для того, щоб вберегти вас від необхідності повторно винаходити велосипед і допомогти зменшити деякі накладні витрати під час розробки нового сайту.
+Програмні каркаси були створені для того, щоб вберегти розробників від зайвої роботи та полегшити роботу під час розробки нового сайту.
-## Навіщо вам потрібен фреймворк?
+## Навіщо вам потрібен цей фреймворк?
-Щоб зрозуміти для чого насправді розроблений Django, потрібно ближче розглянути роботу серверу. Першочергово сервер повинен знати про те, що ви бажаєте щоб він обслуговував ваш сайт.
+Щоб зрозуміти, для чого насправді створено Джанго, треба ближче розглянути роботу серверів. По-перше, сервер має розуміти, що кінцевим результатом повинна бути веб-сторінка.
-Уявіть собі поштову скриньку (порт), котра моніториться на вхідні листи (запити). Це здійснюється веб сервером. Веб сервер читає листа і відсилає відповідь із веб-сторінкою. Але коли ви бажаєте відправити дещо, вам потрібно мати деякий вміст. І Django є інструментом, котрий допомагає вам створити цей контент.
+Уявіть собі поштову скриньку (порт), котра моніториться на вхідні листи (запити). Це здійснюється веб сервером. Веб-сервер читає листа, а потім надсилає відповідб із веб-сторінки. Але коли ви бажаєте відправити дещо, вам потрібно мати деякий вміст. І Джанго є інструментом, котрий допомагає вам створити такий контент.
## Що трапляється коли хтось надсилає запит на веб-сайт з вашого серверу?
-Коли на веб-сервер надходить запит, він перенаправляється на Django, котрий намагається з'ясувати на що конкретно був запит. Спочатку береться адреса веб-сторінки і Django намагається з'ясувати, що робити. Ця частина роботи здійснюється таким компонентом Django як __urlresolver__ (зауважте, що адреса веб-сайту називається URL - Uniform Resource Locator - отже ім'я *urlresolver* має сенс). Це не дуже складний елемент - вилучається список шаблонів і відбуваються спроби знайти підходящий URL. Django перевіряє шаблони у порядку слідування і якщо якийсь із них відповідає адресі веб-сторінки Django надсилає запит до асоційованої функції (котра має назву *view*).
+Коли запит надходить на веб-сервер, він передається до Джанго, котрий намагається з'ясувати, чого насправді стосується запит. Він спочатку використовує адресу веб-сторінки та намагається з'ясувати, що далі робити. Ця частина виконується компонентом **urlresolver** програми Джанго (зверніть увагу, що адреса веб-сторінки називається URL - універсальний відслідковувач ресурсу - тому назва *urlresolver* є цілком виправданою). Такий процес нескладний: компонент використовує список шаблонів та намагається підібрати відповідне посилання. Джанго перевіряє шаблони зверху вниз та, якщо зназодить співпадіння, надсилає запит до пов'язаної функції (котра називається *view*).
-Уявіть собі листоношу з листом. Він йде по вулиці і звіряє номер кожного будинку з тим, що вказаний в адресі отримувача. Якщо номер співпадає, він кладе листа в скриньку. Аналогічним чином працює і urlresolver!
+Уявіть листоношу з листом. Він йде по вулиці і звіряє номер кожного будинку з тим, що вказаний в адресі отримувача. Якщо номер співпадає, він кладе листа в скриньку. Аналогічним чином працює urlresolver!
-Всередині функції *view* відбуваються найцікавіші речі: щоб знайти деяку інформацію, ми можемо подивитися в базу даних. Можливо, користувач може попросити зробити певні зміни даних? На зразок листа, що говорить "Будь ласка, змініть опис моєї роботи." Елемент *view* може перевірити чи дозволено вам це зробити, потім оновлює опис роботи для вас і відправляє зворотнє повідомлення: "Виконано!". Далі блок *view* генерує відповідь і Django може відправити її до веб браузера користувача.
+Найцікавіша робота виконується функцією *view*: можна перевірити базу даних щодо якоїсь конкретної інформації. Можливо, користувач надістав запит на зміну певних даних? Як у випадку листа: "Прошу змінити опис моєї роботи". Функція *view* може перевірити, чи користувач має доступ до таких змін, а потім оновити опис роботи та надіслати повідомлення: "Готово!". Потім функція *view* створює відповідь, а Джанго може надіслати її до веб-браузера користувача.
-Звичайно, вище наведені пояснення є трохи спрощеними, але вам не потрібно знати усіх технічних деталей поки що. Достатньо мати загальне уявлення.
+Опис роботи сервісу, наведений раніше, досить спрощений, але спочатку не потрібно знати усі технічні деталі. Досить володіти і загальною ідеєю.
-Отже замість того, щоб надто занурюватись у деталі, ми просто почнемо щось створювати із використанням Django і вивчимо усі важливі складові на цьому шляху!
+Отже, замість заглиблюватись у деталі, ми розпочнемо створення чогось за допомогою Джанго та вивчимо усі потрібні частини його роботи поступово!
\ No newline at end of file
diff --git a/uk/django_admin/README.md b/uk/django_admin/README.md
old mode 100755
new mode 100644
index de2e6babcf2..31eb7312a38
--- a/uk/django_admin/README.md
+++ b/uk/django_admin/README.md
@@ -1,8 +1,10 @@
-# Django адміністратор
+# Панель адміністрування Django
-Щоб додавати, редагувати і видаляти пости, які ми щойно змоделювали, використаємо Django адміністратор.
+Для того, щоб додавати, редагувати і видаляти пости, які ми щойно змоделювали, ми будемо використовувати панель адміністрування Django.
-Відкриймо файл `blog/admin.py` і замінимо його зміст на наступні рядки:
+Давайте відкриємо файл `blog/admin.py` у редакторі коду і замінимо його вміст на наступне:
+
+{% filename %}blog/admin.py{% endfilename %}
```python
from django.contrib import admin
@@ -13,29 +15,43 @@ admin.site.register(Post)
Як можна побачити, ми імпортуємо (включаємо) модель посту Post визначену у попередньому розділі. Щоб зробити нашу модель видимою на сторінці адміністратора, потрібно зареєструвати модель за допомогою `admin.site.register(Post)`.
-Гаразд, час поглянути на нашу модель Post. Не забудьте виконати в консолі команду `python manage.py runserver` для того щоб запустити сервер. Відкрийте браузер, введіть адресу http://127.0.0.1:8000/admin/ і ви побачите сторінку входу схожу на цю:
+Гаразд, час поглянути на нашу модель Post. Не забудьте виконати в консолі команду `python manage.py runserver` для того щоб запустити сервер. Відкрийте браузер і введіть адресу http://127.0.0.1:8000/admin/. Ви побачите сторінку входу яка виглядає наступним чином:

-Щоб ввійти, потрібно створити *суперкористувача (superuser)* - користувача, котрий може контролювати все на сайті. Поверніться до командного рядка, наберіть `python manage.py createsuperuser`, і натисніть клавішу Enter. Коли вас про це запитають, введіть логін користувача (маленькими буквами без пропусків), адресу email та пароль. Не хвилюйтеся, що ви не можете бачити пароль який вводите – так і повинно бути. Просто введіть його і натисніть `Enter` щоб продовжити. Вихідний результат має виглядати наступним чином (де ім'я користувача і email повинні містити ваші дані):
+Щоб увійти, нам потрібно створити *superuser* (суперкористувача) - обліковий запис користувача, який має контроль над усім, що є на сайті. Поверніться до командного рядка, введіть `python manage.py createsuperuser`і натисніть Enter.
+
+> Пам'ятайте, що для запису нових команд, поки веб-сервер працює, відкрийте нове вікно терміналу і активуйте Ваше віртуальне середовище (virtualenv). Ми розглядали, як написати нові команди в розділі **Ваш перший Django проект!** в секції **Запуск веб серверу**.
+
+{% filename %}Mac OS X або Linux:{% endfilename %}
(myvenv) ~/djangogirls$ python manage.py createsuperuser
- Username: admin
- Email address: admin@admin.com
+
+
+{% filename %}Windows:{% endfilename %}
+
+ (myvenv) C:\Users\Name\djangogirls> python manage.py createsuperuser
+
+
+Коли вас про це запитають, введіть ім'я користувача (маленькими буквами без пробелів), адресу електронної пошти та пароль. **Не хвилюйтеся, що ви не можете бачити пароль, який вводите – так повинно бути.** Введіть його і натисніть `Enter` , щоб продовжити. Вихідний результат має виглядати наступним чином (де ім'я користувача і електронна пошта повинні бути вашими власними):
+
+ Username: ola
+ Email address: ola@example.com
Password:
Password (again):
Superuser created successfully.
+
Поверніться до вашого браузера і здійсніть вхід використовуючи логін та пароль щойно створеного суперкористувача; ви маєте побачити робочу панель адміністратора Django.
-
+
-Перейдіть в Posts та поекспериментуйте з ними трошки. Додайте п’ять-шість постів. Не переживайте за вміст, можете просто скопіювати якийсь текст з цього підручника щоб зберегти час :).
+Перейдіть до постів і трохи поекспериментуйте з ними. Додайте 5-6 постів до блогу. Не хвилюйтесь про зміст - його можна побачити лише на локальному комп'ютері — ви можете скопіювати якийсь текст з цього туторіалу, щоб зберегти час. :)
-Переконайтесь у тому, що принаймні два або три поста (але не всі) мають встановлену дату публікації. Це стане у нагоді пізніше.
+Переконайтесь у тому, що принаймні два або три поста (але не всі) мають встановлену дату публікації. Це стане у нагоді пізніше.
-
+
-Якщо бажаєте дізнатися більше про Django admin, гляньте документацію Django: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/
+If you want to know more about Django admin, you should check Django's documentation: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/
-Це напевне гарний час щоб налити кави (чи чаю) чи з’їсти щось щоб перезарядитися. Ви створили свою першу модель Django і заслуговуєте на короткий тайм-аут!
+Це напевне гарний час щоб налити кави (чи чаю) чи з’їсти щось щоб перезарядитися. Ви створили свою першу модель Django і заслуговуєте на короткий тайм-аут!
\ No newline at end of file
diff --git a/uk/django_forms/README.md b/uk/django_forms/README.md
old mode 100755
new mode 100644
index e773c22d764..3611e1c063c
--- a/uk/django_forms/README.md
+++ b/uk/django_forms/README.md
@@ -1,8 +1,8 @@
# Django форми
-Остання річ, яку б ми хотіли зробити з нашим сайтом, це створити зручний спосіб додавати і редагувати пости. Django адміністратор - це звісно круто, але водночас він є досить складним для налаштування. З формами ми будемо мати абсолютний контроль над нашим інтерфейсом - можемо робити майже усе, що заманеться!
+Остання річ, яку б ми хотіли зробити з нашим сайтом це створити зручний спосіб додавати і редагувати пости. Django адміністратор це звісно круто, але водночас він є досить складним для налаштування. За допомогою форм ми матимемо абсолютний контроль над нашим інтерфейсом - ми можемо робити майже все, що тільки можемо собі уявити!
-Що тішить стосовно Django форм, так це те, що останні можна визначати як з нуля, так і створювати засобами `ModelForm`, що зберігають результат форми всередині моделі.
+Що тішить стосовно Django форм так це те, що останні можна визначати як з нуля так і створювати засобами `ModelForm`, що зберігають результат форми всередині моделі.
Це саме те, що нам потрібно: створимо форму для нашої моделі `Post`.
@@ -12,8 +12,11 @@
blog
└── forms.py
+
-Добре, відкриємо цей файл і наберемо наступний код:
+Гаразд, давайте відкриємо його в редакторі коду і наберемо такий код:
+
+{% filename %}blog/forms.py{% endfilename %}
```python
from django import forms
@@ -27,91 +30,115 @@ class PostForm(forms.ModelForm):
fields = ('title', 'text',)
```
-Спершу потрібно імпортувати Django форми (`from django import forms`) і, очевидно, нашу модель `Post` (`from .models import Post`).
+Спочатку нам потрібно імпортувати форми Django (`from django import forms`) та нашу модель (`from .models import Post`).
-`PostForm`, як ви можливо зазначили, це ім'я нашої форми. Ми маємо повідомити Django, що наша форма є `ModelForm` (таким чином Django здійснить для нас певні магічні маніпуляції) і рядок `forms.ModelForm` відповідає за це.
+`PostForm`, як ви можливо зазначили, ім'я нашої форми. Нам потрібно сказати Django, що ця форма є `ModelForm` ( тому Django зробить для нас трішки магії ) – ` і рядок.ModelForm` відповідає за це.
Далі, у нас є `class Meta`, де ми вказуємо для Django котра з моделей має бути використана для створення форми (`model = Post`).
-Зрештою, можемо зазначити, якими полями має закінчуватись наша форма. В даному сценарії ми би хотіли опублікувати такі параметри, як заголовок `title` і зміст `text`, дані про автора `author`, що автоматично встановлюються як дані користувача, який наразі залогінився (тобто ви!), а також дата створення `created_date`, яка автоматично встановлюється при створенні поста (тобто в коді), вірно ж?
+Зрештою, можемо зазначити якими полями має закінчуватись наша форма. У цьому сценарії ми хочемо опублікувати такі параметри як заголовок `title` і зміст `text`, дані про автора `author`, що автоматично встановлюються як дані особи, яка наразі увійшла в систему (тобто ви!), а також дата створення `created_date`, яка автоматично встановлюється при створенні публікації (тобто в коді), вірно ж?
І це все! Все що нам потрібно тепер зробити це використати форму в блоці *view* і відобразити її в шаблоні.
-Отже, знову ми створимо: посилання на сторінку, адресу (URL), вид (view) і шаблон (template).
+То ж ще раз ми створимо посилання на сторінку, URL- адресу, вид і шаблон.
## Посилання на сторінку з формою
-Час відкрити `blog/templates/blog/base.html`. Додамо лінк всередині блоку `div` із ім'ям `page-header`:
+Перед тим, як додати посилання, нам потрібно використати деякі значки, як кнопки для посилання. For this tutorial, download [file-earmark-plus.svg](https://raw.githubusercontent.com/twbs/icons/main/icons/file-earmark-plus.svg) and save it in the folder `blog/templates/blog/icons/`
+
+> Примітка: для того, щоб завантажити зображення SVG, відкрийте контекстне меню за посиланням (зазвичай натисканням правої кнопки миші) і виберіть "Зберегти посилання як". In the dialog asking you where to save the file, navigate to the `djangogirls` directory of your Django project, and within that to subdirectory `blog/templates/blog/icons/`, and save the file there.
+
+It's time to open `blog/templates/blog/base.html` in the code editor. Тепер ми можемо використовувати значок файлу в базовому шаблоні наступним чином. У елементі `div` всередині секції `header`, додаємо посилання перед елементом `h1`:
+
+{% filename %}blog/templates/blog/base.html{% endfilename %}
```html
-
+
+ {% include './icons/file-earmark-plus.svg' %}
+
```
-Зауважте, що ми хочемо запустити наше нове відображення `post_new`. Клас `"glyphicon glyphicon-plus"` постачається bootstrap темою, яку ми використовуємо, і буде відображати знак плюса.
+Зверніть увагу, що ми хочемо назвати наш новий огляд `post_new`. Значок [SVG](https://icons.getbootstrap.com/icons/file-earmark-plus/) представлений [Bootstrap Icons](https://icons.getbootstrap.com/) і він відобразить значок сторінки зі знаком плюс. Ми використовуємо директиву шаблону Django під назвою `include`. Це вводить вміст файлу до шаблону Django. Веббраузер знає, як обробляти цей тип контенту без будь-якої подальшої обробки.
+
+> Ви можете завантажити всі значки Bootstrap [here](https://github.com/twbs/icons/releases/download/v1.1.0/bootstrap-icons-1.1.0.zip). Розархівуйте файл і скопіюйте всі файли з зображеннями SVG у нову папку `blog/templates/blog/` під назвою `icons`. Таким чином, Ви можете отримати доступ до такої іконки як `pencil-fill.svg`, використовуючи шлях до файлу `blog/templates/blog/icons/pencil-fill.svg`
-Після додавання відповідного рядка, ваш html файл має виглядати наступним чином:
+Після редагування рядку, Ваш HTML файл повинен виглядати таким чином:
+
+{% filename %}blog/templates/blog/base.html{% endfilename %}
```html
{% load static %}
+
Django Girls blog
-
-
+
-
+
```
-Після збереження та оновлення сторінки http://127.0.0.1:8000 ви звісно побачите знайому помилку `NoReverseMatch`, правда?
+Після зберігання та оновлення сторінки http://127.0.0.1:8000 Ви побачите знайому помилку `NoReverseMatch`. Чи так це насправді?
## URL
-Відкриваємо `blog/urls.py` і додаємо рядок:
+Відкриваємо `blog/urls.py` у редакторі коду та додаємо рядок:
+
+{% filename %}blog/urls.py{% endfilename %}
```python
- url(r'^post/new/$', views.post_new, name='post_new'),
+шлях('post/new/', views.post_new, name='post_new'),
```
-Остаточно код буде виглядати так:
+Остаточний код буде виглядати так:
+
+{% filename %}blog/urls.py{% endfilename %}
```python
-from django.conf.urls import url
+from django.urls import path
from . import views
urlpatterns = [
- url(r'^$', views.post_list, name='post_list'),
- url(r'^post/(?P[0-9]+)/$', views.post_detail, name='post_detail'),
- url(r'^post/new/$', views.post_new, name='post_new'),
+ path('', views.post_list, name='post_list'),
+ path('post//', views.post_detail, name='post_detail'),
+ path('post/new/', views.post_new, name='post_new'),
]
```
-Після оновлення сайту бачимо помилку `AttributeError`, оскільки відображення `post_new` не реалізоване. Давайте додамо цей вид прямо зараз.
+After refreshing the site, we see an `AttributeError`, since we don't have the `post_new` view implemented. Let's add it right now.
+
+## post_new view
-## Відображення post_new
+Тепер відкриваємо у редакторі коду файл `blog/views.py` і додаємо наступні рядки з рештою рядків `from`:
-Час відкрити файл `blog/views.py` і додати наступні рядки:
+{% filename %}blog/views.py{% endfilename %}
```python
from .forms import PostForm
```
-і функцію для потрібного *відображення*:
+And then our *view*:
+
+{% filename %}blog/views.py{% endfilename %}
```python
def post_new(request):
@@ -119,46 +146,52 @@ def post_new(request):
return render(request, 'blog/post_edit.html', {'form': form})
```
-Щоб створити нову форму `Post`, нам потрібно викликати функцію `PostForm()` і передати її до шаблону. Повернемося пізніше до цього відображення, а зараз давайте створимо шаблон для форми.
+Щоб створити нову форму `Post`, потрібно викликати `PostForm` і перенести її до шаблону. Ми повернемось до цього *зображення* пізніше, а зараз створімо шаблон для форми.
## Шаблон
-Нам потрібно створити файл `post_edit.html` у папці `blog/templates/blog`. Щоб створити форму нам знадобиться декілька речей:
+Потрібно створити файл `post_edit.html` у дирекції `blog/templates/blog0>, і відкрити його у редакторі коду. Для того, щоб створити форму, необхідні декілька речей:
+
+
+
Ми маємо відобразити форму. Можемо це зробити, наприклад, за допомогою {% raw %}{{ form.as_p }}`{% endraw %}.
+
+* Вказаний рядок має бути розміщений всередині тега форми HTML: `
`.
+* Нам знадобиться кнопка "Зберегти" - `Save`. Створимо її в HTML за допомогою виразу ``.
+* І нарешті зразу після відкриття тегу форми ``
-- нам знадобиться кнопка Зберегти - `Save`. Створимо її в HTML за допомогою: ``
-- і нарешті, одразу після відкриваючого тегу `
{% endblock %}
```
-Час перезавантажитись! Йой! Ваша форма відображується!
+Час оновити сторінку! Гаразд! Ваша форма відображується!
-
+
-Але, одну хвилиночку! Коли ви набираєте щось в полях `title` і `text`, та намагаєтесь зберегти зміни - що ж тоді станеться?
+Зачекайте! Коли Ви набираєте щось в полях `title` і `text`, намагаючись зберегти це, то що може статися?
-А нічого! Ми знову опинимося на тій самій сторінці, і наш текст зникне... і жодного нового поста. Отже, що ж пішло не так?
+Нічого! Ми знову опинимось на цій самій сторінці та наш текст зникне...жодного нового поста також не буде додано. Отже, що пішло не так?
-Відповідь: нічого. Мусимо проробити трохи більше роботи з нашим блоком *view*.
+Відповідь: нічого. Ми мусимо виконати трохи більше роботи в нашому *view<0>.
## Зберігання форми
-Відкрийте `blog/views.py` знову. Наразі все що ми маємо в `post_new` це:
+Відкрийте `log/views.py` ще раз у редакторі коду. Наразі все, що ми маємо в `post_new` це:
+
+{% filename %}blog/views.py{% endfilename %}
```python
def post_new(request):
@@ -166,9 +199,11 @@ def post_new(request):
return render(request, 'blog/post_edit.html', {'form': form})
```
-Коли ми відправляємо форму, ми потрапляємо в той самий view, але цього разу маємо більше даних в `request`, а якщо точніше - в `request.POST` (ця назва не пов’язана з блогерським терміном "пост", вона пов’язана з тим що ми "постимо" дані). Пам'ятайте, що у файлі HTML наше визначення `