2011-01-09 9 views
30

Nei modelli Django, come tradurrei un blocco che contiene HTML? Per esempio:Modelli Django: best practice per la traduzione di blocchi di testo con HTML in esso

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

Frazionamento stringhe tradotte mi permette di modificare il codice HTML nel modello in qualsiasi momento, ma credo che avrebbe più senso di metterlo in una singola stringa di traduzione, in questo modo:

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

Ma poi il codice HTML è nella stringa di traduzione, cioè se volessi cambiare l'HTML (es. La classe CSS per l'ancora), dovrei ritradurre la stringa per ogni lingua.

Ci sono alternative migliori?

risposta

20

Da the docs:

Non è possibile mescolare una variabile di modello all'interno di una stringa all'interno di {%% trans}. Se le tue traduzioni richiedono stringhe con variabili (segnaposto), usa invece% Blocchi%.

Poi sotto blocktrans:

Per tradurre un'espressione modello - dicono, accedendo attributi oggetto o utilizzando i filtri template - è necessario associare l'espressione a una variabile locale per l'uso all'interno del blocco di traduzione . Esempi:

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

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

In questo modo le corde tradotte hanno i segnaposto. Nel tuo caso:

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

Sarà necessario generare il testo che va nella anchor nella vostra funzione di visualizzazione. Questo lo tiene fuori dalla tua stringa tradotta.

+0

Questa è una buona soluzione, grazie per questo. Userò il tweak di Ned Batchelder (memorizzando solo gli attributi in una variabile). Sfortunatamente hai ragione che la variabile 'anchor' non può essere creata facilmente usando il linguaggio di template incorporato di Django, quindi devo farlo a mio avviso. – AndiDog

+4

Puoi fare ciò: {% url login come anchor_url%} {% blocktrans con anchor = ''|safe %}Please {{ anchor }}log in per utilizzare MyApplicationName. {% Endblocktrans%} –

11

Non solo ha più senso inserire l'intera frase in una stringa di traduzione, potrebbe essere impossibile per i traduttori ottenere la frase corretta quando è divisa in pezzi. Ricorda che le diverse parti della frase possono influenzarsi a vicenda, con tempi, casi, sesso e così via. Per non parlare del fatto che altre lingue si comportano diversamente dall'inglese. Per esempio, la parola "per favore" potrebbe essere diversa quando si fa una richiesta e si fa una richiesta, per esempio.

Utilizzare sempre frasi complete nelle stringhe di traduzione in modo che i traduttori possano pronunciare una frase corretta nella lingua di destinazione.

Mike DeSimone rende la raccomandazione giusta, vorrei fare solo un tweak per esso:

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

questo mantiene il codice HTML nella stringa di traduzione equilibrata. Senza il tag di apertura nella stringa, potrebbe facilmente apparire come un errore nella stringa.

+1

Ma in questo caso abbiamo il tag' a 'nel nostro file .po di traduzione , destra? È un modo per avere un file .po senza tag html? Grazie. – sergzach

+0

Non c'è un modo semplice. Se hai bisogno di segnare alcune parole nella frase, solo il traduttore può dirti dove sono quelle parole, quindi dovranno in qualche modo segnarle. Puoi utilizzare l'HTML o creare il tuo markup personale. –

8

Posso offrire una soluzione conveniente solo per frammenti parziali che sono costanti per qualsiasi traduzione.

In questo caso è possibile evitare di utilizzare qualsiasi HTML o CSS all'interno del proprio.file po quando si utilizzano tag modello personalizzato come il prossimo:

@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 %} 

Quindi, nel file .po si dispone:

It costs %(sum2)s dollars. 

Ma è una domanda difficile - che cosa fare con i frammenti parziali che richiedono la traduzione (come nel tuo caso).

Problemi correlati