[Localisation] Les patterns d'url ne sont pas correctement traduits
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:
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:
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:
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:
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:
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:
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 :D
EDIT :
Il m'aura fallu une journée pour me rendre compte que j'ai oublié le S final de LOCALE_PATHS. :aie:
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