/

Django Multilanguage

Bu makalemizde djangoda static verilerin farklı dillere çevrilmesinden bahsedeceğiz. Sonraki makalemizde ise Djano Modellerimizi de farklı dillere çevireceğiz.

İlk başta yeni bir django projesi oluşturalım. Buraları bildiğinizi varsayarak buraları anlatmayacağım.

İlk başta bilgisayarımıza gettext paketini kurmamız gerekiyor.

sudo apt install gettext

Windows için de https://mlocati.github.io/articles/gettext-iconv-windows.html buradan indirebilirsiniz.

Gelelim settings.py dosyamız üzerinden gerekli ayarlamalara.

LANGUAGE_CODE = 'tr'

USE_TZ = True

USE_L10N = True

USE_I18N = True

TIME_ZONE = 'UTC'

Bu ayarlamaları da settings.py dosyamıza yazdığımıza göre işlemlerimize devam edelim.Sitemizde hangi dillerin olacağını belirlemek için settings.py dosyamıza bunu da eklememiz gerekiyor.

from django.utils.translation import gettext_lazy as _

LANGUAGES = (
    ('en', _('English')),
    ('tr', _('Turkish')),
)

Hemen burada yaptıklarımızı anlatalım. Türkçe ve İngilizce olarak iki dilin olduğunu ayarlıyoruz ve bunları gettext_lazy adında bir methoda parametre vererek yazıyoruz. Fark ederseniz gettext_lazy methodunu _ (alt tire) işareti ile kullanıyoruz. Bunun sebebi hem projelerde hep bu şekilde kullanılmasından hem de uzun uzun yazmak yerine _ ile işlerimizi halledebilmemizden dolayı. Özetçe Translate yani farklı dillere çevirmek istediğimiz kelimeleri/cümleleri bu method içerisine almak zorundayız.

Şimdi ise yine settings.py dosyamızda MIDDLEWARE’lerimize bir adet daha eklememiz gerekiyor.

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware', # YENİ
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Yeni eklediğimiz middleware:

'django.middleware.locale.LocaleMiddleware'

Şimdi ise sırada yeni bir ayar var settings.py dosyamız üzerinden yapacak olduğumuz.

LOCALE_PATHS = [
    BASE_DIR / 'locale/',
]

Ana projemize locale/ adında bir boş klasör oluşturuyoruz ve ardından bu klasörün içerisine de çevrilmesini istediğimiz dillerin klasörlerini oluşturuyoruz. Yani şu şekilde olacak.

locale
├── en
└── tr

Bu en ve tr klasörlerinin içerisine birazdan yapacak olduğumuz değişiklikler sayesinde farklı dosyalar gelecek.

Şimdi ise basit app oluşturup basit bir model oluşturalım.

from django.db import models
from django.utils.translation import gettext_lazy as _


class Article(models.Model):
    title = models.CharField(_('Başlık'), max_length=50)
    description = models.TextField(_('Açıklama'))

    def __str__(self):
        return self.title

Bu da çok basit bir model oldu ancak olsun. Gördüğünüz gibi alt tire ile çevrilecek alanları methodumun içerisine aldım. Gerekli makemigrations ve migrate işlemlerini de yaptıktan sonra admin panelimize oluşturduğumuz modeli kayıt edelim.

Ve template’imiz üzerinden de verileri çevirmek için bir html sayfası oluşturup viewlerimizi de ayarlayalım.

{% load i18n %}

{% trans 'Merhaba' %}

Template’imiz üzerinden de translate /çevirmek istediğimiz bir kelime varsa onu da bu şekilde yapacağız.

Şuan merhaba olarak gözüküyor. Şimdi devam edelim.

django-admin makemessages --all --ignore=env

Burada dikkat etmeniz gereken — ignore=env yazdık. oluşturduğunuz sanal ortamın ismi ile aynı olmak zorundadır aksi taktirde hata alabilirsiniz.

Gördüğünüz gibi bu komutu çalıştırdıktan sonra locale dosyamıza gerekli .po uzantılı dosyalar oluşturuldu. Bu dosyalarımızı inceleyelim hemen.

Ve gördüğünüz gibi çevrilmesini istediğimiz kelimelerin buraya geldiğini hatta hangi dosyada kaçıncı satıra kadar görebiliyoruz. msgstr kısmına da çevrilecek dildeki tercümesini yazıyoruz. Yazdıktan sonra ise bu komutu çalıştıracağız.

Düzenleyelim hemen.

Şimdi ise şu komutu çalıştıralım.

django-admin compilemessages --ignore=env

Artık .mo uzantılı da dosyaların geldiğini görebiliriz.Son olarak base proje klasörünün içerisindeki urls.py dosyasını düzenleyeceğiz.

from django.contrib import admin
from django.urls import path
from django.conf.urls.i18n import i18n_patterns

urlpatterns = [
    path('admin/', admin.site.urls),
]

urlpatterns = [
    *i18n_patterns(*urlpatterns, prefix_default_language=False),
    ]

Şimdi ise bakalım çalışıyor mu..

Default olarak Merhaba yazısı geliyor. Şimdi ise url pathimize /en/ ekleyerek bakalım.

Gördüğünüz gibi çevirme işlemimiz başarıyla gerçekleşti. Dili ayarlamak için sitenizde bir buton oluşturabilirsiniz. Onun için de kullanabileceğiniz bir view yazacağım.

from urllib.parse import urlparse
from django.conf import settings
from django.http import HttpResponseRedirect
from django.urls.base import resolve, reverse
from django.urls.exceptions import Resolver404
from django.utils import translation


def set_language(request, language):
    for lang, _ in settings.LANGUAGES:
        translation.activate(lang)
        try:
            view = resolve(urlparse(request.META.get("HTTP_REFERER")).path)
        except Resolver404:
            view = None
        if view:
            break
    if view:
        translation.activate(language)
        next_url = reverse(view.url_name, args=view.args, kwargs=view.kwargs)
        response = HttpResponseRedirect(next_url)
        response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language)
    else:
        response = HttpResponseRedirect("/")
    return response

Url için de yeni olan path’imizi ekleyelim.

urlpatterns = [
    *i18n_patterns(*urlpatterns, prefix_default_language=False),
   
   # YENİ
    path("set_language/<str:language>", set_language, name="set-language"),
]

Bu view’i template’iniz üzerinden bu şekilde kullanabilirsiniz.Tabii ki de dil değiştirme template’ini özelleştirebilirsiniz kendi css sınıflarınızı belirterek.

<a href="{% url 'set-language' 'tr' %}">TR</a>
<a href="{% url 'set-language' 'en' %}">EN</a>

Yorumlar

    Henüz Hiç Yorum Yapılmamış

Yorum Yap