2011-01-09 12 views
30

Django şablonlarında, HTML içeren bir bloğu nasıl çevirebilirim? Örneğin: tercüme dizeleriDjango şablonları: İçinde HTML ile metin bloğu çeviri için en iyi yöntem

{% trans "Please" %} 
    <a href="{% url login %}?next={{ currentUrlPath }}"> 
     {% trans "log in" %} 
    </a> 
{% trans "in order to use MyApplicationName." %} 

kadar Yarma her an şablonda HTML değiştirmemi verir, ama bu kadar gibi tek çeviri dizesine koymak için daha mantıklı olur sanırım:

Ben her dil için dize yeniden tercüme etmesi gerekir HTML (çapa için örneğin CSS sınıf) değiştirmek istiyorsa

{% url login as loginUrl %} 
{% blocktrans %} 
    Please 
    <a href="{{ loginUrl }}?next={{ currentUrlPath }}"> 
     log in 
    </a> 
    in order to use MyApplicationName. 
{% endblocktrans %} 
Ama sonra HTML biçimlendirme, çeviri dizede ie.

Daha iyi alternatifler var mı? the docs itibaren

cevap

20

:

O {% trans%} içinde bir dizenin içinde bir şablon değişkenini karıştırmak mümkün değildir. Çevirileriniz değişkenlere sahip dizeleri (yer tutucuları) gerektiriyorsa, bunun yerine {% blocktrans%} kullanın. blocktrans altında Sonra

:

bir şablon ifadesini çevirmek için - nesne niteliklerini erişerek veya şablon filtreleri kullanarak, demek - çevirinin bloğu içinde kullanılmak üzere yerel bir değişkene ifade bağlamak gerekir . Örnekler:

{% blocktrans with article.price as amount %} 
That will cost $ {{ amount }}. 
{% endblocktrans %} 

{% blocktrans with value|filter as myvar %} 
This will have {{ myvar }} inside. 
{% endblocktrans %} 

çevrilmiş dizeleri yer tutucuları Bu şekilde. Eğer görünüm işlevinde anchor gider metni oluşturmak gerekecektir

{% blocktrans with login_object.anchor as anchor %} 
    Please {{ anchor|safe }}log in</a> in order to use MyApplicationName. 
{% endblocktrans %} 

: Senin durumunda. Bu, çevirdiğiniz dizeden uzak tutar. o parçalar halinde bölmek ne zaman çevirmen cümle doğru almak için

+0

Bu iyi bir çözüm, bunun için teşekkürler. Ned Batchelder'ın ayarını kullanacağım (sadece bir değişkendeki öznitelikleri saklıyorum). Maalesef, 'anchor' değişkeninin Django'nun yerleşik şablon dilini kullanarak kolayca oluşturulamayacağından haklısınız, bu yüzden benim görüşüme göre bunu yapmak zorundayım. – AndiDog

+4

Bunu yapabilirsiniz: {% url login olarak anchor_url%} {% blocktrans with anchor = ''|safe %}Please {{ anchor }}log in MyApplicationName kullanmak için. {% Endblocktrans%} –

11

o tek çeviri dizesinde tüm cümleyi koymak daha mantıklı olmakla kalmaz, bu imkansız olabilir. Cümlenin farklı bölümlerinin, zaman, dava, cinsiyet vb. Ile birbirlerini etkileyebileceğini unutmayın. Diğer dillerin İngilizce'den farklı davrandığından bahsetmiyorum. Örneğin "lütfen" kelimesi, örneğin bir istekte bulunup talepte bulunurken farklı olabilir. çevirmen hedef dilde doğru bir cümle yapmak, böylece

daima çeviri dizeleri tam cümleler kullanın.

Mike DeSimone sağ öneri yapar, ben buna sadece bir çimdik yapacak:

{% blocktrans with login_object.anchor_attr as anchor_attr %} 
    Please <a {{ anchor_attr|safe }}>log in</a> in order to use MyApplicationName. 
{% endblocktrans %} 

Bu dengeli çeviri dizesinde HTML tutar. Dizede açılış etiketi olmadan, dizede bir hataya kolaylıkla benzeyebilir.

+1

Ama bu durumda bizim çeviri .po dosyasında' a 'etiketi var , sağ? Herhangi bir html etiketi olmadan bir .po dosyasına sahip olmanın bir yolu var mı? Teşekkür ederim. – sergzach

+0

Basit bir yol yok. Cümledeki birkaç kelimeyi işaretlemeniz gerekiyorsa, sadece çevirmen size bu kelimelerin nerede olduğunu söyleyebilsin, bu yüzden onları bir şekilde işaretlemek zorunda kalacaklar. HTML kullanabilir veya kendi işaretlemenizi oluşturabilirsiniz. –

8

Sadece herhangi bir çeviri için sabit olan kısmi fragmanlar için uygun bir çözüm önerebilirim.

Bu durumda, içinde herhangi bir HTML veya CSS kullanmaktan kaçınabilirsiniz.po dosyası, sonraki olarak özel şablon etiketini kullanırken:

It costs %(sum2)s dollars. 

Ama zor bir soru - Kısmi parçaları ile ne:

@register.filter(name='safewrap') 
def safewrap(val, arg): 
    return val.format(arg) 
safewrap.is_safe = True 

... 

{% blocktrans with sum2="<a href='mysite.com/offer'>{0}</a>"|safewrap:sum %} 
    It costs {{sum2}} dollars. 
{% endblocktrans %} 

Yani, po dosyası sahip olduğunuz çeviri gerektiren (sizin durumunuzda olduğu gibi).

İlgili konular