31 Ağustos 2015 Pazartesi

Django Translation

Merhaba, Djangoda translation işlemine bakacağız. Bunun için django ile birlikte gelen translation kütüphanesinin nasıl kullanıldığından bahsedeceğiz. Hemen işe koyulalım. İlk önce settings.py dosyası içerisinde ayarlamalar yapacağız. İlk önce MIDDLEWARE_CLASSES değişkenini düzenleyeceğiz.
MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)
Daha sonra yine settings.py dosyası içerisinde hangi dilleri kullanacağımızın listesini ve dil dosyalarının ana dizinini belirteceğiz.
from django.utils.translation import ugettext_lazy as _

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

LANGUAGES = (
    ('tr', _('Turkish')),
    ('en', _('English')),
)
İki dil tanımlaması yaptık. Dikkatinizi çekmiştir, ugettext_lazy adında bir fonksiyon kullandık. İleride bu fonskiyonu açıklayacağız. Settings dosyasındaki ayarlarımız bu kadar. Şimdi isterseniz django aracılığı ile dil dosyalarımızı oluşturalım. Projemizin ana dizinine locale adında bir dizin oluşturuyoruz ve şu komutları çalıştırıyoruz.
django-admin.py makemessages -l tr
django-admin.py makemessages -l en
locale dizini altında django.po adındaki dosyalarımızın oluştuğunu göreceksiniz. Django bizim için bulduğu stringleri bile ekledi. Dosyanın en başında
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-09-01 02:57+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
Gibi bir ifade göreceksiniz. Bu dosyanın ayarlarını içermektedir. Kendinize göre düzenleyebilirsiniz. Ardından burada bilmemiz gereken;
msgid "Mesaj ID'si"
msgstr "Mesaj içeriği"
şeklinde bir yapı olduğudur. msgid ile gösterdiğimiz kısmı metnimizi çağırırken kullanacağız. Bu kısım her dil dosyasında aynı olmalıdır. msgstr kısmı ise dillere göre değişkenlik gösterecek kısımdır. Burada msgid kısmını yazarken de cümle kuruyormuş gibi yazabilirsiniz. Değişken tanımlar gibi hissetmenize gerek yoktur kendinizi. en ve tr dillerini tanımladığımız için locale dizini içerisinde en ve tr adında iki farklı dizin oluştu. Bu dizinler içerisinde ise django.po dosyası bulunmakta. Şimdi bir kaç tanımlama yapalım.
#tr dizini içerisindeki django.po
msgid "Test metni"
msgstr "Test metni"

#en dizini içerisindeki django.po
msgid "Test metni"
msgstr "Test text"
Dosyalarımı oluşturdaktan sonra sıra geldi compile işlemine bunun için projemizin ana dizininde şu komutu çalıştırıyoruz.
django-admin.py compilemessages
Bu komuttan sonra dil dosyalarımız compile edilecek ve aynı dizinler içerisinde django.mo dosyaları oluşacaktır. Dil dosyalarını oluşturma ve compile etme işlemi bu kadar. Şimdi bunları nasıl kullancağımıza bakalım. Örneğin views içerisinde bir değişkeninizin değerinin dil seçimine göre değişmesini istiyorsak, şu şekilde kullanabiliriz.
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Test metni")
    return HttpResponse(output)
Buradaki output değişkenine gelen değer dil seçimine göre Test metni veya Test text olacaktır. Birazdan dil seçiminin nasıl yapılacağını göstereceğiz. Şimdi aynı işlemi formlar için uygulayalım.
from django.utils.translation import ugettext_lazy as _
class RegistrationForm(UserCreationForm):
    username = CharField(label=_("Test metni"))
Gördüğünüz gibi kullanımı oldukça basit. Burada ugettext_lazy kullandığımıza dikkat edin.
from django.db import models
from django.utils.translation import ugettext_lazy as _

class MyThing(models.Model):
    name = models.CharField(help_text=_('This is the help text'))
Model dosyası içerisinde de bu şekilde kullanabilirsiniz. Metin alanı olarak kullanacağınız tüm alanlarda bu şekilde translate işlemi yapabilirsiniz. Modeller içerisindeki verbose_name, help_text formlar içerisindeki label, error_messages gibi. Template(şablon) içerisindeki kullanımını görelim.
{% load i18n %}
{% trans "This is the title." %}
{% trans myvar %}
Gördüğünüz gibi kullanımı gerçekten basit. Bu şekilde django bizim için değerleri dil dosyaları içerisinden çekecektir. Template içerisinde aktif olan file şu şekilde erişebilirsiniz.
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
Veya view içerisinde şu şekilde erişebilirsiniz.
from django.utils import translation
def cur_lang(language):
    cur_language = translation.get_language()
    ....
Ve son olarak bir dili aktif etmeyi görelim. Yukarıda metinlerimizi hep translate edicek şekilde çağırdık. Hangi dil aktif ise o dile göre metinler getirilicektir.
def language(request, lang_code):
    translation.activate(lang_code)
    request.session[translation.LANGUAGE_SESSION_KEY] = lang_code
    return HttpResponseRedirect('/')
Çok basit hali dil seçimi yapan bir view yazdık. Kullanıcıdan alınan lang_code değerini aktif ediyor ve ardından session ataması yaparak kalıcı hale getiriyoruz. Django'da translation işlemi en basit haliyle bu şekilde. Daha fazla bilgiye bu sayfadan erişebilirsiniz.
Kaynakça

0 yorum :

Yorum Gönder