Steve Borho avatar Steve Borho committed 8937b9e Merge

Merge with stable

Comments (0)

Files changed (7)

contrib/thgdebugtools/__init__.py

+# thgdebugtools - extension to add debug actions to TortoiseHg
+#
+# Copyright 2013 Yuya Nishihara <yuya@tcha.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2, incorporated herein by reference.
+
+"""add debug actions to TortoiseHg GUI
+
+This extension adds "Debug" menu to the Workbench window.
+"""
+
+import sys
+
+def extsetup(ui):
+    if 'tortoisehg.hgqt.run' not in sys.modules:
+        return  # not a TortoiseHg
+
+    # now it's safe to load TortoiseHg-specific modules
+    import core
+    core.extsetup(ui)

contrib/thgdebugtools/core.py

+# core.py - top-level menus and hooks
+#
+# Copyright 2013 Yuya Nishihara <yuya@tcha.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2, incorporated herein by reference.
+
+import gc
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from mercurial import extensions
+from tortoisehg.hgqt import run, workbench
+
+import dbgutil, infobar, widgets
+
+class DebugMenuActions(dbgutil.BaseMenuActions):
+    """Set up top-level debug menu"""
+
+    def _setupMenu(self, menu):
+        if self._workbench():
+            m = menu.addMenu('&InfoBar')
+            infobar.InfoBarMenuActions(m, parent=self)
+            self._infoBarMenu = m
+            menu.aboutToShow.connect(self._updateInfoBarMenu)
+
+        m = menu.addMenu('&Widgets')
+        widgets.WidgetsMenuActions(m, parent=self)
+
+        menu.addSeparator()
+
+        a = menu.addAction('Run Full &Garbage Collection')
+        a.triggered.connect(self.runGc)
+
+        a = menu.addAction('')  # placeholder to show gc status
+        a.setEnabled(False)
+        self._gcStatusAction = a
+
+        a = menu.addAction('&Enable Garbage Collector')
+        a.setCheckable(True)
+        a.triggered.connect(self.setGcEnabled)
+        self._gcEnabledAction = a
+        menu.aboutToShow.connect(self._updateGcAction)
+
+    @pyqtSlot()
+    def _updateInfoBarMenu(self):
+        self._infoBarMenu.setEnabled(bool(self._repoWidget()))
+
+    @pyqtSlot()
+    def runGc(self):
+        found = gc.collect()
+        self._information('GC Result', 'Found %d unreachable objects' % found)
+
+    @property
+    def _gcTimer(self):
+        return run.qtrun._gc.timer
+
+    def isGcEnabled(self):
+        return self._gcTimer.isActive()
+
+    @pyqtSlot(bool)
+    def setGcEnabled(self, enabled):
+        if enabled:
+            self._gcTimer.start()
+        else:
+            self._gcTimer.stop()
+
+    @pyqtSlot()
+    def _updateGcAction(self):
+        self._gcStatusAction.setText('  count = %s'
+                                     % ', '.join(map(str, gc.get_count())))
+        self._gcEnabledAction.setChecked(self.isGcEnabled())
+
+def _workbenchrun(orig, ui, *pats, **opts):
+    dlg = orig(ui, *pats, **opts)
+    m = dlg.menuBar().addMenu('&Debug')
+    DebugMenuActions(m, parent=dlg)
+    return dlg
+
+def extsetup(ui):
+    extensions.wrapfunction(workbench, 'run', _workbenchrun)

contrib/thgdebugtools/dbgutil.py

+# dbgutil.py - common functions and classes
+#
+# Copyright 2013 Yuya Nishihara <yuya@tcha.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2, incorporated herein by reference.
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from tortoisehg.hgqt import workbench
+
+class WidgetNotFound(Exception):
+    pass
+
+class BaseMenuActions(QObject):
+    """Common helper methods for debug menu actions"""
+
+    def __init__(self, menu, parent=None):
+        super(BaseMenuActions, self).__init__(parent)
+        self._setupMenu(menu)  # must be implemented by sub class
+
+    def _findParentWidget(self):
+        p = self.parent()
+        while p:
+            if isinstance(p, QWidget):
+                return p
+            p = p.parent()
+        raise WidgetNotFound('no parent widget exists')
+
+    def _parentWidget(self):
+        try:
+            return self._findParentWidget()
+        except WidgetNotFound:
+            pass
+
+    def _findWorkbench(self):
+        w = self._findParentWidget().window()
+        if isinstance(w, workbench.Workbench):
+            return w
+        raise WidgetNotFound('parent window is not a Workbench')
+
+    def _workbench(self):
+        try:
+            return self._findWorkbench()
+        except WidgetNotFound:
+            pass
+
+    def _findRepoWidget(self):
+        w = self._findWorkbench().repoTabsWidget.currentWidget()
+        if w:
+            return w
+        raise WidgetNotFound('no RepoWidget is open')
+
+    def _repoWidget(self):
+        try:
+            return self._findRepoWidget()
+        except WidgetNotFound:
+            pass
+
+    def _information(self, title, text):
+        return QMessageBox.information(self._parentWidget(), title, text)
+
+    def _getText(self, title, label, text=None):
+        newtext, ok = QInputDialog.getText(self._parentWidget(), title, label,
+                                           text=text or '')
+        if ok:
+            return unicode(newtext)
+
+    def _log(self, msg, label='ui.debug'):
+        try:
+            wb = self._findWorkbench()
+            wb.log.output(msg, label=label)
+        except WidgetNotFound:
+            pass

contrib/thgdebugtools/infobar.py

+# infobar.py - menu to show/hide infobar manually
+#
+# Copyright 2013 Yuya Nishihara <yuya@tcha.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2, incorporated herein by reference.
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+from mercurial import extensions, util
+from tortoisehg.hgqt import qtlib
+
+import dbgutil
+
+class InfoBarMenuActions(dbgutil.BaseMenuActions):
+    """Set up debug menu for RepoWidget's InfoBar"""
+
+    def _setupMenu(self, menu):
+        menu.triggered.connect(self._setInfoBarByAction)
+        clsnames = ['&StatusInfoBar', 'Command&ErrorInfoBar',
+                    '&ConfirmInfoBar']
+        for e in clsnames:
+            menu.addAction(e).setData(e.replace('&', ''))
+
+        menu.addSeparator()
+        a = menu.addAction('Cl&ear')
+        a.triggered.connect(self.clearInfoBar)
+        a = menu.addAction('Setup &Trace')
+        a.triggered.connect(self.setupInfoBarTrace)
+
+    @pyqtSlot(QAction)
+    def _setInfoBarByAction(self, action):
+        clsname = str(action.data().toString())
+        if not clsname:
+            return
+        self.setInfoBar(clsname)
+
+    def setInfoBar(self, clsname):
+        cls = getattr(qtlib, clsname)
+        msg = self._getText('Set InfoBar', 'Message',
+                            'The quick fox jumps over the lazy dog.')
+        if msg:
+            self._findRepoWidget().setInfoBar(cls, msg)
+
+    @pyqtSlot()
+    def clearInfoBar(self):
+        self._findRepoWidget().clearInfoBar()
+
+    @pyqtSlot()
+    def setupInfoBarTrace(self):
+        rw = self._findRepoWidget()
+        def setInfoBarWithTrace(orig, cls, *args, **kwargs):
+            w = orig(cls, *args, **kwargs)
+            if not w:
+                return
+            self._log('InfoBar %r created\n' % w)
+            if util.safehasattr(w, 'finished'):
+                w.finished.connect(self._logInfoBarFinished)
+            return w
+        extensions.wrapfunction(rw, 'setInfoBar', setInfoBarWithTrace)
+
+    @pyqtSlot(int)
+    def _logInfoBarFinished(self, result):
+        self._log('InfoBar %r finished with %d\n' % (self.sender(), result))

contrib/thgdebugtools/widgets.py

+# widgets.py - menu to find invisible widgets and gc issues
+#
+# Copyright 2013 Yuya Nishihara <yuya@tcha.org>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2, incorporated herein by reference.
+
+import cgi, gc, pprint, re, weakref
+
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+
+import dbgutil
+
+def invisibleWindows():
+    """List of invisible top-level widgets excluding menus"""
+    return [w for w in QApplication.topLevelWidgets()
+            if w.isHidden() and not isinstance(w, QMenu)]
+
+def orphanedWidgets():
+    """List of invisible widgets of no parent"""
+    return [w for w in QApplication.allWidgets()
+            if (not w.parent() and w.isHidden()
+                and not isinstance(w, QDesktopWidget))]
+
+def zombieWidgets():
+    """List of possibly-deleted widgets but referenced from Python"""
+    referenced = set(w for w in gc.get_objects() if isinstance(w, QWidget))
+    return referenced - set(QApplication.allWidgets())
+
+class WidgetsMenuActions(dbgutil.BaseMenuActions):
+    """Set up menu to find unused widgets"""
+
+    def _setupMenu(self, menu):
+        findtypes = [
+            ('&Invisible Windows', invisibleWindows, self.showWidget),
+            ('&Orphaned Widgets',  orphanedWidgets,  self.showWidget),
+            ('&Zombie Widgets',    zombieWidgets,    self.openGcInfoOfWidget),
+            ]
+        for name, collect, action in findtypes:
+            m = menu.addMenu(name)
+            m.menuAction().setStatusTip(collect.__doc__ or '')
+            f = WidgetsFinder(m, collect, parent=self)
+            f.triggered.connect(action)
+
+        menu.addSeparator()
+
+        a = menu.addAction('&GC Info of Active Window')
+        a.triggered.connect(self.openGcInfoOfActiveWindow)
+        self._gcInfoDialog = None
+
+    @pyqtSlot(object)
+    def showWidget(self, w):
+        w.show()
+        w.raise_()
+        w.activateWindow()
+
+    def _openGcInfoDialog(self):
+        if self._gcInfoDialog:
+            dlg = self._gcInfoDialog
+        else:
+            dlg = self._gcInfoDialog = GcInfoDialog()
+        dlg.show()
+        dlg.raise_()
+        dlg.activateWindow()
+        return dlg
+
+    @pyqtSlot(object)
+    def openGcInfoOfWidget(self, w):
+        dlg = self._openGcInfoDialog()
+        dlg.update(w)
+
+    @pyqtSlot()
+    def openGcInfoOfActiveWindow(self):
+        dlg = self._openGcInfoDialog()
+        dlg.update(QApplication.activeWindow())
+
+class WidgetsFinder(QObject):
+    # not QWidget because C++ part may be deleted
+    triggered = pyqtSignal(object)
+
+    def __init__(self, menu, collect, parent=None):
+        super(WidgetsFinder, self).__init__(parent)
+        self._menu = menu
+        self._menu.aboutToShow.connect(self.rebuild)
+        self._menu.triggered.connect(self._emitTriggered)
+        self._collect = collect
+        self._refreshTimer = QTimer(self, interval=100)
+        self._refreshTimer.timeout.connect(self.refresh)
+        self._menu.aboutToShow.connect(self._refreshTimer.start)
+        self._menu.aboutToHide.connect(self._refreshTimer.stop)
+
+    @pyqtSlot()
+    def rebuild(self):
+        widgets = self._collect()
+        self._menu.clear()
+        if not widgets:
+            self._menu.addAction('(none)').setEnabled(False)
+            return
+        for i, w in enumerate(sorted(widgets, key=repr)):
+            s = re.sub(r'^(tortoisehg\.hgqt|PyQt4\.QtGui)\.', '',
+                       repr(w)[1:-1])
+            s = s.replace(' object at ', ' at ')
+            if i < 10:
+                s = '&%d %s' % ((i + 1) % 10, s)
+            a = self._menu.addAction(s)
+            a.setData(weakref.ref(w))
+
+    @pyqtSlot()
+    def refresh(self):
+        for a in self._menu.actions():
+            wref = a.data().toPyObject()
+            if not wref:
+                continue
+            w = wref()
+            a.setEnabled(bool(w))
+
+    @pyqtSlot(QAction)
+    def _emitTriggered(self, action):
+        wref = action.data().toPyObject()
+        w = wref()
+        if w:
+            self.triggered.emit(w)
+
+class GcInfoDialog(QDialog):
+
+    def __init__(self, parent=None):
+        super(GcInfoDialog, self).__init__(parent)
+        self.setLayout(QVBoxLayout(self))
+        self._infoEdit = QTextBrowser(self)
+        self.layout().addWidget(self._infoEdit)
+        self._followActiveCheck = QCheckBox('&Follow active window', self)
+        self._followActiveCheck.setChecked(True)
+        self.layout().addWidget(self._followActiveCheck)
+
+        self._buttonBox = bbox = QDialogButtonBox(self)
+        self.layout().addWidget(bbox)
+        b = bbox.addButton('&Show Widget', QDialogButtonBox.ActionRole)
+        b.clicked.connect(self.showWidget)
+        b = bbox.addButton('&Destroy', QDialogButtonBox.ResetRole)
+        b.clicked.connect(self.deleteWidget)
+        b.setAutoDefault(False)
+
+        self._targetWidgetRef = None
+        QApplication.instance().focusChanged.connect(self._updateByFocusChange)
+        self._updateButtons()
+        self.resize(600, 400)
+
+    def targetWidget(self):
+        if not self._targetWidgetRef:
+            return
+        return self._targetWidgetRef()
+
+    @pyqtSlot()
+    def showWidget(self):
+        w = self.targetWidget()
+        if not w:
+            self._updateButtons()
+            return
+        w.show()
+        w.raise_()
+        w.activateWindow()
+
+    @pyqtSlot()
+    def deleteWidget(self):
+        w = self.targetWidget()
+        if not w:
+            self._updateButtons()
+            return
+        w.deleteLater()
+
+    @pyqtSlot(QWidget, QWidget)
+    def _updateByFocusChange(self, old, now):
+        if (not self._followActiveCheck.isChecked()
+            or not old or not now or old.window() is now.window()
+            or now.window() is self):
+            return
+        self.update(now.window())
+
+    def update(self, w):
+        if not w:
+            self._targetWidgetRef = None
+            self._updateButtons()
+            return
+        referrers = gc.get_referrers(w)
+        self.setWindowTitle('GC Info - %r' % w)
+        self._infoEdit.clear()
+        self._infoEdit.append('<h1>Referrers</h1>')
+        self._infoEdit.append('<pre>%s</pre>'
+                              % cgi.escape(pprint.pformat(referrers)))
+        del referrers
+        self._targetWidgetRef = weakref.ref(w)
+        self._updateButtons()
+
+    @pyqtSlot()
+    def _updateButtons(self):
+        self._buttonBox.setEnabled(bool(self.targetWidget()))

i18n/tortoisehg/cs.po

 "Project-Id-Version: tortoisehg\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 "POT-Creation-Date: 2013-02-13 13:57-0200\n"
-"PO-Revision-Date: 2012-12-17 18:01+0000\n"
+"PO-Revision-Date: 2013-02-15 19:36+0000\n"
 "Last-Translator: Tovim <Unknown>\n"
 "Language-Team: Czech <kde-i18n-doc@kde.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2013-02-14 04:40+0000\n"
+"X-Launchpad-Export-Date: 2013-02-16 05:01+0000\n"
 "X-Generator: Launchpad (build 16491)\n"
 
 #: TortoiseHgOverlayServer.py:51
 
 #: tortoisehg/hgqt/backout.py:99
 msgid "Prepare to backout"
-msgstr "Připravit pro backout"
+msgstr "Připravit pro backout (anulování revize)"
 
 #: tortoisehg/hgqt/backout.py:100
 msgid "Verify backout revision and ensure your working directory is clean."
 
 #: tortoisehg/hgqt/backout.py:117
 msgid "Backing out a parent revision is a single step operation"
-msgstr "Backout rodičovské revize je jednokroková operace"
+msgstr "Anulovaná revize je negována doplněnou revizí opačnou"
 
 #: tortoisehg/hgqt/backout.py:124
 msgid "Backout requires a parent revision"
 
 #: tortoisehg/hgqt/commit.py:293
 msgid "Amend current revision"
-msgstr "Upravit (amend) aktální revizi"
+msgstr "Upravit aktální revizi"
 
 #: tortoisehg/hgqt/commit.py:293
 msgid "Amend"
 
 #: tortoisehg/hgqt/customtools.py:379
 msgid "All items"
-msgstr ""
+msgstr "Všechny položky"
 
 #: tortoisehg/hgqt/customtools.py:380
 msgid "Working directory"
-msgstr ""
+msgstr "Pracovní adresář"
 
 #: tortoisehg/hgqt/customtools.py:381
 msgid "All revisions"
-msgstr ""
+msgstr "Všechny revize"
 
 #: tortoisehg/hgqt/customtools.py:382
 msgid "All contexts"
-msgstr ""
+msgstr "Všechny kontexty"
 
 #: tortoisehg/hgqt/customtools.py:383
 msgid "Fixed revisions"
 
 #: tortoisehg/hgqt/customtools.py:384
 msgid "Applied patches"
-msgstr ""
+msgstr "Použité oprávky"
 
 #: tortoisehg/hgqt/customtools.py:385
 msgid "Applied patches or qparent"
 "{REV} / {REVID} as an alias of the selected revision number / hexadecimal "
 "identifier respectively."
 msgstr ""
+"Příkaz, který bude proveden.\n"
+"Při provádění příkazu Mercurialu použijte \"hg\" (místo \"hg.exe\").\n"
+"Můžete použít {ROOT} jako alias aktuálního kořene repozitáře \n"
+"a {REV} / {REVID} jako alias vybraného čísla revize, případně "
+"hexadecimálního identifikátoru."
 
 #: tortoisehg/hgqt/customtools.py:415
 msgid "Tool label"
 
 #: tortoisehg/hgqt/filedata.py:122 tortoisehg/hgqt/filedata.py:160
 msgid " <i>(is a symlink)</i>"
-msgstr " <i>(is a symlink)</i>"
+msgstr ""
 
 #: tortoisehg/hgqt/filedata.py:126
 msgid "Diff not displayed: "
 
 #: tortoisehg/hgqt/filedialogs.py:270 tortoisehg/hgqt/filedialogs.py:299
 msgid "You must select two revisions to diff"
-msgstr "K porov(diff) musíte vybrat dvě revize"
+msgstr "K provedení diffu musíte vybrat dvě revize"
 
 #: tortoisehg/hgqt/filedialogs.py:372
 msgid "Too many rows selected for menu"
 
 #: tortoisehg/hgqt/fileview.py:59
 msgid " (excluded from the next commit)"
-msgstr ""
+msgstr " (vyloučené z následného komitu)"
 
 #: tortoisehg/hgqt/fileview.py:68
 msgid "Diff Toolbar"
 
 #: tortoisehg/hgqt/fileview.py:788
 msgid "Mark excluded changes"
-msgstr ""
+msgstr "Označit vyloučené změny"
 
 #: tortoisehg/hgqt/fileview.py:794
 msgid "&Search in Current File"
-msgstr ""
+msgstr "&Hledat v aktuálním souboru"
 
 #: tortoisehg/hgqt/fileview.py:795 tortoisehg/hgqt/fileview.py:825
 msgid "Search in &History"
-msgstr ""
+msgstr "Hledat v &historii"
 
 #: tortoisehg/hgqt/fileview.py:803
 msgid "Annotate Op&tions"
-msgstr ""
+msgstr "Možnosti anotace"
 
 #: tortoisehg/hgqt/fileview.py:820
 msgid "Search in &Original Revision"
-msgstr ""
+msgstr "Hledat v původní revizi"
 
 #: tortoisehg/hgqt/fileview.py:822
 msgid "Search in &Working Revision"
-msgstr ""
+msgstr "Hledat v pracovní revizi"
 
 #: tortoisehg/hgqt/fileview.py:824
 msgid "&Search in Current Annotation"
-msgstr ""
+msgstr "Hledat v aktuální anotaci"
 
 #: tortoisehg/hgqt/fileview.py:844
 msgid "A&nnotate Originating Revision"
-msgstr ""
+msgstr "Popsat výchozí revizi"
 
 #: tortoisehg/hgqt/fileview.py:845
 msgid "&View Originating Revision"
-msgstr ""
+msgstr "&Ukázat výchozí revizi"
 
 #: tortoisehg/hgqt/fileview.py:857
 #, python-format
 msgid "Annotate &Parent Revision %d"
-msgstr ""
+msgstr "Označit &rodičovskou revizi %d"
 
 #: tortoisehg/hgqt/fileview.py:859
 #, python-format
 msgid "View Parent &Revision %d"
-msgstr ""
+msgstr "Ukázat rodičovskou revizi %d"
 
 #: tortoisehg/hgqt/fileview.py:925
 msgid "Show &Author"
 
 #: tortoisehg/hgqt/hginit.py:85
 msgid "New Repository"
-msgstr ""
+msgstr "Nový repozitář"
 
 #: tortoisehg/hgqt/hginit.py:127 tortoisehg/hgqt/hginit.py:159
 #: tortoisehg/hgqt/hginit.py:173 tortoisehg/hgqt/hginit.py:183
 #: tortoisehg/hgqt/matching.py:73 tortoisehg/hgqt/matching.py:196
 #: tortoisehg/hgqt/matching.py:217
 msgid "Revision to Match:"
-msgstr ""
+msgstr "Revize pro shodu:"
 
 #: tortoisehg/hgqt/matching.py:81
 msgid "Fields to match:"
 
 #: tortoisehg/hgqt/merge.py:143
 msgid "Merge from (other revision)"
-msgstr "Merge z (jiné revize)"
+msgstr "Sloučit z (jiné revize)"
 
 #: tortoisehg/hgqt/merge.py:150 tortoisehg/hgqt/merge.py:739
 msgid "Unable to merge"
 
 #: tortoisehg/hgqt/merge.py:155
 msgid "Merge to (working directory)"
-msgstr "Merge k (pracovnímu adresáři)"
+msgstr "Sloučit k (pracovnímu adresáři)"
 
 #: tortoisehg/hgqt/merge.py:178
 msgid ""
 
 #: tortoisehg/hgqt/messageentry.py:78
 msgid "Paste &Filenames"
-msgstr "Paste &Filenames"
+msgstr "Vložit jména souborů"
 
 #: tortoisehg/hgqt/messageentry.py:80
 msgid "App&ly Format"
-msgstr "App&ly Format"
+msgstr "Použít formát"
 
 #: tortoisehg/hgqt/messageentry.py:81
 msgid "C&onfigure Format"
-msgstr "C&onfigure Format"
+msgstr "Nastavit formát"
 
 #: tortoisehg/hgqt/mq.py:43
 msgid "Patch Queue"
 
 #: tortoisehg/hgqt/postreview.py:111
 msgid "Password:"
-msgstr "Password:"
+msgstr "Heslo:"
 
 #: tortoisehg/hgqt/postreview.py:127 tortoisehg/hgqt/postreview.py:378
 #: tortoisehg/hgqt/rename.py:45
 #: tortoisehg/hgqt/purge.py:260
 #, python-format
 msgid "Deleted %d files"
-msgstr "Deleted %d files"
+msgstr "Smazáno %d souborů"
 
 #: tortoisehg/hgqt/purge.py:270
 #, python-format
 msgid "Deleted %d files and %d folders"
-msgstr "Deleted %d files and %d folders"
+msgstr "Smazáno %d souborů a %d složek"
 
 #: tortoisehg/hgqt/qdelete.py:24
 #, python-format
 #: tortoisehg/hgqt/repomodel.py:46
 msgctxt "column header"
 msgid "Rev"
-msgstr "Rev"
+msgstr "Revize"
 
 #: tortoisehg/hgqt/repomodel.py:47
 msgctxt "column header"
 
 #: tortoisehg/hgqt/shellconf.py:163
 msgid "*: not used by TortoiseHg"
-msgstr "*: v TortoiseHg nepoužito"
+msgstr "* v TortoiseHg nepoužito"
 
 #: tortoisehg/hgqt/shellconf.py:167
 msgid "Taskbar"
 
 #: tortoisehg/hgqt/shelve.py:257
 msgid "TortoiseHg New Shelf Name"
-msgstr "Nový název shelfu"
+msgstr "Nový název šelfu"
 
 #: tortoisehg/hgqt/shelve.py:258
 msgid "Specify name of new shelf"
 
 #: tortoisehg/hgqt/wctxactions.py:55
 msgid "&Revert..."
-msgstr "&Vrátit..."
+msgstr "&Vrátit (revert)..."
 
 #: tortoisehg/hgqt/wctxactions.py:59
 msgid "&Annotate"
 
 #: tortoisehg/hgqt/workbench.py:88 tortoisehg/hgqt/workbench.py:169
 msgid "Clon&e Repository..."
-msgstr ""
+msgstr "Klonovat repozitář..."
 
 #: tortoisehg/hgqt/workbench.py:90 tortoisehg/hgqt/workbench.py:173
 msgid "&Open Repository..."
 
 #: tortoisehg/hgqt/workbench.py:204
 msgid "R&epository Registry Options"
-msgstr ""
+msgstr "Nastavení registru repozitářů"
 
 #: tortoisehg/hgqt/workbench.py:211
 msgid "Save Open Repositories on E&xit"
 
 #: tortoisehg/hgqt/workbench.py:258
 msgid "&Refresh"
-msgstr "&Zčerstvit"
+msgstr "&Zčerstvit (refresh)"
 
 #: tortoisehg/hgqt/workbench.py:261
 msgid "Refresh current repository"
 
 #: tortoisehg/hgqt/workbench.py:267
 msgid "Load &All Revisions"
-msgstr ""
+msgstr "Načíst všechny revize"
 
 #: tortoisehg/hgqt/workbench.py:269
 msgid "Load all revisions into graph"
 
 #: tortoisehg/hgqt/workbench.py:270
 msgid "&Goto Revision..."
-msgstr ""
+msgstr "Přejít k revizi..."
 
 #: tortoisehg/hgqt/workbench.py:272 tortoisehg/hgqt/workbench.py:325
 #: tortoisehg/hgqt/workbench.py:326
 
 #: tortoisehg/hgqt/workbench.py:282
 msgid "&Verify"
-msgstr ""
+msgstr "Ověřit repozitář"
 
 #: tortoisehg/hgqt/workbench.py:284
 msgid "Re&cover"
-msgstr ""
+msgstr "Obnovit repozitář"
 
 #: tortoisehg/hgqt/workbench.py:287
 msgid "&Resolve..."
-msgstr ""
+msgstr "Řešit konflikt"
 
 #: tortoisehg/hgqt/workbench.py:290
 msgid "Rollback/&Undo..."
 #: tortoisehg/hgqt/workbench.py:728 tortoisehg/hgqt/workbench.py:733
 #: tortoisehg/hgqt/workbench.py:1047 tortoisehg/hgqt/workbench.py:1053
 msgid "Reopening tabs"
-msgstr "Znovuotevření karet"
+msgstr "Otevření karet"
 
 #: tortoisehg/hgqt/workbench.py:729 tortoisehg/hgqt/workbench.py:1048
 #, python-format
 msgid "Reopening repository %s"
-msgstr "Znovuotevření repozitáře %s"
+msgstr "Otevření repozitáře %s"
 
 #: tortoisehg/hgqt/workbench.py:858
 msgid "Goto revision"
 
 #: tortoisehg/util/menuthg.py:52
 msgid "Shelve Changes"
-msgstr "Odložit (shelve) změny"
+msgstr "Odložit (shelve) změny..."
 
 #: tortoisehg/util/menuthg.py:53
 msgid "Move changes between working dir and patch"
 
 #: tortoisehg/util/menuthg.py:82
 msgid "Edit Ignore Filter"
-msgstr "Upravit filtr Ignoruj"
+msgstr "Upravit filtr \"ignoruj\""
 
 #: tortoisehg/util/menuthg.py:83
 msgid "Edit repository ignore filter"

i18n/tortoisehg/fr.po

 "Project-Id-Version: tortoisehg\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 "POT-Creation-Date: 2013-02-13 13:57-0200\n"
-"PO-Revision-Date: 2013-01-25 13:56+0000\n"
+"PO-Revision-Date: 2013-02-14 19:22+0000\n"
 "Last-Translator: André Sintzoff <Unknown>\n"
 "Language-Team: French <fr@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
-"X-Launchpad-Export-Date: 2013-02-14 04:41+0000\n"
+"X-Launchpad-Export-Date: 2013-02-15 04:41+0000\n"
 "X-Generator: Launchpad (build 16491)\n"
 "X-Poedit-Country: FRANCE\n"
 "X-Poedit-Language: French\n"
 
 #: tortoisehg/hgqt/chunks.py:679 tortoisehg/hgqt/fileview.py:439
 msgid "Please wait while the file is opened ..."
-msgstr ""
+msgstr "Veuillez attendre l'ouverture du fichier..."
 
 #: tortoisehg/hgqt/clone.py:61 tortoisehg/hgqt/rename.py:66
 #: tortoisehg/hgqt/thgimport.py:63
 
 #: tortoisehg/hgqt/filedata.py:18
 msgid "Display the file anyway"
-msgstr ""
+msgstr "Afficher le fichier de toute façon"
 
 #: tortoisehg/hgqt/filedata.py:45
 msgid "File or diffs not displayed: "
 #: tortoisehg/hgqt/guess.py:302
 #, python-format
 msgid "%d%%"
-msgstr ""
+msgstr "%d %%"
 
 #: tortoisehg/hgqt/guess.py:308
 msgid "Source"
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.