HTML, __ () veya _e () dil çeviri dizesi


24

Çeviri dizgelerini oluşturmak için uygun yaklaşım nedir?

Örneğin,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

Dizeleri ve / veya HTML'yi eklemeniz sorun olur mu, yoksa önce yapılmalı ve sonra aşağıdaki gibi çeviri yoluyla çalıştırılmalıdır:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 

Yanıtlar:


41

İşlevde ikinci bir argüman var __(). Eklentiniz veya temanız için kullandığınız etki alanına ayarlanmalıdır. Aşağıdaki örneklerde kullanıyorum 'text_domain'. Etki alanı dizenizin benzersiz olması gerekir. Başka bir etki alanı dizgisiyle eşleşmemelidir. Varsayılan olarak bir metin etki alanı argümanı kullanmamak'default' , WordPress etki alanı adına . Daha fazla bilgi için linke bakınız.

Her zaman dizeyi kullan ('text_domain' ) . Asla içinde bir dize olan değişken, işlev veya sabit kullanmayın. (Tümü?) Çeviri programlarının çoğu, orada dize olmadan onu görmez.

Senin kodun:

echo __( 'Hello ' . $first . ' you own me money.' );

Dize değişkenleri dahil etmeyin.

En iyi yol:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Ya da sadece:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Yer %stutucu, insan tercümana bir ipin oraya girdiğini söyler. %dSayılar için kullanın . De vardır diğer tutucuları .

(Bu cümle dilbilgisi açısından yanlışdır. İngilizce ya 'Hello %s, you owe me money.'da 'Hello %s, you own my money.'niyetlendiğiniz anlama bağlı olarak kullanın .)


Senin kodun:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

HTML'yi çevirme. Herhangi bir dilde aynıdır.

En iyi yol:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

Veya birden fazla satıra bölün:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

Hangi Üst ve Alt ne olduğu belli değilse _x(), bu terimlerin içeriğini açıklamak için kullanabilirsiniz .


Diğer çeviri örneklerini burada bulabilirsiniz: Uluslararasılaşma: Muhtemelen yanlış yapıyorsun


HTML'yi çevirme dedin. Tercüme edilmediğine, önceden çevrilmiş dizgelerin mevcut tablosuna / tablolarına bakıldığına işaret edebilirim. Dizgide HTML olması, çevirmenin bunları çıkarmaması şartıyla bir fark yaratmaz. Aslında, bazı durumlarda, regex arama ve değiştirme işlemlerinden daha iyi performans sağlar.
Twifty

İlgisiz, ancak dikkat çekiyor: textdomaindeğişmez bir dize olması gerekiyor, değişken / sabit / özellik olamaz.
brasofilo 15:13

@brasofilo, bu tavsiye tepeye yakın cevapta yazılmıştır, ancak tekrar eder. Bu hatayı müşteriler için yazdığım birçok özel eklentide yaptım.
Charles Clarkson

İçin +1 sprintf(). Gerçekten de çevrilebilir dizgede HTML'nin olmasının yolu budur.
helgatheviking

Kullanımın, sprintf()belki biraz daha temiz bir görünümden başka bir şekilde nasıl yardımcı olduğunu anlamıyorum . Eğer böyle bir HTML iç bir cümle varsa Some text with a <strong>strong</strong> word inside.mümkün çevirmek bir bütün olarak cümleyi tercüme ve etmemenin ne kadar Some text with a, strongve word inside(hiçbir mantıklı) ayrı ayrı.
phpheini

4

Zaten söylendiğinden beri dizedeki değişkenler sorununu ele almayacağım.

Dizenizi sabit tutmak istediğinizde içeriğin değişmeyeceği anlamına gelir. Ayrıca gereksiz HTML’den uzak durmak da istersiniz.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

Yukarıdakiler tablonuzda esas olarak aynı metin olan şey için iki satır alacaktır. Bunlar şu şekilde yeniden yazılabilir:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

Tek bir satıra indirgeme.

Bazen metindeki HTML kaçınılmazdır. Mesela:

__( 'You currently owe <b>%s</b> dollars' );

Dilleri gramer olduğu için, metni bölmek, çeviren kişi için sorunlara neden olacaktır.

Başparmak kuralı. HTML metni biçimlendirme etiketleri orta cümle tamam. HTML ile başlayan ve biten cümle sadece boşa harcar.


Son örnekte, kalın etiketleri eklenen argümanın etrafına sarabilirsiniz "<b>$string</b>". O zaman kullanabilirsin 'You currently owe %s dollars'. Ancak yer tutucu _n()gerektiren işlevle kullanırsanız kalması gerekebilir %d.
Charles Clarkson

@CharlesClarkson İyi arama. Belki de %sonu biraz daha net hale getirmek için dışarıda bırakmalıydım .
12
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.