Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TR] Turkish language translations #1393

Merged
merged 19 commits into from Apr 22, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Expand Up @@ -88,4 +88,4 @@ Temporary Items

# intelliJ idea And other editors
.idea
*.iml
*.iml
2 changes: 1 addition & 1 deletion en/lessons/basics/strings.md
Expand Up @@ -157,4 +157,4 @@ iex> Anagram.anagrams?(3, 5)
iex:11: Anagram.anagrams?/2
```

As you can see, the last call to `anagrams?` caused a FunctionClauseError. This error is telling us that there is no function in our module that meets the pattern of receiving two non-binary arguments, and that's exactly what we want, to just receive two strings, and nothing more.
As you can see, the last call to `anagrams?` caused a FunctionClauseError. This error is telling us that there is no function in our module that meets the pattern of receiving two non-binary arguments, and that's exactly what we want, to just receive two strings, and nothing more.
122 changes: 122 additions & 0 deletions tr/lessons/advanced/behaviours.md
@@ -0,0 +1,122 @@
---
version: 1.0.1
title: Davranışlar
redirect_from:
- /lessons/advanced/behaviours/
---

Önceki derste Typespec'leri öğrendik, burada bu özellikleri uygulamak için bir modülün nasıl gerekeceğini öğreneceğiz. Elixir'de, bu işlevsellik davranışlar olarak adlandırılır.

{% include toc.html %}

## Kullanımları

Bazen modüllerin ortak bir API'yi paylaşmasını istersiniz, bunun için Elixir'deki çözüm davranışlardır. Davranışlar iki ana rol oynar:

+ Uygulanması gereken bir dizi işlevi tanımlamak
+ Bu setin gerçekten uygulanıp uygulanmadığını kontrol etmek

Elixir, `GenServer` gibi birtakım davranışlar içerir, ancak bu derste bunu kullanmak yerine kendimiz bir adet yaratmaya odaklanacağız.

## Davranışı tanımlama

Davranışları daha iyi anlamak için bir işçi modülü için bir tane uygulayalım. Bu işçilerin iki işlevi yerine getirmeleri beklenir: `init/1` ve `perform/2`

Bunu başarmak için, `@callback` direktifini, `@spec` ile benzer sözdizimiyle kullanacağız. Bu, __required__ işlevini tanımlar; `@macrocallback` kullanabiliriz. İşçilerimiz için `init/1` ve `perform/2` fonksiyonlarını belirleyelim:

```elixir
defmodule Example.Worker do
@callback init(state :: term) :: {:ok, new_state :: term} | {:error, reason :: term}
@callback perform(args :: term, state :: term) ::
{:ok, result :: term, new_state :: term}
| {:error, reason :: term, new_state :: term}
end
```

Burada `init/1` değerini herhangi bir değeri kabul etmek ve `{: ok, state}` veya `{: error, reason}` demetini döndürmek olarak tanımladık. `Perform / 2` işlevimiz, başlattığımız durumla birlikte işçimiz için bazı argümanlar alacak, ve sonuçlandırmak için `{:ok, result, state}` veya `{:error, reason, state}` gibi durum demetlerini bekleyecek.

## Davranışları kullanma

Davranışlarımızı tanımladığımıza göre, hepsini aynı genel API'yi paylaşan çeşitli modüller oluşturmak için kullanabiliriz. Modülümüze bir davranış eklemek, `@behaviour` özniteliği ile kullanılır.

Yeni davranışımızı kullanarak, uzak bir dosyayı indirecek ve yerel olarak kaydedecek bir modül oluşturalım:

```elixir
defmodule Example.Downloader do
@behaviour Example.Worker

def init(opts), do: {:ok, opts}

def perform(url, opts) do
url
|> HTTPoison.get!()
|> Map.fetch(:body)
|> write_file(opts[:path])
|> respond(opts)
end

defp write_file(:error, _), do: {:error, :missing_body}

defp write_file({:ok, contents}, path) do
path
|> Path.expand()
|> File.write(contents)
end

defp respond(:ok, opts), do: {:ok, opts[:path], opts}
defp respond({:error, reason}, opts), do: {:error, reason, opts}
end
```

Ya da bir dosya dizisini sıkıştıran bir işçi edinmeye çalışalım, Bu da mümkün:

```elixir
defmodule Example.Compressor do
@behaviour Example.Worker

def init(opts), do: {:ok, opts}

def perform(payload, opts) do
payload
|> compress
|> respond(opts)
end

defp compress({name, files}), do: :zip.create(name, files)

defp respond({:ok, path}, opts), do: {:ok, path, opts}
defp respond({:error, reason}, opts), do: {:error, reason, opts}
end
```

Yapılan iş farklı olsa da, genele açık bir API bulunmuyor ve bu modülleri kullanan herhangi bir kod, beklendiği gibi yanıt vereceğini bilerek onlarla etkileşim kurabilir.

Bu bize, farklı görevleri yerine getiren genele açık API'sine uyan, herhangi bir sayıda işçi yaratma becerisi kazandırır.

Bir davranış ekleyeceğiz, ancak gerekli tüm fonksiyonları yerine getiremediğimizde, derleme zamanı uyarısı karşımıza çıkacak. Bu eylemi görmek için `init/1` satırını kaldırarak `Example.Compressor` kodumuzu değiştirelim:

```elixir
defmodule Example.Compressor do
@behaviour Example.Worker

def perform(payload, opts) do
payload
|> compress
|> respond(opts)
end

defp compress({name, files}), do: :zip.create(name, files)

defp respond({:ok, path}, opts), do: {:ok, path, opts}
defp respond({:error, reason}, opts), do: {:error, reason, opts}
end
```

Şimdi kodumuzu derlediğimizde aşağıdaki gibi bir uyarı görmeliyiz:

```shell
lib/example/compressor.ex:1: warning: undefined behaviour function init/1 (for behaviour Example.Worker)
Compiled lib/example/compressor.ex
```

Bu kadar! Şimdi başkaları ile davranışlar paylaşmaya ve oluşturmaya hazırız.
20 changes: 12 additions & 8 deletions tr/lessons/basics/basics.md
@@ -1,6 +1,8 @@
---
version: 0.9.0
title: Temeller
version: 1.1.2
title: Basics
redirect_from:
- /lessons/basics/basics/
---

Temel veri tipleri ve temel operasyonlar ile başlayalım.
Expand Down Expand Up @@ -33,12 +35,14 @@ Elixir `iex` isimli, Elixir ifadelerini kolayca çalıştırmanız için etkile

Birkaç basit ifade yazmayı deneyelim:

iex> 2+3
5
iex> 2+3 == 5
true
iex> String.length("Pijamalı hasta yağız şoföre çabucak güvendi")
43
```elixir
iex> 2+3
5
iex> 2+3 == 5
true
iex> String.length("The quick brown fox jumps over the lazy dog")
43
```

Henüz birşey anlamadıysanız endişe etmeyin, ama umarım bir fikir edinmişsinizdir.

Expand Down
2 changes: 1 addition & 1 deletion tr/lessons/basics/comprehensions.md
@@ -1,6 +1,6 @@
---
version: 1.1.0
title: Comprehensions
title: Comprehensions(Kavramlar)
redirect_from:
- /lessons/basics/comprehensions/
---
Expand Down
4 changes: 3 additions & 1 deletion tr/lessons/basics/enum.md
@@ -1,6 +1,8 @@
---
version: 1.3.0
version: 1.4.0
title: Enum
redirect_from:
- /lessons/basics/enum/
---

Koleksiyonlarin numaralandirilmasi icin kullanilan sabit degerler algoritmalari.
Expand Down
3 changes: 2 additions & 1 deletion tr/lessons/basics/functions.md
@@ -1,5 +1,5 @@
---
version: 1.0.1
version: 1.0.2
title: Fonksiyonlar
redirect_from:
- /lessons/basics/functions/
Expand Down Expand Up @@ -57,6 +57,7 @@ An error has occurred!
Bu fonksiyonlara isim tanımlaya bilir ve daha sonra gerekli olduğunda kolayca çağıra biliriz. Adlandırılmış bir fonksiyon tanımlamak için `def` kullanılır . Şuan için adlandırılmış fonksiyonları ele alacağız, Modülleri bir sonraki ders inceleyeceğiz.

Bir modülde tanımlanmış fonksiyonlar başka modüller tarafında da kullanılır. Bu Elixir'in yararlı özelliklerinden birisidir:

```elixir
defmodule Greeter do
def hello(name) do
Expand Down
117 changes: 117 additions & 0 deletions tr/lessons/basics/mix-tasks.md
@@ -0,0 +1,117 @@
---
version: 1.0.1
title: Özel Mix Görevleri
redirect_from:
- /lessons/basics/mix-tasks/
---

Elixir projeleriniz için özel Mix görevleri oluşturma.

{% include toc.html %}

## Giriş

Özel Mix görevlerini ekleyerek Elixir uygulamalarınızın işlevselliğini genişletmek genellikle kullanılan bir özelliktir.
Projelerimiz için özel Mix görevlerinin nasıl oluşturulacağını öğrenmeden önce hali hazırda var olan bir projeye bakalım:

```shell
$ mix phoenix.new my_phoenix_app

* creating my_phoenix_app/config/config.exs
* creating my_phoenix_app/config/dev.exs
* creating my_phoenix_app/config/prod.exs
* creating my_phoenix_app/config/prod.secret.exs
* creating my_phoenix_app/config/test.exs
* creating my_phoenix_app/lib/my_phoenix_app.ex
* creating my_phoenix_app/lib/my_phoenix_app/endpoint.ex
* creating my_phoenix_app/test/views/error_view_test.exs
...
```

Yukarıdaki kabuk komutundan da görebileceğimiz gibi, Phoenix Framework'ünün yeni bir proje oluşturmak için özel bir Mix görevi vardır. Ya biz kendi projemiz için benzer bir şey oluşturmak istersek? İyi haber, Elixir bunu bizim için kolaylaştırıyor.

## Kurulum

Şimdi basit bir Mix projesi oluşturalım.

```shell
$ mix new hello

* creating README.md
* creating .gitignore
* creating mix.exs
* creating config
* creating config/config.exs
* creating lib
* creating lib/hello.ex
* creating test
* creating test/test_helper.exs
* creating test/hello_test.exs

Your Mix project was created successfully.
You can use "mix" to compile it, test it, and more:

cd hello
mix test

Run "mix help" for more commands.
```

Şimdi, Bizim için Mix tarafından oluşturulan **lib/hello.ex** dosyaya, basit "Hello, World!" çıktısı veren bir fonksiyon oluşturalım.

```elixir
defmodule Hello do
@doc """
Output's `Hello, World!` everytime.
"""
def say do
IO.puts("Hello, World!")
end
end
```

## Özel Mix Görevi

Şimdi özel Mix görevimizi oluşturalım. Yeni bir dizin ve dosya oluşturalım **hello/lib/mix/tasks/hello.ex**. Bu dosyaya 7 satırlık Elixir kodumuzu ekleyelim.

```elixir
defmodule Mix.Tasks.Hello do
use Mix.Task

@shortdoc "Simply runs the Hello.say/0 command."
def run(_) do
# calling our Hello.say() function from earlier
Hello.say()
end
end
```

Defmodule fonksiyonunu `Mix.Tasks` ve komut satırından çağırmak istediğimiz isim ile başlattığımıza dikkat edin.İkinci satırda `Mix.Tasks` davranışını ad alanına getiren `use Mix.Task` işlevini tanımlıyoruz. Daha sonra, şu an için herhangi bir argüman almayan `run` fonksiyonunu oluşturuyoruz. Bu fonksiyonun içine de `Hello` modülünü ve `say` fonksiyonunu çağırıyoruz.


## Mix Görevlerini Çalıştırmak

Şimdi Mix görevlerimizi kontrol edelim. Proje dizininde olduğumuz sürece çalışmaları gerekiyor. Komut satırından `mix hello` komutunu çağırdığımızda aşağıdaki çıktıyı görmemiz gerekiyor:

```shell
$ mix hello
Hello, World!
```

Mix kullanımı oldukça kolaydır. Herkes tarafından yazım hatası yapabildiği için (fuzzy) bulanık string eşleşme ile bize önerilerde bulunur :

```shell
$ mix hell
** (Mix) The task "hell" could not be found. Did you mean "hello"?
```

Yeni bir özellik kullandığımızı fark ettiniz mi, `@shortdoc`? Bu uygulamamızı dağıttığımızda kullanıcılara kolaylık sağlar. Terminalde `mix help` komutunu çalıştırdığımızda komutlar hakkında kısa açıklamalar sunar.

```shell
$ mix help

mix app.start # Starts all registered apps
...
mix hello # Simply calls the Hello.say/0 function.
...
```