La localisation Python (l10n) est plus simple que vous ne le pensez. Le module gettext intégré de Python fournit un moyen standard de séparer le code de votre application de son texte destiné à l'utilisateur.
Dans ce guide, nous présenterons un exemple simple montrant comment faire en sorte qu'une application Python de base parle plusieurs langues.
Étape 1 : La candidature monolingue
Publicité
Je ne veux pas manquer le meilleur deActualités technologiques?
Définissez-nous comme source préférée dans la recherche Google
et assurez-vous de ne jamais manquer nos dernières nouveautés.
Commençons par une simple application en ligne de commande que nous utiliserons comme démo. C'est un programme très basique qui accueille l'utilisateur et lui demande son nom. Notez que toutes les chaînes destinées à l'utilisateur sont codées en dur directement dans les instructions print() et input().
# app.py
defrun_app():
print("Welcome to the multilingual demo!")
name =input("Please enter your name: ")
print(f"Hello, {name}! How are you today?")
if __name__ =="__main__":
run_app()Ce code fonctionne parfaitement, mais il présente une limitation majeure : il ne fonctionne que pour les anglophones. Notre objectif est de le rendre suffisamment flexible pour afficher ces chaînes en espagnol, en français ou dans toute autre langue sans changer la logique de base.
Étape 2 : Marquage des chaînes pour la traduction
La première étape de l'utilisation de gettext consiste à indiquer à Python quelles chaînes de votre code doivent être traduites. Nous faisons cela en les enveloppant dans une fonction spéciale. Le module gettext fournit une fonction pour cela, mais il est courant de l'aliaser en un seul trait de soulignement, _(), par souci de concision.
Lecture recommandée :Les 6 types de dégâts de Borderlands 4 expliqués avec les faiblesses de l'ennemi et des exemples
Publicité
Nous allons maintenant parcourir unExemple d'obtention de texte Pythonpour vous montrer comment préparer votre code pour la traduction. Ce simple changement est la partie la plus cruciale du processus.
Mettons à jour notre script app.py pour utiliser cette fonction.
# app.py
import gettext
# Set up a placeholder for the gettext function.
# This makes it easy to replace with a real translation
# function later, as you'll see.
_ = gettext.gettext
defrun_app():
print(_("Welcome to the multilingual demo!"))
name =input(_("Please enter your name: "))
print(_(f"Hello, {name}! How are you today?"))
if __name__ =="__main__":
run_app()Vous avez maintenant marqué avec succès vos chaînes pour la traduction. Nous n'avons pas encore ajouté de nouvelles langues ; nous venons de préparer notre application pour les gérer.
Étape 3 : Création et gestion des fichiers de traduction
Ensuite, nous devons extraire les chaînes que nous avons marquées et les mettre dans un format qu'un humain peut traduire. Il s'agit d'un processus en plusieurs étapes qui implique quelques outils de ligne de commande.
Publicité
La première chose que vous devrez faire est de créer une structure de répertoires standard pour nos traductions, qui ressemblera à ceci :
└── my_app/
├── app.py
└── locales/
├── en_US/
│ └── LC_MESSAGES/
│ └── base.po
└── es_ES/
└── LC_MESSAGES/
└── base.poMaintenant, nous utilisons un outil de ligne de commande comme pybabel ou xgettext pour analyser notre code et générer un fichier .pot (Portable Object Template). Ce fichier est un plan contenant toutes les chaînes originales que nous avons marquées. Nous nommons notre fichier de traduction principalbase.popour signifier qu'il contient les chaînes de base de notre application. Il s'agit d'une pratique courante qui permet d'organiser des projets plus importants dans lesquels vous pouvez avoir des fichiers séparés pour différentes sections de l'application (par exemple, Forms.po, Errors.po, etc.).
# We'll use xgettext, which is part of the gettext-tools package
# Note: You may need to install this system-wide on your machine.
xgettext --language=Python --keyword=_ --output=locale/base.pot app.pyCette commande analyse app.py à la recherche de chaînes enveloppées dans _() et les enregistre dans locale/messages.pot.
Ensuite, nous créons les fichiers de traduction réels à partir de ce modèle. Chaque langue possède son propre fichier .po (Portable Object).
# Create a .po file for Spanish (es_ES)
msginit --locale=es_ES --input=locales/base.pot --output-file=locales/es_ES/LC_MESSAGES/base.po
# You can also create one for English to be explicit
msginit --locale=en_US --input=locales/base.pot --output-file=locales/en_US/LC_MESSAGES/base.poÉtape 4 : Ajouter les traductions
Le fichier .po est un fichier texte brut avec lequel les traducteurs peuvent facilement travailler. Il est organisé en blocs, oùmsgstrest la chaîne originale de votre code etmsgstrest la traduction. Tout ce qu'un traducteur doit faire est d'ouvrir le fichier .po de sa langue cible et de remplir les champs msgstr.
Jetons un coup d'œil à ce à quoi ressemblerait notre fichier .po espagnol (locales/es_ES/LC_MESSAGES/base.po) après qu'un traducteur ait travaillé dessus :
Publicité
# This file is for Spanish translations.
#
msgid ""
msgstr ""
"Project-Id-Version: Multilingual Demon"
"Content-Type: text/plain; charset=UTF-8n"
"Content-Transfer-Encoding: 8bitn"
"Language: es_ESn"
msgid "Welcome to the multilingual demo!"
msgstr "¡Bienvenido a la demostración multilingüe!"
msgid "Please enter your name: "
msgstr "Por favor, introduce tu nombre: "
msgid "Hello, {name}! How are you today?"
msgstr "¡Hola, {name}! ¿Cómo estás hoy?"Notez le format : chaque msgid est suivi de son msgstr correspondant. Le traducteur modifie uniquement la ligne msgstr, laissant le msgid d'origine intact. Cette séparation claire de la source et de la traduction est un avantage essentiel du système gettext.
Étape 5 : Compilation et exécution de l'application
Une fois les traductions terminées, il ne reste plus qu'une dernière étape : compiler les fichiers .po dans un format binaire que Python peut lire efficacement. Ceux-ci sont appelés.mo(Objet Machine). La commande msgfmt prend votre fichier .po lisible par l'homme et le convertit au format .mo lisible par machine.
# Compile the Spanish .po file into a .mo file
msgfmt -o locales/es_ES/LC_MESSAGES/base.mo locales/es_ES/LC_MESSAGES/base.poNotre application est désormais prête à être multilingue ! Nous devons simplement mettre à jour notre script Python pour utiliser le fichier .mo correct en fonction des paramètres régionaux de l'utilisateur. Cela implique quelques étapes clés :
- Définissez le répertoire :Dites à gettext où trouver les fichiers .mo.
- Chargez la traduction :Utilisez gettext.translation() pour charger le fichier correct en fonction du paramètre de langue de l'utilisateur.
- Installez la traduction :Utilisez translation.install() pour « installer » la nouvelle traduction, afin que notre fonction _() pointe désormais vers la langue correcte.
Voici la version finale et complète de notre script app.py :
# app.py
import gettext
import os
# Define the root directory for our translation files
LOCALE_DIR = os.path.join(os.path.abspath(os.path.dirname(__file__)),'locales')
defsetup_language(lang_code):
try:
# Load the translation from the locale directory
translation = gettext.translation('base',localedir=LOCALE_DIR,languages=[lang_code])
# Install the translation globally so gettext can find it
translation.install()
exceptFileNotFoundError:
# Fallback to a default language (e.g., English) if translation isn't found
print(f"Warning: Translation for '{lang_code}' not found. Using default language.")
gettext.install('base', LOCALE_DIR,names=['ngettext'])
if __name__ =="__main__":
# Simulate setting the user's language environment.
# On a real system, you might read this from a user setting or system locale.
# Try running the app in Spanish
setup_language('es_ES')
print(_("Welcome to the multilingual demo!"))
# Now, let's switch to English for the rest of the app's flow
setup_language('en_US')
name =input(_("Please enter your name: "))
print(_(f"Hello, {name}! How are you today?"))Si vous exécutez ce script final, vous verrez la première ligne de sortie en espagnol, tandis que l'invite et la sortie suivantes restent en anglais, démontrant que les traductions fonctionnent correctement et peuvent être commutées dynamiquement.
Derniers mots
En utilisantobtenir du texte, nous avons clairement séparé le code de notre application de ses chaînes lisibles par l'homme, ce qui rend l'ensemble du projet beaucoup plus facile à maintenir, à traduire et à mettre à l'échelle.
Publicité
Mais ce n'est que le début. Le module gettext gère également des fonctionnalités plus complexes telles que la pluralisation et les traductions contextuelles, vous permettant de créer des applications multilingues avancées. Maintenant que vous comprenez les principes fondamentaux, vous êtes bien équipé pour faire en sorte que vos propres projets Python parlent plusieurs langues.












