diff --git a/.github/list_languages b/.github/list_languages new file mode 100755 index 00000000000..5bc27d43f0c --- /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[:2])}') + for language in languages[:2]: + print(language) + + +if __name__ == '__main__': + main() diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml new file mode 100644 index 00000000000..a1c52ae845b --- /dev/null +++ b/.github/workflows/translations.yml @@ -0,0 +1,52 @@ +name: Update translations + +on: + workflow_dispatch: + schedule: + - cron: '4 4 * * 0' + +env: + GIT_AUTHOR_NAME: Django Girls Automation + GIT_AUTHOR_EMAIL: automation@theforeman.org + +jobs: + list_languages: + name: List languages + runs-on: ubuntu-latest + if: github.repository_owner == 'ekohl' + 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 diff --git a/bg/GLOSSARY.md b/bg/GLOSSARY.md index 92a2c38234c..e066787b75e 100644 --- a/bg/GLOSSARY.md +++ b/bg/GLOSSARY.md @@ -1,3 +1,3 @@ # редактор на код -Редакторът на код е приложение, което ти позволява да съхраняваш своя код за да можеш да продължиш с него по-късно. Може да научиш откъде да свалиш от [главата Редактор на код](./code_editor/README.md) \ No newline at end of file +Редакторът на код е приложение, което ти позволява да съхраняваш своя код за да можеш да продължиш с него по-късно. Може да научиш къде да намериш един от [главата Редактор на код](./code_editor/README.md) \ No newline at end of file diff --git a/bg/README.md b/bg/README.md index 43886769177..c6d374c37b3 100644 --- a/bg/README.md +++ b/bg/README.md @@ -6,45 +6,45 @@ ## Добре дошли -Добре дошли в ръководството на Django Girls! Щастливи сме да те видим тук :) Ще те отведем на приключение зад кулисите на уеб-технологиите, като хвърлим бегъл поглед на всичко, което е необходимо за да накараме мрежата да проработи, така както я знаем. +Добре дошли в ръководството на Django Girls! We are happy to see you here. :) In this tutorial, we will take you on a journey under the hood of web technologies, offering you a glimpse of all the bits and pieces that need to come together to make the web work as we know it. -Както с всички непознати неща, това може да бъде малко трудно. Но не се притеснявай, вече имаш кураж да бъдеш тука, всичко ще бъде наред :) +As with all unknown things, this is going to be an adventure - but no worries, since you already worked up the courage to be here, you'll be just fine. :) ## Въведение -Някога имал ли си чувтвото, че светът е свързан все повече и повече с технологиите и ти не си още част от него? Чудил ли си се как да създадеш уеб-сайт, но никога си нямал достатъчно мотивация да започнеш? Струвало ли ти се, че светът на софтуера е прекалено сложен за да започнеш да правиш нещо сам? +Чувстваше ли някога, че светът все повече е свързан с технологиите, а ти оставаш в сянка? Мислеше как да създадеш уеб-сайт, но никога нямаше достатъчно мотивация да започнеш? Струвало ли ти се, че светът на софтуера е прекалено труден за теб да започнеш да правиш нещо сама? -Имаме добра новина за теб! Програмиране не е толкова трудно, колкото изглежда, и ние искаме да ти покажем колко лесно може да бъде това. +Имаме добра новина за теб! Програмирането не е толкова трудно, колкото изглежда, и ние искаме да ти покажем колко забавно може да бъде то. -Това ръководство няма магически да те превърне в програмист. Ако искаш да си добър ще ти трябват месеци или даже години учене и упражняване. Но ние искаме да покажем, че програмиране или създаване на уеб-сайтове не е толкова сложно, колкото изглежда. Ще се постараем да обясним в детайли, колкото се може по-добре, за да не се чувстваш уплашен от технологията. +Това ръководство няма магически да те превърне в програмист. Ако искаш да си добра ще ти трябват месеци или даже години учене и упражняване. Но ние искаме да покажем, че програмирането или създаването на уебсайтове не е толкова сложно, колкото изглежда. Ще се постараем да обясним в детайли, колкото се може по-добре, за да не се чувстваш уплашена от технологиите. -Надяваме се да те накараме да заобичаш технология толкова, колкото и ние я обичаме! +Надяваме се да те накараме да заобичаш технологиите толкова, колкото и ние ги обичаме! ## Какво ще научиш от това ръководство? -След като приключиш с ръководството, ще имаш малко работещо уеб-приложение: твой собствен блог. Ще ти покажем как да го пуснеш в мрежата, така че другите да ти видят работата! +След като приключиш с ръководството, ще имаш малко работещо уеб-приложение: твоя собствен блог. Ще ти покажем как да го пуснеш в мрежата, така че другите да ти видят работата! Това ще изглежда (горе-долу) ето така: ![Фигура 0.1](images/application.png) -> Ако работиш с ръкводството сам, и нямаш инструктор който да ти помага в случай на някой проблем, имаме чат система за теб: [![Gitter](https://badges.gitter.im/DjangoGirls/tutorial.svg)](https://gitter.im/DjangoGirls/tutorial). Помолихме нашите инструктори и миналите участници да са там от време на време и да помагат на другите с ръководството! Не се страхувай да задаваш въпроси тука! +> Ако работиш с ръководството сам, и нямаш инструктор който да ти помага в случай на някой проблем, имаме чат система за теб: [![Gitter](https://badges.gitter.im/DjangoGirls/tutorial.svg)](https://gitter.im/DjangoGirls/tutorial). Помолихме нашите инструктори и миналите участници да са там от време на време и да помагат на другите с ръководството! Не се страхувай да задаваш въпроси там! Добре, [хайде да започнем от начало...](./how_the_internet_works/README.md) ## Следвайки ръководството вкъщи -Изумително е да си част от занятията на Django Girls, но също разбираме, че не винаги е възможно да присъстваш на някое от тях. Затова ние те насърчаваме да пробваш да следиш ръководството вкъщи. За читатели у дома, понастоящем приготвяме видеа, които ще улеснят следването на ръководството само по себе си. Проектът е все още в процес на обработка, но все повече и повече неща скоро ще бъдат покрити на [Coding is for girls](https://www.youtube.com/channel/UC0hNd2uW8jTR5K3KBzRuG2A/feed) YouTube канал. +Изумително е да си част от занятията на Django Girls, но също разбираме, че не винаги е възможно да присъстваш. Затова ние те насърчаваме да пробваш да следиш ръководството вкъщи. За читатели у дома, понастоящем приготвяме видеа, които ще улеснят следването на ръководството на вас. Проектът все още е в процес на обработка, но все повече и повече неща ще бъдат разгледани скоро на [Coding is for girls](https://www.youtube.com/channel/UC0hNd2uW8jTR5K3KBzRuG2A/feed) YouTube канал. -Във всяка вече покрита глава има линк, препращащ към съответното видео. +Във всяка вече покрита глава има линк, препращащ към правилното видео. ## Относно и допринасяне -Това ръководство е поддържано от [Django Girls](https://djangogirls.org/). Ако си намерил някакви грешки или искаш да актуализираш ръководството, моля, [следвай насоките за допринасяне](https://github.com/DjangoGirls/tutorial/blob/master/README.md). +Това ръководство е поддържано от [Django Girls](https://djangogirls.org/). Ако намериш някакви грешки или искаш да актуализираш ръководството, моля, [следвай насоките за допринасяне](https://github.com/DjangoGirls/tutorial/blob/master/README.md). -## Би ли искал да ни помогнеш да преведем ръководството на друг език? +## Би ли искала да ни помогнеш да преведем ръководството на друг език? -Понастоящем, преводите се съхраняват на платформа crowdin.com на този адрес: +Понастоящем, преводите се съхраняват на платформата crowdin.com по този адрес: https://crowdin.com/project/django-girls-tutorial diff --git a/bg/SUMMARY.md b/bg/SUMMARY.md index c6859e9e51b..7bba63767d5 100644 --- a/bg/SUMMARY.md +++ b/bg/SUMMARY.md @@ -8,9 +8,9 @@ * [Виртуална среда](installation/README.md#virtualenv) * [Django](installation/README.md#django) * [Git](installation/README.md#git) - * [GitHub](installation/README.md#github) - * [PythonAnywhere](installation/README.md#pythonanywhere) -* [Инсталиране (chromebook)](chromebook_setup/README.md) + * [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) @@ -18,9 +18,9 @@ * [Въведение в Python](python_introduction/README.md) * [Какво е Django?](django/README.md) * [Инсталиране на Django](django_installation/README.md) -* [Вашият първи проект с Django!](django_start_project/README.md) +* [Твоят първи проект с Django!](django_start_project/README.md) * [Django модели](django_models/README.md) -* [Администриране на Django](django_admin/README.md) +* [Django админ](django_admin/README.md) * [Внедряване!](deploy/README.md) * [Django URL адреси](django_urls/README.md) * [Django изгледи - време за създаване!](django_views/README.md) diff --git a/bg/chromebook_setup/README.md b/bg/chromebook_setup/README.md index d21dc1f556d..f6e4ee94c21 100644 --- a/bg/chromebook_setup/README.md +++ b/bg/chromebook_setup/README.md @@ -1,5 +1,5 @@ # Настройка на Chromebook -> **Бележка** Ако вече сте минали през стъпките за инсталиране, няма нужда да правите това отново - можете да прескочите направо към [Въведение в Python](../python_introduction/README.md). +> **Note** If you already worked through the [installation steps](../installation/README.md), no need to do this again – you can skip straight ahead to [Introduction to Python](../python_introduction/README.md). {% include "/chromebook_setup/instructions.md" %} \ No newline at end of file diff --git a/bg/chromebook_setup/instructions.md b/bg/chromebook_setup/instructions.md index a9f353d61c7..634a1224600 100644 --- a/bg/chromebook_setup/instructions.md +++ b/bg/chromebook_setup/instructions.md @@ -1,17 +1,17 @@ -Можеш да [пропуснеш този раздел](http://tutorial.djangogirls.org/en/installation/#install-python), ако не използваш Chromebook. Ако използвате, опитът ви в инсталацията ще бъде малко по-различен. Можете да игнорирате останалата част от инструкциите за инсталиране. +Можеш да [пропуснеш този раздел](http://tutorial.djangogirls.org/en/installation/#install-python), ако не използваш Chromebook. Ако използваш, опитът ти в инсталацията ще бъде малко по-различен. Можеш да игнорираш останалата част от инструкциите за инсталиране. -### Cloud IDE (PaizaCloud Cloud IDE, AWS Cloud9) +### Cloud IDE (PaizaCloud Cloud IDE, AWS Cloud9, Glitch.com) -Cloud IDE е инструмент, който ти дава редактор на код и достъп до компютър, работещ с Интернет, където можеш да инсталираш, пишеш и пускаш софтуер. За продължителността на ръководството, cloud IDE ще ти служи като твоя *локална машина*. Все пак ще пишеш команди в терминал, също като твоите съученици на OS X, Ubuntu или Windows, но той ще бъде свързан с компютър, работещ някъде другаде, който cloud IDE прави за теб. Ето инструкциите за cloud IDE (PaizaCloud Cloud IDE, AWS Cloud9). Можете да изберете един от cloud IDE интерфейси и да следвате инструкциите за cloud IDE. +Облачна IDE е инструмент, която ти дава редактор на код и достъп до компютър, работещ в Интернет, където можеш да инсталираш, да пишеш и да пускаш софтуер. За продължителността на ръководството, облачната IDE ще ти служи като твоя *локална машина*. Все пак ще пишеш команди в терминал, също като твоите съученици на OS X, Ubuntu или Windows, но твоят терминал ще бъде свързан с компютър, работещ някъде другаде, който облачната IDE настройва за теб. Here are the instructions for cloud IDEs (PaizaCloud Cloud IDE, AWS Cloud9, Glitch.com). Можеш да избереш един от облачни IDE интерфейси и да следваш инструкциите за тази облачна IDE. #### PaizaCloud Cloud IDE 1. Отиди на [PaizaCloud Cloud IDE](https://paiza.cloud/) 2. Направи акаунт -3. Натисни *New Server* и избери Django приложение +3. Натисни *New Server* и избери приложението Django 4. Натисни бутон на Терминал (от лявата страна на прозореца) -Сега трябва да виждаш интерфейс със странична лента, бутони са отляво. Натисни бутона "Terminal" за да ви отвори прозорец със следния надпис: +Сега трябва да виждаш интерфейс със странична лента, бутоните са отляво. Натисни бутона "Terminal" за да се отвори ето такава подкана: {% filename %}Terminal{% endfilename %} @@ -27,47 +27,132 @@ Cloud IDE е инструмент, който ти дава редактор н 1. Инсталирай Cloud 9 от [Chrome web store](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* в лентата за търсене и натисни +4. В AWS Dashboard, напиши *Cloud9* в лентата за търсене и я натисни 5. В Cloud 9 таблото, натисни *Create environment* 6. Наречи го *django-girls* -7. Конфигурирайки настройките, избери *Create a new instance for environment (EC2)* за "Environment Type" и *t2.micro* "Instance type" (трябва да пише "Free-tier eligible."). Настройката за икономия на разходи по подразбиране е добре, също може да запазиш и другите както са по подразбиране. +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 $ -Тази долна зона е вашият терминал. Можете да използвате терминала за изпращане на инструкции до отдалечения компютър Cloud 9. Можете да промените размера на прозореца, за да го направите малко по-голям. +Тази долна зона е твоят терминал. Можеш да използваш терминала за изпращане на инструкции до отдалечения компютър Cloud 9. Можеш да промениш размера на прозореца, за да го направиш малко по-голям. + +#### Glitch.com Cloud IDE + +1. Go to [Glitch.com](https://glitch.com/) +2. Sign up for an account (https://glitch.com/signup) or use your GitHub account if you have one. (See GitHub instructions below.) +3. Click *New Project* and choose *hello-webpage* +4. Click on the Tools dropdown list (at the bottom left side of the window), then on Terminal button to open terminal tab with a prompt like this: + +{% filename %}Terminal{% endfilename %} + + app@name-of-your-glitch-project:~ + + +When using Glitch.com as your Cloud IDE, you don't have to create a virtual environment. Instead, create the following files manually: + +{% 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) е като частна кутия, в която можем да запълним полезен компютърен код за проект, над който работим. Ние ги използваме, за да държим различните части от код, които искаме за отделните ни проекти, разделени, така че нещата да не се смесват между проектите. +A virtual environment (also called a virtualenv) is like a private box we can stuff useful computer code into for a project we're working on. We use them to keep the various bits of code we want for our various projects separate so things don't get mixed up between projects. -Пусни: +Run: {% filename %}Cloud 9{% endfilename %} mkdir djangogirls cd djangogirls - python3.6 -mvenv myvenv + python3 -m venv myvenv source myvenv/bin/activate pip install django~={{ book.django_version }} -(имайте предвид, че на последния ред използваме тилд, последван от знак за равенство: `~=`). +(note that on the last line we use a tilde followed by an equal sign: `~=`). ### GitHub -Направи [GitHub](https://github.com) акаунт. +Make a [GitHub](https://github.com) account. ### PythonAnywhere -Урокът за Django Girls включва раздел за това, което се нарича Прехвърляне, което е процесът на приемане на кода, който захранва новото ви уеб приложение и го премества на обществено достъпен компютър (наречен сървър), за да могат другите хора да виждат работата ви. +The Django Girls tutorial includes a section on what is called Deployment, which is the process of taking the code that powers your new web application and moving it to a publicly accessible computer (called a server) so other people can see your work. -Тази част е малко странна, когато правим урока в Chromebook, тъй като вече използваме компютър, който е в Интернет (за разлика от, да речем, лаптоп). Въпреки това, все още е полезно, тъй като можем да мислим за работното пространство на Cloud 9 като място за нашата „текуща“ работа и Python Anywhere като място за показване на нашите неща, когато те станат по-завършени. +This part is a little odd when doing the tutorial on a Chromebook since we're already using a computer that is on the Internet (as opposed to, say, a laptop). However, it's still useful, as we can think of our Cloud 9 workspace as a place for our "in progress" work and Python Anywhere as a place to show off our stuff as it becomes more complete. -По този начин се регистрирайте за нов акаунт в Python Anywhere на адрес [www.pythonanywhere.com](https://www.pythonanywhere.com). \ No newline at end of file +Thus, sign up for a new Python Anywhere account at [www.pythonanywhere.com](https://www.pythonanywhere.com). \ No newline at end of file diff --git a/bg/code_editor/README.md b/bg/code_editor/README.md index 8d3daf476a1..9d3b5025765 100644 --- a/bg/code_editor/README.md +++ b/bg/code_editor/README.md @@ -2,10 +2,10 @@ > За читателите у дома: тази глава е разгледана във видеото [Инсталиране на Python & Редактор на код](https://www.youtube.com/watch?v=pVTaqzKZCdA&t=4m43s). -На път сте да напишете първия си ред код, така че е време да изтеглите редактор на код! +На път си да напишеш първия си ред на код, така че е време да изтеглиш редактор на код! -> **Забележка** Ако използвате Chromebook, пропуснете тази глава и се уверете, че следвате инструкциите [Настройка на Chromebook](../chromebook_setup/README.md). Облачният IDE, който сте избрали (PaizaCloud Cloud IDE или AWS Cloud9) включва редактор на код и когато отворите файл във вашия IDE от менюто File, автоматично ще използвате редактора. +> **Забележка** Ако използваш Chromebook, пропусни тази глава и се увери, че следваш инструкциите [Настройка на Chromebook](../chromebook_setup/README.md). Облачната IDE, която си избрала (PaizaCloud Cloud IDE или AWS Cloud9) включва редактор на код и когато отвориш файл във твоята IDE от менюто File, автоматично ще използваш редактора. > -> ** Забележка ** Може да сте направили това по-рано в главата за инсталиране - ако е така, можете да прескочите веднага до следващата глава! +> **Note** You might have done this earlier in the [Installation chapter](../installation/README.md) – if so, you can skip right ahead to the next chapter! {% include "/code_editor/instructions.md" %} \ No newline at end of file diff --git a/bg/code_editor/instructions.md b/bg/code_editor/instructions.md index 283b179e98f..aa4c9b9fdc3 100644 --- a/bg/code_editor/instructions.md +++ b/bg/code_editor/instructions.md @@ -1,37 +1,37 @@ Има много различни редактори и това до голяма степен се свежда до личните предпочитания. Повечето програмисти на Python използват сложни, но изключително мощни IDE (интегрирани среди за разработка), като PyCharm. Като начинаещ обаче това вероятно е по-малко подходящо; нашите препоръки са еднакво мощни, но много по-прости. -Нашите предложения са по-долу, но не се колебайте да попитате ментора си какви са техните предпочитания - по-лесно ще получите помощ от тях. +Нашите предложения са по-долу, но не се колебай да попиташ ментора си какви са техните предпочитания - по-лесно ще получиш помощ от тях. ## Visual Studio Code -Visual Studio Code е редактор за програмен код, разработен от Microsoft за Windows, Linux и macOS. Той включва поддръжка за отстраняване на грешки, вграден Git контрол, подчертаване на синтаксис, интелигентно попълване на код, фрагменти и рефакторинг на код. +Visual Studio Code е редактор на изходен код, разработен от Microsoft за Windows, Linux и macOS. Той включва поддръжка за отстраняване на грешки, вграден Git контрол, подчертаване на синтаксис, интелигентно попълване на код, фрагменти и рефакторинг на код. -[Изтеглете го тук](https://code.visualstudio.com/) +[Изтегли го тук](https://code.visualstudio.com/) -## Gedit +## Gedit Gedit е безплатен редактор с отворен код, достъпен за всички операционни системи. -[Изтеглете го тук](https://wiki.gnome.org/Apps/Gedit#Download) +[Изтегли го тук](https://wiki.gnome.org/Apps/Gedit#Download) ## Sublime Text -Sublime Text е много популярен редактор с безплатен период за ползване и е достъпен за всички операционни системи. +Sublime Text е много популярен редактор на код с безплатен период за оценка и е достъпен за всички операционни системи. -[Изтеглете го тук](https://www.sublimetext.com/) +[Изтегли го тук](https://www.sublimetext.com/) -## Atom +## Atom Atom е друг популярен редактор. Той е безплатен, с отворен код и се предлага за Windows, OS X и Linux. Atom е разработен от [GitHub](https://github.com/). -[Изтеглете го тук](https://atom.io/) +[Изтегли го тук](https://atom.io/) ## Защо инсталираме редактор на код? -Може би се чудите защо инсталираме този специален софтуер за редактиране на код, вместо да използваме нещо като Word или Notepad. +Може би се чудиш защо инсталираме този специален софтуер за редактиране на код, вместо да използваме нещо като Word или Notepad. Първата причина е, че кодът трябва да бъде **обикновен текст**, а проблемът с програми като Word и Textedit е, че те всъщност не произвеждат обикновен текст, те създават богат текст (с шрифтове и форматиране), използвайки персонализирани формати като [RTF (формат на обогатен текст)](https://en.wikipedia.org/wiki/Rich_Text_Format). -Втората причина е, че редакторите на код са специализирани за редактиране на код, така че те могат да предоставят полезни функции като подчертаване на код с цвят според значението му или автоматично затваряне на кавички. +Втората причина е, че редакторите на код са специализирани за редактиране на код, така че те могат да предоставят полезни функции като подчертаване на код с цвят според значението му или автоматично затваряне на кавички за теб. -Ще видим всичко това в действие по-късно. Скоро ще помислите за надеждния си стар редактор на код като за един от любимите си инструменти. :) +Ще видим всичко това в действие по-късно. Скоро ще помислиш за надеждния си стар редактор на код като за един от любимите си инструменти. :) \ No newline at end of file diff --git a/bg/css/README.md b/bg/css/README.md index f73e52a41be..417eb90c21f 100644 --- a/bg/css/README.md +++ b/bg/css/README.md @@ -1,10 +1,10 @@ # CSS - направи го красиво! -Блогът ни все още изглежда доста грозен, нали? Време е да го направите хубав! За това ще използваме CSS. +Блогът ни все още изглежда доста грозен, нали? Време е да го направиш хубав! За това ще използваме CSS. ## Какво е CSS? -Cascading Style Sheets (CSS) е език, използван за описание на външния вид и форматирането на уебсайт, написан на език за маркиране (като HTML). Отнасяйте се към него като грим за вашата уеб страница. ;) +Cascading Style Sheets (CSS) е език, използван за описание на външния вид и форматирането на уебсайт, написан на език за маркиране (като HTML). Отнасяй се към него като грим за нашата уеб страница. ;) Но не искаме отново да започнем от нулата, нали? Още веднъж ще използваме нещо, което програмистите пуснаха в интернет безплатно. Преосмислянето на колелото не е забавно. @@ -12,20 +12,19 @@ Cascading Style Sheets (CSS) е език, използван за описани Bootstrap е една от най-популярните фреймуорки за HTML и CSS за разработване на красиви уебсайтове: https://getbootstrap.com/ -Той е написан от програмисти, които са работили за Twitter. Сега тя е разработена от доброволци от цял свят! +Той е написан от програмисти, които са работили за Twitter. Сега той е разработен от доброволци от цял свят! -## Инсталирайте Bootstrap +## Инсталирай Bootstrap -За да инсталирате Bootstrap, отворете вашия файл `.html` в редактора на кода и го добавете в секцията ``: +За да инсталираш Bootstrap, отвори твоя `.html` файл в редактора на кода и го добави в секцията ``: {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html - - + ``` -Това не добавя никакви файлове към вашия проект. Той просто сочи файлове, които съществуват в Интернет. Затова продължете напред, отворете уебсайта си и актуализирайте страницата. Ето го! +Това не добавя никакви файлове към твоя проект. То просто сочи файлове, които съществуват в Интернет. Затова продължи напред, отвори уебсайта си и актуализирай страницата. Ето го! ![Фигура 14.1](images/bootstrap1.png) @@ -49,11 +48,11 @@ Django вече знае къде да намери статичните фай └── mysite -Django автоматично ще открива всички папки, наречени 'static', в която и да е от папките на вашите приложения. Тогава той ще може да използва тяхното съдържание като статични файлове. +Django автоматично ще открива всички папки, наречени 'static', в която и да е от папките на вашите приложения. Тогава то ще може да използва тяхното съдържание като статични файлове. -## Вашият първи CSS файл! +## Твоят първи CSS файл! -Нека сега създадем CSS файл, за да добавим свой собствен стил към вашата уеб страница. Създайте нова директория, наречена `css` във вашата `static` директория. След това създайте нов файл, наречен `blog.css` вътре в тази директория `css`. Готови? +Нека сега създадем CSS файл, за да добавим свой собствен стил към твоята уеб страница. Създай нова директория, наречена `css` във твоята `static` директория. След това създай нов файл, наречен `blog.css` вътре в тази директория `css`. Готова? djangogirls └─── blog @@ -62,13 +61,13 @@ Django автоматично ще открива всички папки, на └─── blog.css -Време е да напишете малко CSS! Отворете файла `blog/static/css/blog.css` във вашия редактор на код. +Време е да напишеш малко CSS! Отвори файла `blog/static/css/blog.css` в твоя редактор на код. -Тук няма да навлизаме твърде дълбоко в персонализирането и научаването на CSS. Има препоръка за безплатен CSS курс в края на тази страница, ако искате да научите повече. +Тук няма да навлизаме твърде дълбоко в персонализирането и научаването на CSS. Има препоръка за безплатен CSS курс в края на тази страница, ако искаш да научиш повече. -Но нека направим поне малко. Може би бихме могли да променим цвета на заглавията си? За да разберат цветовете, компютрите използват специални кодове. Тези кодове започват с `#`, последвани от 6 букви (A–F) и цифри (0–9). Например кодът за синьо е `#0000FF`. Можете да намерите цветовите кодове за много от цветовете тук: http://www.colorpicker.com/. Можете също така да използвате [предварително определени цветове](http://www.w3schools.com/colors/colors_names.asp), като ` red ` и ` green `. +Но нека направим поне малко. Може би бихме могли да променим цвета на заглавията ни? За да разберат цветовете, компютрите използват специални кодове. Тези кодове започват с `#`, последвани от 6 букви (A–F) и цифри (0–9). Например кодът за синьо е `#0000FF`. Можеш да намериш цветовите кодове за много от цветовете тук: http://www.colorpicker.com/. Можеш също така да използваш [предварително определени цветове](http://www.w3schools.com/colors/colors_names.asp), като `red` и `green`. -Във вашия `blog/static/css/blog.css` файл трябва да добавите следния код: +Във твоя `blog/static/css/blog.css` файл трябва да добавиш следния код: {% filename %}blog/static/css/blog.css{% endfilename %} @@ -79,17 +78,17 @@ h1 a, h2 a { ``` -`h1 a` е CSS селектор. Това означава, че прилагаме стиловете си към всеки `a` елемент вътре в елемент `h1`; селекторът `h2 a` прави същото за елементи `h2`. Така че, когато имаме нещо като `

връзка

`, ще се прилага стилът `h1 a`. В този случай ние му казваме да промени цвета си на `#C25100`, което е тъмно оранжево. Или можете да поставите свой собствен цвят тук, но се уверете, че той има добър контраст на бял фон! +`h1 a` е CSS селектор. Това означава, че прилагаме стиловете си към всеки `a` елемент вътре в елемент `h1`; селекторът `h2 a` прави същото за елементи `h2`. Така че, когато имаме нещо като `

връзка

`, ще се прилага стилът `h1 a`. В този случай ние му казваме да промени цвета си на `#C25100`, което е тъмно оранжево. Или можеш да поставиш свой собствен цвят тук, но се увери, че той има добър контраст на бял фон! -Във CSS файл определяме стилове за елементи в HTML файла. Първият начин да идентифицираме елементите е с името на елемента. Може да ги запомните като тагове от секцията HTML. Неща като `a`, `h1` и `body` са примери за имена на елементи. Ние също така идентифицираме елементи по атрибут `class` или атрибут `id`. Class и id са имена, които сами давате на елемента. Класовете определят групи от елементи, а идентификаторите сочат конкретни елементи. Например, можете да идентифицирате следния маркер, като използвате името на тага `a`, класа `external_link` или id `link_to_wiki_page`: +В CSS файл определяме стилове за елементи в HTML файла. Първият начин да идентифицираме елементите е с името на елемента. Може да ги запомниш като тагове от секцията HTML. Нещата като `a`, `h1` и `body` са примери за имена на елементи. Ние също така идентифицираме елементи по атрибут `class` или атрибут `id`. Class и id са имена, които сама даваш на елемента. Класовете определят групи от елементи, а идентификаторите сочат конкретни елементи. For example, you could identify the following element by using the element name `a`, the class `external_link`, or the id `link_to_wiki_page`: ```html ``` -Можете да прочетете повече за [CSS селектори в w3schools](http://www.w3schools.com/cssref/css_selectors.asp). +Можеш да прочететеш повече за [CSS селектори в w3schools](http://www.w3schools.com/cssref/css_selectors.asp). -Трябва също така да кажем на нашия HTML шаблон, че добавихме някои CSS. Отворете файла `blog/templates/blog/post_list.html` в редактора на кода и добавете този ред в самото начало: +Трябва също така да кажем на нашия HTML шаблон, че добавихме някои CSS. Отвори файла `blog/templates/blog/post_list.html` в редактора на кода и добави този ред в самото начало: {% filename %}blog/templates/blog/post_list.html{% endfilename %} @@ -97,7 +96,7 @@ h1 a, h2 a { {% load static %} ``` -Тук просто зареждаме статични файлове. :) Между таговете `` и ``, след връзките към CSS файловете на Bootstrap, добавете този ред: +Тук просто зареждаме статични файлове. :) Между таговете `` и ``, след връзките към CSS файловете на Bootstrap, добави този ред: {% filename %}blog/templates/blog/post_list.html{% endfilename %} @@ -105,38 +104,38 @@ h1 a, h2 a { ``` -Браузърът чете файловете в реда, в който са зададени, така че трябва да се уверим, че това е на правилното място. В противен случай кодът в нашия файл може да бъде редактиран от кода във файловете на Bootstrap. Току-що казахме на нашия шаблон къде се намира нашият CSS файл. +Браузърът чете файловете в реда, в който са зададени, така че трябва да се уверим, че това е на правилното място. В противен случай кодът в нашия файл може да бъде отменен с кода във файлове Bootstrap. Току-що казахме на нашия шаблон къде се намира нашият CSS файл. -Вашият файл сега трябва да изглежда така: +Твоят файл сега трябва да изглежда така: {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html {% load static %} + Django Girls blog - - + -
+

Django Girls Blog

-
+ {% for post in posts %} -
-

published: {{ post.published_date }}

+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} ``` -ОК, запазете файла и актуализирайте сайта! +ОК, запази файла и актуализирай сайта! ![Фигура 14.2](images/color2.png) @@ -150,11 +149,11 @@ body { } ``` -Добавете това към вашия CSS, запишете файла и вижте как работи! +Добави това към твоя CSS, запиши файла и виж как работи! ![Фигура 14.3](images/margin2.png) -Може би можем да персонализираме шрифта в заглавието ни? Поставете това във вашия `` в `blog/templates/blog/post_list.html` файл: +Може би можем да персонализираме шрифта в заглавието ни? Постави това в твоя `` в `blog/templates/blog/post_list.html` файл: {% filename %}blog/templates/blog/post_list.html{% endfilename %} @@ -162,9 +161,9 @@ body { ``` -Както и преди, проверете поръчката и поставете преди връзката към `blog/static/css/blog.css`. Този ред ще импортира шрифт, наречен *Lobster* от Google Fonts (https://www.google.com/fonts). +Както и преди, провери поръчката и постави преди връзката към `blog/static/css/blog.css`. Този ред ще импортира шрифт, наречен *Lobster* от Google Fonts (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 %} @@ -179,31 +178,33 @@ h1 a, h2 a { Страхотно! -Както бе споменато по-горе, CSS има концепция за класове. Те ви позволяват да назовете част от HTML кода и да приложите стилове само към тази част, без да засягате други части. Това може да бъде супер полезно! Може би имате два divs (участъка), които правят нещо различно (като заглавието и публикацията ви). Един клас може да ви помогне да ги направите да изглеждат различно. +Както бе споменато по-горе, CSS има концепция за класове. Те ви позволяват да назовете част от HTML кода и да приложите стилове само към тази част, без да засягате другите. Това може да бъде супер полезно! Може би имаш два div (от division, разделяне), които правят нещо различно (като заглавието и публикацията ти). Един клас може да ти помогне да ги накараш да изглеждат различно. -Продължете и дайте име на някои части от HTML кода. Добавете клас, наречен `page-header`, към вашия `div`, който съдържа заглавието ви, като този: +Go ahead and name some parts of the HTML code. Replace the `header` that contains your header with the following: {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html - + ``` -И сега добавете клас `post` към вашия `div` съдържащ публикация в блог. +И сега добави клас `post` към твоя `article` съдържащ публикация в блог. {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html -
-

published: {{ post.published_date }}

+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ ``` -Сега ще добавим декларационни блокове към различни селектори. Селектори, започващи с `. `, се отнасят за класове. Има много страхотни уроци и обяснения за CSS в мрежата, които могат да ви помогнат да разберете следния код. Засега го копирайте и поставете във вашия `blog/static/css/blog.css` файл: +Сега ще добавим декларационни блокове към различни селектори. Селектори, започващи с `.`, се отнасят за класове. Има много страхотни ръководства и обяснения за CSS в мрежата, които могат да ти помогнат да разбереш следния код. Засега го копирай и постави във твоя `blog/static/css/blog.css` файл: {% filename %}blog/static/css/blog.css{% endfilename %} @@ -211,20 +212,23 @@ h1 a, h2 a { .page-header { background-color: #C25100; margin-top: 0; + margin-bottom: 40px; padding: 20px 20px 20px 40px; } -.page-header h1, .page-header h1 a, .page-header h1 a:visited, .page-header h1 a:active { +.page-header h1, +.page-header h1 a, +.page-header h1 a:visited, +.page-header h1 a:active { color: #ffffff; font-size: 36pt; text-decoration: none; } -.content { - margin-left: 40px; -} - -h1, h2, h3, h4 { +h1, +h2, +h3, +h4 { font-family: 'Lobster', cursive; } @@ -236,11 +240,14 @@ h1, h2, h3, h4 { float: right; } -.post-form textarea, .post-form input { +.post-form textarea, +.post-form input { width: 100%; } -.top-menu, .top-menu:hover, .top-menu:visited { +.top-menu, +.top-menu:hover, +.top-menu:visited { color: #ffffff; float: right; font-size: 26pt; @@ -251,22 +258,40 @@ h1, h2, h3, h4 { margin-bottom: 70px; } -.post h2 a, .post h2 a:visited { +.post h2 a, +.post h2 a:visited { color: #000000; } + +.post > .date, +.post > .actions { + float: right; +} + +.btn-secondary, +.btn-secondary:visited { + color: #C25100; + background: none; + border-color: #C25100; +} + +.btn-secondary:hover { + color: #FFFFFF; + background-color: #C25100; +} ``` -След това заобиколете HTML кода, който показва публикациите с декларации за класове. Заменете това: +След това заобиколи HTML кода, който показва публикациите с декларации за класове. Замени това: {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html {% for post in posts %} -
-

published: {{ post.published_date }}

+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} ``` @@ -275,31 +300,31 @@ h1, h2, h3, h4 { {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html -
+
-
+
{% for post in posts %} -
-
-

published: {{ post.published_date }}

-
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %}
-
+
``` -Запазете тези файлове и актуализирайте уебсайта си. +Запази тези файлове и актуализирай уебсайта си. ![Фигура 14.4](images/final.png) -Ура! Изглежда страхотно, нали? Вижте кода, който току-що поставихме, за да намерите местата, където добавихме класове в HTML и ги използвахме в CSS. Къде бихте направили промяната, ако искате датата да е тюркоазена? +Ура! Изглежда страхотно, нали? Виж кода, който току-що поставихме, за да намериш местата, където добавихме класове в HTML и ги използвахме в CSS. Къде би направила промяната, ако искаш датата да е тюркоазена? -Не се страхувайте да се поинтересувате с този CSS малко и се опитайте да промените някои неща. Играта с CSS може да ви помогне да разберете какво правят различните неща. Ако счупите нещо, не се притеснявайте - винаги можете да го отмените! +Не се страхувай да се поинтересуваш с този CSS малко и се опитай да промениш някои неща. Играта с CSS може да ти помогне да разбереш какво правят различните неща. Ако счупиш нещо, не се притеснявай - винаги можеш да го отмениш! -Наистина препоръчваме да вземете безплатните онлайн курсове "Basic HTML & HTML5" и "Basic CSS" на [freeCodeCamp](https://learn.freecodecamp.org/). Те могат да ви помогнат да научите всичко за правенето на уебсайтовете ви по-красиви с HTML и CSS. +Наистина препоръчваме да вземеш безплатните онлайн курсове "Basic HTML & HTML5" и "Basic CSS" на [freeCodeCamp](https://learn.freecodecamp.org/). Те могат да ти помогнат да научиш всичко за правенето на уебсайтовете ти по-красиви с HTML и CSS. -Готови ли сте за следващата глава?! :) \ No newline at end of file +Готова ли си за следващата глава?! :) \ No newline at end of file diff --git a/bg/deploy/README.md b/bg/deploy/README.md index bebe6f91009..d881f0b894d 100644 --- a/bg/deploy/README.md +++ b/bg/deploy/README.md @@ -1,8 +1,8 @@ # Внедряване! -> **Забележка** Следващата глава понякога може да бъде малко трудна за преминаване. Продължете и я завършете; внедряването е важна част от процеса на разработване на уебсайтове. Тази глава е поставена в средата на урока, така че вашият ментор да ви помогне с малко по-сложния процес на вдигане на уебсайта ви онлайн. Това означава, че все още можете да завършите урока самостоятелно, ако ви липсва време. +> **Забележка** Следващата глава понякога може да бъде малко трудна за преминаване. Продължи и я завърши; внедряването е важна част от процеса на разработване на уебсайтове. Тази глава е поставена в средата на ръководството, така че твоят ментор да ти помогне с малко по-сложния процес на вдигане на уебсайта ти онлайн. Това означава, че все още можеш да завършиш ръководството самостоятелно, ако ти липсва време. -Досега вашият уебсайт беше достъпен само на вашия компютър. Сега ще научите как да го прехвърлите в онлайн пространството! Разгръщането е процесът на публикуване на приложението ви в Интернет, така че хората най-накрая да могат да отидат и да видят приложението ви. :) +Досега твоят уебсайт беше достъпен само на твоя компютър. Сега ще научите как да го прехвърлите в онлайн пространството! Разгръщането е процесът на публикуване на приложението ви в Интернет, така че хората най-накрая да могат да отидат и да видят приложението ви. :) Както научихте, уебсайт трябва да бъде разположен на сървър. В интернет има много доставчици на сървъри, ще използваме [PythonAnywhere](https://www.pythonanywhere.com/). PythonAnywhere е безплатен за малки приложения, които нямат твърде много посетители, така че определено засега ще ви бъде достатъчно. @@ -12,7 +12,7 @@ # 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" %} @@ -32,32 +32,75 @@ Git проследява промените в определен набор о Инициализирането на git хранилището е нещо, което трябва да направим само веднъж за всеки проект (и няма да се налага да въвеждате отново потребителското име и имейла). -Git ще проследи промените във всички файлове и папки в тази директория, но има някои файлове, които искаме да игнорира. Правим това чрез създаване на файл, наречен `.gitignore` в основната директория. Отворете редактора си и създайте нов файл със следното съдържание: +### Adjusting your branch name + +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: + +{% filename %}command-line{% endfilename %} + + $ git --version + git version 2.xx... + + +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: + +{% filename %}command-line{% endfilename %} + + $ git branch -M main + + +### 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 *~ - /.vscode __pycache__ - myvenv + + # Env + .env + myvenv/ + venv/ + + # Database db.sqlite3 - /static + + # 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 -И го запишете като `.gitignore` в папката "djangogirls". +And save it as `.gitignore` in the "djangogirls" folder. -> **Забележка** Точката в началото на името на файла е важна! Ако имате проблеми с създаването му (Macs не харесва да създавате файлове, които започват с точка чрез Finder, например), след това използвайте функцията "Save As" в редактора си; това е бронеустойчиво. И не забравяйте да добавите `.txt`, `.py` или друго разширение към името на файла - той ще бъде разпознат от Git само ако името е просто `.gitignore`. +> **Забележка** Точката в началото на името на файла е важна! Ако имате проблеми с създаването му (Macs не харесва да създавате файлове, които започват с точка чрез Finder, например), след това използвайте функцията "Save As" в редактора си; това е бронеустойчиво. И не забравяйте да добавите `.txt`, `.py` или друго разширение към името на файла - той ще бъде разпознат от Git само ако името е просто `.gitignore`. Linux и MacOS взимат файловете с име, което започва с `.` (като `.gitignore`) за скрити и нормалната команда `ls` няма да показва тези файлове. Вместо това използвайте `ls -a`, за да видите файла `.gitignore`. > > **Забележка** Един от файловете, които сте посочили във вашия `.gitignore` файл е `db.sqlite3`. Този файл е вашата локална база данни, където се съхраняват всички ваши потребители и публикации. Ще следваме стандартната практика за уеб програмиране, което означава, че ще използваме отделни бази данни за вашия локален тестващ сайт и вашия уеб сайт на живо в PythonAnywhere. Базата данни на PythonAnywhere може да бъде SQLite, като вашата разработваща машина, но обикновено ще използвате такава, наречена MySQL, която може да се справи с много повече посетители на сайта, отколкото SQLite. Така или иначе, като игнорирате вашата SQLite база данни за копието на GitHub, това означава, че всички публикувани досега публикации и superuser ще бъдат достъпни само локално и ще трябва да създавате нови в производството. Трябва да мислите за вашата локална база данни като за добра площадка, където можете да тествате различни неща и да не се страхувате, че ще изтриете истинските си публикации от блога. -Добра идея е да използвате команда `git status` преди `git add` или винаги, когато се окажете несигурни какво се е променило. Това ще ви помогне да предотвратите появата на изненади, като например добавяне или поемане на грешни файлове. Командата `git status` връща информация за всички непроследени/модифицирани/поетапни файлове, състоянието на клона и много други. Изходът трябва да бъде подобен на следното: +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 master + On branch main No commits yet @@ -73,11 +116,11 @@ Git ще проследи промените във всички файлове 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: {% filename %}command-line{% endfilename %} - $ git add --all . + $ git add . $ git commit -m "My Django Girls app, first commit" [...] 13 files changed, 200 insertions(+) @@ -88,29 +131,29 @@ Git ще проследи промените във всички файлове ## Избутване на кода ви към GitHub -Отидете на [GitHub.com](https://www.github.com) и се регистрирайте за нов безплатен потребителски акаунт. (Ако вече сте го направили в подготвителната работилница, това е чудесно!) Не забравяйте да запомните паролата си (добавете я към вашия мениджър на пароли, ако използвате такъв). +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). -След това създайте ново хранилище, като му дадете името "my-first-blog". Оставете квадратчето за „инициализация с README“ отместено, оставете опцията .gitignore празна (направихме това ръчно) и оставете лиценза като None. +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. ![](images/new_github_repo.png) > **Забележка** Името `my-first-blog` е важно - бихте могли да изберете нещо друго, но това ще се случва много пъти в инструкциите по-долу и ще трябва да го замествате всеки път. Вероятно е по-лесно да се придържаме към името `my-first-blog`. -На следващия екран ще се покаже URL за клониране на вашия склад, което ще използвате в някои от следващите команди: +On the next screen, you'll be shown your repo's clone URL, which you will use in some of the commands that follow: ![](images/github_get_repo_url_screenshot.png) -Сега трябва да свържем Git хранилището на вашия компютър към това в GitHub. +Now we need to hook up the Git repository on your computer to the one up on GitHub. -Въведете следното в конзолата си (заменете `` с потребителското име, което сте въвели, когато сте създали акаунта си в GitHub, но без скобите - URL адресът трябва да съответства на клонирания URL адрес, който току-що видяхте): +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). {% filename %}command-line{% endfilename %} $ git remote add origin https://github.com//my-first-blog.git - $ git push -u origin master + $ git push -u origin main -Когато избутате кода към GitHub, ще бъдете попитани за вашето потребителско име и парола за GitHub (било то в прозореца на командния ред или в изскачащ прозорец), а след въвеждане на идентификационни данни трябва да видите нещо подобно: +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: {% filename %}command-line{% endfilename %} @@ -119,104 +162,20 @@ Git ще проследи промените във всички файлове Total 3 (delta 0), reused 0 (delta 0) To https://github.com/ola/my-first-blog.git - * [new branch] master -> master - Branch master set up to track remote branch master from origin. + * [new branch] main -> main + Branch main set up to track remote branch main from origin. -Кодът ви вече е на GitHub. Отидете и го вижте! Ще откриете, че е в добра компания - [Django](https://github.com/django/django), [Django Girls Tutorial](https://github.com/DjangoGirls/tutorial) и много други страхотни софтуерни проекти с отворен код също са домакини на кода си в GitHub. :) - -# Настройване на нашия блог на PythonAnywhere - -## Регистрирайте се за акаунт в PythonAnywhere - -> **Забележка** Може би вече сте създали акаунт в PythonAnywhere по-рано по време на стъпките за инсталиране - ако е така, няма нужда да го правите отново. - -{% include "/deploy/signup_pythonanywhere.md" %} - -## Конфигуриране на нашия сайт на PythonAnywhere - -Върнете се към главното меню [PythonAnywhere Dashboard](https://www.pythonanywhere.com/), като кликнете върху логото и изберете опцията за стартиране на конзола "Bash" - това е версията на командния ред PythonAnywhere, точно като тази на вашия компютър. - -![Секцията 'Нова конзола' в уеб интерфейса на PythonAnywhere, с бутон за 'bash'](images/pythonanywhere_bash_console.png) - -> **Забележка** PythonAnywhere е базиран на Linux, така че ако сте на Windows, конзолата ще изглежда малко по-различна от тази на вашия компютър. - -Внедряването на уеб приложение в PythonAnywhere включва сваляне на кода от GitHub и конфигуриране на PythonAnywhere да го разпознае и да започне да го обслужва като уеб приложение. Има ръчни начини за това, но PythonAnywhere предоставя помощен инструмент, който ще свърши всичко за вас. Нека го инсталираме първо: - -{% filename %}PythonAnywhere command-line{% endfilename %} - - $ pip3.6 install --user pythonanywhere - - -Това трябва да отпечата някои неща като `Collecting pythonanywhere` и в крайна сметка да завърши с ред, който казва `Successfully installed (...) pythonanywhere- (...)`. - -Сега стартираме помощника за автоматично конфигуриране на приложението ви от GitHub. Въведете следното в конзолата на PythonAnywhere (не забравяйте да използвате потребителското си име на GitHub вместо ``, така че URL адресът да съответства на клонираният URL от GitHub): - -{% filename %}PythonAnywhere command-line{% endfilename %} - - $ pa_autoconfigure_django.py --python=3.6 https://github.com//my-first-blog.git - - -Докато гледате това да работи, ще можете да видите какво прави: - -- Изтегляне на вашия код от GitHub -- Създаване на virtualenv на PythonAnywhere, точно като този на вашия собствен компютър -- Актуализиране на вашия файл с настройки с някои настройки за внедряване -- Настройка на база данни на PythonAnywhere с помощта на командата `manage.py migrate` -- Настройка на статичните ви файлове (за тях ще научим по-късно) -- И конфигуриране на PythonAnywhere да обслужва вашето уеб приложение чрез неговия API - -На PythonAnywhere всички тези стъпки са автоматизирани, но те са същите стъпки, които би трябвало да преминете с всеки друг доставчик на сървъри. - -Основното, което трябва да забележите в момента, е, че вашата база данни в PythonAnywhere всъщност е напълно отделена от вашата база данни на вашия собствен компютър, така че може да има различни публикации и администраторски акаунти. В резултат на това, точно както направихме на вашия собствен компютър, трябва да инициализираме администраторския акаунт с `createsuperuser`. PythonAnywhere автоматично активира вашия virtualenv за вас, така че всичко, което трябва да направите, е да стартирате: - -{% filename %}PythonAnywhere command-line{% endfilename %} - - (ola.pythonanywhere.com) $ python manage.py createsuperuser - - -Въведете данните за вашия администратор потребител. Най-добре е да използвате същите, които използвате на собствения си компютър, за да избегнете объркване, освен ако не искате да направите паролата на PythonAnywhere по-сигурна. - -Сега, ако желаете, можете също да разгледате кода си на PythonAnywhere, като използвате `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 - - -Можете също да отидете на страницата „Файлове“ и да се придвижвате наоколо, използвайки вградения файлов браузър на PythonAnywhere. (От страницата на конзолата можете да стигнете до други страници на PythonAnywhere от бутона на менюто в горния десен ъгъл. След като сте на една от страниците, има връзки към другите в горната част.) - -## Вече сте на живо! - -Сега вашият сайт трябва да бъде на живо в публичния Интернет! Кликнете върху страницата „Уеб“ на PythonAnywhere, за да получите линк към нея. Можете да споделите това с всеки, който искате :) - -> **Забележка** Това е урок за начинаещи и при разгръщането на този сайт взехме няколко преки пътища, които не са идеални от гледна точка на сигурността. Ако и когато решите да надградите този проект или да започнете нов проект, трябва да прегледате [контролния списък за разгръщане на Django](https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/) за някои съвети относно осигуряването на вашия сайт. - -## Съвети за отстраняване на грешки - -Ако видите грешка при изпълнение на скрипта `pa_autoconfigure_django.py`, ето няколко често срещани причини: - -- Забравяйки да създадете своя маркер за API на PythonAnywhere API. -- Грешка в URL адреса ви в GitHub -- Ако видите грешка, която казва *"Could not find your settings.py"*, вероятно защото не успяхте да добавите всичките си файлове в Git и/или не ги избутахте до GitHub успешно. Погледнете още един път раздела Git по-горе -- Ако преди това сте се регистрирали за акаунт в PythonAnywhere и имате грешка с collectstatic, вероятно имате по-стара версия на SQLite (например 3.8.2) за вашия акаунт. В такъв случай се регистрирайте за нов акаунт и опитайте командите в секцията PythonAnywhere по-горе. - -Ако видите грешка, когато се опитвате да посетите вашия сайт, първото място за търсене на информация за отстраняване на грешки е във вашия **error log**. Ще намерите линк към това на страницата на PythonAnywhere ["Web"](https://www.pythonanywhere.com/web_app_setup/). Вижте дали има съобщения за грешки там; най-новите са най-отдолу. - -Също така има някои [общи съвети за отстраняване на грешки на помощния сайт на PythonAnywhere](http://help.pythonanywhere.com/pages/DebuggingImportError). +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. :) -И не забравяйте, че вашият ментор е тук, за да ви помогне! +{% include "/deploy/pythonanywhere.md" %} -# Вижте вашия сайт! +# Check out your site! -Страницата по подразбиране за вашия сайт трябва да гласи „It worked!“, точно както прави на вашия локален компютър. Опитайте да добавите `/admin/` в края на URL адреса и ще бъдете отведени до администраторския сайт. Влезте с потребителското име и паролата и ще видите, че можете да добавяте нови публикации на сървъра - не забравяйте, че публикациите от вашата локална база данни за тестове не бяха изпратени във вашия блог на живо. +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. -След като създадете няколко публикации, можете да се върнете към вашата локална настройка (не PythonAnywhere). От тук трябва да работите върху вашата локална настройка, за да направите промени. Това е често срещан работен процес в уеб разработката - правете промени локално, бутате тези промени в GitHub и изтегляте промените надолу към вашия уеб сървър на живо. Това ви позволява да работите и да експериментирате, без да нарушавате уеб сайта си на живо. Доста готино, а? +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? -Заслужавате *огромни* похвали! Сървърните внедрения са едни от най-трудните части на уеб разработката и често отнемат на хората няколко дни, преди да ги накарат да работят. Но вие имате своя сайт на живо, в реалния Интернет! \ No newline at end of file +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/bg/deploy/install_git.md b/bg/deploy/install_git.md index 2d2a7f75b95..2dff563b6ee 100644 --- a/bg/deploy/install_git.md +++ b/bg/deploy/install_git.md @@ -5,14 +5,18 @@ Git е "система за контрол на версиите", използ -Можете да свалите Git от [git-scm.com](https://git-scm.com/). Можете да натиснете „ next“ на всички стъпки, с изключение на две: в стъпката, където се изисква да изберете вашия редактор, трябва да изберете Nano, и в стъпката, озаглавена „Настройка на вашата PATH среда“, изберете „Използване на Git и незадължителни инструменти на Unix от командния ред на Windows " (най-долната опция). Освен това, настройките по подразбиране са добре. Разгледайте Windows стил, Unix стил за окончанията на редовете е добре. +Можете да свалите Git от [git-scm.com](https://git-scm.com/). Можеш да натиснеш „next“ на всички стъпки, с изключение на две: в стъпката, където се изисква да избереш твоя редактор, трябва да избереш Nano, и в стъпката, озаглавена „Настройка на вашата PATH среда“, избери "Използване на Git и незадължителни Unix инструменти от командния ред на Windows" (най-долната опция). Освен това, настройките по подразбиране са добре. Разгледайте Windows стил, Unix стил за окончанията на редовете е добре. -Не забравяйте да рестартирате командния ред или PowerShell, след като инсталацията приключи успешно. +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. -Свалете Git от [git-scm.com](https://git-scm.com/) и следвайте инструкцията. +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. > **Забележка** Ако използвате OS X 10.6, 10.7 или 10.8, ще трябва да инсталирате версията на git от тук: [Инсталатор на Git за OS X Snow Leopard](https://sourceforge.net/projects/git-osx-installer/files/git-2.3.5-intel-universal-snow-leopard.dmg/download) @@ -27,6 +31,15 @@ data-collapse=true ces--> $ sudo apt 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 + + $ 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 + + $ 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/bg/deploy/pythonanywhere.md b/bg/deploy/pythonanywhere.md new file mode 100644 index 00000000000..d3d63ae6ae4 --- /dev/null +++ b/bg/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. + +![The 'New Console' section on the PythonAnywhere web interface, with a button for 'bash'](images/pythonanywhere_bash_console.png) + +> **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/bg/django_admin/README.md b/bg/django_admin/README.md index 4e013509638..79b7a6e7888 100644 --- a/bg/django_admin/README.md +++ b/bg/django_admin/README.md @@ -33,7 +33,7 @@ admin.site.register(Post) (myvenv) C:\Users\Name\djangogirls> python manage.py createsuperuser -Когато бъдете подканени, въведете потребителското си име (малки букви, без интервали), имейл адрес и парола. **Не се притеснявайте, че не можете да видите паролата, която въвеждате - така трябва да бъде.** Въведете я и натиснете `enter`, за да продължите. Резултатът трябва да изглежда така (където потребителското име и имейл трябва да са ваши собствени): +Когато бъдеш подканена, въведи потребителското си име (малки букви, без интервали), имейл адрес и парола. **Не се притеснявайте, че не можете да видите паролата, която въвеждате - така трябва да бъде.** Въведете я и натиснете `enter`, за да продължите. Резултатът трябва да изглежда така (където потребителското име и имейл трябва да са ваши собствени): Username: ola Email address: ola@example.com @@ -46,12 +46,12 @@ admin.site.register(Post) ![Django администратор](images/django_admin3.png) -Отидете на постове и експериментирайте малко с тях. Добавете пет или шест публикации в блога. Не се притеснявайте за съдържанието - вижда се само на вашия локален компютър - можете да копирате и поставите някакъв текст от този урок, за да спестите време. :) +Отидете на постове и експериментирайте малко с тях. Добавете пет или шест публикации в блога. Не се притеснявайте за съдържанието - вижда се само на вашия локален компютър - можете да копирате и поставите някакъв текст от това ръководство, за да спестите време. :) Уверете се, че поне две или три публикации (но не всички) имат зададена дата на публикуване. По-късно ще бъде полезно. ![Django администратор](images/edit_post3.png) -Ако искате да знаете повече за администратора на Django, трябва да проверите документацията на Django: https://docs.djangoproject.com/en/2.2/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 - заслужавате малка почивка! \ No newline at end of file diff --git a/bg/django_forms/README.md b/bg/django_forms/README.md index eca45d6389a..ffbde380d74 100644 --- a/bg/django_forms/README.md +++ b/bg/django_forms/README.md @@ -44,53 +44,64 @@ class PostForm(forms.ModelForm): ## Връзка до страницата чрез формата -Време е да отворим `blog/templates/blog/base.html` в редактора. В `div` наречен `page-header` ще добавим връзка: +Before we add the link, we need some icons to use as buttons for the link. 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/` + +> Note: To download the SVG image, open the context menu on the link (usually by right-clicking on it) and select "Save link as". 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. Now we can use this icon file inside the base template as follows. In the `div` element inside `header` section, we will add a link before the `h1` element: {% filename %}blog/templates/blog/base.html{% endfilename %} ```html - + + {% include './icons/file-earmark-plus.svg' %} + ``` -Забележете, че искаме да извикаме нашия нов изглед `post_new`. Класът `"glyphicon glyphicon-plus"` е предоставен от темата на bootstrap, която използваме и ще покаже знака плюс. +Note that we want to call our new view `post_new`. The [SVG icon](https://icons.getbootstrap.com/icons/file-earmark-plus/) is provided by the [Bootstrap Icons](https://icons.getbootstrap.com/) and it will display a page icon with plus sign. We use a Django template directive called `include`. This will inject the file's content into the Django template. The web browser knows how to handle this type of content without any further processing. + +> You can download all the Bootstrap icons [here](https://github.com/twbs/icons/releases/download/v1.1.0/bootstrap-icons-1.1.0.zip). Unzip the file and copy all the SVG image files into a new folder inside `blog/templates/blog/` called `icons`. That way you can access an icon like `pencil-fill.svg` using the file path `blog/templates/blog/icons/pencil-fill.svg` -След добаване на този ред, вашия HTML файл трябва да изглежда ето така: +After editing the line, your HTML file should now look like this: {% filename %}blog/templates/blog/base.html{% endfilename %} ```html {% load static %} + Django Girls blog - - + - -
+ +
-
+
{% block content %} {% endblock %}
-
+
- ``` -След запазване и обновяване на страницата http://127.0.0.1:8000 трябва да виждате познатата грешка `NoReverseMatch`. Така ли е? Добре! +After saving and refreshing the page http://127.0.0.1:8000 you will see a familiar `NoReverseMatch` error. Is that the case? Good! ## URL -Отваряме файла `blog/urls.py` в редактора и добавяме ред: +We open `blog/urls.py` in the code editor and add a line: {% filename %}blog/urls.py{% endfilename %} @@ -98,12 +109,12 @@ class PostForm(forms.ModelForm): path('post/new/', views.post_new, name='post_new'), ``` -И последния код трябва да изглежда така: +And the final code will look like this: {% filename %}blog/urls.py{% endfilename %} ```python -from django.urls import path +from django.urls import path from . import views urlpatterns = [ @@ -113,11 +124,11 @@ urlpatterns = [ ] ``` -След като обновим сайта виждаме `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 изглед -Време е да отворим файлът `blog/views.py` в редактора и да добавим следните няколко реда от код при останалите във формата +Time to open the `blog/views.py` file in the code editor and add the following lines with the rest of the `from` rows: {% filename %}blog/views.py{% endfilename %} @@ -125,7 +136,7 @@ urlpatterns = [ from .forms import PostForm ``` -И след това нашия изглед: +And then our *view*: {% filename %}blog/views.py{% endfilename %} @@ -135,20 +146,20 @@ def post_new(request): return render(request, 'blog/post_edit.html', {'form': form}) ``` -За да създадем нова форма `Post`, трябва да извикаме `PostForm()` и да я препратим към шаблона (template). Ще се върнем отново на този изглед (view), но сега нека бързо да създадем шаблон (template) за формата. +To create a new `Post` form, we need to call `PostForm()` and pass it to the template. We will go back to this *view*, but for now, let's quickly create a template for the form. ## Шаблон (Template) -Трябва да създадем файл `post_edit.html` в директория `blog/templates/blog` и да го отворим в редактора ни за код. За да направим така, че формата да работи са ни нужни няколко неща: +We need to create a file `post_edit.html` in the `blog/templates/blog` directory, and open it in the code editor. To make a form work we need several things: * Трябва да покажем формата. Можем да направим това чрез (например) {% raw %}`{{ form.as_p }}`{% endraw %}. -* Горният ред трябва да бъде обвит с HTML form tag: `
...
`. +* The line above needs to be wrapped with an HTML form element: `
...
`. * Трябва ни бутон `Save`. Това правим с HTML button: ``. * И най-накрая, точно след отварящия `
` tag трябва да добавим {% raw %}`{% csrf_token %}`{% endraw %}. Това е много важно, тъй като прави нашата форма надеждна! Ако забравите за това, Django ще се оплаче когато се опитате да запазите формата. -![CSFR Забранена страница](images/csrf2.png) +![CSFR Forbidden page](images/csrf2.png) -Добре, нека видим сега как трябва да изглежда HTML кода в `post_edit.html`: +OK, so let's see how the HTML in `post_edit.html` should look: {% filename %}blog/templates/blog/post_edit.html{% endfilename %} @@ -159,24 +170,24 @@ def post_new(request):

New post

{% csrf_token %} {{ form.as_p }} - +
{% endblock %} ``` -Време е да обновим страницата! Иха! Формата се показа! +Time to refresh! Yay! Your form is displayed! -![Нова форма](images/new_form2.png) +![New form](images/new_form2.png) -Но, чакай малко! Когато напишеш нещо в полетата `title` и `text` и се опиташ да го запазиш, какво ще стане? +But, wait a minute! When you type something in the `title` and `text` fields and try to save it, what will happen? -Нищо! Пак сме на същата страница и нашият текст изчезна... и няма нова публикация. Какво се обърка? +Nothing! We are once again on the same page and our text is gone… and no new post is added. So what went wrong? -Отговорът е: нищо. Трябва още малко да поработим върху нашия изглед (*view*). +The answer is: nothing. We need to do a little bit more work in our *view*. ## Запазване на формата -Отворете пак `blog/views.py` в редактора. В момента всичко, което имаме в изгледа на `post_new` е следното: +Open `blog/views.py` once again in the code editor. Currently all we have in the `post_new` view is the following: {% filename %}blog/views.py{% endfilename %} @@ -186,9 +197,9 @@ def post_new(request): return render(request, 'blog/post_edit.html', {'form': form}) ``` -Когато изпратим форматата се връщаме пак на същият изглед, но този път имаме повече данни в запитването (`request`) или по-точно в `request.POST` (наименованието няма нищо общо с блога "post", а с факта, че "публикуваме" информация). Помните ли как в нашия HTML файл при дефинирането на `
` имахме променлива `method="POST"`? Всички тези полета са сега в `request.POST`. Не трябва да преименувате `POST` (друга валидна стойност за `method` е `GET`, но нямаме време да обясним каква е разликата). +When we submit the form, we are brought back to the same view, but this time we have some more data in `request`, more specifically in `request.POST` (the naming has nothing to do with a blog "post"; it's to do with the fact that we're "posting" data). Remember how in the HTML file, our `` definition had the variable `method="POST"`? All the fields from the form are now in `request.POST`. You should not rename `POST` to anything else (the only other valid value for `method` is `GET`, but we have no time to explain what the difference is). -И така в нашия изглед (*view*) имаме две отделни ситуации да разрешим: първо, когато достъпваме страницата за първи път и искаме празна форма, и второ, когато се върнем назад към изгледа (*view*) с всичките данни които сме въвели във формата. Тоест трябва да добавим условие (ще използваме `if` за тази цел): +So in our *view* we have two separate situations to handle: first, when we access the page for the first time and we want a blank form, and second, when we go back to the *view* with all form data we just typed. So we need to add a condition (we will use `if` for that): {% filename %}blog/views.py{% endfilename %} @@ -199,7 +210,7 @@ else: form = PostForm() ``` -Време е да попълним празното място `[...]`. Ако `method`-а е `POST` тогава искаме да изградим `PostForm` с данни от формата, нали? Ще направим това както следва: +It's time to fill in the dots `[...]`. If `method` is `POST` then we want to construct the `PostForm` with data from the form, right? We will do that as follows: {% filename %}blog/views.py{% endfilename %} @@ -207,9 +218,9 @@ else: form = PostForm(request.POST) ``` -Следващото нещо е да проверим дали формата е вярна (всики полета които се изискват да са определени и да няма неправилно въведени стойности). Правим това чрез `form.is_valid()`. +The next thing is to check if the form is correct (all required fields are set and no incorrect values have been submitted). We do that with `form.is_valid()`. -Проверяваме дали формата е валидна и ако да в запазваме! +We check if the form is valid and if so, we can save it! {% filename %}blog/views.py{% endfilename %} @@ -221,18 +232,18 @@ if form.is_valid(): post.save() ``` -Основно имаме две неща: запазваме формата с `form.save` и добавяме автор (тъй като няма поле `author` във формата `PostForm` а това поле се изисква). `commit=False` означава, че не искаме все още да запазим моделът `Post` - искаме да добавим първо автора. През повечето време ще използвате `form.save()` без `commit=False`, но в този случай трябва да се снабдим с него. `post.save()` ще запази промените (добавяне на автора) и новата публикация в блога е създадена! +Basically, we have two things here: we save the form with `form.save` and we add an author (since there was no `author` field in the `PostForm` and this field is required). `commit=False` means that we don't want to save the `Post` model yet – we want to add the author first. Most of the time you will use `form.save()` without `commit=False`, but in this case, we need to supply it. `post.save()` will preserve changes (adding the author) and a new blog post is created! -Накрая, би било добре ако можем веднага да отидем на страницата `post_detail` за нашата новосъздадена блог публикация, нали? За да направим това трябва ни трябва още едно въвеждане: +Finally, it would be awesome if we could immediately go to the `post_detail` page for our newly created blog post, right? To do that we need one more import: -{% filename %}blog/views.py{% endfilename %} +{% filename %}blog/views.py{% endfilename %} ```python from django.shortcuts import redirect ``` -Добавете го в самото начало на вашия файл. И сега можем да кажем "отиди на страница `post_detail` за новосъздадената публикация": +Add it at the very beginning of your file. And now we can say, "go to the `post_detail` page for the newly created post": {% filename %}blog/views.py{% endfilename %} @@ -241,9 +252,9 @@ return redirect('post_detail', pk=post.pk) ``` -`post_detail` е името на изгледа, на който искаме да отидем. Помните ли, че този изглед (*view*) изискваше стойност `pk`? За да го предадем на изгледа използваме `pk=post.pk`, където `post` е новосъздадена публикация! +`post_detail` is the name of the view we want to go to. Remember that this *view* requires a `pk` variable? To pass it to the views, we use `pk=post.pk`, where `post` is the newly created blog post! -И така, говорихме много, но може би искаме да видим как изглежда всичко, нали? +OK, we've talked a lot, but we probably want to see what the whole *view* looks like now, right? {% filename %}blog/views.py{% endfilename %} @@ -262,39 +273,45 @@ def post_new(request): return render(request, 'blog/post_edit.html', {'form': form}) ``` -Нека видим дали работи. Отидете на страница http://127.0.0.1:8000/post/new, добвавете `title` и `text`, запазете..и voilà! Новата публикация е добавена и сме пренасочени към страница `post_detail`! +Let's see if it works. Go to the page http://127.0.0.1:8000/post/new/, add a `title` and `text`, save it… and voilà! The new blog post is added and we are redirected to the `post_detail` page! -Може би забелязахте, че избираме датата на публикуване преди да запазим публикацията. По-късно ще се запознаем с *publish button* in **Django Girls Tutorial: Extensions**. +You might have noticed that we are setting the publish date before saving the post. Later on, we will introduce a *publish button* in **Django Girls Tutorial: Extensions**. -Това е страхотно! +That is awesome! -> Тъй като наскоро ползвахме административния интерфейс на Django, системата в момента си мисли, че сме влезнали в акаунта си. Има няколко ситуации, които могат да доведат до излизане от акаунта (затваряне на търсачката, рестартиране на базата данни, и др.). Ако при създаване на нова публикация получавате грешки свързани с потребител, който не е влязал в акаунта си, отидете на администраторската страница http://127.0.0.1:8000/admin и влезте пак в акаунта си. Това ще реши проблема временно. Има дълготрайно решение на проблема, което ви очаква в раздела **Домашна работа: добавяне на сигурност към уеб страницата ви!** намиращ се след главното ръководство. +> As we have recently used the Django admin interface, the system currently thinks we are still logged in. There are a few situations that could lead to us being logged out (closing the browser, restarting the DB, etc.). If, when creating a post, you find that you are getting errors referring to the lack of a logged-in user, head to the admin page http://127.0.0.1:8000/admin and log in again. This will fix the issue temporarily. There is a permanent fix awaiting you in the **Homework: add security to your website!** chapter after the main tutorial. -![Грешка при влизане](images/post_create_error.png) +![Logged in error](images/post_create_error.png) ## Проверка на формите (Form validation) -Сега ще ви покажем колко са готини формите на Django. Една публикация трябва да има полета за `title` и `text`. В нашия `Post` модел не казахме дали тези полета се изискват (както при `published_date`), така че Django очаква те да са нагласени по подразбиране. +Now, we will show you how cool Django forms are. A blog post needs to have `title` and `text` fields. In our `Post` model we did not say that these fields (as opposed to `published_date`) are not required, so Django, by default, expects them to be set. -Опитайте се да запазите формата без `title` и `text`. Познайте какво ще стане! +Try to save the form without `title` and `text`. Guess what will happen! -![Проверка на форма](images/form_validation2.png) +![Form validation](images/form_validation2.png) -Django се грижи за проверката дали всички полета във формата ни са правилни. Не е ли готино? +Django is taking care to validate that all the fields in our form are correct. Isn't it awesome? ## Редактиране на формата -Сега знаем как да добавим нова публикация. Но какво ако искаме да променим вече съществуваща? Това много прилича на това, което тъкмо направихме. Нека набързо да създадем няколко важни неща. (Ако не разбирате нещо, попитайте инструктора си или вижте в предходните глави, тъй като вече минахме врез всичко това.) +Now we know how to add a new post. But what if we want to edit an existing one? This is very similar to what we just did. Let's create some important things quickly. (If you don't understand something, you should ask your coach or look at the previous chapters, since we covered all these steps already.) + +First, let's save the icon which represents the edit button. Download [pencil-fill.svg](https://raw.githubusercontent.com/twbs/icons/main/icons/pencil-fill.svg) and save it to the location `blog/templates/blog/icons/`. -Отворете `blog/templates/blog/post_detail.html` в редактора и добавете реда +Open `blog/templates/blog/post_detail.html` in the code editor and add the following code inside `article` element: {% filename %}blog/templates/blog/post_detail.html{% endfilename %} ```html - + ``` -така че шаблона (template) да изглежда така: +so that the template will look like this: {% filename %}blog/templates/blog/post_detail.html{% endfilename %} @@ -302,20 +319,24 @@ Django се грижи за проверката дали всички поле {% extends 'blog/base.html' %} {% block content %} -
+
+ {% endblock %} ``` -Отворете `blog/urls.py` в редактора и добавете този ред: +Open `blog/urls.py` in the code editor, and add this line: {% filename %}blog/urls.py{% endfilename %} @@ -323,9 +344,9 @@ Django се грижи за проверката дали всички поле path('post//edit/', views.post_edit, name='post_edit'), ``` -Ще използваме пак шаблона `blog/templates/blog/post_edit.html`, така че последното липсващо нещо е изгледа (*view*). +We will reuse the template `blog/templates/blog/post_edit.html`, so the last missing thing is a *view*. -Нека отворим `blog/views.py` в редактора и да добваим това накрая на файла: +Let's open `blog/views.py` in the code editor and add this at the very end of the file: {% filename %}blog/views.py{% endfilename %} @@ -345,7 +366,7 @@ def post_edit(request, pk): return render(request, 'blog/post_edit.html', {'form': form}) ``` -Това изглежда почти еднакво с нашия изглед `post_new`, нали? Но не изцяло. Първо зададохме допълнителен `pk` параметър от `urls`. После взехме `Post` модела, който искаме да променим с `get_object_or_404(Post, pk=pk)` и накрая, когато създаваме форма, подаваме тази публикация като инстанция (`instance`), когето запазваме формата... +This looks almost exactly the same as our `post_new` view, right? But not entirely. For one, we pass an extra `pk` parameter from `urls`. Next, we get the `Post` model we want to edit with `get_object_or_404(Post, pk=pk)` and then, when we create a form, we pass this post as an `instance`, both when we save the form… {% filename %}blog/views.py{% endfilename %} @@ -353,7 +374,7 @@ def post_edit(request, pk): form = PostForm(request.POST, instance=post) ``` -... и когато отваряме формата с публикацията, която искаме да променим: +…and when we've just opened a form with this post to edit: {% filename %}blog/views.py{% endfilename %} @@ -361,76 +382,84 @@ form = PostForm(request.POST, instance=post) form = PostForm(instance=post) ``` -Добре! Нека проверим дали работи! Да отидем на страница `post_detail`. Трябва да има бутон за редактиране в горния десен ъгъл: +OK, let's test if it works! Let's go to the `post_detail` page. There should be an edit button in the top-right corner: -![Бутон за редактиране](images/edit_button2.png) +![Edit button](images/edit_button2.png) -Когато го натиснете, ще видите формата с нашата публикация: +When you click it you will see the form with our blog post: -![Форма на редактиране](images/edit_form2.png) +![Edit form](images/edit_form2.png) -Можете да промените заглавието или текста и да запазите промените! +Feel free to change the title or the text and save the changes! -Поздравления! Вашата апликация изглежда все по- и по-завършена! +Congratulations! Your application is getting more and more complete! -Ако искате повече информация относно Django формите, трябва да прочетете документацията: https://docs.djangoproject.com/en/2.2/topics/forms/ +If you need more information about Django forms, you should read the documentation: https://docs.djangoproject.com/en/3.2/topics/forms/ ## Сигурност -Да можете да създадете нови публикация чрез един клие е страхотно! Но сега всеки, който посети вашата страница ще може да създаде нова публикация и това е нещо, което може би не искате. Нека направим така, че бутонът да се показва за вас, но не и за останалите. +Being able to create new posts by clicking a link is awesome! But right now, anyone who visits your site will be able to make a new blog post, and that's probably not something you want. Let's make it so the button shows up for you but not for anyone else. -Отворете `blog/templates/blog/base.html` в редактора и намерете `page-header` `div` и реда посочващ anchor tag, който по-рано сложихте там. Трябва да изглежда така: +Open `blog/templates/blog/base.html` in the code editor, find our `div` inside `header` and the anchor element you put in there earlier. It should look like this: {% filename %}blog/templates/blog/base.html{% endfilename %} ```html - + + {% include './icons/file-earmark-plus.svg' %} + ``` -Ще добавим още един `{% if %}` към това, което ще накара връзката да се показва само за потребители, които са влезнали в административния панел. В момента това си само ти! Променете `` да изглежда така: +We're going to add another `{% if %}` tag to this, which will make the link show up only for users who are logged into the admin. Right now, that's just you! Change the `` element to look like this: {% filename %}blog/templates/blog/base.html{% endfilename %} ```html {% if user.is_authenticated %} - + + {% include './icons/file-earmark-plus.svg' %} + {% endif %} ``` -Този `{% if %}` ще накара връзката да се изпраща до търсачката, само ако потребителят, който изисква страницата е влязъл в акаунта си. Това не предпазва напълно от създаване на нови публикации, но е добре като за начало. Ще покрием повече относно сигурността в продължението на уроците. +This `{% if %}` will cause the link to be sent to the browser only if the user requesting the page is logged in. This doesn't protect the creation of new posts completely, but it's a good first step. We'll cover more security in the extension lessons. -Помните ли иконата за редактиране, която тъкмо добавихме в страницата ни с детайли? Ще добавим същата промяна и там, така че други хора да не могат да променят съществуващи публикации. +Remember the edit icon we just added to our detail page? We also want to add the same change there, so other people won't be able to edit existing posts. -Отворете `blog/templates/blog/post_detail.html` в редактрора и намерете този ред: +Open `blog/templates/blog/post_detail.html` in the code editor and find this line: -{% filename %}blog/templates/blog/post_detail.html{% endfilename %} +{% filename %}blog/templates/blog/post_detail.html{% endfilename %} ```html - + + {% include './icons/pencil-fill.svg' %} + ``` -Променете го на това: +Change it to this: {% filename %}blog/templates/blog/post_detail.html{% endfilename %} ```html {% if user.is_authenticated %} - + + {% include './icons/pencil-fill.svg' %} + {% endif %} ``` -Тъй като най-вероятно сте в акаунта си, ако опресните страницата, няма да видите разликата. Заредете страницата в друга търсачка или в инкогнито прозорец (наречен още "InPrivate" в Windows Edge) и ще видите, че връзката не се показва и иконата също не се появява на екрана! +Since you're likely logged in, if you refresh the page, you won't see anything different. Load the page in a different browser or an incognito window (called "InPrivate" in Windows Edge), though, and you'll see that the link doesn't show up, and the icon doesn't display either! ## Още едно нещо: време за deploy -Нека видим дали всичко работи на PythonAnywhere. Време е за още един deploy! +Let's see if all this works on PythonAnywhere. Time for another deploy! * Първо съхранете новия си код и го пратете към GitHub: {% filename %}command-line{% endfilename %} $ git status - $ git add --all . + $ git add . $ git status $ git commit -m "Added views to create/edit blog post inside the site." $ git push @@ -445,8 +474,8 @@ form = PostForm(instance=post) [...] -(Не забравяйте да замените `` с вашият PythonAnywhere субдомейн без скобите.) +(Remember to substitute `` with your actual PythonAnywhere subdomain, without the angle-brackets.) * Накрая отидете на ["Web" страница](https://www.pythonanywhere.com/web_app_setup/), използвайте бутона от менюто в горният десен ъгъл на конзолата) и натиснете **Reload**. Опреснете блога си https://subdomain.pythonanywhere.com за да видите промените. -Това е! Поздравления :) \ No newline at end of file +And that should be it. Congrats! :) \ No newline at end of file diff --git a/bg/django_installation/README.md b/bg/django_installation/README.md index 8101319c259..9af34473be4 100644 --- a/bg/django_installation/README.md +++ b/bg/django_installation/README.md @@ -2,6 +2,6 @@ > **Забележка** Ако използвате Chromebook, пропуснете тази глава и се уверете, че следвате инструкциите [Настройка на Chromebook](../chromebook_setup/README.md). > -> **Забележка** Ако вече сте минали през стъпките за инсталиране, тогава вече сте направили това - можете да преминете направо към следващата глава! +> **Note** If you already worked through the [installation steps](../installation/README.md) then you've already done this – you can go straight to the next chapter! {% include "/django_installation/instructions.md" %} \ No newline at end of file diff --git a/bg/django_installation/instructions.md b/bg/django_installation/instructions.md index 3dfa03b5c53..8c3abe0252d 100644 --- a/bg/django_installation/instructions.md +++ b/bg/django_installation/instructions.md @@ -1,6 +1,6 @@ -> Част от този раздел е базиран на уроци от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots). +> Част от този раздел е базирана на ръководства от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots). > -> Част от този раздел е базиран на [ django-marcador    урок ](http://django-marcador.keimlink.de/) лицензиран съгласно Creative Commons    Attribution-ShareAlike 4.0 международен лиценз. Урокът за джанго-маркадор е защитен с авторско право от Markus Zapke-Gründemann et al. +> Част от този раздел е базирана на [django-marcador ръководство](http://django-marcador.keimlink.de/) лицензиранo съгласно Creative Commons Attribution-ShareAlike 4.0 International License. Ръководството django-marcador е защитено с авторско право от Markus Zapke-Gründemann et al. ## Виртуална среда @@ -12,7 +12,7 @@ > **ЗАБЕЛЕЖКА:** В Windows се уверете, че тази директория не съдържа акцентирани или специални знаци; ако вашето потребителско име съдържа символи с ударение, използвайте друга директория, например, `C:\djangogirls`. -За този урок ще използваме нова директория `djangogirls` от вашата домашна директория: +За това ръководство ще използваме нова директория `djangogirls` от вашата домашна директория: {% filename %}command-line{% endfilename %} @@ -30,14 +30,14 @@ -За да създадете нов `virtualenv `, трябва да отворите командния ред и да стартирате `python -m venv myvenv`. Ще изглежда така: +За да създадеш нов `virtualenv`, трябва да отвориш командния ред и да стартираш `python -m venv myvenv`. Ще изглежда така: {% filename %}command-line{% endfilename %} C:\Users\Name\djangogirls> python -m venv myvenv -Където `myvenv` е името на вашата `virtualenv`. Можете да използвате всяко друго име, но се придържайте към малки букви и не използвайте интервали, ударения или специални знаци. Също така е добре името да бъде кратко - ще го препращате много! +Където `myvenv` е името на вашата `virtualenv`. Можете да използвате всяко друго име, но се придържайте към малки букви и не използвайте интервали, ударения или специални знаци. It is also a good idea to keep the name short – you'll be referencing it a lot! @@ -79,7 +79,7 @@ data-collapse=true ces--> > {% filename %}command-line{% endfilename %} > > $ sudo apt install python-virtualenv -> $ virtualenv --python=python3.6 myvenv +> $ virtualenv --python=python{{ book.py_version }} myvenv > > > **ЗАБЕЛЕЖКА:** Ако получите грешка като @@ -93,14 +93,14 @@ data-collapse=true ces--> > > {% filename %}command-line{% endfilename %} > -> sudo apt install python3.6-venv +> sudo apt install python{{ book.py_version }}-venv > ## Работа с virtualenv -Командата по-горе ще създаде директория с име `myvenv` (или каквото име сте си избрали), която съдържа нашата виртуална среда (по същество куп директории и файлове). +The command above will create a directory called `myvenv` (or whatever name you chose) that contains our virtual environment (basically a bunch of directories and files). @@ -112,7 +112,7 @@ data-collapse=true ces--> C:\Users\Name\djangogirls> myvenv\Scripts\activate -> **Забележка:** При Windows 10 можете да получите грешка в прозореца на PowerShell `execution of scripts is disabled on this system`. В този случай трябва да отворите нов прозорец на PowerShell като изберете "Run as Administrator." След това напишете следната команда преди да стартирате виртуалната си среда: +> **NOTE:** On Windows 10 you might get an error in the Windows PowerShell that says `execution of scripts is disabled on this system`. В този случай трябва да отворите нов прозорец на PowerShell като изберете "Run as Administrator." След това напишете следната команда преди да стартирате виртуалната си среда: > > {% filename %}command-line{% endfilename %} > @@ -123,12 +123,12 @@ data-collapse=true ces--> -> **Забележка:** За потребителите на популярният редактор VS Code, който идва с интегриран терминал базиран на windows PowerShell, и ако искате да се придържате към интегрирания терминал, трябва да напишете следната команда за да активирате виртуалната си среда: +> **NOTE:** For users of the popular editor VS Code, which comes with an integrated terminal based off windows PowerShell, if you wish to stick with the integrated terminal, you may run the following command to activate your virtual environment: > > $ . myvenv\Scripts\activate.ps1 > > -> Предимството е, че не трябва да сменяте прозорците между IDE и command-line. +> Предимството е, че не е необходимо да сменяте между прозорците на IDE и командния ред. @@ -144,7 +144,7 @@ data-collapse=true ces--> Помнете, че трябва да заместите `myvenv` с името на вашата избрана `virtualenv`. -> **Забележка:** понякога `source` може да не е на лице. В тези случаи трябва да направите следното: +> **NOTE:** If the command `source` is not available, try doing this instead: > > {% filename %}command-line{% endfilename %} > @@ -154,7 +154,7 @@ data-collapse=true ces--> -Ще разберете, че виртуалната ви среда е стартирана като видите подсказването в конзолата ви, което започва с `(myvenv)`. +Ще разбереш, че `virtualenv` е стартирана като видиш че подканата в конзолата ти започва с `(myvenv)`. Когато работите от виртуална среда, `python` автоматично ще се насочи към правилната версия, така че може да използвате команда `python` вместо `python3`. @@ -197,7 +197,7 @@ data-collapse=true ces--> (myvenv) ~$ pip install -r requirements.txt Collecting Django~={{ book.django_version }} (from -r requirements.txt (line 1)) - Downloading Django-{{ book.django_version }}-py3-none-any.whl (7.1MB) + Downloading Django-{{ book.django_version }}-py3-none-any.whl (7.9MB) Installing collected packages: Django Successfully installed Django-{{ book.django_version }} @@ -205,14 +205,14 @@ data-collapse=true ces--> -> Ако се появи грешка когато извикате команда pip на Windows платформа, проверете дали името на пътя на проекта ви съдържа празно място, знак за ударение или други специални знаци. (например , `C:\Users\User Name\djangogirls`). Ако съдържа, моля помислете за друго място без разстояние, знак за ударение или други специални знаци (предложение: `C:\djangogirls`). Създайте нова виртуална среда в новата директория, след това изтрийте старата и опитайте отново командата. (Преместването на папката с виртуална среда няма да работи, тъй като виртуалната среда използва абсолютни пътеки.) +> If you get an error when calling pip on Windows, please check if your project pathname contains spaces, accents or special characters (for example, `C:\Users\User Name\djangogirls`). Ако съдържа, моля помислете за друго място без разстояние, знак за ударение или други специални знаци (предложение: `C:\djangogirls`). Създайте нова виртуална среда в новата директория, след това изтрийте старата и опитайте отново командата. (Преместването на папката с виртуална среда няма да работи, тъй като виртуалната среда използва абсолютни пътеки.) -> Вашият command line може да забие след като се опитате да инсталирате Django. Ако това се случи напишете следната команда вместо горната: +> Your command line might freeze when you try to install Django. If this happens, instead of the above command use: > > {% filename %}command-line{% endfilename %} > diff --git a/bg/django_models/README.md b/bg/django_models/README.md index 85aed520255..e28a17915e1 100644 --- a/bg/django_models/README.md +++ b/bg/django_models/README.md @@ -77,28 +77,29 @@ djangogirls ├── blog - │ ├── admin.py - │ ├── apps.py - │ ├── __init__.py - │ ├── migrations - │ │ └── __init__.py - │ ├── models.py - │ ├── tests.py - │ └── views.py + │   ├── admin.py + │   ├── apps.py + │   ├── __init__.py + │   ├── migrations + │   │   └── __init__.py + │   ├── models.py + │   ├── tests.py + │   └── views.py ├── db.sqlite3 ├── manage.py ├── mysite - │ ├── __init__.py - │ ├── settings.py - │ ├── urls.py - │ └── wsgi.py + │   ├── asgi.py + │   ├── __init__.py + │   ├── settings.py + │   ├── urls.py + │   └── wsgi.py ├── myvenv - │ └── ... + │   └── ... └── requirements.txt -След създаването на приложение също трябва да кажем на Django, че трябва да го използва. Правим това във файла `mysite/settings.py` -- отваряме го във вашия редактор на кодове. Трябва да намерим `INSTALLED_APPS` и да добавим ред, съдържащ `'blog.apps.BlogConfig'`. Така че крайният продукт трябва да изглежда така: +След създаването на приложение също трябва да кажем на Django, че трябва да го използва. Правим това във файла `mysite/settings.py` -- отваряме го във вашия редактор на кодове. We need to find `INSTALLED_APPS` and add a line containing `'blog',` just above `]`. Така че крайният продукт трябва да изглежда така: {% filename %}mysite/settings.py{% endfilename %} @@ -110,7 +111,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'blog.apps.BlogConfig', + 'blog', ] ``` @@ -162,7 +163,7 @@ class Post(models.Model): - `models.DateTimeField` -- това е дата и час. - `models.ForeignKey` -- това е връзка към друг модел. -Тук няма да обясняваме всяка част от кода, тъй като това ще отнеме твърде много време. Трябва да разгледате документацията на Django, ако искате да знаете повече за моделните полета и как да дефинирате неща, различни от описаните по-горе (https://docs.djangoproject.com/en/2.2/ref/models/fields/#field -types). +Тук няма да обясняваме всяка част от кода, тъй като това ще отнеме твърде много време. You should take a look at Django's documentation if you want to know more about Model fields and how to define things other than those described above (https://docs.djangoproject.com/en/3.2/ref/models/fields/#field-types). Какво ще кажете за `def publish(self):`? Това е точно методът `publish`, за който говорихме преди. `def` означава, че това е функция/метод и `publish` е името на метода. Можете да промените името на метода, ако искате. Правилото за именуване е, че използваме малки букви и подчертавки вместо интервали (прасни места). Например метод, който изчислява средна цена, може да се нарече `calculate_average_price`. @@ -180,9 +181,9 @@ class Post(models.Model): (myvenv) ~/djangogirls$ python manage.py makemigrations blog Migrations for 'blog': - blog/migrations/0001_initial.py: + blog/migrations/0001_initial.py - - Create model Post + - Create model Post **Забележка:** Не забравяйте да запазите файловете, които редактирате. В противен случай компютърът ви ще изпълни предишната версия, която може да ви даде неочаквани съобщения за грешка. diff --git a/bg/django_orm/README.md b/bg/django_orm/README.md index ccb19494aa3..411c10c96a7 100644 --- a/bg/django_orm/README.md +++ b/bg/django_orm/README.md @@ -26,7 +26,7 @@ QuerySet е по същество списък на обекти на даден >>> ``` -Вече сте в интерактивната конзола на Django. Това е точно като Python конзолата, но с допълнителна магия на Django. :) Тук можете да използвате всички Python команди. +Вече си в интерактивната конзола на Django. Това е точно като Python подкана, но с допълнителна магия на Django. :) Тук можеш да използваш всички Python команди. ### Всички обекти diff --git a/bg/django_start_project/README.md b/bg/django_start_project/README.md index 32c5fbe38c6..05e32241efa 100644 --- a/bg/django_start_project/README.md +++ b/bg/django_start_project/README.md @@ -1,8 +1,8 @@ # Вашият първи проект с Django! -> Част от тази глава е базирана на уроци от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots). +> Част от тази глава е базирана на ръководства от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots). > -> Части от тази глава се основават на [django-marcador tutorial](http://django-marcador.keimlink.de/), лицензиран съгласно лиценза Creative Commons Attribution-ShareAlike 4.0 International. Урокът за django-marcador е защитен с авторско право от Markus Zapke-Gründemann и сие. +> Части от тази глава са базирани на [django-marcador ръководство](http://django-marcador.keimlink.de/), лицензирано съгласно лиценза Creative Commons Attribution-ShareAlike 4.0 International. Ръководството на django-marcador е защитено с авторско право от Markus Zapke-Gründemann et al. Ще създадем малък блог! @@ -23,7 +23,7 @@ > Точката `.` е от решаващо значение, тъй като казва на скрипта да инсталира Django във вашата текуща директория (за която точката `.` е препратка). > -> **Забележка** Когато пишете командата по-горе, не забравяйте, че въвеждате само частта, която започва от `django-admin`. Частта `(myvenv) ~/djangogirls$`, показана тук, е само пример за подкана, която ще покани вашия вход във вашия команден ред. +> **Забележка** Когато пишете командата по-горе, не забравяйте, че въвеждате само частта, която започва от `django-admin`. Частта `(myvenv) ~/djangogirls$`, показана тук, е само пример за подкана, която ще покани твоето въвеждане във твоя команден ред. @@ -38,7 +38,7 @@ > Точката `.` е от решаващо значение, тъй като казва на скрипта да инсталира Django във вашата текуща директория (за която точката `.` е препратка). > -> **Забележка** Когато пишете командата по-горе, не забравяйте, че въвеждате само частта, която започва от `django-admin.exe`. Частта `(myvenv) C:\Users\Name\djangogirls>`, показана тук, е само пример за подкана, която ще покани вашия вход във вашия команден ред. +> **Забележка** Когато пишете командата по-горе, не забравяйте, че въвеждате само частта, която започва от `django-admin.exe`. Частта `(myvenv) C:\Users\Name\djangogirls>`, показана тук, е само пример за подкана, която ще покани твоето въвеждане във твоя команден ред. @@ -47,12 +47,13 @@ djangogirls ├── manage.py ├── mysite - │ ├── __init__.py - │ ├── settings.py - │ ├── urls.py - │ └── wsgi.py + │   ├── asgi.py + │   ├── __init__.py + │   ├── settings.py + │   ├── urls.py + │   └── wsgi.py ├── myvenv - │ └── ... + │   └── ... └── requirements.txt @@ -82,7 +83,7 @@ TIME_ZONE = 'Europe/Berlin' ``` -Езиков код се състои от езика, напр. `en` за английски или `de` за немски, и кодът на държавата, напр. `de` за Германия или `ch` за Швейцария. Ако английският не е вашият роден език, можете да добавите това, за да промените бутоните по подразбиране и известията от Django, за да бъдат на вашия език. Така че ще имате бутон „Отказ“, преведен на езика, който сте дефинирали тук. [Django идва с много подготвени преводи](https://docs.djangoproject.com/en/2.2/ref/settings/#language-code). +Езиков код се състои от езика, напр. `en` за английски или `de` за немски, и кодът на държавата, напр. `de` за Германия или `ch` за Швейцария. Ако английският не е вашият роден език, можете да добавите това, за да промените бутоните по подразбиране и известията от Django, за да бъдат на вашия език. Така че ще имате бутон „Отказ“, преведен на езика, който сте дефинирали тук. [Django comes with a lot of prepared translations](https://docs.djangoproject.com/en/3.2/ref/settings/#language-code). Ако искате друг език, променете езиковия код, като промените следния ред: @@ -92,13 +93,13 @@ TIME_ZONE = 'Europe/Berlin' LANGUAGE_CODE = 'de-ch' ``` -Ще трябва също да добавим път за статични файлове. (Ще разберем всичко за статичните файлове и CSS по-късно в урока.) Слезте до *края* на файла и точно под надписа `STATIC_URL` добавете нов, наречен `STATIC_ROOT`: +Ще трябва също да добавим път за статични файлове. (Ще разберем всичко за статичните файлове и CSS по-късно в ръководството.) Слезте до *края* на файла и точно под надписа `STATIC_URL` добавете нов, наречен `STATIC_ROOT`: {% filename %}mysite/settings.py{% endfilename %} ```python STATIC_URL = '/static/' -STATIC_ROOT = os.path.join(BASE_DIR, 'static') +STATIC_ROOT = BASE_DIR / 'static' ``` Когато `DEBUG` е `True` и `ALLOWED_HOSTS` е празен, хостът е валидиран срещу `['localhost', '127.0.0.1', '[::1]']`. Това няма да съвпада с името на хоста ни в PythonAnywhere, след като разширим нашето приложение, така че ще променим следната настройка: @@ -112,6 +113,48 @@ ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com'] > **Забележка**: Ако използвате Chromebook, добавете този ред в долната част на вашия settings.py файл:    `MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'` > > Също така добавете `.amazonaws.com` към `ALLOWED_HOSTS`, ако използвате cloud9 +> +> If you are hosting your project on `Glitch.com`, let us protect the Django secret key that needs to remain confidential (otherwise, anyone remixing your project could see it): +> +> - First, we are going to create a random secret key. Open the Glitch terminal again, and type the following command: +> +> {% filename %}command-line{% endfilename %} +> +> ```bash +> python -c 'from django.core.management.utils import get_random_secret_key; \ +> print(get_random_secret_key())' +> ``` +> +> This should display a long random string, perfect to use as a secret key for your brand new Django web site. We will now paste this key into a `.env` file that Glitch will only show you if you are the owner of the web site. +> +> - Create a file `.env` at the root of your project and add the following property in it: +> +> {% filename %}.env{% endfilename %} +> +> ```bash +> # Here, inside the single quotes, you can cut and paste the random key generated above +> SECRET='3!0k#7ds5mp^-x$lqs2%le6v97h#@xopab&oj5y7d=hxe511jl' +> ``` +> +> - Then update the Django settings file to inject this secret value and set the Django web site name: +> +> {% filename %}mysite/settings.py{% endfilename %} +> +> ```python +> import os +> +> SECRET_KEY = os.getenv('SECRET') +> ``` +> +> - And a little further down in the same file, we inject the name of your new Glitch website: +> +> {% filename %}mysite/settings.py{% endfilename %} +> +> ```python +> ALLOWED_HOSTS = [os.getenv('PROJECT_DOMAIN') + ".glitch.me"] +> ``` +> +> The `PROJECT_DOMAIN` value is automatically generated by Glitch. It will correspond to the name of your project. ## Създаване на база данни @@ -125,7 +168,7 @@ ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + 'NAME': BASE_DIR / 'db.sqlite3', } } ``` @@ -136,13 +179,13 @@ DATABASES = { (myvenv) ~/djangogirls$ python manage.py migrate Operations to perform: - Apply all migrations: auth, admin, contenttypes, sessions + Apply all migrations: admin, auth, contenttypes, sessions Running migrations: - Rendering model states... DONE Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK + Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK @@ -152,7 +195,10 @@ DATABASES = { Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK - Applying sessions.0001_initial... ОК + Applying auth.0010_alter_group_name_max_length... OK + Applying auth.0011_update_proxy_permissions... OK + Applying auth.0012_alter_user_first_name_max_length... OK + Applying sessions.0001_initial... OK И ние сме готови! Време е да стартирате уеб сървъра и да видите дали уебсайтът ни работи! @@ -173,35 +219,48 @@ DATABASES = { (myvenv) ~/djangogirls$ python manage.py runserver 0.0.0.0:8080 -Ако сте в Windows и това не успее с `UnicodeDecodeError`, използвайте вместо това тази команда: +or this one if you are using Glitch: + +{% filename %}Glitch.com terminal{% endfilename %} + + $ refresh + + + +If you are on Windows and this fails with `UnicodeDecodeError`, use this command instead: {% filename %}command-line{% endfilename %} (myvenv) ~/djangogirls$ python manage.py runserver 0:8000 -Сега трябва да проверите дали уебсайтът ви работи. Отворете браузъра си (Firefox, Chrome, Safari, Internet Explorer или каквото използвате) и въведете този адрес: +Now you need to check that your website is running. Open your browser (Firefox, Chrome, Safari, Internet Explorer or whatever you use) and enter this address: {% filename %}browser{% endfilename %} http://127.0.0.1:8000/ -Ако използвате Chromebook и Cloud9, вместо това щракнете върху URL адреса в изскачащия прозорец, който би трябвало да се появи в горния десен ъгъл на командния прозорец, където работи уеб сървърът. URL адресът ще изглежда като: +If you're using a Chromebook and Cloud9, instead click the URL in the pop-up window that should have appeared in the upper right corner of the command window where the web server is running. The URL will look something like: {% filename %}browser{% endfilename %} https://.vfs.cloud9.us-west-2.amazonaws.com -Честито! Току-що създадохте първия си уебсайт и го стартирате с помощта на уеб сървър! Това не е ли страхотно? +or on Glitch: + + https://name-of-your-glitch-project.glitch.me + + +Congratulations! You've just created your first website and run it using a web server! Isn't that awesome? -![Инсталирането работи!](images/install_worked.png) +![Install worked!](images/install_worked.png) -Обърнете внимание, че командният прозорец може да стартира само едно по едно и командният прозорец, който отворихте по-рано, работи на уеб сървъра. Докато уеб сървърът работи и чака допълнителни входящи заявки, терминалът ще приема нов текст, но няма да изпълнява нови команди. +Note that a command window can only run one thing at a time, and the command window you opened earlier is running the web server. As long as the web server is running and waiting for additional incoming requests, the terminal will accept new text but will not execute new commands. > Прегледахме как работят уеб сървърите в главата **Как работи Интернет**. -За да въведете допълнителни команди, докато уеб сървърът работи, отворете нов прозорец на терминала и активирайте своята virtualenv - за да прегледате инструкциите как да отворите втори прозорец на терминала, вижте [Въведение в командния ред](../intro_to_command_line/README.md). За да спрете уеб сървъра, върнете се обратно към прозореца, в който работи, и натиснете CTRL + C - Control и C клавиши заедно (във Windows може да се наложи да натиснете Ctrl + Break). +To type additional commands while the web server is running, open a new terminal window and activate your virtualenv -- to review instructions on how to open a second terminal window, see [Introduction to the command line](../intro_to_command_line/README.md). To stop the web server, switch back to the window in which it's running and press CTRL+C - Control and C keys together (on Windows, you might have to press Ctrl+Break). -Готови ли сте за следващата стъпка? Време е да създадете малко съдържание! \ No newline at end of file +Ready for the next step? It's time to create some content! \ No newline at end of file diff --git a/bg/django_templates/README.md b/bg/django_templates/README.md index 1313ac56932..5791901fad5 100644 --- a/bg/django_templates/README.md +++ b/bg/django_templates/README.md @@ -20,7 +20,7 @@ {{ posts }} ``` -Пробвайте това във вашия шаблон `blog/templates/blog/post_list.html`. Отворете го в редактора си и заместете всичко от вторият `
` до третият `
` с `{{ posts }}`. Запазете файла и опреснете страницата за да видите резултатите: +Пробвайте това във вашия шаблон `blog/templates/blog/post_list.html`. Open it up in the code editor, and replace the existing `
{% endfor %} ``` @@ -80,7 +80,7 @@ $ git status [...] - $ git add --all . + $ git add . $ git status [...] $ git commit -m "Modified templates to display posts from database." diff --git a/bg/django_urls/README.md b/bg/django_urls/README.md index be16809c102..04b49a30b04 100644 --- a/bg/django_urls/README.md +++ b/bg/django_urls/README.md @@ -96,8 +96,20 @@ urlpatterns = [

Ако сега се опитате да посетите http://127.0.0.1:8000/, ще видите съобщение от рода на 'web page not available' . Това е така, защото сървърът (помните командата runserver`?) вече не е активен. Погледнете в конзолата на сървъра си и разберете защо. -![Error (Грешка)](images/error1.png) +{% filename %}{{ warning_icon }} command-line{% endfilename %} + + return _bootstrap._gcd_import(name[level:], package, level) + File "", line 1030, in _gcd_import + File "", line 1007, in _find_and_load + File "", line 986, in _find_and_load_unlocked + File "", line 680, in _load_unlocked + File "", line 850, in exec_module + File "", line 228, in _call_with_frames_removed + File "/Users/ola/djangogirls/blog/urls.py", line 5, in + path('', views.post_list, name='post_list'), + AttributeError: module 'blog.views' has no attribute 'post_list' + Конзолата ви показва грешка, но не се тревожете – това всъщност е много полезно: Казва ви, **че няма атрибут с име 'post_list'**. Това е името на изгледа, който Django се опитва да намери и използва, но ние не сме го създали все още. На този етап, вашият `/admin/` също няма да работи. Не се тревожете – ще стигнем и до там. Ако виждате съобщение с друга греша, опитайте се да презаредите уеб сървъра. За да направите това, в конзолния прозорец, където сте пуснали сървъра, натиснете Ctrl+C за да го спрете (Ctrl + C заедно). На Windows може би трябва да натиснете Ctrl+Break. След това трябва да презаредите уеб сървъра като напишете командата `python manage.py runserver`. -> Ако искате да научите повече за Django URLconfs, вижте в официалната документация: https://docs.djangoproject.com/en/2.2/topics/http/urls/ \ No newline at end of file +> If you want to know more about Django URLconfs, look at the official documentation: https://docs.djangoproject.com/en/3.2/topics/http/urls/ \ No newline at end of file diff --git a/bg/django_views/README.md b/bg/django_views/README.md index 02efa058ccc..f2c148e5afa 100644 --- a/bg/django_views/README.md +++ b/bg/django_views/README.md @@ -41,4 +41,4 @@ def post_list(request): Това показва, че сървърът отново работи, но все още не изглежда както трябва, нали? Не се тревожете. Това е само страница с грешка, няма от какво да се страхувате! Също като съобщение с грешка в конзолата, тези са всъщност от голяма полза. Можете да прочетете, че *TemplateDoesNotExist*. Нека отстраним тази грешка и създадем шаблон в следващата глава! -> Научете повече за Django изгледите като прочетете официалната документация: https://docs.djangoproject.com/en/2.2/topics/http/views/ \ No newline at end of file +> Learn more about Django views by reading the official documentation: https://docs.djangoproject.com/en/3.2/topics/http/views/ \ No newline at end of file diff --git a/bg/dynamic_data_in_templates/README.md b/bg/dynamic_data_in_templates/README.md index 7268cc70b0b..b95201927f5 100644 --- a/bg/dynamic_data_in_templates/README.md +++ b/bg/dynamic_data_in_templates/README.md @@ -56,7 +56,10 @@ def post_list(request): return render(request, 'blog/post_list.html', {}) ``` -Последната липсваща част е подаването на QuerySet постове към контекста на шаблона. Не се притеснявайте -- ще обясним как става в по-следваща глава. +За да покажем нашия QuerySet в списъка с публикации на нашия блог, ни остават две неща: + +1. Натиснете `posts` QuerySet в контекста на шаблона, като промените функцията `render`. Ще направим това сега. +2. Променете шаблона да показва `posts` QuerySet. Ще разгледаме това в следващата глава. Моля забележете, че създадохме променлива за нашия QuerySet: `posts`. Ползвайте това като име на нашия QuerySet. От сега нататък можем да се отнасяме към него с това име. @@ -78,4 +81,4 @@ def post_list(request): Това е! Време е да се върнем към нашия шаблон и да покажем на екрана QuerySet! -Искате да прочетете малко повече за QuerySets в Django? Трябва да погледнете тук: https://docs.djangoproject.com/en/2.2/ref/models/querysets/ \ No newline at end of file +Want to read a little bit more about QuerySets in Django? You should look here: https://docs.djangoproject.com/en/3.2/ref/models/querysets/ \ No newline at end of file diff --git a/bg/extend_your_application/README.md b/bg/extend_your_application/README.md index 923f2555b66..f01170d81de 100644 --- a/bg/extend_your_application/README.md +++ b/bg/extend_your_application/README.md @@ -19,13 +19,13 @@ {% block content %} {% for post in posts %} -

-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} {% endblock %} ``` @@ -78,7 +78,19 @@ urlpatterns = [ И така, добавихме нов URL образец към `blog/urls.py`! Нека презаредим страницата: http://127.0.0.1:8000/ Бум! Сървърът отново спря да работи. Погледнете в конзолата -- както се очакваше, има нова грешка! -![AttributeError](images/attribute_error2.png) +{% filename %}{{ warning_icon }} command-line{% endfilename %} + + return _bootstrap._gcd_import(name[level:], package, level) + File "", line 1030, in _gcd_import + File "", line 1007, in _find_and_load + File "", line 986, in _find_and_load_unlocked + File "", line 680, in _load_unlocked + File "", line 850, in exec_module + File "", line 228, in _call_with_frames_removed + File "/Users/ola/djangogirls/blog/urls.py", line 6, in + path('post//', views.post_detail, name='post_detail'), + AttributeError: module 'blog.views' has no attribute 'post_detail' + Помните ли каква е следващата стъпка? Добавяне на нов изглед (view)! @@ -114,7 +126,6 @@ Post.objects.get(pk=pk) ```python from django.shortcuts import render, get_object_or_404 - ``` И накрая на файла ще добавим нашия изглед (*view*): @@ -149,15 +160,15 @@ def post_detail(request, pk): {% extends 'blog/base.html' %} {% block content %} -
+
{% if post.published_date %} -
+
+ {% endif %}

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endblock %} ``` @@ -178,7 +189,7 @@ def post_detail(request, pk): {% filename %}command-line{% endfilename %} $ git status - $ git add --all . + $ git add . $ git status $ git commit -m "Added view and template for detailed blog post as well as CSS for the site." $ git push @@ -212,4 +223,4 @@ def post_detail(request, pk): Във всеки случай сега сме готови да отидем на ["Web" страницата](https://www.pythonanywhere.com/web_app_setup/) (от бутона на менюто в горния десен ъгъл) и натиснем **Reload**, след това погледнете страницата https://subdomain.pythonanywhere.com за да видите резултата. -Та това е! Поздравления :) \ No newline at end of file +And that should be it. Congrats! :) \ No newline at end of file diff --git a/bg/how_the_internet_works/README.md b/bg/how_the_internet_works/README.md index a1f0d1818bf..580b879e95f 100644 --- a/bg/how_the_internet_works/README.md +++ b/bg/how_the_internet_works/README.md @@ -42,6 +42,6 @@ Така че, когато имате уебсайт, трябва да имате *сървър* (машина), където живее. Когато *сървърът* получи входяща *заявка* (с писмо), той изпраща обратно вашия уебсайт (с друго писмо). -Тъй като това е урок за Django, може да попитате какво прави Django. Когато изпращате отговор, не винаги искате да изпращате едно и също нещо на всички. Много по-добре е, ако вашите писма са персонализирани, особено за човека, който току-що ви е писал, нали? Django ви помага при създаването на тези персонализирани, интересни писма. :) +Тъй като това е ръководството на Django, може да попитате какво прави Django. Когато изпращате отговор, не винаги искате да изпращате едно и също нещо на всички. Много по-добре е, ако вашите писма са персонализирани, особено за човека, който току-що ви е писал, нали? Django ви помага при създаването на тези персонализирани, интересни писма. :) Достатъчно беседа - време за създаване! \ No newline at end of file diff --git a/bg/html/README.md b/bg/html/README.md index 3f3a61de3dc..f32488d74fa 100644 --- a/bg/html/README.md +++ b/bg/html/README.md @@ -29,17 +29,18 @@ HTML идва от "HyperText Markup Language". **HyperText** означава, Вижте как изглежда сайта ви: http://127.0.0.1:8000/ -> Ако все още имате грешка `TemplateDoesNotExist`, опитайте се да заредите сървъра си отново. Отидете в конзолата си, спрете сървъра като натиснете едновременно Ctrl+C и го стартирате отново като напишете команда `python manage.py runserver` . +> Ако все още имате грешка `TemplateDoesNotExist`, опитайте се да заредите сървъра си отново. Отидете в командния си ред, спрете сървъра като натиснете едновременно Ctrl+C (Клавишите Control и C заедно) и го стартирайте отново като напишете команда `python manage.py runserver` . ![Фигура 11.1](images/step1.png) -Вече нямаме грешка! Поздравления :) Въпреки това, сайта ви всъщност не публикува нищо освен празна страница, защото шаблонът ви също е празен. Можем да оправим това. +No error anymore! Congratulations! :) However, your website isn't actually publishing anything except an empty page, because your template is empty too. We need to fix that. Отворете новият файл в редактора и добавете следното: {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html +

Hi there!

@@ -52,10 +53,11 @@ HTML идва от "HyperText Markup Language". **HyperText** означава, ![Фигура 11.2](images/step3.png) -Работи! Добра работа :) +It worked. Nice work there! :) -* Най-простия етикет `` е винаги в началото на една страница и `` е винаги в края и. Както може да видите, цялото съдържание на страницата е между отварящият `` и затварящият етикет `` -* `

` е етикет за абзацни елементи; `

` затваря всеки един абзац +* The line `` is not a HTML tag. It only declares the document type. Here, it informs the browser that document type is [HTML5](https://html.spec.whatwg.org/#the-doctype). This is always the beginning of any HTML5 file. +* The most basic tag, ``, is always the beginning of html content and `` is always the end. As you can see, the whole content of the website goes between the beginning tag `` and closing tag `` +* `

` is a tag for paragraph elements; `

` closes each paragraph ## Глава и тяло на страницата (head и body) @@ -72,6 +74,7 @@ HTML идва от "HyperText Markup Language". **HyperText** означава, {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html + Ola's blog @@ -109,40 +112,49 @@ HTML идва от "HyperText Markup Language". **HyperText** означава, * `връзка` създава връзка * `
  • първи елемент
  • втори елемент
` прави лист, точно като този! * `
` дефинира секция от страницата +* `` defines a set of navigation links +* `
` specifies independent, self-contained content +* `
` defines a section in a document +* `
` specifies a header for a document or section +* `
` specifies the main content of a document +* `` defines some content aside from the content it is placed in (like a sidebar) +* `
` defines a footer for a document or section +* `` defines a specific time (or datetime) Ето пример на пълен шаблон, копирайте и пренесете в `blog/templates/blog/post_list.html`: {% filename %}blog/templates/blog/post_list.html{% endfilename %} ```html + Django Girls blog - + -
-

published: 14.06.2014, 12:14

+
+

My first post

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

-
+ -
-

published: 14.06.2014, 12:14

+
+

My second post

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut f.

-
+ ``` -Създадохме три `div` секции тук. +We've created one `header` section and two `article` section here. -* Първият `div` елемент съдържа името на блога -- неговото заглавие и връзката -* Другите два `div` елемента съдържат нашите блог постове с датата на публикуване, `h2` със заглавието, на което може да се кликне и два `p`-елемента (абзаца) от текст, единия за датата, а другия за нашия пост. +* The `header` element contains the title of our blog – it's a heading and a link +* The two `article` elements contain our blog posts with a published date in a `time` element, a `h2` element with a post title that is clickable and a `p` (paragraph) element for text of our blog post. Дава ни този ефект: @@ -169,11 +181,9 @@ HTML идва от "HyperText Markup Language". **HyperText** означава, {% filename %}command-line{% endfilename %} - $ git add --all . + $ git add . -> **Забележка** `--all` означава, че `git` ще разпознае и файлове, които сте изтрили (по подразбиране, разпознава нови/модифицирани файлове). Също помните (от 3-та глава), че `.` означава настоящата директория. - Преди да качим всички файлове, нека проверим какво ще качи `git` (всички файлове, които `git` ще качи ще се появят в зелено): {% filename %}command-line{% endfilename %} @@ -188,7 +198,7 @@ HTML идва от "HyperText Markup Language". **HyperText** означава, $ git commit -m "Changed the HTML for the site." -> **Забележка:** Бъдете сигурни, че сте сложили съобщението в двойни кавички. +> **Note** Make sure you use double quotes around the commit message. След като сме направили това, качваме (push) нашите промени на GitHub: diff --git a/bg/installation/README.md b/bg/installation/README.md index 1976d4722a6..588df0983d6 100644 --- a/bg/installation/README.md +++ b/bg/installation/README.md @@ -1,8 +1,8 @@ # Ако правите ръководството у дома -Ако правите урока у дома, а не на някое от събитията на [Django Girls](https://djangogirls.org/events/), можете напълно да пропуснете тази глава сега и да отидете направо към главата [Как работи Интернет](../how_the_internet_works/README.md). +Ако правите ръководството у дома, а не на някое от събитията на [Django Girls](https://djangogirls.org/events/), можете напълно да пропуснете тази глава сега и да отидете направо към главата [Как работи Интернет](../how_the_internet_works/README.md). -Това е така, защото покриваме инсталирането на неща, каквито са необходими в урока - това е само допълнителна страница, която събира всички инструкции за инсталиране на едно място (което е полезно за някои формати на работилницата). Можете да изберете да инсталирате всичко, което е на тази страница в момента, ако желаете. Но ако искате да започнете да научавате неща, преди да инсталирате куп неща на вашия компютър, пропуснете тази глава и ние ще ви обясним по-късно инсталационните части, тъй като те са необходими. +Това е така, защото покриваме инсталирането на неща, каквито са необходими в ръководството - това е само допълнителна страница, която събира всички инструкции за инсталиране на едно място (което е полезно за някои формати на работилницата). Можете да изберете да инсталирате всичко, което е на тази страница в момента, ако желаете. Но ако искате да започнете да научавате неща, преди да инсталирате куп неща на вашия компютър, пропуснете тази глава и ние ще ви обясним по-късно инсталационните части, тъй като те са необходими. Късмет! @@ -10,22 +10,22 @@ Ако присъствате на някое от събитията на [Django Girls](https://djangogirls.org/events/): -* Вашата работилница може да има "парти за инсталиране" преди основната работилница. Ако сте на парти за инсталиране, тази страница е за вас! Следвайте инструкциите тук, за да получите всичко необходимо за работния процес, с помощта на менторите, ако е необходимо. След това в основната работилница ще можете да пропуснете инструкциите за инсталиране, които ще срещнете в главния урок, когато стигнете до тях. -* Организаторите на вашата работилница може би са ви помолили да опитате у дома, за да инсталирате всичко на вашия компютър, преди да започне уъркшопът. Ако сте били помолени да направите това, тази страница е за вас! Следвайте инструкциите тук, както можете най-добре. След това в основната работилница, когато стигнете до стъпка за инсталиране в основния урок, ако не сте успели да инсталирате тази част, можете да получите помощ от вашия ментор. -* Ако вашият уъркшоп няма парти за инсталиране (или не можете да присъствате) и ако организаторите не са ви помолили да опитате да инсталирате всичко преди да сте пристигнали, пропуснете тази страница и отидете направо към главата [Как работи Интернет](../how_the_internet_works/README.md). Ще инсталирате всичко необходимо, докато работите през урока. +* Вашата работилница може да има "парти за инсталиране" преди основната работилница. Ако сте на парти за инсталиране, тази страница е за вас! Следвайте инструкциите тук, за да получите всичко необходимо за работния процес, с помощта на менторите, ако е необходимо. След това в основната работилница ще можете да пропуснете инструкциите за инсталиране, които ще срещнете в главното ръководство, когато стигнете до тях. +* Организаторите на вашата работилница може би са ви помолили да опитате у дома, за да инсталирате всичко на вашия компютър, преди да започне уъркшопът. Ако сте били помолени да направите това, тази страница е за вас! Следвайте инструкциите тук, както можете най-добре. След това в основната работилница, когато стигнете до стъпка за инсталиране в основното ръководство, ако не сте успели да инсталирате тази част, можете да получите помощ от вашия ментор. +* Ако вашият уъркшоп няма парти за инсталиране (или не можете да присъствате) и ако организаторите не са ви помолили да опитате да инсталирате всичко преди да сте пристигнали, пропуснете тази страница и отидете направо към главата [Как работи Интернет](../how_the_internet_works/README.md). Ще инсталирате всичко необходимо, докато работите през ръководството. # Инсталиране -В този урок ще изграждате блог. За да направите това, докато преминавате през урока, ще бъдете инструктирани как да инсталирате различен софтуер на вашия компютър и да настроите някои онлайн акаунти, тъй като са необходими. Тази страница събира на едно място всички инструкции за инсталиране и регистрация (което е полезно за някои формати на работилницата). +В това ръководство ще изграждате блог. За да направите това, докато преминавате през ръководството, ще бъдете инструктирани как да инсталирате различен софтуер на вашия компютър и да настроите някои онлайн акаунти, тъй като са необходими. Тази страница събира на едно място всички инструкции за инсталиране и регистрация (което е полезно за някои формати на работилницата). + + {% include "/chromebook_setup/instructions.md" %} - -{% include "/chromebook_setup/instructions.md" %} -# Кратко въведение в командния прозорец {#command-line} +# Кратко въведение в командния ред {#command-line} -Много от стъпките по-долу се позовават на "конзолата", "терминала", "командния прозорец" или "командния ред" - всичко това означава едно и също нещо: прозорец на вашия компютър, в който можете да въведете команди. Когато стигнете до главния урок, ще научите повече за командния ред. Засега основното, което трябва да знаете, е как да отворите команден прозорец и как изглежда: -{% include "/intro_to_command_line/open_instructions.md" %} +Много от стъпките по-долу се споменават "конзолата", "терминала", "командния прозорец" или "командния ред" - всичко това означава едно и също нещо: прозорец на вашия компютър, в който можете да въведете команди. Когато стигнете до главното ръководство, ще научите повече за командния ред. Засега основното, което трябва да знаете, е как да отворите командния прозорец и как изглежда: {% include "/intro_to_command_line/open_instructions.md" %} # Инсталиране на Python {#python} @@ -43,11 +43,11 @@ {% include "/deploy/install_git.md" %} -# Създаване на акаунт в GitHub {#github} +# Create a GitHub account {#github-account} Отидете на [GitHub.com](https://www.github.com) и се регистрирайте за нов безплатен потребителски акаунт. Не забравяйте да запомните паролата си (добавете я към вашия мениджър на пароли, ако използвате такъв). -# Създаване на акаунт в PythonAnywhere {#pythonanywhere} +# Create a PythonAnywhere account {#pythonanywhere-account} {% include "/deploy/signup_pythonanywhere.md" %} @@ -65,4 +65,4 @@ # Насладете се на уъркшопа! -Когато започнете семинара, ще можете да преминете направо към [първия си проект на Django!](../django_start_project/README.md), защото вече сте обхванали материала в по-ранните глави. +Когато започнете семинара, ще можете да преминете направо към [първия си проект на Django!](../django_start_project/README.md), защото вече сте обхванали материала в по-ранните глави. \ No newline at end of file diff --git a/bg/intro_to_command_line/README.md b/bg/intro_to_command_line/README.md index 830d52492dd..fa7f4f13ce2 100644 --- a/bg/intro_to_command_line/README.md +++ b/bg/intro_to_command_line/README.md @@ -6,13 +6,13 @@ **Нека ви запознаем с първия ви нов приятел: командният ред!** -Следващите стъпки ще ви покажат как да използвате черния прозорец, който използват всички хакери. В началото може да изглежда малко страшно, но всъщност тази подкана просто чака команди от вас. +Следващите стъпки ще ти покажат как да използваш черния прозорец, който използват всички хакери. В началото може да изглежда малко страшно, но всъщност тази подкана просто чака команди от теб. > **Забележка** Моля, имайте предвид, че в тази книга използваме взаимозаменяемите термини „директория“ и „папка“, но те са едно и също нещо. ## Какво е командният ред? -Прозорецът, който обикновено се нарича **команден ред** or **интерфеса на командния ред**, е текстово приложение за преглед, обработка и манипулиране на файлове на вашия компютър. Прилича много на Windows Explorer или Finder на Mac, но без графичния интерфейс. Други имена на командния ред са: *cmd*, *CLI*, * prompt *, * console * или * terminal *. +Прозорецът, който обикновено се нарича **команден ред** или **интерфейсът на командния ред**, е текстово приложение за преглед, обработка и манипулиране на файлове на вашия компютър. Прилича много на Windows Explorer или Finder на Mac, но без графичния интерфейс. Други имена на командния ред са: *cmd*, *CLI*, *подкана*, *конзола* или *терминал*. ## Отворете интерфейса на командния ред @@ -20,7 +20,7 @@ {% include "/intro_to_command_line/open_instructions.md" %} -## Prompt +## Подкана Сега трябва да видите бял или черен прозорец, който чака вашите команди. @@ -44,17 +44,17 @@ > -Погледнете раздела за Linux малко по-горе - ще видите нещо повече от това, когато стигнете до PythonAnywhere по-късно в урока. +Погледнете раздела за Linux малко по-горе - ще видите нещо подобно, когато стигнете до PythonAnywhere по-късно в урока. Всяка команда ще бъде предварително обозначена с `$` или `>` и един интервал, но не бива да го въвеждате. Вашият компютър ще го направи вместо вас. :) -> Само малка забележка: във вашия случай може да има нещо като `C:\Users\ola>` или `Olas-MacBook-Air:~ ola$` преди знака на подкана и това е 100% ОК. +> Само малка забележка: във твоя случай може да има нещо като `C:\Users\ola>` или `Olas-MacBook-Air:~ ola$` преди знака на подкана и това е 100% ОК. -Частта до и включително `$` или `>` се нарича *командния ред* или *подкана* за кратко. То ви подканва да въведете нещо там. +Частта до и включително `$` или `>` се нарича *командния ред* или *подкана* за кратко. То те подканва да въведеш нещо там. -В ръковдството, когато искаме да въведете команда, ще включим `$` или `>`, а понякога и повече вляво. Игнорирайте лявата част и въведете само командата, която започва след подкана. +В ръковдството, когато искаме да въведете команда, ще включим `$` или `>`, а понякога и повече вляво. Игнорирай лявата част и въведи само командата, която започва след подканата. ## Вашата първа команда (УРА!) @@ -118,7 +118,7 @@ C:\Users\olasitarska -> Забележка: 'cd' означава 'change directory' (промяна на директория). С PowerShell можете да използвате pwd точно както в Linux или Mac OS X. +> Note: 'cd' stands for 'change directory'. With PowerShell you can use pwd just like on Linux or Mac OS X. @@ -128,7 +128,7 @@ ### Научете повече за команда -Много команди, които можете да въведете в командния ред, имат вградена помощ, която можете да показвате и четете! Например, за да научите повече за текущата команда на директория: +Много команди, които можеш да въведеш в командния ред, имат вградена помощ, която можеш да показваш и да четеш! Например, за да научиш повече за текущата команда на директория: @@ -166,14 +166,14 @@ OS X и Linux имат команда `man`, която ви предостав > dir Directory of C:\Users\olasitarska - 05/08/2014 07:28 PM Applications - 05/08/2014 07:28 PM Desktop - 05/08/2014 07:28 PM Downloads - 05/08/2014 07:28 PM Music + 05/08/2020 07:28 PM Applications + 05/08/2020 07:28 PM Desktop + 05/08/2020 07:28 PM Downloads + 05/08/2020 07:28 PM Music ... -> Забележка: В PowerShell можете също да използвате 'ls' като в Linux и Mac OS X. +> Note: In PowerShell you can also use 'ls' like on Linux and Mac OS X. * * * @@ -291,7 +291,7 @@ OS X и Linux имат команда `man`, която ви предостав > cd practice > mkdir test > dir - 05/08/2014 07:28 PM test + 05/08/2020 07:28 PM test @@ -393,7 +393,7 @@ OS X и Linux имат команда `man`, която ви предостав ### Изход -Това е засега! Можете спокойно да затворите командния ред. Да го направим по хакерския начин, съгласни? :) +Това е засега! Можете спокойно да затворите командния ред. Да го направим по хакерския начин, окей? :) @@ -432,7 +432,7 @@ OS X и Linux имат команда `man`, която ви предостав | rmdir /S | rm -r | изтриване на директория | **rm -r testdirectory** | | [CMD] /? | man [CMD] | получете помощ за команда | **cd /?** (Windows) или **man cd** (Mac OS / Linux) | -Това са само малка част от командите, които можете да изпълнявате във вашия команден ред, но днес няма да използвате нищо повече от това. +Това е само една малка част от командите, които можете да изпълнявате във вашия команден ред, но днес няма да използвате нищо повече от това. Ако ви е любопитно, [ss64.com](http://ss64.com) съдържа пълна справка с команди за всички операционни системи. diff --git a/bg/intro_to_command_line/open_instructions.md b/bg/intro_to_command_line/open_instructions.md index fce8d01734f..0bd822d8119 100644 --- a/bg/intro_to_command_line/open_instructions.md +++ b/bg/intro_to_command_line/open_instructions.md @@ -1,18 +1,17 @@ - В зависимост от вашата версия на Windows и клавиатурата ви, едно от следните трябва да отвори команден прозорец (може да се наложи да експериментирате малко, но не е нужно да изпробвате всички тези предложения): -- Отидете в менюто или екрана "Старт" и въведете "Команден ред" в полето за търсене. -- Отидете в менюто "Старт" → Windows System → Команден ред. -- Отидете в менюто Старт → Всички програми → Аксесоари → Команден ред. +- Отиди в менюто или екрана "Старт" и въведи "Команден ред" в полето за търсене. +- Отиди в менюто "Старт" → Windows Система → Команден ред. +- Отиди в менюто Старт → Всички програми → Аксесоари → Команден ред. - Отидете на стартовия екран, задръжте мишката в долния ляв ъгъл на екрана и щракнете върху стрелката надолу, която се появява (на сензорен екран, вместо това натиснете нагоре от долната част на екрана). Страницата с приложения трябва да се отвори. Кликнете върху командния ред в секцията Windows. - Задръжте специалния клавиш Windows на клавиатурата си и натиснете клавиша "X". Изберете „Команден ред“ от изскачащото меню. - Задръжте клавиша на Windows и натиснете клавиша "R", за да получите прозорец "Изпълнение". Въведете "cmd" в полето и щракнете върху бутона OK. ![Напишете "cmd" в прозореца "Изпълнение"](../python_installation/images/windows-plus-r.png) -По-късно в този урок ще трябва да имате отворени два командни прозореца едновременно. Въпреки това, при някои версии на Windows, ако вече имате един отворен команден прозорец и се опитате да отворите втори, използвайки същия метод, той вместо това ще ви насочи към командния прозорец, който вече имате отворен. Опитайте го сега на вашия компютър и вижте какво ще се случи! Ако получите само един команден прозорец, опитайте някой от другите методи в списъка по-горе. Поне един от тях трябва да доведе до отваряне на нов команден прозорец. +По-късно в това ръководство ще трябва да имате отворени два командни прозореца едновременно. Въпреки това, при някои версии на Windows, ако вече имате един отворен команден прозорец и се опитате да отворите втори, използвайки същия метод, той вместо това ще ви насочи към командния прозорец, който вече имате отворен. Опитайте го сега на вашия компютър и вижте какво ще се случи! Ако получите само един команден прозорец, опитайте някой от другите методи в списъка по-горе. Поне един от тях трябва да доведе до отваряне на нов команден прозорец. @@ -26,4 +25,4 @@ Вероятно е под Applications → Accessories → Terminal или Applications → System → Terminal, но това може да зависи от вашата система. Ако не е там, можете да опитате да го потърсите в Google. :) - + \ No newline at end of file diff --git a/bg/python_installation/README.md b/bg/python_installation/README.md index 23ef41cb47f..bb84a606d3b 100644 --- a/bg/python_installation/README.md +++ b/bg/python_installation/README.md @@ -10,6 +10,6 @@ Python възниква в края на 80-те години и основна > **Забележка** Ако използвате Chromebook, пропуснете тази глава и се уверете, че следвате инструкциите [Настройка на Chromebook](../chromebook_setup/README.md). > -> **Забележка** Ако вече сте минали през стъпките за инсталиране, не е нужно да правите това отново - можете да преминете направо към следващата глава! +> **Note** If you already worked through the [installation steps](../installation/README.md), there's no need to do this again – you can skip straight ahead to the next chapter! {% include "/python_installation/instructions.md" %} \ No newline at end of file diff --git a/bg/python_installation/instructions.md b/bg/python_installation/instructions.md index bc470f242f4..fba59ce88ae 100644 --- a/bg/python_installation/instructions.md +++ b/bg/python_installation/instructions.md @@ -1,8 +1,8 @@ > За читателите у дома: тази глава е разгледана във видеото [Инсталиране на Python & Редактор на код](https://www.youtube.com/watch?v=pVTaqzKZCdA). > -> Този раздел е базиран на урок от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots) +> Част от този раздел е базирана на ръководства от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots) -Django е написан на Python. Имаме нужда от Python, за да направим нещо в Django. Нека започнем с инсталирането му! Искаме да инсталирате най-новата версия на Python 3, така че ако имате някоя по-ранна версия, ще трябва да я актуализирате. Ако вече имате версия 3.4 или по-нова, трябва да се оправите. +Django е написан на Python. Имаме нужда от Python, за да направим нещо в Django. Нека започнем с инсталирането му! Искаме да инсталирате най-новата версия на Python 3, така че ако имате някоя по-ранна версия, ще трябва да я актуализирате. If you already have version {{ book.py_min_version }} or higher you should be fine. Моля, инсталирайте нормален Python по следния начин, дори когато на вашия компютър е инсталиран Anaconda. @@ -13,63 +13,59 @@ Django е написан на Python. Имаме нужда от Python, за д * Натиснете едновременно клавиша Windows и клавиша за Пауза/Прекъсване * Отворете контролния панел от менюто на Windows, след което отворете Система & Сигурност, след това Система * Натиснете бутона на Windows, след това отворете Настройки> Система> Информация +* Потърсете в менюто "Старт" на Windows "Система информация" За целта щракнете върху бутона Старт или натиснете клавиша Windows, след което започнете да въвеждате `Информация за системата`. То ще започне да прави предложения веднага щом въведете. Изберете правилното, след като се появи. Можете да изтеглите Python за Windows от уебсайта https://www.python.org/downloads/windows/. Кликнете върху връзката "Последно издание на Python 3 - Python x.x.x“. Ако вашият компютър работи с **64-битова** версия на Windows, изтеглете **изпълнителния инсталатор Windows x86-64**. В противен случай изтеглете **изпълнителния инсталатор Windows x86**. След като изтеглите инсталатора, трябва да го стартирате (щракнете двукратно върху него) и следвайте инструкциите там. -Едно нещо, за което трябва да внимавате: По време на инсталацията ще забележите прозорец с надпис „Настройка“. Уверете се, че поставяте отметка в квадратчето „Добавяне на Python 3.6 към PATH“ или „Добавяне на Python към променливите на вашата среда“ и кликнете върху „Инсталиране сега“, както е показано тук (може да изглежда малко по-различно, ако инсталирате друга версия): +Едно нещо, за което трябва да внимавате: По време на инсталацията ще забележите прозорец с надпис „Настройка“. Make sure you tick the "Add Python {{ book.py_version }} to PATH" or 'Add Python to your environment variables" checkbox and click on "Install Now", as shown here (it may look a bit different if you are installing a different version): ![Не забравяйте да добавите Python към Path](../python_installation/images/python-installation-options.png) -Когато инсталацията приключи, може да видите диалогов прозорец с връзка, която можете да следвате, за да научите повече за Python или за версията, която сте инсталирали. Затворете или отменете този диалог - в този урок ще научите повече! +Когато инсталацията приключи, може да видите диалогов прозорец с връзка, която можете да следвате, за да научите повече за Python или за версията, която сте инсталирали. Затворете или отменете този диалог - в това ръководство ще научите повече! -Забележка: Ако използвате по-стара версия на Windows (7, Vista или някоя по-стара версия) и инсталатора на Python 3.6.x не успее с грешка, можете да опитате или: +Note: If you are using an older version of Windows (7, Vista, or any older version) and the Python {{ book.py_version }} installer fails with an error, then install all Windows Updates and try to install Python again. If you still have the error, try installing Python version {{ book.py_min_release }} from [Python.org](https://www.python.org/downloads/windows/). -1. да инсталирате всички актуализации на Windows и да опитате отново да инсталирате Python; или -2. да инсталирате [по-стара версия на Python](https://www.python.org/downloads/windows/), например, [3.4.6](https://www.python.org/downloads/release/python-346/). - -Ако инсталирате по-стара версия на Python, екранът за инсталиране може да изглежда малко по-различно от показаното по-горе. Уверете се, че сте стигнали до най-долу, за да видите „Добавяне на python.exe към Path“, след това щракнете върху бутона вляво и изберете „Ще бъде инсталиран на локален твърд диск“: - -![Добавете Python към Path, по-стари версии](../python_installation/images/add_python_to_windows_path.png) +> Django {{ book.django_version }} needs Python {{ book.py_min_version }} or greater, which does not support Windows XP or earlier versions. -> **Забележка** Преди да инсталирате Python в OS X, трябва да се уверите, че настройките ви за Mac позволяват инсталиране на пакети, които не са от App Store. Отидете на System Preferences (това е в папката Applications), щракнете върху "Security & Privacy", и след това върху раздела "General". Ако "Allow apps downloaded from:" е зададен на "Mac App Store,", променете го на "Mac App Store and identified developers". +> **Note** Before you install Python on OS X, you should ensure your Mac settings allow installing packages that aren't from the App Store. Go to System Preferences (it's in the Applications folder), click "Security & Privacy," and then the "General" tab. If your "Allow apps downloaded from:" is set to "Mac App Store," change it to "Mac App Store and identified developers." -Трябва да отидете на уебсайта https://www.python.org/downloads/release/python-361/ и да изтеглите инсталатора на Python: +You need to go to the website https://www.python.org/downloads/mac-osx/ and download the latest Python installer: * Изтеглете *Mac OS X 64-битов/32-битов инсталатор* файл, -* Щракнете два пъти * python-3.6.1-macosx10.6.pkg *, за да стартирате инсталатора. +* Double click *python-{{ book.py_release }}-macosx10.9.pkg* to run the installer. -Много е вероятно вече да имате инсталиран Python извън кутията. За да проверите дали сте го инсталирали (и коя версия е), отворете конзола и въведете следната команда: +It is very likely that you already have Python installed out of the box. To check if you have it installed (and which version it is), open a console and type the following command: {% filename %}command-line{% endfilename %} $ python3 --version - Python 3.6.1 + Python {{ book.py_release }} -Ако имате инсталирана друга версия на Python, поне 3.4.0 (например 3.6.0), тогава не е нужно да актуализирате. Ако нямате инсталиран Python или искате друга версия, първо проверете каква дистрибуция на Linux използвате със следната команда: +If you have a different version of Python installed, at least {{ book.py_min_version }} (e.g. {{ book.py_min_release }}), then you don't have to upgrade. If you don't have Python installed, or if you want a different version, first check what Linux distribution you are using with the following command: {% filename %}command-line{% endfilename %} $ grep '^NAME=' /etc/os-release -След това, в зависимост от резултата, следвайте едно от следните ръководства за инсталиране под този раздел. +Afterwards, depending on the result, follow one of the following installation guides below this section. -Въведете тази команда в конзолата си: +Type this command into your console: {% filename %}command-line{% endfilename %} @@ -81,21 +77,21 @@ data-collapse=true ces--> -Използвайте тази команда в конзолата си: +Use this command in your console: {% filename %}command-line{% endfilename %} $ sudo dnf install python3 -Ако сте на по-стари версии на Fedora, може да получите грешка, че командата `dnf` не е намерена. В такъв случай трябва да използвате вместо `yum`. +If you're on older Fedora versions you might get an error that the command `dnf` is not found. In that case, you need to use `yum` instead. -Използвайте тази команда в конзолата си: +Use this command in your console: {% filename %}command-line{% endfilename %} @@ -104,18 +100,18 @@ data-collapse=true ces--> -Проверете дали инсталацията е била успешна, като отворите командния ред и изпълните командата `python3`: +Verify the installation was successful by opening a command prompt and running the `python3` command: {% filename %}command-line{% endfilename %} $ python3 --version - Python 3.6.1 + Python {{ book.py_release }} -Показаната версия може да се различава от 3.6.1 - тя трябва да съответства на инсталираната от вас версия. +The version shown may be different from {{ book.py_release }} -- it should match the version you installed. -**ЗАБЕЛЕЖКА:** Ако сте в Windows и получите съобщение за грешка, че `python3` не е намерен, опитайте да използвате `python` (без `3`) и проверете дали все още може да е версия на Python, която е 3.4.0 или по-нова. Ако и това не работи, можете да отворите нов команден ред и да опитате отново; това се случва, ако използвате командния ред, оставен отворен преди инсталирането на Python. +**NOTE:** If you're on Windows and you get an error message that `python3` wasn't found, try using `python` (without the `3`) and check if it still might be a version of Python that is {{ book.py_min_version }} or higher. If that doesn't work either, you may open a new command prompt and try again; this happens if you use a command prompt left open from before the Python installation. * * * -Ако имате някакви съмнения или ако нещо се обърка и нямате идея какво да правите по-нататък, моля, попитайте вашия ментор! Понякога нещата не вървят гладко и е по-добре да поискате помощ от някого с повече опит. \ No newline at end of file +If you have any doubts, or if something went wrong and you have no idea what to do next, please ask your coach! Sometimes things don't go smoothly and it's better to ask for help from someone with more experience. \ No newline at end of file diff --git a/bg/python_introduction/README.md b/bg/python_introduction/README.md index ac5b612eeba..ed3e94edefc 100644 --- a/bg/python_introduction/README.md +++ b/bg/python_introduction/README.md @@ -2,35 +2,19 @@ # Въведение в Python -> Част от тази глава е базирана на уроци от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots). +> Част от тази глава е базирана на ръководства от Geek Girls Carrots (https://github.com/ggcarrots/django-carrots). Да напишем малко код! -## Python запитване +{% include "/python_introduction/prompt.md" %} -> За читателите у дома: тази част е разгледана във видеото [Python Basics: Integers, Strings, Lists, Variables and Errors](https://www.youtube.com/watch?v=MO63L4s-20U). +## Your first Python command! -За да започнем да играем с Python, трябва да отворим *команден ред* на вашия компютър. Вече трябва да знаете как да го направите - научихте го в главата [Въведение в командния ред](../intro_to_command_line/README.md). +After running the Python command, the prompt changed to `>>>`. For us this means that for now we may only use commands in the Python language. You don't have to type in `>>>` – Python will do that for you. -След като сте готови, следвайте инструкциите по-долу. +If you want to exit the Python console at any point, type `exit()` or use the shortcut `Ctrl + Z` for Windows and `Ctrl + D` for Mac/Linux. Then you won't see `>>>` any longer. -Искаме да отворим конзола на Python, затова въведете `python` в Windows или `python3` в Mac OS/Linux и натиснете `enter`. - -{% filename %}command-line{% endfilename %} - - $ python3 - Python 3.6.1 (...) - Type "help", "copyright", "credits" or "license" for more information. - >>> - - -## Вашата първа Python команда! - -След като изпълните командата Python, подканата се промени в `>>>`. За нас това означава, че засега можем да използваме само команди на езика Python. Не е нужно да пишете `>>>` - Python ще направи това вместо вас. - -Ако искате да излезете от конзолата на Python във всеки момент, напишете `exit()` или използвайте прекия път `Ctrl + Z` за Windows и `Ctrl + D` за Mac/Linux. Тогава вече няма да виждате `>>>`. - -Засега не искаме да излизаме от конзолата Python. Искаме да научим повече за него. Нека започнем с въвеждане на някаква математика, като `2 + 3` и натискане на `enter`. +For now, we don't want to exit the Python console. We want to learn more about it. Let's start by typing some math, like `2 + 3` and hitting `enter`. {% filename %}command-line{% endfilename %} @@ -39,26 +23,26 @@ 5 ``` -Хубаво! Вижте как отговорът изскочи? Python знае математика! Можете да опитате и други команди като: +Nice! See how the answer popped out? Python knows math! You could try other commands like: - `4 * 5` - `5 - 1` - `40 / 2` -За да извършим експоненциално изчисление, да кажем 2 на степен 3, пишем в конзолата: {% filename %}command-line{% endfilename %} +To perform exponential calculation, say 2 to the power 3, we type: {% filename %}command-line{% endfilename %} ```python >>> 2 ** 3 8 ``` -Забавлявайте се с това за малко и след това се върнете тук. :) +Have fun with this for a little while and then get back here. :) -Както можете да видите, Python е чудесен калкулатор. Ако се чудите какво още можете да направите... +As you can see, Python is a great calculator. If you're wondering what else you can do… -## Низове +## Strings -Какво ще кажете за вашето име? Въведете първото си име в кавички така: +How about your name? Type your first name in quotes like this: {% filename %}command-line{% endfilename %} @@ -67,9 +51,9 @@ 'Ola' ``` -Сега създадохте първия си низ! Това е поредица от знаци, които могат да бъдат обработени от компютър. Низът винаги трябва да започва и завършва с един и същ символ. Това могат да бъдат единични (`'`) или двойни (`"`) кавички (няма разлика!) Кавичките казват на Python, че това, което е вътре в тях, е низ. +You've now created your first string! It's a sequence of characters that can be processed by a computer. The string must always begin and end with the same character. This may be single (`'`) or double (`"`) quotes (there is no difference!) The quotes tell Python that what's inside of them is a string. -Низовете могат да бъдат нанизани заедно. Опитайте това: +Strings can be strung together. Try this: {% filename %}command-line{% endfilename %} @@ -78,7 +62,7 @@ 'Hi there Ola' ``` -Можете също да умножите низове с число: +You can also multiply strings with a number: {% filename %}command-line{% endfilename %} @@ -87,9 +71,9 @@ 'OlaOlaOla' ``` -Ако трябва да поставите апостроф във вашия низ, имате два начина да го направите. +If you need to put an apostrophe inside your string, you have two ways to do it. -Използвайки двойни кавички: +Using double quotes: {% filename %}command-line{% endfilename %} @@ -98,7 +82,7 @@ "Runnin' down the hill" ``` -или да избягате от апострофа с обратна черта (``): +or escaping the apostrophe with a backslash (`\`): {% filename %}command-line{% endfilename %} @@ -107,7 +91,7 @@ "Runnin' down the hill" ``` -Хубаво, а? За да видите името си с главни букви, напишете: +Nice, huh? To see your name in uppercase letters, type: {% filename %}command-line{% endfilename %} @@ -116,9 +100,9 @@ 'OLA' ``` -Току що използвахте метода `upper` върху вашия низ! Методът (като `upper()`) е поредица от инструкции, които Python изпълнява върху даден обект (`"Ola"`) след като е повикан. +You just used the `upper` **method** on your string! A method (like `upper()`) is a sequence of instructions that Python has to perform on a given object (`"Ola"`) once you call it. -Ако искате да знаете, от колко на брой букви е вашето име, има функция и за това! +If you want to know the number of letters contained in your name, there is a **function** for that too! {% filename %}command-line{% endfilename %} @@ -127,22 +111,22 @@ 3 ``` -Чудите ли се понякога защо, когато извиквате функции с `.` на края на низа (като `"Ola".upper()`), като понякога извиквате първо функцията и поставяте низа в скоби? Е, в някой случаи функциите принадлежат на обекти, като `upper()`, които могат да се използва само върху низове. В този случай, наричам функцията метод. В други случаи, функциите които не принадлежат към определени типове и могат да бъдат използвани при различни обекти, също като `len()`. Затова даваме `"Ola"` като параметър на функцията `len`. +Wonder why sometimes you call functions with a `.` at the end of a string (like `"Ola".upper()`) and sometimes you first call a function and place the string in parentheses? Well, in some cases, functions belong to objects, like `upper()`, which can only be performed on strings. In this case, we call the function a **method**. Other times, functions don't belong to anything specific and can be used on different types of objects, just like `len()`. That's why we're giving `"Ola"` as a parameter to the `len` function. ### Обобщение -Добре, достатъчно за низове. Досега научихте за: +OK, enough of strings. So far you've learned about: -- **запитване** -- писане на команди (код) в Python среда в резултат дава отговори на Python език. +- **подкана** -- писане на команди (код) в Python подкана в резултат дава отговори на езика Python. - **числа и низове** -- в Python числата се използват за математически операции а низовете за текстови обекти. - **оператори** – като `+` и `*`, събират стойности за да получат нова - **функции** – като `upper()` и `len()`, извършващи се върху обектите. -Това са основите на всеки програмен език, който учите. Готови ли сте за нещо по-сложно? Залагаме, че сте! +These are the basics of every programming language you learn. Ready for something harder? We bet you are! -## Грешки +## Errors -Нека опитаме нещо ново. Можем ли да вземем дължината на числото по същият начин, по който взехме дължината на нашето име? Напишете `len(304023)` и натиснете `enter`: +Let's try something new. Can we get the length of a number the same way we could find out the length of our name? Type in `len(304023)` and hit `enter`: {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -153,9 +137,9 @@ Traceback (most recent call last): TypeError: object of type 'int' has no len() ``` -Показа се първата ни грешка! {{ warning_icon }} е начина, по който ще ви показваме, че кода който се опитвате да пуснете няма да работи както се очаква. Грешките (дори и тези, които правим нарочно) са важна част от процеса на учене! +We got our first error! The {{ warning_icon }} icon is our way of giving you a heads up that the code you are about to run won't work as expected. Making mistakes (even intentional ones) are an important part of learning! -Казва, че обектът от тип "int" (integers, или още цели числа) нямат дължина. Какво можем да направим сега? Може би да напишем числото ни като низ? Низовете имат дължина, нали така? +It says that objects of type "int" (integers, whole numbers) have no length. So what can we do now? Maybe we can write our number as a string? Strings have a length, right? {% filename %}command-line{% endfilename %} @@ -164,18 +148,18 @@ TypeError: object of type 'int' has no len() 6 ``` -Работи! Използвахме функцията `str` във функцията `len`. `str()` преобразува всичко в низове. +It worked! We used the `str` function inside of the `len` function. `str()` converts everything to strings. -- Функцията `str` преобразува нещата като **низове** +- Функцията `str` преобразува нещата в **низове** - Функцията `int` преобразува нещата като **цели числа** -> Важно: можем да преобразуваме числа в текст, но не можем да направим обратното -- както и да е какво би било `int('hello')`? +> Important: we can convert numbers into text, but we can't necessarily convert text into numbers – what would `int('hello')` be anyway? -## Променливи +## Variables -Важно понятие в програмирането са променливите. Променливата е нищо повече от име, което може да се използва по-късно в програмата. Програмистите ползват тези променливи да запазват данни. Това прави кода им по-четлив, така че не се налага да запомнят какви са тези неща. +An important concept in programming is variables. A variable is nothing more than a name for something so you can use it later. Programmers use these variables to store data, make their code more readable and so they don't have to keep remembering what things are. -Нека кажем, че искаме да създаде променлива с име `name`: +Let's say we want to create a new variable called `name`: {% filename %}command-line{% endfilename %} @@ -183,9 +167,9 @@ TypeError: object of type 'int' has no len() >>> name = "Ola" ``` -Пишем name равно на Ola. +We type name equals Ola. -Ако забелязахте, програмата ви не върна нищо както преди това. Как да разберем, че променливата съществува? Напишете `name` и натиснете бутона `enter`: +As you've noticed, your program didn't return anything like it did before. So how do we know that the variable actually exists? Enter `name` and hit `enter`: {% filename %}command-line{% endfilename %} @@ -194,7 +178,7 @@ TypeError: object of type 'int' has no len() 'Ola' ``` -Ихууу! Първата ти променлива! :) Винаги може да я промениш към какво се отнася: +Yippee! Your first variable! :) You can always change what it refers to: {% filename %}command-line{% endfilename %} @@ -204,7 +188,7 @@ TypeError: object of type 'int' has no len() 'Sonja' ``` -Може да я използвате и във функции: +You can use it in functions too: {% filename %}command-line{% endfilename %} @@ -213,7 +197,7 @@ TypeError: object of type 'int' has no len() 5 ``` -Страхотно, нали? Сега, променливите могат да са какво ли не -- също така и числа! Пробвайте това: +Awesome, right? Now, variables can be anything – numbers too! Try this: {% filename %}command-line{% endfilename %} @@ -224,7 +208,7 @@ TypeError: object of type 'int' has no len() 24 ``` -Но какво ако използваме грешното име Можете ли да отгатнете какво ще се случи? Нека опитаме! +But what if we used the wrong name? Can you guess what would happen? Let's try! {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -236,13 +220,13 @@ Traceback (most recent call last): NameError: name 'ctiy' is not defined ``` -Грешка! Както виждате, Python има различни видове грешки, като тази се казва **NameError**. Python винаги ще ви дава тази грешка, ако се опитвате да използвате променлива, която все още не е дефинирана. Ако попаднете на тази грешка по-късно, вижте дали не сте сбъркали при писането на някое от имената. +An error! As you can see, Python has different types of errors and this one is called a **NameError**. Python will give you this error if you try to use a variable that hasn't been defined yet. If you encounter this error later, check your code to see if you've mistyped any names. -Поиграйте се малко с това и вижте какво може да правите! +Play with this for a while and see what you can do! -## Фунцкията print +## The print function -Пробвайте това: +Try this: {% filename %}command-line{% endfilename %} @@ -254,15 +238,15 @@ NameError: name 'ctiy' is not defined Maria ``` -Когато напишете `name`, Python интерпретатора отговаря със низово *изображение* на променливата 'name', където буквите 'M-a-r-i-a' са обградени от единични кавички. Когато кажем `print(name)`, Python ще "отпечата" съдържанието на променливата на екрана, без кавичките, което е по-прилежно. +When you just type `name`, the Python interpreter responds with the string *representation* of the variable 'name', which is the letters M-a-r-i-a, surrounded by single quotes, ''. When you say `print(name)`, Python will "print" the contents of the variable to the screen, without the quotes, which is neater. -Както ще видим по-късно `print()` също е полезен, когато искаме да отпечатаме неща от функциите, или когато искаме да отпечатаме неща на няколко реда. +As we'll see later, `print()` is also useful when we want to print things from inside functions, or when we want to print things on multiple lines. -## Листове +## Lists -Освен низовете и целите числа, Python има всякакви видове типове от обекти. Сега ще въведем една от тях наречена **list**. Листоверте са точно това, което си мислите, че са: обекти, които са листове от други обекти. :) +Beside strings and integers, Python has all sorts of different types of objects. Now we're going to introduce one called **list**. Lists are exactly what you think they are: objects which are lists of other objects. :) -Давайте нататък и създайте лист: +Go ahead and create a list: {% filename %}command-line{% endfilename %} @@ -271,7 +255,7 @@ Maria [] ``` -Да, това е празен лист. Не е много полезен нали? Нека създадем лист с лотарийни номера. Не искаме да се повтаряме постоянно, така че ще използваме променлива: +Yes, this list is empty. Not very useful, right? Let's create a list of lottery numbers. We don't want to repeat ourselves all the time, so we will put it in a variable, too: {% filename %}command-line{% endfilename %} @@ -279,7 +263,7 @@ Maria >>> lottery = [3, 42, 12, 19, 30, 59] ``` -И така, имаме лист! Какво можем да правим с него? Нека видим колко лотарийни числа има в листа? Имате ли си на идея коя функция може да се използва за това? Това вече го знаете! +All right, we have a list! What can we do with it? Let's see how many lottery numbers there are in a list. Do you have any idea which function you should use for that? You know this already! {% filename %}command-line{% endfilename %} @@ -288,7 +272,7 @@ Maria 6 ``` -Да! `len()` може да ви даде броя на обектите в листа. Много удобно, нали? Може би и ще го сортираме: +Yes! `len()` can give you a number of objects in a list. Handy, right? Maybe we will sort it now: {% filename %}command-line{% endfilename %} @@ -296,7 +280,7 @@ Maria >>> lottery.sort() ``` -Това не връща нищо, само променя реда, в който числата са показани в листа. Нека го отпечатаме отново и видим какво се случва: +This doesn't return anything, it just changed the order in which the numbers appear in the list. Let's print it out again and see what happened: {% filename %}command-line{% endfilename %} @@ -305,9 +289,9 @@ Maria [3, 12, 19, 30, 42, 59] ``` -Както се вижда, числата в листа са вече подредени от по-малката към по-голямата стойност. Поздравления! +As you can see, the numbers in your list are now sorted from the lowest to highest value. Congrats! -Може би искаме да направим обратното? +Maybe we want to reverse that order? Let's do that! {% filename %}command-line{% endfilename %} @@ -317,7 +301,7 @@ Maria [59, 42, 30, 19, 12, 3] ``` -Ако искате да добавите нещо към вашия лист, може да го направите като напишете следната команда: +If you want to add something to your list, you can do this by typing this command: {% filename %}command-line{% endfilename %} @@ -327,9 +311,9 @@ Maria [59, 42, 30, 19, 12, 3, 199] ``` -Ако искате да покажете само първото число, може да направите това като използвате **индекси**. Индекса е номерът, който казва къде в листа се появява елемента. Програмистите предпочитат да започват броенето от 0, така че първият обект в листа е с индекс 0, следващия е с 1 и т.н. Опитайте това: +If you want to show only the first number, you can do this by using **indexes**. An index is the number that says where in a list an item occurs. Programmers prefer to start counting at 0, so the first object in your list is at index 0, the next one is at 1, and so on. Try this: -{% filename %}command-line{% endfilename %} +{% filename %}command-line{% endfilename %} ```python >>> print(lottery[0]) @@ -338,11 +322,11 @@ Maria 42 ``` -Както може да видите, можете да достъпите различни обекти от листа си като използвате името на листа и индекс със квадратни скоби. +As you can see, you can access different objects in your list by using the list's name and the object's index inside of square brackets. -За да премахнете нещо от листа си ще трябва да използвате **индексите**, които научихме по-горе и метода `pop()`. Нека пробваме пример и затвърдим това, което научихме до момента: ще отстраним първото число от листа ни. +To delete something from your list you will need to use **indexes** as we learned above and the `pop()` method. Let's try an example and reinforce what we learned previously; we will be deleting the first number of our list. -{% filename %}command-line{% endfilename %} +{% filename %}command-line{% endfilename %} ```python >>> print(lottery) @@ -355,17 +339,17 @@ Maria [42, 30, 19, 12, 3, 199] ``` -Работи безупречно! +That worked like a charm! -За повече веселба, пробвайте други индекси: 6, 7, 1000, -1, -6 or -1000. Пробвайте се да предположите какъв би могъл да е резултата от командата. Имат ли смисъл резултатите? +For extra fun, try some other indexes: 6, 7, 1000, -1, -6 or -1000. See if you can predict the result before trying the command. Do the results make sense? -Можете да намерите лист с всички възможни методи в тази глава от документацията на Python: https://docs.python.org/3/tutorial/datastructures.html +You can find a list of all available list methods in this chapter of the Python documentation: https://docs.python.org/3/tutorial/datastructures.html -## Речници +## Dictionaries -> За читателите у дома: тази част е показана във видеото [Python Basics: Dictionaries](https://www.youtube.com/watch?v=ZX1CVvZLE6c). +> For readers at home: this part is covered in the [Python Basics: Dictionaries](https://www.youtube.com/watch?v=ZX1CVvZLE6c) video. -Речника е подобен на листа, но можете да достъпвате стойностите му като погледнете за ключа вместо числения индекс. Синтаксисът за дефиниране на празен речник е: +A dictionary is similar to a list, but you access values by looking up a key instead of a numeric index. A key can be any string or number. The syntax to define an empty dictionary is: {% filename %}command-line{% endfilename %} @@ -374,9 +358,9 @@ Maria {} ``` -Това показва, че в момента създадохте празен речник. Ура! +This shows that you just created an empty dictionary. Hurray! -Сега, опитайте се да напишете следната команда (опитайте се да заместите със своя информация): +Now, try writing the following command (try substituting your own information, too): {% filename %}command-line{% endfilename %} @@ -384,13 +368,13 @@ Maria >>> participant = {'name': 'Ola', 'country': 'Poland', 'favorite_numbers': [7, 42, 92]} ``` -С тази команда, току що създадохте променлива с име `participant` с три елемент-стойност (keys-value) двойки. +With this command, you just created a variable named `participant` with three key–value pairs: -- Елементът `name` се отнася за стойността `'Ola'` (`низ` обект), -- `country` се отнася за `'Poland'` (друг `низ`), +- Ключът `name` се сочи към стойността `'Ola'` (`низов` обект), +- `country` сочи към `'Poland'` (друг `низ`), - and `favorite_numbers` се отнася за `[7, 42, 92]` (`лист` с три числа в него). -Може да проверите съдържанието на всеки от елементите с този синтаксис: +You can check the content of individual keys with this syntax: {% filename %}command-line{% endfilename %} @@ -399,9 +383,9 @@ Maria Ola ``` -Виждате ли, подобно е на лист. Но не е необходимо да помните индекса -- само името. +See, it's similar to a list. But you don't need to remember the index – just the name. -Какво се случва, когато попитаме Python за стойността на елемент, който не съществува? Можете ли да познаете? Нека опитаме и видим: +What happens if we ask Python the value of a key that doesn't exist? Can you guess? Let's try it and see! {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -412,33 +396,33 @@ Traceback (most recent call last): KeyError: 'age' ``` -Вижте, друга грешка! Тази е **KeyError**. Python е много услужлив и ти казва, че елемент `'age'` не съществува в този речник. +Look, another error! This one is a **KeyError**. Python is helpful and tells you that the key `'age'` doesn't exist in this dictionary. -Кога да използвате речник и кога лист? Това е добър въпрос. Помислете за отговор преди да видите следващия ред. +When should you use a dictionary or a list? Well, that's a good point to ponder. Think about the answer before looking at it in the next line. - Ако имате нужда просто от подредена последователност от елементи? Ползвайте лист. - Ако трабва да асоциирате стойности с елементи, които искате да може да ги видите на по-късен етап (чрез елемент - by key)? Използвайте речник. -Речниците са като листове, но *непостоянни*, което означава, че могат да бъдат променени след като бъдат създадени. Може да добавяте нови двойки елемент-стойност към речника след като е създаден ето така: +Like lists, using the `len()` function on the dictionaries returns the number of key–value pairs in the dictionary. Go ahead and type in this command: {% filename %}command-line{% endfilename %} ```python ->>> participant['favorite_language'] = 'Python' +>>> len(participant) +3 ``` -Като при листовете, използването на метода `len()` върху речника връща броя на двойката елемент-стойност в речника. Продължете и напишете тази команда: +Dictionaries, like lists, are *mutable*, meaning that they can be changed after they are created. You can add new key–value pairs to a dictionary after it is created, like this: {% filename %}command-line{% endfilename %} ```python ->>> len(participant) -4 +>>> participant['favorite_language'] = 'Python' ``` -Надявам се да има смисъл това което правим досега. :) Готови ли сте за още веселба с речниците? Прочетете някои невероятни неща. +I hope it makes sense up to now. :) Ready for some more fun with dictionaries? Read on for some amazing things. -Можете да използвате метода `pop()` да изтриете елемент от речника. Да кажем, че искаме да премахнем въведението, което се отанся за елемента `'favorite_numbers'`, напишете следната команда: +You can use the `pop()` method to delete an item in the dictionary. Say, if you want to delete the entry corresponding to the key `'favorite_numbers'`, type in the following command: {% filename %}command-line{% endfilename %} @@ -449,9 +433,9 @@ KeyError: 'age' {'country': 'Poland', 'favorite_language': 'Python', 'name': 'Ola'} ``` -Както се вижда, двойката елемент-стойност отнасяща се за 'favorite_numbers' беше премахната. +As you can see from the output, the key–value pair corresponding to the 'favorite_numbers' key has been deleted. -Както и това, можете да промените стойността, която отговаря на вече създаден елемент в речника. Напишете това: +As well as this, you can also change a value associated with an already-created key in the dictionary. Type this: {% filename %}command-line{% endfilename %} @@ -461,24 +445,24 @@ KeyError: 'age' {'country': 'Germany', 'favorite_language': 'Python', 'name': 'Ola'} ``` -Както виждате, стойността на елемента `'country'` беше променен от `'Poland'` на `'Germany'`. :) Вълнуващо? Ураа! Току що научихте още едно невероятно нещо. +As you can see, the value of the key `'country'` has been altered from `'Poland'` to `'Germany'`. :) Exciting? Hurrah! You just learned another amazing thing. ### Обобщение -Страхотно! Вече знаете много за програмирането. В тази последна част научихте за: +Awesome! You know a lot about programming now. In this last part you learned about: - **грешки** -- знаете как да четете и разбирате грешките които се показват, ако Python не разбира командата която сте задали - **променливи** – имена на обектите, които ви позволяват да пишете код по-лесно и да правят кода ви по-четлив - **листове** –листовете са обекти запазени в определен ред - **речници** – обекти запазени като двойки от елемент-стойност (key-value pairs) -Вълнувате ли се за следващата част? :) +Excited for the next part? :) -## Сравняване на неща +## Compare things -> За читателите у вома: тази част е показана във видеото [Python Basics: Comparisons](https://www.youtube.com/watch?v=7bzxqIKYgf4). +> For readers at home: this part is covered in the [Python Basics: Comparisons](https://www.youtube.com/watch?v=7bzxqIKYgf4) video. -Голяма част от програмирането включва сравняване на неща. Какво е най-лесното нещо което може да се сравни? Числата! Нека видим как работи: +A big part of programming involves comparing things. What's the easiest thing to compare? Numbers! Let's see how that works: {% filename %}command-line{% endfilename %} @@ -493,13 +477,15 @@ True True >>> 5 != 2 True +>>> len([1, 2, 3]) > len([4, 5]) +True ``` -Дадохме на Python да сравни няколко числа. Както може да видите, Python не само че може да сравни числата, но може също така да сравнява и резултатите от метода. Супер, нали? +We gave Python some numbers to compare. As you can see, not only can Python compare numbers, but it can also compare values of mathematical expressions like `2 * 2` and function results like the `2` returned by `len([4, 5])`. Nice, huh? -Чудите ли се защо използвахме два знака за равно `==` един до друг за да сравним дали числата са равни? Използваме едно равно `=` за да причислим стойност на променливите. Винаги, ама **винаги** трябва да иползваме две от тях – `==` – ако искаме да проверим дали две неща са равни едно на друго. Можем също така да кажем, че не искаме двете неща да са равни едно на друго. Затова, използваме символа `!=`, както е показано в примера по-горе. +Do you wonder why we put two equal signs `==` next to each other to compare if numbers are equal? We use a single `=` for assigning values to variables. You always, **always** need to put two of them – `==` – if you want to check if things are equal to each other. We can also state that things are unequal to each other. For that, we use the symbol `!=`, as shown in the example above. -Дайте на Python още две задачки: +Give Python two more tasks: {% filename %}command-line{% endfilename %} @@ -510,14 +496,14 @@ True False ``` -Виждали сме `>` и `<`, но какво означават `>=` и `<=`? Четем ги по този начин: +We've seen `>` and `<`, but what do `>=` and `<=` mean? Read them like this: - x `>` y означава: x е по-голямо от y - x `>` y означава: x е по-малко от y - x `<=` y означава: x е по-малко или равно на y - x `>=` y означава: x е по-голямо или равно на y -Страхотно! Искате ли да направите още нещо? Пробвайте това: +Awesome! Wanna do one more? Try this: {% filename %}command-line{% endfilename %} @@ -530,12 +516,12 @@ False True ``` -Може да дадете на Python колкото си искате числа да сравнява и ще ви даде отговор! Много умно, нали? +You can give Python as many numbers to compare as you want, and it will give you an answer! Pretty smart, right? - **and** – ако използвате оператора `and`, двете сравнения трябва да са True за да бъде цялата команда True - **or** – ако използвате оператора `or`, само едното сравнение трябва да е True за да бъде цялата команда True -Чували ли сте за израза "сравнение на ябълки и портокали"? Нека пробваме подобно нещо в Python: +Have you heard of the expression "comparing apples to oranges"? Let's try the Python equivalent: {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -546,20 +532,20 @@ Traceback (most recent call last): TypeError: '>' not supported between instances of 'int' and 'str' ``` -Тук виждате, както при израза, Python не е способен да сравни число (`int`) и низ (`str`). Вместо това ни показва грешка **TypeError** и ни казва, че двата типа не могат да бъдат сравнени. +Here you see that just like in the expression, Python is not able to compare a number (`int`) and a string (`str`). Instead, it shows a **TypeError** and tells us the two types can't be compared together. -## Булеви променливи +## Boolean -По между другото, току що научихте за нов тип обект в Python. Нарича се **Булев (Boolean)**. +Incidentally, you just learned about a new type of object in Python. It's called **Boolean**. -Има само два вида булеви променливи: +There are only two Boolean objects: - True - False -Но за Python да разбере това, винаги трябва да пишете 'True' (като първата буква е главна, а следващите малки). **true, TRUE, and tRUE няма да работят – само True е правилно.** (Същото се отнася и до 'False'.) +But for Python to understand this, you need to always write it as 'True' (first letter uppercase, with the rest of the letters lowercased). **true, TRUE, and tRUE won't work – only True is correct.** (The same applies to 'False' as well.) -Булевите стойности могат също да са променливи! Вижте тук: +Booleans can be variables, too! See here: {% filename %}command-line{% endfilename %} @@ -569,7 +555,7 @@ TypeError: '>' not supported between instances of 'int' and 'str' True ``` -Може също да го направите по този начин: +You can also do it this way: {% filename %}command-line{% endfilename %} @@ -579,27 +565,27 @@ True False ``` -Практикувайте и се повеселете с булевите стойности като се опитате да напишете следните команди: +Practice and have fun with Booleans by trying to run the following commands: - `True and True` - `False and True` - `True or 1 == 1` - `1 != 2` -Поздраления! Булевите стойности са едни от най-готините неща в програмирането, и ти току що се научи как да ги използваш! +Congrats! Booleans are one of the coolest features in programming, and you just learned how to use them! # Запази! -> За читателите у дома: тази част е показана във видеото [Python Basics: Saving files and "If" statement](https://www.youtube.com/watch?v=dOAg6QVAxyk) +> For readers at home: this part is covered in the [Python Basics: Saving files and "If" statement](https://www.youtube.com/watch?v=dOAg6QVAxyk) video. -До тук писахме всичкия си python код в интерпретатора, който ни ограничава да използваме само едни ред да впишем кода. Обикновено програмите са запазени във файлове и после изпълнени от **интерпретатора** или **компилатора** ни. Досега пускахме нашите програми по една на ред в Python интерпретатора. Ще са ни необходими малко повече редове от код за следващите няколко задачи, затова бързо ще направим това: +So far we've been writing all our python code in the interpreter, which limits us to entering one line of code at a time. Normal programs are saved in files and executed by our programming language **interpreter** or **compiler**. So far we've been running our programs one line at a time in the Python **interpreter**. We're going to need more than one line of code for the next few tasks, so we'll quickly need to: - Излезем от Python интерпретатора - Отворим редактор за текс по избор - Запазим малко код в нов python файл - Пуснете го! -За да излезнем от Python интерпретатора, който използвахме, пише следната функция `exit()` +To exit from the Python interpreter that we've been using, type the `exit()` function {% filename %}command-line{% endfilename %} @@ -608,9 +594,9 @@ False $ ``` -Това ще ви върне в началното състояние на конзолата (терминала). +This will put you back into the command prompt. -По-рано избрахме нашия редактор от секцията за [code editor](../code_editor/README.md). Сега трябва да го отворим и да напишем малко код в нов файл (ако използвате Chromebook, създайте нов файл в cloud IDE и отворете файла, който ще е в редактора): +Earlier, we picked out a code editor from the [code editor](../code_editor/README.md) section. We'll need to open the editor now and write some code into a new file (or if you're using a Chromebook, create a new file in the cloud IDE and open the file, which will be in the included code editor): {% filename %}editor{% endfilename %} @@ -618,18 +604,18 @@ $ print('Hello, Django girls!') ``` -Очевидно, вече сте по-обиграни Python разработчици, така че напишете код, който научихте днес. +Obviously, you're a pretty seasoned Python developer now, so feel free to write some code that you've learned today. -Сега трябва да запазим файла и да му дадем описателно име. Нека наречем файла **python_intro.py** и го запазим на началния си екран. Можем да именуваме файла си както пожелаем, но е важно да сме сигурни, че завършва на **.py**. Разширението **.py** казва на операционната система, че това е **Python executable file** и Python може да го обработи. +Now we need to save the file and give it a descriptive name. Let's call the file **python_intro.py** and save it to your desktop. We can name the file anything we want, but the important part here is to make sure the file ends in **.py**. The **.py** extension tells our operating system that this is a **Python executable file** and Python can run it. -> **Забележка:** Трябва да забелязахте, че едни от най-готините неща в редактора са: цветовете! В конзолата на Python всичко беше един цват; сега трябва да виждате, че `print` функцията е с различен цвят от цвета на низа. Това се нарича "syntax highlighting", и е много полезна добавка когато пишем код. Цвета на нещата ще ви подсказва, например ако имате незатворени низове или сте объркали ключова дума (като при писането на функцията `def`, както ще видим по-долу). Това е една от причините да изполваме редактор за писане на код. :) :) +> **Note** You should notice one of the coolest thing about code editors: colors! In the Python console, everything was the same color; now you should see that the `print` function is a different color from the string. This is called "syntax highlighting", and it's a really useful feature when coding. The color of things will give you hints, such as unclosed strings or a typo in a keyword name (like the `def` in a function, which we'll see below). This is one of the reasons we use a code editor. :) -С вече запазения файл е време да го пуснем! Да използваме това, което научихме от секцията с командите. Ползвайте терминала (конзолата) за да смените директорията до началния си екран (desktop). +With the file saved, it's time to run it! Using the skills you've learned in the command line section, use the terminal to **change directories** to the desktop. -На Mac, командата ще излгежда по този начин: +On a Mac, the command will look something like this: {% filename %}command-line{% endfilename %} @@ -641,20 +627,20 @@ data-collapse=true ces--> -На Linux, ще изглежда така: +On Linux, it will be like this: {% filename %}command-line{% endfilename %} $ cd ~/Desktop -(Помнете, че думата "Desktop" може да е преведена на вашия език.) +(Remember that the word "Desktop" might be translated to your local language.) -На Windows Command Prompt ще изглежда така: +On Windows Command Prompt, it will be like this: {% filename %}command-line{% endfilename %} @@ -665,7 +651,7 @@ data-collapse=true ces--> -И на Windows Powershell ще изглежда така: +And on Windows Powershell, it will be like this: {% filename %}command-line{% endfilename %} @@ -674,9 +660,9 @@ data-collapse=true ces--> -Ако се затруднявате, поискайте помощ. Затова са менторите! +If you get stuck, ask for help. That's exactly what the coaches are here for! -Сега ползвайте Python за да изпълни кода във файла ето така: +Now use Python to execute the code in the file like this: {% filename %}command-line{% endfilename %} @@ -684,7 +670,7 @@ data-collapse=true ces--> Hello, Django girls! -Забележка: на Windows 'python3' не е разпознат като команда. Вместо това, използвайте 'python' за да стартирате файла: +Note: on Windows 'python3' is not recognized as a command. Instead, use 'python' to execute the file: {% filename %}command-line{% endfilename %} @@ -692,15 +678,15 @@ data-collapse=true ces--> > python python_intro.py ``` -Браво! Току що пуснахте първата си програма на Python, която беше запазена на файл. Чувствате ли се страхотно? +Alright! You just ran your first Python program that was saved to a file. Feel awesome? -Сега може да се прехвърлим на по-важно средство в програмирането: +You can now move on to an essential tool in programming: ## If … elif … else -Много неща в кода трябва да се изпълнят само ако са преминали определени условия. Затова Python има нещо, наречено **if условна конструкция**. +Lots of things in code should be executed only when given conditions are met. That's why Python has something called **if statements**. -Заместете кода във файла си **python_intro.py** с това: +Replace the code in your **python_intro.py** file with this: {% filename %}python_intro.py{% endfilename %} @@ -708,7 +694,7 @@ data-collapse=true ces--> if 3 > 2: ``` -Ако запазим и стартираме файла ще видим грешка като тази: +If we were to save and run this, we'd see an error like this: {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -718,7 +704,7 @@ if 3 > 2: SyntaxError: unexpected EOF while parsing -Python очаква от нас да дадем следващи инсктрукции какво да се изпълни в условието `3 > 2` за да бъде вярно (или `True` за същата цел). Нека накараме Python да отпечата “It works!”. Променете кода си във файла с това: +Python expects us to give further instructions to it which are executed if the condition `3 > 2` turns out to be true (or `True` for that matter). Let’s try to make Python print “It works!”. Change your code in your **python_intro.py** file to this: {% filename %}python_intro.py{% endfilename %} @@ -727,9 +713,9 @@ if 3 > 2: print('It works!') ``` -Забелязахте ли как изписахме следващия ред от код с 4 празни места навътре? Трябва да направим това за да може Python да знае, кой код да изпълни в случай, че е вярно условието. Може да използвате едно празно място, но почти всеки Python програмист използва 4, тъй като изглежда по-прилежно. Използването на бутона Tab също се равнява на 4 места, ако сте направили редактора си да прави така. Когато направите избор не го променяйте! Ако вече сте използвали 4 места за в бъдеще ползвайте 4 места - в противен случай може да попаднете на затруднения. +Notice how we've indented the next line of code by 4 spaces? We need to do this so Python knows what code to run if the result is true. You can do one space, but nearly all Python programmers do 4 to make things look neat. A single Tab will also count as 4 spaces as long as your text editor is set to do so. When you made your choice, don't change it! If you already indented with 4 spaces, make any future indentation with 4 spaces, too - otherwise you may run into problems. -Запазете и го стартирайте отново: +Save it and give it another run: {% filename %}command-line{% endfilename %} @@ -738,11 +724,11 @@ $ python3 python_intro.py It works! ``` -Забележка: Помнете, че на Windows, 'python3' не се разпознава като команда. От сега нататък, заместете 'python3' с 'python' за да изпълните файла. +Note: Remember that on Windows, 'python3' is not recognized as a command. From now on, replace 'python3' with 'python' to execute the file. ### Какво ако условието не е вярно (True)? -В предходните примери, кода се изпълняваше само ако условието е вярно (True). Но Python има също `elif` и `else` условия: +In previous examples, code was executed only when the conditions were True. But Python also has `elif` and `else` statements: {% filename %}python_intro.py{% endfilename %} @@ -753,7 +739,7 @@ else: print('5 is not greater than 2') ``` -Когато това се изпълни ще се отпечата: +When this is run it will print out: {% filename %}command-line{% endfilename %} @@ -761,7 +747,7 @@ else: 5 is indeed greater than 2 -Ако 2 беше по-голямо число от 5, тогава втората команда щеше да се изпълни. Нека видим как работи `elif` : +If 2 were a greater number than 5, then the second command would be executed. Let's see how `elif` works: {% filename %}python_intro.py{% endfilename %} @@ -775,7 +761,7 @@ else: print('Hey anonymous!') ``` -и се изпълнява: +and executed: {% filename %}command-line{% endfilename %} @@ -783,9 +769,9 @@ else: Hey Sonja! -Видяхте ли какво се случи там? `elif` ви даде възможност да добавите още едно условие в случай, че предното се провали. +See what happened there? `elif` lets you add extra conditions that run if the previous conditions fail. -Може да добавяте колкото си искате `elif` условия след първоначалното `if` условие. Например: +You can add as many `elif` statements as you like after your initial `if` statement. For example: {% filename %}python_intro.py{% endfilename %} @@ -805,7 +791,7 @@ else: print("My ears are hurting! :(") ``` -Python преминава и тества през всеки ред и отпечатва: +Python runs through each test in sequence and prints: {% filename %}command-line{% endfilename %} @@ -813,11 +799,11 @@ Python преминава и тества през всеки ред и отпе Perfect, I can hear all the details -## Коментари +## Comments -Коментрите са редове, започващи с `#`. Може да пишете каквото искате след `#` и Python ще го игнорира. Коментарите са направени да правят кода по-лесен за четене и разбиране от другите хора. +Comments are lines beginning with `#`. You can write whatever you want after the `#` and Python will ignore it. Comments can make your code easier for other people to understand. -Нека видим как изглежда: +Let's see how that looks: {% filename %}python_intro.py{% endfilename %} @@ -828,11 +814,11 @@ if volume < 20 or volume > 80: print("That's better!") ``` -Не е необходимо да пишете коментар за всеки ред от код, но те са много подходящи да обяснят какво прави самия код, или да дадат обобщение, когато се прави нещо сложно. +You don't need to write a comment for every line of code, but they are useful for explaining why your code is doing something, or providing a summary when it's doing something complex. ### Обобщение -В последните няколко упражнения научихте как да: +In the last few exercises you learned about: - **сравнявате** – в Python може да сравнявате като използвате `>`, `>=`, `==`, `<=`, `<` и `and`, `or` оператори - използвате **булеви променливи** – типа на обекта може да приема само две стойности: `True` или `False` @@ -840,15 +826,15 @@ if volume < 20 or volume > 80: - използвате **if … elif … else** – условна конструкция, която ви позволява да изпълнявате код когато определени условия се изпълнят. - пишете **коментари** - редовете в Python, които не се изпълняват и дават пояснения за кода ви -Време е за последната част от тази глава! +Time for the last part of this chapter! -## Вашите собствени функции! +## Your own functions! -> За читателите у дома: тази част е показана във видеото [Python Basics: Functions](https://www.youtube.com/watch?v=5owr-6suOl0). +> For readers at home: this part is covered in the [Python Basics: Functions](https://www.youtube.com/watch?v=5owr-6suOl0) video. -Помните ли функциите като `len()`, които изпълнихте в Python? Така, добри новини - сега ще научите как да напишете свои фукции! +Remember functions like `len()` that you can execute in Python? Well, good news – you will learn how to write your own functions now! -Функцията е последователност от инструкции, така че Python да може да я изпълнин. Всяка функция в Python започяа с ключовата дума `def`, с което се дава име на функцията и може да има няколко параметъра. Нека пробваме. Заместете кода във файла **python_intro.py** със следното: +A function is a sequence of instructions that Python should execute. Each function in Python starts with the keyword `def`, is given a name, and can have some parameters. Let's give it a go. Replace the code in **python_intro.py** with the following: {% filename %}python_intro.py{% endfilename %} @@ -860,11 +846,11 @@ def hi(): hi() ``` -Добре, първата ви функция е готова! +Okay, our first function is ready! -Може би се чудите защо написахме името на функцията в края на файла. Когато пишем `def hi():` и следващите редове започват по-навътре, това оказва какво трябва да направи функцията `hi()`. Python ще прочете и запомни тези инструкции, но няма да изпълни все още функцията. За да кажем на Python да изпълни функцията, трябва да извикаме вункцията с `hi()`. Python чете файла и изпълнява от горе до долу, затова трябва да дефинираме функцията преди да сме я повикали. +You may wonder why we've written the name of the function at the bottom of the file. When we write `def hi():` and the indented lines following, this is us writing instructions for what the `hi()` function should do. Python will read and remember these instructions, but won't run the function yet. To tell Python we want to run the function, we have to call the function with `hi()`. Python reads the file and executes it from top to bottom, so we have to define the function in the file before we call it. -Нека го стартираме и видим какво се случва: +Let's run this now and see what happens: {% filename %}command-line{% endfilename %} @@ -873,13 +859,13 @@ hi() How are you? -Забележка: ако не работи не се паникьосвайте! Резултатът ще ви помогне да разберете защо: +Note: if it didn't work, don't panic! The output will help you to figure why: - Ако получите грешка `NameError`, това най-вероятно означава, че сте направили грешка при писането, такаче трябва да проверите дали имената са същите при създаването на функцията `def hi():` и когато я извиквате `hi()`. - Ако получите грешка `IndentationError`, вижте дали двата реда с функцията `print` са отместени на едно и също растояние: python иска кода във функцията да бъде безупречно подреден. - Ако на изхода няма нищо, проверете дали последното `hi()` *не е* отместено - ако е , тази част също ще се превърне в част от функцията и никога няма да се изпълни -Нека съставим първата си функция с параметри. Ще променим предния пример - функцията, която казва 'hi' на човека, който пуска програмата - с име: +Let's build our first function with parameters. We will change the previous example – a function that says 'hi' to the person running it – with a name: {% filename %}python_intro.py{% endfilename %} @@ -887,7 +873,7 @@ hi() def hi(name): ``` -Както се вижда, дадохме на функцията си стойност, която нарекохме `name`: +As you can see, we now gave our function a parameter that we called `name`: {% filename %}python_intro.py{% endfilename %} @@ -903,7 +889,7 @@ def hi(name): hi() ``` -Запомнете: `print` функцията е поместена 4 места навътре спрямо `if` условието. Това е така, защото функцията се изпълнява, ако е изпълнено условието. Нека видим как работи: +Remember: The `print` function is indented four spaces within the `if` statement. This is because the function runs when the condition is met. Let's see how it works now: {% filename %}{{ warning_icon }} command-line{% endfilename %} @@ -914,7 +900,7 @@ hi() TypeError: hi() missing 1 required positional argument: 'name' -Опаа, грешка. За щастие, Python ни показва много полезно съобщение за грешката. Казва ни, че фукнцията `hi()` (която ние дефинирахме) има аргумент, който се изисква (с име `name`) и че сме забравили да го приложим, когато извикваме фунцкията. Нека оправим това в края на файла: +Oops, an error. Luckily, Python gives us a pretty useful error message. It tells us that the function `hi()` (the one we defined) has one required argument (called `name`) and that we forgot to pass it when calling the function. Let's fix it at the bottom of the file: {% filename %}python_intro.py{% endfilename %} @@ -922,7 +908,7 @@ hi() hi("Ola") ``` -И да стартираме отначало: +And run it again: {% filename %}command-line{% endfilename %} @@ -930,7 +916,7 @@ hi("Ola") Hi Ola! -А ако сменим името? +And if we change the name? {% filename %}python_intro.py{% endfilename %} @@ -938,7 +924,7 @@ hi("Ola") hi("Sonja") ``` -И стартираме отново: +And run it: {% filename %}command-line{% endfilename %} @@ -946,16 +932,16 @@ hi("Sonja") Hi Sonja! -Сега, какво мислите, че ще стане ако напишете ново име? (Не Ola или Sonja.) Опитайте и вижте дали сте прави. Трябва да отпечата това: +Now, what do you think will happen if you write another name in there? (Not Ola or Sonja.) Give it a try and see if you're right. It should print out this: {% filename %}command-line{% endfilename %} Hi anonymous! -Това е страхотно, нали? При това не трбва да се повтаряте всеки път, когато смените името на човека, който функцията трябва да поздрави. Затова са ни необходими функциите - никога да не повтаряш кода си! +This is awesome, right? This way you don't have to repeat yourself every time you want to change the name of the person the function is supposed to greet. And that's exactly why we need functions – you never want to repeat your code! -Нека опитаме нещо по-хитро - имаме повече от две имена и писането на условия за всяко едно от тях ще отнеме много време, нали така? Заместете съдържание на файла си със следното: +Let's do something smarter – there are more names than two, and writing a condition for each would be hard, right? Replace the content of your file with the following: {% filename %}python_intro.py{% endfilename %} @@ -966,7 +952,7 @@ def hi(name): hi("Rachel") ``` -Нека извикаме кода: +Let's call the code now: {% filename %}command-line{% endfilename %} @@ -974,17 +960,17 @@ hi("Rachel") Hi Rachel! -Поздравления! Току що научихте как да пишете функции! :) +Congratulations! You just learned how to write functions! :) -## Цикли +## Loops -> За читателите у дома: тази част е показана във видеото [Python Basics: For Loop](https://www.youtube.com/watch?v=aEA6Rc86HF0) +> For readers at home: this part is covered in the [Python Basics: For Loop](https://www.youtube.com/watch?v=aEA6Rc86HF0) video. -Това вече е последната част. Мина бързо, нали? :) +This is the last part already. That was quick, right? :) -Програмистите не обичат да е повтарят. Програмирането се отнася до автоматизация, така че не искаме да поздравяваме всеки човек по име като изписваме за всеки по отделно, нали? Ето къде циклите идват в употреба. +Programmers don't like to repeat themselves. Programming is all about automating things, so we don't want to greet every person by their name manually, right? That's where loops come in handy. -Все още си спомняте листовете? Нека направим лист с момичета: +Still remember lists? Let's do a list of girls: {% filename %}python_intro.py{% endfilename %} @@ -992,7 +978,7 @@ hi("Rachel") girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You'] ``` -Искаме да поздравим всяка една от тях по име. Имаме функцията `hi` да направи това, така че нека я използваме в цикъл: +We want to greet all of them by their name. We have the `hi` function to do that, so let's use it in a loop: {% filename %}python_intro.py{% endfilename %} @@ -1000,9 +986,9 @@ girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You'] for name in girls: ``` -Конструкцията `for` се държи подобно на конструкцията `if`; кода под него трябва да е отместен с четири места навътре. +The `for` statement behaves similarly to the `if` statement; code below both of these need to be indented four spaces. -Ето целия код, който трябва да е във файла: +Here is the full code that will be in the file: {% filename %}python_intro.py{% endfilename %} @@ -1016,7 +1002,7 @@ for name in girls: print('Next girl') ``` -И когато го стартираме: +And when we run it: {% filename %}command-line{% endfilename %} @@ -1033,9 +1019,9 @@ for name in girls: Next girl -Както виждате всичко, което сложите вътре във `for` конструкцията с отместването ще бъде повторено за всеки елемент от листа `girls`. +As you can see, everything you put inside a `for` statement with an indent will be repeated for every element of the list `girls`. -Може също да използвате `for` цикъл за числа като използвате фунцкията `range` : +You can also use `for` on numbers using the `range` function: {% filename %}python_intro.py{% endfilename %} @@ -1044,7 +1030,7 @@ for i in range(1, 6): print(i) ``` -Което ще отпечата: +Which would print: {% filename %}command-line{% endfilename %} @@ -1055,16 +1041,16 @@ for i in range(1, 6): 5 -`range` е функция, която създава лист от номера едно след друго (тези номера са дадени от вас като стойности). +`range` is a function that creates a list of numbers following one after the other (these numbers are provided by you as parameters). -Забележете, че втория параметър, който сте дали не се включва в листа с показаните числа от Python (което означава, че `range(1, 6)` брои от 1 до 5, без да включва числото 6). Това е така, защото "range" е полу-отворена функция, което означава, че включва първата стойност, но не и последната. +Note that the second of these two numbers is not included in the list that is output by Python (meaning `range(1, 6)` counts from 1 to 5, but does not include the number 6). That is because "range" is half-open, and by that we mean it includes the first value, but not the last. -## Обобщение +## Summary -Това е! **Ти си върха!** Това беше сложна глава, така че трябва да сте горди със себе си. Ние определено сме горди с това, което постигнахте досега! +That's it. **You totally rock!** This was a tricky chapter, so you should feel proud of yourself. We're definitely proud of you for making it this far! -За официалното и пълно ръководство на Python посетете visit https://docs.python.org/3/tutorial/. Това ще ви даде много по-подробни и цялостни знания за езика. Със здраве! :) +For official and full python tutorial visit https://docs.python.org/3/tutorial/. This will give you a more thorough and complete study of the language. Cheers! :) -Може би искате да направите нещо друго за кратко - разтягане, разходка, да ви отпочинат очите - преди да отидем към следващата глава. :) +You might want to briefly do something else – stretch, walk around for a bit, rest your eyes – before going on to the next chapter. :) -![Кексче](images/cupcake.png) \ No newline at end of file +![Cupcake](images/cupcake.png) \ No newline at end of file diff --git a/bg/python_introduction/prompt.md b/bg/python_introduction/prompt.md new file mode 100644 index 00000000000..27f422934c0 --- /dev/null +++ b/bg/python_introduction/prompt.md @@ -0,0 +1,17 @@ +## Python prompt + +> For readers at home: this part is covered in the [Python Basics: Integers, Strings, Lists, Variables and Errors](https://www.youtube.com/watch?v=MO63L4s-20U) video. + +To start playing with Python, we need to open up a *command line* on your computer. You should already know how to do that – you learned it in the [Intro to Command Line](../intro_to_command_line/README.md) chapter. + +Once you're ready, follow the instructions below. + +We want to open up a Python console, so type in `python` on Windows or `python3` on Mac OS/Linux and hit `enter`. + +{% filename %}command-line{% endfilename %} +``` +$ python3 +Python {{ book.py_release }} (...) +Type "help", "copyright", "credits" or "license" for more information. +>>> +``` diff --git a/bg/template_extending/README.md b/bg/template_extending/README.md index d9278924a4d..c243bcaba1e 100644 --- a/bg/template_extending/README.md +++ b/bg/template_extending/README.md @@ -23,34 +23,36 @@ ```html {% load static %} + Django Girls blog - - + - + -
+
-
+
{% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %}
-
+
``` @@ -61,17 +63,19 @@ ```html - -
+ +
-
+
{% block content %} {% endblock %}
-
+
``` @@ -92,13 +96,13 @@ ```html {% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} ``` @@ -111,13 +115,13 @@ ```html {% block content %} {% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} {% endblock %} ``` @@ -131,13 +135,13 @@ {% block content %} {% for post in posts %} -
-
+
+
+

{{ post.title }}

{{ post.text|linebreaksbr }}

-
+ {% endfor %} {% endblock %} ``` diff --git a/bg/whats_next/README.md b/bg/whats_next/README.md index ed55fd3b3b4..6d56066a990 100644 --- a/bg/whats_next/README.md +++ b/bg/whats_next/README.md @@ -15,8 +15,9 @@ #### Django - Другата ни книга, [Django Girls Tutorial: Extensions](https://tutorial-extensions.djangogirls.org/) -- [Официалното ръководство на Django](https://docs.djangoproject.com/en/2.2/intro/tutorial01/) +- [Официалното ръководство на Django](https://docs.djangoproject.com/en/3.2/intro/tutorial01/) - [Първи стъпки с видео уроци на Django](http://www.gettingstartedwithdjango.com/) +- [Django for Everybody Specialization](https://www.coursera.org/specializations/django) - някои видео лекции могат да бъдат одитирани безплатно и можете да спечелите сертификат Coursera, като вземете тези курсове #### HTML, CSS и JavaScript