Report statistics in status bar

Julien LepillerSat Jun 23 16:28:15+0200 2018

b50ffce

Report statistics in status bar

i18n/offlate_fr.ts

33
<context>
44
    <name>NewWindow</name>
55
    <message>
6-
        <location filename="../offlate/window.py" line="204"/>
6+
        <location filename="../offlate/window.py" line="244"/>
77
        <source>The Translation Project</source>
88
        <translation>Le Projet de Traduction</translation>
99
    </message>
1010
    <message>
11-
        <location filename="../offlate/window.py" line="212"/>
11+
        <location filename="../offlate/window.py" line="252"/>
1212
        <source>Cancel</source>
1313
        <translation>Annuler</translation>
1414
    </message>
1515
    <message>
16-
        <location filename="../offlate/window.py" line="213"/>
16+
        <location filename="../offlate/window.py" line="253"/>
1717
        <source>OK</source>
1818
        <translation>OK</translation>
1919
    </message>
2020
    <message>
21-
        <location filename="../offlate/window.py" line="195"/>
21+
        <location filename="../offlate/window.py" line="235"/>
2222
        <source>Project information</source>
2323
        <translation>Informations sur le projet</translation>
2424
    </message>
2525
    <message>
26-
        <location filename="../offlate/window.py" line="201"/>
26+
        <location filename="../offlate/window.py" line="241"/>
2727
        <source>Name:</source>
2828
        <translation>Nom :</translation>
2929
    </message>
3030
    <message>
31-
        <location filename="../offlate/window.py" line="202"/>
31+
        <location filename="../offlate/window.py" line="242"/>
3232
        <source>Target Language:</source>
3333
        <translation>Langue cible :</translation>
3434
    </message>
3535
    <message>
36-
        <location filename="../offlate/window.py" line="205"/>
36+
        <location filename="../offlate/window.py" line="245"/>
3737
        <source>Transifex</source>
3838
        <translation>Transifex</translation>
3939
    </message>
4040
    <message>
41-
        <location filename="../offlate/window.py" line="227"/>
41+
        <location filename="../offlate/window.py" line="267"/>
4242
        <source>Organization</source>
4343
        <translation>Organisation</translation>
4444
    </message>

4646
<context>
4747
    <name>ProjectView</name>
4848
    <message>
49-
        <location filename="../offlate/window.py" line="112"/>
49+
        <location filename="../offlate/window.py" line="137"/>
5050
        <source>Singular</source>
5151
        <translation>Singulier</translation>
5252
    </message>
5353
    <message>
54-
        <location filename="../offlate/window.py" line="113"/>
54+
        <location filename="../offlate/window.py" line="138"/>
5555
        <source>Plural</source>
5656
        <translation>Pluriel</translation>
5757
    </message>

5959
<context>
6060
    <name>SettingsWindow</name>
6161
    <message>
62-
        <location filename="../offlate/window.py" line="318"/>
62+
        <location filename="../offlate/window.py" line="358"/>
6363
        <source>Cancel</source>
6464
        <translation>Annuler</translation>
6565
    </message>
6666
    <message>
67-
        <location filename="../offlate/window.py" line="319"/>
67+
        <location filename="../offlate/window.py" line="359"/>
6868
        <source>OK</source>
6969
        <translation>OK</translation>
7070
    </message>
7171
    <message>
72-
        <location filename="../offlate/window.py" line="384"/>
72+
        <location filename="../offlate/window.py" line="424"/>
7373
        <source>Email:</source>
7474
        <translation>Adresse de courriel :</translation>
7575
    </message>
7676
    <message>
77-
        <location filename="../offlate/window.py" line="385"/>
77+
        <location filename="../offlate/window.py" line="425"/>
7878
        <source>Server:</source>
7979
        <translation>Serveur :</translation>
8080
    </message>
8181
    <message>
82-
        <location filename="../offlate/window.py" line="386"/>
82+
        <location filename="../offlate/window.py" line="426"/>
8383
        <source>User Name:</source>
8484
        <translation>Nom d&apos;utilisateur :</translation>
8585
    </message>
8686
    <message>
87-
        <location filename="../offlate/window.py" line="330"/>
87+
        <location filename="../offlate/window.py" line="370"/>
8888
        <source>Transifex</source>
8989
        <translation>Transifex</translation>
9090
    </message>
9191
    <message>
92-
        <location filename="../offlate/window.py" line="342"/>
92+
        <location filename="../offlate/window.py" line="382"/>
9393
        <source>You can get a token from &lt;a href=&quot;#&quot;&gt;https://www.transifex.com/user/settings/api/&lt;/a&gt;</source>
9494
        <translation>Vous pouvez r??cup??rer un jeton sur &lt;a href=&quot;#&quot;&gt;https://www.transifex.com/user/settings/api/&lt;/a&gt;</translation>
9595
    </message>
9696
    <message>
97-
        <location filename="../offlate/window.py" line="345"/>
97+
        <location filename="../offlate/window.py" line="385"/>
9898
        <source>Token:</source>
9999
        <translation>Jeton :</translation>
100100
    </message>
101101
    <message>
102-
        <location filename="../offlate/window.py" line="359"/>
102+
        <location filename="../offlate/window.py" line="399"/>
103103
        <source>Translation Project</source>
104104
        <translation>Projet de traduction</translation>
105105
    </message>
106106
    <message>
107-
        <location filename="../offlate/window.py" line="387"/>
107+
        <location filename="../offlate/window.py" line="427"/>
108108
        <source>Full Name (John Doe &lt;john@doe.me&gt;):</source>
109109
        <translation>Nom complet (Jean Dupont &lt;jean@dupont.me&gt;) :</translation>
110110
    </message>

125125
<context>
126126
    <name>Window</name>
127127
    <message>
128-
        <location filename="../offlate/window.py" line="459"/>
128+
        <location filename="../offlate/window.py" line="527"/>
129129
        <source>Exit application</source>
130130
        <translation>Quitter l&apos;application</translation>
131131
    </message>
132132
    <message>
133-
        <location filename="../offlate/window.py" line="464"/>
133+
        <location filename="../offlate/window.py" line="532"/>
134134
        <source>Save current project</source>
135135
        <translation>Sauvegarder le projet actuel</translation>
136136
    </message>
137137
    <message>
138-
        <location filename="../offlate/window.py" line="469"/>
138+
        <location filename="../offlate/window.py" line="537"/>
139139
        <source>New project</source>
140140
        <translation>Nouveau projet</translation>
141141
    </message>
142142
    <message>
143-
        <location filename="../offlate/window.py" line="474"/>
143+
        <location filename="../offlate/window.py" line="542"/>
144144
        <source>Get modifications from upstream</source>
145145
        <translation>R??cup??rer les modifications en amont</translation>
146146
    </message>
147147
    <message>
148-
        <location filename="../offlate/window.py" line="478"/>
148+
        <location filename="../offlate/window.py" line="546"/>
149149
        <source>Close current project</source>
150150
        <translation>Fermer le projet actuel</translation>
151151
    </message>
152152
    <message>
153-
        <location filename="../offlate/window.py" line="483"/>
153+
        <location filename="../offlate/window.py" line="551"/>
154154
        <source>Send modifications upstream</source>
155155
        <translation>Envoyer les modifications en amont</translation>
156156
    </message>
157157
    <message>
158-
        <location filename="../offlate/window.py" line="488"/>
158+
        <location filename="../offlate/window.py" line="556"/>
159159
        <source>Set parameters</source>
160160
        <translation>Configurer les param??tres</translation>
161161
    </message>
162162
    <message>
163-
        <location filename="../offlate/window.py" line="491"/>
163+
        <location filename="../offlate/window.py" line="559"/>
164164
        <source>Show Translated</source>
165165
        <translation>Montrer traduites</translation>
166166
    </message>
167167
    <message>
168-
        <location filename="../offlate/window.py" line="494"/>
168+
        <location filename="../offlate/window.py" line="562"/>
169169
        <source>Show Fuzzy</source>
170170
        <translation>Montrer floues</translation>
171171
    </message>
172172
    <message>
173-
        <location filename="../offlate/window.py" line="497"/>
173+
        <location filename="../offlate/window.py" line="565"/>
174174
        <source>Show Empty Translation</source>
175175
        <translation>Montrer les traductions vides</translation>
176176
    </message>
177177
    <message>
178-
        <location filename="../offlate/window.py" line="507"/>
178+
        <location filename="../offlate/window.py" line="583"/>
179179
        <source>&amp;File</source>
180180
        <translation>&amp;Fichier</translation>
181181
    </message>
182182
    <message>
183-
        <location filename="../offlate/window.py" line="513"/>
183+
        <location filename="../offlate/window.py" line="589"/>
184184
        <source>&amp;Project</source>
185185
        <translation>&amp;Projet</translation>
186186
    </message>
187187
    <message>
188-
        <location filename="../offlate/window.py" line="520"/>
188+
        <location filename="../offlate/window.py" line="596"/>
189189
        <source>&amp;Edit</source>
190190
        <translation>&amp;??dition</translation>
191191
    </message>
192192
    <message>
193-
        <location filename="../offlate/window.py" line="523"/>
193+
        <location filename="../offlate/window.py" line="599"/>
194194
        <source>&amp;View</source>
195195
        <translation>&amp;Affichage</translation>
196196
    </message>
197197
    <message>
198-
        <location filename="../offlate/window.py" line="503"/>
198+
        <location filename="../offlate/window.py" line="579"/>
199199
        <source>Open</source>
200200
        <translation>Ouvrir</translation>
201201
    </message>
202202
    <message>
203-
        <location filename="../offlate/window.py" line="457"/>
203+
        <location filename="../offlate/window.py" line="525"/>
204204
        <source>Exit</source>
205205
        <translation>Quitter</translation>
206206
    </message>
207207
    <message>
208-
        <location filename="../offlate/window.py" line="462"/>
208+
        <location filename="../offlate/window.py" line="530"/>
209209
        <source>Save</source>
210210
        <translation>Sauvegarder</translation>
211211
    </message>
212212
    <message>
213-
        <location filename="../offlate/window.py" line="467"/>
213+
        <location filename="../offlate/window.py" line="535"/>
214214
        <source>New</source>
215215
        <translation>Nouveau</translation>
216216
    </message>
217217
    <message>
218-
        <location filename="../offlate/window.py" line="472"/>
218+
        <location filename="../offlate/window.py" line="540"/>
219219
        <source>Update</source>
220220
        <translation>Mettre ?? jour</translation>
221221
    </message>
222222
    <message>
223-
        <location filename="../offlate/window.py" line="477"/>
223+
        <location filename="../offlate/window.py" line="545"/>
224224
        <source>Close</source>
225225
        <translation>Fermer</translation>
226226
    </message>
227227
    <message>
228-
        <location filename="../offlate/window.py" line="481"/>
228+
        <location filename="../offlate/window.py" line="549"/>
229229
        <source>Send</source>
230230
        <translation>Envoyer</translation>
231231
    </message>
232232
    <message>
233-
        <location filename="../offlate/window.py" line="486"/>
233+
        <location filename="../offlate/window.py" line="554"/>
234234
        <source>Settings</source>
235235
        <translation>Param??tres</translation>
236236
    </message>
237+
    <message>
238+
        <location filename="../offlate/window.py" line="568"/>
239+
        <source>Use a monospace font</source>
240+
        <translation type="unfinished"></translation>
241+
    </message>
242+
    <message>
243+
        <location filename="../offlate/window.py" line="478"/>
244+
        <source>{} translated on {} total ({}%).</source>
245+
        <translation type="unfinished"></translation>
246+
    </message>
237247
</context>
238248
<context>
239249
    <name>self.qd</name>
240250
    <message>
241-
        <location filename="../offlate/window.py" line="26"/>
251+
        <location filename="../offlate/window.py" line="27"/>
242252
        <source>Please enter your password:</source>
243253
        <translation>Veuillez entrer votre mot de passe :</translation>
244254
    </message>

offlate/window.py

66
import json
77
import re
88
import os
9+
import math
910
1011
from .manager import ProjectManager
1112
from .spellcheckedit import SpellCheckEdit

3031
        return self.value
3132
3233
class ProjectView(QWidget):
34+
    translationModified = pyqtSignal()
35+
3336
    def __init__(self, project, showTranslated = True, showUntranslated = True,
3437
                showFuzzy = True, monospace = False, parent = None):
3538
        super(ProjectView, self).__init__(parent)

7174
            item.setData(0, Qt.UserRole, entry)
7275
            items.append(item)
7376
        self.treeWidget.insertTopLevelItems(0, items)
77+
        self.translationModified.emit()
7478
7579
    def initUI(self):
7680
        vbox = QVBoxLayout()

170174
            item.setBackground(1, QBrush())
171175
        else:
172176
            item.setBackground(1, self.emptyColor)
177+
        self.translationModified.emit()
178+
173179
174180
    def save(self):
175181
        self.project.save()

448454
449455
    def open(self, name):
450456
        project = self.manager.getProject(name)
451-
        self.tabs.addTab(ProjectView(project,
457+
        tab = ProjectView(project,
452458
            showTranslated = self.showTranslatedAct.isChecked(),
453459
            showUntranslated = self.showUntranslatedAct.isChecked(),
454460
            showFuzzy = self.showFuzzyAct.isChecked(),
455-
            monospace = self.monospaceAct.isChecked()), name)
461+
            monospace = self.monospaceAct.isChecked())
462+
        tab.translationModified.connect(self.count)
463+
        self.tabs.addTab(tab, name)
464+
        self.count()
465+
466+
    def count(self, item = -1):
467+
        widget = self.tabs.currentWidget()
468+
        content = widget.content[widget.currentContent]
469+
        total = 0
470+
        translated = 0
471+
        for d in content:
472+
            total += 1
473+
            if d.isTranslated() and not d.isFuzzy():
474+
                translated += 1
475+
        percent = 100 if total == 0 else math.floor(100 * translated / total)
476+
        self.countLabel.setText(self.tr("{} translated on {} total ({}%).").format(translated, total, percent))
456477
457478
    def save(self):
458479
        self.tabs.currentWidget().save()

549570
        self.nextShortcut = QShortcut(QKeySequence("Ctrl+Return"), self)
550571
        self.nextShortcut.activated.connect(self.nextItem)
551572
573+
        self.countLabel = QLabel()
552574
        self.statusBar()
575+
        self.statusBar().addWidget(self.countLabel)
553576
554577
        openMenu = QMenu(self.tr('Open'), self)
555578
        self.initOpenProjects(openMenu)

579602
        viewMenu.addAction(self.monospaceAct)
580603
581604
        self.tabs = ProjectTab()
605+
        self.tabs.currentChanged.connect(self.count)
582606
583607
        self.setCentralWidget(self.tabs)
584608