Django et Wagtail offrent d'excellentes possibilités de traduction. Cependant, si on crée des blocs (snippets) dans notre éditeur, la traduction est moins évidente. Ce didacticiel propose un moyen de contourner ce problème.
Le texte des modèles, des vues, des formulaires, des modèles peut être traduit en utilisant les options de traduction de Django. Le contenu des pages Wagtail peut être traduit par d'autres moyens. Ce n'est pas possible pour les blocs dans Wagtail, on doit donc trouver un moyen de traduire le texte qu'on ajoute aux blocs dans notre éditeur. Dans les didacticiels précédents, on a utilisé des blocs, lors de la définition de thèmes ou lors de la création d'un menu. Pour traduire des pages, on s'est appuyé sur wagtailtrans; ce serait bien si on pourrait également utiliser ce package pour les snippets. Bien qu'il y ait des réflexions à ce sujet, ce n'est pas encore possible.
Une solution serait d'utiliser la balise trans
dans notre modèle, par exemple {% trans item.title%}
, où item
est une instance d'extrait de code. L'inconvénient est que makemessages
, l'utilitaire de détection de traduction de Django, ne détecteront pas ces variables, comme mentionné dans la documentation de Django. Cela signifie qu'on devrait saisir manuellement toutes les valeurs possibles de toutes les variables dans le fichier de traduction, chaque fois qu'un tel fichier est généré. C'est clairement sous-optimal.
Notre méthode sera au package django-modeltranslation. Je dois mentionner qu'il y a un inconvénient: la traduction des champs du modèle doit être effectuée dans l'admin Django. On préférerait évidemment avoir ceci dans l'admin Wagtail. Le package associé wagtail-modeltranslation a une intégration d'admin Wagtail, mais par défaut, il traduit le modèle Page
de Wagtail, qui ajoute beaucoup de champs inutiles, et il n'y a pas de moyen facile d'empêcher cela. Le bifurquer et ajouter un simple interrupteur pour cela est une option, mais a aussi ses inconvénients. On va donc aller avec django-modeltranslation pour l'instant:
pip3 install django-modeltranslation
l'ajoutant à notre requirements.txt
et mettant modeltranslation
dans nos INSTALLED_APPS
. Dans certaines configurations (y compris la mienne), cela ne fonctionnera qu'en mettant ceci avant django.contrib.admin
, c'est donc ce qu'on fera. Vérifiez que USE_I18N = True
dans vos paramètres et que LANGUAGES
définit les langues dont vous avez besoin. Créez maintenant un fichier translation.py
dans votre application et ajoutez les modèles que vous souhaitez traduire, dans notre cas:
from modeltranslation.translator import register, TranslationOptions
from .models import Theme, MenuItem, Menu
@register(Theme)
class ThemeTranslationOptions(TranslationOptions):
fields = ('name',)
@register(MenuItem)
class MenuItemTranslationOptions(TranslationOptions):
fields = ('link_title',)
@register(Menu)
class MenuTranslationOptions(TranslationOptions):
fields = ('title',)
On doit ajouter ces modèles à l'admin afin qu'ils puissent y être modifiés. On organisera nos éléments de menu en fonction de nos menus:
from .models import Theme, MenuItem, Menu
from django.contrib import admin
from modeltranslation.admin import TranslationAdmin, TranslationTabularInline
class ThemeAdmin(TranslationAdmin):
model = Theme
class MenuItemInline(TranslationTabularInline):
model = MenuItem
class MenuAdmin(TranslationAdmin):
model = Menu
inlines = [MenuItemInline,]
admin.site.register(Theme, ThemeAdmin)
admin.site.register(Menu, MenuAdmin)
Maintenant, on migre la base de données. Cela ajoutera des champs supplémentaires pour chaque langue et pour chaque champ spécifié dans translation.py
. Après avoir fait cela, on met à jour la base de données à l'aide de la commande update_translation_fields
:
python3 manage.py update_translation_fields
On est maintenant prêt à visiter l'admin Django et à voir nos extraits de code, à y ajouter des traductions ou même à ajouter de nouveaux éléments.
Si vous êtes intéressé à construire un commutateur de langue dans votre navigation, lisez la suite.
Commentez cet article (connectez-vous d'abord ou confirmez par nom et email ci-dessous)