2010-10-07 4 views
2

Encore une question sur Django concernant la localisation des fichiers javascript. Django fournit une bibliothèque javascript petite et pratique qui est utilisée comme gettext pour internationaliser les chaînes dans les fichiers javascript.Django 1.2.3 - Internationalisation - makemessages ne détecte pas toutes les chaînes

Je l'ai configuré avec succès (au moins la fonction d'interpolation fonctionne) et j'ai pu générer le fichier po pour la langue française. Cependant, toutes les chaînes ne sont pas détectées. Je ne sais pas vraiment pourquoi parce qu'ils se ressemblent tous. Je n'ai rien trouvé sur le Django Trac et les docs officiels.

Le code javascript est dans un fichier externe inclus dans le modèle et Django l'a apparemment trouvé parce qu'il a mis deux chaînes dans le fichier po.

L'inclusion dans le modèle HTML:

<script src="{{MEDIA_URL|default:'/media/'}}js/list.js" type="text/javascript"></script> 

Le code javascript:

/* --------------- 
* Upload progress 
* --------------- */ 
$(document).ready(function() { 
    $(function() { 
     $('#upload_form').uploadProgress({ 
      //... 

      /* function called just before starting the upload */ 
      start: function() { 
       $("#upload_form").hide(); 
       filename = $("#id_file").val().split(/[\/\\]/).pop(); 
       fmts = gettext('Uploading %(filename)s...'); 
       dat = { 
        filename: filename 
       }; 
       s = interpolate(fmts,dat,true); 
       $("#progress_filename").html(s); 
       $("#progress_container").show(); 
      }, 

      /* function called each time bar is updated */ 
      uploading: function(upload) { 
       if (upload.percents >= 100) { 
        window.clearTimeout(this.timer); 
        fmts = gettext("Saving %(filename)s..."); 
        dat = { 
         filename: filename 
        }; 
        s = interpolate(fmts,dat,true); 
        $("#progress_filename").html(s); 
       } else { 
        fmts = gettext('Uploading %(filename)s : %(percents)s%...'); 
        dat = { 
         filename: filename, 
         percents: upload.percents 
        }; 
        s = interpolate(fmts,dat,true); 
        $("#progress_filename").html(s); 
       } 
      }, 

      //... 

     }); 
    }); 
}); 


/* -------------------- 
* Confirmation dialogs 
* -------------------- */ 
function delVid(title) { 
    fmts = gettext('Do you really want to delete the video "%(title)s"?'); 
    dat = { 
     title: title 
    }; 
    s = interpolate(fmts,dat,true); 
    return confirm(s) 
} 

function abortVid(title) { 
    fmts = gettext('Do you really want to abort the processing of the video "%(title)s"?'); 
    dat = { 
     title: title 
    }; 
    s = interpolate(fmts,dat,true); 
    return confirm(s) 
} 

La première partie est une utilisation standard du module jquery.uploadprogress pour JQuery et la deuxième partie est juste deux fonctions pour les popups de confirmation.

Les chaînes détectées sont à la fois dans la première partie:

  • 'Transfert% (nom de fichier) s ...'
  • 'Saving% (nom de fichier) s ...'

J'ai utilisé la commande "django-admin.py -d djangojs -l fr" et il a généré un fichier djangojs.po avec ces deux chaînes. Je les ai traduits. Malheureusement, ils ne sont pas traduits lors de l'exécution. Il semble que j'ai deux problèmes finalement.

Une idée?

Répondre

1

L'analyse des messages Javascript de Django est assez fragile. J'ai written up the details pourquoi c'est ainsi. J'ai aussi un correctif pour Django 1.3 attaché à Django ticket 7704. Django peut ne pas accepter le patch, peut-être pouvez-vous aider à leur expliquer pourquoi ils le devraient? :)

+0

Bonne nouvelle! J'ai lu votre article et je ne savais pas que l'analyse par javacript était un tel hack. J'aurais dû regarder dans la source.J'espère qu'ils accepteront votre patch pour 1.3.1 ou quelque chose, il le fera. Ensuite, ils passeront probablement à Babel un jour. –

+1

Probablement serait utile pour quelqu'un: N'a pas fonctionné avec 1.3.1, a bien fonctionné après le passage au tronc actuel (Django 1.4-pré-alpha). – Tony

0

Le mécanisme est différent pour les fichiers javascript. Les traductions ne sont pas générées dans le fichier po standard mais dans un catalogue javascript. Voir cette explication dans the Django book.

J'espère que cela aide

+0

Ils disent d'utiliser la commande "django-admin.py makemessages -d djangojs -l [lang_code]". Je l'ai fait et il a généré un fichier djangojs.po (un fichier po normal) mais il n'a pas toutes les chaînes, seulement deux d'entre eux. –

+0

J'ai ajouté des précisions pour éviter les malentendus. –

1

Je viens résolu le problème des chaînes non traduites lors de l'exécution. Cela vient du fait que mon répertoire "locale" était sous la racine du projet. J'ai dû ajouter "my_project_root_dir" à settings.INSTALLED_APPS pour recevoir un catalogue javascript correct.

Pour le problème des chaînes non détectées, je n'ai toujours aucune idée sur la façon de faire des django makemessages pour trouver toutes les chaînes mais j'ai une solution temporaire. J'ai ajouté les chaînes au fichier mo manuellement et cela fonctionne. Cependant, les makemessages de django enlèvent les cordes pour qu'elles ne puissent plus être utilisées.

Questions connexes