SlideShare ist ein Scribd-Unternehmen logo
1 von 17
Downloaden Sie, um offline zu lesen
Traduire ses bases de données
         sans douleur


         David Paccoud
          @davidpaccoud
Un blog multi-langues


          (français/anglais pour commencer)

 En réutilisant des applications existantes,
 implémenter une stratégie de traduction


https://github.com/nathanborror/django-basic-apps
Traduire les templates
●   Copie des templates dans project/templates/,
●   ./manage makemessages -l fr
●   Traduction de django.po
●   ./manage compilemessages
●   Redémarrer le server
●   Voir la doc Django pour les détails
Statiques traduits
django-modeltranslation
●   http://django-modeltranslation.googlecode.com/
●   Ajout de colonnes localisées
●   Modifie le schéma
●   South friendly :)
●   Sélection intelligente de la langue à afficher
●   Customisation de l'interface admin
settings.py

_ = lambda s: s
LANGUAGES = (
  ('fr', _('French')),
  ('en', _('English')),
)

MODELTRANSLATION_TRANSLATION_REGISTRY = 'translation'

INSTALLED_APP = (
  'modeltranslation',
  'south',
  …
)
translation.py
from modeltranslation.translator import (translator,
                                         TranslationOptions)
from basic.blog.models import Category, Post


class CategoryTranslationOptions(TranslationOptions):
   fields = ('title', )


class PostTranslationOptions(TranslationOptions):
   fields = ('title', 'body', 'tease')


translator.register(Category, CategoryTranslationOptions)
translator.register(Post, PostTranslationOptions)
admin.py
from django.contrib import admin
from modeltranslation.admin import TranslationAdmin
from basic.blog.admin import CategoryAdmin, PostAdmin
from basic.blog.models import Category, Post

class CategoryTranslationAdmin(CategoryAdmin,
                               TranslationAdmin):
   pass

class PostTranslationAdmin(PostAdmin, TranslationAdmin):
   pass

admin.site.unregister(Category)
admin.site.unregister(Post)
admin.site.register(Category, CategoryTranslationAdmin)
admin.site.register(Post, PostTranslationAdmin)
Migration de la base de données


Ainsi facile que :

./manage schemamigration blog –auto
./manage migrate blog


Enfin presque...
Interface d'administration
Contenu traduit
Sélectionner la bonne langue
●   django-localeurl
●   Ajout d'un préfixe en fonction de la langue
●   Sélection de la langue en fonction du suffixe
●   Ultra simple à utiliser
settings.py
TEMPLATE_CONTEXT_PROCESSORS = (
  ...
  'django.core.context_processors.request',
  …
)

MIDDLEWARE_CLASSES = (
  'localeurl.middleware.LocaleURLMiddleware',
  …
)

INSTALLED_APPS = (
  'localeurl',
  …
)
templates/base.html

<html lang="{{ LANGUAGE_CODE }}">
 <head>...</head>
 <body>
  <div id="body">
    {% block body %}
     {% block lang %}{% endblock %}
     ...
    {% endblock %}
  </div>
 </body>
</html>
templates/blog/base_blog.html
{% extends "base.html" %}
{% load localeurl_tags %}

{% block lang %}
 <div id="lang">
  {% for lang in LANGUAGES %}
   {% ifequal lang.0 LANGUAGE_CODE %}
     <span class="selected">{{ lang.1 }}</span>
   {% else %}
     <span>
      <a href="{{ request.path|chlocale:lang.0 }}">{{ lang.1 }}</a>
     </span>
   {% endifequal %}
  {% endfor %}
 </div>
{% endblock %}
URLs localisées
Et voilà !

Du temps pour des questions ? Non ? :(
Posez-les @davidpaccoud


Slides : http://www.slideshare.net/davidpaccoud
Sources : https://bitbucket.org/dpaccoud/djangocong_2011
Also included django-datatrans




                     Creative Commons – Attribution-NonCommercial-Share Alike

Weitere ähnliche Inhalte

Ähnlich wie Comment traduire ses bases de données sans douleur

Introduction à Sinatra
Introduction à SinatraIntroduction à Sinatra
Introduction à SinatraRémi Prévost
 
Atelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressAtelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressIZZA Samir
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitementMadeline Pinthon
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantHugo Hamon
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hoodsvuillet
 
DrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingDrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingRomain Jarraud
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Martin Latrille
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJSVISEO
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Mickael Perraud
 
Pratique de javascript KOUAMI DJOMO
Pratique de javascript KOUAMI DJOMOPratique de javascript KOUAMI DJOMO
Pratique de javascript KOUAMI DJOMOJulio Djomo
 
Les blocs Drupal de drop.org à Drupal 8
Les blocs Drupal de drop.org à Drupal 8Les blocs Drupal de drop.org à Drupal 8
Les blocs Drupal de drop.org à Drupal 8OSInet
 
Draft - Developper Sur Elgg
Draft - Developper Sur ElggDraft - Developper Sur Elgg
Draft - Developper Sur ElggBrice Gaillard
 
On test quoi - DCLannion 2017
On test quoi - DCLannion 2017On test quoi - DCLannion 2017
On test quoi - DCLannion 2017Artusamak
 
Performance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPerformance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPrestaShop
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans DrupalAdyax
 
Panels, une autre façon de construire. DrupalCamp Paris 2013
Panels, une autre façon de construire. DrupalCamp Paris 2013Panels, une autre façon de construire. DrupalCamp Paris 2013
Panels, une autre façon de construire. DrupalCamp Paris 2013bellesmanieres
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2dhugomallet
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 

Ähnlich wie Comment traduire ses bases de données sans douleur (20)

Introduction à Sinatra
Introduction à SinatraIntroduction à Sinatra
Introduction à Sinatra
 
Atelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressAtelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPress
 
Scrapez facilement et gratuitement
Scrapez facilement et gratuitementScrapez facilement et gratuitement
Scrapez facilement et gratuitement
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
GWT : under the hood
GWT : under the hoodGWT : under the hood
GWT : under the hood
 
DrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingDrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - Theming
 
Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)Présentation de Django @ Orange Labs (FR)
Présentation de Django @ Orange Labs (FR)
 
Aperçu de RequireJS
Aperçu de RequireJSAperçu de RequireJS
Aperçu de RequireJS
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?
 
Pratique de javascript KOUAMI DJOMO
Pratique de javascript KOUAMI DJOMOPratique de javascript KOUAMI DJOMO
Pratique de javascript KOUAMI DJOMO
 
react-fr.pdf
react-fr.pdfreact-fr.pdf
react-fr.pdf
 
Les blocs Drupal de drop.org à Drupal 8
Les blocs Drupal de drop.org à Drupal 8Les blocs Drupal de drop.org à Drupal 8
Les blocs Drupal de drop.org à Drupal 8
 
Draft - Developper Sur Elgg
Draft - Developper Sur ElggDraft - Developper Sur Elgg
Draft - Developper Sur Elgg
 
On test quoi - DCLannion 2017
On test quoi - DCLannion 2017On test quoi - DCLannion 2017
On test quoi - DCLannion 2017
 
Performance et optimisation de PrestaShop
Performance et optimisation de PrestaShopPerformance et optimisation de PrestaShop
Performance et optimisation de PrestaShop
 
La mobilité dans Drupal
La mobilité dans DrupalLa mobilité dans Drupal
La mobilité dans Drupal
 
Panels, une autre façon de construire. DrupalCamp Paris 2013
Panels, une autre façon de construire. DrupalCamp Paris 2013Panels, une autre façon de construire. DrupalCamp Paris 2013
Panels, une autre façon de construire. DrupalCamp Paris 2013
 
Cours yeoman backbone box2d
Cours yeoman backbone box2dCours yeoman backbone box2d
Cours yeoman backbone box2d
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 

Comment traduire ses bases de données sans douleur

  • 1. Traduire ses bases de données sans douleur David Paccoud @davidpaccoud
  • 2. Un blog multi-langues (français/anglais pour commencer) En réutilisant des applications existantes, implémenter une stratégie de traduction https://github.com/nathanborror/django-basic-apps
  • 3. Traduire les templates ● Copie des templates dans project/templates/, ● ./manage makemessages -l fr ● Traduction de django.po ● ./manage compilemessages ● Redémarrer le server ● Voir la doc Django pour les détails
  • 5. django-modeltranslation ● http://django-modeltranslation.googlecode.com/ ● Ajout de colonnes localisées ● Modifie le schéma ● South friendly :) ● Sélection intelligente de la langue à afficher ● Customisation de l'interface admin
  • 6. settings.py _ = lambda s: s LANGUAGES = ( ('fr', _('French')), ('en', _('English')), ) MODELTRANSLATION_TRANSLATION_REGISTRY = 'translation' INSTALLED_APP = ( 'modeltranslation', 'south', … )
  • 7. translation.py from modeltranslation.translator import (translator, TranslationOptions) from basic.blog.models import Category, Post class CategoryTranslationOptions(TranslationOptions): fields = ('title', ) class PostTranslationOptions(TranslationOptions): fields = ('title', 'body', 'tease') translator.register(Category, CategoryTranslationOptions) translator.register(Post, PostTranslationOptions)
  • 8. admin.py from django.contrib import admin from modeltranslation.admin import TranslationAdmin from basic.blog.admin import CategoryAdmin, PostAdmin from basic.blog.models import Category, Post class CategoryTranslationAdmin(CategoryAdmin, TranslationAdmin): pass class PostTranslationAdmin(PostAdmin, TranslationAdmin): pass admin.site.unregister(Category) admin.site.unregister(Post) admin.site.register(Category, CategoryTranslationAdmin) admin.site.register(Post, PostTranslationAdmin)
  • 9. Migration de la base de données Ainsi facile que : ./manage schemamigration blog –auto ./manage migrate blog Enfin presque...
  • 12. Sélectionner la bonne langue ● django-localeurl ● Ajout d'un préfixe en fonction de la langue ● Sélection de la langue en fonction du suffixe ● Ultra simple à utiliser
  • 13. settings.py TEMPLATE_CONTEXT_PROCESSORS = ( ... 'django.core.context_processors.request', … ) MIDDLEWARE_CLASSES = ( 'localeurl.middleware.LocaleURLMiddleware', … ) INSTALLED_APPS = ( 'localeurl', … )
  • 14. templates/base.html <html lang="{{ LANGUAGE_CODE }}"> <head>...</head> <body> <div id="body"> {% block body %} {% block lang %}{% endblock %} ... {% endblock %} </div> </body> </html>
  • 15. templates/blog/base_blog.html {% extends "base.html" %} {% load localeurl_tags %} {% block lang %} <div id="lang"> {% for lang in LANGUAGES %} {% ifequal lang.0 LANGUAGE_CODE %} <span class="selected">{{ lang.1 }}</span> {% else %} <span> <a href="{{ request.path|chlocale:lang.0 }}">{{ lang.1 }}</a> </span> {% endifequal %} {% endfor %} </div> {% endblock %}
  • 17. Et voilà ! Du temps pour des questions ? Non ? :( Posez-les @davidpaccoud Slides : http://www.slideshare.net/davidpaccoud Sources : https://bitbucket.org/dpaccoud/djangocong_2011 Also included django-datatrans Creative Commons – Attribution-NonCommercial-Share Alike