diff --git a/tr/chromebook_setup/README.md b/tr/chromebook_setup/README.md
index 217cbaaa596..c4727c38138 100644
--- a/tr/chromebook_setup/README.md
+++ b/tr/chromebook_setup/README.md
@@ -1,5 +1,5 @@
# Chromebook kurulumu
-> **Not** Zaten yükleme adımlarını uyguladıysanız, bunu tekrar yapmanıza gerek yok- direk [Python'a Giriş](../python_introduction/README.md)'e atlayabilirsiniz.
+> **Not** Zaten yükleme adımlarını uyguladıysanız, bunu tekrar yapmanıza gerek yok- direkt [Python'a Giriş](../python_introduction/README.md)'e atlayabilirsiniz.
{% include "/chromebook_setup/instructions.md" %}
\ No newline at end of file
diff --git a/tr/chromebook_setup/instructions.md b/tr/chromebook_setup/instructions.md
index 62280a52133..c3d682a919f 100644
--- a/tr/chromebook_setup/instructions.md
+++ b/tr/chromebook_setup/instructions.md
@@ -45,16 +45,16 @@ Sonra, çalıştır:
pip install django~=1.11.0
-(son satırda bir tılde ve eşitlik işareti kullandığımıza dikkat edin: ~=).
+(son satırda bir tilde ve eşitlik işareti kullandığımıza dikkat edin: ~=).
### GitHub
-Bir [GitHub](https://github.com) hesabı açın.
+Bir [Github](https://github.com) hesabı açın.
### PythonAnywhere
Django Girls eğitimi, yeni web uygulamanızı güçlendiren ve onu herkesin görebileceği şekilde herkes tarafından erişilebilen bir bilgisayara (sunucu olarak adlandırılır) taşıyan bir kod olan Deployment (Dağıtım) adlı bir bölümü içerir.
-Kılavuzu Chromebook üzerinden kullanırken bu bölüm biraz garip oluyor; zaten internet üzerindeki bir bilgisayar kullanılıyor (laptop dışında). Bununla birlikte, Cloud 9'u çalışma alanımız olarak veya "devam etmekte" olan işlerimizin bulunduğu bir yer olarak düşünebiliriz Python Anywhere de işlerimizi daha eksiksiz hale getirmek için gösterebileceğimiz bir yer olarak düşünebildiğimizden hala kullanışlıdır.
+Kılavuzu Chromebook üzerinden kullanırken bu bölüm biraz garip oluyor; zaten internet üzerindeki bir bilgisayar kullanılıyor (laptop dışında). Bununla birlikte, Cloud 9'u çalışma alanımız veya "devam etmekte" olan işlerimizin bulunduğu bir yer olarak, Python Anywhere'i de işlerimizi daha eksiksiz hale getirdiğimizde gösterebileceğimiz bir yer olarak düşündüğümüzde hala kullanışlıdır.
Bu nedenle, yeni bir Python Anywhere hesabı açmak için [www.pythonanywhere.com](https://www.pythonanywhere.com).
\ No newline at end of file
diff --git a/tr/code_editor/instructions.md b/tr/code_editor/instructions.md
index f9a1d7a9cf3..c126460d616 100644
--- a/tr/code_editor/instructions.md
+++ b/tr/code_editor/instructions.md
@@ -1,6 +1,6 @@
Birçok farklı kod editörü var, hangi editörü kullanacağınız kişisel tercihinize bağlı. Çoğu Python programcısı PyCharm gibi karmaşık fakat son derece güçlü IDE'leri (Integrated Development Environments-Entegre Geliştirme Ortamları) kullanır. Başlangıç seviyesi için bunlar muhtemelen pek uygun olmayacaktır. Bizim önerdiklerimiz aynı derecede güçlü fakat çok daha basit editörler olacak.
-Bizim tavsiyelerimiz aşağıdakiler, ama mentörünüz danışmak isteyebilirsiniz.
+Bizim tavsiyelerimiz aşağıdakiler, ama mentörünüze danışmak isteyebilirsiniz.
## Gedit
@@ -16,7 +16,7 @@ Sublime Text, ücretsiz deneme süresi olan çok popüler bir editördür ve tü
## Atom
-Atom, [GitHub](https://github.com/) tarafından oluşturulan son derece yeni bir kod editörüdür. Ücretsiz, açık kaynak ve Windows, OS X ve Linux için kullanılabilir.
+Atom, [GitHub](https://github.com/) tarafından oluşturulan son derece yeni bir kod editörüdür. Ücretsiz ve açık kaynaklıdır. Windows, OS X ve Linux için kullanılabilir.
[Buradan indirin](https://atom.io/)
@@ -26,6 +26,6 @@ Neden Word ya da Notepad kullanmak yerine, özel bir kod editörü yazılımı k
Birinci nedeni yazdığımız kodun **sade yazı** olması gerektiği içindir ki Word gibi programlar sade yazı üretmezler (font ve şekillendirme desteklerler) ve [RTF (Rich Text Format)](https://en.wikipedia.org/wiki/Rich_Text_Format) gibi özel formatlar kullanılar.
-İkinci sebep ise kod editörlerinin kod düzenlemeye destek vermek - örnegin özel kelimeleri reklendirme ve otomatik parantez kapatma gibi - için özelleşmiş olmasıdır.
+İkinci sebep ise kod editörlerinin kod düzenlemeye destek vermek - örneğin özel kelimeleri reklendirme ve otomatik parantez kapatma gibi - için özelleşmiş olmasıdır.
-Bütün bunları birazdan deneyimleyeceğiz. Yakında kod editörünüz güvenlir eski dostunuz gibi olacaktır :)
\ No newline at end of file
+Bütün bunları birazdan deneyimleyeceğiz. Yakında kod editörünüz güvenilir bir eski dostunuz gibi olacaktır :)
\ No newline at end of file
diff --git a/tr/css/README.md b/tr/css/README.md
index 707b14e75ff..90aa3702359 100644
--- a/tr/css/README.md
+++ b/tr/css/README.md
@@ -42,10 +42,10 @@ Bunu blog uygulamamızın içine `static` isimli bir klasör oluşturarak yapaca
djangogirls
├── blog
- │ ├── geçişler
- │ ├── statik
- │ └── şablonlar
- └── benimsitem
+ │ ├── migrations
+ │ ├── static
+ │ └── templates
+ └── mysite
Django otomatik olarak uygulama klasörlerinizdeki "static" adlı klasörleri bulur. Böylece bunların içerikleri statik dosya olarak kullanabilir.
@@ -87,7 +87,7 @@ Bir CSS dosyasında, HTML dosyasındaki öğeler için stil belirleriz. Öğeler
CSS hakkında daha fazla bilgi edinmek için [CSS Selectors at w3schools](http://www.w3schools.com/cssref/css_selectors.asp) u okuyabilirsin.
-Bir de HTML şablonuna projemize CSS eklediğimizi bildirmemiz gerekiyor. `blog/templates/blog/post_list.html` dosyasını açıp en başına bunlar ekleyelim:
+Bir de HTML şablonuna projemize CSS eklediğimizi bildirmemiz gerekiyor. `blog/templates/blog/post_list.html` dosyasını açıp en başına bunları ekleyelim:
{% filename %}blog/templates/blog/post_list.html{% endfilename %}
@@ -95,7 +95,7 @@ Bir de HTML şablonuna projemize CSS eklediğimizi bildirmemiz gerekiyor. `blog/
{% load static %}
```
-Burada sadece statik dosya ekliyoruz :) `
` ve `` etiketleri arasına, bootstrap linklerinde sonra, şu satırı ekleyelim:
+Burada sadece statik dosya ekliyoruz :) `` ve `` etiketleri arasına, bootstrap linklerinden sonra, şu satırı ekleyelim:
{% filename %}blog/templates/blog/post_list.html{% endfilename %}
@@ -148,7 +148,7 @@ body {
}
```
-Bunu CSS ekleyip kaydet ve bak bakalım! Nasıl da oldu!
+Bunu CSS dosyana ekleyip kaydet ve bak bakalım! Nasıl da oldu!
![Şekil 14.3](images/margin2.png)
@@ -177,7 +177,7 @@ h1 a {
Harika!
-Yukarıda bahsettiğimiz üzere, CSS'te class (sınıf) diye bir kavram var. Class'lar, temel olarak HTML kodunuzun bir kısmına isim vermenize yarar ve diğer kısımları stiline değiştirmeden yalnızca o kısmın stilini değiştirmenizi sağlar. Bu süper yararlı olabilir! Çok farklı şeyler yapan iki div'iniz var diyelim (örneğin biri başlık diğeri gönderinin metni). Class, farklı görünmelerini sağlamana yardımcı olur.
+Yukarıda bahsettiğimiz üzere, CSS'te class (sınıf) diye bir kavram var. Class'lar, temel olarak HTML kodunuzun bir kısmına isim vermenize yarar ve diğer kısımların stilini değiştirmeden yalnızca o kısmın stilini değiştirmenizi sağlar. Bu süper yararlı olabilir! Çok farklı şeyler yapan iki div'iniz var diyelim (örneğin biri başlık diğeri gönderinin metni). Class, farklı görünmelerini sağlamana yardımcı olur.
Devam edelim ve HTML kodumuzun bir kısmına isim verelim. Başlığı içeren `div`'e `page-header` isimli bir class ekleyelim:
@@ -296,7 +296,7 @@ Bu dosyaları kaydedin ve web sayfanızı yenileyin.
Yaşasın! Harika görünüyor değil mi? Şimdi yapıştırdığımız koda bakıp CSS tarafından kullanılan ve HTML eklenmiş olan nesneleri bulalım. Tarihi turkuaz rengine çevirmek için nereyi değiştirmen gerekir?
-CSS ile biraz oynamaktan çekinme ve bir kaç şeyi değiştirmeye calış. CSS ile oynamak neyin neyi etkilediğini anlamak için çok faydalı. Bir şeyleri bozarsan dert etme, her zaman geri alabilirsin!
+CSS ile biraz oynamaktan çekinme ve birkaç şeyi değiştirmeye calış. CSS ile oynamak neyin neyi etkilediğini anlamak için çok faydalı. Bir şeyleri bozarsan dert etme, her zaman geri alabilirsin!
Ücretsiz [Codeacademy HTML & CSS kursu](https://www.codecademy.com/tracks/web)nu izlemeni gerçekten öneririz. Web sitelerini CSS'le güzelleştirmeyi iyice öğrenmene yardımcı olabilir.
diff --git a/tr/deploy/README.md b/tr/deploy/README.md
index 2d5b52da101..1c784309115 100644
--- a/tr/deploy/README.md
+++ b/tr/deploy/README.md
@@ -1,14 +1,14 @@
# Yayına alın!
-> **Not** Bir sonraki bölüm ara ara zor gelebilir. Dayanın ve bölümü bitirin; yayına alma, website geliştirme sürecinin önemli bir parçasıdır. Biraz daha uğraşmalı olan websitesini canlıya alma işine eğitmeninizin yardım edebilmesi için bu bölümü tutorial'ın ortasına yerleştirdik. Böylece eğer zaman yetmezse tutorial'ı kendi başınıza bitirebilirsiniz.
+> **Not** Bir sonraki bölüm ara ara zor gelebilir. Dayanın ve bölümü bitirin; yayına alma, website geliştirme sürecinin önemli bir parçasıdır. Biraz daha uğraştırıcı olan websitesini canlıya alma işine eğitmeninizin yardım edebilmesi için bu bölümü tutorial'ın ortasına yerleştirdik. Böylece eğer zaman yetmezse tutorial'ı kendi başınıza bitirebilirsiniz.
Şimdiye kadar web sitenize sadece kendi bilgisayarınızdan girilebiliyordu. Şimdi onu nasıl canlıya alacağınızı öğreneceksiniz! Yayına alma uygulamanızı internette yayınlama sürecidir, böylelikle insanlar sonunda gidip uygulamanızı görebilirler. :)
-Öğrendiğimiz üzere, bir websitesi bir sunucunun üstünde olmalıdır. İnternette bir çok sunucu sağlayıcısı var, biz [PythonAnywhere](https://www.pythonanywhere.com/) kullanacağız. PythonAnywhere ücretsizdir ve çok fazla ziyaretçisi olmayan küçük uygulamalar içindir yani şu anlık sizin için kesinlikle yeterli olacaktır.
+Öğrendiğimiz üzere, bir websitesi bir sunucunun üstünde olmalıdır. İnternette birçok sunucu sağlayıcısı var, biz bunlardan [PythonAnywhere](https://www.pythonanywhere.com/) i kullanacağız. PythonAnywhere ücretsiz olduğu ve çok fazla ziyaretçisi olmayan küçük uygulamalar için uygun olduğu için kesinlikle yeterli olacaktır.
-Dışarıdan kullanacağımız diğer servis bir kod barındırma hizmeti olan [GitHub](https://www.github.com). Başkaları da var, ama nerdeyse her programcının bir GitHub hesabı var, sizin de olacak!
+Dışarıdan kullanacağımız diğer servis bir kod barındırma hizmeti olan [Github](https://www.github.com). Başkaları da var, ama neredeyse her programcının bir Github hesabı var, sizin de olacak!
-Bu üç yer sizin için önemli olacak. Lokal bilgisayarınız geliştirme ve test yaptığınız yer olacak. Değişikliklerden memnun olduğunuzda programınızın bir kopyasını GitHub'a koyacaksınız. Web siteniz PythonAnywhere üzerinde olacak ve onu kodunuzun bir kopyasını GitHub'dan alarak günceleyeceksiniz.
+Bu üç yer sizin için önemli olacak. Lokal bilgisayarınız geliştirme ve test yaptığınız yer olacak. Değişikliklerden memnun olduğunuzda programınızın bir kopyasını Github'a koyacaksınız. Web siteniz PythonAnywhere üzerinde olacak ve onu kodunuzun bir kopyasını Github'dan alarak güncelleyeceksiniz.
# Git
@@ -16,7 +16,7 @@ Bu üç yer sizin için önemli olacak. Lokal bilgisayarınız geliştirme ve te
{% include "/deploy/install_git.md" %}
-## Git repomuzu oluşturmak
+## Git repomuzu oluşturalım
Git, bir kod deposu (repository veya kısaca "repo") olarak adlandırılan belirli dosyalardaki değişiklikleri izler. Projemiz için bir tane oluşturalım. Konsolunuzu açın ve `djangogirls` klasöründe aşağıdaki komutları çalıştırın:
@@ -77,182 +77,146 @@ Ve son olarak değişikliklerimizi kaydediyoruz. Komut satırına gidin ve aşa
{% filename %}komut-satırı{% endfilename %}
$ git add --all .
- $ git commit -m "Django Girls uygulamasında ilk commit'im"
+ $ git commit -m "Django Girls uygulamam, ilk commit"
[...]
- 13 dosya değiştirildi, 200 eklenen (+)
+ 13 files changed, 200 insertions(+)
create mode 100644 .gitignore
[...]
create mode 100644 mysite/wsgi.py
- ```
-
-
- ## Kodunu GitHub'a ekle
- [GitHub.com](https://www.github.com) adresine gidip yeni ve ücretsiz bir hesap için kaydol. (Workshop prep(atölye hazırlığı) aşamasında yaptım zaten ben bunu diyorsanız, bu harika!)
-
- Sonra yeni bir repository oluşturup "my-first-blog" ismini verin. "BENİOKU dosyası ile başlat" onay kutusunu işaretlemeyin, .gitignore seçeneğini boş bırakın (biz manual olarak yaptık) ve Lisans'ı Hiçbiri(None) olarak ayarlayın.
-
-
-
- > **Not**`my-first-blog` ismi önemlidir – başka bir isim seçebilirsiniz, ancak aşağıdaki talimatlarda bu isim bir çok kez geçecektir ve bu bölümlerde her seferinde seçtiğiniz ismi kullanmanız gerekir. `my-first-blog` ismini kullanırsanız muhtemelen daha kolay olacaktır.
-
- Sonraki ekranda repo'nun klon URL'sini göreceksiniz. "HTTPS" ile başlayanı seçin, kopyalayın ve şunu terminale yapıştırın:
-
-
-
- Şimdi Git repository'i bilgisayarınızdaki bir GitHub'a bağlamamız gerekiyor.
-
- Aşağıdakileri konsol ekranına geçirin (`` kısmını köşeli parantez olamadan GitHub kullanıcı adınızla değiştirin):
-
- {% filename %}command-line{% endfilename %}
-$ git remote add origin https://github.com//my-first-blog.git $ git push -u origin master
+## Kodunu GitHub'a yollama (Push)
- GitHub kullanıcı adınızı ve şifrenize girdikten sonra böyle bir şey görmelisiniz:
-
- {% filename %}command-line{% endfilename %}
-
+Şimdi [Github.com](https://www.github.com) adresine gidip bir Github hesabı açmalıyız. (Eğer daha önceden hesap açtıysanız süper!)
-Username for 'https://github.com': zeynep Password for 'https://zeynep@github.com': Counting objects: 6, done. Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done. https://github.com/hjwp/my-first-blog.git için toplam 3 (delta 0), yeniden 0 (delta 0)
+Sıra depomuzu oluşturmaya geldi. 'New Repository' tuşuna tıklayıp "my-first-blog" adında bir Github deposu oluşturalım. "initialize with a README" ve ".gitignore" kutularının seçili olmadığından emin olalım (zaten .gitignore dosyamızı kendimiz oluşturmuştuk). Son olarak License seçeneğinde 'None'yi seçelim.
-- [new branch] master -> master Branch master orijinal branch masterı uzaktan takip etmek için kuruldu.
+![](images/new_github_repo.png)
- <!--TODO: belki kurulum bölümünde ssh anahtarları yüklenir ve bir uzantısı olmayan ppl'ye işaret eder-->
-
- Kodunuz şu anda GitHub'ta. Siteye girin ve kontrol edin! İleride kendini iyi bir şirkette bulacaksın – [Django](https://github.com/django/django), [Django Girls Tutorial](https://github.com/DjangoGirls/tutorial) 'li ve bir çok büyük açık kaynak projesi kodlarını GitHub'da barındırır. :)
-
-
- # PythonAnywhere'de blog açma
-
- > **Not** Siz zaten bir PythonAnywhere hesabına sahip olabilirsiniz – Eğer öyleyse tekrar açmanız gerekmez.
-
- {% include "/deploy/signup_pythonanywhere.md" %}
-
-
- ## PythonAnywhere'den kodumuzu çekiyoruz
-
- PythonAnywhere'e kaydolduğunuzda, gösterge tablonuza veya "Konsollar" sayfasına yönlendirilirsiniz. "Bash" konsolunu başlat seçeneğini seçin - bu, bilgisayarınızdaki konsolun bir PythonAnywhere versiyonudur.
-
- <img src="images/pythonanywhere_bash_console.png" alt="pointing at Other: Bash in Start a new Console" />
-
- > **Not** PythonAnywhere Linux tabanlıdır, yani Windows kullanıyorsanız bu konsol bilgisayarınızdakinden biraz daha farklı görünecektir.
-
- Reponuzun bir klonunu yaratarak kodumuzu GitHub'dan PythonAnywhere üzerine çekelim. Aşağıdakileri PythonAnywhere konsoluna geçirin (`<your-github-username>` yerine GitHub kullanıcı adınızın geleceğini unutmayın):
-
- {% filename %}PythonAnywhere command-line{% endfilename %}
-
+> **Not** `my-first-blog` ismi önemli -- başka birşey de seçebilirsiniz, ama aşağıdaki yönergelerde çok geçiyor, her seferinde değiştirmeniz gerekir. En kolayı `my-first-blog` ismi ile devam etmek.
-$ git clone https://github.com//my-first-blog.git
+Bir sonraki ekranda, repo'yu klonlamak için gereken URL'yi göreceksiniz. "HTTPS"li versiyonunu seçin, kopyalayın. Birazdan onu komut penceresine yapıştıracağız:
- Bu işlem kodunuzun bir kopyasını PythonAnywhere'a çekecektir. Konsola `tree my-first-blog` yazarak kontrol edebilirsiniz:
-
- {% filename %}PythonAnywhere command-line{% endfilename %}
-
+![](images/github_get_repo_url_screenshot.png)
-$ tree my-first-blog my-first-blog/ ├── blog │ ├── **init**.py │ ├── admin.py │ ├── migrations │ │ ├── 0001_initial.py │ │ └── **init**.py │ ├── models.py │ ├── tests.py │ └── views.py ├── manage.py └── mysite ├── **init**.py ├── settings.py ├── urls.py └── wsgi.py
+Şimdi bilgisayarınızdaki Git reposunu Github'daki repo ile ilişkilendirmemiz gerekiyor.
-
### PythonAnywhere üzerinde bir virtualenv oluşturuyoruz
+Aşağıdakini komut satırına yazın (`` kısmını Github hesabını yarattığınız sırada kullandığınız kullanıcı adı ile değiştirin, büyüktür küçüktür işaretlerini eklemeyin):
+
+{% filename %}komut-satırı{% endfilename %}
+
+ $ git remote add origin https://github.com//my-first-blog.git
+ $ git push -u origin master
- Tam olarak kendi bilgisayarınızda yaptığınız gibi PythonAnywhere üzerinde bir virtualenv oluşturabilirsiniz. Bash konsolunda şunu yazın:
+
+Github kullanıcı adı ve şifrenizi girin, ardından aşağıdakine benzer bir şey görmeniz gerekiyor:
+
+{% filename %}komut satırı{% endfilename %}
+
+ Username for 'https://github.com': zeynep
+ Password for 'https://zeynep@github.com':
+ Counting objects: 6, done.
+ Writing objects: 100% (6/6), 200 bytes | 0 bytes/s, done.
+ Total 3 (delta 0), reused 0 (delta 0)
+ To https://github.com/zeynep/my-first-blog.git
- {% filename %}PythonAnywhere command-line{% endfilename %}
+ * [new branch] master -> master
+ Branch master set up to track remote branch master from origin.
-$ cd my-first-blog
+
-$ virtualenv --python=python3.6 myvenv Running virtualenv with interpreter /usr/bin/python3.6 [...] Installing setuptools, pip...done.
+Kodunuz artık Github'da. Hemen gidip bak! İyi bir çevrede olduğunu göreceksiniz - [Django](https://github.com/django/django), the [Django Girls Tutorial](https://github.com/DjangoGirls/tutorial), ve daha birçok harika açık kaynak yazılım projesi de kodlarını Github'da tutuyor. :)
-$ source myvenv/bin/activate
+# Blogumuzun PythonAnywhere üzerinde kurulumu
-(myvenv) $ pip install django~=1.11.0 Collecting django [...] Successfully installed django-1.11.3
+## PythonAnywhere hesabı oluşturma
-
> **Not** `pip install`(pip kurulumu) adımı bir kaç dakika sürebilir. Sabır, sabır! Ama beş dakikadan daha uzun sürüyorsa bir sorun var demektir. Koçuna sor.
-
- <!--TODO: pip kurulumu yerine requirements.txt kullanmayı düşünün.-->
-
- ### PythonAnywhere' veritabanı kurulumu
-
- İşte kendi bilgisayarınızla sunucu arasındaki başka bir fark daha: farklı bir veri tabanı kullanıyor. Dolayısıyla, kullanıcı hesapları ve gönderiler sunucuda ve bilgisayarınızda farklı olabilir.
-
- Tıpkı kendi bilgisayarınızda yaptığımız gibi, sunucudaki veritabanını `migrate` ve` createsuperuser` ile başlatmak için aşağıdaki kodları kullanalım:
-
- {% filename %}PythonAnywhere command-line{% endfilename %}
-
+> **Not** En baştaki kurulum adımlarında PythonAnywhere hesabını açmış olabilirsiniz - öyleyse bu kısmı tekrar yapmanıza gerek yok.
-(mvenv) $ python manage.py migrate Operations to perform: [...] Applying sessions.0001_initial... OK (mvenv) $ python manage.py createsuperuser
+{% include "/deploy/signup_pythonanywhere.md" %}
- ## Blogumuzu bir web uygulaması olarak yayınlama
-
- Şimdi kodumuz PythonAnywhere'a geçirildi, virtualenv'ımız hazır ve veritabanı başlatıldı. Bir web uygulaması olarak yayına hazırız!
-
- Site logosuna tıklayarak PythonAnywhere gösterge tablosuna geri dönün ve ** Web** sekmesini tıklayın. Son olarak, **Add a new web app** kısmına tıklayarak web uygulaması ekleyin.
-
- Alan adınızı onayladıktan sonra, iletişim kutusundaki **manual configuration** (N.B. - *değil* "Django" seçeneği) seçeneğini işaretleyin. Sonrasında **Python 3.6** 'yı seçin ve sihirbazı bitirmek için İleri butonuna tıklayın.
-
- > **Not** "Manual configuration" seçeneğini seçtiğinize emin olun, "Django" olanı değil. Varsayılan PythonAnywhere Django kurlumu için çok iyiyiz. ;-)
-
-
- ### virtualenv ayarlama
-
- Sunucudaki uygulamada değişiklik yapmak istediğinizde web uygulamanızın PythonAnywhere config ekranına yönlendirileceksiniz.
-
- <img src="images/pythonanywhere_web_tab_virtualenv.png" />
-
- "Virtualenv" bölümünde, "Virtualenv yolunu girin" diyen kırmızı metne tıklayın ve `/home/<your-PythonAnywhere-username>/my-first-blog/myvenv/` dosya yolunu girin. Taşımadan önce dizin yolunu kaydetmek için onay işareti olan mavi kutuyu tıklayın.
-
- > **Not** Gereken yerlere kendi PythonAnywhere kullanıcı adınızı girin. Eğer bir hata yaparsanız PythonAnywhere size küçük bir uyarı kutusunda gösterecektir.
-
-
- Django, PythonAnywhere'in desteklediği Python'u kullanarak, web sitelerini sunmak için bir standart olan "WSGI" protokolüyle çalışır. PythonAnywhere'in Djano blogunuzu anlaması için yapılandırma şekli olarak WSGI yapılandırma dosyasını düzenliyoruz.
-
- "WSGI yapılandırma dosyası" bağlantısını tıkladıktan sonra (sayfanın üst kısmına yakın "kod" bölümünde `/var/www/<your-PythonAnywhere-username>_pythonanywhere_com_wsgi.py` gibi bir adlandırmaya sahip olacak) bir editöre yönlendirileceksin.
-
- Tüm içeriği sil ve aşağıdakilerle değiştir:
-
- {% filename %}<your-username>_pythonanywhere_com_wsgi.py{% endfilename %}
- ```python
- import os
- import sys
-
- path = os.path.expanduser('~/my-first-blog')
- if path not in sys.path:
- sys.path.append(path)
+## Sitemizin PythonAnywhere üzerinde yapılandırılması
+
+Ana [PythonAnywhere Dashboard](https://www.pythonanywhere.com/) a logosuna tıklayarak dönelim ve bir "Bash" console başlatalım – bu bilgisayarınızdaki komut satırının PythonAnywhere versiyonudur.
+
+![PythonAnywhere web arayüzündeki 'New Console' bölümünde, 'bash' için butona tıkla](images/pythonanywhere_bash_console.png)
+
+> **Not:** PythonAnywhere Linux tabanlıdır, eğer Windows kullanıyorsan, bilgisyarındaki konsoldan biraz farklı görünür.
+
+PythonAnywhere'de bir web yazılımı konuşlandırmak için kodun GitHub'dan çekilmesi ve PythonAnywhere'in bu kodu tanıyabilmesi ve çalıştırması için yapılandırmamız gerekiyor. Bu iş manuel olarak yapabilir ama PythonAnywhere bunu kolaylıkla yapabilmek için yardımcı bir araç sunar. İlk önce bu aracı kuralım:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+
+ $ pip3.6 install --user pythonanywhere
- os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
+
+Bu komut ekrana bir takım şeyler yazar, mesela `Collecting pythonanywhere`, and eventually end with a line saying `Successfully installed (...) pythonanywhere- (...)`.
+
+Şimdi, programımızı otomatik olarak yapılandırmak için bu komutu calıştıralım. Aşağıdakileri PythonAnywhere konsoluna yazalım (GitHub username yerine kendi GitHub ismini yazmayı unutma ``):
+
+{% filename %}PythonAnywhere komut satırı{% endfilename %}
+
+ $ git clone https://github.com//my-first-blog.git
- from django.core.wsgi import get_wsgi_application
- from django.contrib.staticfiles.handlers import StaticFilesHandler
- application = StaticFilesHandler(get_wsgi_application())
+
+Bu komut çalışırken neler olup bittiğini izleyebilirsiniz:
+
+- Kodunuz GitHub'dan çekiliyor
+- Tıpkı kendi bilgisayarındaki gibi PythonAnywhere üzerinde bir virtualenv oluşturuluyor
+- Yayına almak için gerekli ayarlar (settings) dosyası güncelleniyor
+- Yine `manage.py migrate` komutu ile PythonAnywhere üzerinde veritabanı oluşturuluyor
+- Sabit dosyaların (bunları daha sonra öğreneceğiz) oluşturuluyor
+- Ve web uygulamanızın API sinin PythonAnywhere tarafından sunulması için ayarlar yapılıyor
+
+Bu adımlar PythonAnywhere'de otomatikleştirilmiştir, fakat farklı herhangi bir sunucu sağlayacısıyla da aynı adımlar yapılmalıdır. Anlaşılması önemli olan nokta şu ki PythonAnywhere üzerinde yaratılan veritabanı ile kendi bilgisayarımızda yarattığımız veritabanı birbirinden tamamen ayrı -- dolayısı ile bu iki veritabanında saklanmış olan postlar ve kullanıcılar da farklı olabilir.
+
+Bu nedenle, aynen kendi bilgisayarımızda yapmış olduğumuz gibi, `createsuperuser` ile bir admin kullacısını oluşturmamız gerekiyor. PythonAnywhere otomatik olarak virtualenv i başlatmış olduğu için, bu kullanıcıyı hemen oluşturabiliriz:
+
+{% filename %}PythonAnywhere komut satırı{% endfilename %}
+
+ (.pythonanywhere.com) $ python manage.py createsuperuser
-Bu dosyanın işi, PythonAnywere'e uygulamanızın nerde yaşadığını ve Django settings dosyasının adının ne olduğunu söylemek.
+Admin kullanıcısının detaylarını girin. Daha önce kendi bilgisayarınızda oluşturduğunuz kullanıcı detayları ile aynı olması hatırlamak açısından faydalı olacaktır, tabii PythonAnywhere üzerindeki şifreyi daha zor olarak tanımlamak isteyebiliriz.
-`StaticFilesHandler` CSS'ler için var. Lokaldeki geliştirmenizde bu `runserver` komutu ile otomatik halloluyor. Tutorial'ın ilerleyen kısımlarında sitemizin CSS'ini düzenlerken statik dosyalar konusuna biraz daha fazla gireceğiz.
+Şimdi, isterseniz, PythonAnywhere üzerindeki kodlara `ls` komutu ile göz atabilirsiniz:
-**Save** (kaydet)'e basın. Arkasından **Web** sekmesine geri gidin.
+{% filename %}PythonAnywhere komut satırı{% endfilename %}
-Hazırız! Yeşil ve büyük **Reload** (Yeniden yükle) butonuna tıklayın. Uygulamanıza girip görebileceksiniz. Sayfanın tepesinde uygulamaya giden linki bulabilirsiniz.
+ (ola.pythonanywhere.com) $ ls
+ blog db.sqlite3 manage.py mysite static
+ (ola.pythonanywhere.com) $ ls blog/
+ __init__.py __pycache__ admin.py forms.py migrations models.py static
+ templates tests.py urls.py views.py
+
-## Hata ayıklama önerileri
+"Files" sekmesine giderek de PythonAnywhere in sunduğu arayüz ile dosyaları gezinebilrsiniz.
+
+## Şimdi Canlı Yayındasınız!
-Eğer sitenize girdiğinizde bir hata görürseniz, hata ayıklama bilgileri için ilk bakacağınız yer, **error log**'unuz (hata kayıtlarınız). Buraya olan linki PythonAnywhere'deki [Web sekme](https://www.pythonanywhere.com/web_app_setup/)sinde bulabilirsiniz. Burda hata mesajları olup olmadığına bakın; en yeni mesajlar en altta. Sık karşılaşılan problemler şunlar:
+Web siteniz şimdi İnternet üzerinden erişilebilir olmalı! PythonAnywhere "Web" tabına tıklayarak linki kopyalayın. Bu linki istediğiniz herkes ile paylaşabilirsiniz :)
-- Konsolda yaptığımız adımlardan birinin unutulması: virtualenv'in oluşturulması, çalışır hale getirilmesi, içine Django'nun kurulumu, veritabanının taşınması (migrate ettirilmesi).
+> **Not** Bu kılavuz başlangıçlara yönelik olduğu için basit tutmak amacıyla siteyi yayına alırken güvenlik açısından ideal olmayan bir kaç seçim yaptık. Bu projeyi ilerletmeye karar veriseniz veya yeni bir proje oluşturursanız, güvenlik tavsiyeleri için [Django deployment checklist](https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/) i inceleyin.
+
+## Hata ayıklama önerileri
-- Web sekmesinde virtualenv dizin yolunda bir hata yapılması durumunda - genellikle kırmızı hata mesajı problem olduğunda oradadır.
+`pa_autoconfigure_django.py` komut dosyasını çalıştırırken bir hata görürseniz, bunun yaygın birkaç nedeni vardır:
-- WSGI ayar dosyasında hata yapıldı - my-first-blog dosyasının yolunun doğruluğundan emin misniz?
+- PythonAnywhere API tokeni oluşturmayı unutmak.
+- GitHub URL'nizde bir hata yapmak
+- *"Could not find your settings.py"* hatası genellikle tüm gerekli dosyaların Git'e eklenmemiş ve/veya GitHub'a başarılı olarak push edilmemiş olmasından kaynaklanır. Tekrar Git bölümüne bakın
-- Virtualenv'ınız için seçtiğiniz Python versiyonu web uygulamanız için seçtiğiniz Python versiyonu ile aynı mı? İkisinin de 3.6 olması gerekiyor.
+Websitenizi ziyaret ettğiniz zaman bir hata ile karşılaşıtsanız ilk bakacağınız yer **error log** dosyasıdır. PythonAnywhere [Web tab](https://www.pythonanywhere.com/web_app_setup/) sekmesinde link bulabilirsiniz. Hata mesajlarını buradan kontrol edebilrisiniz; en yakın zamandaki hatalar en sonda yer alır.
-PythonAnywhere wiki üzerinde bazı general hata giderme tüyoları mevcuttur.
+[PythonAnywhere wiki üzerinde bazı genel hata giderme tüyoları](http://help.pythonanywhere.com/pages/DebuggingImportError) mevcuttur.
Ve eğitmeniniz size yardıma hazır, unutmayın!
-# Siteniz canlıda!
+# Sitenize göz atın!
Siteniz için bulunan varsayılan sayfa ''İşe yaradı!'' demelidir. Tıpkı yerel bilgisayarınızda olduğu gibi. URL'nin sonuna `/admin/` yazın, 'giriş' tuşuna bastığınızda admin sitesi açılacak. Kullanıcı adı ve şifrenizle giriş yapın, sunucuda yeni blog yazıları girebildiğinizi göreceksiniz.
-Birkaç gönderi oluşturduktan sonra, lokalinize (PythonAnywhere'e değil) geri dönebilirsiniz. Değişiklikleri burda lokalinizde yapacaksınız. Bu web geliştirmekte yaygın bir akışıdır - değişiklikleri yerel olarak yapınız, bu değişiklikleri GitHub'a gönderin, değişikliklerinizi canlı Web sunucusuna çekin. Bu canlı web sitenizi bozmadan çalışmanızı ve yeni şeyler denemenizi sağlar. Bayağı havalı, di mi?
+Birkaç gönderi oluşturduktan sonra, lokalinize (PythonAnywhere'e değil) geri dönebilirsiniz. Değişiklikleri lokalinizde yapacaksınız. Bu web geliştirmekte yaygın bir akışıdır - değişiklikleri yerel olarak yapınız, bu değişiklikleri GitHub'a gönderin, değişikliklerinizi canlı Web sunucusuna çekin. Bu canlı web sitenizi bozmadan çalışmanızı ve yeni şeyler denemenizi sağlar. Bayağı havalı, di mi?
Kendinize *KOCAMAN* bir aferin diyin! Yayına alma web geliştirme işinin en uğraştırmalı kısımlarından biridir ve genelde çalışana kadar insanların birkaç gününü alır. Ama işte siteniz canlıda, gerçek internette!
\ No newline at end of file
diff --git a/tr/deploy/install_git.md b/tr/deploy/install_git.md
index 1bf7a6c2056..45f53dae020 100644
--- a/tr/deploy/install_git.md
+++ b/tr/deploy/install_git.md
@@ -5,9 +5,9 @@ Git, birçok programcı tarafından kullanılan bir "sürüm kontrol sistemi"dir
-Git'i [git-scm.com](https://git-scm.com/) adresinden indirebilirsiniz. 5. adıma kadar "next"e basarak geçebilirsiniz. 5. adımda "Adjusting your PATH environment" dediği yerde, "Run Git and associated Unix tools from the Windows command-line" (en alttaki opsiyonu) seçin. Onun dışında, varsayılanlar iyi. Kodu çekerken Windows-stili, kodu gönderirken Unix-stili satır sonları iyidir.
+Git'i [git-scm.com](https://git-scm.com/) adresinden indirebilirsiniz. Bir adım hariç bütün adımları "next"e basarak geçebilirsiniz. Bu adımda "Adjusting your PATH environment" dediği yerde, "Run Git and associated Unix tools from the Windows command-line" (en alttaki opsiyonu) seçin. Onun dışında varsayılanları seçebilirsiniz. Satır sonları için kodu çekerken Windows-stilini, kodu gönderirken Unix-stilini kullanın.
-Kurulum başarı ile tamamlandıktan sonra komut ıstemini veya powershelli yeniden başlatmayı unutmayın.
+Kurulum başarı ile tamamlandıktan sonra komut istemini veya powershelli yeniden başlatmayı unutmayın.
diff --git a/tr/deploy/signup_pythonanywhere.md b/tr/deploy/signup_pythonanywhere.md
index 2f88ae2c9b9..33bbe4a4a88 100644
--- a/tr/deploy/signup_pythonanywhere.md
+++ b/tr/deploy/signup_pythonanywhere.md
@@ -1,5 +1,11 @@
-Sırada, PythonAnywhere'de ücretsiz "Yeni" bir hesaba kaydolma işi var.
+PythonAnywhere ile ücretsiz bir "Beginner" hesabı için kaydolun:
* [www.pythonanywhere.com](https://www.pythonanywhere.com/)
-> **Not** Burada kullanıcı adınızı seçerken, blogunuzun URL'sinin `yourusername.pythonanywhere.com`, şeklini alacağını unutmayın, bu nedenle blogunuzun neyle ilgili olduğu için kendi takma adınızı veya bir adınızı seçin.
\ No newline at end of file
+> **Not** Burada kullanıcı adınızı seçerken, blogunuzun URL'sinin `yourusername.pythonanywhere.com`, şeklini alacağını unutmayın, bu nedenle blogunuzun neyle ilgili olduğu için kendi takma adınızı veya bir adınızı seçin.
+
+## PythonAnywhere API belirteci oluşturma
+
+Bu sadece bir kez yapmanız gereken bir şey. PythonAnywhere'e kaydolduğunuzda, ana ekranınıza götürüleceksiniz. "Hesaplar" sayfanızın sağ üstüne yakın link'i bulun ve "API belirteci" isimli sekmeyi seçerek "Yeni API belirteci oluştur" butonuna basın.
+
+![Hesaplar sayfasında API token sekmesi](images/pythonanywhere_create_api_token.png)
\ No newline at end of file
diff --git a/tr/django/README.md b/tr/django/README.md
index 64a35089e24..6cf792b2a45 100644
--- a/tr/django/README.md
+++ b/tr/django/README.md
@@ -16,12 +16,12 @@ Bir posta kutusunun (port) gelen mektuplar (requests) için izlendiğini düşü
## Birisi sunucunuzdan bir web sitesi istediğinde ne olur?
-Bir istek bir web sunucusuna geldiğinde, Django'ya aktarılır aslında ve Django da istenin ne olduğunu anlamaya çalışır. O da önce bir web sayfası adresi alır ve ne yapacağını anlamaya çalışır. Bu bölüm Django'nun **urlresolver** tarafından yapılır (unutmayın bir web sitesi adresi URL – Uniform Resource Locator – olarak adlandırılır – böylece *urlresolver* anlamlı hale gelir). Çok akıllı değildir - kalıpların bir listesini alır ve URL'yi eşleştirmeye çalışır. Django kalıpları üstten alta doğru denetler ve eşleşen bir şey varsa isteği ilgili işleve( *view* olarak adlandırlan) aktarır.
+Bir istek bir web sunucusuna geldiğinde, Django'ya aktarılır aslında ve Django da istenin ne olduğunu anlamaya çalışır. O da önce bir web sayfası adresi alır ve ne yapacağını anlamaya çalışır. Bu kısım Django'nun **url çözücüsü** (urlresolver) tarafından yapılıyor (websitesi adresine URL - Uniform Resource Locator - deniyor, dolayısıyla *url çözücü* ismi mantıklı oluyor). Çok akıllı değildir - kalıpların bir listesini alır ve URL'yi eşleştirmeye çalışır. Django kalıpları üstten alta doğru denetler ve eşleşen bir şey varsa isteği ilgili işleve (*view* olarak adlandırılan) aktarır.
Mektup dağıtan bir postacı düşünün. Sokak boyunca yürüyor ve her evin numarasını mektubun üstündeki numara ile karşılaştırıyor. Eğer eşleşirse, mektubu oraya koyuyor. Url çözücü işte böyle çalışır!
-Tüm ilginç şeyler *view (görünüm)* fonksiyonunda yapılır: bir bilgi için veritabanına bakabiliriz. Belki de kullanıcı veride bir şeyin değişmesini istemiştir? "Lütfen iş tanımımı değiştirin." diyen bir mektup gibi. *View* bunu yapmaya izninizin olup olmadığını kontrol eder, iş tanımınızı sizin için günceller ve geri "Tamamdır!" mesajı yollar. Sonra *view*bir yanıt üretir ve Django bunu kullanıcının web tarayıcısına gönderebilir.
+Tüm ilginç şeyler *view (görünüm)* fonksiyonunda yapılır: bir bilgi için veritabanına bakabiliriz. Belki de kullanıcı veride bir şeyin değişmesini istemiştir? "Lütfen iş tanımımı değiştirin." diyen bir mektup gibi. *View* bunu yapmaya izninizin olup olmadığını kontrol eder, iş tanımınızı sizin için günceller ve geri "Tamamdır!" mesajı yollar. Sonra *view* bir yanıt üretir ve Django bunu kullanıcının web tarayıcısına gönderebilir.
-Tabi ki yukardaki biraz basitleştirilmiş bir açıklama, ama şimdilik bütün teknik ayrıntıyı bilmene gerek yok. Genel bir fikrin olması yeterli.
+Tabi ki yukarıdaki biraz basitleştirilmiş bir açıklama, ama şimdilik bütün teknik ayrıntıyı bilmene gerek yok. Genel bir fikrin olması yeterli.
-Doğrudan çok fazla detaya girmek yerine, Django ile birşeyler oluşturacağız ve önemli kısımları yolda öğreneceğiz!
\ No newline at end of file
+Doğrudan çok fazla detaya girmek yerine, Django ile bir şeyler oluşturacağız ve önemli kısımları yolda öğreneceğiz!
\ No newline at end of file
diff --git a/tr/django_admin/README.md b/tr/django_admin/README.md
index 7ee8f953ab8..c6a7a361bec 100644
--- a/tr/django_admin/README.md
+++ b/tr/django_admin/README.md
@@ -1,8 +1,8 @@
# Django admin
-Az önce modellediğimiz gönderilere ekleleme, düzenleme yada silme işlemi yapmak için Django admini kullanacağız.
+Az önce modellediğimiz gönderilere ekleme, düzenleme ya da silme işlemi yapmak için Django admini kullanacağız.
-Şimdi `blog/admin.py` dosyasını açarak İçeriği bununla değiştirelim:
+Şimdi `blog/admin.py` dosyasını açarak içeriği bununla değiştirelim:
{% filename %}blog/admin.py{% endfilename %}
@@ -13,15 +13,15 @@ from .models import Post
admin.site.register(Post)
```
-Gördüğünüz gibi, bir önceki bölümde tanımladığımız gönderi modelini admin. py dosyamıza dahil (import) ettik. Admin sayfasında modelimizi görünür kılabilmek için, Modeli `admin.site.register(Post)` ile kaydetmemiz gerekiyor.
+Gördüğünüz gibi, bir önceki bölümde tanımladığımız gönderi modelini admin.py dosyamıza dahil (import) ettik. Admin sayfasında modelimizi görünür kılabilmek için, modeli `admin.site.register(Post)` ile kaydetmemiz gerekiyor.
-Tamam, artık admin sayfasında gönderi modelimize göz atabiliriz. Web sunucusunu çalıştırmak için komut satırında `python manage.py runserver` komutunu çalıştırmayı unutmayın. Tarayacınıza gidin ve adresi yazın http://127.0.0.1:8000/admin/. Bunun gibi bir giriş ekranı göreceksiniz:
+Tamam, artık admin sayfasında gönderi modelimize göz atabiliriz. Web sunucusunu çalıştırmak için komut satırında `python manage.py runserver` komutunu çalıştırmayı unutmayın. Tarayıcınıza gidin ve adresi yazın http://127.0.0.1:8000/admin/. Bunun gibi bir giriş ekranı göreceksiniz:
![Giriş sayfası](images/login_page2.png)
-Giriş yapabilmek için, sitedeki her şey üzerinde kontrolü olan *superuser* - bir kullanıcı hesabı oluşturmanız gerekiyor. Komut satırana geri giderek `python manage.py createsuperuser` yazın ve enter'a basın.
+Giriş yapabilmek için, sitedeki her şey üzerinde kontrolü olan *superuser* - bir kullanıcı hesabı oluşturmanız gerekiyor. Komut satırına geri giderek `python manage.py createsuperuser` yazın ve enter'a basın.
-> Unutmayın, ağ sunucusu açıkken yeni komut yazmak için, yeni bir terminal penceresi açın ve virtualenv'nizi aktif edin. **Web sunucusu başlatma** bölümünde, **Sizin ilk Django projeniz!** kısmında yeni komutların nasıl yazılacağını gözden geçirdik.
+> Ağ sunucusu açıkken yeni komut yazmak için, yeni bir terminal penceresi açıp sanal ortamınızı (virtualenv) aktive etmeniz gerekmektedir. **Web sunucusu başlatma** bölümünün, **Sizin ilk Django projeniz!** kısmında yeni komutların nasıl yazılacağını gözden geçirdik.
{% filename %}Mac OS X veya Linux:{% endfilename %}
@@ -33,25 +33,25 @@ Giriş yapabilmek için, sitedeki her şey üzerinde kontrolü olan *superuser*
(myvenv) C:\Users\Name\djangogirls> python manage.py createsuperuser
-İstendiğinde, kullanıcı adınızı (küçük harf, boşluksuz), e-posta adresinizi ve şifrenizi yazın. **Yazdığınız şifreyi göremezseniz endişelenmeyin - olması gerekenler burada var.** Devam etmek için şifreyi yazıp `enter` 'e bas. Çıktı şu şekilde olmalıdır (kullanıcı adı ve e-postanın sizin tarafınızdan olması gerekir):
+Giriş satırı geldiğinde, kullanıcı adınızı (küçük harfler ile ve boşluksuz), email adresinizi ve parolanızı girin. **Yazdığınız şifreyi göremezseniz endişelenmeyin - olması gereken budur.** Devam etmek için şifreyi yazıp `enter` 'a basın. Çıktı şunun gibi olmalıdır ( belirtilen kullanıcı adı ve eposta size ait olmalı):
- Kullanıcı adı: admin
- E-posta adresi: admin@admin.com
- Şifre:
- Şifre (tekrar):
- Süper kullanıcı başarıyla oluşturuldu.
+ Username: admin
+ Email address: admin@admin.com
+ Password:
+ Password (again):
+ Superuser created successfully.
-Tarayıcınıza dönün. Seçtiğiniz süper kullanıcının kimlik bilgileri ile oturum açın; Django admin gösterge panelini göreceksiniz.
+Tarayıcınıza dönün. Oluşturduğunuz superuser'ın bilgileri ile giriş yaptığınızda Django'nun admin panelini göreceksiniz.
![Django admin](images/django_admin3.png)
-Mesajlara gidin ve onunla biraz deneme yapın. Beş veya altı blog yazısı ekleyin. İçerik hakkında endişelenmeyin - zamandan kazanmak için bu öğreticiden bazı metinleri kopyalayıp yapıştırın. :)
+Mesajlara gidin ve biraz kurcalayın. Beş altı blog yazısı ekleyin. İçeriği kafanıza takmayın - zamandan kazanmak için basitçe bu tutorialdan birkaç yazı kopyalayıp yapıştırabilirsiniz. :)
-En az iki veya üç yazının (ama hepsinin değil) yayınlanma tarihinin ayarlanmış olduğundan emin olun. Bu size daha sonra yardımcı olacak.
+En azından iki ya da üç yazıya (ama hepsinin değil) yayınlama tarihi girdiğinizden emin olun. Bunu ileriki adımlarda kullanacağız.
![Django admin](images/edit_post3.png)
-Django admin hakkında daha fazla bilgi edinmek isterseniz, Django'nun belgelerini kontrol etmelisiniz: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/
+Eğer Django admin ile ilgili daha fazla şey öğrenmek istiyorsanız Django'nun belgelerine göz atabilirsiniz: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/
-Bu, muhtemelen kendinize yeniden enerji vermek için bir kahve (veya çay) veya başka şeyler yemek için iyi bir an. İlk Django modelinizi yarattınız - küçük bir molayı hak ettiniz!
\ No newline at end of file
+Şu an muhtemelen enerjinizi geri toplamak için bir şeyler yemek veya kahve( ya da çay) içmek için iyi bir zaman. İlk Django modelinizi yarattınız. Küçük bir molayı hak ettiniz!
\ No newline at end of file
diff --git a/tr/django_forms/README.md b/tr/django_forms/README.md
index 4557a154b84..0c3b998fa03 100644
--- a/tr/django_forms/README.md
+++ b/tr/django_forms/README.md
@@ -1,6 +1,6 @@
# Django Forms
-Blogumuzda yapmak istediğimiz son şey blog yazılarını eklemek ve düzenlemek için güzel bir yapı oluşturmak. Django'nun `admin` arayüzü çok havalı, ama özelleştirilmesi ve güzel hale getirilmesi oldukça zor. `forms` ile mutlak güce sahip olacağız – biz hayal edebileceğiniz hemen hemen her şeyi yapabilirsiniz!
+Blogumuzda yapmak istediğimiz son şey blog yazılarını eklemek ve düzenlemek için güzel bir yapı oluşturmak. Django'nun `admin` arayüzü çok havalı, ama özelleştirilmesi ve güzel hale getirilmesi oldukça zor. `forms` (formlar) ile kendi arayüzümüz üstünde mutlak bir güce sahip olacağız - neredeyse hayal ettiğimiz her şeyi yapabiliriz!
Django formlarının güzel yanı, hem sıfırdan bir form tanımlayabilmemiz hem de sonuçları modele kaydedecek bir `ModelForm` oluşturabilmemizdir.
@@ -14,7 +14,7 @@ Django'nun diğer önemli parçaları gibi, formların da kendi dosyası var: `f
└── forms.py
-Tamam, şimdi dosyayı açalım ve altta ki kodu yazalım:
+Tamam, hadi dosyayı açalım ve aşağıdaki kodu yazalım:
{% filename %}blog/forms.py{% endfilename %}
@@ -32,11 +32,11 @@ class PostForm(forms.ModelForm):
Önce Django formları (`from django import forms`) ve tabii ki `Post` modelimizi içe aktarmalıyız (`from .models import Post`).
-`PostForm`, tahmin etmiş olabileceğiniz gibi, formumuzun ismi. Django'ya bu formun `ModelForm` olduğunu söylemeliyiz ( dolayısı ile Django bizim için biraz büyü yapacak) - `forms.ModelForm` bunun için sorumludur.
+`PostForm`, tahmin etmiş olabileceğiniz gibi, formumuzun ismi. Django'ya bu formun bir `ModelForm` olduğunu belirtmeliyiz. Bunu `forms.ModelForm` sayesinde Django bizim için yapacaktır.
Sırada Django'ya bu formu (`model = Post`) oluşturmak için hangi modelin kullanılması gerektiğini anlattığımız `class Meta` var).
-Son olarak, formumuzda hangi alan(lar)ın bulunması gerektiğini söyleyebiliriz. Bu senaryoda sadece `başlık` ve `metin` ortaya çıkmasını istiyoruz – `yazar` şu anda giriş yapmış kişi olmalıdır (siz!) ve `oluşturulma_tarihi` bir gönderi oluşturduğumuzda otomatik olarak ayarlanmalıdır (örneğin kod), değil mi?
+Son olarak, formumuzda hangi alan(lar)ın bulunması gerektiğini söyleyebiliriz. Bu senaryoda sadece `title` ve `text` alanlarının gösterilmesini istiyoruz - `author` şu anda giriş yapmış olması gereken kişidir (yani siz!) ve biz ne zaman yeni bir yazı oluşturursak `created_date` otomatik olarak (örn. kod içinde) ayarlanmalıdır, değil mi?
Ve hepsi bu kadar! Şimdi tek yapmamız gereken formu bir *view* içinde kullanıp, template (şablon) içinde göstermek.
@@ -59,8 +59,8 @@ Satırı ekledikten sonra, HTML dosyanız bu şekilde görünmelidir:
{% filename %}blog/templates/blog/base.html{% endfilename %}
```html
-{% load static %}
-
+{% load staticfiles %}
+< html>
Django Girls blog
@@ -422,7 +422,7 @@ Yüksek olasılıkla login yapmış olduğunuz için sayfayı yenilediğinizde f
Bakalım PythonAnywhere'de calışacak mı? Tekrar yayına alalım!
-* İlk önce kodumuzu commit edelim, sonra GitHub'a push edelim:
+* İlk önce kodumuzu commit edelim, sonra Github'a push edelim:
{% filename %}komut-satırı{% endfilename %}
@@ -437,11 +437,13 @@ Bakalım PythonAnywhere'de calışacak mı? Tekrar yayına alalım!
{% filename %}komut-satırı{% endfilename %}
- $ cd ilk-blogum
+ $ cd ~/.pythonanywhere.com
$ git pull
[...]
+(Açı parantezleri olmadan ``'i gerçek PythonAnywhere kullanıcı isminizle değiştirmeyi unutmayın).
+
* Nihayet, [Web tab](https://www.pythonanywhere.com/web_app_setup/) ına gidip **Reload** edelim.
-O kadar! Tebrikler :)
\ No newline at end of file
+İşte bu kadar! Tebrikler :)
\ No newline at end of file
diff --git a/tr/django_installation/instructions.md b/tr/django_installation/instructions.md
index e39eeec8ba7..f21e824a068 100644
--- a/tr/django_installation/instructions.md
+++ b/tr/django_installation/instructions.md
@@ -10,7 +10,7 @@ Django'yu yüklemeden önce kod ortamınızı düzenli tutmak için son derece y
Yapmanız gereken tek şey `virtualenv` oluşturmak için bir dizin bulmak; örneğin giriş dizininiz. Windows'ta şöyle görünebilir: `C:\Users\Name` (`Name` yerine kullanıcı adınız gelir).
-> **NOTE:** Windows'ta bu dizinin özel karakterler içermediğinden emin olun; eğer kullanıcı adınız özel karakterler içeriyorsa, farklo bir dizin kullanın. Örneğin: `C:\djangogirls`.
+> **NOTE:** Windows'ta bu dizinin özel karakterler içermediğinden emin olun; eğer kullanıcı adınız özel karakterler içeriyorsa, farklı bir dizin kullanın. Örneğin: `C:\djangogirls`.
Bu eğitim için giriş dizininizde yeni açtığımız `djangogirls` adlı bir klasör kullanacağız:
@@ -30,14 +30,14 @@ Bu eğitim için giriş dizininizde yeni açtığımız `djangogirls` adlı bir
-Yeni bir `virtualenv` yaratmak için,prompt komutunu açmanız ve `python -m venv myvenv`'u çalıştırmanız gerekir.Böyle görünecektir;
+Yeni bir `virtualenv` yaratmak için, komut istemini açmanız ve `python -m venv myvenv`'u çalıştırmanız gerekir. Böyle görünecektir:
{% filename %}komut-satırı{% endfilename %}
C:\Users\Name\djangogirls> python -m venv myvenv
-Burada `myvenv`, `virtualenv`'inizin ismidir. İstediğiniz herhangi bir ismi kullanabilirsiniz, ama küçük harfle yazılmasına ve boşluk, aksan karakterleri (örn: å) ve özel karakterleri kullanmamaya dikkat edin. Ayrıca ismi kısa tutmak işinize yarayacaktır zira bu ismi çokca kullanıyor olacaksınız!
+Burada `myvenv`, `virtualenv`'inizin ismidir. İstediğiniz herhangi bir ismi kullanabilirsiniz, ama küçük harfle yazılmasına ve boşluk, aksan karakterleri (örn: å) ve özel karakterleri kullanmamaya dikkat edin. Ayrıca ismi kısa tutmak işinize yarayacaktır zira bu ismi çokça kullanıyor olacaksınız!
@@ -57,17 +57,17 @@ Burada `myvenv` sizin `virtualenv`'inizin ismi. Dilerseniz istediğiniz herhangi
>
> {% filename %}komut-satırı{% endfilename %}
>
-> The virtual environment was not created successfully because ensurepip is not available. Debian/Ubuntu sistemlerinde, python3-venv paketini aşağıdaki komutu kullanarak yüklemeniz gerekiyor.
+> The virtual environment was not created successfully because ensurepip is not available. On Debian/Ubuntu systems, you need to install the python3-venv package using the following command.
> apt install python3-venv
-> You may need to use sudo with that command. After installing the python3-venv package, recreate your virtual environment.
+> You may need to use sudo with that command. python3-venv paketini indirdikten sonra, virtualenv'inizi yeniden oluşturun.
>
>
-> Bu durumda,yukarıdaki yönergeleri izleyin ve `python3-venv` paketini yükleyin:
+> Bu durumda, yukarıdaki yönergeleri izleyin ve `python3-venv` paketini yükleyin:
>
> $ sudo apt install python3-venv
>
>
-> Bu Şekilde Debian/Ubuntu ' nun bazı sürümlerinde sanal ortamı başlatırken o anda aşağıdaki hatayı alabilirsiniz :
+> Bu şekilde Debian/Ubuntu'nun bazı sürümlerinde sanal ortamı başlatırken o anda aşağıdaki hatayı alabilirsiniz:
>
> {% filename %}komut-satırı{% endfilename %}
>
@@ -112,13 +112,13 @@ data-collapse=true ces-->
C:\Users\Name\djangogirls> myvenv\Scripts\activate
-> **NOT:** Windows 10'da , Windows PowerShell tarafından `bu senaryoların uygulanması bu sistemde devre dışıdır` diyen bir hata alabilirsiniz. Bu durumda,başka bir Windows PowerShell'i,"Yönetici Olarak Çalıştır" seçeneğini kullanarak çalıştırın. Daha sonra Sanal ortamınızı başlatmadan önce sırada ki komutları yazmayı deneyin:
+> **NOT:** Windows 10'da , Windows PowerShell tarafından `bu senaryoların uygulanması bu sistemde devre dışıdır` diyen bir hata alabilirsiniz. Bu durumda,başka bir Windows PowerShell'i,"Yönetici Olarak Çalıştır" seçeneğini kullanarak çalıştırın. Daha sonra sanal ortamınızı başlatmadan önce sıradaki komutları yazmayı deneyin:
>
> {% filename %}komut-satırı{% endfilename %}
>
> C:\WINDOWS\system32> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
> Execution Policy Change
-> The execution policy helps protect you from scripts that you do not trust. Uygulama politikasını değiştirmek http://go.microsoft.com/fwlink/?LinkID=135170 adresinde yardım kısmında yer alan about_Execution_Policies'teki gibi güvenlik risklerine neden olabilir. Uygulama politikasını değiştirmek istiyor musunuz? [Y] Yes/Evet [A] Yes to All/Hepsi için evet [N] No/Hayır [L] No to All/Hepsi için hayır [S] Suspend/Askıya al [?] Help/Yardım (varsayılan cevap "N")
+> The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the about_Execution_Policies help topic at http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): A
>
@@ -152,16 +152,16 @@ Artık bütün gerekli uygulamaları bir araya getirdiğimize göre sonunda Djan
## Django'yu yüklemek
-`virtualenv`'i çalıştırdığınıza göre,şimdi Django'yu yükleyebilirsiniz.
+`virtualenv`'i çalıştırdığınıza göre, şimdi Django'yu yükleyebilirsiniz.
-Bunu yapmadan önce,bilgisayarımızın,Django yüklemek için kullanacağımız yazılım olan `pip`'in en son versiyonuna sahip olduğundan emin olmalıyız
+Bunu yapmadan önce, bilgisayarımızın, Django yüklemek için kullanacağımız yazılım olan `pip`'in en son versiyonuna sahip olduğundan emin olmalıyız:
{% filename %}komut-satırı{% endfilename %}
(myvenv) ~$ python3 -m pip install --upgrade pip
-Sonra `pip install django~=1.11.0` (eşittir işaretinden önce tilde işareti kullandığımızı not edin: `~=`) çalıştırarak Django 'yu yükleyin.
+Sonra `pip install django~=1.11.0` (eşittir işaretinden önce tilde işareti kullandığımızı not edin: `~=`) çalıştırarak Django'yu yükleyin.
{% filename %}komut-satırı{% endfilename %}
diff --git a/tr/django_models/README.md b/tr/django_models/README.md
index 21188386c7a..fabfa9607d0 100644
--- a/tr/django_models/README.md
+++ b/tr/django_models/README.md
@@ -114,7 +114,7 @@ INSTALLED_APPS = [
`blog/models.py` dosyasında `Models` denilen bütün nesneleri tanımlıyoruz - bu blog postumuzu tanımlayacağımız bir yerdir.
-`blog/models.py`‘ı açalım, burdaki herşeyi sil, ve kodu bunun gibi yaz:
+Şimdi `blog/models.py` dosyasını açalım ve içindeki her şeyi silip şu kodu yazalım:
{% filename %}blog/models.py{% endfilename %}
@@ -144,7 +144,7 @@ class Post(models.Model):
Korkutucu, değil mi? Fakat endişelenmeyin - Bu satırların ne anlama geldiğini açıklayacağız!
-Bütün satırlar `from`‘la başlar veya `imprt` diğer dosyalardan bazı bitlerin eklendiği satırlardır. Yani her dosyada aynı şeyleri kopyalayıp yapıştırmak yerine, `‘la bazı bölümleri de ekleyebiliriz... import ...`
+`from` veya `import` ile başlayan tüm satırlar başka yerlerden bir şeyleri projemize dahil eder. Yani her dosyada aynı şeyleri kopyalayıp yapıştırmak yerine, `‘la bazı bölümleri de ekleyebiliriz... import ...`
`class Post(models.Model):` - bu satır modelimizi tanımlar (bu bir `nesne`‘dir).
@@ -159,19 +159,19 @@ Bütün satırlar `from`‘la başlar veya `imprt` diğer dosyalardan bazı bitl
- `models.DateTimeField` - bu da gün ve saati tanımlamada kullanılır.
- `models.ForeignKey` - başka bir modele referans tanımlar.
-Çok zaman aldığından burada her bit kodunu açıklamayacağız. Model dosyalarından daha çok bilgi almak ve yukarıdaki açıklamalardan farklı tanımlamaları öğrenmek istiyorsanız Django'nun belgelerine daha çok bakmalısınız (https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types).
+Burada her detayı anlatmıyoruz, çünkü çok fazla vakit alır. Eğer detayları merak ederseniz veya farklı tür alanlar tanımlamak isterseniz Django'nun dokümantasyonlarına bakabilirsiniz (https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types).
-Peki ya `def publish(self):` nedir? Bu, daha önce bahsettiğimiz tam olarak `publish` yöntemidir. `def` bunun bir fonksiyon/metod olduğunu söyler. `publish` ise metodun adıdır. Eğer isterseniz metodun adını değiştirebilirsiniz. Adlandırma kuralı boşluk yerine küçük harf ve alt çizgi kullanmamızdır. Örneğin ortalama fiyatı hesaplayan bir yöntem çağrılabilir `calculate_average_price`.
+Peki ya `def publish(self):` nedir? Bu, daha önce bahsettiğimiz tam olarak `publish` yöntemidir. `def` bunun bir fonksiyon/metod olduğunu söyler. `publish` ise metodun adıdır. Eğer isterseniz metodun adını değiştirebilirsiniz. Adlandırma kuralı boşluk yerine küçük harf ve alt çizgi kullanmamızdır. Örneğin ortalama fiyatı hesaplayan bir methoda `ortalama_fiyati_hesapla` ismi verilebilir.
-Yöntemler çoğu kez bir şeylere `return`. `__str__` yönteminde bunun bir örneği vardır. Bu durumda `__str__()`'yi çağırdığımız zaman gönderi başlığı olan bir metin (**string**) elde ederiz.
+Genellikle methodlar bir şeyler döndürür (`return` anahtar kelimesi döndür anlamına gelir). `__str__` methodunda bunun örneğini görebiliriz. Bu durumda `__str__()` methodunu çağırdığımızda Post başlığının içeren bir metin (**string**) elde ederiz.
-Aynı zamanda hem `def publish(self):` satırının, hem de `def __str__(self):` satırının sınıfımızın içinde girintili bir şekilde yazıldığına dikkat edin. Çünkü Python boşlukta duyarlıdır, yöntemlerimizi sınıfın içine sokmalıyız. Aksi takdirde, yöntemler sınıfın üyesi olmaz, ve bazı beklenmedik davranışlar elde edebilirsiniz.
+Aynı zamanda hem `def publish(self):` satırının, hem de `def __str__(self):` satırının sınıfımızın içinde girintili bir şekilde yazıldığına dikkat edin. Python boşluklara duyarlı olduğu için class'ın içindeki metodları girintili olarak yazmamız gerekiyor. Aksi takdirde metodlar class'a ait olmaz ve beklenmedik davranışlarla karşılaşabilirsiniz.
-Hala modeller hakkında bir şeyler belli değil ise, koçuna sormaktan çekinme! Özellikle hem nesneleri hem de fonksiyonları aynı anda öğrenmenin karmaşık olduğunu biliyoruz. Ama şimdi umarız ki senin için biraz daha az sihirli görünüyor!
+Buraya kadar model hakkında anlamadığın bir şeyler varsa mentörüne sormaktan çekinme! Bu konuların biraz karmaşık olduğunun farkındayız. Özellikle hem nesneleri hem de fonksiyonları aynı anda öğrenmek kolay değil. Umarız gizemi biraz azalmaya başlamıştır!
### Modeller için veritabanında tablo oluşturma
-Buradaki son adım, yeni modelimizi veritabanımıza eklemek. İlk olarak, modelimizdeki bazı değişikliklerden Django’yu haberdar etmeliyiz. (Daha yeni oluşturduk!) konsol pencerenize gidin ve `python manage.py makemigrations blog` yazın. Bunun gibi görünecek:
+Son adımımız yeni modelimizin veritabanına eklenmesini sağlamak. Öncelikle Django'nun modelimizde bazı değişiklikler yaptığımızı bilmesini sağlamalıyız. (Daha yeni oluşturduk!) Konsol penceresine gidin ve `python manage.py makemigrations blog` yazın. Şöyle görünmeli:
{% filename %}komut-satır{% endfilename %}
@@ -182,9 +182,9 @@ Buradaki son adım, yeni modelimizi veritabanımıza eklemek. İlk olarak, model
- Create model Post
-**Not:** Düzenlediğiniz dosyaları kaydetmeyi unutmayın. Aksi takdirde, bilgisayarınız beklenmedik hata mesajlarını verebilecek önceki sürümü çalıştıracaktır.
+**Not:** Düzenlediğiniz dosyaları kaydetmeyi unutmayın. Aksi takdirde, bilgisayarınız önceki sürümü çalıştırarak beklenmedik hatalar verebilir.
-Django bize veritabanımıza uygulayabileceğimiz bir taşıma dosyası oluşturdu. `python manage.py migrate blog` yaz ve çıktı aşağıdaki gibi olmalıdır:
+Django bize veritabanımıza uygulayabileceğimiz bir taşıma (migrasyon) dosyası oluşturdu. `python manage.py migrate blog` yazdığın zaman şunu görmelisin:
{% filename %}komut-satır{% endfilename %}
@@ -196,4 +196,4 @@ Django bize veritabanımıza uygulayabileceğimiz bir taşıma dosyası oluştur
Applying blog.0001_initial... OK
-Yaşasın! Model yazımız şimdi veritabanımızda! Onu görmek güzel olur, değil mi? Yazınızın neye benzediğini görmek için bir sonraki bölüme geçin!
+Yaşasın! Post modelimiz artık veritabanımızda! Görsek ne güzel olur, değil mi? Gelecek bölümde Post'un nasıl göründügünü göreceğiz!
\ No newline at end of file
diff --git a/tr/django_orm/README.md b/tr/django_orm/README.md
index 1635750509c..226c1cc19f6 100644
--- a/tr/django_orm/README.md
+++ b/tr/django_orm/README.md
@@ -4,7 +4,7 @@ Bu bölümde Django'nun veritabanına nasıl bağlandığını ve veriyi nasıl
## QuerySet (SorguSeti) Nedir?
-QuerySet(SorguSeti), temel olarak, verilmiş olan bir Modelin nesnelerinin bir listesini oluşturmaktadır. QuerySet(SorguSeti) veritabanından verileri okumanızı, bu verileri filtrelemenizi ve düzenlemenizi sağlar.
+QuerySet (SorguSeti), esas olarak, verilen bir modelin nesnelerinin listesidir. QuerySet veritabanından veri okumamıza, veriyi filtrelememize ve sıralamamıza imkan sağlar.
En kolayı örnekle öğrenmektir. Hadi deneyelim, olur mu?
@@ -26,7 +26,7 @@ Etkisi aşağıdaki gibi olmalı:
>>>
```
-Şu anda Django interaktif konsoldasınız. Python komut istemi gibi fakat biraz Django büyüsü katılmış hali. :) Tabii ki, bütün python komutlarını buradada kullanabilirsiniz.
+Şu an Django'nun etkileşimli konsolundayız. Python istemine benziyor, ama biraz Django büyüsü eklenmiş :) Kuşkusuz burada da Python komutlarının tümünü kullanabiliriz.
### Tüm nesneler
@@ -55,7 +55,7 @@ Ahh! Bir hata meydana geldi. Bize hiç gönderi olmadığını söylüyor. Bu do
```python
>>> Post.objects.all()
-, ]>
+, ]>
```
Bu daha önce oluşturduğumuz gönderilerin listesi! Bu gönderileri Django admin arayüzü ile oluşturduk. Fakat şimdi python'u kullanarak yeni gönderiler oluşturmak istiyoruz, peki bunu nasıl yaparız?
@@ -67,12 +67,12 @@ Veritabanına yeni bir gönderi eklemek için:
{% filename %}komut-satırı{% endfilename %}
```python
->>> Post.objects.create(yazar=ben, baslik='Harika bir gönderi', yazi='Ne desem bilemedim')
+>>> Post.objects.create(author=ben, title='Harika bir gönderi', text='Ne desem bilemedim')
```
-Fakat burada bir eksik maddemiz var: `ben`. Bir yazar olarak `Kullanıcı` modelinin bir örneğini göstermemiz gerekiyor. Bunu nasıl yaparız?
+Ancak bir eksiğimiz var: `ben`. Gönderinin yazar (author) özelliğine `User` (kullanıcı) modelinden türetilen bir nesneyi parametre olarak vermemiz gerekiyor. Nasıl verebiliriz?
-Öncelikle kullanıcı modelini dahil edelim:
+Öncelikle User (kullanıcı) modelini dahil edelim:
{% filename %}komut-satırı{% endfilename %}
@@ -85,26 +85,27 @@ Veritabanımızda hangi kullanıcılar var? Şu şekilde görebiliriz:
{% filename %}komut-satırı{% endfilename %}
```python
->>>User.objects.all()
-]>
+>>> User.objects.all()
+]>
```
-Bu daha önce oluşturduğumuz yetkili kullanıcı! Şimdi kullanıcının örneğini alalım:
+Daha önce yarattığımız ayrıcalıklı kullanıcı! Şimdi veritabanından User (kullanıcı) nesnesi alalım:
{% filename %}komut-satırı{% endfilename %}
```python
->>> ben = User.objects.get(kullanıcı adı='ola')
+ben = User.objects.get(username='zeynep')
```
-Gördüğünüz gibi, 'ola' `kullanıcı adı`'yla aynı olan bir `kullanıcı` `aldık`. Muntazam! Tabiki, kendi kullanıcı adınızı kullanmak için bu satırı ayarlarınızı yapmanız gerekmektedir.
+Gördüğünüz gibi, `username` (kullanıcı adı) özelliği 'zeynep' olan `User` nesnesini `get` ile aldık. Müthiş! Tabiki, kullanıcı adını kendi kullanıcı adınıza göre ayarlamalısınız.
Gönderimizi artık kaydedebiliriz:
{% filename %}komut-satırı{% endfilename %}
```python
->>> Post.objects.create(yazar=ben, baslik='Harika bir gönderi', yazi='Ne desem bilemedim')
+>>> Post.objects.create(author=ben, title='Harika bir gönderi', text='Ne desem bilemedim')
+
```
Yaşasın! Çalışıp çalışmadığını kontrol etmek ister misin?
@@ -113,45 +114,45 @@ Yaşasın! Çalışıp çalışmadığını kontrol etmek ister misin?
```python
>>> Post.objects.all()
-, , ]>
+, ,]>
```
İşte bu kadar, listede bir gönderi daha!
### Daha fazla gönderi ekle
-Şimdi daha fazla gönderi ekleyerek biraz eğlenebilir ve nasıl çalıştığını görebilirsin. İki veya üç tane daha ekle ve sıradaki bölüme geç.
+Şimdi biraz eğlenenebiliriz ve nasıl çalıştığını görmek için daha fazla gönderi ekleyebiliriz. 2-3 tane daha ekleyin ve bir sonraki kısma devam edin.
### Nesneleri filtrelemek
-QuerySet'lerin büyük bir bölümü onları filtreleme yeteneğidir. Diyelim ki ola yazarına ait tüm gönderileri bulmak istiyoruz. `Post.objects.all()` içindeki `all` yerine `filter` kullanacağız. Parantez içine istediğimiz blog gönderilerinin sorgusetimize girmesi için sağlaması gereken şart(lar) ı belirteceğiz. Bizim örneğimizde, `yazar`'ın `bana` eşit olma koşulu vardır. Django'da bu şu şekilde yazılır: `yazar=ben`. Şu an kod parçacığımız şöyle görünüyor:
+QuerySet'lerin büyük bir bölümü onları filtreleme yeteneğidir. Diyelim ki, Zeynep tarafından yazılmış tüm gönderileri bulmak istiyoruz. `Post.objects.all()` içindeki `all` yerine `filter` kullanacağız. Parantez içine istediğimiz blog gönderilerinin sağlaması gereken şartları belirteceğiz. Örneğimizde, `author(yazar)` `ben`'e eşitti. Django'da bu filtre şöyle yazılır: `author=ben`. Şu an kod parçacığımız şöyle görünüyor:
{% filename %}komut-satırı{% endfilename %}
```python
->>> Post.objects.filter(yazar=ben)
+>>> Post.objects.filter(author=ben)
[, , , ]
```
-Yada belkide içinde 'Başlık' kelimesi olan bütün gönderileri `başlık`alanında görmek istiyoruzdur?
+Ya da belki `title(başlık)` alanında içinde 'Nefis' kelimesini içeren tüm gönderileri görmek istiyoruz?
{% filename %}komut-satırı{% endfilename %}
```python
->>> Post.objects.filter(baslik__contains='Nefis')
+>>> Post.objects.filter(title__contains='Nefis')
[]
```
-> **Not** `baslik` ve `contains` arasında iki tane alt çizgi (`_`) var. Django'nun ORM'i bu söz dizimini, özelliği ("title") ve operasyon veya filtreyi ("contains") ayırmak için kullanır. Eğer sadece tek bir alt çizgi kullanırsanız, "FieldError: Cannot resolve keyword title_contains" şeklinde bir hata alacaksınız.
+> **Not** `title` (başlık) ve `contains` arasında iki tane alt çizgi (`_`) var. Django'nun ORM'i bu söz dizimini, özelliği ("title") ve operasyon veya filtreyi ("contains") ayırmak için kullanır. Eğer sadece tek bir alt çizgi kullanırsanız, "FieldError: Cannot resolve keyword title_contains" şeklinde bir hata alacaksınız.
-Ayrıca yayınlananmış olan tüm gönderilerin bir listesini de alabilirsiniz. Bunu, yayınlanmış olan postlar içerisinde `yayınlanma_tarihi` şeklinde filtreleyerek yapıyoruz:
+Ayrıca yayınlanmış tüm gönderilerin bir listesini alabiliriz. Bunu geçmişte `published_date (yayinlanma_tarihi)` alanı belirtilmiş tüm gönderileri filtreleyerek yapıyoruz:
{% filename %}komut-satırı{% endfilename %}
```python
->>> django.utils'ten zaman dilimlerini içe aktar
+>>> from django.utils import timezone
>>> Post.objects.filter(published_date__lte=timezone.now())
-[]
+
```
Maalesef python konsolundan eklediğimiz gönderi henüz yayınlanmadı. Fakat bunu değiştirebiliriz! Önce yayınlamak istediğimiz bir gönderinin örneğini bulalım:
@@ -159,18 +160,18 @@ Maalesef python konsolundan eklediğimiz gönderi henüz yayınlanmadı. Fakat b
{% filename %}komut-satırı{% endfilename %}
```python
->>> post = Post.objects.get(baslik="Harika bir gönderi")
+>>> post = Post.objects.get(title="Harika bir gönderi")
```
-Ardından `yayinla` methodu ile gönderiyi yayınlayalım:
+Ardından `publish (yayinla)` methodu ile gönderiyi yayınlayalım:
{% filename %}komut-satırı{% endfilename %}
```python
->>> post.yayinla()
+>>> post.publish()
```
-Şimdi tekrar yayınlanmış gönderilerin listesini edinin.(Üç kere yukarı ok tuşuna basın ve `enter`)'a basın:
+Şimdi yayınlanmış gönderileri tekrar almaya çalışalım (3 kez yukarı yön ve ardından `enter` tuşuna basın):
{% filename %}komut-satırı{% endfilename %}
@@ -181,12 +182,12 @@ Ardından `yayinla` methodu ile gönderiyi yayınlayalım:
### Nesneleri Sıralama
-QuerySets ayrıca nesne listesini sıralamanızı da sağlar. Nesneleri `yaratilma_tarihi` özelliğine göre sıralamayı deneyelim:
+QuerySets ayrıca nesne listesini sıralamanızı da sağlar. Nesneleri `created_date (yaratilma_tarihi)` özelliğine göre sıralamayı deneyelim:
{% filename %}komut-satırı{% endfilename %}
```python
->>> Post.objects.order_by('yaratilma_tarihi')
+>>> Post.objects.order_by('created_date')
[, , , ]
```
@@ -195,7 +196,7 @@ Başına `-` ekleyerek sıralamayı tersine de çevirebiliriz:
{% filename %}komut-satırı{% endfilename %}
```python
->>> Post.objects.order_by('-yaratilma_tarihi')
+>>> Post.objects.order_by('-created_date')
[, , , ]
```
@@ -203,8 +204,10 @@ Başına `-` ekleyerek sıralamayı tersine de çevirebiliriz:
Sorgu setlerini **zincirleyerek** beraber kullanabilirsiniz:
- >>> Post.objects.filter(yayinlanma_tarihi__lte=timezone.now()).order_by('yayinlanma_tarihi')
-
+```python
+>>> Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
+, , , ]>
+```
Zincirleme gerçekten çok güçlüdür ve oldukça karmaşık sorgular yazmanıza imkan sağlar.
diff --git a/tr/django_start_project/README.md b/tr/django_start_project/README.md
index 675f8cc348f..30ed128c5ac 100644
--- a/tr/django_start_project/README.md
+++ b/tr/django_start_project/README.md
@@ -10,11 +10,11 @@ Küçük bir blog oluşturacağız!
Bazı dosya ve dizinlerin isimleri Django için çok önemlidir. Oluşturmak üzere olduğumuz dosyaları yeniden adlandırmamalısınız. Onları başka bir yere taşımak da iyi bir fikir değil. Django'nun önemli şeyleri bulabilmesi için belirli yapısını koruması gerekir.
-> virtualenv içindeki her şeyi çalıştırmayı unutmayın. Eğer konsolunuzda `(myenv)` öneki görmüyorsanız, virtualenv'inizi aktive etmeniz gerekir. **Django yükleme** bölümünün **virtualenv ile Çalışma** kısmında nasıl yapılacağını açıkladık. Windows'ta `myvenv\Scripts\activate` ya da, Mac OS ya da Linux'ta `source myvenv/bin/activate` yazmak bunu sizin için yapacaktır.
+> virtualenv içindeki her şeyi çalıştırmayı unutmayın. Eğer konsolunuzda `(myenv)` öneki görmüyorsanız, virtualenv'inizi aktive etmeniz gerekir. **Django yükleme** bölümünün **Virtualenv ile çalışma** kısmında nasıl yapılacağını açıkladık. Windows'ta `myvenv\Scripts\activate` ya da, Mac OS ya da Linux'ta `source myvenv/bin/activate` yazmak bunu sizin için yapacaktır.
-Mac OS X or Linux konsolunuzda, devam eden şu komutu çalıştırmalısınız. **Periyot eklemeyi unutmayın (yada nokta)`.`sonunda!**
+MacOS veya Linux konsolunuzda aşağıdaki komutu çalıştırmalısınız; **sonuna nokta `(.)` koymayı unutmayın**
{% filename %}komut-satırı{% endfilename %}
@@ -29,7 +29,7 @@ Mac OS X or Linux konsolunuzda, devam eden şu komutu çalıştırmalısınız.
-Windows'ta aşağıdaki kumutu çalıştırmalısınız. **(Sonuna nokta `.` koymayı unutmayın)**:
+Windows'ta aşağıdaki komutu çalıştırmalısınız. **(Sonuna nokta `.` koymayı unutmayın)**:
{% filename %}komut-satırı{% endfilename %}
@@ -55,7 +55,7 @@ Windows'ta aşağıdaki kumutu çalıştırmalısınız. **(Sonuna nokta `.` koy
> **Not**: Dizin yapınızda, daha önceden oluşturduğumuz `venv` dizinini de göreceksiniz.
-`manage.py` siteyi yönetmenize yardımcı olan bir scripttir (komut). Bununla başka herhangi bir şey yüklemeden kendi bilgisayarımızda bir web sunucusu başlatabileceğiz.
+`manage.py` site yönetimine yardımcı olan bir komut dosyasıdır. Bu dosya sayesinde, başka herhangi bir şey kurmadan bilgisayarımızda bir web sunucusunu başlatabileceğiz.
`settings.py` dosyası, web sitesinizin ayarlarını içerir.
@@ -67,11 +67,11 @@ Bir mektubu nereye götüreceğini kontrol eden postacının hakkında konuştu
Hadi `mysite/settings.py` dosyasında bazı değişiklikler yapalım. Daha önceden kurduğunuz kod düzenleyicinizi kullanarak dosyayı açın.
-**Not**: Bunu aklınızda tutun, `settings.py` dosyası da diğerleri gibi düzenli bir dosyadır. Bunu kod düzenleyicisi içerisinde "dosya -> aç" menü eylemini kullanarak açabilirsiniz. Bu, size `settings.py` dosyanıza gidebileceğiniz ve bu dosyayı seçebileceğiniz her zamanki klasik pencereyi alacaktır. Alternatif olarak, bu dosyayı masaüstünüzdeki djangogirls klasörüne gidip sağ tıklayarak açabilirsiniz. Sonra, listeden kod düzenleyicinizi seçiniz. Dosyayı açabilen ancak düzenlemenize izin vermeyecek diğer programların yüklü olabilmesi nedeniyle kod düzenleyicinin seçilmesi önem arz etmektedir.
+**Not**: `settings.py` dosyasının da diğerleri gibi normal bir dosya olduğunu aklınızda tutun. Bunu kod düzenleyicisi içerisinde "dosya -> aç" menü eylemini kullanarak açabilirsiniz. Bu, size `settings.py` dosyanıza gidebileceğiniz ve bu dosyayı seçebileceğiniz her zamanki klasik pencereyi açacaktır. Alternatif olarak, bu dosyayı masaüstünüzdeki djangogirls klasörüne gidip sağ tıklayarak açabilirsiniz. Sonra, listeden kod düzenleyicinizi seçin. Dosyayı açabilen ancak düzenlemenize izin vermeyecek diğer programların yüklü olması ihtimaline karşın kod düzenleyicinin seçilmesi önem arz etmektedir.
Web sitemizin doğru bir saate sahip olması güzel olurdu. [Wikipedia'nın zaman dilimleri listesine](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) gidin ve ve ilgili saat dilimini kopyalayın (ZD) (Ör. `Europe/Berlin`).
-`settings.py`'de, `TIME_ZONE` içeren satırı bulun ve kendi zaman diliminizi seçmek için değiştirin. Örnek olarak:
+`settings.py` dosyasında `TIME_ZONE` ifadesini içeren satırı bulun ve kendi seçtiğiniz zaman dilimine göre uyarlayın:
{% filename %}mysite/settings.py{% endfilename %}
@@ -79,9 +79,9 @@ Web sitemizin doğru bir saate sahip olması güzel olurdu. [Wikipedia'nın zama
TIME_ZONE = 'Europe/Istanbul'
```
-Bir dil kodu dilden oluşmaktadır, ör. `en` ingilizce için veya `de` almanca için, ve ülke kodu da, ör. `de` almanya için veya `ch`isviçre için. Django'daki varsayılan butonların ve bildirimlerin sizin dilinizde olmasını istiyorsanız bunu eklemek isteyeceksiniz. Böylece "İptal" butonu burada tanımladığınız dile çevrilmiş olacaktır. [Django hazırlanmış olan bir çok çeviri ile birlikte gelmektedir](https://docs.djangoproject.com/en/1.11/ref/settings/#language-code).
+Bir dil kodu, dil (ör. ingilizce için `en` veya almanca için `de`) ve ülke kodundan (ör. almanya için `de` veya isviçre için `ch`) oluşmaktadır. Eğer İngilizce ana diliniz değilse, varsayılan buttonları ve uyarıların dilini kendi dilinize değiştirmek bunu ekleyebilirsiniz. Böylece "İptal" butonu burada tanımladığınız dile çevrilmiş olacaktır. [Django hazırlanmış olan birçok çeviri ile birlikte gelmektedir](https://docs.djangoproject.com/en/1.11/ref/settings/#language-code).
-Aşağıdaki satırı değiştirerek dil kodunu değiştiriniz:
+Farklı bir dil istiyorsanız, aşağıdaki satırı değiştirerek dil kodunu seçin:
{% filename %}mysite/settings.py{% endfilename %}
@@ -89,7 +89,7 @@ Aşağıdaki satırı değiştirerek dil kodunu değiştiriniz:
LANGUAGE_CODE = 'de-ch'
```
-Ayrıca statik dosyalar için bir yol eklememiz gerekmektedir. (Eğitici ders içerisinde statik dosyalar ve CSS hakkında ayrıntılı bilgi bulabilirsiniz.) Dosyanın *son*'una gidin, hemen altında sadece `STATIC_URL` girişi yapın, `STATIC_ROOT` adında yeni birim ekleyin:
+Ayrıca statik dosyalar için bir yol eklememiz gerekmektedir. (Tutorial içerisinde statik dosyalar ve CSS hakkında ayrıntılı bilgi bulabilirsiniz.) Dosyanın *son*'una gidin, hemen altında sadece `STATIC_URL` girişi yapın, `STATIC_ROOT` adında yeni birim ekleyin:
{% filename %}mysite/settings.py{% endfilename %}
@@ -98,7 +98,7 @@ STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
```
-`DEBUG(Hata Ayıklama)` `True(Doğru)` ve `ALLOWED_HOSTS` boş olduğu zaman ana bilgisayar `['localhost', '127.0.0.1', '[::1]']`'a karşı doğrulanır. Bu, uygulamamızı dağıttıktan sonra, PythonAnywhere'deki anamakine adıyla eşleşmeyecek ve böylece aşağıdaki ayarları değiştireceğiz:
+`DEBUG(Hata Ayıklama)` `True(Doğru)` ve `ALLOWED_HOSTS` boş olduğu zaman ana bilgisayar `['localhost', '127.0.0.1', '[::1]']`'a karşı doğrulanır. Bu, uygulamamızı dağıttıktan sonra, PythonAnywhere'deki anamakine adıyla eşleşmeyecek bu yüzden aşağıdaki ayarları değiştireceğiz:
{% filename %}mysite/settings.py{% endfilename %}
@@ -127,7 +127,7 @@ DATABASES = {
}
```
-Blogumuzun veritabanını oluşturmak için konsolda şu komutu çalıştırın:`python manage.py migrate` (`manage.py` dosyasını içeren `djangogirls` klasöründe olmalıyız). İşler iyi giderse şöyle bir şey görmelisiniz:
+Blogumuzun veritabanını oluşturmak için konsolda şu komutu çalıştırın: `python manage.py migrate` (`manage.py` dosyasını içeren `djangogirls` klasöründe olmalıyız). İşler iyi giderse şöyle bir şey görmelisiniz:
{% filename %}komut-satırı{% endfilename %}
@@ -193,10 +193,10 @@ Tebrikler! ilk web siteni oluşturdun ve web sunucusu kullanarak çalıştırdı
![İşte çalışıyor!](images/it_worked2.png)
-Web sunucusu çaışırken ek komutlar girmek için yeni bir komut satır istemi göremezsiniz. Terminal yeni metin kabul edecek ama yeni komutları çalıştırmayacaktır. Bunun nedeni web sunucusunun duraklamadan gelen talepleri algılamasıdır.
+Web sunucusu çalışırken ek komutlar girmek için yeni bir komut satırı istemi göremezsiniz. Terminal yeni metin kabul edecek ama yeni komutları çalıştırmayacaktır. Bunun nedeni web sunucusunun duraklamadan gelen talepleri algılamasıdır.
> Web sunucuları nasıl çalışır **How the Internet works (İnternet Nasıl Çalışır)** bölümünde görmüştük.
-Ağ sunucusu açıkken yeni komut yazmak için, yeni bir terminal penceresi açıp virtualenv aktive etmeniz gerekmektedir. Web sunucusunu durdurmak için, çalıştığı pencereye geri dönün ve CTRL+C ye basın -Control ve C tuşlarına birlikte. (Windows'ta Ctrl+Break tuşları olabilir.).
+Web sunucusu açıkken yeni komut yazmak için, yeni bir terminal penceresi açıp virtualenv'inizi aktive etmeniz gerekmektedir. Web sunucusunu durdurmak için, çalıştığı pencereye geri dönün ve CTRL+C ye basın -Control ve C tuşlarına birlikte. (Windows'ta Ctrl+Break tuşları olabilir.).
Sonraki adım için hazır mısın? İçerikleri oluşturma zamanı!
\ No newline at end of file
diff --git a/tr/django_templates/README.md b/tr/django_templates/README.md
index 32d663a5a15..40b25e1e108 100644
--- a/tr/django_templates/README.md
+++ b/tr/django_templates/README.md
@@ -4,15 +4,15 @@ Bazı verileri gösterme zamanı! Django bunun için bize faydalı bazı yerleş
## Template etiketleri nedir?
-Görüyorsunuz, HTML'de gerçek Python kodu yazamazsınız çünkü tarayıyıcılar bunu anlamazlar. Tarayıcılar sadece HTML kodlarını anlarlar. Bildiğimiz üzere Python çok daha dinamik bir dil iken, HTML de oldukça statiktir.
+Görüyoruz ki aslında, HTML'de Python kodu yazamayız, çünkü tarayıcılar bunu anlamaz. Tarayıcılar yalnızca HTML'den anlar. Biliyoruz ki Python daha dinamik bir dil iken, HTML oldukça statiktir.
-**Django şablon etiketleri** Python benzeri şeyleri HTML'e aktarmamıza izin verir, böylece dinamik websitelerini daha hızlı bir şekilde oluşturabilirsiniz. Harika!
+**Django template etiketleri** Python benzeri yapıların HTML'ye aktarılmasını sağlar, böylece dinamik web sitelerini daha kolay ve hızlı oluşturabiliriz!
-## Gönderi listesi template'ini göster
+## Gönderi listesi template'ini gösterme
Bir önceki bölümde, template'e `posts` değişkeni içinde gönderiler listesi verdik. Şimdi, bunu HTML'de göstereceğiz.
-Django şablonunda bir değişken yazdırmak için, değişken adını çift kıvrımlı parantez içinde şu şekilde kullanırız:
+Django şablonunda (template) bir değişken (variable) yazdırmak için, değişken adını çift kıvrımlı parantez içinde şu şekilde kullanırız:
{% filename %}blog/templates/blog/post_list.html{% endfilename %}
@@ -68,13 +68,13 @@ Bunu kendi template'imizle deneyelim.
![Şekil 13.3](images/step3.png)
-Bu sefer biraz daha farklı bir notasyon kullandığımızın farkında mısınız (`{{ post.title }}` or `{{ post.text }})`? Böylece `Post` modelinde tanımlanan alanlardaki verilere ulaşıyoruz. Ayrıca `|linebreaksbr` satırsonlarını paragrafa dönüştürmek için gönderilerin içindeki metinleri bir filtre ile yönlendiriyor.
+Bu sefer biraz daha farklı bir notasyon kullandığımızın farkında mısınız (`{{ post.title }}` or `{{ post.text }})`)? Böylece `Post` modelinde tanımlanan alanlardaki verilere ulaşıyoruz. Ayrıca `|linebreaks` (satırsonu), gönderilerin metnini, satır sonlarını paragraflara çeviren bir filtreden geçiriyor.
## Bir şey daha
-Websitenizi internette çalışır halde görmek iyi olur değilmi? PythonAnywhere tekrar çalıştıralım. Adımları hatırlayalım…
+Web sitemizin İnternet'te hâlâ çalıştığını görmek iyi olacak, değil mi? PythonAnywhere'e yükleyelim yine. Adımları hatırlayalım…
-* İlk önce kodumuzu GitHub'a push komutu ile yükleyelim
+* İlk önce kodumuzu Github'a push komutu ile yükleyelim
{% filename %}komut-satırı{% endfilename %}
@@ -92,7 +92,7 @@ Websitenizi internette çalışır halde görmek iyi olur değilmi? PythonAnywhe
{% filename %}PythonAnywhere komut-satırı{% endfilename %}
- $ cd ilk-blogum
+ $ cd $USER.pythonanywhere.com
$ git pull
[...]
@@ -101,6 +101,6 @@ Websitenizi internette çalışır halde görmek iyi olur değilmi? PythonAnywhe
Tebrikler! Django admin üzerinden yeni bir gönderi ekleyin (yayinlama_tarihi eklemeyi unutmayın!) PythonAnywhere sitenizinin Django admin'inde olduğunuzdan emin olun, https://yourname.pythonanywhere.com/admin. Arkasından gönderileri görebilmek için ordaki sayfanızı yenileyin.
-Şiir gibi çalışıyor değil mi? Gurur duyuyoruz! Bi süre bilgisayarınızdan uzaklaşın - molayı hak ettiniz. :)
+Şiir gibi çalışıyor, değil mi? Gurur duyabiliriz! Şimdi bilgisayar başından bir süre kalkalım, çünkü bir molayı hak ettik. :)
![Şekil 13.4](images/donut.png)
\ No newline at end of file
diff --git a/tr/django_urls/README.md b/tr/django_urls/README.md
index 2c93a769520..f1c7490f20f 100644
--- a/tr/django_urls/README.md
+++ b/tr/django_urls/README.md
@@ -1,14 +1,14 @@
# Django URL'leri
-İlk web sayfamızı kurmak üzereyiz: bloğun için bir ana sayfa! Ama öncelike, Django URL'leri hakkında biraz bilgi edinelim.
+İlk web sayfamızı yapmak üzereyiz: blogunuzun anasayfası! Ama önce, biraz Django url'lerini öğrenmeye başlayalım.
## URL nedir?
-URL basitçe bir web adresidir. Her defasında bir web sitesini ziyaret ettiğinde bir URL görürsün. Tarayıcının adres çubuğunda görünmektedir. (Evet! `127.0.0.1:8000` bir URL'dir! Ve`https://djangogirls.org`'da bir URL'dir)
+URL basitçe bir web adresidir. Her defasında bir web sitesini ziyaret ettiğinde bir URL görürsün. Tarayıcının adres çubuğunda görünmektedir. (Evet! `127.0.0.1:8000` bir URL'dir! Ve `https://djangogirls.org` da bir URL'dir)
![Url](images/url.png)
-Internetteki her sayfanın kendi URL'si olması gerekir. Bu yolla uygulama URl'yi açan kullanıcaya ne göstemesi gerektiğini bilir. Django'da `URLconf` (URL konfigürasyonu) denilen bir şey kullanıyoruz. URLconf Django'nun doğru görünümü bulmak için istenen URL ile eşleştirmeyi deneyeceği desenler dizinidir.
+İnternetteki her sayfanın kendi URL'si olması gerekir. Böylelikle bir URL açıldığında uygulama ne göstermesi gerektiğini bilir. Django'da `URLconf` (URL konfigürasyonu) denilen bir şey kullanıyoruz. URLconf Django'nun doğru görünümü (view) bulmak için istenen URL ile eşleştirmeyi deneyeceği desenler dizinidir.
## URL'ler Django'da nasıl çalışır?
@@ -29,11 +29,11 @@ urlpatterns = [
]
```
-Gördüğünüz gibi, Django çoktan bizim için buraya bir şey yerleştirmiş.
+Gördüğünüz gibi Django bu dosyaya bizim için bir şeyler koymuş bile.
Üçlü tırnaklar (`'''` or `"""`) arasındaki satırlara docstrings denir - bunları bir dosyanın, sınıfın ya da metodun en üstüne ne yaptıklarını anlatmak için yazabilirsiniz. Python bunları çalıştırmaz.
-Önce ki bölümde ziyaret ettğiniz yönetici URL'si şimdiden burada:
+Önceki bölümde gördüğümüz yönetici URL'si burada:
{% filename %}mysite/urls.py{% endfilename %}
@@ -41,11 +41,11 @@ Gördüğünüz gibi, Django çoktan bizim için buraya bir şey yerleştirmiş.
url(r'^admin/', admin.site.urls),
```
-Bu satırın anlamı Django, `admin` ile başlayan her URL için ona uyan bir *view* bulur demektir. Bu durumda bir sürü admin URLlerini dahil ediyoruz yani hepsi bu küçük dosyada sıkıştırılmış olarak durmuyor - bu şekil daha okunaklı ve düzenli.
+Bu satırın anlamı Django, `admin` ile başlayan her URL için ona uyan bir *view* bulur demektir. Bu durumda bir sürü yönetici URL'lerini ekliyoruz, böylece hepsi bu küçük dosyanın içinde sıkıştırılmış bir şekilde durmuyor -- bu hali daha okunabilir ve düzenli.
## Regex (Kurallı İfade)
-Django'nun URL'leri view'larla nasıl eşleştirdiğini merak ediyor musunuz? Bu kısım biraz karışık. Django bunun için `regex` kullanıyor. Regex, "regular expressions"ın kısaltılmış hali ve düzenli ifadeler anlamına geliyor. Regex'in bir arama kalıbı oluşturmak için birçok (birçok!) kuralı var. Regexler ileri bir konu olduğu için nasıl çalıştığının detayına girmeyeceğiz.
+Django'nun URL'leri view'larla nasıl eşleştirdiğini merak ediyor musunuz? Bu kısım biraz karışık. Django bunun için `regex` kullanıyor. Regex, "regular expressions"ın kısaltılmış hali ve düzenli ifadeler anlamına geliyor. Regex'in bir arama kalıbı oluşturmak için birçok (birçok!) kuralı var. Regex'ler ileri bir konu olduğu için nasıl çalıştığının detayına girmeyeceğiz.
Gene de kalıpları nasıl oluşturduğumuzu anlamak isterseniz, aşağıdaki bir örnek var - aradığımız kalıbı oluşturmak için kuralların sadece bir kısmına ihtiyacımız olacak, şöyle:
@@ -61,7 +61,7 @@ URL tanımındaki diğer her şey tamamen ele alınacaktır.
Her gönderi için ayrı bir view yazmak gerçekten can sıkıcı olurdu. Düzeni ifadelerle, URL ile eşleşen ve bizim için gönderi numarasını çıkaran bir desen yaratabiliriz: `^post/(\d+)/$`. Şimdi bunu, burada ne yaptığımızı görebilmek için parçalarına ayıralım:
-* **^post/** Django'ya urldeki `post/` ile başlayan her şeyi almasını söylüyor. (`^` 'dan hemen sonra)
+* **^post/** Django'ya URL'deki `post/` ile başlayan her şeyi almasını söylüyor. (`^` 'dan hemen sonra)
* **(\d+)** ise bir sayı (birden fazla rakam) olduğunu ve bu sayıyı yakalamak ve çıkarmak istediğimizi belirtiyor
* **/** ise Django'ya arkasından bir `/` karakteri gelmesi gerektiğini söylüyor
* **$** ise URL'nin sonuna işaret ediyor, yani sadece sonu `/` ile biten string'ler bu kalıpla eşleşecek
@@ -89,7 +89,7 @@ urlpatterns = [
]
```
-Django artık 'http://127.0.0.1:8000/'ye gelen her şeyi `blog.urls`'ya yönlendirecek ve ordaki yönergelere bakacak.
+Django artık 'http://127.0.0.1:8000/' adresine gelen her şeyi `blog.urls`'ya yönlendirecek ve ordaki yönergelere bakacak.
Python'da düzenli ifade yazarken her zaman string (dize)'den önce `r` eklenir. Bu Python için string'in özel karakterler içerdiğini, doğrudan Python için değil düzenli ifadeler için bir string olduğu konusunda ipucu verir.
diff --git a/tr/extend_your_application/README.md b/tr/extend_your_application/README.md
index 1b5969b4917..084e8dc8326 100644
--- a/tr/extend_your_application/README.md
+++ b/tr/extend_your_application/README.md
@@ -1,3 +1,5 @@
+{% set warning_icon = '' %}
+
# Uygulamanı genişlet
Websitemizi oluşturmak için gerekli adımların hepsini tamamladık: bir modelin, url'nin, view'ün ve template'in nasıl yazılacağını biliyoruz. Websitemizi nasıl güzelleştirebiliriz onu da biliyoruz.
@@ -28,21 +30,21 @@ Halihazırda bir `Post` modelimiz var, dolayısıyla `models.py` dosyasına bir
{% endblock %}
```
-{% raw %}Gönderi listesindeki bir gönderinin başlığından bir gönderinin detay sayfasına bir link (bağlantı) olsun istiyoruz. `
`'i gönderinin detay sayfasına link verecek şekilde değiştirelim:{% endraw %}
+{% raw %}Gönderi listesindeki bir gönderinin başlığından bir gönderinin detay sayfasına bir link (bağlantı) olsun istiyoruz. `
```
-{% raw %}Gizemli `{% url 'post_detail' pk=post.pk %}` satırını anlatma zamanı. Şüphelendiğiniz üzere, `{% %}` notasyonu, Django template tags (şablon etiketleri) kullandığımız manasına geliyor. Bu sefer bizim için URL oluşturacak bir template etiketi kullanacağız!{% endraw %}
+{% raw %}Gizemli `{% url 'post_detail' pk=post.pk %}` satırını anlatma zamanı. Şüphelendiğiniz üzere, `{% %}` notasyonu, Django template tags (şablon etiketleri) kullandığımız manasına geliyor. Bu sefer bizim için URL oluşturacak bir şablon (template) etiketi kullanacağız!{% endraw %}
-`post_detail` kısmı Django, `blog/urls.py` URL'si içinde name=post_detail 'ı bekliyor olacak demektir.
+`post_detail` kısmı Django'nun `blog/urls.py/0> dosyasının içinde post_detail adlı bir URL beklediği anlamına gelir.
-Ve `pk=post.pk`'a ne dersin? `pk` veritabanındaki her benzersiz isim için varolan birincil anahtarın kısaltmasıdır. Çünkü `Post` modelimizde birincil anahtar belirtmediysek Django bizim için bir tane yaratır (varsayılan olarak her kayıt için birer arttırır, mesela 1,2,3) ve her gönderimize `pk` adında bir alan ekler. Ana anahtara `post.pk` yazarak erişiriz, diğer alanlar içinde aynısı geçerlidir (`title`, `author`, vb.) `Post` objesi!
+
Peki pk=post.pk`? `pk` primary key (birincil anahtar) için kullanılan kısaltmadır, veritabanındaki her kayıt için verilen özgün (eşsiz) bir isimdir. `Post` modelimiz için bir primary key tanımlamamış olduğumuz için, Django onu bizim için otomatik olarak oluşturdu (genelde, her kayıt için bir artan numara ile, örnek 1, 2, 3) ve her post için `pk` adlı bir alan ekledi. Primary key'e erişmek için `post.pk` yazarız, tıpkı `Post` objesindeki diğer alanlara eriştiğimiz gibi (`title`, `author`, vb.)!
-Şimdi http://127.0.0.1:8000/ adresine gittiğimizde bir hata ile karşılaşacağızURL yada `içerik detayları`için bir*görüntü*'müz olmadığı için hatayı almamız normal)hata böyle görünecektir:
+Şimdi http://127.0.0.1:8000/ adresine gittiğimizde bir hata ile karşılaşacağız (`post_detail` için bir URL ya da *görüntü (view)* olmadığı için hatayı almamız normal). Hata böyle görünecektir:
![NoReverseMatch error (Tersi yok hatası)](images/no_reverse_match2.png)
@@ -52,9 +54,9 @@ Ve `pk=post.pk`'a ne dersin? `pk` veritabanındaki her benzersiz isim için varo
İlk gönderimizin detayının şu **URL**'de gösterilmesini istiyoruz: http://127.0.0.1:8000/post/1/
-`blog/urls.py` dosyasında `post_detail` adında bir Django *view*'una işaret eden bir URL yapalım. Bu <1>view1> bir gönderinin tümünü gösterecek. `blog/urls.py` dosyasına şu satırı ekleyin `url(r'^post/(?P\d+)/$', views.post_detail, name='post_detail'),`. Dosyanın şu hale gelmiş olması gerekiyor:
+`blog/urls.py` dosyasında `post_detail` adında bir Django *view*'una işaret eden bir URL yapalım. Bu <1>view1> bir gönderinin tümünü gösterecek. `blog/urls.py` dosyasına şu satırı ekleyin `url(r'^post/(?P\d+)/$', views.post_detail, name='post_detail'),`. Dosya şöyle gözükmeli:
-{% filename %}blog/urls.py{% endfilename %}
+{% filename %}{{ warning_icon }} blog/urls.py{% endfilename %}
```python
from django.conf.urls import url
@@ -80,25 +82,25 @@ Tamamdır.`blog/urls.py`!'e yeni bir URL kalıbı ekledik! Http://127.0.0.1:8000
![AttributeError (Özellik hatası)](images/attribute_error2.png)
-Bir sonraki adımın ne olduğunu hatırlıyor musunuz? Tabi ki: görünüm'ü eklemek!
+Bir sonraki adımın ne olduğunu hatırlıyor musunuz? Tabi ki: view'ü eklemek!
## Gönderi detayı için bir view ekleyin
-Bu sefer *view*'ımıza `pk` ekstra parametresi verilir. *view*'ümüzün onu yakalaması gerekiyor, değil mi? Fonksiyonumuzu `def post_detail(request, pk):` olarak tanımlayacağız. Dikkat edin, url'lerde kullandığımız ismin birebir aynısını kullanmamız gerekiyor (`pk`). Bu değişkeni kullanmamak yanlıştır ve hataya sebep olacaktır!
+Bu sefer *view*'ümüze `pk` adında bir parametre ekleyeceğiz. *view*'ümüzün onu yakalaması gerekiyor, değil mi? Fonksiyonumuzu `def post_detail(request, pk):` olarak tanımlayacağız. Dikkat edin, url'lerde kullandığımız ismin birebir aynısını kullanmamız gerekiyor (`pk`). Bu değişkeni kullanmamak yanlıştır ve hataya sebep olacaktır!
Şimdi sadece ve sadece bir tane blog gönderisi almak istiyoruz. Bunu yapmak için şunun gibi sorgu setlerini/kümelerini kullanabiliriz:
-{% filename %}blog/views.py{% endfilename %}
+{% filename %}{{ warning_icon }} blog/views.py{% endfilename %}
```python
Post.objects.get(pk=pk)
```
-Ama bu kodda bir hata var. Eğer `birincil anahtarverilmiş herhangi bir gönderi`(<0>pk) yoksa, Çok çirkin bir hata elde etmiş olacağız!
+Ama bu kodun bir problemi var. Eğer gelen `primary key` (`pk` - tekil anahtar) ile bir `Post` (gönderi) yoksa, çok çirkin bir hatamız olacak!
![DoesNotExist error (Yok hatası)](images/does_not_exist2.png)
-Bunu istemeyiz! Ama tabi Django'da bunu ele alan bir şey var: `get_object_or404`. Bu durumda `pk` verilen bir `gönderi` bulunamazsa çok daha güzel bir sayfa gösterilecek: `Page Not Found 404` hatası.
+Bunu istemiyoruz! Ama tabi Django'da bunu ele alan bir şey var: `get_object_or404`. Eğer verilen `pk` ile bir `Post` bulunamazsa, çok daha güzel bir sayfa gösterilecek (`Sayfa bulunamadı 404` sayfası.
![Page not found (Sayfa bulunamadı)](images/404_2.png)
@@ -160,21 +162,21 @@ Of hayır! Başka bir hata! Ama onu nasıl halledeceğimizi biliyoruz, di mi? Bi
{% endblock %}
```
-Bir kere daha `base.html` dosyasını genişleteceğiz. `content` bloğunda bir gönderinin varsa yayınlama tarihini , başlığını ve metnini göstermek istiyoruz. Ama daha önemli şeyleri konuşmalıyız, değil mi?
+Bir kere daha `base.html` dosyasıa ekleme yapacağız. `content` blogunda bir gönderinin varsa yayınlama tarihini, başlığını ve metnini göstermek istiyoruz. Ama daha önemli şeyleri konuşmalıyız, değil mi?
-{% raw %}`{% if ... %} ... {% endif %}` bir şeyi kontrol etmek istediğimizde kullanabileceğimiz bir şablon etiketidir. (Unutmayın `if... else ..` **Python'a Giriş** bölümünden?) Bu durumda eğer gönderinin `published_date` kısmı boş değilse kontrol etmek isteriz.{% endraw %}
+{% raw %}`{% if ... %} ... {% endif %}` bir şeyi kontrol etmek istediğimizde kullanabileceğimiz bir şablon etiketidir. ( `if ... else ..` ifadelerini **Python'a Giriş** bölümünden hatırladın mı?) Bu durumda eğer gönderinin `published_date` kısmı boş değilse kontrol etmek isteriz.{% endraw %}
-Tamam, şimdi sayfamızı yenileyerek `Şablonyok` kaybolmuşmu görebiliriz.
+Tamam, şimdi sayfamızı yenileyerek `TemplateDoesNotExist` hatası kaybolmuş mu görebiliriz.
![Post detail page (Gönderi detay sayfası)](images/post_detail2.png)
Heyo! Çalışıyor!
-## Bir şey daha: deployment (yayına alma) zamanı!
+# Yayına alma zamanı!
Sitenizin hala PythonAnywhere'de çalışıp çalışmadığına bakmakta fayda var, değil mi? Yeniden taşımayı deneyelim.
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
$ git status
$ git add --all .
@@ -185,13 +187,30 @@ Sitenizin hala PythonAnywhere'de çalışıp çalışmadığına bakmakta fayda
Sonra bir [PythonAnywhere Bash konsol](https://www.pythonanywhere.com/consoles/) una gidip:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
- $ cd ilk-blogum
+ $ cd ~/.pythonanywhere.com
$ git pull
[...]
-Nihayet, [Web tab](https://www.pythonanywhere.com/web_app_setup/) ına gidip **Reload** edelim.
+(Açı parantezleri olmadan ``'i gerçek PythonAnywhere kullanıcı isminizle değiştirmeyi unutmayın).
+
+## Sunucudaki statik dosyaları güncelleyelim
+
+PythonAynwhere gibi sunucular "statik dosyalar"a (CSS dosyaları gibi) Python dosyalarından farklı davranır çünkü onları daha hızlı yüklenmesi için optimize edebilir. Sonuç olarak, CSS dosyalarında her değişiklik yaptığınızda, sunucuya onları güncellediğimizi söylemek için ilave bir komut çalıştırmalıyız. Bu komuta `collectstatic` adı verilir.
+
+Daha önceden çalıştırdığın virtualenv'in hala etkin değilse tekrar aktive ederek başlayın. (PythonAnywhere bunu yapmak için `workon` adlı bir komut kullanır. Kendi bilgisayarında kullandığın `source myenv/bin/activate` komutu gibi.):
+
+{% filename %}komut satırı{% endfilename %}
+
+ $ workon .pythonanywhere.com
+ (kullaniciadiniz.pythonanywhere.com)$ python manage.py collectstatic
+ [...]
+
+
+`manage.py collectstatic` komutu biraz `manage.py migrate` komutu gibidir. Kodumuzda bazı değişiklikler yapıp Django'ya bu değişiklikleri sunucunun statik dosyalar yığınına ya da veritabanına uygulamasını söyledik.
+
+Son olarak, [Web sekmesi](https://www.pythonanywhere.com/web_app_setup/)ne gidip uygulamanızın **Yenile** butonuna basın.
-O kadar! Tebrikler :)
\ No newline at end of file
+İşte bu kadar! Tebrikler :)
\ No newline at end of file
diff --git a/tr/html/README.md b/tr/html/README.md
index 3c49d7cc1f2..13ffb483892 100644
--- a/tr/html/README.md
+++ b/tr/html/README.md
@@ -2,7 +2,7 @@
Template nedir diye sorabilirsiniz.
-Şablon farklı bilgileri tutarlı bir formatta vermek için tekrar kullanabildiğimiz bir dosyadır - örnek olarak, bir harf yazmanıza yardım etmesi için bir şablon kullanabilirsiniz, çünkü her harfin başka bir mesaj içerebilmesi ve başka bir kişiye gönderilebilmesine rağmen aynı formatı paylaşacaklar.
+Template (şablon), farklı bilgileri hep aynı biçimde sunmak için tekrar tekrar kullanabileceğimiz bir dosyadır - örneğin, mektup yazmanıza yardımcı olan bir template kullanabilirsiniz çünkü yazacağınız tüm mektuplar farklı mesajlar içerse ve farklı kişilere gönderilse de aynı sayfa düzenine sahip olacaktır.
Django şablonunun formatı HTML diye adlandırılan bir dilde tanımlıdır(ilk bölümde bahsettiğimiz HTML, **İnternet nasıl çalışır**).
@@ -123,9 +123,9 @@ html
Çok heyecanlıyım! Bu benim ilk blogum. Ne kadar zevkli bir işmiş bilgisayarlarla uğraşmak. Artık bilgisayar başından kalkmam.
@@ -140,7 +140,7 @@ html
Burada üç tane `div` bölümü oluşturduk.
* İlk `div` ögesi blogumuzun başlığını içerir - bu bir baş kısımdır ve bir bağlantıdır
-* Sonraki iki `div` öğesi blog gönderilerimizi içeriyor; bunlarda bir yayın tarihi, tıklanabilir bir `h2` başlığı ve biri tarih diğeri gönderi metnimiz için olmak üzere, iki tane `p` (paragraf) var.
+* Sonraki iki `div` öğesi blog gönderilerimizi içeriyor; bunlarda bir yayın tarihi (published_date), tıklanabilir bir `h2` başlığı ve biri tarih diğeri gönderi metnimiz için olmak üzere, iki tane `p` (paragraf) var.
Bize yaşattığı duygu:
@@ -150,11 +150,11 @@ Yaşasın! Şimdiye dek, şablonumuz tam olarak sadece **aynı bilgiyi** görün
Aslında yapmak istediğimiz Django yöneticimize eklenen gerçek postaları açmak - bundan sonra oraya gidiyoruz.
-## Birşey daha: dağıtım!
+## Bir şey daha: deployment (yayına alma) zamanı!
Bunları İnternet'te canlı olarak görmek çok güzel olur, değil mi:
-### Kodumuzu commit ve push komutları ile GitHub'a yükleyelim
+### Kodumuzu commit ve push komutları ile Github'a yükleyelim
İlk önce son deployment dan sonra hangi dosyaların değiştiğine bakalım. Bu komutları lokal bilgisayarımızda çalıştıralım, PythonAnywhere'de değil:
@@ -199,13 +199,15 @@ Bunu bir kez yapıp, değişikliklerimizi GitHub'a yükledik (ittik):
* [PythonAnywhere consoles page](https://www.pythonanywhere.com/consoles/)sayfasını ve **Bash console** u açalım (ya da yeni bir tane açalım). Sonra da çalıştıralım:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}PythonAnywhere komut satırı{% endfilename %}
- $ cd ~/my-first-blog
+ $ cd ~/.pythonanywhere.com
$ git pull
[...]
+(Açı parantezleri olmadan ``'i gerçek PythonAnywhere kullanıcı isminizle değiştirmeyi unutmayın).
+
Kodumuzun indirilmesini izleyelim. Kodun geldiğini kontrol etmek istersek **Files (dosyalar) sekme**sini açıp PythonAnywhere'de kodumuzu görebiliriz.
* Son olarak, [Web sekmesi](https://www.pythonanywhere.com/web_app_setup/)ne gidip uygulamanızın **Yenile** butonuna basın.
diff --git a/tr/intro_to_command_line/README.md b/tr/intro_to_command_line/README.md
index 546aabe7ad8..9634c563342 100644
--- a/tr/intro_to_command_line/README.md
+++ b/tr/intro_to_command_line/README.md
@@ -408,7 +408,7 @@ Harika, değil mi? :)
| Komut (Windows) | Komut (Mac OS - GNU/Linux) | Açıklama | Örnek |
| ---------------- | -------------------------- | ----------------------- | ------------------------------------------------- |
-| exit | exit | pencereyi kapatır | **exit** |
+| exit | exit | pencereyi kapatır | **exit** |
| cd | cd | dizin değiştir | **cd test** |
| cd | pwd | geçerli dizini göster | **cd** (Windows) veya **pwd** (Mac OS / Linux) |
| dir | ls | dizin/dosyaları listele | **dir** |
@@ -424,4 +424,4 @@ Eğer merak ediyorsanız, [ss64.com](http://ss64.com) adresinden tüm işletim s
## Hazır mısınız?
-Haydi Python'a giriş yapalım!
+Haydi Python'a giriş yapalım!
\ No newline at end of file
diff --git a/tr/python_installation/instructions.md b/tr/python_installation/instructions.md
index 4a0b6d62828..7864f987549 100644
--- a/tr/python_installation/instructions.md
+++ b/tr/python_installation/instructions.md
@@ -12,7 +12,7 @@ Dikkat edilmesi gereken bir şey: Yükleme esnasında "Setup" ("Kur") işaretli
![Python'u arama yoluna eklemeyi unutmayın](../python_installation/images/python-installation-options.png)
-Önümüzdeki adımlarda, Windows Komut Satırını kullanıyor olacaksınız (ki ayrıca bahsedeceğiz). Şimdilik, eğer kimi komutlar yazmanız gerekirse, Başlat menüsü → Windows Sistemi → Komut Satırı'na gidin. Ayrıca "Çalıştır" penceresi ekrana gelene kadar Windows tuşuna basılı tutarken "R"-tuşuna basabilirsiniz. Komut Satırı'nı açmak için, "cmd" yazın ve "Çalıştır" penceresinde enter'a basın. (Windows'un yeni versiyonlarında, bazen saklı olduğundan "Komut Satırı"nı aratmak zorunda kalabilirsiniz.)
+Önümüzdeki adımlarda, Windows Komut Satırını kullanıyor olacaksınız (ki ayrıca bahsedeceğiz). Şimdilik, bazı komutlar girmeniz gerekirse, Başlat menüsüne gidin ve arama alanına "Komut istemi" yazıp enter'a basın. (Windows'un eski sürümlerinde, komut satırını Başlat menüsü → Windows sistemi → Komut istemi ile başlatabilirsin.) Ayrıca "Çalıştır" penceresi açılana kadar Windows tuşunu basılı tutup "R"-tuşuna basabilirsin. Komut Satırı'nı açmak için, "cmd" yazın ve "Çalıştır" penceresinde enter'a basın.
!["Çalıştır" penceresine "cmd" yazın](../python_installation/images/windows-plus-r.png)
diff --git a/tr/python_introduction/README.md b/tr/python_introduction/README.md
index 3a7f849a321..144f76363a0 100644
--- a/tr/python_introduction/README.md
+++ b/tr/python_introduction/README.md
@@ -1,3 +1,5 @@
+{% set warning_icon = '' %}
+
# Python'a giriş
> Bu bölümün bir kısmı Geek Girls Carrots tarafından hazırlanmış eğitimlere dayanılarak hazırlanmıştır (https://github.com/ggcarrots/django-carrots).
@@ -14,11 +16,11 @@ Hazır olduğunuzda, aşağıdaki talimatları takip edin.
Bir Python konsolu açmak istiyoruz; öyleyse Windows'ta `python`, Mac OS/Linux'ta `python3` yazıp, `enter`'a basın.
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
$ python3
Python 3.6.1 (...)
- Daha fazla bilgi için "yardım", "telif hakkı", "krediler" veya "lisans" yazın
+ Type "help", "copyright", "credits" or "license" for more information.
>>>
@@ -28,9 +30,9 @@ Python komutunu çalıştırdıktan sonra, komut istemi `>>>` şeklinde değişt
Eğer herhangi bir zamanda Python komut satırından çıkmak isterseniz, yalnızca `exit()` yazmanız ya da Windows için `Ctrl + Z`, Mac/Linux için `Ctrl + D` kısa yolunu kullanmanız yeterli. Bunu yaptığınız taktirde artık `>>>` yazısını görmeyeceksiniz.
-Şimdilik, Python konsolundan çıkmak istemiyoruz. Bu konuda daha fazla bilgi edinmek istiyoruz. ` girmek ` 'e basarak ` 2 + 3 ` gibi biraz matematik yazarak başlayalım.
+Şimdilik, Python konsolundan çıkmak istemiyoruz. Bu konuda daha fazla bilgi edinmek istiyoruz. Biraz matematik yazarak başlayalım (` 2 + 3 ` gibi) ve `enter` 'a basalım.
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> 2 + 3
@@ -43,7 +45,7 @@ Güzel! Cevap nasıl da çıktı görüyor musun? Python matematik biliyor! Sen
- `5 - 1`
- `40 / 2`
-Üstel hesaplama uygulamak, 2 üzeri 3 deyin, Biz yazalım: {% filename %}komut-satırı{% endfilename %}
+Üstel hesaplama yapmak için 2 üzeri 3 deyin, şöyle yazalım: {% filename %}komut-satırı{% endfilename %}
```python
>>> 2 ** 3
@@ -52,24 +54,24 @@ Güzel! Cevap nasıl da çıktı görüyor musun? Python matematik biliyor! Sen
Bunları biraz kurcalayıp eğlen, sonra tekrar burada buluşalım. :)
-Gördüğünüz gibi Python mükemmel bir hesap makinesidir. Eğer başka neler yapabileceğinizi merak ediyorsanız…
+Gördüğün gibi Python çok iyi bir hesap makinesi. Eğer başka neler yapabileceğini merak ediyorsan...
## String'ler (dizeler)
Mesela ismin? İsmini tırnak işaretleri içerisinde şu şekilde yaz:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> "Zeynep"
'Zeynep'
```
-İlk string'ini oluşturdun! String (katar), bilgisayar tarafından işlenebilen ve karakterlerden oluşan dizilerin genel adıdır. Bir string her zaman aynı özel karakterle başlamalı ve aynı özel karakterle bitmelidir. Tek tırnak (`'`) veya çift tırnak (`"`) olabilir (aralarında herhangi bir fark yok!). Tırnak işaretleri Python'da içlerinde olan şeyin bir string olduğunu ifade eder.
+İlk string'ini oluşturdun! String (dize), bilgisayar tarafından işlenebilen ve karakterlerden oluşan dizilerin genel adıdır. Bir string her zaman aynı özel karakterle başlamalı ve aynı özel karakterle bitmelidir. Tek tırnak (`'`) veya çift tırnak (`"`) olabilir (aralarında herhangi bir fark yok!). Tırnak işaretleri Python'da içlerinde olan şeyin bir string olduğunu ifade eder.
Stringler birbirlerine eklenebilir. Şunu dene:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> "Merhaba " + "Zeynep"
@@ -96,7 +98,7 @@ Eğer stringinin içerisine bir tırnak işareti koymak istiyorsan, bunun için
"Turgut Uyar'ın dizeleriyiz"
```
-veya sola eğik çizgi (` \ `) kullanarak:
+veya backslash (` \ `) kullanarak:
{% filename %}komut satırı{% endfilename %}
@@ -140,9 +142,9 @@ Bunlar öğreneceğiniz her programlama dilinin temelleri. Biraz daha zor bir ş
## Hatalar
-Şimdi yeni bir şey deneyelim. Bir sayının uzunluğunu, bir string'in uzunluğunu bulduğumuz gibi bulabilir miyiz? Bunu görmek için `len(304023)` yazıp `enter`a basalım:
+Şimdi yeni bir şey deneyelim. Bir sayının uzunluğunu, bir string'in uzunluğunu bulduğumuz gibi bulabilir miyiz? Bunu görmek için `len(304023)` yazıp `enter` a basalım:
-{% filename %}komut satırı{% endfilename %}
+{% filename %}{{ warning_icon }} komut satırı{% endfilename %}
```python
>>> len(304023)
@@ -151,7 +153,9 @@ Traceback (most recent call last):
TypeError: object of type 'int' has no len()
```
-İlk hatamızı aldık! Nesne türü "int" (tam sayılar, tüm sayılar) in uzunluğu olmadığını söylüyor. Şimdi ne yapabiliriz? Belki de rakamı bir string olarak yazabiliriz? Stringlerin bir uzunluğu var, değil mi?
+İlk hatamızı aldık! {{ warning_icon }} ikonu çalıştırmak üzere olduğunuz programın beklediğiniz gibi çalışmayacağı konusunda sizi ikaz eder. Hatalar yapmak (kasıtlı olanlar bile) öğrenmenin önemli bir kısmı!
+
+Nesne türü "int" (tam sayılar, tüm sayılar) in uzunluğu olmadığını söylüyor. Şimdi ne yapabiliriz? Belki de rakamı bir string olarak yazabiliriz? Stringlerin bir uzunluğu var, değil mi?
{% filename %}komut satırı{% endfilename %}
@@ -169,7 +173,7 @@ TypeError: object of type 'int' has no len()
## Değişkenler
-Programlamada en önemli konulardan biri değişkenlerdir. Değişken, daha sonra kullanmak istediğiniz bir yapıya verdiğiniz isimdir. Programcılar değişkenleri verileri tutmak ya da kodlarını daha okunabilir ve anlaşılabilir kılmak için kullanırlar ve böylece her şeyi sürekli akıllarında tutmaya gerek kalmaz.
+Programlamada en önemli konulardan biri değişkenlerdir. Değişken (variable), daha sonra kullanmak istediğiniz bir yapıya verdiğiniz isimdir. Programcılar değişkenleri verileri tutmak ya da kodlarını daha okunabilir ve anlaşılabilir kılmak için kullanırlar ve böylece her şeyi sürekli akıllarında tutmaya gerek kalmaz.
`name` adında bir değişken yaratmak istediğimizi varsayalım:
@@ -179,7 +183,7 @@ Programlamada en önemli konulardan biri değişkenlerdir. Değişken, daha sonr
>>> name = "Ayşe"
```
-Tip adı eşittir Ola.
+name (isim) eşittir "Ayşe" yazalım.
Farkettiğiniz gibi, program daha öncekilerinin aksine bu kez hiçbir cevap vermedi. O zaman böyle bir değişkenin gerçekten tanımlı olduğunu nasıl bilebiliriz? Basitçe, `name` yazıp `enter` tuşuna basalım:
@@ -190,7 +194,7 @@ Farkettiğiniz gibi, program daha öncekilerinin aksine bu kez hiçbir cevap ver
'Ayşe'
```
-İşte bu sizin ilk değişkeniniz! :) Bu değişkeni işaret ettiği şeyi her zaman değiştirebilirsiniz:
+Yaşasın! İşte bu sizin ilk değişkenin! :) Bu değişkenin işaret ettiği şeyi her zaman değiştirebilirsin:
{% filename %}komut satırı{% endfilename %}
@@ -200,7 +204,7 @@ Farkettiğiniz gibi, program daha öncekilerinin aksine bu kez hiçbir cevap ver
'Suzan'
```
-Bu değişkeni fonksiyonlar içinde de kullanabilirsiniz:
+Bu değişkeni fonksiyonlar içinde de kullanabilirsin:
{% filename %}komut satırı{% endfilename %}
@@ -209,7 +213,7 @@ Bu değişkeni fonksiyonlar içinde de kullanabilirsiniz:
5
```
-Muhteşem değil mi? Tabikide değişkenler herhangi bir şey olabilir – sayılar da! Bunu deneyin:
+Muhteşem değil mi? Tabi ki değişkenler sayılar da dahil herhangi bir şey olabilir. Şunu deneyin:
{% filename %}komut satırı{% endfilename %}
@@ -220,9 +224,9 @@ Muhteşem değil mi? Tabikide değişkenler herhangi bir şey olabilir – sayı
24
```
-Peki ya değişkenin adını yanlış kullanırsak? Ne olacağını tahmin ediyor musunuz? Deneyelim!
+Peki ya değişkenin adını yanlış kullanırsak? Ne olacağını tahmin ediyor musun? Deneyelim!
-{% filename %}komut satırı{% endfilename %}
+{% filename %}{{ warning_icon }} komut satırı{% endfilename %}
```python
>>> city = "Tokyo"
@@ -232,7 +236,7 @@ Traceback (most recent call last):
NameError: name 'ctiy' is not defined
```
-Bir hata! Gördüğünüz gibi, Python bir çok çeşit hata çeşidine sahip ve bu hatanın adı **NameError**, yani İsimlendirme Hatası. Tanımlamadığınız bir değişkenin adını kullanmaya çalışırsanız, Python size bu hatayı verir. Eğer bu hata ile daha sonra karşılaşırsanız, kodunuzdaki değişkenlerin adını doğru yazıp yazmadığınızı kontrol edin.
+Bir hata! Gördüğünüz gibi, Python birçok hata çeşidine sahip ve bu hatanın adı **NameError**, yani İsimlendirme Hatası. Tanımlamadığınız bir değişkenin adını kullanmaya çalışırsanız, Python size bu hatayı verir. Eğer bu hata ile daha sonra karşılaşırsanız, kodunuzdaki değişkenlerin adını doğru yazıp yazmadığınızı kontrol edin.
Bununla biraz oynayıp, neler yapabildiğinizi görün!
@@ -256,7 +260,7 @@ Daha ileride göreceğimiz gibi `print()`, işlevlerin içindeyken bir şey yazd
## Listeler
-Python, string ve integerın yanı sıra, çok değişik türlerde nesnelere sahiptir. Şimdi, **liste** türünü tanıtacağız. Listeler tam da düşündüğünüz gibidir: diğer nesnelerin listesi olan nesne. :)
+Python, string (dize) ve integerın (tam sayı) yanı sıra, çok değişik türlerde nesnelere sahiptir. Şimdi, **liste** türünü tanıtacağız. Listeler tam da düşündüğünüz gibidir: diğer nesnelerin listesi olan nesne. :)
Yeni bir liste yaratmakla devam edelim:
@@ -313,7 +317,7 @@ Belki de sıralamayı ters çevirmek isteriz? Hadi yapalım!
[59, 42, 30, 19, 12, 3]
```
-Listenize bir şeyler eklemek isterseniz, şu komutu yazarak yapabilirsiniz:
+Kolay, değil mi? Listeye yeni bir eleman eklemek isterseniz, şu komutu yazarak yapabilirsiniz:
{% filename %}komut-satırı{% endfilename %}
@@ -325,7 +329,7 @@ Listenize bir şeyler eklemek isterseniz, şu komutu yazarak yapabilirsiniz:
Sadece listedeki ilk elemanı göstermek isterseniz, **indexes** (indeksler) ile yapabilirsiniz. İndeks elemanın listede nerede olduğunu belirten numaradır. Programcılar sıfırdan başlamayı tercih ederler, bu yüzden listedeki ilk eleman listenin 0. indeksindedir, sonraki 1. indeksindedir ve böyle devam eder. Şunu deneyin:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> print(lottery[0])
@@ -334,11 +338,11 @@ Sadece listedeki ilk elemanı göstermek isterseniz, **indexes** (indeksler) ile
42
```
-Gördüğünüz gibi, Listedeki nesnelere listenin ismi ve köşeli parantez içindeki nesnenin indeksini kullanarak ulaşabilirsin.
+Gördüğünüz gibi, listedeki nesnelere listenin ismi ve köşeli parantez içindeki nesnenin indeksini kullanarak ulaşabilirsin.
-Listenizde bir şeyler silmek için ve yukarıda öğrendiğimiz gibi **indeksleri** ve `pop()` metodunu kullanmanız gerekecektir. Bir örnek yapalım ve daha önce öğrendiklerimizi pekiştirelim; listemizden ilk numarayı sileceğiz.
+Listenizden bir şeyler silmek için, yukarıda öğrendiğimiz gibi **indeksleri** ve `pop()` metodunu kullanmamız gerekecektir. Bir örnekle öğrendiklerimizi pekiştirelim; listeden ilk numarayı sileceğiz.
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> print(lottery)
@@ -361,9 +365,9 @@ Bütün liste fonksiyonlarını Python dökümantasyonunun bu bölümünde bulab
> Evdeki okuyucular için: Bu kısım [Python Temelleri: Sözlükler](https://www.youtube.com/watch?v=ZX1CVvZLE6c) videosunda işlenmiştir.
-Sözlük listeye benzerdir fakat siz değerlere sayısal indeks yerine anahtar ile ulaşırsınız. Anahtar herhangi metin veya numara olabilir. Boş bir sözlük oluşturmak için kullanılan söz dizimi şöyledir:
+Sözlük listeye benzerdir ancak sözlük değerlerine indeks yerine anahtar ile ulaşılır. Anahtar metin veya numara olabilir. Boş bir sözlük oluşturmak için kullanılan söz dizimi şudur:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> {}
@@ -372,15 +376,15 @@ Sözlük listeye benzerdir fakat siz değerlere sayısal indeks yerine anahtar i
Bu boş bir sözlük oluşturduğunuzu gösterir. Yaşasın!
-Şimdi, bu komutu yazmayı deneyin (kendi bilgilerinizi de değiştirmeyi deneyiniz):
+Şimdi, bu komutu yazmayı deneyin (kendi bilgilerinizle değiştirmeyi deneyin):
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> participant = {'name': 'Ayşe', 'country': 'Türkiye', 'favorite_numbers': [7, 42, 92]}
```
-Bu komutla, üç anahtar-değer çifti ile `katılımcı` isminde bir değişken oluşturdunuz:
+Bu komutla, üç anahtar-değer çifti ile `participant` (katılımcı) isminde bir değişken oluşturdunuz:
- Anahtar `name` `'Ayşe'` (`string` nesnesi) değerine işaret eder,
- `country` `Türkiye` (bir diğer `string`) değerine),
@@ -388,7 +392,7 @@ Bu komutla, üç anahtar-değer çifti ile `katılımcı` isminde bir değişken
Bu söz dizimi ile tek bir anahtarın içeriğini kontrol edebilirsin:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> print(participant['name'])
@@ -399,7 +403,7 @@ Gördünüz mü, bu listeye benzer. Fakat indeksi hatırlamanıza gerek yok - sa
Python'a olmayan bir anahtarın değerini sorarsak ne olur? Tahmin edebiliyor musun? Hadi deneyip görelim!
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}{{ warning_icon }} komut satırı{% endfilename %}
```python
>>> participant['age']
@@ -415,7 +419,7 @@ Ne zaman sözlük veya liste kullanmalısın? Düşünmek için güzel bir nokta
- Sıralı elemanlara mı ihtiyacın var? Liste ile devam et.
- İleride hızlıca (anahtarlar ile) değerlere ulaşmak istediğin için anahtarlar ile ilişkilendirilmiş değerlere mi ihtiyacın var? Sözlük kullan.
-Sözlükler de listeler gibi *değişken*'dir, yani oluşturulduktan sonra değiştirilebilir anlamına gelmektedir. Oluşturulduktan sonra sözlüklere yeni anahtar-değer çifti ekleyebilirsiniz, bunun gibi:
+Sözlükler de listeler gibi değişebilirdir (*mutable*), yani oluşturulduktan sonra değiştirilebilirler. Oluşturulduktan sonra sözlüklere anahtar/değer çifti ekleyebilirsiniz, aşağıdaki gibi:
{% filename %}komut-satırı{% endfilename %}
@@ -423,33 +427,32 @@ Sözlükler de listeler gibi *değişken*'dir, yani oluşturulduktan sonra deği
>>> participant['favorite_language'] = 'Python'
```
-Listeler gibi,`len()` metodunu sözlüklerde kullanmak sözlükteki anahtar-değer çiftlerinin sayısını geri getirir. Devam et ve bu komutu yaz:
+Listeler gibi, `len()` metodu sözlükteki anahtar-değer çiftlerinin sayısını bize verir. Devam edip şu komutu yazın:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> len(participant)
4
```
-Umarım şimdiye kadar mantıklı gelmiştir. :) Sözlüklerle biraz daha eğlenceye hazır mısınız? Hayret verici bazı şeyler okumaya devam edin.
+Umarım şu ana kadar mantıklı gelmiştir :) Sözlüklerle biraz daha eğlenceye hazır mısın? İlginç şeyler için sonraki satıra atla.
Sözlükten bir maddeyi silmek için `pop()` metodunu kullanabilirsin. Mesela, `'favorite_numbers'` anahtarına karşılık gelen elemanı silmek istersen, sadece şu komutu yaz:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
->>> participant.pop('favorite_numbers')
-[7, 42, 92]
+>>> del participant['favorite_numbers']
>>> participant
-{'country': 'Poland', 'favorite_language': 'Python', 'name': 'Ola'}
+{'country': 'Türkiye', 'favorite_language': 'Python', 'name': 'Ayşe'}
```
-Çıktıdan görüldüğü gibi, ana değer eşleniği 'favorite_numbers' anahtarı silinmiştir.
+Çıktıdan görebildiğin gibi, 'favorite_numbers' anahtarına karşılık gelen anahtar-değer çifti silindi.
-Bunun yanı sıra, oluşturulmuş anahtar değerini değiştirebilirsiniz. Bunu yazın:
+Bunun yanı sıra, sözlükteki daha önce oluşturulmuş anahtarın değerini değiştirebilirsiniz. Şunu yazın:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> participant['country'] = 'Almanya'
@@ -457,7 +460,7 @@ Bunun yanı sıra, oluşturulmuş anahtar değerini değiştirebilirsiniz. Bunu
{'country': 'Almanya', 'favorite_language': 'Python', 'name': 'Ayşe'}
```
-Gördüğün gibi, `'country'` anahtarının değeri `'Poland'`‘den `'Germany’`'e çevrildi. :) Heyecan verici değil mi? Yaşasın! Bir başka harika şey öğrendin.
+Gördüğün gibi, `'country'` anahtarının değeri `'Türkiye'`den `'Almanya`'ya çevrildi. :) Heyecan verici değil mi? Yaşasın! Bir başka harika şey öğrendin.
### Özet
@@ -474,9 +477,9 @@ Bir sonraki part için heyecanlı mısınız? :)
> Evden okuyanlar için: Bu kısım [Python Basics: Comparisons](https://www.youtube.com/watch?v=7bzxqIKYgf4) vidyosunda anlatılıyor.
-Programlamanın büyük kısmı karşılaştırma içerir. Karşılaştırması en kolay olan şey nediir? Tabiki sayılar. Bakalım nasıl çalışıyor:
+Programlamanın önemli bir bölümü bir şeyleri karşılaştırmayı içerir. Karşılaştırılabilecek en kolay şey nedir? Tabii ki sayılar. Nasıl çalıştığını görelim (True = "Doğru", False= "Yanlış" demek).
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> 5 > 2
@@ -491,13 +494,13 @@ True
True
```
-Python karşılaştırma için numara verildi. Gördüğünüz gibi Python sadece numaraları karşılaştırmakla kalmıyor, aynı zamanda metod sonuçlarını karşılaştırabiliyor. Harika değil mi?
+Python'a birkaç sayı karşılaştırmasını söyledik. Gördüğünüz gibi, sadece sayıları karşılaştırmakla kalmadı, aynı zamanda metodların sonuçlarını da karşılaştırdı. Güzel değil mi?
İki sayının eşit olup olmadığını öğrenmek için neden iki tane eşittir işraretini `==` yan yana koyduk? Değişkenlere içerik verirken, tek `=` işaretini kullanıyoruz. Her zaman ama **her zaman** ikisini birden koyman gerekir – `==` – eğer birbirlerine eşit olup olmadıklarını kontrol etmek isterseniz. Sayıların birbirine eşit olmaması durumunu da kontrol edebiliriz. Bunun için, yukarıdaki örnekteki gibi `!=` sembolünü kullanıyoruz.
Python' a iki görev daha verin:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> 6 >= 12 / 2
@@ -506,16 +509,16 @@ True
False
```
-`>`‘ı ve `<`‘ı gördük, ama `>=` ve `<=` ne anlama geliyor? Onları böyle oku:
+`>`‘ı ve `<`‘ı gördük, ama `>=` ve `<=` ne anlama geliyor? Onları böyle okuyabilirsin:
- x `>` y : x büyüktür y
- x `<` y : x küçüktür y
- x `<=` y : x küçük eşittir y
- x `>=` y : x büyük eşittir y
-Harika! Biraz daha ister misiniz? Şunu deneyin:
+Harika! Birkaç denemeye daha ne dersiniz? Şunu deneyin:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> 6 > 2 and 2 < 3
@@ -528,12 +531,12 @@ True
Python'a istediğiniz kadar sayıyı karşılaştırmak için verebilirsiniz, ve size hepsinin cevabını verecek. Çok akıllı değil mi?
-- **and** - Eğer `and` işlecini kullanırsan, bütün komutların doğru olması için her iki kıyaslama da doğru olmak zorundadır
-- **or** - eğer `or` işlecini kullanırsan, bütün komutların doğru olması için kıyaslamalardan yalnızca biri doğru olmak zorundadır
+- **and** - Mantıkta kullandığımız "ve" anlamına geliyor, yani iki taraf da True, yani doğruysa, cevap da True olacak
+- **or** - Bu da "veya" anlamına geliyor, karşılaştırılan iki taraftan tek bir tanesi bile True ise bize True cevabını verecek
Portakallarla elmaları karşılaştılaştırabilir miyiz? Bunun Python'daki eşdeğerini deneyelim:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}{{ warning_icon }} komut satırı{% endfilename %}
```python
>>> 1 > 'django'
@@ -542,7 +545,7 @@ Geri görüş (en son çağrı):
HataTürü: ‘>’ 'int' ve 'str' örnekleri arasında desteklenmiyor
```
-Gördüğünüz gibi Python tam sayılar(`int`) ve kelimeleri(yani stringleri, `str`) karşılaştıramıyor. Onun yerine, **TypeError** göstererek iki farklı tipteki değişkenin karşılaştırılamayacağını söylüyor.
+Gördüğünüz gibi Python tam sayılar(`int`) ve kelimeleri(yani stringleri, `str`) karşılaştıramıyor. Onun yerine, **TypeError** göstererek iki farklı tipteki değişkenin karşılaştırılamayacağını söylüyor.
## Boolean (Mantıksal)
@@ -550,12 +553,12 @@ Bu arada, python'da yeni bir nesne türü öğrendin. Buna **Boolean** denir.
Yalnızca iki Boolean nesnesi vardır:
-- Doğru
-- Yalnış
+- True
+- False
-Ama Python un bunu algılaması için, her zaman 'True' (baş harf büyük karakter kalan küçük olacak şekilde). **true, TRUE, tRUE işe yaramaz -- sadece True doğru.** (Aynısı "False" için de geçerli.)
+Python'un bunu anlaması için her zaman "True" (ilk harf büyük, geri kalanları küçük) yazmanız gerekiyor. **true, TRUE, tRUE işe yaramaz -- sadece True doğru.** (Aynısı "False" için de geçerli.)
-Boolean'lar değişken de olabiliyor! Bakınız:
+Boolean'lar değişken de olabiliyor! Bakınız:
{% filename %}komut-satırı{% endfilename %}
@@ -582,7 +585,7 @@ Boolean'lar ile aşağıdaki komutları deneyerek biraz oynayın:
- `True or 1 == 1`
- `1 != 2`
-Tebrikler! Boolean'lar programlamadaki en havalı özelliklerden, ve az önce onları nasıl kullanmanız gerektiğini öğrendiniz!
+Tebrikler! Boolean'lar programlamadaki en havalı özelliklerden, ve az önce onları nasıl kullanmanız gerektiğini öğrendiniz!
# Kaydet!
@@ -595,9 +598,10 @@ Tebrikler! Boolean'lar programlamadaki en havalı özelliklerden, ve az önce on
- Yeni Python dosyasına kod kaydedin
- Çalıştırın!
-Kullanmakta olduğumuz Python yorumlayıcısından çıkmak için, basitçe `exit()` fonksiyonunu yaz
+Kullandığımız Python yorumlayıcısından çıkmak için sadece `
+exit() ` fonksiyonunu yazmanız yeterlidir
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
>>> exit()
@@ -611,16 +615,16 @@ Biraz önce [kod editörü](../code_editor/README.md) bölümünden bir kod edit
{% filename %}editör{% endfilename %}
```python
-print(‘Merhaba, Django kızları!’)
+print('Merhaba, Django girls!')
```
Açıkça, artık oldukça deneyimli Python programcısısın, bu yüzden bugün öğrendiğin kodları yazmaktan çekinme.
-Şimdi dosyayı tanımlayıcı bir isimle kaydetmemiz gerekir. Dosyanın ismine **python_intro.py** diyelim ve masaüstüne kaydedelim. Dosyaya istediğimiz ismi verebiliriz, burada önemli olan kısım dosyanın **.py** uzantısı ile bitmesidir. **.py** uzantısı işletim sistemimize bu dosyanın bir **Python çalıştırılabilir dosyası** olduğunu ve Python'un bu dosyayı çalıştırabileceğini belirtiyor.
+Şimdi dosyayı tanımlayıcı bir isimle kaydetmemiz gerekir. Dosyanın ismine **python_intro.py** diyelim ve masaüstüne kaydedelim. Dosyaya istediğimiz ismi verebiliriz, burada önemli olan kısım dosyanın **.py** uzantısı ile bitmesidir. **.py** uzantısı işletim sistemimize bu dosyanın bir **python çalıştırılabilir dosyası** olduğunu ve Python'un bu dosyayı çalıştırabileceğini belirtiyor.
> **Not** Kod editörleriyle ilgili en harika şeylerden birine dikkat etmelisiniz: renkler! Python konsolunda herşey aynı renkteydi; şimdi bakın `print` fonksiyonu dizeden farklı renkte. Bunun ismi "söz dizimi vurgulama" ve kod yazarken gerçekten yararlı bir özellik. Koddaki renkler ipucu verir, kapanmamış dizeler gibi yada aşağıda göreceğimiz (`def` fonksiyonu gibi imla hatası içeren anahtar kelimeler oalbilir). Bu kod düzenleyicisi kullanma nedenlerimizden biri. :)
-Dosyayı kaydettiğimize göre artık çalıştırabiliriz! Konsoldan **Klasör değiştirme** yaparak masaüstüne ulaşın, komut satırı bölümünde öğrendiklerinizi hatırlayın.
+Dosyayı kaydettiğimize göre artık çalıştırabiliriz! Konsoldan **klasör değiştirme ** yaparak masaüstüne ulaşın, komut satırı bölümünde öğrendiklerinizi hatırlayın.
@@ -629,7 +633,7 @@ Mac'de bu komut şunun gibi görünecektir:
{% filename %}komut-satırı{% endfilename %}
- $ cd ~/Masaüstü
+ $ cd ~/Desktop
@@ -637,11 +641,11 @@ Mac'de bu komut şunun gibi görünecektir:
-Linux’ta bunun gibi olacak (“Desktop” kelimesi yerel dilinize çevrilebilir):
+Linux'ta ise bu şekilde ("Desktop" kelimesi "Masaüstü" olarak da görünebilir):
{% filename %}komut-satırı{% endfilename %}
- $ cd ~/Masaüstü
+ $ cd ~/Desktop
@@ -652,7 +656,7 @@ Windows Komut İstemi’nde, bunun gibi olacak:
{% filename %}komut-satırı{% endfilename %}
- > cd %HomePath%\Masaüstü
+ > cd %HomePath%\Desktop
@@ -661,9 +665,9 @@ Windows Komut İstemi’nde, bunun gibi olacak:
Ve Windows Powershell’de, bunun gibi olacak:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
- > cd $Home\Masaüstü
+ > cd $Home\Desktop
@@ -680,7 +684,7 @@ Bir problem olursa yardım istemekten çekinmeyin.
Not: Windows'ta 'python3' bir komut olarak geçmez. Onun yerine, dosyayı çalıştırmak için 'python'ı kullanın:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
> python python_intro.py
@@ -690,21 +694,21 @@ Tamam! Bir dosyaya kaydedilen ilk Python programınızı çalıştırdınız. Ha
Şimdi programlamanın olmazsa olmaz bir aracını öğrenme zamanı:
-## eğer…elif… yoksa
+## If … elif … else
-Koddaki pek çok şey sadece karşılaşılan şartlar sağlandığında çalıştırılmalıdır. Python'da **eğer açıklamaları** olarak adlandırılan bir şey olmasının nedeni budur.
+Kodunuzdaki bir çok şeyi sadece belirli bir durum sağlanıyorsa çalıştırmayı isteyeceksiniz. İşte tam da bu yüzden Python'da **if deyimi** isminde bir yapı bulunuyor.
**python_intro.py** dosyasındaki kodunuzu şununla değiştirin:
{% filename %}python_intro.py{% endfilename %}
```python
-eğer 3 > 2 ise:
+if 3 > 2:
```
Eğer bunu kaydetmiş ve çalıştırmış olsaydık, bunun gibi bir hata görecektik:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}{{ warning_icon }} komut satırı{% endfilename %}
$ python3 python_intro.py
File "python_intro.py", line 2
@@ -717,15 +721,15 @@ Python bizden kendisine `3 > 2` durumu (veya `True`) sağlandığında neyi çal
{% filename %}python_intro.py{% endfilename %}
```python
-eğer 3 > 2 ise:
- print(‘Çalışıyor!’)
+if 3 > 2:
+ print('Çalışıyor!')
```
-4 tane boşluk karakteri bıraktığımıza dikkat ettiniz mi? Bunu yaparak if cümlesine yazdığım durum doğru olduğunda neyi çalıştırması gerektiğini Python'a söylemiş oluyoruz. Aslında tek bir boşlukla da yapabilirsiniz, ama hemen hemen bütün Python programcıları kodlarının temiz görünmesi için 4 boşluk bırakıyor. Tek `tab` karakteri de 4 boşluk yerine geçecektir.
+4 tane boşluk karakteri bıraktığımıza dikkat ettiniz mi? Bunu yaparak if ifadesine yazılan durum doğru olduğunda neyi çalıştırması gerektiğini Python'a söylemiş oluyoruz. Aslında tek bir boşlukla da yapabilirsiniz, ama hemen hemen bütün Python programcıları kodlarının temiz görünmesi için 4 boşluk bırakıyor. Metin düzenleyiciniz ayarlıysa bir tab karakteri de 4 boşluk karakteri olarak sayılacaktır. Seçiminizi yaptıktan sonra değiştirmeyin! Eğer girintilerde 4 boşluk kullandıysanız, gelecek girintilerde de 4 boşluk kullanmaya devam edin - aksi halde sorunlarla karşılaşabilirsiniz.
Kaydedip çalıştırmayı deneyelim:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
```python
$ python3 python_intro.py
@@ -736,20 +740,20 @@ Not: Windows'ta 'python3'ün komut olarak geçerli olmadığını unutmayın. Bu
### Ya bir koşul True (Doğru) değilse?
-Önceki örneklerde kod sadece koşullar sadece True olduğunda çalışıyordu. Ama Python ayrıca `elif` ve `else` ifadelerine de sahip:
+Önceki örneklerde kod sadece koşullar sadece True (doğru) olduğunda çalışıyordu. Ama Python ayrıca `elif` ve `else` ifadelerine de sahip:
{% filename %}python_intro.py{% endfilename %}
```python
-eğer 5 > 2 ise:
- print(‘5 gerçekten 2’den büyüktür’)
-Değilse:
- print(‘5 2’de büyük değildir’)
+if 5 > 2:
+ print("5 gerçekten de 2'den büyüktür")
+else:
+ print("5 2'den büyük değildir")
```
Bu kod çalıştığında aşağıdaki çıktıyı verecektir:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
$ python3 python_intro.py
5 gerçekten de 2'den büyüktür
@@ -760,13 +764,13 @@ Eğer 2 5'ten büyük bir sayı olsaydı, ikinci komut çalıştırılmış olac
{% filename %}python_intro.py{% endfilename %}
```python
-isim = ‘Sonja’
-eğer isim == ‘Ola’ ise:
- print(‘Selam Ola!’)
-elif isim == ‘Sonja’ ise:
- print(‘Selam Sonja!’)
-değilse:
- print(‘Selam yabancı!’)
+name = 'Zeynep'
+if name == 'Ayşe':
+ print('Selam Ayşe!')
+elif name == 'Zeynep':
+ print('Selam Zeynep!')
+else:
+ print('Selam yabancı!')
```
ve çalıştırılınca:
@@ -777,31 +781,31 @@ ve çalıştırılınca:
Selam Zeynep!
-Gördünüz mü? Eğer önceki if cümleleriniz doğru olmazsa kontrol edilmek üzere `elif` cümleleri ekleyebilirsiniz.
+Gördünüz mü? Eğer önceki if ifadeleriniz doğru olmazsa kontrol edilmek üzere `elif` ifadeleri ekleyebilirsiniz.
-`if` cümlenizden sonra istediğiniz kadar `elif` cümlesi ekleyebilirsiniz. Mesela:
+`if` ifadesinden sonra istediğiniz kadar `elif` ifadesi ekleyebilirsiniz. Mesela:
{% filename %}python_intro.py{% endfilename %}
```python
-volüm = 57
-eğer volüm < 20 ise:
- print(“Biraz sessiz.”)
-elif 20 <= volüm < 40 ise:
- print(“Arka plan müziği için güzel“)
-elif 40 <= volüm < 60 ise:
- print(“Mükemmel, tüm detayları duyabiliyorum“)
-elif 60 <= volüm < 80 ise:
- print(“Partiler için güzel”)
-elif 80 <= volüm < 100 ise:
- print(“Biraz gürültülü!”)
-değilse:
- print(“Kulaklarım ağrıyor! :(")
+volume = 57
+if volume < 20:
+ print("Çok sessiz.")
+elif 20 <= volume < 40:
+ print("Güzel bir fon müziği")
+elif 40 <= volume < 60:
+ print("Harika, her notayı duyabiliyorum")
+elif 60 <= volume < 80:
+ print("Parti başlasın")
+elif 80 <= volume < 100:
+ print("Biraz gürültülü!")
+else:
+ print("Kulaklarım ağrıyor! :(")
```
Python sırayla her sorguyu çalıştırır ve sonucu ona göre yazar:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
$ python3 python_intro.py
Harika, her notayı duyabiliyorum
@@ -816,10 +820,10 @@ Bakalım nasıl gözüküyor:
{% filename %}python_intro.py{% endfilename %}
```python
-# Çok yüksek veya çok düşük olduğunda volümü değiştirme
-Eğer volüm < 20 veya volüm > 80 ise:
- volüm = 50
- print(“Bu daha iyi!”)
+# Çok yüksek ya da çok düşük olduğunda ses seviyesini değiştirme
+if volume < 20 or volume > 80:
+ volume = 50
+ print("That's better!")
```
Kodun her satırı için bir açıklama yazmaya ihtiyacınız yoktur, ama kodunuzun niçin birşey yaptığını açıklamak ya da kompleks bir şey yaptığında bir özet sunmak için faydalıdırlar.
@@ -829,9 +833,9 @@ Kodun her satırı için bir açıklama yazmaya ihtiyacınız yoktur, ama kodunu
En son yaptığınız alıştırmalarda öğrendikleriniz:
- **kıyaslama yapmak** - Python'da `>`, `>=`, `==`, `<=`, `<` ve `ve`, `veya` operatörlerini kullanarak kıyaslama yapabilirsiniz
-- **Boole** – yalnızca iki değerden birini olabilir nesnesi türü: `doğru` veya `yanlış`
+- **Boolean** - İki farklı değer alabilen bir nesne tipidir: Ya `True` (doğru) olur ya da `False` (yanlış)
- **Dosya kaydetmek** – kodlarımızı dosyalara kaydederek daha büyük programları çalıştırabiliriz.
-- **if ... elif ... else** - cümlelerini sadece belirli durumlar sağlandığında çalıştırmak istediğimiz komutlar için kullanabiliriz.
+- **if ... elif ... else** - ifadelerini sadece belirli durumlar sağlandığında çalıştırmak istediğimiz komutlar için kullanabiliriz.
- **yorumlar** - kodunuzu belgelemenize izin verecek şekilde Python’un çalışmayacağı satırlar
Bu bölümün son kısmının zamanı geldi!
@@ -847,8 +851,9 @@ Fonksiyon Python tarafından işlenmesi gereken yönergeler dizisidir. Python'da
{% filename %}python_intro.py{% endfilename %}
```python
+python
def hi():
- print('Selam!')
+ print('Merhaba!')
print('Nasılsın?')
hi()
@@ -860,14 +865,14 @@ Fonksiyon adını neden dosyanın en altına yazdığımızı merak edebilirsini
Haydi şimdi bunu çalıştıralım ve neler olacağını görelim:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
$ python3 python_intro.py
Merhaba!
Nasılsın?
-Not: Eğer çalışmadıysa panik yapmayın! Bilgi çıkışı neden olduğu hakkında bir fikir verir:
+Not: Eğer çalışmadıysa panik yapmayın! Çıktı neden olduğu hakkında bir fikir verir:
- Eğer bir `NameError` alırsanız, muhtemelen yanlış bir şey yazdığınız anlamına gelir, bu nedenle `def hi():` lı fonksiyonu oluştururken ve `hi()` lıyı çağırırken aynı adı kullanıp kullanmadığınızı kontrol etmelisiniz.
- Eğer bir `IndentationError` alırsanız,`print` dizelerinin her ikisinin de satır başında aynı boşluğa sahip olduğunu kontrol et: python fonksiyonun içindeki tüm kodların düzenli bir şekilde hizalanmasını ister.
@@ -887,10 +892,10 @@ Gördüğünüz gibi, fonksiyonumuza `name` (isim) adında bir parametre ekledik
```python
def hi(name):
- if name == 'Ola':
- print("Merhaba Ola!')
- elif name == 'Sonja':
- print('Merhaba Sonja!')
+ if name == 'Ayşe':
+ print("Merhaba Ayşe!')
+ elif name == 'Zeynep':
+ print('Merhaba Zeynep!')
else:
print('Merhaba anonim!')
@@ -899,7 +904,7 @@ hi()
Unutmayın: `if` içerisindeki `print` fonksiyonundan önce dört tane boşluk var. Bunun sebebi sadece durum sağlandığında çalışmasını istememiz. Bakalım nasıl çalışıyor:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}{{ warning_icon }} komut satırı{% endfilename %}
$ python3 python_intro.py
Traceback (most recent call last):
@@ -913,23 +918,23 @@ Unutmayın: `if` içerisindeki `print` fonksiyonundan önce dört tane boşluk v
{% filename %}python_intro.py{% endfilename %}
```python
-hi("Ola")
+hi("Ayşe")
```
Ve tekrar çalıştıralım:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
$ python3 python_intro.py
Selam Ayşe!
-Ve eğer ismi değiştirirsek ne olur?
+Eğer ismi değiştirirsek ne olur?
{% filename %}python_intro.py{% endfilename %}
```python
-hi("Sonja")
+hi("Zeynep")
```
Ve çalıştırın:
@@ -940,14 +945,14 @@ Ve çalıştırın:
Selam Zeynep!
-Şimdi, eğer oraya başka bir isim yazarsanız ne olacağını düşünüyorsunuz?(Ola veya Sonja değil.) Deneyin ve eğer doğruysa görün. Bunu yazdırması gerekir:
+Peki Ayşe veya Zeynep dışında başka bir isim yazdığımızda ne olacağını tahmin edebiliyor musunuz? Deneyin ve tahmininizin doğru olup olmadığını görün. Şunun gibi bir şey yazmalı:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
Selam yabancı!
-Süper değil mi? Böylece fonksiyona göndereceğiniz isim değiştiğinde aynı kodu tekrar tekrar yazmanıza gerek kalmayacak. Ve tam olarak bu nedenle fonksiyonlara ihtiyacımız var- kodunu hiçbir zaman tekrarlamak istemiyorsun!
+Süper değil mi? Böylece fonksiyona göndereceğiniz isim değiştiğinde aynı kodu tekrar tekrar yazmanıza gerek kalmayacak. İşte fonksiyonlara tam da bu yüzden ihtiyacımız var - aynı kodu tekrar yazmaya gerek yok!
Hadi daha zekice bir şey yapalım - İkiden fazla isim var ve her biri için bir şart yazmak zor olur değil mi?
@@ -957,12 +962,12 @@ Hadi daha zekice bir şey yapalım - İkiden fazla isim var ve her biri için bi
def hi(name):
print('Merhaba ' + name + '!')
-hi("Rachel")
+hi("Seda")
```
Şimdi kodu çağıralım:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
$ python3 python_intro.py
Selam Seda!
@@ -976,7 +981,7 @@ Tebrikler! Az önce fonksiyonları nasıl yazacağınızı öğrendiniz! :)
Bu da zaten son parça. Hızlı oldu, değil mi? :)
-Programcılar kendilerini tekrar etmeyi sevmezler. Programlama tamamen işleri otomatize etmedir, bu yüzden her insanı ismiyle selam istemeyiz, değil mi? İşte burası döngülerin devreye girdiği yerdir.
+Programcılar kendilerini tekrar etmeyi sevmezler. Programlama tamamen işleri otomatize etmedir, bu yüzden her insanı ismiyle selamlamak istemeyiz, değil mi? İşte burası döngülerin devreye girdiği yerdir.
Hala listeleri hatırlıyoruz değil mi? Haydi bir kızlar listesi yapalım:
@@ -991,10 +996,10 @@ Diyelim ki hepsine merhaba demek istiyoruz. Az önce yazdığımız `hi` fonksiy
{% filename %}python_intro.py{% endfilename %}
```python
-kızlar içindeki isimler:
+for name in girls:
```
-Bu ```için``` ifade şunlara benzer davranış gösteriyor ```eğer``` ifade: aşağıdaki kodların ikiside girintili ve dört boşluk olması lazım.
+`for` un davranışı `if` e benziyor; aşağıdaki kodda her iki satır girintili olmalı (dört boşluk ile).
Dosyada yer alacak tam kod aşağıdadır:
@@ -1004,7 +1009,7 @@ Dosyada yer alacak tam kod aşağıdadır:
def hi(name):
print('Merhaba ' + name + '!')
-girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'Sen']
+girls = ['Seda','Gül', 'Pınar', 'Ayşe', ' 'Sen']
for name in girls:
hi(name)
print('Sıradaki kız')
@@ -1012,19 +1017,19 @@ for name in girls:
Ve onu çalıştırdığımız zaman:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
$ python3 python_intro.py
Selam Seda!
- Sıradaki
+ Sıradaki kız
Selam Gül!
- Sıradaki
+ Sıradaki kız
Selam Pınar!
- Sıradaki
+ Sıradaki kız
Selam Ayşe!
- Sıradaki
+ Sıradaki kız
Selam Sen!
- Sıradaki
+ Sıradaki kız
Gördüğünüz gibi, `for` cümlesinin içine boşluk karakteri ile koyduğunuz her şey `girls` listesi için tekrarlanıyor.
@@ -1040,7 +1045,7 @@ for i in range(1, 6):
Çalıştırırsak:
-{% filename %}komut-satırı{% endfilename %}
+{% filename %}komut satırı{% endfilename %}
1
2
@@ -1051,14 +1056,14 @@ for i in range(1, 6):
`range` fonksiyonu birbirini takip eden sayılardan bir liste oluşturur (bu sayıları da siz parametre olarak yazarsınız).
-Sizin verdiğiniz ikinci parametrenin listede olmadığına dikkat edin. Yani `range(1, 6)` 1'den 5'e kadar sayıyor, 6 dahil edilmiyor. Yani çünkü “aralık” yarı açıktır, ve yani ilk değeri içerir, ama son değeri içermez.
+Sizin verdiğiniz ikinci parametrenin listede olmadığına dikkat edin. Yani `range(1, 6)` 1'den 5'e kadar sayıyor, 6 dahil edilmiyor. Çünkü “aralık” yarı açıktır, ve yani ilk değeri içerir, ama son değeri içermez.
## Özet
İşte bu. **Harikasın, süpersin!** Bu bölüm biraz zordu, kendinle gurur duymalısın. Biz buraya kadar geldiğin için seninle gurur duyuyoruz!
-Resmi ve tam python öğreticisi için https://docs.python.org/3/tutorial/ adresini ziyaret edin. Bu size dil hakkında daha kapsamlı ve eksiksiz bir çalışma sunacaktır. Şerefe :)
+Resmi ve tam python tutorialı için https://docs.python.org/3/tutorial/ adresini ziyaret edin. Bu size dil hakkında daha kapsamlı ve eksiksiz bir çalışma sunacaktır. Teşekkürler :)
Sonraki bölüme geçmeden başka bir şey yapmak isteyebilirsin. -gerin, biraz etrafta gezin, gözlerini dinlendir- :)
-![Cupcake (Kek)](images/cupcake.png)
\ No newline at end of file
+![Cupcake](images/cupcake.png)
\ No newline at end of file
diff --git a/tr/template_extending/README.md b/tr/template_extending/README.md
index 4610d42c751..5faa897bef9 100644
--- a/tr/template_extending/README.md
+++ b/tr/template_extending/README.md
@@ -25,7 +25,7 @@ Sonra bunu açalım ve `post_list.html` dosyasındaki her şeyi aşağıdaki gib
{% load static %}
- Django Girls Blog
+ Django Girls blog
diff --git a/tr/whats_next/README.md b/tr/whats_next/README.md
index b5ca4bfb50c..50e8332f909 100644
--- a/tr/whats_next/README.md
+++ b/tr/whats_next/README.md
@@ -10,7 +10,7 @@ Sonra, güncel kalmak için Django Girls'ü [Facebook](http://facebook.com/djang
### Daha geniş kapsamlı kaynaklar önerebilir misiniz?
-Evet! İlk olarak, devam et ve diğer kitabımız [Django Girls: Uzantılar](https://djangogirls.gitbooks.io/django-girls-tutorial-extensions/content/) kitabımızı dene.
+Evet! Öncelikle [Django Girls Tutorial: Eklentiler](https://tutorial-extensions.djangogirls.org/) isimli diğer kitabımızı dene.
Daha sonra, aşağıdaki listedeki kaynakları deneyebilirsin. Hepsi birden çok önerilir!