From d87e1a59c031caf6022cf314fb32e44d4790fd9c Mon Sep 17 00:00:00 2001 From: Martin Trigaux Date: Wed, 29 Nov 2017 16:40:12 +0100 Subject: [PATCH] [IMP] doc: translation documentation Update screenshot for v11 Give examples of Do/Don't --- doc/reference/translations.rst | 97 +++++++++++++++++++++-- doc/reference/translations/po-export.png | Bin 6069 -> 12511 bytes 2 files changed, 92 insertions(+), 5 deletions(-) diff --git a/doc/reference/translations.rst b/doc/reference/translations.rst index 16c222ce25c..534853ff7dd 100644 --- a/doc/reference/translations.rst +++ b/doc/reference/translations.rst @@ -86,13 +86,100 @@ In JavaScript, the wrapping function is generally :js:func:`odoo.web._t`: Only literal strings can be marked for exports, not expressions or variables. For situations where strings are formatted, this means the - format string must be marked, not the formatted string:: + format string must be marked, not the formatted string - # bad, the extract may work but it will not translate the text correctly - _("Scheduled meeting with %s" % invitee.name) - # good - _("Scheduled meeting with %s") % invitee.name +Variables +^^^^^^^^^ +**Don't** the extract may work but it will not translate the text correctly:: + + _("Scheduled meeting with %s" % invitee.name) + +**Do** set the dynamic variables outside of the translation lookup:: + + _("Scheduled meeting with %s") % invitee.name + + +Blocks +^^^^^^ +**Don't** split your translation in several blocks or multiples lines:: + + # bad, trailing spaces, blocks out of context + _("You have ") + len(invoices) + _(" invoices waiting") + + # bad, multiple small translations + _("Reference of the document that generated ") + \ + _("this sales order request.") + +**Do** keep in one block, giving the full context to translators:: + + # good, allow to change position of the number in the translation + _("You have %s invoices wainting") % len(invoices) + + # good, full sentence is understandable + _("Reference of the document that generated " + \ + "this sales order request.") + +Plural +^^^^^^ +**Don't** pluralize terms the English-way:: + + msg = _("You have %s invoice") % invoice_count + if invoice_count > 1: + msg += _("s") + +**Do** keep in mind every language has different plural forms:: + + if invoice_count > 1: + msg = _("You have %s invoices") % invoice_count + else: + msg = _("You have %s invoice") % invoice_count + +Lazy +^^^^ + +**Don't** invoke translation lookup at server launch:: + + ERROR_MESSAGE = { + # bad, evaluated at server launch with no user language + access_error: _('Access Error'), + missing_error: _('Missing Record'), + } + + class Record(models.Model): + + def _raise_error(self, code): + raise UserError(ERROR_MESSAGE[code]) + +**Don't** invoke translation lookup before loading the translation memory:: + + # bad, js _t is evaluated too early + var core = require('web.core'); + var _t = core._t; + var map_title = { + access_error: _t('Access Error'), + missing_error: _t('Missing Record'), + }; + +**Do** evaluate dynamically the translatable content:: + + # good, evaluated at run time + def _get_error_message(): + return { + access_error: _('Access Error'), + missing_error: _('Missing Record'), + } + +**Do** use `_lt` for lazy-loading:: + + # good, js _lt is evaluated lazily + var core = require('web.core'); + var _lt = core._lt; + var map_title = { + access_error: _lt('Access Error'), + missing_error: _lt('Missing Record'), + }; + .. _PO File: http://en.wikipedia.org/wiki/Gettext#Translating .. _msginit: http://www.gnu.org/software/gettext/manual/gettext.html#Creating diff --git a/doc/reference/translations/po-export.png b/doc/reference/translations/po-export.png index 82f8d5ad0118578c2f7f111f73cddbf54d2e0c67..bd7fa14c3d88bb9eb417923e764e1f82df7b3aad 100644 GIT binary patch literal 12511 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≧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 literal 6069 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