Çok Dilli Bir Uygulama Nasıl Oluşturulur: PHP ve Gettext ile Bir Demo

Yayınlanan: 2022-03-11

İster bir web sitesi, ister tam teşekküllü bir web uygulaması kuruyor olun, daha geniş bir kitle için erişilebilir kılmak için genellikle farklı dillerde ve yerel ayarlarda kullanılabilir olması gerekir.

Çoğu insan dili arasındaki temel farklılıklar, bunu hiç de kolay yapmaz. Dil bilgisi kuralları, dil nüansları, tarih biçimleri ve daha fazlasındaki farklılıklar, yerelleştirmeyi benzersiz ve zorlu bir görev haline getirmek için birleşir.

Bu basit örneği düşünün.

İngilizcede çoğullaştırma kuralları oldukça basittir: Bir kelimenin tekil biçimine veya bir kelimenin çoğul biçimine sahip olabilirsiniz.

Ancak diğer dillerde - örneğin Slav dillerinde - tekil olana ek olarak iki çoğul form vardır. Hatta Slovence, İrlandaca veya Arapça gibi toplam dört, beş veya altı çoğul biçimi olan diller de bulabilirsiniz.

Kodunuzun düzenlenme şekli ve bileşenlerinizin ve arabiriminizin nasıl tasarlandığı, uygulamanızı ne kadar kolay yerelleştirebileceğinizi belirlemede önemli bir rol oynar.

Kod tabanınızın uluslararası hale getirilmesi (i18n), farklı dillere veya bölgelere görece kolaylıkla uyarlanabilmesini sağlamaya yardımcı olur. Uluslararasılaştırma, genellikle bir kez, tercihen projenin başlangıcında, yolun aşağısındaki kaynak kodunda büyük değişikliklere ihtiyaç duymamak için yapılır.

Çok Dilli Bir Uygulama Nasıl Oluşturulur: PHP ve Gettext ile Bir Demo

Kod tabanınız uluslararası hale getirildikten sonra, yerelleştirme (l10n), uygulamanızın içeriğini belirli bir dile/yerel ayara çevirme meselesi haline gelir.

Her yeni dil veya bölgenin desteklenmesi gerektiğinde yerelleştirmenin gerçekleştirilmesi gerekir. Ayrıca, arayüzün bir parçası (metin içeren) güncellendiğinde, yeni içerik kullanılabilir hale gelir - bu da daha sonra desteklenen tüm yerel ayarlara yerelleştirilmesi (yani çevrilmesi) gerekir.

Bu yazıda PHP ile yazılmış yazılımların nasıl uluslararasılaştırılacağını ve yerelleştirileceğini öğreneceğiz. Süreci kolaylaştırmak için elimizde bulunan çeşitli uygulama seçeneklerini ve farklı araçları gözden geçireceğiz.

Uluslararasılaştırma Araçları

PHP yazılımını uluslararası hale getirmenin en kolay yolu dizi dosyalarını kullanmaktır. Diziler, daha sonra şablonlardan aranabilecek çevrilmiş dizelerle doldurulacaktır:

 <h1><?=$TRANS['title_about_page']?></h1>

Ancak bu, ciddi projeler için pek tavsiye edilen bir yol değildir, çünkü ileride kesinlikle bakım sorunlarına yol açacaktır. Değişken enterpolasyon veya isimlerin çoğullaştırılması için destek eksikliği gibi bazı sorunlar en baştan görünebilir.

En klasik araçlardan biri (genellikle i18n ve l10n için referans olarak alınır) Gettext adlı bir Unix aracıdır.

1995 yılına dayanmasına rağmen, yine de kullanımı kolay yazılımları çevirmek için kapsamlı bir araçtır. Başlamak oldukça kolay olsa da, yine de güçlü destekleyici araçlara sahiptir.

Gettext bu yazıda kullanacağımız şey. l10n kaynak dosyalarınızı kolayca güncellemek için kullanılabilecek harika bir GUI uygulaması sunacağız, böylece komut satırıyla uğraşma gereğini ortadan kaldıracağız.

İşleri Kolaylaştıran Kitaplıklar

Gettext'i destekleyen başlıca PHP web çerçeveleri ve kitaplıkları

Gettext'i ve i18n'nin diğer uygulamalarını destekleyen başlıca PHP web çerçeveleri ve kitaplıkları vardır. Bazılarının kurulumu diğerlerinden daha kolaydır veya ek özelliklere sahiptir veya farklı i18n dosya biçimlerini destekler. Bu belgede, PHP çekirdeği ile sağlanan araçlara odaklansak da, burada bahsetmeye değer diğerlerinin bir listesi:

  • oscarotero/Gettext: Nesne yönelimli bir arayüz ile Gettext desteği; geliştirilmiş yardımcı işlevler, çeşitli dosya biçimleri için güçlü çıkarıcılar içerir (bazıları gettext komutu tarafından yerel olarak desteklenmez). .mo/.po dosyalarının ötesindeki biçimlere de aktarılabilir; bu, çeviri dosyalarınızı JavaScript arabirimi gibi sistemin diğer bölümlerine entegre etmeniz gerektiğinde yararlı olabilir.

  • symfony/translation: Birçok farklı formatı destekler, ancak ayrıntılı XLIFF'lerin kullanılmasını önerir. Yardımcı işlevleri veya yerleşik bir çıkarıcıyı içermez, ancak dahili olarak strtr() kullanan yer tutucuları destekler.

  • zend/i18n: Dizi ve INI dosyalarını veya Gettext biçimlerini destekler. Dosya sistemini her seferinde okuma ihtiyacından kaçınmak için bir önbellek katmanı uygular. Ayrıca görünüm yardımcıları ve yerel ayara duyarlı giriş filtreleri ve doğrulayıcıları içerir. Ancak, mesaj çıkarıcısı yoktur.

Diğer çerçeveler ayrıca i18n modüllerini içerir, ancak bunlar kod tabanlarının dışında mevcut değildir:

  • Laravel: Temel dizi dosyalarını destekler; otomatik çıkarıcıya sahip değildir ancak şablon dosyaları için bir @lang yardımcısı içerir.

  • Yii: Dizi, Gettext ve veritabanı tabanlı çeviriyi destekler ve bir mesaj çıkarıcı içerir. PHP 5.3'ten beri mevcut olan ve ICU projesine dayanan Intl uzantısı tarafından desteklenmektedir. Bu, Yii'nin sayıları heceleme, tarihleri, saatleri, aralıkları, para birimini ve sıra sayıları biçimlendirme gibi güçlü değiştirmeleri çalıştırmasını sağlar.

Çıkarıcı sağlamayan kitaplıklardan birine gitmeye karar verirseniz, Gettext biçimlerini kullanmak isteyebilirsiniz, böylece bölümün geri kalanında açıklandığı gibi orijinal Gettext araç zincirini (Poedit dahil) kullanabilirsiniz.

Gettext'i yükleme

apt-get veya yum gibi paket yöneticinizi kullanarak Gettext ve ilgili PHP kitaplığını kurmanız gerekebilir. Kurulduktan sonra, php.ini dosyanıza extension=gettext.so (Linux/Unix) veya extension=php_gettext.dll (Windows) ekleyerek etkinleştirin.

Burada ayrıca çeviri dosyaları oluşturmak için Poedit'i kullanacağız. Muhtemelen sisteminizin paket yöneticisinde bulacaksınız; Unix, Mac ve Windows için mevcuttur ve web sitesinden de ücretsiz olarak indirilebilir.

Gettext Dosya Türleri

Gettext ile çalışırken genellikle uğraştığınız üç dosya türü vardır.

Bunlardan başlıcaları PO (Taşınabilir Nesne) ve MO (Makine Nesnesi) dosyalarıdır, ilki okunabilir “çevrilmiş nesnelerin” bir listesi ve ikincisi karşılık gelen ikili dosyadır (yerelleştirme yapılırken Gettext tarafından yorumlanır). Ayrıca, kaynak dosyalarınızdaki tüm mevcut anahtarları içeren ve tüm PO dosyalarını oluşturmak ve güncellemek için bir kılavuz olarak kullanılabilen bir POT (PO Şablonu) dosyası da vardır.

Şablon dosyaları zorunlu değildir; l10n yapmak için kullandığınız araca bağlı olarak, yalnızca PO/MO dosyalarıyla iyi olacaksınız. Dil ve bölge başına bir çift PO/MO dosyanız olacak, ancak alan başına yalnızca bir POT olacak.

Etki Alanlarını Ayırmak

Büyük projelerde, aynı kelimeler farklı bağlamlarda farklı anlamlar ifade ettiğinde çevirileri ayırmanız gerekebilecek bazı durumlar vardır.

Bu durumlarda, bunları temelde POT/PO/MO dosya grupları olarak adlandırılan farklı “etki alanlarına” bölmeniz gerekir; burada dosya adı söz konusu çeviri alanıdır .

Küçük ve orta ölçekli projeler, basitlik açısından genellikle yalnızca bir alan kullanır; adı isteğe bağlıdır, ancak kod örneklerimiz için “main” kullanacağız.

Örneğin Symfony projelerinde, doğrulama mesajları için çeviriyi ayırmak için alanlar kullanılır.

Yerel Ayar Kodu

Yerel ayar, basitçe bir dilin bir sürümünü tanımlayan bir koddur. ISO 639-1 ve ISO 3166-1 alpha-2 özelliklerine göre tanımlanır: dil için iki küçük harf, isteğe bağlı olarak ardından bir alt çizgi ve ülke veya bölge kodunu tanımlayan iki büyük harf.

Nadir diller için üç harf kullanılır.

Bazı konuşmacılar için ülke kısmı gereksiz görünebilir. Aslında, Avusturya Almancası (de_AT) veya Brezilya Portekizcesi (pt_BR) gibi bazı dillerin farklı ülkelerde lehçeleri vardır. İkinci kısım, bu lehçeleri ayırt etmek için kullanılır - mevcut olmadığında, dilin “jenerik” veya “melez” bir versiyonu olarak alınır.

Dizin Yapısı

Gettext'i kullanmak için belirli bir klasör yapısına bağlı kalmamız gerekecek.

İlk olarak, kaynak deponuzdaki l10n dosyalarınız için rastgele bir kök seçmeniz gerekecek. İçinde, gereken her yerel ayar için bir klasörünüz ve tüm PO/MO çiftlerinizi içeren sabit bir “LC_MESSAGES” klasörünüz olacak.

LC_MESSAGES Klasörü

Çoğul

Girişte söylediğimiz gibi, farklı diller farklı çoğullaştırma kurallarına sahip olabilir. Ancak Gettext bizi bu dertten kurtarıyor.

Yeni bir .po dosyası oluştururken, o dil için çoğullaştırma kurallarını bildirmeniz gerekecek ve çoğul duyarlı olan çevrilmiş parçalar bu kuralların her biri için farklı bir forma sahip olacaktır.

Gettext'i kodda çağırırken, cümleyle ilgili bir sayı belirtmeniz gerekecek (örneğin, “n mesajınız var.” ifadesi için, n'nin değerini belirtmeniz gerekecek) ve bu, doğru formu oluşturacaktır. kullanmak için - gerekirse dize ikamesi bile kullanılır.

Çoğul kurallar, her bir kural için bir boole testi ile gerekli olan kural sayısından oluşur (en fazla bir kural için test yapılmayabilir). Örneğin:

  • Japonca: nplurals=1; plural=0; nplurals=1; plural=0; - bir kural: çoğul biçim yoktur

  • İngilizce: nplurals=2; plural=(n != 1); nplurals=2; plural=(n != 1); - iki kural: çoğul formu yalnızca n 1 olmadığında kullanın, aksi takdirde tekil formu kullanın.

  • Brezilya Portekizcesi: nplurals=2; plural=(n > 1); nplurals=2; plural=(n > 1); - iki kural, çoğul formu yalnızca n 1'den büyük olduğunda kullanın, aksi takdirde tekil formu kullanın.

Daha derin bir açıklama için, çevrimiçi olarak sunulan bilgilendirici bir LingoHub öğreticisi var.

Gettext, sağlanan sayıya göre hangi kuralın kullanılacağını belirleyecek ve dizenin doğru yerelleştirilmiş sürümünü kullanacaktır. Çoğullaştırmanın ele alınması gereken dizeler için, tanımlanan her çoğul kuralı için .po dosyasına farklı bir cümle eklemeniz gerekir.

Örnek Uygulama

Tüm bu teoriden sonra, biraz pratik yapalım. İşte bir .po dosyasından bir alıntı (sözdizimi hakkında henüz çok fazla endişelenmeyin, bunun yerine genel içerik hakkında bir fikir edinin):

 msgid "" msgstr "" "Language: pt_BR\n" "Content-Type: text/plain; charset=UTF-8\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" msgid "We're now translating some strings" msgstr "Nos estamos traduzindo algumas strings agora" msgid "Hello %1$s! Your last visit was on %2$s" msgstr "Ola %1$s! Sua ultima visita foi em %2$s" msgid "Only one unread message" msgid_plural "%d unread messages" msgstr[0] "So uma mensagem nao lida" msgstr[1] "%d mensagens nao lidas"

İlk bölüm, msgid ve msgstr boş olduğu bir başlık gibi çalışır.

Dosya kodlamasını, çoğul formları ve diğer birkaç şeyi açıklar. İkinci bölüm basit bir dizeyi İngilizce'den Brezilya Portekizcesine çevirir ve üçüncüsü de aynısını yapar, ancak sprintf dize değişiminden yararlanarak çevirinin kullanıcı adını ve ziyaret tarihini içermesini sağlar.

Son bölüm, çoğullaştırma formlarının bir örneğidir, tekil ve çoğul halini İngilizce olarak msgid olarak ve karşılık gelen çevirilerini msgstr 0 ve 1 olarak (çoğul kuralın verdiği sayıya göre) gösterir.

Orada, dize değiştirme de kullanılır, böylece sayı doğrudan %d kullanılarak cümle içinde görülebilir. Çoğul formlarda her zaman iki msgid (tekil ve çoğul) bulunur, bu nedenle çeviri kaynağı olarak karmaşık bir dil kullanmamanız önerilir.

Yerelleştirme Anahtarları

Fark etmiş olabileceğiniz gibi, kaynak kimliği olarak gerçek İngilizce cümleyi kullanıyoruz. Bu msgid , tüm .po dosyalarınız boyunca kullanılanla aynıdır, yani diğer diller aynı biçime ve aynı msgid alanlarına ancak çevrilmiş msgstr satırlarına sahip olacaktır.

Çeviri anahtarlarından bahsetmişken, burada iki standart “felsefi” yaklaşım vardır:

1. gerçek bir cümle olarak msgstr

Bu yaklaşımın başlıca avantajları şunlardır:

  • Yazılımın herhangi bir dile çevrilmemiş bölümleri varsa, görüntülenen tuş yine de bir anlam ifade edecektir. Örneğin, İngilizce'den İspanyolca'ya nasıl çeviri yapacağınızı biliyorsanız ancak Fransızca'ya çeviri yapmak için yardıma ihtiyacınız varsa, yeni sayfayı eksik Fransızca cümlelerle yayınlayabilirsiniz ve web sitesinin bazı bölümleri bunun yerine İngilizce olarak görüntülenir.

  • Çevirmenin neler olup bittiğini anlaması ve msgid dayalı olarak düzgün bir çeviri yapması çok daha kolay.

  • Size bir dil için "ücretsiz" l10n verir - kaynak dil.

Öte yandan, birincil dezavantaj, asıl metni değiştirmeniz gerekirse, aynı msgid birkaç dil dosyasında değiştirmeniz gerekmesidir.

2. benzersiz, yapılandırılmış bir anahtar olarak msgstr

Bu, uygulamadaki cümle rolünü, şablonu veya içeriği yerine dizenin bulunduğu kısım dahil, yapılandırılmış bir şekilde açıklar.

Bu, metin içeriğini şablon mantığından ayırarak kodu organize etmenin harika bir yoludur. Ancak bu, bağlamı kaçıracak olan çevirmen için sorunlar yaratabilir.

Diğer çeviriler için temel olarak bir kaynak dil dosyasına ihtiyaç duyulacaktır. Örneğin, geliştiricinin ideal olarak, çevirmenlerin "fr.po"ya ne yazacağını anlamak için okuyacağı bir "en.po" dosyası olacaktır.

Eksik çeviriler ekranda anlamsız tuşlar gösterecekti (söz konusu çevrilmemiş Fransızca sayfada “Merhaba Kullanıcı!” yerine “top_menu.welcome”).

Bu, yayınlamadan önce çeviriyi tamamlamaya zorlayacağı için iyi - ancak çeviri sorunları arayüzde gerçekten korkunç olacağı için kötü. Yine de bazı kitaplıklar, belirli bir dili diğer yaklaşımla benzer bir davranışa sahip olan "yedek" olarak belirleme seçeneği içerir.

Gettext kılavuzu, ilk yaklaşımı tercih ediyor, çünkü genel olarak, çevirmenler ve kullanıcılar için sorun olması durumunda daha kolay. Burada da kullanacağımız yaklaşım budur.

Yine de, Symfony belgelerinin, şablonları etkilemeden tüm çevirilerde bağımsız değişikliklere izin vermek için anahtar kelime tabanlı çeviriyi desteklediğini belirtmek gerekir.

Günlük Kullanım

Yaygın bir uygulamada, sayfalarınıza statik metin yazarken bazı Gettext işlevlerini kullanırsınız.

Bu cümleler daha sonra .po dosyalarında görünür, tercüme edilir, .mo dosyalarına derlenir ve ardından gerçek arabirimi oluştururken Gettext tarafından kullanılır. Bunu göz önünde bulundurarak, şimdiye kadar tartıştıklarımızı adım adım bir örnekle birleştirelim:

1. Bazı farklı gettext çağrılarını içeren örnek bir şablon dosyası

 <?php include 'i18n_setup.php' ?> <div> <h1><?=sprintf(gettext('Welcome, %s!'), $name)?></h1> <!-- code indented this way only for legibility → <?php if ($unread): ?> <h2> <?=sprintf( ngettext('Only one unread message', '%d unread messages', $unread), $unread )?> </h2> <?php endif ?> </div> <h1><?=gettext('Introduction')?></h1> <p><?=gettext('We\'re now translating some strings')?></p>
  • gettext() basitçe bir msgstr belirli bir dil için karşılık gelen msgid çevirir. Aynı şekilde çalışan _() kısayol işlevi de vardır.

  • ngettext() aynısını çoğul kurallarla yapar

  • Ayrıca, tek bir çağrı için etki alanını geçersiz kılmanıza izin veren dgettext() ve dngettext() vardır (sonraki örnekte etki alanı yapılandırması hakkında daha fazla bilgi)

2. Doğru yerel ayarı seçip Gettext'i yapılandıran örnek bir kurulum dosyası (yukarıda kullanıldığı gibi i18n_setup.php)

Gettext'i kullanmak bir miktar ortak kod içerir, ancak bu çoğunlukla yereller dizinini yapılandırmak ve uygun parametreleri (bir yerel ayar ve bir etki alanı) seçmekle ilgilidir.

 <?php /** * Verifies if the given $locale is supported in the project * @param string $locale * @return bool */ function valid($locale) { return in_array($locale, ['en_US', 'en', 'pt_BR', 'pt', 'es_ES', 'es'); } //setting the source/default locale, for informational purposes $lang = 'en_US'; if (isset($_GET['lang']) && valid($_GET['lang'])) { // the locale can be changed through the query-string $lang = $_GET['lang']; //you should sanitize this! setcookie('lang', $lang); //it's stored in a cookie so it can be reused } elseif (isset($_COOKIE['lang']) && valid($_COOKIE['lang'])) { // if the cookie is present instead, let's just keep it $lang = $_COOKIE['lang']; //you should sanitize this! } elseif (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // default: look for the languages the browser says the user accepts $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']); array_walk($langs, function (&$lang) { $lang = strtr(strtok($lang, ';'), ['-' => '_']); }); foreach ($langs as $browser_lang) { if (valid($browser_lang)) { $lang = $browser_lang; break; } } } // here we define the global system locale given the found language putenv("LANG=$lang"); // this might be useful for date functions (LC_TIME) or money formatting (LC_MONETARY), for instance setlocale(LC_ALL, $lang); // this will make Gettext look for ../locales/<lang>/LC_MESSAGES/main.mo bindtextdomain('main', '../locales'); // indicates in what encoding the file should be read bind_textdomain_codeset('main', 'UTF-8'); // if your application has additional domains, as cited before, you should bind them here as well bindtextdomain('forum', '../locales'); bind_textdomain_codeset('forum', 'UTF-8'); // here we indicate the default domain the gettext() calls will respond to textdomain('main'); // this would look for the string in forum.mo instead of main.mo // echo dgettext('forum', 'Welcome back!'); ?>

3. İlk çalıştırma için çevirinin hazırlanması

Gettext'in özel çerçeve i18n paketlerine göre sahip olduğu en büyük avantajlardan biri, kapsamlı ve güçlü dosya formatıdır.

Belki de “Ah dostum, bunu elle anlamak ve düzenlemek oldukça zor, basit bir dizilim daha kolay olurdu!” diye düşünüyorsunuz. Hiç şüpheniz olmasın, Poedit gibi uygulamalar size çok yardımcı olmak için buradalar. Programı web sitelerinden edinebilirsiniz, ücretsizdir ve tüm platformlar için kullanılabilir. Gettext'in sahip olduğu tüm özellikleri kullanarak alışması oldukça kolay ve aynı zamanda çok güçlü bir araçtır. Burada en son sürüm olan Poedit 1.8 ile çalışacağız.

Poedit'in içini görüntüleyin.

İlk çalıştırmada menüden “Dosya > Yeni…” seçeneğini seçmelisiniz. Sizden dil istenecektir; çevirmek istediğiniz dili seçin/filtreleyin veya daha önce bahsettiğimiz formatı kullanın, örneğin en_US veya pt_BR .

Dil seçimi.

Şimdi, bahsettiğimiz dizin yapısını kullanarak dosyayı kaydedin. Ardından “Kaynaklardan çıkar” seçeneğine tıklamalısınız ve burada çıkarma ve çeviri görevleri için çeşitli ayarları yapılandıracaksınız. Tüm bunları daha sonra “Katalog > Özellikler” aracılığıyla bulabileceksiniz:

  • Kaynak yollar: gettext() (ve kardeşlerin) çağrıldığı projedeki tüm klasörleri dahil edin - bu genellikle sizin şablonlarınız/görünümler klasör(ler)inizdir. Bu tek zorunlu ayardır.

  • Çeviri özellikleri:

    • Proje adı ve sürümü, Ekibin ve Ekibin e-posta adresi: .po dosya başlığına giren faydalı bilgiler.
    • Çoğul formlar: Bunlar daha önce bahsettiğimiz kurallardır. Poedit zaten birçok dil için kullanışlı bir çoğul kural veritabanı içerdiğinden, çoğu zaman varsayılan seçenekle bırakabilirsiniz.
    • Karakter kümeleri: UTF-8, tercihen.
    • Kaynak kodu karakter seti: Kod tabanınız tarafından kullanılan karakter seti - muhtemelen UTF-8 de öyle değil mi?
  • Kaynak anahtar sözcükler: Temel yazılım, gettext() ve benzer işlev çağrılarının çeşitli programlama dillerinde nasıl göründüğünü bilir, ancak kendi çeviri işlevlerinizi de oluşturabilirsiniz. Burada olacak, diğer yöntemleri ekleyeceksiniz. Bu daha sonra “İpuçları” bölümünde tartışılacaktır.

Bu özellikleri ayarladıktan sonra, Poedit tüm yerelleştirme çağrılarını bulmak için kaynak dosyalarınızda bir tarama yapacaktır. Her taramadan sonra Poedit, bulunanların ve kaynak dosyalardan nelerin kaldırıldığının bir özetini görüntüler. Yeni girişler, çeviri tablosuna boş olacak ve bu dizelerin yerelleştirilmiş sürümlerini girmenize olanak tanıyacaktır. Kaydedin ve bir .mo dosyası aynı klasörde (yeniden) derlenecek ve, tahminen!, projeniz uluslararası hale getirildi!

Proje uluslararasılaştı.

Poedit ayrıca web'den ve önceki dosyalardan ortak çeviriler önerebilir. Kullanışlı, bu yüzden yalnızca mantıklı olup olmadıklarını kontrol etmeniz ve kabul etmeniz gerekiyor. Bir çeviriden emin değilseniz, onu Bulanık olarak işaretleyebilirsiniz; çeviri sarı olarak görüntülenecektir. Mavi girişler, çevirisi olmayan girişlerdir.

4. Dizeleri çevirme

Fark etmiş olabileceğiniz gibi, iki ana yerelleştirilmiş dizge türü vardır: basit olanlar ve çoğul biçimli olanlar.

Basit olanların yalnızca iki kutusu vardır: kaynak ve yerelleştirilmiş dize. Gettext/Poedit, kaynak dosyalarınızı değiştirme yeteneğini içermediğinden kaynak dize değiştirilemez; bunun yerine, kaynağın kendisini değiştirmeniz ve dosyaları yeniden taramanız gerekecektir. ( İpucu: Bir çeviri satırına sağ tıklarsanız, kaynak dosyalar ve o dizenin kullanıldığı satırlarla ilgili bir ipucu görüntüler.)

Çoğul form dizeleri, iki kaynak dizeyi göstermek için iki kutu ve farklı son formları yapılandırabilmeniz için sekmeler içerir.

Son formları yapılandırma.

Poedit'te her biri için bir çeviri sekmesi gösteren çoğul biçimli bir dize örneği.

Kaynak kod dosyalarınızı her değiştirdiğinizde ve çevirileri güncellemeniz gerektiğinde, Yenile'ye basmanız yeterlidir ve Poedit kodu yeniden tarayacak, var olmayan girişleri kaldıracak, değişenleri birleştirecek ve yenilerini ekleyecektir.

Poedit, yaptığınız diğer çevirilere dayanarak bazı çevirileri tahmin etmeye çalışabilir. Bu tahminler ve değiştirilen girdiler, gözden geçirilmesi gerektiğini belirten ve listede sarı renkle gösterilen bir “Bulanık” işaretçisi alacak.

Ayrıca, bir çeviri ekibiniz varsa ve birisi emin olmadığı bir şey yazmaya çalışırsa yararlıdır: Sadece Fuzzy olarak işaretleyin, başka biri daha sonra gözden geçirecektir.

Son olarak, girişleri unutmamanıza yardımcı olacağı için “Görünüm > Çevrilmemiş girişler önce” işaretli olarak bırakılması tavsiye edilir. Bu menüden, gerektiğinde çevirmenler için bağlamsal bilgiler bırakmanıza izin veren kullanıcı arayüzünün bölümlerini de açabilirsiniz.

İpuçları & Hileler

Web sunucuları, .mo dosyalarınızı önbelleğe alabilir.

PHP'yi Apache'de (mod_php) bir modül olarak çalıştırıyorsanız, .mo dosyasının önbelleğe alınmasıyla ilgili sorunlarla karşılaşabilirsiniz. Bu, ilk okunduğunda olur ve ardından güncellemek için sunucuyu yeniden başlatmanız gerekebilir.

Nginx ve PHP5'te, çeviri önbelleğini yenilemek için genellikle yalnızca birkaç sayfa yenilemesi gerekir ve PHP7'de buna nadiren ihtiyaç duyulur.

Kitaplıklar, yerelleştirme kodunu kısa tutmak için yardımcı işlevler sağlar.

Birçok kişi tarafından tercih edildiği gibi, gettext() _() kullanmak daha kolaydır. Çerçevelerdeki birçok özel i18n kitaplığı, çevrilmiş kodu kısaltmak için t() 'ye benzer bir şey kullanır. Ancak, bir kısayolu destekleyen tek işlev budur.

Projenize ngettext() ) için __() veya _n() gibi bazılarını veya gettext() ve sprintf() çağrılarına katılacak süslü bir _r() gibi bazılarını eklemek isteyebilirsiniz. Oscarotero'nun Gettext'i gibi diğer kütüphaneler de bunun gibi yardımcı işlevler sağlar.

Bu gibi durumlarda, Gettext yardımcı programına bu yeni işlevlerden dizelerin nasıl çıkarılacağı konusunda talimat vermeniz gerekir. Korkma, çok kolay. Bu yalnızca .po dosyasındaki bir alandır veya Poedit'teki Ayarlar ekranıdır (düzenleyicide bu seçenek "Katalog > Özellikler > Kaynaklar anahtar sözcükleri" içindedir).

Unutmayın: Gettext birçok dil için varsayılan işlevleri zaten biliyor, bu nedenle bu liste boş görünüyorsa endişelenmeyin. Bu belirli biçimi izleyerek yeni işlevlerin özelliklerini bu listeye eklemeniz gerekir:

  • t() gibi bir dizgenin çevirisini döndüren bir şey yaratırsanız, onu t olarak belirtebilirsiniz. Gettext tek işlev argümanının çevrilecek dizge olduğunu bilecektir;

  • İşlevin birden fazla argümanı varsa, ilk dizenin hangisi olduğunu ve gerekirse çoğul biçimini de belirtebilirsiniz. Örneğin, fonksiyon imzamız __('one user', '%d users', $number) ise, belirtim __:1,2 olur, yani ilk form ilk argüman ve ikinci form ise ikinci argüman. Numaranız bunun yerine ilk bağımsız değişken olarak gelirse, belirtim __:2,3 olur, bu da ilk formun ikinci bağımsız değişken olduğunu gösterir ve bu böyle devam eder.

Bu yeni kuralları .po dosyasına ekledikten sonra, yeni bir tarama yeni dizelerinizi eskisi kadar kolay bir şekilde getirecektir.

Gettext ile PHP Uygulamanızı Çok Dilli Hale Getirin

Gettext, PHP projenizi uluslararası hale getirmek için çok güçlü bir araçtır. Çok sayıda insan dilini desteklemeye izin veren esnekliğinin ötesinde, 20'den fazla programlama dilini desteklemesi, onu PHP ile kullanma bilginizi Python, Java veya C# gibi diğer dillere kolayca aktarmanıza olanak tanır.

Ayrıca, Poedit, kod ve çevrilmiş dizeler arasındaki yolu düzleştirmeye yardımcı olabilir, bu da süreci daha basit ve takip edilmesi daha kolay hale getirir. Ayrıca Crowdin entegrasyonuyla paylaşılan çeviri çabalarını kolaylaştırabilir.

Mümkün olduğunda, kullanıcılarınızın konuşabileceği diğer dilleri düşünün. Bu çoğunlukla İngilizce olmayan projeler için önemlidir: Ana dilinizin yanı sıra İngilizce olarak da yayınlarsanız kullanıcı erişiminizi artırabilirsiniz.

Tabii ki, tüm projelerin uluslararasılaştırmaya ihtiyacı yoktur, ancak başlangıçta ihtiyaç duyulmasa bile, bir projenin emekleme döneminde i18n'ye başlamak, daha sonra bir gereklilik haline gelirse bunu daha sonra yapmaktan çok daha kolaydır. Ve Gettext ve Poedit gibi araçlarla her zamankinden daha kolay.

İlgili: PHP 7'ye Giriş: Yenilikler ve Neler Yok