Django : internationalisation des fichiers javascript : tutoriel complet
Django vient tout faire pour l’internationalisation de pages HTML, mais saviez-vous qu’il est aussi possible et de manière très simple d’internationaliser vos échanges AJAX ?
Vous avez un tutoriel ici.
Seul point noir : ils ont oublié deux éléments essentiels, je vais donc faire une explication courte ici, puis ajouter un résumé dans ma cheatsheet Django.
Dans l’ordre :
- Configuration de
urls.py
:
Ajouter le dictionnaire dans lequel vous précisez vos “packages”. Vos “packages”, ce sont simplement les dossiers qui correspondent à l’application que vous voulez afficher. Normalement c’est un dossier racine de votre projet, moi je l’appelle très souvent “app
” pour qu’il soit tout en haut des dossiers racine. Donc ici :js_info_dict = { 'packages': ('app',) }
- Configuration de
urls.py
:
Ajouter l’URLjsi18n
. Attention ! L’aide ne précise pas du tout où la mettre et c’est là où j’ai perdu énormément de temps, faites attention : il faut le mettre dans les patterns traduits, soit ici :urlpatterns += i18n_patterns( url(r'^jsi18n/$', javascript_catalog, js_info_dict, name='javascript_catalog'), # blabla... }
- Includes des fichiers
js
dans les pages :
<script src="{% url 'javascript_catalog' %}"></script>
- Includes des fichiers
js
dans les pages :
<script src="{% static 'js/globals.js' %}"></script>
- Dans le fichier précédent, j’ai le code suggéré dans la documentation :
function _(a) { return gettext(a); }
- Générer les chaînes à traduire. Là aussi dans la documentation ils en parlent mais très mal. Pour résumer, il faut préciser le domaine
djangojs
:
Exemple d’ordre qui lance la recherche de toutes les chaînes à traduire, en ignorant le dossierthird_party
(où je mets les outils externes que je ne veux pas toucher) :makemessages -d djangojs -i third_party --locale fr --locale en
- Traduire. Ce sont les fichiers djangojs.domaine
djangojs.po
qu’il faut modifier, pas le classiquedjango.po
(sansstrong>js
).
Et à partir de là, tout fonctionne : dans tous les fichiers JavaScript qui suivent, je peux traduire à la fois ce qui arrive en AJAX, ou bien tout simplement afficher un message via _()
. Exemple :
$('#menu').empty().append( $('<h5 />').html(_('Waiting...')) );