Nasıl gettext dinamik içerik ele?

3 Cevap php

Dinamik içerik bir değişken gördüğünde php (ya da belki genel olarak gettext), gettext ne yapar?

Aklımda 2 olgu var.

1) Diyelim ki <?=$user1?> poked John <?=$user2?> var diyelim. Belki bazı dilde kelimelerin sırası farklıdır. Nasıl gettext bu ele? (Hayır, ben facebook inşa değilim, bu sadece bir örnek oldu)

2) Diyelim ki bir veritabanında bazı kategoriler saklamak diyelim. Nadiren, ama onlar bir veritabanında mağaza vardır. Ben yaparsam ne olur <?php echo gettext($data['name']); ?>? Ben de bu kategori adlarını çevirmek çevirmenler istiyorum, ancak veritabanının kendisi yapılması gerekiyor?

Teşekkürler

3 Cevap

En iyi seçenek spritf () işlevini kullanmaktır. Sonra dizeleri dinamik içeriği işlemek için printf gösterimini kullanabilirsiniz. İşte sizin için kolayca bu işlemek için bir süre önce burada bulunan bir işlevdir:

function translate()
{
    $args = func_get_args();
    $num = func_num_args();
    $args[0] = gettext($args[0]);

    if($num <= 1)
      return $args[0];

    return call_user_func_array('sprintf', $args);

}

Şimdi, örneğin, 1. size dize değiştirmek isteyeyim:

%s poked %s

Hangi olur böyle translate () fonksiyonu içine girdi:

<?php echo translate('%s poked %s', $user1, $user2); ?>

Sen poEdit ile) (işlevlerini tüm çevirmek ayrıştırmak istiyorum. ve sonra dize %s dizesi yer tutucuları değiştirmeden sen ne istediğini dile, "% s% s dürttü" çevirmek. Bunlar sırasıyla user1 ve user2 ile translate () fonksiyonu ile çıkış üzerine yerine olacaktı. Daha gelişmiş kullanımlar için PHP Kılavuzunda) (sprintf hakkında daha fazla bilgi edinebilirsiniz.

Sorun # 2. Sen poEdit kategori adlarını içeren ayrıştırmak statik bir dosya oluşturmanız gerekir. Örneğin, "misctranslations.php":

<?php

_('Cars');
_('Trains');
_('Airplanes');

Sonra poEdit ayrıştırma misctranslations.php var. Daha sonra çıkış kullanarak kategori adı çeviri <?php echo gettext($data['name']); ?> mümkün olacaktır

Mark ne dedi ... Yukarıdaki çözüm tek sorun, yumuşak, statik liste her zaman elle tutulmalıdır ve tüm diğerlerinden önce yeni bir dize eklemek veya eğer tamamen varolanı değiştirmek olduğunu biraz inşa etmek Eğer yeni dizeleri karıştırmayın olabilir çeviri için kullanmak ve bazı çeviriler kaybedebilirsiniz.

Ben aslında bu konuda bir makale (! Yakın zamanda bunu bitirmek için çok az zaman) yazıyorum ama benim önerdi cevap böyle bir şey gider:

Gettext Eğer dize. Po dosyası içinde kodu görünür satır numarasını saklamak için izin verir. Tamamen dize değiştirirseniz,. Po editör dize yeni olmadığını bilecek ama eski bir (teşekkürler hat numarası) olduğunu.

Bu benim çözüm veritabanını okur ve tüm gettext dizeleri ile statik bir dosya oluşturur bir senaryo yazmaktır. Mark'ın çözüm büyük fark veritabanı birincil anahtar (en o kimliği diyelim) yeni dosyadaki satır numarası aynı olmasıdır. Tamamen bir orijinal çeviri değiştirirseniz bu durumda, çizgiler hala aynıdır ve çevirmen yumuşak dizeleri tanıyacaktır.

Tabii orada yeni ve daha akıllı. Po editörler olabilir ama sizinki size yeni dizeleri ile sorun veriyor, en azından o zaman bu bunları çözecektir.

Benim 2 sent.

@ Julian

Ben sizin yaklaşım pratikte de işe düşünüyorum. Eğer kod genelinde bazı işlevi taşımak olduğunu düşünün. Satır sayısı da dosya adı farklı olabilir, farklı olacaktır.

Ben çeviri kimlikleri değişen yönetmek için tek akıllı yolu. Po-dosyasında benzer kimlikleri bulmaya olacağını düşünüyorum. Onlar çok benzer ve kod kayıtlı hat sayısının bir çeviri dize varsa editörü, varolan biri ile yeni bir çeviri metin birleştirilmesi için bir öneri gösterebilirim.