diff --git a/content/developer/reference/backend/security.rst b/content/developer/reference/backend/security.rst index 5daef4abb..9e6b4c4b0 100644 --- a/content/developer/reference/backend/security.rst +++ b/content/developer/reference/backend/security.rst @@ -418,9 +418,9 @@ the content (text). Markup('<R&D>

Hello

') >>> escape("") Markup('<R&D>') - >>> escape(_("List of Tasks on project %s: %s")) % ( + >>> _("List of Tasks on project %s: %s", ... project.name, - ... Markup("") % Markup().join([Markup("
  • %s
  • ") % t.name for t in project.task_ids]) + ... Markup("") % Markup().join(Markup("
  • %s
  • ") % t.name for t in project.task_ids) ... ) Markup('Liste de tâches pour le projet <R&D>: ') @@ -434,6 +434,22 @@ the content (text). >>> Markup(f"

    Foo {self.bar}

    ") # bad, bar is inserted before escaping >>> Markup("

    Foo {bar}

    ").format(bar=self.bar) # good, sorry no fstring +When working with translations, it is especially important to separate the HTML +from the text. The translation methods accepts a :class:`~markupsafe.Markup` +parameters and will escape the translation if it gets receives at least one. + +.. code-block:: pycon + + >>> Markup("

    %s

    ") % _("Hello ") + Markup('

    Bonjour <R&D>

    ') + >>> _("Order %s has been confirmed", Markup("%s") % order.name) + Markup('Order SO42 has been confirmed') + >>> _("Message received from %(name)s <%(email)s>", + ... name=self.name, + ... email=Markup("%s") % (self.email, self.email) + Markup('Message received from Georges <george@abitbol.example>') + + Escaping vs Sanitizing ----------------------