changeset 184:49cc271f6de8

Setup i18n framework
author Sylvain Beucler <beuc@beuc.net>
date Sat, 24 Jul 2010 20:07:57 +0200
parents 845272b1916d
children 3d1a07772d4d
files savane/my/urls.py savane/my/views.py settings_default.py templates/base.html templates/my/i18n.html templates/my/index.html templates/svmain/group_list.html templates/svmain/pagination.inc.html templates/svmain/user_list.html
diffstat 9 files changed, 75 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/savane/my/urls.py
+++ b/savane/my/urls.py
@@ -49,7 +49,7 @@
   url(r'^$', direct_to_template,
       { 'template' : 'my/index.html',
         'extra_context' : { 'title' : 'My account', }, },
-      name='savane.my.views.index'),
+      name='savane.my.index'),
   url('^conf/$', views.sv_conf,
       { 'extra_context' : {'title' : 'Contact info', } }),
   url('^conf/resume_skill/$', views.sv_resume_skill,
@@ -57,6 +57,12 @@
   url('^conf/ssh_gpg/$', views.sv_ssh_gpg,
       { 'extra_context' : {'title' : 'SSH & GPG', } }),
   url('^conf/ssh_gpg/delete/$', views.sv_ssh_delete),
+  url('^i18n/$', direct_to_template,
+      { 'template' : 'my/i18n.html',
+        'extra_context' : {'title' : 'Language', } },
+      name='savane.my.language'),
+  # TODO: set_lang only lasts for the user's session
+  url('^i18n/', include('django.conf.urls.i18n')),
   url(r'^groups/$', only_mine(object_list),
       { 'queryset' : auth_models.Group.objects.all(),
         'extra_context' : { 'title' : "My groups", },
--- a/savane/my/views.py
+++ b/savane/my/views.py
@@ -169,6 +169,7 @@
     else:
         return {}
 
+
 class MailForm( forms.Form ):
     email = forms.EmailField(required=True)
     action = forms.CharField( widget=forms.HiddenInput, required=True, initial='update_mail' )
--- a/settings_default.py
+++ b/settings_default.py
@@ -32,6 +32,21 @@
 # http://www.i18nguy.com/unicode/language-identifiers.html
 LANGUAGE_CODE = 'en-us'
 
+# http://docs.djangoproject.com/en/dev/topics/i18n/deployment/#how-django-discovers-language-preference
+ugettext = lambda s: s
+LANGUAGES = (
+    ('ca',    ugettext('Catalan')),
+    ('de',    ugettext('German')),
+    ('en',    ugettext('English')),
+    ('es',    ugettext('Spanish')),
+    ('fr',    ugettext('French')),
+    ('it',    ugettext('Italian')),
+    ('ja',    ugettext('Japanese')),
+    ('pt_BR', ugettext('Portuguese (Brazil)')),
+    ('ru',    ugettext('Russian')),
+    ('sv',    ugettext('Swedish')),
+)
+
 SITE_ID = 1
 
 # If you set this to False, Django will make some optimizations so as not
@@ -61,6 +76,7 @@
 MIDDLEWARE_CLASSES = (
     'django.middleware.common.CommonMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.locale.LocaleMiddleware',
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
--- a/templates/base.html
+++ b/templates/base.html
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{LANGUAGE_CODE}}" xml:lang="{{LANGUAGE_CODE}}">
   <head>
     {% load i18n %}
     <title>
@@ -17,7 +17,7 @@
         <li><a href="/"><img src="{{STATIC_MEDIA_URL}}savane/images/floating.png" alt="Back to homepage" border="0" width="118" height="100" /></a></li>
         {% if user.is_authenticated %}
           <li class="menutitle">Connected as {{ user.username}}</li>
-          <li class="menuitem"><a href="{% url savane.my.views.index %}">My account</a></li>
+          <li class="menuitem"><a href="{% url savane.my.index %}">My account</a></li>
           <li class="menuitem"><a href="{% url django.contrib.auth.views.logout %}">Logout</a></li>
         {% else %}
           <li class="menutitle">Login status</li>
new file mode 100644
--- /dev/null
+++ b/templates/my/i18n.html
@@ -0,0 +1,27 @@
+{% extends "base.html" %}
+
+{% comment %}
+Cf. http://docs.djangoproject.com/en/dev/topics/i18n/internationalization/#the-set-language-redirect-view
+{% endcomment %}
+
+{% block content %}
+
+<form action="{% url django.views.i18n.set_language %}" method="post">
+{% csrf_token %}
+<input name="next" type="hidden" value="{% url savane.my.index %}" />
+<select name="language">
+{% for lang in LANGUAGES %}
+<option value="{{ lang.0 }}">{{ lang.1 }}</option>
+{% endfor %}
+</select>
+<input type="submit" value="Go" />
+</form>
+
+{% endblock %}
+{% comment %}
+Local Variables: **
+mode: django-html **
+tab-width: 4 **
+indent-tabs-mode: nil **
+End: **
+{% endcomment %}
--- a/templates/my/index.html
+++ b/templates/my/index.html
@@ -12,6 +12,7 @@
       <a href="{% url savane.my.group_list %}">My groups</a><br />
       <a href="{% url savane.my.membership_list %}">My memberships</a><br />
       <a href="{% url django.contrib.auth.views.password_change %}">Change my password</a><br />
+      <a href="{% url savane.my.language %}">Set language</a> ({{LANGUAGE_CODE}})<br />
     </p>
   </div>
 
--- a/templates/svmain/group_list.html
+++ b/templates/svmain/group_list.html
@@ -1,11 +1,12 @@
 {% extends "base.html" %}
+{% load i18n %}
 
 {% block content %}
 
 {% include "svmain/pagination.inc.html" %}
 
 <form action="." method="GET">
-  Search: <input type="text" name="q" value="{{q}}" />
+  {% trans "Search" %}: <input type="text" name="q" value="{{q}}" />
 </form>
 
 {% if object_list %}
@@ -15,7 +16,7 @@
     {% endfor %}
     </ul>
 {% else %}
-    <p>No groups.</p>
+    <p>{% trans "No groups." %}</p>
 {% endif %}
 
 {% endblock %}
--- a/templates/svmain/pagination.inc.html
+++ b/templates/svmain/pagination.inc.html
@@ -1,11 +1,13 @@
+{% load i18n %}
+
 {% if page_obj %}
 <div class="pagination">
     <span class="step-links">
       {% if paginator.num_pages > 1 %}
         {% if not page_obj.has_previous %}
-	  préc.
+	  {% trans "previous" %}
 	{% else %}
-          <a href="?page={{ page_obj.previous_page_number }}">préc.</a>
+          <a href="?page={{ page_obj.previous_page_number }}">{% trans "previous" %}</a>
         {% endif %}
 	&lt;
 	{% for number in paginator.page_range %}
@@ -17,16 +19,23 @@
         {% endfor %}
 	&gt;
         {% if not page_obj.has_next %}
-	    suiv.
+	    {% trans "next" %}
 	{% else %}
-            <a href="?page={{ page_obj.next_page_number }}">suiv.</a>
+            <a href="?page={{ page_obj.next_page_number }}">{% trans "next" %}</a>
         {% endif %}
 
         <span class="current">
-            - Page {{ page_obj.number }} sur {{ paginator.num_pages }} ({{paginator.count}})
+	    -
+            {% blocktrans with page_obj.number as number and paginator.num_pages as num_pages and paginator.count as count %}
+            Page {{ page_obj.number }} on {{ num_pages }} ({{ count }})
+	    {% endblocktrans %}
         </span>
       {% else %}
-	({{paginator.count}} element(s))
+        {% blocktrans count paginator.count as count %}
+	{{count}} element
+	{% plural %}
+	{{count}} elements
+	{% endblocktrans %}
       {% endif %}
     </span>
 </div>
--- a/templates/svmain/user_list.html
+++ b/templates/svmain/user_list.html
@@ -1,11 +1,12 @@
 {% extends "base.html" %}
+{% load i18n %}
 
 {% block content %}
 
 {% include "svmain/pagination.inc.html" %}
 
 <form action="." method="GET">
-  Rechercher: <input type="text" name="q" value="{{q}}" />
+  {% trans "Search" %}: <input type="text" name="q" value="{{q}}" />
 </form>
 
 {% if object_list %}
@@ -15,7 +16,7 @@
     {% endfor %}
     </ul>
 {% else %}
-    <p>No users.</p>
+    <p>{% trans "No users." %}</p>
 {% endif %}
 
 {% endblock %}