Bonjour,
j'ai un léger problème avec les url traduites sous django.
Voici la situation:
j'ai une app qui s'appèle project. Il n'y a rien dedans pour l'instant ce n'est une url :
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 from django.conf.urls import url from .views import * urlpatterns = [ url(r'^$', projects_index, name='index'), ]
et une vue qui contient seulement un code de débogage
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 from django.shortcuts import render from django.urls import reverse from django.utils.translation import activate, get_language def projects_index(request): context = { 'content': [] } cl = get_language() activate('en') context['content'].append(reverse('projects_urls:index')) # doit retourner '/en/projects/ activate('fr') context['content'].append(reverse('projects_urls:index')) # doit retourné '/fr/projets/' activate(cl) return render(request, 'projects/index.html', context)
et son template:
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 {% load i18n %} {% get_current_language as LANGUAGE_CODE %} <!DOCTYPE html> <html lang="{{ LANGUAGE_CODE }}"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% for c in content %} {% if forloop.first %} <ul> <li>{{ c }}</li> {% elif forloop.last %} <li>{{ c }}</li> </ul> {% else %} <li>{{ c }}</li> {% endif %} {% empty %} <p>No url resolved</p> {% endfor %} </body> </html>
voici en plus mon urls.py racine :
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 from django.conf.urls import url, include from django.conf.urls.i18n import i18n_patterns from django.utils.translation import ugettext_lazy as _ from django.conf import settings from django.contrib import admin import projects.urls urlpatterns = [] urlpatterns += i18n_patterns( url(r'^admin/', admin.site.urls), url(_(r'^projects/'), include(projects.urls, namespace='projects_urls')) ) if settings.DEBUG: import debug_toolbar urlpatterns += [ url(r'^__debug__/', include(debug_toolbar.urls)), ]
Normalement, lorsque je me rend sur localhost:8000/fr/projets/, je m'attend à obtenir la liste :
- /en/projects/
- /fr/projets/
Sauf qu'à la place, j'ai une ereur 404. je test avec /en/projects/ et j'obtiens :
- /en/projects/
- /fr/projects/
et /fr/projects/ fonctionne.
J'ai portant bien fait comme l'indique la documentation (ajouter le middleware, USE_I18N et USE_L10N à True, etc..)
Code python : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] + [ 'common', 'projects', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] # [...] LANGUAGE_CODE = 'fr' TIME_ZONE = 'Europe/Paris' USE_I18N = True USE_L10N = True USE_TZ = True LANGUAGES = ( ('fr', _('French')), ('en', _('English')) ) LOCALE_PATH = (os.path.join(MAIN_APP_DIR, 'locale'))
Je précise que mon fichier locale/fr/LC_MESSAGES/django.po est remplie comme il faut
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 #: maxlothaire_blog/urls.py:27 msgid "^projects/" msgstr "^projets/"
Est-ce que quelqu'un saurait où je me suis planté, ou ce qui manquerait pour faire fonctionner la traduction d'url ?
Merci d'avance
EDIT :
Il m'aura fallu une journée pour me rendre compte que j'ai oublié le S final de LOCALE_PATHS.
Chose étrange : cette erreur ne gène pas django pour les command makemessages et compilemessages,
En faite, pour ces commandes, il suffit que chaque application ait son dossier locale, pas besoin de d'initialisé LOCALE_PATHS pour ça
Mais, au moment d'afficher les traductions, django ne va les chercher que dans les applications ajoutées dans INSTALLED_APPS.et dans le tableau LOCALE_PATHS. D'où le bogue précédent
Partager