profile translation
[iramuteq] / ProfList.py
index 7308f43..6b553e9 100644 (file)
 #----------------------------------------------------------------------------
 
 import os
-import sys
 import  wx
 import  wx.lib.mixins.listctrl  as  listmix
-#from tabsimi import DoSimi
 from listlex import ListForSpec
 from chemins import ConstructPathOut, ffr
-from dialog import PrefExport, PrefUCECarac, SearchDial, message, MessageImage, BarFrame
-from tableau import Tableau, copymatrix
+from dialog import PrefUCECarac, SearchDial, message, BarFrame, ChronoFrame
+from tableau import copymatrix
 from search_tools import SearchFrame
 import webbrowser
 #import cStringIO
 import tempfile
 import codecs
-from functions import exec_rcode, progressbar, treat_var_mod, doconcorde
-from PrintRScript import barplot
-from textclassechd import ClasseCHD
-from shutil import copyfile
+from functions import progressbar, treat_var_mod, doconcorde
 from operator import itemgetter
 from copy import copy
 
 #---------------------------------------------------------------------------
 class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
-    def __init__(self, parent, gparent, profclasse, Alceste=False, cl=0):
+    def __init__(self, parent, gparent, profclasse, Alceste=False, cl=0, translation = False):
         wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES)
 
         self.parent = parent
         self.Alceste = Alceste
         self.Source = gparent
+        self.translation = translation
         self.cl = cl
         self.var_mod = {}
         self.them_mod = {}
+        self.ira = wx.GetApp().GetTopWindow()
 
         line1 = profclasse.pop(0)
         classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****']
@@ -95,7 +92,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         self.attr2 = wx.ListItemAttr()
         self.attr2.SetBackgroundColour((190, 249, 236))
         self.attr2s = wx.ListItemAttr()
-        self.attr2s.SetBackgroundColour((211, 252, 244))        
+        self.attr2s.SetBackgroundColour((211, 252, 244))
         self.attr3 = wx.ListItemAttr()
         self.attr3.SetBackgroundColour((245, 180, 180))
         self.attr3s = wx.ListItemAttr()
@@ -110,7 +107,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         self.InsertColumn(5, "Type", wx.LIST_FORMAT_RIGHT)
         self.InsertColumn(6, "forme", wx.LIST_FORMAT_RIGHT)
         self.InsertColumn(7, "p", wx.LIST_FORMAT_RIGHT)
-        
+
 
         self.SetColumnWidth(0, 60)
         self.SetColumnWidth(1, 70)
@@ -126,7 +123,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         self.itemDataMap = dictdata
         self.itemIndexMap = dictdata.keys()
         self.SetItemCount(len(dictdata))
-        
+
         #mixins
         listmix.ListCtrlAutoWidthMixin.__init__(self)
         listmix.ColumnSorterMixin.__init__(self, len(classen[0]))
@@ -225,7 +222,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         items = list(self.itemDataMap.keys())
         items.sort(sorter)
         self.itemIndexMap = items
-        
+
         # redraw the list
         self.Refresh()
 
@@ -245,7 +242,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
 
     def onsearchall(self, evt) :
         if 'FrameSearch' not in dir(self.Source) :
-            self.Source.FrameSearch = SearchFrame(self.parent, -1, u"Rechercher...", self.Source.corpus)
+            self.Source.FrameSearch = SearchFrame(self.parent, -1, _(u"Search...").decode('utf8'), self.Source.corpus)
         self.dial = SearchDial(self, self.Source.FrameSearch.liste, 1, False)
         self.dial.CenterOnParent()
         self.dial.Show()
@@ -279,6 +276,8 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                 self.idexporttropes = wx.NewId()
                 self.idexportowledge = wx.NewId()
                 self.onmaketgen = wx.NewId()
+                self.onchronochi2 = wx.NewId()
+                self.onchronoprop = wx.NewId()
             #    self.export_classes = wx.NewId()
    
                 self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
@@ -304,45 +303,51 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                 self.Bind(wx.EVT_MENU, self.onexporttropes, id = self.idexporttropes)
                 self.Bind(wx.EVT_MENU, self.onexportowledge, id = self.idexportowledge)
                 self.Bind(wx.EVT_MENU, self.OnMakeTgen, id=self.onmaketgen)
+                self.Bind(wx.EVT_MENU, self.OnChronoChi2, id=self.onchronochi2)
+                self.Bind(wx.EVT_MENU, self.OnChronoProp, id=self.onchronoprop)
              #  self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes)
    #            self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
     
             # make a menu
             menu = wx.Menu()
-            menu.Append(self.popupID1, u"Formes associées")
-            menu.Append(self.idtablex, u"Chi2 par classe")
-            menu.Append(self.idlexdendro, u"Chi2 par classe + dendro")
-            menu.Append(self.idchimod, u"Chi2 modalités de la variable")
-            menu.Append(self.idwordgraph, u"Graphe du mot")
+            menu.Append(self.popupID1, _(u"Associated forms").decode('utf8'))
+            menu.Append(self.idtablex, _(u"Chi2 by cluster").decode('utf8'))
+            menu.Append(self.idlexdendro, _(u"Chi2 by cluster on dendrogram").decode('utf8'))
+            menu.Append(self.idchimod, _(u"Chi2 modalities of variable").decode('utf8'))
+            menu_chrono = wx.Menu()
+            menu_chrono.Append(self.onchronochi2, _(u'Chi2').decode('utf8'))
+            menu_chrono.Append(self.onchronoprop, _(u'Proportion').decode('utf8'))
+            menu.AppendMenu(-1, _(u"Chronological view").decode('utf8'), menu_chrono)
+            menu.Append(self.idwordgraph, _(u"Word graph").decode('utf8'))
             #menu.Append(self.export_classes, u"Exporter le corpus...") 
-            
+
             #menu.Append(self.popupID10, u"Spécificités")
 
             menu_conc = wx.Menu()
-            menu_conc.Append(self.popupID2, u"dans les segments de texte de la classe")
-            menu_conc.Append(self.popupID3, u"dans les segments de texte classés")
-            menu_conc.Append(self.popupID4, u"dans tous les segments de texte")
-            menu.AppendMenu(-1, u"Concordancier", menu_conc)
+            menu_conc.Append(self.popupID2, _(u"In segments of this cluster").decode('utf8'))
+            menu_conc.Append(self.popupID3, _(u"In segments of this clustering").decode('utf8'))
+            menu_conc.Append(self.popupID4, _(u"In all segments").decode('utf8'))
+            menu.AppendMenu(-1, _(u"Concordance").decode('utf8'), menu_conc)
             menu.Append(self.onmaketgen, _(u"Make Tgen").decode('utf8'))
-            menu_cnrtl = wx.Menu()      
-            menu_cnrtl.Append(self.popupID5, u"Définition")
-            menu_cnrtl.Append(self.popupID6, u"Etymologie")
-            menu_cnrtl.Append(self.popupID7, u"Synonymie")
-            menu_cnrtl.Append(self.popupID8, u"Antonymie")
-            menu_cnrtl.Append(self.popupID9, u"Morphologie")
-            menu_cnrtl.Append(self.popup_proxe, u"Proxémie")
-            menu.AppendMenu(-1, u"Outils du CNRTL", menu_cnrtl)
+            menu_cnrtl = wx.Menu()
+            menu_cnrtl.Append(self.popupID5, _(u"Definition").decode('utf8'))
+            menu_cnrtl.Append(self.popupID6, _(u"Etymology").decode('utf8'))
+            menu_cnrtl.Append(self.popupID7, _(u"Synonymous").decode('utf8'))
+            menu_cnrtl.Append(self.popupID8, _(u"Antonym").decode('utf8'))
+            menu_cnrtl.Append(self.popupID9, _(u"Morphology").decode('utf8'))
+            menu_cnrtl.Append(self.popup_proxe, _(u"Proxemy").decode('utf8'))
+            menu.AppendMenu(-1, _(u"Tools from CNRTL (french only)").decode('utf8'), menu_cnrtl)
             menu.AppendSeparator()
-            menu.Append(self.popupIDgraph, u"Graphe de la classe")
-            menu.Append(self.idseg, u"Segments répétés")
-            menu.Append(self.iducecarac, u"Segments de texte caractéristiques")
-            menu.Append(self.idcloud, u"Nuage de la classe")
-            menu.Append(self.idexport, u'Exporter...')
-            menu.Append(self.idexporttropes, 'Exporter pour Tropes')
-            menu.Append(self.idexportowledge, 'Exporter pour Owledge')
+            menu.Append(self.popupIDgraph, _(u"Graph of cluster").decode('utf8'))
+            menu.Append(self.idseg, _(u"Repeated segments").decode('utf8'))
+            menu.Append(self.iducecarac, _(u"Typical text segments").decode('utf8'))
+            menu.Append(self.idcloud, _(u"Word cloud of cluster").decode('utf8'))
+            menu.Append(self.idexport, _(u'Export...').decode('utf8'))
+            menu.Append(self.idexporttropes, _(u'Export for Tropes').decode('utf8'))
+            menu.Append(self.idexportowledge, _('Exporter for Owledge').decode('utf8'))
             #menu.Append(self.popupID2, u"Concordancier")
     #        menu.Append(self.popupID3, "recharger")
-    
+
             self.PopupMenu(menu)
             menu.Destroy()
         elif 'tableau' in dir(self.Source) :
@@ -355,10 +360,10 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                 self.Bind(wx.EVT_MENU, self.quest_var_mod, id=self.pop3)
 
             menu = wx.Menu()
-            menu.Append(self.pop2, u"Chi2 par classe")
-            menu.Append(self.pop3, u"Chi2 modalités de la variable")
+            menu.Append(self.pop2, _(u"Chi2 by cluster").decode('utf8'))
+            menu.Append(self.pop3, _(u"Chi2 modalities of variable").decode('utf8'))
             menu.AppendSeparator()
-            menu.Append(self.pop1, u"Graphe de la classe")
+            menu.Append(self.pop1, _(u"Graph of cluster").decode('utf8'))
             self.PopupMenu(menu)
             menu.Destroy()
 
@@ -371,9 +376,6 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         parametres['type'] = 'clustercloud'
         parametres['prof'] = self.Source.pathout['actprof_classe_%i.csv' % self.cl]
         del  parametres['uuid']
-        #if not os.path.exists(self.Source.pathout['actprof_classe_%i.csv' % self.lc]) :
-        #    with open(self.Source.pathout['actprof_classe_%i.csv' % self.lc], 'w') as f :
-        #        f.write('\n'.join(prof).encode(self.parent.syscoding))
         self.parent.OnClusterCloud(self.Source.corpus, parametres = parametres)
 
     def onexport(self, evt) :
@@ -387,10 +389,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         dial = wx.MessageDialog(self, self.Source.pathout['classe_%i_export.txt' % self.cl], u"Export", wx.OK|wx.ICON_INFORMATION)
         dial.ShowModal()
         dial.Destroy()
-        #if 'corpus' in dir(self.Source):
-        #    corpus = self.Source.corpus
-        #ClasseCHD(self.parent, corpus, self.cl)
-    
+
     def onexporttropes(self, evt) :
         if 'corpus' in dir(self.Source):
             corpus = self.Source.corpus
@@ -400,7 +399,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             uci = True
         fileout = self.Source.pathout['export_tropes_classe_%i.txt' % self.cl]
         corpus.export_tropes(fileout, self.cl, uci = uci)
-    
+
     def onexportowledge(self, evt):
         if 'corpus' in dir(self.Source):
             corpus = self.Source.corpus
@@ -411,7 +410,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         repout = self.Source.pathout['export_owledge_classe_%i' % self.cl]
         if not os.path.exists(repout) :
             os.mkdir(repout)
-        corpus.export_owledge(repout, self.cl, uci = uci)        
+        corpus.export_owledge(repout, self.cl, uci = uci)
 
     def getselectedwords(self) :
         words = [self.getColumnText(self.GetFirstSelected(), 6)]
@@ -421,15 +420,15 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             words.append(self.getColumnText(last, 6))
         return words
 
-    def quest_var_mod(self, evt) :  
+    def quest_var_mod(self, evt) :
         word = self.getselectedwords()[0]
         if len(word.split('_')) <= 1 :
-            dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING)
+            dial = wx.MessageDialog(self, _(u"This is not a variable_modality form").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING)
             dial.CenterOnParent()
             dial.ShowModal()
             dial.Destroy()
             return
-            
+
         if 'corpus' in dir(self.Source):
             corpus = self.Source.corpus
             if word.startswith(u'-*') :
@@ -458,11 +457,11 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         try :
             words = [word for word in var_mod[var[0]]]
         except KeyError:
-            dial = wx.MessageDialog(self, _(u"This is not a meta-data"), u"Problème", wx.OK | wx.ICON_WARNING)
+            dial = wx.MessageDialog(self, _(u"This is not a meta-data").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING)
             dial.CenterOnParent()
             dial.ShowModal()
             dial.Destroy()
-            return            
+            return
         words.sort()
         tableout = []
         kwords = []
@@ -472,6 +471,85 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                 kwords.append(word)
         BarFrame(self.Source.parent, tableout, title, kwords)
 
+    def OnChronoChi2(self, evt) :
+        word = self.getselectedwords()[0]
+        if len(word.split('_')) <= 1 :
+            dial = wx.MessageDialog(self, _(u"This is not a variable_modality form").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING)
+            dial.CenterOnParent()
+            dial.ShowModal()
+            dial.Destroy()
+            return
+
+        if 'corpus' in dir(self.Source):
+            corpus = self.Source.corpus
+            if word.startswith(u'-*') :
+                if self.them_mod == {} :
+                    self.them_mod = self.Source.corpus.make_theme_dict()
+                var_mod = self.them_mod
+            else :
+                if self.var_mod == {} :
+                    self.var_mod = self.Source.corpus.make_etoiles_dict()
+                var_mod = self.var_mod
+        else :
+            corpus = self.Source.tableau
+            if self.var_mod == {} :
+                self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups])
+            var_mod = self.var_mod
+        var = word.split('_')
+        #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]]
+        try :
+            words = [word for word in var_mod[var[0]]]
+        except KeyError:
+            dial = wx.MessageDialog(self, _(u"This is not a meta-data").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING)
+            dial.CenterOnParent()
+            dial.ShowModal()
+            dial.Destroy()
+            return
+        words.sort()
+        vartoplot = var[0] + '_'
+        parametres = {'var' : vartoplot}
+        ChronoFrame(self.Source.parent, parametres, self.Source.pathout, which = 'chi2')
+
+    def OnChronoProp(self, evt) :
+        word = self.getselectedwords()[0]
+        if len(word.split('_')) <= 1 :
+            dial = wx.MessageDialog(self, _(u"This is not a variable_modality form").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING)
+            dial.CenterOnParent()
+            dial.ShowModal()
+            dial.Destroy()
+            return
+
+        if 'corpus' in dir(self.Source):
+            corpus = self.Source.corpus
+            if word.startswith(u'-*') :
+                if self.them_mod == {} :
+                    self.them_mod = self.Source.corpus.make_theme_dict()
+                var_mod = self.them_mod
+            else :
+                if self.var_mod == {} :
+                    self.var_mod = self.Source.corpus.make_etoiles_dict()
+                var_mod = self.var_mod
+        else :
+            corpus = self.Source.tableau
+            if self.var_mod == {} :
+                self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups])
+            var_mod = self.var_mod
+        var = word.split('_')
+        #words = ['_'.join([var[0],word]) for word in self.var_mod[var[0]]]
+        try :
+            words = [word for word in var_mod[var[0]]]
+        except KeyError:
+            dial = wx.MessageDialog(self, _(u"This is not a meta-data").decode('utf8'), _(u"Problem").decode('utf8'), wx.OK | wx.ICON_WARNING)
+            dial.CenterOnParent()
+            dial.ShowModal()
+            dial.Destroy()
+            return
+        words.sort()
+        vartoplot = var[0] + '_'
+        parametres = {'var' : vartoplot}
+        ChronoFrame(self.Source.parent, parametres, self.Source.pathout, which = 'prop')
+
+
     def quest_simi(self, evt) :
         tableau = self.Source.tableau
         tab = tableau.make_table_from_classe(self.cl, self.la)
@@ -518,6 +596,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
                           'halo' : 0,
                           'tmpchi': self.tmpchi,
                           'fromprof' : True,
+                          'edgecurved' : True,
                           }
         act = {}
         tableau = copymatrix(tableau)
@@ -539,13 +618,13 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             with open(self.tmpchi, 'w') as f:
                 f.write('\n'.join([str(val) for val in self.lchi]))
         index = self.la.index(word)
-        parametres = {'type' : 'clustersimitxt', 
+        parametres = {'type' : 'clustersimitxt',
                         'pathout' : self.Source.parametres['pathout'],
                         'word' : index ,
                         'lem' : self.Source.parametres['lem'],
                         'tmpchi' : self.tmpchi}
         #try :
-        self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
+        self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self.ira, 4))
         #except :
         #    print 'not acitve'
 
@@ -554,12 +633,12 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             self.tmpchi = os.path.join(self.Source.parametres['pathout'],'chi_%i.csv' % self.cl)
             with open(self.tmpchi, 'w') as f:
                 f.write('\n'.join([str(val) for val in self.lchi]))
-        parametres = {'type' : 'clustersimitxt', 
+        parametres = {'type' : 'clustersimitxt',
                         'pathout' : self.Source.parametres['pathout'],
                         'lem' : self.Source.parametres['lem'],
                         'tmpchi' : self.tmpchi}
 
-        self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self, 4))
+        self.parent.SimiFromCluster(self.parent, self.Source.corpus, self.la, self.lfreq, self.lchi, self.cl - 1, parametres = parametres, dlg = progressbar(self.ira, 4))
 
     def on_segments(self,evt) :
         dlg = progressbar(self, 2)
@@ -585,7 +664,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         first = ['','','']
         para={'dico': d,'fline':first}
         dlg.Destroy()
-        win = wliste(self, -1, u"Segments répétés - Classe %i" % self.cl, d, first, size=(600, 500))
+        win = wliste(self, -1, ' - '.join([_(u"Repeated segments").decode('utf8'), "Classe %i" % self.cl]), d, first, size=(600, 500))
         win.Show(True)
 
     def on_uce_carac(self,evt) :
@@ -594,7 +673,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         if dial.ShowModal() == wx.ID_OK :
             limite = dial.spin_eff.GetValue()
             atype = dial.radio_type.GetSelection()
-            dlg = progressbar(self,maxi = 4)
+            dlg = progressbar(self.ira,maxi = 4)
             corpus = self.Source.corpus
             uces = corpus.lc[self.cl-1]
             if self.Source.parametres['classif_mode'] != 2 :
@@ -616,13 +695,13 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             dlg.Update(3, u'concordancier...')
             ucis_txt, ucestxt = doconcorde(corpus, nuces, self.la, uci = uci)
             items = dict([[i, '<br>'.join([ucis_txt[i], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table><br>' % ntab2[i][0], ucestxt[i]])] for i, uce in enumerate(nuces)])
-            dlg.Update(4, u'texte...')
-            win = message(self, items, u"Segments de texte caractéristiques - Classe %i" % self.cl, (750, 600), uceids = nuces)
+            dlg.Destroy()
+            win = message(self, items, ' - '.join([_(u"Typical text segments").decode('utf8'), "Classe %i" % self.cl]), (750, 600), uceids = nuces)
+            #win.SetWindowStyle(wx.STAY_ON_TOP)
             #win.html = '<html>\n' + '<br>'.join(['<br>'.join([ucis_txt[i], '<table bgcolor = #1BF0F7 border=0><tr><td><b>score : %.2f</b></td></tr></table>' % ntab2[i][0], ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n</html>'
             #win.HtmlPage.SetPage(win.html)
-            dlg.Destroy()
             win.Show(True)
-    
+
     def on_tablex(self, evt):
         if 'corpus' in dir(self.Source):
             corpus = self.Source.corpus
@@ -636,7 +715,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         vchistable = [line[1:] for line in chistable]
         fchistable = [line[0] for line in chistable]
         words = self.getselectedwords()
-        tableout = [vchistable[fchistable.index(word)] for word in words]
+        tableout = [vchistable[fchistable.index(self.getword(word))] for word in words]
         tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
         nbcl = len(title)
         nbwords = len(words)
@@ -655,9 +734,15 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         vchistable = [line[1:] for line in chistable]
         fchistable = [line[0] for line in chistable]
         words = self.getselectedwords()
-        tableout = [vchistable[fchistable.index(word)] for word in words]
+        tableout = [vchistable[fchistable.index(self.getword(word))] for word in words]
         BarFrame(self.Source.parent, tableout, title, words, tree = self.Source.pathout['Rdendro'])
 
+    def getword(self, word) :
+        if self.translation :
+            return self.lems[word]
+        else :
+            return word
+
     def make_concord(self, uces, title, color = 'red') :
         corpus = self.Source.corpus
         ListWord = [self.getColumnText(self.GetFirstSelected(), 6)]
@@ -666,13 +751,14 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
             last = self.GetNextSelected(last)
             ListWord.append(self.getColumnText(last, 6))
         ucef = []
+        ListWord = [self.getword(word) for word in ListWord]
         if self.Source.parametres['classif_mode'] != 2 :
-            for word in ListWord : 
+            for word in ListWord :
                 uci = False
                 ucef += list(set(corpus.getlemuces(word)).intersection(uces))
         else :
-            for word in ListWord : 
-                ucef += list(set(corpus.getlemucis(word)).intersection(uces))            
+            for word in ListWord :
+                ucef += list(set(corpus.getlemucis(word)).intersection(uces))
                 uci = True
         ucis_txt, ucestxt = doconcorde(corpus, ucef, ListWord, uci = uci)
         items = dict([[i, '<br><br>'.join([ucis_txt[i], ucestxt[i]])] for i in range(0,len(ucestxt))])
@@ -683,19 +769,19 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         if 'corpus' in dir(self.Source) :
             corpus = self.Source.corpus
             uces = corpus.lc[self.cl-1]
-            win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl)
+            win = self.make_concord(uces, ' - '.join([_(u"Concordance").decode('utf8'), "Classe %i" % self.cl]))
             win.Show(True)
-    
+
     def OnPopupThree(self, event):
         corpus = self.Source.corpus
         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
-        win = self.make_concord(uces, "Concordancier - Segments de texte classés")
+        win = self.make_concord(uces, ' - '.join([_(u"Concordance").decode('utf8'), _(u"Segments of this clustering").decode('utf8')]))
         win.Show(True)
-        
+
     def OnPopupFour(self, event):
         corpus = self.Source.corpus
         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
-        win = self.make_concord(uces, "Concordancier - Tous les segments de texte")
+        win = self.make_concord(uces, ' - '.join([_(u"Concordance").decode('utf8'), _(u"All segments").decode('utf8')]))
         win.Show(True)
 
     def OnPopupFive(self, event):
@@ -703,22 +789,22 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         lk = "http://www.cnrtl.fr/definition/" + word
         webbrowser.open(lk)
 
-    def OnPopupSix(self, event):  
+    def OnPopupSix(self, event):
         word = self.getColumnText(self.GetFirstSelected(), 6)
         lk = "http://www.cnrtl.fr/etymologie/" + word
         webbrowser.open(lk)
-        
-    def OnPopupSeven(self, event):        
+
+    def OnPopupSeven(self, event):
         word = self.getColumnText(self.GetFirstSelected(), 6)
         lk = "http://www.cnrtl.fr/synonymie/" + word
         webbrowser.open(lk)
-        
-    def OnPopupHeight(self, event):  
+
+    def OnPopupHeight(self, event):
         word = self.getColumnText(self.GetFirstSelected(), 6)
         lk = "http://www.cnrtl.fr/antonymie/" + word
         webbrowser.open(lk)
-        
-    def OnPopupNine(self, event):            
+
+    def OnPopupNine(self, event):
         word = self.getColumnText(self.GetFirstSelected(), 6)
         lk = "http://www.cnrtl.fr/morphologie/" + word
         webbrowser.open(lk)
@@ -733,6 +819,7 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         #print 'ATTENTION PRINT ET TABLE'
         #corpus.make_et_table()
         word = self.getColumnText(self.GetFirstSelected(), 6)
+        word = self.getword(word)
         lems = corpus.getlems()
         uces = corpus.lc[self.cl-1]
         rep = []
@@ -749,20 +836,20 @@ class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.Col
         rep.sort(key = itemgetter(1), reverse = True)
         #win = message(self, u"Formes associées", wx.Size(300, 200))
         items = dict([[i, '\t:\t'.join([str(val) for val in forme])] for i, forme in enumerate(rep)])
-        win = message(self, items, u"Formes associées", (300, 200))
+        win = message(self, items, _(u"Associated forms").decode('utf8'), (300, 200))
         #win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
         #win.HtmlPage.SetPage(win.html)
         win.Show(True)
-    
+
     def OnMakeTgen(self, evt):
-        self.parent.tree.OnTgenEditor(self.getselectedwords())    
+        self.parent.tree.OnTgenEditor(self.getselectedwords())
 
 
 class wliste(wx.Frame):
     def __init__(self, parent, id, title, d, fline, size=(600, 500)):
         wx.Frame.__init__(self, parent, id)
         self.liste = ListForSpec(self, parent, d, fline[1:], menu = False)
-        self.button_1 = wx.Button(self, -1, "Fermer")
+        self.button_1 = wx.Button(self, -1, _(u"Close").decode('utf8'))
         self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
         self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
         self.__do_layout()
@@ -776,7 +863,7 @@ class wliste(wx.Frame):
         self.SetAutoLayout(True)
         self.SetSizer(sizer_1)
         self.Layout()
-        
+
     def OnCloseMe(self, event):
         self.Close(True)