GNU gettext ile yazılım çevirisi

‘GNU gettext’_, özgür yazılımın yerelleştirilmesi için en yaygın kullanılan araçlardan biridir. Yazılımı yerelleştirmek için basit ama esnek bir yol sağlar. Büyük bir çoğul biçim desteği vardır. Çevrilmiş dizgeye bağlam ekleyebilir ve etrafında geliştirilmiş pek çok araç vardır. Tabii ki büyük bir Weblate desteği de var (ayrıntılı bilgi almak için: ref: gettext dosya biçimi açıklaması).

Not

Ticari bir yazılımda kullanmak üzereyseniz, lütfen önce lisanslamaya bakın, sizin için uygun olmayabilir.

GNU gettext çeşitli dillerle (C, Python, PHP, Ruby, JavaScript ve daha fazlası) kullanılabilir ve genellikle kullanıcı arayüzü çatıları zaten bazı desteklerle gelir. Standart olarak, kodu daha basit ve okunması daha kolay kılmak için genellikle _() biçiminde takma ad ile verilen gettext() işlevi çağrısı kullanılır.

Ek olarak, çevirmenlere ek bağlam sağlamak için pgettext() çağrısı ve hedef dil için tanımlanan çoğul türleri işleyebilen ngettext() çağrısı sağlar.

Yaygın kullanılan bir araç olarak, kullanımını gerçekten basitleştiren birçok sarmalayıcı vardır. Aşağıda açıklanan el ile gettext çağrısı yerine, bunlardan birini denemek isteyebilirsiniz. Örneğin intltool.

İş akışı özeti

GNU gettext, yerelleştirmeyi yönetmek için birkaç dosya kullanır:

  • PACKAGE.pot, genellikle xgettext ya da intltool gibi bazı üst düzey sarmalayıcılar kullanılarak kaynak kodunuzdan ayıklanan dizgeleri içerir.

  • LANGUAGE.po tek bir dilde çevirisi olan dizgeleri içerir. PACKAGE.pot güncellendikten sonra msgmerge tarafından güncellenmesi gerekir. msginit ile ya da Weblate içinde yeni dil dosyaları oluşturabilirsiniz.

  • LANGUAGE.mo, LANGUAGE.po binary biçimini içerir ve uygulamanın çalıştırıcısında kullanılır. Genellikle sürüm denetimi altında tutulmaz, ancak derleme zamanında msgfmt kullanılarak oluşturulur. Sürüm denetiminde olmasını istiyorsanız, MO dosyaları üretme eklentisini kullanarak Weblate üzerinde de oluşturabilirsiniz.

GNU gettext iş akışı genel olarak şöyle görünür:

digraph translations { graph [fontname = "sans-serif", fontsize=10]; node [fontname = "sans-serif", fontsize=10, shape=note, margin=0.1, height=0]; edge [fontname = "monospace", fontsize=10]; "Source code" -> "PACKAGE.pot" [label=" xgettext "]; "PACKAGE.pot" -> "LANGUAGE.po" [label=" msgmerge "]; "LANGUAGE.po" -> "LANGUAGE.mo" [label=" msgfmt "]; }

Ayrıca bakınız

GNU gettext özeti

Örnek program

C ile yazılmış basit bir gettext kullanma programı şöyle görünür:

#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int count = 1;
    setlocale(LC_ALL, "");
    bindtextdomain("hello", "/usr/share/locale");
    textdomain("hello");
    printf(
        ngettext(
            "Orangutan has %d banana.\n",
            "Orangutan has %d bananas.\n",
            count
        ),
        count
    );
    printf("%s\n", gettext("Thank you for using Weblate."));
    exit(0);
}

Çevrilebilir dizgeleri ayıklamak

Gettext çağrıları ile kodu aldıktan sonra, xgettext kullanarak iletileri ayıklayabilir ve bunları bir .pot dosyası içine kaydedebilirsiniz:

$ xgettext main.c -o po/hello.pot

Not

Koddan dizgeleri ayıklamak için alternatif programlar vardır. Örneğin pybabel.

Böylece, yeni çeviriler başlatmak (msginit ile) ya da kod değişikliğinden sonra var olan çevirileri güncellemek (bunun için msgmerge kullabilirsiniz) için kullanabileceğiniz bir kalıp dosyası oluşturulur. Oluşturulan dosya yalnızca yapılandırılmış bir metin dosyasıdır:

# 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-10-23 11:02+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

#: main.c:14
#, c-format
msgid "Orangutan has %d banana.\n"
msgid_plural "Orangutan has %d bananas.\n"
msgstr[0] ""
msgstr[1] ""

#: main.c:20
msgid "Thank you for using Weblate."
msgstr ""

Her msgid satırı çevrilecek bir dizgeyi tanımlar. Başlangıçtaki özel boş dizge, çeviriyle ilgili üst verileri içeren dosya üst bilgisidir.

Yeni çeviriye başlamak

Kalıp hazır olduğunda, ilk çevirimize başlayabiliriz:

$ msginit -i po/hello.pot -l cs --no-translator -o po/cs.po
Created cs.po.

Yeni oluşturulan cs.po dosyasında zaten doldurulmuş olan bazı bilgiler bulunur. En önemlisi, seçilmiş dil için uygun çoğul biçim tanımı yapılmıştır ve çoğul biçimlerin sayısının buna göre değiştiğini görebilirsiniz:

# Czech translations for PACKAGE package.
# Copyright (C) 2015 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Automatically generated, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-10-23 11:02+0200\n"
"PO-Revision-Date: 2015-10-23 11:02+0200\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"

#: main.c:14
#, c-format
msgid "Orangutan has %d banana.\n"
msgid_plural "Orangutan has %d bananas.\n"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""

#: main.c:20
msgid "Thank you for using Weblate."
msgstr ""

Bu dosya, çalıştırma ortamında GNU gettext işlevleri tarafından kullanılmaya uygun binary .mo dosyası biçiminde derlenir.

Dizgeleri güncellemek

Yeni dizgeler eklediğinizde ya da programınızdaki bazı dizgeleri değiştirdiğinizde, kalıp dosyasını yeniden oluşturan xgettext komutunu yeniden çalıştırırsınız:

$ xgettext main.c -o po/hello.pot

Ardından, yeni oluşturulan kalıplarla eşleşecek şekilde tek tek çeviri dosyalarını güncelleyebilirsiniz (bu işlem, dizgeleri yeni kalıpla eşleşecek şekilde yeniden sıralar):

$ msgmerge --previous --update po/cs.po po/hello.pot

Weblate içine aktarmak

Böyle bir çeviriyi Weblate içine aktarmak için, bileşen oluştururken tanımlamanız gereken tek şey aşağıdaki alanlardır (alanlarla ilgili bilgi almak için: Bileşen yapılandırması):

Alan

Değer

Kaynak kod deposu

Projenizle birlikte sürüm denetimi sistemi deposunun adresi

Dosya maskesi

po/*.po

Yeni çeviriler kalıbı

po/selam.pot

Dosya biçimi

Seçin Gettext PO dosyası

Yeni dil

Yeni dil dosyası oluştur seçeneğini seçin

Bu kadar, artık yazılımınızı çevirmeye başlayabilirsiniz!

Ayrıca bakınız

GitHub üzerindeki Weblate Hello projesinde birçok dilde bir gettext örneği bulabilirsiniz: <https://github.com/WeblateOrg/hello>.