Traducciones Django y gettext: La obsolescencia del operador % (interpolación de cadenas)

Aunque Django Django aún no es compatible con Python 3, eventualmente lo será, por lo que quiero mantener mi código lo más "a prueba de futuro" posible.

Desde Python 2.7, el operador de interpolación de cadenas (%) está en desuso. Y me di cuenta de que cada cadena que necesita ser traducida está usando el % sintaxis de interpolación. Y en los documentos de Django no se menciona el nuevo str.format método (la "nueva" forma oficial de formato de cadenas)...

Tal vez hay una limitación de la gettext biblioteca, pero no lo creo, ya que la cadena parece idéntica en los archivos .PO.

La pregunta es si puedo usar la nueva cadena. format método para la traducción.

A la vieja usanza:

class Post(models.Model):
    title = models.CharField(max_length=50)
    date = models.DateField()
    # ...
    def __unicode__(self):
        return _('%(title)s (%(date)s)') % {
            'title': self.title,
            'date': self.date,
        }

La "nueva" forma:

class Post(models.Model):
    title = models.CharField(max_length=50)
    date = models.DateField()
    # ...
    def __unicode__(self):
        return _('{title} ({date})').format(
            title=self.title,
            date=self.date,
        )

También, trabaja para ugettext_lazy realmente no devuelve cadenas, pero Promises, objetos que se evalúan solo cuando es necesario.

preguntado el 12 de junio de 12 a las 16:06

¿Has probado? No deja en claro si lo intentó y falló o simplemente pregunta si es posible. No veo ninguna razón obvia por la que no debe funciona, pero si falla, entonces las extensiones gettext de Django simplemente deben ser incompatibles, lo que significa que básicamente no tiene suerte. Cuando Django admita Python 3, podrá usarlo como Python 3. -

Lo he intentado y todo parece funcionar bien, pero no estoy seguro de si es la forma "correcta" de hacerlo, ya que los documentos no mencionan nada sobre esta desaprobación. -

1 Respuestas

Podrías usarlo con seguridad. Por ejemplo

ugettext_lazy('{foo}').format(foo='bar')

El programa de traducción xgettext, que es utilizado por Django, no se preocupa por el contenido a traducir. solo busca .py archivo para palabras clave como ugettext_lazy or _ para recopilar las cadenas traducibles (refs el manual de xgettext y Código Django)

Además, el .format() El método anterior es un contenedor proporcionado por el objeto proxy, como:

>>> ugettext_lazy(u'{foo}').format
<bound method __proxy__.__wrapper__ of <django.utils.functional.__proxy__ object at 0x102f19050>>

La invocación de lo anterior .format() obtendría u'{foo}' para ser traducido a algún Unicode value, luego llame value.format con argumentos reales. Se podía ver que la traducción y value.format suceder en diferentes etapas.

Respondido el 12 de junio de 12 a las 18:06

¿Podría aclarar qué sucede con los nuevos fstrings? - Adam Barnes

@AdamBarnes No hay magia. Las cadenas f están formateadas por Python. Si usas f-strings dentro _(), la _ recibirá una cadena ya formateada (con {foo} ya reemplazado) y no encontrará la cadena de referencia correcta en la tabla de traducción (.mo archivos). - zopieux

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.