Truva Linux Destek Forumu

Programlama Dilleri ve Veritabanları => Programlama Genel => Konuyu başlatan: fortran - 04 Ocak 2015, 12:45:13 öö

Başlık: Gülşah Köse: Python Uygulamalarına Dil Desteği Eklemek
Gönderen: fortran - 04 Ocak 2015, 12:45:13 öö
Projemiz klasik olarak ekrana "Hello World"  yazdırsın ve buna dil desteği ekleyelim. Projenin dizin yapısı şöyle:
Kod: [Seç]
---
helloproject/
└── hello.py
---
hello.py dosyasının içeriği aşağıda:

Kod: [Seç]
---
print "Hello World"
---


1. _() Fonsiyonunu Belirlemek

Bu fonksiyon kodun içinde çevirilecek cümlelerin, kelimelerin belirlenmesine ve yerelimizde kullandığımız dil her ne ise cümlelerin o dile göre çevirilmiş halinin gösterilmesine yarayan fonksiyondur.

hello.py dosyası ile aynı dizine i18n.py isimli bir dosya açalım ve içine şunları yazalım.

Kod: [Seç]
---

# -*- coding: utf-8 -*-

import os, sys
import locale
import gettext

# Bu degisken ismine kendi uygulamanizin ismini yazmalısınız!
# Ceviri dosyaları bu yolda olmalıdır.
#  @LOCALE_DIR@/@LANGUAGE@/LC_MESSAGES/@[email protected]
APP_NAME = "helloproject"



# Sisteminizde helloproject isim dosyanın bulunduğu yolu döndürecektir.

# Bu kismi baska projeler icin projenizin bulunduğu dizine göre değiştirmelisiniz.
APP_DIR = os.path.dirname(os.path.abspath("helloproject"))

# .mo dosyalari bu dizinin altinda olacaktir APP_Dir/i18n/LANGUAGECODE/LC_MESSAGES/

LOCALE_DIR = os.path.join(APP_DIR, 'i18n')

# Hangi dile cevrilecegini belirleyen kisim burasidir. Burada olusan
# listede ilk yazan dil hangisiyse ona ceviri yapilacaktir.
#
# hangi dile cevirilecegi LANG cevresel degiskenine bakilarak belirlenir.
DEFAULT_LANGUAGES = os.environ.get('LANG', '').split('.')
DEFAULT_LANGUAGES += ['en_US']

lc, encoding = locale.getdefaultlocale()
if lc:
    languages = [lc]

languages += DEFAULT_LANGUAGES
mo_location = LOCALE_DIR

# Burada herhangi bir degisiklik yapmaniza gerek yok
gettext.install(True, localedir=None, unicode=1)

gettext.find(APP_NAME, mo_location)

gettext.textdomain (APP_NAME)

gettext.bind_textdomain_codeset(APP_NAME, "UTF-8")

---
Şuan oluşan dizin yapısı:

Kod: [Seç]
---
 helloproject/
├── hello.py
└── i18n.py
---
2. Çevirmek İstediğimiz  Cümleleri Belirlemek

İçinde çeviri yapmak istediğimiz dosyaların başına şu kodu eklemeliyiz.

Kod: [Seç]
---

import i18n
_ = i18n.language.ugettext

---
Bu projede çevrilecek tek cümle "Hello World" oluğundan şimdi hello.py dosyasını aşağıdaki şekilde düzenleyelim.

Kod: [Seç]
---

import i18n
_ = i18n.language.ugettext

 

print _("Hello World")

---
Çevilecek cümleler şu yapıda olmalı:
Kod: [Seç]
_("çevrilecek cümle")
3.Çeviriler İçin Şablon Oluşturmak

.pot uzantılı dosya şablon dosyasıdır. Her projede bir tane .pot uzantılı dosya bulunur. Çeviri yapılacak diller için oluşturulacak dosyalar bu .pot uzantılı dosya kullanılarak üretilecektir.

Şimdi helloproject.pot isimli dosyayı oluşturacağız. Önce projenin içine "po" isminde bir dizin oluşturalım ve aşağıdaki komutu çalıştıralım.

Kod: [Seç]
---

xgettext --language=Python --keyword=_ --output=po/helloproject.pot hello.py

---

Eğer "xgettext: Non-ASCII character at..." gibi bir hatayla karşılaşıyorsanız -başka projelerde- aşağıdaki komutu yazmalısınız:

Kod: [Seç]
---

xgettext --language=Python --keyword=_ --output=po/helloproject.pot --from-code=UTF-8 hello.py

---

Bu adımdan sonra oluşan dizin yapısı şu şekildedir:

Kod: [Seç]
---
 helloproject/
├── hello.py
├── i18n.py
└── po
    └── helloproject.pot
---

Oluşan helloproject.pot isimli dosya aşağıdaki gibi olmalı:

Kod: [Seç]
---
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-01-03 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: hello.py:4
msgid "Hello World"
msgstr ""
---
! Buradaki isim soyisim email gibi bilgileri doldurmakta fayda var.

4. Bir Dil İçin Çeviri Dosyası Oluşturmak

Oluşturduğumuz bu şablon dosyasını kullanarak projenin türkçe için çeviri dosyasını oluşturacağız. Oluşturduğumuz po dizininin içinde aşağıdaki komutu çalıştıralım

Kod: [Seç]
---

msginit --input=helloproject.pot --locale=tr_TR

---

Bu işlemin sonunda oluşan dizin yapısı:

Kod: [Seç]
---
helloproject/
├── hello.py
├── i18n.py
└── po
    ├── helloproject.pot
    └── tr.po
---

Oluşan tr.po dosyasının içi şöyle olmalı:

Kod: [Seç]
---
# Turkish translations for PACKAGE package.
# Copyright (C) 2015 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# gulsah <[email protected]>, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-01-03 22:53+0200\n"
"PO-Revision-Date: 2015-01-03 23:08+0200\n"
"Last-Translator: gulsah <[email protected]>\n"
"Language-Team: Turkish\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: hello.py:4
msgid "Hello World"
msgstr ""
---

Burada .po uzantılı dosyaları çevirmek için çeşitli editörler var (poEdit ,pootle, transifex,...) Bizim projemiz minik olduğundan elle çeviriyi yapabiliriz. Çeviriyi yaptığımızda dosyanın son 2 satırı şöyle değişecek:

Kod: [Seç]
---
msgid "Hello World"
msgstr "Merhaba Dunya"
---

5. Derleme

Program hızlı çalışabilmesi açısından oluşturduğumuz bu .po dosyalarına değil bunları derleyerek oluşturduğumuz .mo dosyalarına bakacaktır. Bu derleme işi ve derlenen dosyaları koyduğumuz yer program için önemli. i18n.py içinde belirttiğimiz şekilde bu proje için oluşan .mo dosyalarını aşağıdaki komutla oluşturacağımız dizin içinde saklayacağız. (Şuan helloproject dizini içindeyiz)

Kod: [Seç]
---

mkdir -p i18n/tr/LC_MESSAGES

---

Şimdi tr.po dosyasını derleyelim:

---

msgfmt po/tr.po --output-file i18n/tr/LC_MESSAGES/helloproject.mo

---

Sonuçta oluşan dizin yapısı şöyle olmalıdır:

---
helloproject/
├── hello.py
├── i18n
│   └── tr
│       └── LC_MESSAGES
│           └── helloproject.mo
├── i18n.py
└── po
    ├── helloproject.pot
    └── tr.po
---
Eğer LANG değişkenin içinde kullandığınız dil ingilizceyse onu türkçe ile değiştirirseniz hello.py dosyasını çalıştırdığınızda artık çıktısının "Merhaba Dunya" olduğunu göreceksiniz.

gulsahkose.com (http://www.gulsahkose.com/2015/01/python-uygulamalarna-dil-destegi-eklemek.html)