Skip to content

Fix Odoo Translations Not Showing: Language and i18n Troubleshooting

DeployMonkey Team · March 23, 2026 10 min read

The Translation Problem

You installed a new language in Odoo, switched to it, but everything is still in English. Or worse — some strings are translated while others remain untranslated, creating a confusing mixed-language interface. This is one of the most common Odoo issues for non-English deployments.

Common Symptoms

  • Language installed but interface stays in English
  • Some menu items translated, others not
  • Reports and emails always in English
  • Custom module strings never translate
  • Translations work in backend but not on website
  • After module update, translations disappear

Root Causes and Fixes

1. Language Not Set on User

Installing a language does not automatically switch users to it. Each user must have the language set in their preferences.

Fix: Go to Settings > Users, open the user, click Preferences tab, set Language to the desired language, and save. The user must log out and log back in.

2. Translation Files Not Loaded

When you install a module after installing a language, the module's translations may not load automatically.

Fix: Go to Settings > Translations > Languages, find your language, and click "Activate" again (even if already active). Alternatively, update the module:

# Reload translations for a specific module
./odoo-bin -d mydb -u my_module --stop-after-init --i18n-overwrite

The --i18n-overwrite flag is critical — without it, Odoo skips translations that already exist in the database, even if they are outdated.

3. Missing .po Files in Custom Module

Custom modules need translation files in the i18n/ directory. Without them, there is nothing to translate.

Fix: Export translatable terms, translate them, and add the .po file:

# Export terms to translate
./odoo-bin -d mydb -l fr_FR --modules=my_module --i18n-export=/tmp/my_module.po

# Place translated file at:
# my_module/i18n/fr.po

The file name must match the language code: fr.po for French, es.po for Spanish, de.po for German.

4. Wrong Translation File Name

Odoo expects specific file naming in the i18n/ directory.

Common mistakes:

  • fr_FR.po instead of fr.po (use short code)
  • FR.po instead of fr.po (must be lowercase)
  • File in wrong directory (must be module_name/i18n/)

5. Cached Translations

Odoo caches translations aggressively. After updating .po files, the old translations may persist.

Fix:

# Clear translation cache by restarting Odoo with overwrite
./odoo-bin -d mydb -u my_module --stop-after-init --i18n-overwrite

# Or via the UI:
# Settings > Translations > Languages > select language > Load button

6. Website Translations

The website module has its own translation layer. Even if backend translations work, website pages may show English.

Fix:

  • Enable the language for your website: Website > Configuration > Settings > Languages
  • Use the website editor to translate pages manually
  • Check that website.menu items have translations

7. Report and Email Translations

Reports and emails use the partner's language (partner_id.lang), not the current user's language.

Fix: Ensure the partner/customer has the correct language set on their contact form. For reports, Odoo renders in the context of the partner's language:

# In code, force report language:
report = self.env['ir.actions.report'].with_context(lang=partner.lang)
report._render_qweb_pdf('module.report_template', [record_id])

8. Translatable Field Not Marked

In custom modules, string fields must be explicitly marked as translatable:

# NOT translatable (default)
name = fields.Char(string="Name")

# Translatable
name = fields.Char(string="Name", translate=True)

Only fields with translate=True can have per-language values.

Debugging Translation Issues

# Check loaded translations in database
SELECT src, value, module 
FROM ir_translation 
WHERE lang = 'fr_FR' AND module = 'my_module' 
LIMIT 20;

# In Odoo 17+ (ir.translation removed, translations stored differently):
# Check ir_model_data and field translations directly
SELECT * FROM ir_model_fields 
WHERE model = 'my.model' AND translate = true;

Note: Odoo 16+ moved away from the ir_translation table. Translations are now stored directly in JSONB columns on the model's table. The debugging approach differs between Odoo versions.

Complete Translation Reload Procedure

  1. Export current translations: Settings > Translations > Export Translation
  2. Update your .po files with new translations
  3. Place files in module/i18n/lang_code.po
  4. Run: ./odoo-bin -d mydb -u module_name --i18n-overwrite --stop-after-init
  5. Restart Odoo
  6. Have users log out and log back in
  7. Clear browser cache