Edit on GitHub

Translating Modules

Exporting translatable term

A number of terms in your modules are “implicitly translatable” as a result, even if you haven’t done any specific work towards translation you can export your module’s translatable terms and may find content to work with.

Translations export is done via the administration interface by logging into the backend interface and opening Settings ‣ Translations ‣ Import / Export ‣ Export Translations

  • leave the language to the default (new language/empty template)
  • select the PO File format
  • select your module
  • click Export and download the file

This gives you a file called yourmodule.pot which should be moved to the yourmodule/i18n/ directory. The file is a PO Template which simply lists translatable strings and from which actual translations (PO files) can be created. PO files can be created using msginit, with a dedicated translation tool like POEdit or by simply copying the template to a new file called language.po. Translation files should be put in yourmodule/i18n/, next to yourmodule.pot, and will be automatically loaded by Odoo when the corresponding language is installed (via Settings ‣ Translations ‣ Load a Translation)


translations for all loaded languages are also installed or updated when installing or updating a module

Implicit exports

Odoo automatically exports translatable strings from “data”-type content:

  • in non-QWeb views, all text nodes are exported as well as the content of the string, help, sum, confirm and placeholder attributes
  • QWeb templates (both server-side and client-side), all text nodes are exported except inside t-translation="off" blocks, the content of the title, alt, label and placeholder attributes are also exported
  • for Field, unless their model is marked with _translate = False:
    • their string and help attributes are exported
    • if selection is present and a list (or tuple), it’s exported
    • if their translate attribute is set to True, all of their existing values (across all records) are exported
  • help/error messages of _constraints and _sql_constraints are exported

Explicit exports

When it comes to more “imperative” situations in Python code or Javascript code, Odoo is not able to automatically export translatable terms and they must be marked explicitly for export. This is done by wrapping a literal string in a function call.

In Python, the wrapping function is openerp._():

title = _("Bank Accounts")

In JavaScript, the wrapping function is generally openerp.web._t():

title = _t("Bank Accounts")


Only literal strings can be marked for exports, not expressions and not variables. For situations where strings are formatted, this means the format string must be marked, not the formatted string:

# bad, the extract may work but it will not correctly translate the text
_("Scheduled meeting with %s" % invitee.name)

# good
_("Scheduled meeting with %s") % invitee.name