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