# General Translation Knowledge Base: General Translation ou Babel et Flask-Babel : lequel choisir ?
URL: https://generaltranslation.com/fr/kb/general-translation-vs-flask-babel.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Babel formate les dates, les nombres et les devises pour n’importe quel paramètre régional et gère les catalogues gettext, tandis que Flask-Babel l’intègre à Flask, mais aucun des deux ne traduit vos chaînes. La CLI de General Translation remplit les fichiers PO de Babel pour chaque langue, formes du pluriel comprises : vous pouvez ainsi conserver Flask-Babel et ne plus traduire vos catalogues à la main.
Category: Internationalisation
Last updated: 2026-10-16
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-16

Babel formate les dates, les nombres et les devises à l’aide des données Unicode CLDR, et sa commande `pybabel` extrait, met à jour et compile les catalogues de messages gettext. Flask-Babel intègre ces outils à la gestion des requêtes de Flask et aux modèles Jinja. General Translation remplit les catalogues entre l’extraction et la compilation : votre application bénéficie ainsi d’une traduction automatisée tout en conservant sa configuration initiale Flask-Babel.

## Les points forts de Babel et Flask-Babel

* **Formatage des paramètres régionaux à partir du CLDR.** [Babel 2.18.0 intègre les données du CLDR 47](https://babel.pocoo.org/en/latest/changelog.html#version-2-18-0) pour plus d&#39;un millier d&#39;identifiants de paramètres régionaux. `format_currency(1234.5, "EUR")` donne « 1.234,50 € » en espagnol, et `format_date` donne « 16 października 2026 » en polonais.
* **Outils de catalogue.** [`pybabel extract`](https://babel.pocoo.org/en/latest/cmdline.html) lit les fichiers Python et les modèles Jinja à l&#39;aide d&#39;une correspondance définie dans `babel.cfg`, `pybabel init` crée un fichier PO avec la bonne règle de pluriel et le bon nombre d&#39;emplacements (trois pour le polonais), `pybabel update` fusionne les nouvelles chaînes et marque comme « fuzzy » celles qui ont été modifiées, et `pybabel compile` génère les fichiers `.mo`.
* **Intégration avec Flask.** Un `locale_selector` et un `timezone_selector` [déterminent le paramètre régional et le fuseau horaire de chaque requête](https://python-babel.github.io/flask-babel/#configuration), `lazy_gettext` gère les chaînes définies au moment de l&#39;import, les modèles Jinja disposent de `_()`, de `{% trans %}` et de filtres de formatage, et `force_locale` change temporairement de paramètre régional, par exemple pour envoyer un e-mail dans une autre langue.
* **Stables et gratuits.** Les deux sont distribués sous licence BSD (voir [la licence de Babel](https://babel.pocoo.org/en/latest/license.html)). Babel fonctionne dans n&#39;importe quel programme Python ; la [version actuelle de Flask-Babel est la 4.0.0](https://github.com/python-babel/flask-babel/releases/tag/v4.0.0).

## Ce que Babel et Flask-Babel vous laissent à gérer

Voici une petite application Flask-Babel :

```python title="app.py"
from datetime import date
from flask import Flask, request
from flask_babel import Babel, gettext, ngettext, format_currency, format_date


def select_locale():
    return request.accept_languages.best_match(["en", "es", "pl"])


app = Flask(__name__)
babel = Babel(app, locale_selector=select_locale)


@app.route("/inbox/<int:count>")
def inbox(count):
    return {
        "title": gettext("Inbox"),
        "unread": ngettext("You have %(num)d unread message.", "You have %(num)d unread messages.", count),
        "price": format_currency(1234.5, "EUR"),
        "date": format_date(date(2026, 10, 16), format="long"),
    }
```

`pybabel extract`, `pybabel init -l pl` et `pybabel compile` génèrent un catalogue polonais dont tous les `msgstr` sont vides. Avec Flask-Babel 4.0.0, une requête envoyée avec `Accept-Language: pl` a alors renvoyé :

```json title="Output"
{
  "date": "16 października 2026",
  "price": "1 234,50 €",
  "title": "Inbox",
  "unread": "You have 5 unread messages."
}
```

Babel formate la date et le prix pour le polonais, mais toutes les chaînes restent en anglais, sans le moindre avertissement. Chaque chaîne attend que quelqu&#39;un renseigne son entrée PO, y compris les trois formes du pluriel du polonais, puis qu&#39;on exécute `pybabel compile` et qu&#39;on redéploie. Pour chaque chaîne ajoutée ou modifiée, il faut répéter ces étapes dans chaque langue.

## Traduire les catalogues de Babel avec General Translation

Si Flask-Babel vous convient déjà, conservez-le et laissez la CLI de General Translation générer les catalogues. Créez une seule fois un catalogue anglais, puis mettez-le à jour après chaque extraction, afin que la source se trouve dans la même arborescence que les traductions :

```bash
pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .
pybabel init -i messages.pot -d translations -l en     # une seule fois
pybabel update -i messages.pot -d translations -l en   # après chaque extraction
```

Faites ensuite pointer `gt.config.json` vers celui-ci. Cette configuration a été testée avec `gt` 2.26.5 :

```json title="gt.config.json"
{
  "defaultLocale": "en",
  "locales": ["es", "pl", "pt_BR"],
  "customMapping": { "pt_BR": { "code": "pt-BR" } },
  "files": {
    "pot": {
      "include": ["translations/[locale]/LC_MESSAGES/messages.po"],
      "transformationFormat": "PO"
    }
  }
}
```

La clé `pot` lit les fichiers PO et POT, et `"transformationFormat": "PO"` écrit les fichiers `.po` traduits (voir la [référence du format PO / POT](/docs/cli/reference/formats/po-pot-files)). [`customMapping`](/docs/cli/reference/config#custom-mapping) fait correspondre le répertoire `pt_BR` de Babel au code de langue standard `pt-BR`. Configurez la [CLI](/docs/cli/quickstart). Si vous disposez déjà de traductions, importez-les avec [`npx gt upload`](/docs/cli/reference/commands/upload) avant d&#39;en générer de nouvelles. Exécutez ensuite [`npx gt translate`](/docs/cli/reference/commands/translate), puis `pybabel compile -d translations`.

General Translation envoie chaque entrée accompagnée de son `msgctxt`, de ses commentaires de traduction, de ses références sources et de ses options comme contexte. Pour les entrées au pluriel, il écrit l&#39;en-tête `Plural-Forms` de la langue cible et remplit chaque emplacement `msgstr[n]` (le polonais reçoit donc bien ses trois formes), puis vérifie que les espaces réservés tels que `%(num)d` sont conservés intacts. Lors de l&#39;exécution suivante, les entrées inchangées réutilisent les traductions existantes. Un glossaire et des instructions personnalisées définis dans un [groupe de contexte](/docs/platform/dashboard/guides/defining-context-for-translations) garantissent la cohérence terminologique entre vos catalogues et le reste de votre produit, et les relecteurs peuvent [modifier chaque entrée](/docs/platform/dashboard/guides/reviewing-translations) dans le tableau de bord. Exécutez la CLI dans votre CI pour que chaque déploiement embarque des catalogues à jour. Si vous effectuez ensuite des modifications locales, enregistrez-les avec [`npx gt save-local`](/docs/cli/reference/commands/save-local) avant de relancer la génération.

## Babel et Flask-Babel vs General Translation en un coup d&#39;œil

| Fonctionnalité                                     | Babel et Flask-Babel                                                           | General Translation                                                            |
| -------------------------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
| Écriture des chaînes                               | Appels `gettext` et balises Jinja `{% trans %}`, extraits dans des fichiers PO | Conservez ces appels et ces modèles ; traduisez les catalogues extraits        |
| Traduit votre contenu                              | Non                                                                            | Oui, avec [`npx gt translate`](/docs/cli/reference/commands/translate)         |
| Formes du pluriel                                  | `pybabel init` crée les emplacements ; vous les remplissez un par un           | Génère tous les emplacements PO pour la langue cible                           |
| Formatage des dates, nombres et valeurs monétaires | Oui, à partir du CLDR                                                          | Conserve le formatage de Babel                                                 |
| Modèles Jinja                                      | Oui                                                                            | Traduit les messages extraits de vos modèles existants                         |
| Frameworks                                         | Babel partout ; Flask-Babel pour Flask                                         | CLI pour les catalogues PO issus de Flask ou d&#39;autres applications gettext |
| Licence                                            | BSD                                                                            | CLI sous licence MIT                                                           |
| Coût                                               | Gratuit                                                                        | [Traduction facturée à l&#39;usage](https://generaltranslation.com/pricing)    |

## Quand utiliser l&#39;un ou l&#39;autre

Conservez votre processus de traduction actuel si des traducteurs ou un TMS vous livrent déjà les catalogues dont vous avez besoin. Ajoutez General Translation si vous souhaitez que les messages nouveaux ou modifiés soient traduits dès le développement, avec les outils de terminologie et de relecture que votre équipe partage d&#39;un projet à l&#39;autre. Flask-Babel continue de prendre en charge Jinja, les paramètres régionaux de la requête, les dates et les devises ; le code de votre application reste inchangé.

## Points clés

* Babel formate les dates, les nombres et les devises pour n&#39;importe quel paramètre régional et gère les catalogues gettext ; Flask-Babel l&#39;intègre à Flask. Mais ni l&#39;un ni l&#39;autre ne traduit vos chaînes.
* Le CLI de General Translation traduit les fichiers PO de Babel grâce à la clé `pot`, à `"transformationFormat": "PO"` et à `customMapping` pour les répertoires comme `pt_BR`, et remplit toutes les formes plurielles de chaque langue.
* Conservez l&#39;affichage et le formatage de Flask-Babel, importez vos traductions existantes et insérez General Translation entre l&#39;extraction et la compilation.

## Related questions

- [General Translation ou GNU gettext : avez-vous besoin des deux ?](https://generaltranslation.com/fr/kb/general-translation-vs-gettext.mdx): Conservez GNU gettext pour l’extraction et l’affichage, et ajoutez General Translation pour générer et maintenir les fichiers PO. General Translation tient compte des notes aux traducteurs et du contexte des messages lors de la génération, applique une terminologie partagée et met à la disposition des relecteurs un éditeur dans le tableau de bord. Vos appels gettext existants et vos catalogues compilés restent en place.
- [General Translation ou le framework de traduction de Django : avez-vous besoin des deux ?](https://generaltranslation.com/fr/kb/general-translation-vs-django-i18n.mdx): Utilisez conjointement le framework de traduction de Django et General Translation. Django gère l’extraction des messages, la sélection de la langue et l’affichage. General Translation remplit ses fichiers PO, formes du pluriel comprises, avec la terminologie de votre produit et une relecture dans le tableau de bord. Vos modèles et vos motifs d’URL restent inchangés, tandis que les traductions évoluent au rythme de votre code.
- [General Translation vs i18next, react-intl et next-intl : quelle bibliothèque d’i18n choisir ?](https://generaltranslation.com/fr/kb/general-translation-vs-i18n-libraries.mdx): Les bibliothèques open source comme i18next, react-intl et next-intl ne traduisent rien. Elles affichent les traductions que vous leur fournissez dans un fichier de catalogue par langue, rédigées par vous, vos traducteurs ou un service tiers. Les bibliothèques de General Translation sont elles aussi open source et remplissent le même rôle, mais General Translation se charge en plus de la traduction, en s’appuyant sur votre code comme contexte.
- [Pourquoi utiliser General Translation plutôt qu’un TMS (Smartling, Lokalise, Phrase, Crowdin ou Transifex) ?](https://generaltranslation.com/fr/kb/general-translation-vs-tms.mdx): Un système de gestion de la traduction (TMS) comme Smartling, Lokalise, Phrase, Crowdin ou Transifex coordonne les traducteurs, mais les ingénieurs doivent toujours extraire les chaînes, les envoyer, attendre les traductions, puis les réintégrer dans le produit. General Translation traduit le contenu directement dans votre code, avec son contexte, fournit toutes les langues à chaque livraison et repose sur des bibliothèques open source, sans dépendance à un fournisseur.
- [Peut-on faire de l’i18n sans fichiers de traduction ?](https://generaltranslation.com/fr/kb/i18n-without-translation-files.mdx): Oui. Avec gt-react ou gt-next, le contenu reste intégré dans vos composants, à l’intérieur d’un composant `<T>`, et les traductions sont générées lors du build. Il n’y a donc ni clés ni fichiers JSON par paramètre régional à écrire et à garder synchronisés.

## Previous and next questions

- Previous question: [Faut-il développer votre propre i18n ou utiliser General Translation ?](https://generaltranslation.com/fr/kb/general-translation-vs-in-house-i18n.mdx)
- Next question: [General Translation ou GNU gettext : avez-vous besoin des deux ?](https://generaltranslation.com/fr/kb/general-translation-vs-gettext.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/fr/kb/sitemap.md) for every article.
