Gettext sözdiziminin anlamı nedir?


9

Şimdiye kadar Wordpress'te bazı çevirileri ele alıyorum ve resmi gettext belgelerini okumaya çalıştım, ancak basit bir şeyin amacını elde edemem: __ (, _e (vb.) Gibi başlangıçlar arasındaki farklar nelerdir? daha fazla: yanında başka neler var? Şimdiden teşekkürler!

dürüst


Ayrıntılı cevaplarınız için hepinize teşekkür ederiz! Bunu gerçekten takdir ediyorum!
Circuit Circus

... Belki başka bir soru daha: Metin-alanının girişi dışarıda bırakılabilir mi? Ben çevirmek istediğim her dizeye getirmeye başladım, ancak Wordpress kodeksinde hiç içermeyen bazı örnekler tanıdım ...
Circuit Circus

... Tamam, şimdi bu kodeks sayfasında rastladım - bu gereksiz soru için üzgünüm :-)
Circuit Circus

Yanıtlar:


13

__(çift alt çizgi) temel çeviri işlevidir. Bir dizeyi çevirir ve bir dize olarak döndürür.

_eile aynı şeyi yapar __, ancak sonuç hemen yankı olur.

_xbağlamsal çeviri işlevidir. Çeviri yapan kişilere bağlam sağlamak için ikinci bir seçenek vardır.

_exile aynıdır _x, ama yankı sonuçtur.

Kullanım örneği _x:

$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );

Bazen aynı dize diğer dillerde farklı olabilir. Çevirmenlere bağlam sağlamak doğru kelimeleri seçmelerine yardımcı olabilir.

Kısayol işlevleri:

  • esc_attr__: __Sonucun eşdeğeri fakat aynı zamanda sonucu da çalıştırır esc_attr.
  • esc_html__: __Sonucun eşdeğeri fakat aynı zamanda sonucu da çalıştırır esc_html.
  • esc_attr_e: _eSonucun eşdeğeri fakat aynı zamanda sonucu da çalıştırır esc_attr.
  • esc_html_e: _eSonucun eşdeğeri fakat aynı zamanda sonucu da çalıştırır esc_html.
  • esc_attr_x: _xSonucun eşdeğeri fakat aynı zamanda sonucu da çalıştırır esc_attr.
  • esc_html_x: _xSonucun eşdeğeri fakat aynı zamanda sonucu da çalıştırır esc_html.

_nçoğullama işleyicisidir. Misal:

$string = sprintf( _n(
        'You have %d taco.', 
        'You have %d tacos.', 
        $number, 
        'plugin-domain'), 
    $number );

Bu örnekte, tekil olup olmamasına bağlı olarak taco sayısını söylemenin iki yolu vardır. $ Sayısının ilk kullanımı, _nişleve hangi sürümün kullanılacağını bildirir . % D numarasının ikinci kullanımı sprintf içinde gerçekleşir,% d yerine dizedeki gerçek sayı kullanılır.

Eşdeğer bir yankı işlevi yoktur _n, ancak adlı bir işlev vardır _nx. Bu bir kombinasyonu _nve _x. Çoğullaştırma ve bağlam.

_n_noopözel bir tanesidir. Çoğullaştırılmış dizeleri çevirmek için kullanılır, ancak aslında çeviriyi hemen gerçekleştirmez. Dizeleri merkezileştirmek istiyorsanız, ancak işi başka bir yerde yapmak istiyorsanız bu yararlıdır. İşi başka bir yerde yapan işlevdir translate_nooped_plural.

Misal:

$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );

Bu çok kullanılmaz, ancak organizasyon için kullanışlı olabilir. Örneğin, tüm dizelerinizi bir dosyaya koyarsanız, başka bir yere referans _nverirseniz , bu mümkün olmazdı , bunu _n_noopyapmak için bir şeye ihtiyacınız var.

_nx_noopaynıdır _n_noop, ama aynı zamanda aynı çevirmenler, bir bağlam alabilir _x.

Etki alanını noop işlev çağrısına veya translate_nooped_plural işlev çağrısına koyabileceğinizi unutmayın. Kuruluşunuz için hangisi daha anlamlı olursa. Her ikisinin de bir etki alanı varsa, noop çağrısına iletilen etki alanı kazanır.

number_format_i18nPHP'nin yerleşik number_format işlevine eşdeğerdir , ancak diğer yerel ayarlarda farklı olan ondalık sayılar vb. işlemlerin eklenmesine katkıda bulunur.

date_i18nPHP'nin yerleşik tarihine eşdeğerdir ve tüm ilgili işlemler de oradadır. Ay adları, gün adları vb.

Ayrıca, asla yasaları çiğnemeyin . Sadece bir hatırlatıcı. :)


Vay be, bu gerçekten iyi bir açıklama! Yardımınız için çok teşekkürler! Şimdi net görüyorum.
Circuit Circus

6

__ (), _e () ve _x (), _ex ()

__()ve _e()esasen hem bir sargıdır translate()(doğrudan kullanmayın) hem de neredeyse aynıdır.

Aradaki fark __(), çevrilen dizeyi _e()döndürüp yankılanmasıdır. Her ikisinin de gerekli bir parametre olarak bir dize ile beslenmesi gerekir ve genellikle isteğe bağlı olarak da bir metin alanı.

Benzer şekilde, dizenin nerede göründüğünü açıklayabilecek bir bağlam belirtmenize izin veren _x()ve vardır _ex(). Projeniz birkaç ondan fazla çevrilebilir dize içeriyorsa, bağlam kullanmak çok mantıklıdır.

Ayrıca, çoğulların _n()ve _nx()çoğulların varlığına dikkat edin .

Ortak kullanım örneği

$output = '<label for="some_field">' .
        _x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
    '</label>' .
    '<input type="text" name="some_field" value="" />' .
    '<p class="description">' .
        _x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
    '</p>';

return $output;

Parametreler

__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )

Tüm parametreler $numberdizedir. Ancak $domainhepsi zorunludur.

Değişkenler ve sprintf () ile daha fazla esneklik

Dizelerinizde değişken sayılar veya kelimeler varsa, şunu kullanın sprintf():

$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );

$output = '<p>' .
        sprintf(
            _x(
                'The movie titled %2$s received a %1$d star rating.',
                'Movie Description',
                'your-text-domain'
            ),
            $stars,
            $title
        ) .
    '</p>';

return $output;

Ek kaynaklar

Yaklaşan WordPress I18n Ninja için bazı ek kaynaklar:


Ayrıca , işlevlerin ve ayrıntılı açıklamaların tam bir dökümü için kodeksindeki "Çeşitli" altındaki "Yerelleştirme" bölümüne bakın.
TheDeadMedic


@Johannes Pille: Benimkini gönderene kadar cevabınızı fark etmedim, yazımı silmeli miyim?
Jeremy Jared

@JeremyJared Hayır, neden? Daha fazla bilgi kötü bir şey olamaz, değil mi ?! Bence cevabınız iyi düşünülmüş. Benden +1.
Johannes Pille

@TheDeadMedic "Ek kaynaklar" halinde düzenlendi.
Johannes Pille

3

Çeviriler konusunda uzman değilim, ancak WordPress Kodeksi Sayfası iyi belgelere sahip ve her örneği kullanma nedenini açıklıyor.

Kodeks sayfalarından:

__()

Mesaj başka bir işleve argüman olarak iletildiğinde kullanılır; _e()mesajı doğrudan sayfaya yazmak için kullanılır. Bu iki işlev hakkında daha fazla ayrıntı:

__('message')

Yerelleştirme modülünde 'iletinin' çevirisini arar ve çeviriyi PHP dönüş deyimine iletir. Eğer 'mesaj' için çeviri bulunmazsa, sadece 'mesaj' döndürür.

_e('message')

Yerelleştirme modülünde 'iletinin' çevirisini arar ve çeviriyi PHP yankı deyimine iletir. Eğer 'mesaj' için bir çeviri bulunmazsa, sadece 'mesaj' yankılanır.

Bir Temayı veya Eklentiyi uluslararasılaştırıyorsanız, bir "Text Domain" .

Gettext çerçevesi, WordPress'in çoğunu halleder. Ancak, WordPress dağıtımında gettext'in kullanılamadığı birkaç yer vardır:

  • Ana WordPress README dosyası - bir PHP dosyası değil, statik bir HTML dosyasıdır, bu nedenle gettext işlevleriyle çalıştırılamaz.
  • Gettext yüklenmeden önce WordPress yükleme döngüsünün çok erken saatlerinde birkaç hata mesajı oluşturulur.

Kodeks Sayfasına Bağlantı

Gettext'in ne zaman çalışmadığı hakkında ek bilgi

Umarım bu sorunuzu cevaplar, bize bildirmezseniz ve belki başka biri yardımcı olabilir veya ben biraz daha araştırma yapabilirim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.