2014-05-17 16 views
7

Il seguente codice non funzionaImpossibile aggiungere una stringa tradotto in se stesso con gettext

from django.utils.translation import gettext_lazy as _ 

stringtest=_("First string") 
stringtest= stringtest + _(" Second string") 
print stringtest 

ottengo la seguente eccezione:

cannot concatenate 'str' and '__proxy__' objects 

È davvero impossibile aggiungere una stringa "tradotto" a se stesso ?

+0

Qual è l'eccezione? –

+0

@KrzysztofSzularz Ottengo un errore 'impossibile concatenare 'str' e '__proxy__' errori – Erwan

risposta

4

Non è possibile concatenare la stringa di due, ma la creazione di una nuova (che è già il caso con l'operazione + in ogni caso, dal momento che stringa sono immutabili):

from django.utils.translation import gettext_lazy as _ 

stringtest = _("First string") 
stringtest = "%s %s" % (stringtest, _(" Second string")) 
print stringtest 

Il problema è gettext_lazy restituisce un oggetto proxy, dal momento che di solito viene utilizzato per tradurre la stringa nella definizione della classe (nell'attributo model per esempio) e non è progettato per essere utilizzato nel codice vista, come lo state facendo in questo momento. L'oggetto proxy ha un metodo per tradurlo in un oggetto str MA non è una stringa.

Se non si ha realmente bisogno di questo _lazy specificità, si può semplicemente utilizzare gettext nel vostro punto di vista, che restituisce stringa di pianura:

>>> from django.utils.translation import gettext as _ 
>>> _("str1 ") + _("str2") 
'str1 str2' 
+0

Funziona perfettamente! Grazie – Erwan

8

Se si ha realmente bisogno per concatenare le stringhe traducibili pigri, django sostiene questo:

è possibile utilizzare django.utils.translation.string_concat(), che crea un oggetto pigro che concatena i suoi contenuti e li converte in stringhe solo quando il risultato è incluso in una stringa. Per esempio:

from django.utils.translation import string_concat 
from django.utils.translation import ugettext_lazy 
... 
name = ugettext_lazy('John Lennon') 
instrument = ugettext_lazy('guitar') 
result = string_concat(name, ': ', instrument) 

le traduzioni pigri risultato sarà convertito solo per le stringhe quando risultato stesso è utilizzato in una stringa (di solito a modello di rendering tempo).

EDIT:

ho trovato più semplice e facile da ricordare soluzione al problema - aggiungendo stringa vuota per oggetto proxy verrà convertito a stringa normale. Esempio:

>>> ugettext_lazy("The Beatles frontmen") + "" 
u'The Beatles frontmen' 

ma se avete bisogno di concatenare diverse deleghe, poi ciascuno di essi (ad eccezione di prima) deve essere convertito in una stringa prima, esempio:

>>> ugettext_lazy("The Beatles frontmen ") + (ugettext_lazy('John Lennon') + " ") 
    + (ugettext_lazy('played guitar') + "") 
u'The Beatles frontmen John Lennon played guitar' 
+1

Perché vorresti mai tradurre John Lennon;) (Sto scherzando, bella risposta :)) – gabn88

Problemi correlati