Django için Çoklu Dil Desteği

Standard

Herkese merhabalar,

Oluşturduğumuz sitelerin çoklu-dil özelliğine sahip olması, projelerin ilerleyen aşamalarında olmazsa olmaz bir özellik. Django uygulamalarımızda bu özelliği nasıl kolayca ekleyebileceğimize hep beraber bakalım…

Çoklu-dil özelliği eklemek için 2 seçeneğimiz var,

  1. Projenin başlangıcında çoklu dil eklemek
  2. Projenin ilerleyen aşamalarında ihtiyaç duyulduğunda middleware yazarak çoklu dil özelliği kazandırmak

İlk senaryodan başlayarak ilerlersek;

Django’ya Başlangıçta Çoklu-dil Özelliğini Eklemek

Projemizi oluşturduktan sonra, settings.py altına aşağıdaki 2 satırı ekliyoruz;

LANGUAGE_CODE = 'en-us'
USE_L10N = True

Bu parametreler, bizim varsayılan dil seçeneğimizi ve template altında dil çevirimlerini yapabilmemize imkan sağlayan özellikleri aktive ediyor.

Şimdi örnek bir template oluşturuyoruz;

{% load i18n %}
<!doctype html>
<html lang="en">
<head>
    <title>Sample Page for Testing Multilanguage</title>
</head>
<body>
<div>
    <h1>{% trans "Hello World!" %} (en) !</h1>
    <h1> {{ sample_text }}</h1>
</div>
</body>
</html>

Buradaki h1 tagi ile eklediğim string, örnek bir template içerisindeki metni nasıl çoklu-dil özelliği ile dönüştürebileceğimizi, altındaki sample_text ise backend tarafından gelen bir değişkenin ön-yüz de nasıl değiştiğini görmemiz için örneklerimiz olacak.

view.py altında, örneklerimizi dil bazlı kullanabilmek “gettext” fonksiyonunu kullanıyoruz. Bu fonksiyon django içerisinde locales dizini altında olan dillerden bizim metnimize uygun dil karşılığı olan metni getirmemize yarıyor. Eğer bir karşılık bulamazsa varsayılan olarak yazdığımız metni döndürüyor. 3. satırdaki translation ise backend tarafında dil özelliğini manipüle gibi (veya istediğimizde geçerli olan dilip get_language() ile getirebilmemiz gibi ) özelliklere erişmemizi sağlıyor.

Örneğimize uygulursak;

from django.shortcuts import render
from django.utils.translation import gettext as _
from django.utils import translation


def index(request):
    sample_text = _("Hello world from multi language app!")
    return render(request, 'home.html', {'sample_text': sample_text})


def index_tr(request):
    with translation.override("tr"):
        sample_text = _("Hello world from multi language app!")
    return render(request, 'home.html', {'sample_text': sample_text})

Oluşturduğumuz sayfaları urls.py altına ekleyelim;

  path('', index),
  path('tr/', index_tr),

Şimdi ilk PO yani dil dosyamızı django’nun otomatik oluşturmasını sağlamak için;

mkdir locale
django-admin makemessages -l tr

komutunu vererek Türkçe dil desteği için gereken şablonun ve dosyaların django tarafından oluşturulmasını sağlıyoruz. Eğer herşey yolunda gittiyse, “locale” dizininin altında tr dosyamızı görüyoruz olmalıyız;

Burada metinlerin karşılıklarını yazıp tamamladıktan sonra Django’nun kullanabilmesi için “mo” dosyasına dönüştürmesi gerekmekte, bu dönüşümü sağlamak için de;

django-admin compilemessages

komutunu kullanıyoruz. Her eklediğimiz metinden sonra bu komutu tekrar çalıştırmayı unutmamalıyız.

Son olarak settings.py altında oluşturduğumuz dil dosyasının yolunu Django’ya vererek dil dönüşümünü otomatize etme işlemini tamamlamış oluyoruz;

LOCALE_PATHS = ( os.path.join(BASE_DIR, 'locale'), )

Django’ya Kullanıcı Bazlı Çoklu-dil Özelliğini Eklemek

Diyelim ki projemizi başlangıçta tek dil özelliği ile oluşturduk, ancak gün geldi ve PO gelip “selam arkadaşlar, çoklu dil desteğine acilen ihtiyacımız var!” dedi. Eğer PO projenin başında böyle bir talep ile gelseydi, django’nun user class’ını genişletip, dil opsiyonu ekleyerek daha basitçe sorunu çözebilirdik, hemen göstereyim, models.py altında User class’ımızı şu şekilde genişletiyoruz;

class User(auth_base.AbstractBaseUser, auth.PermissionsMixin):
    # ...
    language = models.CharField(max_length=10,
                                choices=settings.LANGUAGES,
                                default=settings.LANGUAGE_CODE)

Özelliğimizin çalışması için şu paketi kuruyoruz;

pip install django-user-language-middleware

settings.py altındaki middlewares’ımıza bu middleware’ı ekliyoruz;

MIDDLEWARE = [  # Or MIDDLEWARE_CLASSES on Django < 1.10
    ...
    'user_language_middleware.UserLanguageMiddleware',
    ...
]

Herşey tamamdır.

Kendi Middleware Yapımızı Kurarak Çoklu-dil Desteği

Diyelim ki üstteki paketi kullanmak istemediniz. O halde yönetimi kendiniz sağlamak için Django projenizin altında middlewares.py diye bir dosya oluşturarak içerisinde aşağıdaki şekilde bir middleware oluşturabilir ve aynı şekilde middleware olarak ekleyerek kullanabilirsiniz;

from django.utils import translation

def language_middleware(get_response):
    def middleware(request):
        user = getattr(request, 'user', None)
        if user is not None and user.is_authenticated:
            translation.activate(user.language)
        response = get_response(request)
        translation.deactivate()
        return response
    return middleware

Bir sonraki makalemde görüşmek üzere 🙂

Örnek projenin koduna şuradaki Github reposundan ulaşabilirsiniz.

Kaynaklar;

https://docs.djangoproject.com/en/4.1/topics/i18n/translation/#how-django-discovers-language-preference
https://testdriven.io/blog/multiple-languages-in-django/
https://djangowaves.com/tutorial/multiple-languages-in-Django/
https://stackoverflow.com/questions/37367576/django-language-code-not-working
https://stackoverflow.com/questions/10280881/django-site-with-2-languages
https://stackoverflow.com/questions/42953521/set-or-change-the-default-language-dynamically-according-to-the-user-django
https://stackoverflow.com/questions/9625492/in-django-what-is-i18n

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site istenmeyenleri azaltmak için Akismet kullanır. Yorum verilerinizin nasıl işlendiğini öğrenin.