Fri, 04 Jun 2021 16:40:54 +0200
Ported the plug-in to PyQt6 for eric7.
--- a/.hgignore Thu Jun 03 18:02:18 2021 +0200 +++ b/.hgignore Fri Jun 04 16:40:54 2021 +0200 @@ -1,11 +1,6 @@ +glob:.eric7project glob:.eric6project -glob:_eric6project -glob:.eric5project -glob:_eric5project -glob:.eric4project -glob:_eric4project glob:.ropeproject -glob:_ropeproject glob:.directory glob:**.pyc glob:**.pyo
--- a/ChangeLog Thu Jun 03 18:02:18 2021 +0200 +++ b/ChangeLog Fri Jun 04 16:40:54 2021 +0200 @@ -1,5 +1,10 @@ ChangeLog --------- +Version 1.0.0: +- first release of the eric7 variant + +************************************************************ + Version 4.0.0: - removed support for outdated eric6 versions - implemented some code simplifications
--- a/PluginTimeTracker.e4p Thu Jun 03 18:02:18 2021 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,518 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE Project SYSTEM "Project-5.1.dtd"> -<!-- eric project file for project PluginTimeTracker --> -<!-- Copyright (C) 2020 Detlev Offenbach, detlev@die-offenbachs.de --> -<Project version="5.1"> - <Language>en</Language> - <Hash>9af6dcaf8f823f072f714e662c15d44dfdecceab</Hash> - <ProgLanguage mixed="0">Python3</ProgLanguage> - <ProjectType>E6Plugin</ProjectType> - <Description>Plugin implementing a simple time tracker to keep track of the time used for a project. The time can be subdivided into tasks.</Description> - <Version>2.x</Version> - <Author>Detlev Offenbach</Author> - <Email>detlev@die-offenbachs.de</Email> - <TranslationPattern>TimeTracker/i18n/timetracker_%language%.ts</TranslationPattern> - <Eol index="1"/> - <Sources> - <Source>PluginTimeTracker.py</Source> - <Source>TimeTracker/ConfigurationPage/TimeTrackerPage.py</Source> - <Source>TimeTracker/ConfigurationPage/__init__.py</Source> - <Source>TimeTracker/TimeTrackEntry.py</Source> - <Source>TimeTracker/TimeTracker.py</Source> - <Source>TimeTracker/TimeTrackerEntryDialog.py</Source> - <Source>TimeTracker/TimeTrackerWidget.py</Source> - <Source>TimeTracker/__init__.py</Source> - <Source>__init__.py</Source> - </Sources> - <Forms> - <Form>TimeTracker/ConfigurationPage/TimeTrackerPage.ui</Form> - <Form>TimeTracker/TimeTrackerEntryDialog.ui</Form> - <Form>TimeTracker/TimeTrackerWidget.ui</Form> - </Forms> - <Translations> - <Translation>TimeTracker/i18n/timetracker_de.qm</Translation> - <Translation>TimeTracker/i18n/timetracker_de.ts</Translation> - <Translation>TimeTracker/i18n/timetracker_en.qm</Translation> - <Translation>TimeTracker/i18n/timetracker_en.ts</Translation> - <Translation>TimeTracker/i18n/timetracker_es.qm</Translation> - <Translation>TimeTracker/i18n/timetracker_es.ts</Translation> - <Translation>TimeTracker/i18n/timetracker_pt.qm</Translation> - <Translation>TimeTracker/i18n/timetracker_pt.ts</Translation> - <Translation>TimeTracker/i18n/timetracker_ru.qm</Translation> - <Translation>TimeTracker/i18n/timetracker_ru.ts</Translation> - </Translations> - <Others> - <Other>.hgignore</Other> - <Other>ChangeLog</Other> - <Other>PKGLIST</Other> - <Other>PluginTimeTracker.e4p</Other> - <Other>PluginTimeTracker.zip</Other> - <Other>TimeTracker/Documentation/LICENSE.GPL3</Other> - <Other>TimeTracker/Documentation/source</Other> - <Other>TimeTracker/icons/clock-dark.svg</Other> - <Other>TimeTracker/icons/clock-light.svg</Other> - </Others> - <MainScript>PluginTimeTracker.py</MainScript> - <Vcs> - <VcsType>Mercurial</VcsType> - <VcsOptions> - <dict> - <key> - <string>add</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>checkout</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>commit</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>diff</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>export</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>global</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>history</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>log</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>remove</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>status</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>tag</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - <key> - <string>update</string> - </key> - <value> - <list> - <string></string> - </list> - </value> - </dict> - </VcsOptions> - </Vcs> - <FiletypeAssociations> - <FiletypeAssociation pattern="*.idl" type="INTERFACES"/> - <FiletypeAssociation pattern="*.py" type="SOURCES"/> - <FiletypeAssociation pattern="*.py3" type="SOURCES"/> - <FiletypeAssociation pattern="*.pyw" type="SOURCES"/> - <FiletypeAssociation pattern="*.pyw3" type="SOURCES"/> - <FiletypeAssociation pattern="*.qm" type="TRANSLATIONS"/> - <FiletypeAssociation pattern="*.qrc" type="RESOURCES"/> - <FiletypeAssociation pattern="*.ts" type="TRANSLATIONS"/> - <FiletypeAssociation pattern="*.ui" type="FORMS"/> - <FiletypeAssociation pattern="*.ui.h" type="FORMS"/> - <FiletypeAssociation pattern="Ui_*.py" type="__IGNORE__"/> - </FiletypeAssociations> - <Documentation> - <DocumentationParams> - <dict> - <key> - <string>ERIC4DOC</string> - </key> - <value> - <dict> - <key> - <string>cssFile</string> - </key> - <value> - <string>%PYTHON%/eric6/CSSs/default.css</string> - </value> - <key> - <string>ignoreDirectories</string> - </key> - <value> - <list> - <string>.eric5project</string> - <string>.hg</string> - <string>.ropeproject</string> - <string>.eric6project</string> - </list> - </value> - <key> - <string>ignoreFilePatterns</string> - </key> - <value> - <list> - <string>Ui_*.py</string> - </list> - </value> - <key> - <string>outputDirectory</string> - </key> - <value> - <string>TimeTracker/Documentation/source</string> - </value> - <key> - <string>qtHelpEnabled</string> - </key> - <value> - <bool>False</bool> - </value> - <key> - <string>useRecursion</string> - </key> - <value> - <bool>True</bool> - </value> - </dict> - </value> - </dict> - </DocumentationParams> - </Documentation> - <Checkers> - <CheckersParams> - <dict> - <key> - <string>Pep8Checker</string> - </key> - <value> - <dict> - <key> - <string>AnnotationsChecker</string> - </key> - <value> - <dict> - <key> - <string>MaximumComplexity</string> - </key> - <value> - <int>3</int> - </value> - <key> - <string>MinimumCoverage</string> - </key> - <value> - <int>75</int> - </value> - </dict> - </value> - <key> - <string>BlankLines</string> - </key> - <value> - <tuple> - <int>2</int> - <int>1</int> - </tuple> - </value> - <key> - <string>BuiltinsChecker</string> - </key> - <value> - <dict> - <key> - <string>bytes</string> - </key> - <value> - <list> - <string>unicode</string> - </list> - </value> - <key> - <string>chr</string> - </key> - <value> - <list> - <string>unichr</string> - </list> - </value> - <key> - <string>str</string> - </key> - <value> - <list> - <string>unicode</string> - </list> - </value> - </dict> - </value> - <key> - <string>CommentedCodeChecker</string> - </key> - <value> - <dict> - <key> - <string>Aggressive</string> - </key> - <value> - <bool>False</bool> - </value> - </dict> - </value> - <key> - <string>CopyrightAuthor</string> - </key> - <value> - <string></string> - </value> - <key> - <string>CopyrightMinFileSize</string> - </key> - <value> - <int>0</int> - </value> - <key> - <string>DocstringType</string> - </key> - <value> - <string>eric</string> - </value> - <key> - <string>EnabledCheckerCategories</string> - </key> - <value> - <string>C, D, E, M, N, S, W</string> - </value> - <key> - <string>ExcludeFiles</string> - </key> - <value> - <string>*/Ui_*.py, */*_rc.py,</string> - </value> - <key> - <string>ExcludeMessages</string> - </key> - <value> - <string>C101,E265,E266,E305,E402,M201,M811,N802,N803,N807,N808,N821,W293,W504</string> - </value> - <key> - <string>FixCodes</string> - </key> - <value> - <string></string> - </value> - <key> - <string>FixIssues</string> - </key> - <value> - <bool>False</bool> - </value> - <key> - <string>FutureChecker</string> - </key> - <value> - <string></string> - </value> - <key> - <string>HangClosing</string> - </key> - <value> - <bool>False</bool> - </value> - <key> - <string>IncludeMessages</string> - </key> - <value> - <string></string> - </value> - <key> - <string>LineComplexity</string> - </key> - <value> - <int>20</int> - </value> - <key> - <string>LineComplexityScore</string> - </key> - <value> - <int>10</int> - </value> - <key> - <string>MaxCodeComplexity</string> - </key> - <value> - <int>10</int> - </value> - <key> - <string>MaxDocLineLength</string> - </key> - <value> - <int>79</int> - </value> - <key> - <string>MaxLineLength</string> - </key> - <value> - <int>79</int> - </value> - <key> - <string>NoFixCodes</string> - </key> - <value> - <string>E501</string> - </value> - <key> - <string>RepeatMessages</string> - </key> - <value> - <bool>True</bool> - </value> - <key> - <string>SecurityChecker</string> - </key> - <value> - <dict> - <key> - <string>CheckTypedException</string> - </key> - <value> - <bool>False</bool> - </value> - <key> - <string>HardcodedTmpDirectories</string> - </key> - <value> - <list> - <string>/tmp</string> - <string>/var/tmp</string> - <string>/dev/shm</string> - <string>~/tmp</string> - </list> - </value> - <key> - <string>InsecureHashes</string> - </key> - <value> - <list> - <string>md4</string> - <string>md5</string> - <string>sha</string> - <string>sha1</string> - </list> - </value> - <key> - <string>InsecureSslProtocolVersions</string> - </key> - <value> - <list> - <string>PROTOCOL_SSLv2</string> - <string>SSLv2_METHOD</string> - <string>SSLv23_METHOD</string> - <string>PROTOCOL_SSLv3</string> - <string>PROTOCOL_TLSv1</string> - <string>SSLv3_METHOD</string> - <string>TLSv1_METHOD</string> - </list> - </value> - <key> - <string>WeakKeySizeDsaHigh</string> - </key> - <value> - <string>1024</string> - </value> - <key> - <string>WeakKeySizeDsaMedium</string> - </key> - <value> - <string>2048</string> - </value> - <key> - <string>WeakKeySizeEcHigh</string> - </key> - <value> - <string>160</string> - </value> - <key> - <string>WeakKeySizeEcMedium</string> - </key> - <value> - <string>224</string> - </value> - <key> - <string>WeakKeySizeRsaHigh</string> - </key> - <value> - <string>1024</string> - </value> - <key> - <string>WeakKeySizeRsaMedium</string> - </key> - <value> - <string>2048</string> - </value> - </dict> - </value> - <key> - <string>ShowIgnored</string> - </key> - <value> - <bool>False</bool> - </value> - <key> - <string>ValidEncodings</string> - </key> - <value> - <string>latin-1, utf-8</string> - </value> - </dict> - </value> - </dict> - </CheckersParams> - </Checkers> -</Project>
--- a/PluginTimeTracker.epj Thu Jun 03 18:02:18 2021 +0200 +++ b/PluginTimeTracker.epj Fri Jun 04 16:40:54 2021 +0200 @@ -113,12 +113,12 @@ "DOCSTRING": "", "DOCUMENTATIONPARMS": { "ERIC4DOC": { - "cssFile": "%PYTHON%/eric6/CSSs/default.css", + "cssFile": "%PYTHON%/eric7/CSSs/default.css", "ignoreDirectories": [ - ".eric5project", ".hg", ".ropeproject", - ".eric6project" + ".eric6project", + ".eric7project" ], "ignoreFilePatterns": [ "Ui_*.py" @@ -131,17 +131,25 @@ "EMAIL": "detlev@die-offenbachs.de", "EOL": 1, "FILETYPES": { + "*.epj": "OTHERS", "*.idl": "INTERFACES", + "*.md": "OTHERS", + "*.proto": "PROTOCOLS", "*.py": "SOURCES", "*.py3": "SOURCES", "*.pyw": "SOURCES", "*.pyw3": "SOURCES", "*.qm": "TRANSLATIONS", - "*.qrc": "RESOURCES", + "*.rst": "OTHERS", "*.ts": "TRANSLATIONS", + "*.txt": "OTHERS", "*.ui": "FORMS", - "*.ui.h": "FORMS", - "Ui_*.py": "__IGNORE__" + "GNUmakefile": "OTHERS", + "Makefile": "OTHERS", + "README": "OTHERS", + "README.*": "OTHERS", + "Ui_*.py": "__IGNORE__", + "makefile": "OTHERS" }, "FORMS": [ "TimeTracker/ConfigurationPage/TimeTrackerPage.ui", @@ -170,7 +178,6 @@ ".hgignore", "ChangeLog", "PKGLIST", - "PluginTimeTracker.e4p", "PluginTimeTracker.zip", "TimeTracker/Documentation/LICENSE.GPL3", "TimeTracker/Documentation/source", @@ -181,7 +188,7 @@ "OTHERTOOLSPARMS": {}, "PACKAGERSPARMS": {}, "PROGLANGUAGE": "Python3", - "PROJECTTYPE": "E6Plugin", + "PROJECTTYPE": "E7Plugin", "PROJECTTYPESPECIFICDATA": {}, "PROTOCOLS": [], "RCCPARAMS": { @@ -265,6 +272,6 @@ ] }, "VCSOTHERDATA": {}, - "VERSION": "2.x" + "VERSION": "" } } \ No newline at end of file
--- a/PluginTimeTracker.py Thu Jun 03 18:02:18 2021 +0200 +++ b/PluginTimeTracker.py Fri Jun 04 16:40:54 2021 +0200 @@ -9,9 +9,9 @@ import os -from PyQt5.QtCore import QObject, QTranslator, QCoreApplication +from PyQt6.QtCore import QObject, QTranslator, QCoreApplication -from E5Gui.E5Application import e5App +from EricWidgets.EricApplication import ericApp import Preferences @@ -22,7 +22,7 @@ author = "Detlev Offenbach <detlev@die-offenbachs.de>" autoactivate = True deactivateable = True -version = "4.0.0" +version = "1.0.0" className = "TimeTrackerPlugin" packageName = "TimeTracker" shortDescription = "Time Tracker to keep track of the project time." @@ -45,7 +45,9 @@ Module function to create the Time Tracker configuration page. @param configDlg reference to the configuration dialog + @type ConfigurationWidget @return reference to the configuration page + @rtype TimeTrackerPage """ global timeTrackerPluginObject from TimeTracker.ConfigurationPage.TimeTrackerPage import TimeTrackerPage @@ -57,15 +59,9 @@ Module function returning data as required by the configuration dialog. @return dictionary containing the relevant data + @rtype dict """ - try: - usesDarkPalette = e5App().usesDarkPalette() - except AttributeError: - # backward compatibility for eric6 < 20.04 - from PyQt5.QtGui import QPalette - palette = e5App().palette() - lightness = palette.color(QPalette.Window).lightness() - usesDarkPalette = lightness <= 128 + usesDarkPalette = ericApp().usesDarkPalette() iconSuffix = "dark" if usesDarkPalette else "light" return { @@ -95,7 +91,8 @@ """ Constructor - @param ui reference to the user interface object (UI.UserInterface) + @param ui reference to the user interface object + @type UserInterface """ QObject.__init__(self, ui) self.__ui = ui @@ -116,13 +113,14 @@ """ self.__object = None - self.__e5project = e5App().getObject("Project") + self.__ericProject = ericApp().getObject("Project") def activate(self): """ Public method to activate this plugin. - @return tuple of None and activation status (boolean) + @return tuple of None and activation status + @rtype bool """ global error error = "" # clear previous error @@ -130,26 +128,22 @@ global timeTrackerPluginObject timeTrackerPluginObject = self - try: - usesDarkPalette = e5App().usesDarkPalette() - except AttributeError: - # backward compatibility for eric6 < 20.04 - from PyQt5.QtGui import QPalette - palette = e5App().palette() - lightness = palette.color(QPalette.Window).lightness() - usesDarkPalette = lightness <= 128 + usesDarkPalette = ericApp().usesDarkPalette() iconSuffix = "dark" if usesDarkPalette else "light" self.__object = TimeTracker(self, iconSuffix, self.__ui) self.__object.activate() - e5App().registerPluginObject("TimeTracker", self.__object) + ericApp().registerPluginObject("TimeTracker", self.__object) - if self.__e5project.isOpen(): + if self.__ericProject.isOpen(): self.__object.projectOpened() - self.__e5project.newProject.connect(self.__object.projectOpened) - self.__e5project.projectOpened.connect(self.__object.projectOpened) - self.__e5project.projectClosed.connect(self.__object.projectClosed) + self.__ericProject.newProject.connect( + self.__object.projectOpened) + self.__ericProject.projectOpened.connect( + self.__object.projectOpened) + self.__ericProject.projectClosed.connect( + self.__object.projectClosed) return None, True @@ -157,12 +151,15 @@ """ Public method to deactivate this plugin. """ - e5App().unregisterPluginObject("TimeTracker") + ericApp().unregisterPluginObject("TimeTracker") self.__object.deactivate() - self.__e5project.newProject.disconnect(self.__object.projectOpened) - self.__e5project.projectOpened.disconnect(self.__object.projectOpened) - self.__e5project.projectClosed.disconnect(self.__object.projectClosed) + self.__ericProject.newProject.disconnect( + self.__object.projectOpened) + self.__ericProject.projectOpened.disconnect( + self.__object.projectOpened) + self.__ericProject.projectClosed.disconnect( + self.__object.projectClosed) self.__object.projectClosed() @@ -182,7 +179,7 @@ loaded = translator.load(translation, locale_dir) if loaded: self.__translator = translator - e5App().installTranslator(self.__translator) + ericApp().installTranslator(self.__translator) else: print("Warning: translation file '{0}' could not be" " loaded.".format(translation)) @@ -192,8 +189,10 @@ """ Public method to retrieve the various settings. - @param key the key of the value to get - @return the requested setting + @param key key of the value to get + @type str + @return value of the requested setting + @rtype Any """ if key in ["MinimumDuration"]: return int(Preferences.Prefs.settings.value( @@ -210,8 +209,10 @@ """ Public method to store the various settings. - @param key the key of the setting to be set (string) - @param value the value to be set + @param key key of the setting to be set + @type str + @param value value to be set + @type Any """ Preferences.Prefs.settings.setValue( self.PreferencesKey + "/" + key, value)
--- a/TimeTracker/ConfigurationPage/TimeTrackerPage.py Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/ConfigurationPage/TimeTrackerPage.py Fri Jun 04 16:40:54 2021 +0200 @@ -22,6 +22,7 @@ Constructor @param plugin reference to the plugin object + @type TimeTrackerPlugin """ super().__init__() self.setupUi(self) @@ -39,7 +40,7 @@ def save(self): """ - Public slot to save the Pyramid configuration. + Public slot to save the Time Tracker configuration. """ self.__plugin.setPreferences( "MinimumDuration", self.durationSpinBox.value())
--- a/TimeTracker/Documentation/source/Plugin_Time_Tracker.PluginTimeTracker.html Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/Documentation/source/Plugin_Time_Tracker.PluginTimeTracker.html Fri Jun 04 16:40:54 2021 +0200 @@ -124,9 +124,9 @@ </p> <dl> -<dt><i>ui</i></dt> +<dt><i>ui</i> (UserInterface)</dt> <dd> -reference to the user interface object (UI.UserInterface) +reference to the user interface object </dd> </dl> <a NAME="TimeTrackerPlugin.__initialize" ID="TimeTrackerPlugin.__initialize"></a> @@ -153,7 +153,13 @@ <dl> <dt>Return:</dt> <dd> -tuple of None and activation status (boolean) +tuple of None and activation status +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool </dd> </dl> <a NAME="TimeTrackerPlugin.deactivate" ID="TimeTrackerPlugin.deactivate"></a> @@ -172,15 +178,21 @@ </p> <dl> -<dt><i>key</i></dt> +<dt><i>key</i> (str)</dt> <dd> -the key of the value to get +key of the value to get </dd> </dl> <dl> <dt>Return:</dt> <dd> -the requested setting +value of the requested setting +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +Any </dd> </dl> <a NAME="TimeTrackerPlugin.setPreferences" ID="TimeTrackerPlugin.setPreferences"></a> @@ -192,13 +204,13 @@ </p> <dl> -<dt><i>key</i></dt> +<dt><i>key</i> (str)</dt> <dd> -the key of the setting to be set (string) +key of the setting to be set </dd> -<dt><i>value</i></dt> +<dt><i>value</i> (Any)</dt> <dd> -the value to be set +value to be set </dd> </dl> <div align="right"><a href="#top">Up</a></div> @@ -213,7 +225,7 @@ </p> <dl> -<dt><i>configDlg</i></dt> +<dt><i>configDlg</i> (ConfigurationWidget)</dt> <dd> reference to the configuration dialog </dd> @@ -224,6 +236,12 @@ reference to the configuration page </dd> </dl> +<dl> +<dt>Return Type:</dt> +<dd> +TimeTrackerPage +</dd> +</dl> <div align="right"><a href="#top">Up</a></div> <hr /> <hr /> @@ -240,6 +258,12 @@ dictionary containing the relevant data </dd> </dl> +<dl> +<dt>Return Type:</dt> +<dd> +dict +</dd> +</dl> <div align="right"><a href="#top">Up</a></div> <hr /> <hr />
--- a/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.ConfigurationPage.TimeTrackerPage.html Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.ConfigurationPage.TimeTrackerPage.html Fri Jun 04 16:40:54 2021 +0200 @@ -74,7 +74,7 @@ </tr> <tr> <td><a href="#TimeTrackerPage.save">save</a></td> -<td>Public slot to save the Pyramid configuration.</td> +<td>Public slot to save the Time Tracker configuration.</td> </tr> </table> <h3>Static Methods</h3> @@ -92,7 +92,7 @@ </p> <dl> -<dt><i>plugin</i></dt> +<dt><i>plugin</i> (TimeTrackerPlugin)</dt> <dd> reference to the plugin object </dd> @@ -102,7 +102,7 @@ <b>save</b>(<i></i>) <p> - Public slot to save the Pyramid configuration. + Public slot to save the Time Tracker configuration. </p> <div align="right"><a href="#top">Up</a></div> <hr />
--- a/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTrackEntry.html Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTrackEntry.html Fri Jun 04 16:40:54 2021 +0200 @@ -93,8 +93,8 @@ <td>Public method to continue the entry.</td> </tr> <tr> -<td><a href="#TimeTrackEntry.fromString">fromString</a></td> -<td>Public method to populate the entry from the given string.</td> +<td><a href="#TimeTrackEntry.fromDict">fromDict</a></td> +<td>Public method to populate the time track entry from a dictionary.</td> </tr> <tr> <td><a href="#TimeTrackEntry.getComment">getComment</a></td> @@ -161,8 +161,8 @@ <td>Public method to stop this entry.</td> </tr> <tr> -<td><a href="#TimeTrackEntry.toString">toString</a></td> -<td>Public method to get a string representation of the entry.</td> +<td><a href="#TimeTrackEntry.toDict">toDict</a></td> +<td>Public method to convert the time track entry into a dictionary.</td> </tr> </table> <h3>Static Methods</h3> @@ -180,9 +180,9 @@ </p> <dl> -<dt><i>plugin</i></dt> +<dt><i>plugin</i> (TimeTrackerPlugin)</dt> <dd> -reference to the plugin object (TimeTrackerPlugin) +reference to the plugin object </dd> </dl> <a NAME="TimeTrackEntry.__calculateDuration" ID="TimeTrackEntry.__calculateDuration"></a> @@ -194,19 +194,25 @@ </p> <dl> -<dt><i>start</i></dt> +<dt><i>start</i> (QDateTime)</dt> <dd> -start date and time (QDateTime) +start date and time </dd> -<dt><i>stop</i></dt> +<dt><i>stop</i> (QDateTime)</dt> <dd> -end date and time (QDateTime) +end date and time </dd> </dl> <dl> <dt>Return:</dt> <dd> -duration in minutes (int) +duration in minutes +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +int </dd> </dl> <a NAME="TimeTrackEntry.__currentDateTime" ID="TimeTrackEntry.__currentDateTime"></a> @@ -219,7 +225,13 @@ <dl> <dt>Return:</dt> <dd> -current date and time (QDateTime) +current date and time +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +QDateTime </dd> </dl> <a NAME="TimeTrackEntry.__lt__" ID="TimeTrackEntry.__lt__"></a> @@ -231,15 +243,21 @@ </p> <dl> -<dt><i>other</i></dt> +<dt><i>other</i> (TimeTrackEntry)</dt> <dd> -reference to the other object (TimeTrackEntry) +reference to the other object </dd> </dl> <dl> <dt>Return:</dt> <dd> -flag indicating that self is less than other (boolean) +flag indicating that self is less than other +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool </dd> </dl> <a NAME="TimeTrackEntry.addDuration" ID="TimeTrackEntry.addDuration"></a> @@ -251,10 +269,10 @@ </p> <dl> -<dt><i>duration</i></dt> +<dt><i>duration</i> (int)</dt> <dd> -duration to be added in minutes (integer). Negative - values are ignored. +duration to be added in minutes. Negative values are + ignored. </dd> </dl> <a NAME="TimeTrackEntry.continue_" ID="TimeTrackEntry.continue_"></a> @@ -264,24 +282,30 @@ <p> Public method to continue the entry. </p> -<a NAME="TimeTrackEntry.fromString" ID="TimeTrackEntry.fromString"></a> -<h4>TimeTrackEntry.fromString</h4> -<b>fromString</b>(<i>line</i>) +<a NAME="TimeTrackEntry.fromDict" ID="TimeTrackEntry.fromDict"></a> +<h4>TimeTrackEntry.fromDict</h4> +<b>fromDict</b>(<i>data</i>) <p> - Public method to populate the entry from the given string. + Public method to populate the time track entry from a dictionary. </p> <dl> -<dt><i>line</i></dt> +<dt><i>data</i> (dict)</dt> <dd> -stringified entry data as generated by toString() (string) +dictionary containing the time track entry data </dd> </dl> <dl> <dt>Return:</dt> <dd> -ID of the tracker entry; -1 indicates an error (integer) +ID of the tracker entry; -1 indicates an error +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +int </dd> </dl> <a NAME="TimeTrackEntry.getComment" ID="TimeTrackEntry.getComment"></a> @@ -294,7 +318,13 @@ <dl> <dt>Return:</dt> <dd> -comment (string) +comment +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +str </dd> </dl> <a NAME="TimeTrackEntry.getDuration" ID="TimeTrackEntry.getDuration"></a> @@ -307,7 +337,13 @@ <dl> <dt>Return:</dt> <dd> -duration (integer) +duration +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +int </dd> </dl> <a NAME="TimeTrackEntry.getEntryData" ID="TimeTrackEntry.getEntryData"></a> @@ -320,9 +356,17 @@ <dl> <dt>Return:</dt> <dd> -entry data as a tuple of start date (string), start time - (string), duration (integer), task (string), comment (string) - and flag indicating a paused state (boolean) +entry data as a dictionary with keys 'id', 'paused', + 'start_date', 'start_time', 'duration', 'task' and 'comment' + containing the entry ID, a flag indicating a paused + state, the start date as a string, the start time as a string, + the duration, the task and a comment +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +dict </dd> </dl> <a NAME="TimeTrackEntry.getID" ID="TimeTrackEntry.getID"></a> @@ -335,7 +379,13 @@ <dl> <dt>Return:</dt> <dd> -ID of the entry (integer) +ID of the entry +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +int </dd> </dl> <a NAME="TimeTrackEntry.getStartDateTime" ID="TimeTrackEntry.getStartDateTime"></a> @@ -348,7 +398,13 @@ <dl> <dt>Return:</dt> <dd> -start date and time (QDateTime) +start date and time +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +QDateTime </dd> </dl> <a NAME="TimeTrackEntry.getTask" ID="TimeTrackEntry.getTask"></a> @@ -361,7 +417,13 @@ <dl> <dt>Return:</dt> <dd> -task description (string) +task description +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +str </dd> </dl> <a NAME="TimeTrackEntry.isPaused" ID="TimeTrackEntry.isPaused"></a> @@ -374,7 +436,13 @@ <dl> <dt>Return:</dt> <dd> -flag indicating a paused state (boolean) +flag indicating a paused state +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool </dd> </dl> <a NAME="TimeTrackEntry.isValid" ID="TimeTrackEntry.isValid"></a> @@ -387,7 +455,13 @@ <dl> <dt>Return:</dt> <dd> -validity of the entry (boolean) +validity of the entry +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +bool </dd> </dl> <a NAME="TimeTrackEntry.pause" ID="TimeTrackEntry.pause"></a> @@ -406,9 +480,9 @@ </p> <dl> -<dt><i>comment</i></dt> +<dt><i>comment</i> (str)</dt> <dd> -comment to set (string) +comment to set </dd> </dl> <a NAME="TimeTrackEntry.setDuration" ID="TimeTrackEntry.setDuration"></a> @@ -420,9 +494,9 @@ </p> <dl> -<dt><i>duration</i></dt> +<dt><i>duration</i> (int)</dt> <dd> -duration in minutes (integer) +duration in minutes </dd> </dl> <a NAME="TimeTrackEntry.setID" ID="TimeTrackEntry.setID"></a> @@ -434,9 +508,9 @@ </p> <dl> -<dt><i>eid</i></dt> +<dt><i>eid</i> (int)</dt> <dd> -ID for the entry (integer) +ID for the entry </dd> </dl> <a NAME="TimeTrackEntry.setStartDateTime" ID="TimeTrackEntry.setStartDateTime"></a> @@ -448,9 +522,9 @@ </p> <dl> -<dt><i>startDateTime</i></dt> +<dt><i>startDateTime</i> (QDateTime)</dt> <dd> -start date and time (QDateTime) +start date and time </dd> </dl> <a NAME="TimeTrackEntry.setTask" ID="TimeTrackEntry.setTask"></a> @@ -462,9 +536,9 @@ </p> <dl> -<dt><i>description</i></dt> +<dt><i>description</i> (str)</dt> <dd> -task description (string) +task description </dd> </dl> <a NAME="TimeTrackEntry.start" ID="TimeTrackEntry.start"></a> @@ -481,17 +555,23 @@ <p> Public method to stop this entry. </p> -<a NAME="TimeTrackEntry.toString" ID="TimeTrackEntry.toString"></a> -<h4>TimeTrackEntry.toString</h4> -<b>toString</b>(<i></i>) +<a NAME="TimeTrackEntry.toDict" ID="TimeTrackEntry.toDict"></a> +<h4>TimeTrackEntry.toDict</h4> +<b>toDict</b>(<i></i>) <p> - Public method to get a string representation of the entry. + Public method to convert the time track entry into a dictionary. </p> <dl> <dt>Return:</dt> <dd> -string representation of the entry (string) +dictionary containing the time track entry data +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +dict </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTracker.html Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTracker.html Fri Jun 04 16:40:54 2021 +0200 @@ -74,7 +74,7 @@ </tr> <tr> <td><a href="#TimeTracker.__activateWidget">__activateWidget</a></td> -<td>Private slot to handle the activation of the project browser.</td> +<td>Private slot to handle the activation of the time tracker widget.</td> </tr> <tr> <td><a href="#TimeTracker.__initialize">__initialize</a></td> @@ -190,7 +190,7 @@ <b>__activateWidget</b>(<i></i>) <p> - Private slot to handle the activation of the project browser. + Private slot to handle the activation of the time tracker widget. </p> <a NAME="TimeTracker.__initialize" ID="TimeTracker.__initialize"></a> <h4>TimeTracker.__initialize</h4> @@ -222,21 +222,21 @@ </p> <dl> -<dt><i>startDateTime</i></dt> +<dt><i>startDateTime</i> (QDateTime)</dt> <dd> -start date and time (QDateTime) +start date and time </dd> -<dt><i>duration</i></dt> +<dt><i>duration</i> (int)</dt> <dd> -duration in minutes (integer) +duration in minutes </dd> -<dt><i>task</i></dt> +<dt><i>task</i> (str)</dt> <dd> -task description (string) +task description </dd> -<dt><i>comment</i></dt> +<dt><i>comment</i> (str)</dt> <dd> -comment (string) +comment </dd> </dl> <a NAME="TimeTracker.continueTrackerEntry" ID="TimeTracker.continueTrackerEntry"></a> @@ -262,9 +262,9 @@ </p> <dl> -<dt><i>eid</i></dt> +<dt><i>eid</i> (int)</dt> <dd> -ID of the tracker entry (integer) +ID of the tracker entry </dd> </dl> <a NAME="TimeTracker.entryChanged" ID="TimeTracker.entryChanged"></a> @@ -284,7 +284,13 @@ <dl> <dt>Return:</dt> <dd> -reference to the current entry (TimeTrackEntry) +reference to the current entry +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +TimeTrackEntry </dd> </dl> <a NAME="TimeTracker.getEntry" ID="TimeTracker.getEntry"></a> @@ -296,15 +302,21 @@ </p> <dl> -<dt><i>eid</i></dt> +<dt><i>eid</i> (int)</dt> <dd> -ID of the tracker entry (integer) +ID of the tracker entry </dd> </dl> <dl> <dt>Return:</dt> <dd> -entry for the given ID (TimeTrackEntry) or None +entry for the given ID or None +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +TimeTrackEntry </dd> </dl> <a NAME="TimeTracker.getPreferences" ID="TimeTracker.getPreferences"></a> @@ -316,15 +328,21 @@ </p> <dl> -<dt><i>key</i></dt> +<dt><i>key</i> (str)</dt> <dd> -the key of the value to get +key of the value to get </dd> </dl> <dl> <dt>Return:</dt> <dd> -the requested setting +value of the requested setting +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +Any </dd> </dl> <a NAME="TimeTracker.importTrackerEntries" ID="TimeTracker.importTrackerEntries"></a> @@ -393,14 +411,13 @@ </p> <dl> -<dt><i>filePath=</i></dt> +<dt><i>filePath</i> (str)</dt> <dd> path and name of the file to write the entries to - (string) </dd> -<dt><i>ids=</i></dt> +<dt><i>ids</i> (list of int)</dt> <dd> -list of entry IDs to be written (list of integer) +list of entry IDs to be written </dd> </dl> <a NAME="TimeTracker.startTrackerEntry" ID="TimeTracker.startTrackerEntry"></a> @@ -421,7 +438,13 @@ <dt>Return:</dt> <dd> tuple of the ID assigned to the stopped tracker entry and - the duration (integer, integer) + the duration +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +tuple of (int, int) </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTrackerEntryDialog.html Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTrackerEntryDialog.html Fri Jun 04 16:40:54 2021 +0200 @@ -104,27 +104,27 @@ </p> <dl> -<dt><i>tracker</i></dt> +<dt><i>tracker</i> (TimeTracker)</dt> <dd> -reference to the time tracker (TimeTracker) +reference to the time tracker </dd> -<dt><i>entry</i></dt> +<dt><i>entry</i> (TimeTrackEntry)</dt> <dd> -reference to the time tracker entry (TimeTrackEntry) +reference to the time tracker entry </dd> -<dt><i>taskItems</i></dt> +<dt><i>taskItems</i> (list of str)</dt> <dd> list of task item entries for the - task combo box (list of strings) + task combo box </dd> -<dt><i>commentItems</i></dt> +<dt><i>commentItems</i> (list of str)</dt> <dd> list of comment item entries for the - comment combo box (list of strings) + comment combo box </dd> -<dt><i>parent</i></dt> +<dt><i>parent</i> (QWidget)</dt> <dd> -reference to the parent widget (QWidget) +reference to the parent widget </dd> </dl> <a NAME="TimeTrackerEntryDialog.__checkOk" ID="TimeTrackerEntryDialog.__checkOk"></a> @@ -145,7 +145,13 @@ <dt>Return:</dt> <dd> tuple with start date and time, duration, task description - and comment (QDateTime, integer, string, string) + and comment +</dd> +</dl> +<dl> +<dt>Return Type:</dt> +<dd> +tuple of (QDateTime, int, str, str) </dd> </dl> <a NAME="TimeTrackerEntryDialog.on_durationSpinBox_valueChanged" ID="TimeTrackerEntryDialog.on_durationSpinBox_valueChanged"></a> @@ -157,9 +163,9 @@ </p> <dl> -<dt><i>value</i></dt> +<dt><i>value</i> (int)</dt> <dd> -value of the duration spin box (integer) +value of the duration spin box </dd> </dl> <a NAME="TimeTrackerEntryDialog.on_startDateTimeEdit_dateTimeChanged" ID="TimeTrackerEntryDialog.on_startDateTimeEdit_dateTimeChanged"></a> @@ -171,9 +177,9 @@ </p> <dl> -<dt><i>date</i></dt> +<dt><i>date</i> (QDateTime)</dt> <dd> -start date and time (QDateTime) +start date and time </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTrackerWidget.html Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/Documentation/source/Plugin_Time_Tracker.TimeTracker.TimeTrackerWidget.html Fri Jun 04 16:40:54 2021 +0200 @@ -164,13 +164,13 @@ </p> <dl> -<dt><i>tracker</i></dt> +<dt><i>tracker</i> (TimeTracker)</dt> <dd> -reference to the time tracker (TimeTracker) +reference to the time tracker </dd> -<dt><i>parent</i></dt> +<dt><i>parent</i> (QWidget)</dt> <dd> -reference to the parent widget (QWidget) +reference to the parent widget </dd> </dl> <a NAME="TimeTrackerWidget.__addEntry" ID="TimeTrackerWidget.__addEntry"></a> @@ -203,9 +203,9 @@ </p> <dl> -<dt><i>ids=</i></dt> +<dt><i>ids</i> (list of int)</dt> <dd> -list of IDs to export or all if empty (list of integer) +list of IDs to export or all if empty </dd> </dl> <a NAME="TimeTrackerWidget.__exportSelectedEntries" ID="TimeTrackerWidget.__exportSelectedEntries"></a> @@ -231,14 +231,13 @@ </p> <dl> -<dt><i>entry</i></dt> +<dt><i>entry</i> (TimeTrackEntry)</dt> <dd> -reference to the tracker entry (TimeTrackEntry) +reference to the tracker entry </dd> -<dt><i>index</i></dt> +<dt><i>index</i> (int)</dt> <dd> index the entry is to be inserted; -1 for at the end - (integer) </dd> </dl> <a NAME="TimeTrackerWidget.__mergeDuplicates" ID="TimeTrackerWidget.__mergeDuplicates"></a> @@ -285,9 +284,9 @@ </p> <dl> -<dt><i>txt</i></dt> +<dt><i>txt</i> (str)</dt> <dd> -new comment (string) +new comment </dd> </dl> <a NAME="TimeTrackerWidget.on_entriesList_customContextMenuRequested" ID="TimeTrackerWidget.on_entriesList_customContextMenuRequested"></a> @@ -299,9 +298,9 @@ </p> <dl> -<dt><i>pos</i></dt> +<dt><i>pos</i> (QPoint)</dt> <dd> -position the menu should be shown at (QPoint) +position the menu should be shown at </dd> </dl> <a NAME="TimeTrackerWidget.on_newButton_clicked" ID="TimeTrackerWidget.on_newButton_clicked"></a> @@ -320,10 +319,9 @@ </p> <dl> -<dt><i>checked</i></dt> +<dt><i>checked</i> (bool)</dt> <dd> flag indicating the checked status of the button - (boolean) </dd> </dl> <a NAME="TimeTrackerWidget.on_taskCombo_editTextChanged" ID="TimeTrackerWidget.on_taskCombo_editTextChanged"></a> @@ -336,9 +334,9 @@ </p> <dl> -<dt><i>txt</i></dt> +<dt><i>txt</i> (str)</dt> <dd> -new task description (string) +new task description </dd> </dl> <a NAME="TimeTrackerWidget.setCurrentEntry" ID="TimeTrackerWidget.setCurrentEntry"></a> @@ -350,9 +348,9 @@ </p> <dl> -<dt><i>entry</i></dt> +<dt><i>entry</i> (TimeTrackEntry)</dt> <dd> -current entry (TimeTrackEntry) +current entry </dd> </dl> <a NAME="TimeTrackerWidget.showTrackerEntries" ID="TimeTrackerWidget.showTrackerEntries"></a> @@ -364,9 +362,9 @@ </p> <dl> -<dt><i>entries</i></dt> +<dt><i>entries</i> (list of TimeTrackEntry)</dt> <dd> -list of tracker entries (list of TimeTrackEntry) +list of tracker entries </dd> </dl> <div align="right"><a href="#top">Up</a></div>
--- a/TimeTracker/TimeTrackEntry.py Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/TimeTrackEntry.py Fri Jun 04 16:40:54 2021 +0200 @@ -7,7 +7,7 @@ Module implementing the time track entry class. """ -from PyQt5.QtCore import Qt, QDateTime, QTime +from PyQt6.QtCore import Qt, QDateTime, QTime class TimeTrackEntry: @@ -21,7 +21,8 @@ """ Constructor - @param plugin reference to the plugin object (TimeTrackerPlugin) + @param plugin reference to the plugin object + @type TimeTrackerPlugin """ self.__plugin = plugin @@ -40,71 +41,118 @@ """ Special method implementing the less than function. - @param other reference to the other object (TimeTrackEntry) - @return flag indicating that self is less than other (boolean) + @param other reference to the other object + @type TimeTrackEntry + @return flag indicating that self is less than other + @rtype bool """ return self.__startDateTime < other.getStartDateTime() - def toString(self): + def toDict(self): """ - Public method to get a string representation of the entry. + Public method to convert the time track entry into a dictionary. - @return string representation of the entry (string) + @return dictionary containing the time track entry data + @rtype dict """ if self.__valid: - dataLine = TimeTrackEntry.Separator.join([ - str(self.__id), - self.__startDateTime.toString(Qt.ISODate), - str(self.__duration), - self.__task, - self.__comment, - ]) - return "{0}{1}".format(TimeTrackEntry.LineMarker, dataLine) + return { + "id": self.__id, + "start": self.__startDateTime.toString(Qt.DateFormat.ISODate), + "duration": self.__duration, + "task": self.__task, + "comment": self.__comment, + } else: - return "" + return {} - def fromString(self, line): + def fromDict(self, data): """ - Public method to populate the entry from the given string. + Public method to populate the time track entry from a dictionary. - @param line stringified entry data as generated by toString() (string) - @return ID of the tracker entry; -1 indicates an error (integer) + @param data dictionary containing the time track entry data + @type dict + @return ID of the tracker entry; -1 indicates an error + @rtype int """ - if not line.startswith(TimeTrackEntry.LineMarker): + if len(data) != self.__entryMembersCount: return -1 - line = line.replace(TimeTrackEntry.LineMarker, "") - dataList = line.split(TimeTrackEntry.Separator) - if len(dataList) != self.__entryMembersCount: - return -1 + self.__id = data["id"] - try: - self.__id = int(dataList[0]) - except ValueError: - return -1 - - dt = QDateTime.fromString(dataList[1], Qt.ISODate) + dt = QDateTime.fromString(data["start"], Qt.DateFormat.ISODate) if not dt.isValid(): return -1 self.__startDateTime = dt - try: - dt = int(dataList[2]) - except ValueError: - return -1 - self.__duration = dt - - self.__task = dataList[3] - self.__comment = dataList[4] + self.__duration = data["duration"] + self.__task = data["task"] + self.__comment = data["comment"] self.__valid = True return self.__id - + +## def toString(self): +## """ +## Public method to get a string representation of the entry. +## +## @return string representation of the entry (string) +## """ +## if self.__valid: +## dataLine = TimeTrackEntry.Separator.join([ +## str(self.__id), +## self.__startDateTime.toString(Qt.DateFormat.ISODate), +## str(self.__duration), +## self.__task, +## self.__comment, +## ]) +## return "{0}{1}".format(TimeTrackEntry.LineMarker, dataLine) +## else: +## return "" +## +## def fromString(self, line): +## """ +## Public method to populate the entry from the given string. +## +## @param line stringified entry data as generated by toString() (string) +## @return ID of the tracker entry; -1 indicates an error (integer) +## """ +## if not line.startswith(TimeTrackEntry.LineMarker): +## return -1 +## +## line = line.replace(TimeTrackEntry.LineMarker, "") +## dataList = line.split(TimeTrackEntry.Separator) +## if len(dataList) != self.__entryMembersCount: +## return -1 +## +## try: +## self.__id = int(dataList[0]) +## except ValueError: +## return -1 +## +## dt = QDateTime.fromString(dataList[1], Qt.DateFormat.ISODate) +## if not dt.isValid(): +## return -1 +## self.__startDateTime = dt +## +## try: +## dt = int(dataList[2]) +## except ValueError: +## return -1 +## self.__duration = dt +## +## self.__task = dataList[3] +## self.__comment = dataList[4] +## +## self.__valid = True +## return self.__id +## def isValid(self): """ Public method to check the validity of the entry. - @return validity of the entry (boolean) + @return validity of the entry + @rtype bool """ return self.__valid @@ -152,7 +200,8 @@ """ Public method to check for a paused state. - @return flag indicating a paused state (boolean) + @return flag indicating a paused state + @rtype bool """ return self.__paused @@ -160,7 +209,8 @@ """ Private method to get the current date and time without milliseconds. - @return current date and time (QDateTime) + @return current date and time + @rtype QDateTime """ dt = QDateTime.currentDateTime() t = dt.time() @@ -172,9 +222,12 @@ """ Private method to calculate the duration in minutes. - @param start start date and time (QDateTime) - @param stop end date and time (QDateTime) - @return duration in minutes (int) + @param start start date and time + @type QDateTime + @param stop end date and time + @type QDateTime + @return duration in minutes + @rtype int """ secs = start.secsTo(stop) minutes = secs // 60 @@ -188,7 +241,8 @@ """ Public method to get the ID of the entry. - @return ID of the entry (integer) + @return ID of the entry + @rtype int """ return self.__id @@ -196,7 +250,8 @@ """ Public method to assign an ID to the entry. - @param eid ID for the entry (integer) + @param eid ID for the entry + @type int """ self.__id = eid @@ -204,7 +259,8 @@ """ Public method to get the start date and time. - @return start date and time (QDateTime) + @return start date and time + @rtype QDateTime """ return self.__startDateTime @@ -212,7 +268,8 @@ """ Public method to set the start date and time. - @param startDateTime start date and time (QDateTime) + @param startDateTime start date and time + @type QDateTime """ if startDateTime.isValid(): self.__startDateTime = startDateTime @@ -226,7 +283,8 @@ """ Public slot to get the duration. - @return duration (integer) + @return duration + @rtype int """ return self.__duration @@ -234,7 +292,8 @@ """ Public method to set the duration. - @param duration duration in minutes (integer) + @param duration duration in minutes + @type int """ if duration >= self.__plugin.getPreferences("MinimumDuration"): self.__duration = duration @@ -248,8 +307,9 @@ """ Public method to add a duration. - @param duration duration to be added in minutes (integer). Negative - values are ignored. + @param duration duration to be added in minutes. Negative values are + ignored. + @type int """ if duration > 0: self.__duration += duration @@ -258,7 +318,8 @@ """ Public method to get the task description. - @return task description (string) + @return task description + @rtype str """ return self.__task @@ -266,7 +327,8 @@ """ Public method to set the task description. - @param description task description (string) + @param description task description + @type str """ self.__task = ( description.replace("\r\n", " ").replace("\n", " ") @@ -277,7 +339,8 @@ """ Public method to get the comment. - @return comment (string) + @return comment + @rtype str """ return self.__comment @@ -285,7 +348,8 @@ """ Public method to set a comment. - @param comment comment to set (string) + @param comment comment to set + @type str """ self.__comment = ( comment.replace("\r\n", " ").replace("\n", " ").replace("\r", " ") @@ -295,16 +359,19 @@ """ Public method to get the entry data. - @return entry data as a tuple of start date (string), start time - (string), duration (integer), task (string), comment (string) - and flag indicating a paused state (boolean) + @return entry data as a dictionary with keys 'id', 'paused', + 'start_date', 'start_time', 'duration', 'task' and 'comment' + containing the entry ID, a flag indicating a paused + state, the start date as a string, the start time as a string, + the duration, the task and a comment + @rtype dict """ - return ( - self.__id, - self.__startDateTime.toString("yyyy-MM-dd"), - self.__startDateTime.toString("hh:mm"), - self.__duration, - self.__task, - self.__comment, - self.__paused, - ) + return { + "id": self.__id, + "paused": self.__paused, + "start_date": self.__startDateTime.toString("yyyy-MM-dd"), + "start_time": self.__startDateTime.toString("hh:mm:ss"), + "duration": self.__duration, + "task": self.__task, + "comment": self.__comment, + }
--- a/TimeTracker/TimeTracker.py Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/TimeTracker.py Fri Jun 04 16:40:54 2021 +0200 @@ -7,14 +7,15 @@ Module implementing the time tracker object. """ +import json import os -from PyQt5.QtCore import Qt, QObject -from PyQt5.QtGui import QKeySequence +from PyQt6.QtCore import Qt, QObject +from PyQt6.QtGui import QKeySequence -from E5Gui.E5Application import e5App -from E5Gui import E5MessageBox -from E5Gui.E5Action import E5Action +from EricWidgets.EricApplication import ericApp +from EricWidgets import EricMessageBox +from EricGui.EricAction import EricAction import UI.PixmapCache @@ -23,7 +24,7 @@ """ Class implementing the time tracker object. """ - FileName = "TimeTracker.txt" + FileName = "TimeTracker.ttj" def __init__(self, plugin, iconSuffix, parent=None): """ @@ -42,7 +43,7 @@ self.__iconSuffix = iconSuffix self.__ui = parent - self.__e5project = e5App().getObject("Project") + self.__ericProject = ericApp().getObject("Project") def __initialize(self): """ @@ -73,7 +74,7 @@ ), self.tr("Time Tracker")) - self.__activateAct = E5Action( + self.__activateAct = EricAction( self.tr('Time Tracker'), self.tr('T&ime Tracker'), QKeySequence(self.tr("Alt+Shift+I")), @@ -88,7 +89,7 @@ )) self.__activateAct.triggered.connect(self.__activateWidget) - self.__ui.addE5Actions([self.__activateAct], 'ui') + self.__ui.addEricActions([self.__activateAct], 'ui') menu = self.__ui.getMenu("subwindow") menu.addAction(self.__activateAct) @@ -100,7 +101,7 @@ """ menu = self.__ui.getMenu("subwindow") menu.removeAction(self.__activateAct) - self.__ui.removeE5Actions([self.__activateAct], 'ui') + self.__ui.removeEricActions([self.__activateAct], 'ui') self.__ui.removeSideWidget(self.__widget) def projectOpened(self): @@ -111,9 +112,9 @@ self.projectClosed() self.__projectOpen = True - self.__projectPath = self.__e5project.getProjectPath() + self.__projectPath = self.__ericProject.getProjectPath() self.__trackerFilePath = os.path.join( - self.__e5project.getProjectManagementDir(), + self.__ericProject.getProjectManagementDir(), TimeTracker.FileName) self.__readTrackerEntries() @@ -138,10 +139,11 @@ """ if os.path.exists(self.__trackerFilePath): try: - with open(self.__trackerFilePath, "r", encoding="utf-8") as f: - data = f.read() - except OSError as err: - E5MessageBox.critical( + with open(self.__trackerFilePath, "r") as f: + jsonString = f.read() + entriesDataList = json.loads(jsonString) + except (OSError, json.JSONDecodeError) as err: + EricMessageBox.critical( self.__ui, self.tr("Read Time Tracker File"), self.tr("""<p>The time tracker file <b>{0}</b> could""" @@ -152,16 +154,16 @@ from .TimeTrackEntry import TimeTrackEntry invalidCount = 0 - for line in data.splitlines(): - entry = TimeTrackEntry(self.__plugin) - eid = entry.fromString(line.strip()) + for data in entriesDataList: + entry = TimeTrackEntry(self.__plugin) + eid = entry.fromDict(data) if eid > -1: self.__entries[eid] = entry else: invalidCount += 1 if invalidCount: - E5MessageBox.information( + EricMessageBox.information( self.__ui, self.tr("Read Time Tracker File"), self.tr("""<p>The time tracker file <b>{0}</b>""" @@ -173,24 +175,25 @@ """ Public slot to save the tracker entries to a file. - @keyparam filePath path and name of the file to write the entries to - (string) - @keyparam ids list of entry IDs to be written (list of integer) + @param filePath path and name of the file to write the entries to + @type str + @param ids list of entry IDs to be written + @type list of int """ if not filePath: filePath = self.__trackerFilePath - entriesList = ( - [self.__entries[eid] for eid in ids if eid in self.__entries] + entriesDataList = ( + [self.__entries[eid].toDict() + for eid in ids if eid in self.__entries] if ids else - self.__entries.values() + [e.toDict() for e in self.__entries.values()] ) try: - with open(filePath, "w", encoding="utf-8") as f: - for entry in entriesList: - if entry.isValid(): - f.write(entry.toString() + "\n") - except OSError as err: - E5MessageBox.critical( + jsonString = json.dumps(entriesDataList, indent=2) + with open(filePath, "w") as f: + f.write(jsonString) + except (TypeError, OSError) as err: + EricMessageBox.critical( self.__ui, self.tr("Save Time Tracker File"), self.tr("""<p>The time tracker file <b>{0}</b> could""" @@ -205,9 +208,10 @@ """ try: with open(fname, "r", encoding="utf-8") as f: - data = f.read() - except OSError as err: - E5MessageBox.critical( + jsonString = f.read() + entriesDataList = json.loads(jsonString) + except (OSError, json.JSONDecodeError) as err: + EricMessageBox.critical( self.__ui, self.tr("Import Time Tracker File"), self.tr("""<p>The time tracker file <b>{0}</b> could""" @@ -220,9 +224,10 @@ invalidCount = 0 duplicateCount = 0 entries = [] - for line in data.splitlines(): + + for data in entriesDataList: entry = TimeTrackEntry(self.__plugin) - eid = entry.fromString(line.strip()) + eid = entry.fromDict(data) if eid > -1: entries.append(entry) else: @@ -270,7 +275,7 @@ msg += " " + self.tr( """ %n entries have been ignored.</p>""", "", invalidCount + duplicateCount) - E5MessageBox.information( + EricMessageBox.information( self.__ui, self.tr("Import Time Tracker File"), msg) @@ -284,10 +289,14 @@ """ Public method to add a new tracker entry based on the given data. - @param startDateTime start date and time (QDateTime) - @param duration duration in minutes (integer) - @param task task description (string) - @param comment comment (string) + @param startDateTime start date and time + @type QDateTime + @param duration duration in minutes + @type int + @param task task description + @type str + @param comment comment + @type str """ if not self.__plugin.getPreferences("AllowDuplicates"): startDateTimes = [ @@ -315,8 +324,8 @@ self.__entries[nextID] = entry self.__widget.clear() - self.__widget.showTrackerEntries(sorted(self.__entries.values(), - reverse=True)) + self.__widget.showTrackerEntries( + sorted(self.__entries.values(), reverse=True)) self.__widget.setCurrentEntry(self.__currentEntry) def pauseTrackerEntry(self): @@ -336,17 +345,19 @@ Public method to stop the current tracker entry. @return tuple of the ID assigned to the stopped tracker entry and - the duration (integer, integer) + the duration + @rtype tuple of (int, int) """ duration = 0 nextID = -1 if self.__currentEntry is not None: self.__currentEntry.stop() if self.__currentEntry.isValid(): - if len(self.__entries.keys()): - nextID = max(self.__entries.keys()) + 1 - else: - nextID = 0 + nextID = ( + max(self.__entries.keys()) + 1 + if len(self.__entries.keys()) else + 0 + ) self.__currentEntry.setID(nextID) self.__entries[nextID] = self.__currentEntry if self.__plugin.getPreferences("AutoSave"): @@ -370,7 +381,8 @@ """ Public method to get a reference to the current tracker entry. - @return reference to the current entry (TimeTrackEntry) + @return reference to the current entry + @rtype TimeTrackEntry """ return self.__currentEntry @@ -378,8 +390,10 @@ """ Public method to get a tracker entry given its ID. - @param eid ID of the tracker entry (integer) - @return entry for the given ID (TimeTrackEntry) or None + @param eid ID of the tracker entry + @type int + @return entry for the given ID or None + @rtype TimeTrackEntry """ if eid in self.__entries: return self.__entries[eid] @@ -390,7 +404,8 @@ """ Public method to delete a tracker entry given its ID. - @param eid ID of the tracker entry (integer) + @param eid ID of the tracker entry + @type int """ if eid in self.__entries: del self.__entries[eid] @@ -420,8 +435,8 @@ self.saveTrackerEntries() self.__widget.clear() - self.__widget.showTrackerEntries(sorted(self.__entries.values(), - reverse=True)) + self.__widget.showTrackerEntries( + sorted(self.__entries.values(), reverse=True)) self.__widget.setCurrentEntry(self.__currentEntry) def mergeDuplicateTrackerEntries(self): @@ -448,8 +463,8 @@ self.saveTrackerEntries() self.__widget.clear() - self.__widget.showTrackerEntries(sorted(self.__entries.values(), - reverse=True)) + self.__widget.showTrackerEntries( + sorted(self.__entries.values(), reverse=True)) self.__widget.setCurrentEntry(self.__currentEntry) def entryChanged(self): @@ -463,14 +478,16 @@ """ Public method to retrieve the various settings. - @param key the key of the value to get - @return the requested setting + @param key key of the value to get + @type str + @return value of the requested setting + @rtype Any """ return self.__plugin.getPreferences(key) def __activateWidget(self): """ - Private slot to handle the activation of the project browser. + Private slot to handle the activation of the time tracker widget. """ uiLayoutType = self.__ui.getLayoutType() @@ -482,4 +499,4 @@ self.__ui.bottomSidebar.setCurrentWidget(self.__widget) else: self.__widget.show() - self.__widget.setFocus(Qt.ActiveWindowFocusReason) + self.__widget.setFocus(Qt.FocusReason.ActiveWindowFocusReason)
--- a/TimeTracker/TimeTrackerEntryDialog.py Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/TimeTrackerEntryDialog.py Fri Jun 04 16:40:54 2021 +0200 @@ -7,8 +7,8 @@ Module implementing the time tracker edit dialog. """ -from PyQt5.QtCore import pyqtSlot, QDateTime, QDate -from PyQt5.QtWidgets import QDialog, QDialogButtonBox +from PyQt6.QtCore import pyqtSlot, QDateTime, QDate +from PyQt6.QtWidgets import QDialog, QDialogButtonBox from .Ui_TimeTrackerEntryDialog import Ui_TimeTrackerEntryDialog @@ -21,18 +21,24 @@ """ Constructor - @param tracker reference to the time tracker (TimeTracker) - @param entry reference to the time tracker entry (TimeTrackEntry) + @param tracker reference to the time tracker + @type TimeTracker + @param entry reference to the time tracker entry + @type TimeTrackEntry @param taskItems list of task item entries for the - task combo box (list of strings) + task combo box + @type list of str @param commentItems list of comment item entries for the - comment combo box (list of strings) - @param parent reference to the parent widget (QWidget) + comment combo box + @type list of str + @param parent reference to the parent widget + @type QWidget """ super().__init__(parent) self.setupUi(self) - self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(False) + self.buttonBox.button( + QDialogButtonBox.StandardButton.Ok).setEnabled(False) self.taskCombo.addItems(taskItems) self.commentCombo.addItems(commentItems) @@ -51,6 +57,8 @@ else: self.startDateTimeEdit.setDateTime(entry.getStartDateTime()) self.durationSpinBox.setValue(entry.getDuration()) + self.durationSpinBox.setMaximum( + entry.getStartDateTime().secsTo(self.__endDateTime) // 60) self.taskCombo.setEditText(entry.getTask()) self.commentCombo.setEditText(entry.getComment()) @@ -62,7 +70,7 @@ Private slot to set the enabled state of the OK button. """ dt = self.startDateTimeEdit.dateTime() - self.buttonBox.button(QDialogButtonBox.Ok).setEnabled( + self.buttonBox.button(QDialogButtonBox.StandardButton.Ok).setEnabled( dt.addSecs(self.durationSpinBox.value() * 60) <= self.__endDateTime) @@ -71,7 +79,8 @@ """ Private slot handling a change of the start date and time. - @param date start date and time (QDateTime) + @param date start date and time + @type QDateTime """ self.__checkOk() @@ -80,7 +89,8 @@ """ Private slot handling a change of the duration. - @param value value of the duration spin box (integer) + @param value value of the duration spin box + @type int """ self.__checkOk() @@ -89,7 +99,8 @@ Public method to get the data. @return tuple with start date and time, duration, task description - and comment (QDateTime, integer, string, string) + and comment + @rtype tuple of (QDateTime, int, str, str) """ return ( self.startDateTimeEdit.dateTime(),
--- a/TimeTracker/TimeTrackerWidget.py Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/TimeTrackerWidget.py Fri Jun 04 16:40:54 2021 +0200 @@ -9,11 +9,11 @@ import os -from PyQt5.QtCore import pyqtSlot, QPoint, Qt, QDate, QTime, QFileInfo -from PyQt5.QtGui import QCursor -from PyQt5.QtWidgets import QWidget, QMenu, QTreeWidgetItem, QDialog +from PyQt6.QtCore import pyqtSlot, QPoint, Qt, QDate, QTime, QFileInfo +from PyQt6.QtGui import QCursor +from PyQt6.QtWidgets import QWidget, QMenu, QTreeWidgetItem, QDialog -from E5Gui import E5MessageBox, E5FileDialog +from EricWidgets import EricMessageBox, EricFileDialog from .Ui_TimeTrackerWidget import Ui_TimeTrackerWidget @@ -33,8 +33,10 @@ """ Constructor - @param tracker reference to the time tracker (TimeTracker) - @param parent reference to the parent widget (QWidget) + @param tracker reference to the time tracker + @type TimeTracker + @param parent reference to the parent widget + @type QWidget """ super().__init__(parent) self.setupUi(self) @@ -47,7 +49,8 @@ Private slot handling changes of the task description of the current entry. - @param txt new task description (string) + @param txt new task description + @type str """ itm = self.entriesList.topLevelItem(0) if itm: @@ -63,7 +66,8 @@ """ Private slot handling changes of the comment of the current entry. - @param txt new comment (string) + @param txt new comment + @type str """ itm = self.entriesList.topLevelItem(0) if itm: @@ -80,7 +84,7 @@ Private slot to pause the current timing. @param checked flag indicating the checked status of the button - (boolean) + @type bool """ if checked: self.__tracker.pauseTrackerEntry() @@ -108,7 +112,7 @@ itm = self.entriesList.topLevelItem(0) itm.setText(self.DurationColumn, self.tr("{0} min").format(duration)) - itm.setData(0, Qt.UserRole, eid) + itm.setData(0, Qt.ItemDataRole.UserRole, eid) else: itm = self.entriesList.takeTopLevelItem(0) del itm @@ -122,20 +126,23 @@ """ Private slot to create the context menu and show it. - @param pos position the menu should be shown at (QPoint) + @param pos position the menu should be shown at + @type QPoint """ menu = QMenu() act = menu.addAction(self.tr("Edit"), self.__editEntry) act.setEnabled( len(self.entriesList.selectedItems()) == 1 and - self.entriesList.selectedItems()[0].data(0, Qt.UserRole) > -1 + self.entriesList.selectedItems()[0].data( + 0, Qt.ItemDataRole.UserRole) > -1 ) menu.addAction(self.tr("Add"), self.__addEntry) act = menu.addAction(self.tr("Delete"), self.__deleteSelectedEntries) act.setEnabled( (len(self.entriesList.selectedItems()) == 1 and - self.entriesList.selectedItems()[0].data(0, Qt.UserRole) > -1) or + self.entriesList.selectedItems()[0].data( + 0, Qt.ItemDataRole.UserRole) > -1) or len(self.entriesList.selectedItems()) > 1 ) menu.addSeparator() @@ -144,7 +151,7 @@ menu.addAction(self.tr("Import"), self.__importEntries) act = menu.addAction(self.tr("Export Selected"), self.__exportSelectedEntries) - act.setEnabled(len(self.entriesList.selectedItems()) != 0) + act.setEnabled(len(self.entriesList.selectedItems()) > 0) menu.addAction(self.tr("Export All"), self.__exportEntries) menu.addSeparator() menu.addAction(self.tr("Remove duplicates"), self.__removeDuplicates) @@ -157,14 +164,12 @@ """ from .TimeTrackerEntryDialog import TimeTrackerEntryDialog - tasks = [] - for index in range(self.taskCombo.count()): - tasks.append(self.taskCombo.itemText(index)) - comments = [] - for index in range(self.commentCombo.count()): - comments.append(self.commentCombo.itemText(index)) + tasks = [self.taskCombo.itemText(index) + for index in range(self.taskCombo.count())] + comments = [self.commentCombo.itemText(index) + for index in range(self.commentCombo.count())] dlg = TimeTrackerEntryDialog(self.__tracker, None, tasks, comments) - if dlg.exec() == QDialog.Accepted: + if dlg.exec() == QDialog.DialogCode.Accepted: self.__tracker.addTrackerEntry(*dlg.getData()) def __editEntry(self): @@ -172,22 +177,20 @@ Private slot to edit the selected tracker entry. """ itm = self.entriesList.selectedItems()[0] - eid = itm.data(0, Qt.UserRole) + eid = itm.data(0, Qt.ItemDataRole.UserRole) if eid > -1: # the current entry is edited via the elements of this widget entry = self.__tracker.getEntry(eid) if entry is not None: from .TimeTrackerEntryDialog import TimeTrackerEntryDialog - tasks = [] - for index in range(self.taskCombo.count()): - tasks.append(self.taskCombo.itemText(index)) - comments = [] - for index in range(self.commentCombo.count()): - comments.append(self.commentCombo.itemText(index)) - dlg = TimeTrackerEntryDialog(self.__tracker, entry, tasks, - comments) - if dlg.exec() == QDialog.Accepted: + tasks = [self.taskCombo.itemText(index) + for index in range(self.taskCombo.count())] + comments = [self.commentCombo.itemText(index) + for index in range(self.commentCombo.count())] + dlg = TimeTrackerEntryDialog( + self.__tracker, entry, tasks, comments) + if dlg.exec() == QDialog.DialogCode.Accepted: start, duration, task, comment = dlg.getData() entry.setStartDateTime(start) @@ -196,27 +199,27 @@ entry.setComment(comment) self.__tracker.entryChanged() - (date, time, duration, task, - comment) = entry.getEntryData()[1:-1] + data = entry.getEntryData() itm.setText(0, self.tr("{0}, {1}", "date, time") - .format(date, time)) - itm.setText(1, self.tr("{0} min").format(duration)) - itm.setText(2, task) - itm.setText(3, comment) + .format(data["start_date"], + data["start_time"])) + itm.setText(1, self.tr("{0} min").format(data["duration"])) + itm.setText(2, data["task"]) + itm.setText(3, data["comment"]) self.__resizeColumns() def __deleteSelectedEntries(self): """ Private slot to delete the selected tracker entries. """ - res = E5MessageBox.yesNo( + res = EricMessageBox.yesNo( self, self.tr("Delete Selected Entries"), self.tr("""Do you really want to delete the selected""" """ entries?""")) if res: for item in self.entriesList.selectedItems(): - eid = item.data(0, Qt.UserRole) + eid = item.data(0, Qt.ItemDataRole.UserRole) if eid > -1: # the current entry must not be deleted self.entriesList.takeTopLevelItem( @@ -238,17 +241,17 @@ Preferences.getMultiProject("Workspace") or Utilities.getHomeDir() ) - fname = E5FileDialog.getOpenFileName( + fname = EricFileDialog.getOpenFileName( None, - self.tr("Import Tracker Entries"), + self.tr("Import Time Tracker Entries"), path, - self.tr("Text Files (*.txt);;All Files (*)")) + self.tr("Time Tracker Files (*.ttj);;All Files (*)")) if fname: fname = Utilities.toNativeSeparators(fname) if not os.path.exists(fname): - E5MessageBox.critical( + EricMessageBox.critical( self, - self.tr("Import Tracker Entries"), + self.tr("Import Time Tracker Entries"), self.tr("<p>The file <b>{0}</b> does not exist.</p>") .format(fname)) return @@ -259,19 +262,20 @@ """ Private method to export all or selected entries. - @keyparam ids list of IDs to export or all if empty (list of integer) + @param ids list of IDs to export or all if empty + @type list of int """ path = ( Preferences.getMultiProject("Workspace") or Utilities.getHomeDir() ) - fname, selectedFilter = E5FileDialog.getSaveFileNameAndFilter( + fname, selectedFilter = EricFileDialog.getSaveFileNameAndFilter( self, - self.tr("Export Tracker Entries"), + self.tr("Export Time Tracker Entries"), path, - self.tr("Text Files (*.txt);;All Files (*)"), + self.tr("Time Tracker Files (*.ttj);;All Files (*)"), None, - E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite)) + EricFileDialog.Options(EricFileDialog.DontConfirmOverwrite)) if fname: ext = QFileInfo(fname).suffix() if not ext: @@ -279,12 +283,12 @@ if ex: fname += ex if QFileInfo(fname).exists(): - res = E5MessageBox.yesNo( + res = EricMessageBox.yesNo( self, - self.tr("Export Tracker Entries"), + self.tr("Export Time Tracker Entries"), self.tr("<p>The file <b>{0}</b> already exists." " Overwrite it?</p>").format(fname), - icon=E5MessageBox.Warning) + icon=EricMessageBox.Warning) if not res: return fname = Utilities.toNativeSeparators(fname) @@ -296,7 +300,7 @@ """ ids = [] for itm in self.entriesList.selectedItems(): - eid = itm.data(0, Qt.UserRole) + eid = itm.data(0, Qt.ItemDataRole.UserRole) if eid > -1: ids.append(eid) @@ -307,7 +311,7 @@ """ Private slot to remove duplicate entries. """ - res = E5MessageBox.yesNo( + res = EricMessageBox.yesNo( self, self.tr("Remove Duplicate Tracker Entries"), self.tr("""Are you sure you want to remove duplicate""" @@ -320,7 +324,7 @@ """ Private slot to merge duplicate entries. """ - res = E5MessageBox.yesNo( + res = EricMessageBox.yesNo( self, self.tr("Merge Duplicate Tracker Entries"), self.tr("""Are you sure you want to merge duplicate""" @@ -333,16 +337,21 @@ """ Private method to insert a tracker entry into the list. - @param entry reference to the tracker entry (TimeTrackEntry) + @param entry reference to the tracker entry + @type TimeTrackEntry @param index index the entry is to be inserted; -1 for at the end - (integer) + @type int """ - eid, date, time, duration, task, comment, paused = entry.getEntryData() + data = entry.getEntryData() itm = QTreeWidgetItem( - [self.tr("{0}, {1}", "date, time").format(date, time), - self.tr("{0} min").format(duration), task, comment]) - itm.setTextAlignment(1, Qt.AlignRight) - itm.setData(0, Qt.UserRole, eid) + [self.tr("{0}, {1}", "date, time").format(data["start_date"], + data["start_time"]), + self.tr("{0} min").format(data["duration"]), + data["task"], + data["comment"]] + ) + itm.setTextAlignment(1, Qt.AlignmentFlag.AlignRight) + itm.setData(0, Qt.ItemDataRole.UserRole, data["id"]) if index == -1: self.entriesList.addTopLevelItem(itm) else: @@ -359,7 +368,8 @@ """ Public method to show the tracker entries of the current project. - @param entries list of tracker entries (list of TimeTrackEntry) + @param entries list of tracker entries + @type list of TimeTrackEntry """ self.taskCombo.addItem("") self.commentCombo.addItem("") @@ -386,23 +396,24 @@ """ Public method to set the current entry. - @param entry current entry (TimeTrackEntry) + @param entry current entry + @type TimeTrackEntry """ self.__insertEntry(entry, 0) self.__resizeColumns() - eid, date, time, duration, task, comment, paused = entry.getEntryData() + data = entry.getEntryData() self.startDateTimeEdit.setDateTime(entry.getStartDateTime()) - self.durationSpinBox.setValue(duration) - self.taskCombo.setEditText(task) - self.commentCombo.setEditText(comment) + self.durationSpinBox.setValue(data["duration"]) + self.taskCombo.setEditText(data["task"]) + self.commentCombo.setEditText(data["comment"]) def clear(self): """ Public method to clear all the data. """ self.entriesList.clear() - self.startDateTimeEdit.setDate(QDate(2000, 1, 1)) + self.startDateTimeEdit.setDate(QDate(2020, 1, 1)) self.startDateTimeEdit.setTime(QTime(0, 0, 0)) self.durationSpinBox.setValue(0) self.taskCombo.clear()
--- a/TimeTracker/i18n/timetracker_de.ts Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/i18n/timetracker_de.ts Fri Jun 04 16:40:54 2021 +0200 @@ -1,414 +1,427 @@ <?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS><TS version="2.0" language="de_DE" sourcelanguage="en_US"> -<context> +<!DOCTYPE TS> +<TS version="2.1" language="de_DE" sourcelanguage="en_US"> + <context> <name>TimeTracker</name> <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Time Tracker</source> - <translation>Zeitnahme</translation> + <location filename="../TimeTracker.py" line="78" /> + <location filename="../TimeTracker.py" line="75" /> + <source>Time Tracker</source> + <translation>Zeitnahme</translation> </message> <message> - <location filename="../TimeTracker.py" line="165"/> - <source>Read Time Tracker File</source> - <translation>Zeitnahmedatei einlesen</translation> - </message> - <message> - <location filename="../TimeTracker.py" line="213"/> - <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> - <translation><p>Die Zeitnahmedatei <b>{0}</b> konnte nicht gelesen werden.</p><p>Ursache: {1}</p></translation> + <location filename="../TimeTracker.py" line="79" /> + <source>T&ime Tracker</source> + <translation>Ze&itnahme</translation> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source>Save Time Tracker File</source> - <translation>Zeitnahmedatei speichern</translation> + <location filename="../TimeTracker.py" line="80" /> + <source>Alt+Shift+I</source> + <translation>Alt+Shift+I</translation> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> - <translation><p>Die Zeitnahmedatei <b>{0}</b> konnte nicht gespeichert werden.</p><p>Ursache: {1}</p></translation> + <location filename="../TimeTracker.py" line="83" /> + <source>Switch the input focus to the Time Tracker window.</source> + <translation>Schalte den Eingabefokus auf das Zeitnahmefenster um.</translation> </message> <message> - <location filename="../TimeTracker.py" line="276"/> - <source>Import Time Tracker File</source> - <translation>Zeitnahmedatei importieren</translation> + <location filename="../TimeTracker.py" line="85" /> + <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> + <translation><b>Zeitnahme aktivieren</b><p>Dies schaltet den Eingabefokus auf das Zeitnahmefenster um.</p></translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="269"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> - <translation> - <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen ungültigen Eintrag.</numerusform> - <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt %n ungültige Einträge.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="168" /> + <location filename="../TimeTracker.py" line="148" /> + <source>Read Time Tracker File</source> + <translation>Zeitnahmedatei einlesen</translation> + </message> + <message> + <location filename="../TimeTracker.py" line="217" /> + <location filename="../TimeTracker.py" line="149" /> + <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> + <translation><p>Die Zeitnahmedatei <b>{0}</b> konnte nicht gelesen werden.</p><p>Ursache: {1}</p></translation> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="264"/> - <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> - <translation> - <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen doppelten Eintrag.</numerusform> - <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt %n doppelte Einträge.</numerusform> - </translation> + <location filename="../TimeTracker.py" line="169" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> + <translation> + <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen ungültigen Eintrag. Dieser wurde übersprungen.</p></numerusform> + <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt %n ungültige Einträge. Diese wurden übersprungen.</p></numerusform> + </translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="165"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> - <translation> - <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen ungültigen Eintrag. Dieser wurde übersprungen.</p></numerusform> - <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt %n ungültige Einträge. Diese wurden übersprungen.</p></numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="198" /> + <source>Save Time Tracker File</source> + <translation>Zeitnahmedatei speichern</translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="260"/> - <source> %n duplicate entries were detected.</source> - <translation> - <numerusform> Ein doppelter Eintrag wurde erkannt.</numerusform> - <numerusform> %n doppelte Einträge wurden erkannt.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="199" /> + <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> + <translation><p>Die Zeitnahmedatei <b>{0}</b> konnte nicht gespeichert werden.</p><p>Ursache: {1}</p></translation> + </message> + <message> + <location filename="../TimeTracker.py" line="280" /> + <location filename="../TimeTracker.py" line="216" /> + <source>Import Time Tracker File</source> + <translation>Zeitnahmedatei importieren</translation> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="273"/> - <source> %n entries have been ignored.</p></source> - <translation> - <numerusform> Ein Eintrag wurde ubersprungen.</p></numerusform> - <numerusform> %n Einträge wurden übersprungen.</p></numerusform> - </translation> + <location filename="../TimeTracker.py" line="271" /> + <location filename="../TimeTracker.py" line="258" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> + <translation> + <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen ungültigen Eintrag.</numerusform> + <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt %n ungültige Einträge.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>T&ime Tracker</source> - <translation>Ze&itnahme</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="262" /> + <source> %n duplicate entries were detected.</source> + <translation> + <numerusform> Ein doppelter Eintrag wurde erkannt.</numerusform> + <numerusform> %n doppelte Einträge wurden erkannt.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Alt+Shift+I</source> - <translation>Alt+Shift+I</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="266" /> + <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> + <translation> + <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt einen doppelten Eintrag.</numerusform> + <numerusform><p>Die Zeitnahmedatei <b>{0}</b> enthielt %n doppelte Einträge.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="82"/> - <source>Switch the input focus to the Time Tracker window.</source> - <translation>Schalte den Eingabefokus auf das Zeitnahmefenster um.</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="275" /> + <source> %n entries have been ignored.</p></source> + <translation> + <numerusform> Ein Eintrag wurde ubersprungen.</p></numerusform> + <numerusform> %n Einträge wurden übersprungen.</p></numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="84"/> - <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> - <translation><b>Zeitnahme aktivieren</b><p>Dies schaltet den Eingabefokus auf das Zeitnahmefenster um.</p></translation> - </message> -</context> -<context> + </context> + <context> <name>TimeTrackerEntryDialog</name> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="14"/> - <source>Edit Timer Entry</source> - <translation>Zeitnahmeeintrag editieren</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit Timer Entry</source> + <translation>Zeitnahmeeintrag editieren</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="25"/> - <source>Start Date/Time:</source> - <translation>Startdatum/-zeit:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Start Date/Time:</source> + <translation>Startdatum/-zeit:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="32"/> - <source>Edit the start date and time of the timer</source> - <translation>Editiere das Startdatum und die Startzeit des Zeitnehmers</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the start date and time of the timer</source> + <translation>Editiere das Startdatum und die Startzeit des Zeitnehmers</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="35"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation>dd.MM.yyy HH:mm:ss</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation>dd.MM.yyy HH:mm:ss</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="58"/> - <source>Duration:</source> - <translation>Dauer:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Duration:</source> + <translation>Dauer:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="65"/> - <source>Edit the duration of the timer</source> - <translation>Editiere die Dauer des Zeitnehmers</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the duration of the timer</source> + <translation>Editiere die Dauer des Zeitnehmers</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="71"/> - <source> min</source> - <translation> min</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="94"/> - <source>Task:</source> - <translation>Aufgabe:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Task:</source> + <translation>Aufgabe:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="107"/> - <source>Enter the task description for the timer</source> - <translation>Gib die Aufgabenbeschreibung für den Zeitnehmer ein</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter the task description for the timer</source> + <translation>Gib die Aufgabenbeschreibung für den Zeitnehmer ein</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="117"/> - <source>Comment:</source> - <translation>Kommentar:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Comment:</source> + <translation>Kommentar:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="130"/> - <source>Enter a comment for the timer</source> - <translation>Gib einen Kommentar für den Zeitnehmer ein</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter a comment for the timer</source> + <translation>Gib einen Kommentar für den Zeitnehmer ein</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.py" line="49"/> - <source>Add Tracker Entry</source> - <translation>Zeitnahmeeintrag hinzufügen</translation> + <location filename="../TimeTrackerEntryDialog.py" line="55" /> + <source>Add Tracker Entry</source> + <translation>Zeitnahmeeintrag hinzufügen</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPage</name> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="17"/> - <source><b>Configure Time Tracker</b></source> - <translation><b>Zeitnahme konfigurieren</b></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source><b>Configure Time Tracker</b></source> + <translation><b>Zeitnahme konfigurieren</b></translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="39"/> - <source>Minimum Duration:</source> - <translation>Mindestdauer:</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Minimum Duration:</source> + <translation>Mindestdauer:</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="46"/> - <source>Enter the value of the minimum duration for a valid tracker entry</source> - <translation>Gib die Mindestdauer für einen gültigen Zeitnahmeeintrag ein</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Enter the value of the minimum duration for a valid tracker entry</source> + <translation>Gib die Mindestdauer für einen gültigen Zeitnahmeeintrag ein</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="49"/> - <source> min</source> - <translation> min</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="75"/> - <source>Select to save automatically whenever a tracker is stopped</source> - <translation>Auswählen, um bei jeder Änderung zu speichern</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to save automatically whenever a tracker is stopped</source> + <translation>Auswählen, um bei jeder Änderung zu speichern</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="78"/> - <source>Auto Save Enabled</source> - <translation>Automatische Speicherung aktiv</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Auto Save Enabled</source> + <translation>Automatische Speicherung aktiv</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="85"/> - <source>Select to allow multiple entries with the same start date and time</source> - <translation>Auswählen, um mehrere Einträge mit identischem Startzeitpunkt zuzulassen</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to allow multiple entries with the same start date and time</source> + <translation>Auswählen, um mehrere Einträge mit identischem Startzeitpunkt zuzulassen</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="88"/> - <source>Allow entries with identical start date and time</source> - <translation>Einträge mit identischem Startzeitpunkt zulassen</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Allow entries with identical start date and time</source> + <translation>Einträge mit identischem Startzeitpunkt zulassen</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPlugin</name> <message> - <location filename="../../PluginTimeTracker.py" line="75"/> - <source>Time Tracker</source> - <translation>Zeitnahme</translation> + <location filename="../../PluginTimeTracker.py" line="69" /> + <source>Time Tracker</source> + <translation>Zeitnahme</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerWidget</name> <message> - <location filename="../TimeTrackerWidget.ui" line="22"/> - <source>Start Date/Time:</source> - <translation>Startzeitpunkt:</translation> + <location filename="../TimeTrackerWidget.py" line="349" /> + <location filename="../TimeTrackerWidget.py" line="206" /> + <location filename="../TimeTrackerWidget.py" line="114" /> + <location filename="../TimeTrackerWidget.py" line="97" /> + <source>{0} min</source> + <translation>{0} min</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="29"/> - <source>Duration:</source> - <translation>Dauer:</translation> - </message> - <message> - <location filename="../TimeTrackerWidget.ui" line="36"/> - <source>Task:</source> - <translation>Aufgabe:</translation> + <location filename="../TimeTrackerWidget.py" line="134" /> + <source>Edit</source> + <translation>Editieren</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="43"/> - <source>Comment:</source> - <translation>Kommentar:</translation> + <location filename="../TimeTrackerWidget.py" line="140" /> + <source>Add</source> + <translation>Hinzufügen</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="53"/> - <source>Shows the start date and time of the current timer</source> - <translation>Zeigt das Startdatum und die Startzeit des aktuellen Zeitnehmers an</translation> + <location filename="../TimeTrackerWidget.py" line="141" /> + <source>Delete</source> + <translation>Löschen</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="59"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation>dd.MM.yyyy HH:mm:ss</translation> + <location filename="../TimeTrackerWidget.py" line="149" /> + <source>Save</source> + <translation>Speichern</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="72"/> - <source>Shows the duration of the current timer</source> - <translation>Zeigt die Dauer des aktuellen Zeitnehmers an</translation> + <location filename="../TimeTrackerWidget.py" line="151" /> + <source>Import</source> + <translation>Importieren</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="81"/> - <source> min</source> - <translation> min</translation> + <location filename="../TimeTrackerWidget.py" line="152" /> + <source>Export Selected</source> + <translation>Ausgewählte exportieren</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.py" line="155" /> + <source>Export All</source> + <translation>Alle exportieren</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="97"/> - <source>Enter the task description for the current timer</source> - <translation>Gib die Aufgabenbeschreibung für den aktuellen Zeitnehmer ein</translation> + <location filename="../TimeTrackerWidget.py" line="157" /> + <source>Remove duplicates</source> + <translation>Doppelte löschen</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="113"/> - <source>Enter a comment for the current timer</source> - <translation>Gib einen Kommentar für den aktuellen Zeitnehmer ein</translation> + <location filename="../TimeTrackerWidget.py" line="158" /> + <source>Merge duplicates</source> + <translation>Doppelte zusammenführen</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="140"/> - <source>Press to pause the current timer</source> - <translation>Drücken, um den aktuellen Zeitnehmer zu pausieren</translation> + <location filename="../TimeTrackerWidget.py" line="347" /> + <location filename="../TimeTrackerWidget.py" line="203" /> + <source>{0}, {1}</source> + <comment>date, time</comment> + <translation>{0}, {1}</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="143"/> - <source>Pause</source> - <translation>Pause</translation> + <location filename="../TimeTrackerWidget.py" line="217" /> + <source>Delete Selected Entries</source> + <translation>Ausgewählte Einträge löschen</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="153"/> - <source>Press to end the current timer and start a new one</source> - <translation>Drücken, um den aktuellen Zeitnehmer zu stoppen und einen neuen zu starten</translation> + <location filename="../TimeTrackerWidget.py" line="218" /> + <source>Do you really want to delete the selected entries?</source> + <translation>Sollen die ausgewählten Einträge wirklich gelöscht werden?</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="156"/> - <source>End Current Timer and Start a New Timer</source> - <translation>Aktuellen Zeitnehmer stoppen und neuen starten</translation> + <location filename="../TimeTrackerWidget.py" line="254" /> + <location filename="../TimeTrackerWidget.py" line="246" /> + <source>Import Time Tracker Entries</source> + <translation>Zeitnahmeinträge importieren</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="200"/> - <source>Start Date/Time</source> - <translation>Startzeitpunkt</translation> + <location filename="../TimeTrackerWidget.py" line="276" /> + <location filename="../TimeTrackerWidget.py" line="248" /> + <source>Time Tracker Files (*.ttj);;All Files (*)</source> + <translation>Zeitnahmedateien (*.ttj);;Alle Dateien (*)</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="205"/> - <source>Duration</source> - <translation>Dauer</translation> + <location filename="../TimeTrackerWidget.py" line="255" /> + <source><p>The file <b>{0}</b> does not exist.</p></source> + <translation><p>Die Datei <b>{0}</b> existiert nicht.</p></translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="210"/> - <source>Task</source> - <translation>Aufgabe</translation> + <location filename="../TimeTrackerWidget.py" line="288" /> + <location filename="../TimeTrackerWidget.py" line="274" /> + <source>Export Time Tracker Entries</source> + <translation>Zeitnahmeinträge exportieren</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="215"/> - <source>Comment</source> - <translation>Kommentar</translation> - </message> - <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0} min</source> - <translation>{0} min</translation> + <location filename="../TimeTrackerWidget.py" line="289" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>Die Datei <b>{0}</b> existiert bereits. Überschreiben?</p></translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="129"/> - <source>Edit</source> - <translation>Editieren</translation> + <location filename="../TimeTrackerWidget.py" line="316" /> + <source>Remove Duplicate Tracker Entries</source> + <translation>Doppelte Zeitnahmeeinträge löschen</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="134"/> - <source>Add</source> - <translation>Hinzufügen</translation> + <location filename="../TimeTrackerWidget.py" line="317" /> + <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> + <translation>Sollen doppelte Zeitnahmeeinträge wirklich gelöscht werden? Nur der Eintrag mit der längsten Dauer bleibt erhalten.</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="135"/> - <source>Delete</source> - <translation>Löschen</translation> + <location filename="../TimeTrackerWidget.py" line="329" /> + <source>Merge Duplicate Tracker Entries</source> + <translation>Doppelte Zeitnahmeeinträge zusammenführen</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="142"/> - <source>Save</source> - <translation>Speichern</translation> + <location filename="../TimeTrackerWidget.py" line="330" /> + <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> + <translation>Sollen doppelte Zeitnahmeeinträge wirklich zusammengeführt werden? Die Zeitdauern der doppelten Einträge werden addiert.</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="144"/> - <source>Import</source> - <translation>Importieren</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time:</source> + <translation>Startzeitpunkt:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="145"/> - <source>Export Selected</source> - <translation>Ausgewählte exportieren</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration:</source> + <translation>Dauer:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="148"/> - <source>Export All</source> - <translation>Alle exportieren</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task:</source> + <translation>Aufgabe:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="150"/> - <source>Remove duplicates</source> - <translation>Doppelte löschen</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment:</source> + <translation>Kommentar:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="151"/> - <source>Merge duplicates</source> - <translation>Doppelte zusammenführen</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the start date and time of the current timer</source> + <translation>Zeigt das Startdatum und die Startzeit des aktuellen Zeitnehmers an</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0}, {1}</source> - <comment>date, time</comment> - <translation>{0}, {1}</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation>dd.MM.yyyy HH:mm:ss</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the duration of the current timer</source> + <translation>Zeigt die Dauer des aktuellen Zeitnehmers an</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Delete Selected Entries</source> - <translation>Ausgewählte Einträge löschen</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Do you really want to delete the selected entries?</source> - <translation>Sollen die ausgewählten Einträge wirklich gelöscht werden?</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter the task description for the current timer</source> + <translation>Gib die Aufgabenbeschreibung für den aktuellen Zeitnehmer ein</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source>Import Tracker Entries</source> - <translation>Zeitnahmeinträge importieren</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter a comment for the current timer</source> + <translation>Gib einen Kommentar für den aktuellen Zeitnehmer ein</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="268"/> - <source>Text Files (*.txt);;All Files (*)</source> - <translation>Text Dateien (*.txt);;Alle Dateien (*)</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to pause the current timer</source> + <translation>Drücken, um den aktuellen Zeitnehmer zu pausieren</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source><p>The file <b>{0}</b> does not exist.</p></source> - <translation><p>Die Datei <b>{0}</b> existiert nicht.</p></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Pause</source> + <translation>Pause</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source>Export Tracker Entries</source> - <translation>Zeitnahmeinträge exportieren</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to end the current timer and start a new one</source> + <translation>Drücken, um den aktuellen Zeitnehmer zu stoppen und einen neuen zu starten</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> - <translation><p>Die Datei <b>{0}</b> existiert bereits. Überschreiben?</p></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>End Current Timer and Start a New Timer</source> + <translation>Aktuellen Zeitnehmer stoppen und neuen starten</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Remove Duplicate Tracker Entries</source> - <translation>Doppelte Zeitnahmeeinträge löschen</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time</source> + <translation>Startzeitpunkt</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> - <translation>Sollen doppelte Zeitnahmeeinträge wirklich gelöscht werden? Nur der Eintrag mit der längsten Dauer bleibt erhalten.</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration</source> + <translation>Dauer</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Merge Duplicate Tracker Entries</source> - <translation>Doppelte Zeitnahmeeinträge zusammenführen</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task</source> + <translation>Aufgabe</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> - <translation>Sollen doppelte Zeitnahmeeinträge wirklich zusammengeführt werden? Die Zeitdauern der doppelten Einträge werden addiert.</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment</source> + <translation>Kommentar</translation> </message> -</context> + </context> </TS>
--- a/TimeTracker/i18n/timetracker_en.ts Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/i18n/timetracker_en.ts Fri Jun 04 16:40:54 2021 +0200 @@ -1,414 +1,427 @@ <?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS><TS version="2.0" language="de_DE" sourcelanguage=""> -<context> +<!DOCTYPE TS> +<TS version="2.0" language="de_DE" sourcelanguage=""> + <context> <name>TimeTracker</name> <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Time Tracker</source> - <translation type="unfinished"></translation> + <location filename="../TimeTracker.py" line="78" /> + <location filename="../TimeTracker.py" line="75" /> + <source>Time Tracker</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTracker.py" line="165"/> - <source>Read Time Tracker File</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../TimeTracker.py" line="213"/> - <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> - <translation type="unfinished"></translation> + <location filename="../TimeTracker.py" line="79" /> + <source>T&ime Tracker</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source>Save Time Tracker File</source> - <translation type="unfinished"></translation> + <location filename="../TimeTracker.py" line="80" /> + <source>Alt+Shift+I</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> - <translation type="unfinished"></translation> + <location filename="../TimeTracker.py" line="83" /> + <source>Switch the input focus to the Time Tracker window.</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTracker.py" line="276"/> - <source>Import Time Tracker File</source> - <translation type="unfinished"></translation> + <location filename="../TimeTracker.py" line="85" /> + <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> + <translation type="unfinished" /> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="269"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> - <translation> - <numerusform><p>The time tracker file <b>{0}</b> contained one invalid entry.</numerusform> - <numerusform><p>The time tracker file <b>{0}</b> contained %n invalid entries.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="168" /> + <location filename="../TimeTracker.py" line="148" /> + <source>Read Time Tracker File</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../TimeTracker.py" line="217" /> + <location filename="../TimeTracker.py" line="149" /> + <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="264"/> - <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> - <translation> - <numerusform><p>The time tracker file <b>{0}</b> contained one duplicate entry.</numerusform> - <numerusform><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</numerusform> - </translation> + <location filename="../TimeTracker.py" line="169" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> + <translation> + <numerusform><p>The time tracker file <b>{0}</b> contained one invalid entry. This has been discarded.</p></numerusform> + <numerusform><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></numerusform> + </translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="165"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> - <translation> - <numerusform><p>The time tracker file <b>{0}</b> contained one invalid entry. This has been discarded.</p></numerusform> - <numerusform><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="198" /> + <source>Save Time Tracker File</source> + <translation type="unfinished" /> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="260"/> - <source> %n duplicate entries were detected.</source> - <translation> - <numerusform> One duplicate entry was detected.</numerusform> - <numerusform> %n duplicate entries were detected.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="199" /> + <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../TimeTracker.py" line="280" /> + <location filename="../TimeTracker.py" line="216" /> + <source>Import Time Tracker File</source> + <translation type="unfinished" /> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="273"/> - <source> %n entries have been ignored.</p></source> - <translation> - <numerusform> One entry has been ignored.</p></numerusform> - <numerusform> %n entries have been ignored.</p></numerusform> - </translation> + <location filename="../TimeTracker.py" line="271" /> + <location filename="../TimeTracker.py" line="258" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> + <translation> + <numerusform><p>The time tracker file <b>{0}</b> contained one invalid entry.</numerusform> + <numerusform><p>The time tracker file <b>{0}</b> contained %n invalid entries.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>T&ime Tracker</source> - <translation type="unfinished"></translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="262" /> + <source> %n duplicate entries were detected.</source> + <translation> + <numerusform> One duplicate entry was detected.</numerusform> + <numerusform> %n duplicate entries were detected.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Alt+Shift+I</source> - <translation type="unfinished"></translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="266" /> + <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> + <translation> + <numerusform><p>The time tracker file <b>{0}</b> contained one duplicate entry.</numerusform> + <numerusform><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="82"/> - <source>Switch the input focus to the Time Tracker window.</source> - <translation type="unfinished"></translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="275" /> + <source> %n entries have been ignored.</p></source> + <translation> + <numerusform> One entry has been ignored.</p></numerusform> + <numerusform> %n entries have been ignored.</p></numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="84"/> - <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> - <translation type="unfinished"></translation> - </message> -</context> -<context> + </context> + <context> <name>TimeTrackerEntryDialog</name> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="14"/> - <source>Edit Timer Entry</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit Timer Entry</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="25"/> - <source>Start Date/Time:</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Start Date/Time:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="32"/> - <source>Edit the start date and time of the timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the start date and time of the timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="35"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="58"/> - <source>Duration:</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Duration:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="65"/> - <source>Edit the duration of the timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the duration of the timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="71"/> - <source> min</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source> min</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="94"/> - <source>Task:</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Task:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="107"/> - <source>Enter the task description for the timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter the task description for the timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="117"/> - <source>Comment:</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Comment:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="130"/> - <source>Enter a comment for the timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter a comment for the timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerEntryDialog.py" line="49"/> - <source>Add Tracker Entry</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerEntryDialog.py" line="55" /> + <source>Add Tracker Entry</source> + <translation type="unfinished" /> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPage</name> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="17"/> - <source><b>Configure Time Tracker</b></source> - <translation type="unfinished"></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source><b>Configure Time Tracker</b></source> + <translation type="unfinished" /> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="39"/> - <source>Minimum Duration:</source> - <translation type="unfinished"></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Minimum Duration:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="46"/> - <source>Enter the value of the minimum duration for a valid tracker entry</source> - <translation type="unfinished"></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Enter the value of the minimum duration for a valid tracker entry</source> + <translation type="unfinished" /> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="49"/> - <source> min</source> - <translation type="unfinished"></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source> min</source> + <translation type="unfinished" /> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="75"/> - <source>Select to save automatically whenever a tracker is stopped</source> - <translation type="unfinished"></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to save automatically whenever a tracker is stopped</source> + <translation type="unfinished" /> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="78"/> - <source>Auto Save Enabled</source> - <translation type="unfinished"></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Auto Save Enabled</source> + <translation type="unfinished" /> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="85"/> - <source>Select to allow multiple entries with the same start date and time</source> - <translation type="unfinished"></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to allow multiple entries with the same start date and time</source> + <translation type="unfinished" /> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="88"/> - <source>Allow entries with identical start date and time</source> - <translation type="unfinished"></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Allow entries with identical start date and time</source> + <translation type="unfinished" /> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPlugin</name> <message> - <location filename="../../PluginTimeTracker.py" line="75"/> - <source>Time Tracker</source> - <translation type="unfinished"></translation> + <location filename="../../PluginTimeTracker.py" line="69" /> + <source>Time Tracker</source> + <translation type="unfinished" /> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerWidget</name> <message> - <location filename="../TimeTrackerWidget.ui" line="22"/> - <source>Start Date/Time:</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="349" /> + <location filename="../TimeTrackerWidget.py" line="206" /> + <location filename="../TimeTrackerWidget.py" line="114" /> + <location filename="../TimeTrackerWidget.py" line="97" /> + <source>{0} min</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="29"/> - <source>Duration:</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../TimeTrackerWidget.ui" line="36"/> - <source>Task:</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="134" /> + <source>Edit</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="43"/> - <source>Comment:</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="140" /> + <source>Add</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="53"/> - <source>Shows the start date and time of the current timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="141" /> + <source>Delete</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="59"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="149" /> + <source>Save</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="72"/> - <source>Shows the duration of the current timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="151" /> + <source>Import</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="81"/> - <source> min</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="152" /> + <source>Export Selected</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../TimeTrackerWidget.py" line="155" /> + <source>Export All</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="97"/> - <source>Enter the task description for the current timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="157" /> + <source>Remove duplicates</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="113"/> - <source>Enter a comment for the current timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="158" /> + <source>Merge duplicates</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="140"/> - <source>Press to pause the current timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="347" /> + <location filename="../TimeTrackerWidget.py" line="203" /> + <source>{0}, {1}</source> + <comment>date, time</comment> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="143"/> - <source>Pause</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="217" /> + <source>Delete Selected Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="153"/> - <source>Press to end the current timer and start a new one</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="218" /> + <source>Do you really want to delete the selected entries?</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="156"/> - <source>End Current Timer and Start a New Timer</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="254" /> + <location filename="../TimeTrackerWidget.py" line="246" /> + <source>Import Time Tracker Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="200"/> - <source>Start Date/Time</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="276" /> + <location filename="../TimeTrackerWidget.py" line="248" /> + <source>Time Tracker Files (*.ttj);;All Files (*)</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="205"/> - <source>Duration</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="255" /> + <source><p>The file <b>{0}</b> does not exist.</p></source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="210"/> - <source>Task</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="288" /> + <location filename="../TimeTrackerWidget.py" line="274" /> + <source>Export Time Tracker Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="215"/> - <source>Comment</source> - <translation type="unfinished"></translation> - </message> - <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0} min</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="289" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="129"/> - <source>Edit</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="316" /> + <source>Remove Duplicate Tracker Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="134"/> - <source>Add</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="317" /> + <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="135"/> - <source>Delete</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="329" /> + <source>Merge Duplicate Tracker Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="142"/> - <source>Save</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.py" line="330" /> + <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="144"/> - <source>Import</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="145"/> - <source>Export Selected</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="148"/> - <source>Export All</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="150"/> - <source>Remove duplicates</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment:</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="151"/> - <source>Merge duplicates</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the start date and time of the current timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0}, {1}</source> - <comment>date, time</comment> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation type="unfinished" /> + </message> + <message> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the duration of the current timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Delete Selected Entries</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source> min</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Do you really want to delete the selected entries?</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter the task description for the current timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source>Import Tracker Entries</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter a comment for the current timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="268"/> - <source>Text Files (*.txt);;All Files (*)</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to pause the current timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source><p>The file <b>{0}</b> does not exist.</p></source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Pause</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source>Export Tracker Entries</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to end the current timer and start a new one</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>End Current Timer and Start a New Timer</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Remove Duplicate Tracker Entries</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Merge Duplicate Tracker Entries</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> - <translation type="unfinished"></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment</source> + <translation type="unfinished" /> </message> -</context> + </context> </TS>
--- a/TimeTracker/i18n/timetracker_es.ts Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/i18n/timetracker_es.ts Fri Jun 04 16:40:54 2021 +0200 @@ -1,414 +1,439 @@ <?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS><TS version="2.0" language="es_ES" sourcelanguage=""> -<context> +<!DOCTYPE TS> +<TS version="2.0" language="es_ES" sourcelanguage=""> + <context> <name>TimeTracker</name> <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Time Tracker</source> - <translation>Time Tracker</translation> + <location filename="../TimeTracker.py" line="78" /> + <location filename="../TimeTracker.py" line="75" /> + <source>Time Tracker</source> + <translation>Time Tracker</translation> </message> <message> - <location filename="../TimeTracker.py" line="165"/> - <source>Read Time Tracker File</source> - <translation>Leer Archivo de Time Tracker</translation> - </message> - <message> - <location filename="../TimeTracker.py" line="213"/> - <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> - <translation><p>El archivo de time tracker <b>{0}</b> no ha podido leerse.</p><p>Razón: {1}</p></translation> + <location filename="../TimeTracker.py" line="79" /> + <source>T&ime Tracker</source> + <translation>T&ime Tracker</translation> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source>Save Time Tracker File</source> - <translation>Guardar Archivo de Time Tracker</translation> + <location filename="../TimeTracker.py" line="80" /> + <source>Alt+Shift+I</source> + <translation>Alt+Shift+I</translation> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> - <translation><p>El archivo de time tracker <b>{0}</b> no ha podido guardarse.</p><p>Razón: {1}</p></translation> + <location filename="../TimeTracker.py" line="83" /> + <source>Switch the input focus to the Time Tracker window.</source> + <translation>Cambiar el foco de input a la ventana de Time Tracker.</translation> </message> <message> - <location filename="../TimeTracker.py" line="276"/> - <source>Import Time Tracker File</source> - <translation>Importar Archivo de Time Tracker</translation> + <location filename="../TimeTracker.py" line="85" /> + <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> + <translation><b>Activar Time Tracker</b><p>Cambia el foco de input a la ventana de Time Tracker.</p></translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="269"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> - <translation> - <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entrada no válida.</numerusform> - <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entradas no válidas.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="168" /> + <location filename="../TimeTracker.py" line="148" /> + <source>Read Time Tracker File</source> + <translation>Leer Archivo de Time Tracker</translation> + </message> + <message> + <location filename="../TimeTracker.py" line="217" /> + <location filename="../TimeTracker.py" line="149" /> + <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> + <translation><p>El archivo de time tracker <b>{0}</b> no ha podido leerse.</p><p>Razón: {1}</p></translation> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="264"/> - <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> - <translation> - <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entrada duplicada.</numerusform> - <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entradas duplicadas.</numerusform> - </translation> + <location filename="../TimeTracker.py" line="169" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> + <translation> + <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entrada no válida. Ésta se ha descartado.</p></numerusform> + <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entradas no válidas. Éstas se han descartado.</p></numerusform> + </translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="165"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> - <translation> - <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entrada no válida. Ésta se ha descartado.</p></numerusform> - <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entradas no válidas. Éstas se han descartado.</p></numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="198" /> + <source>Save Time Tracker File</source> + <translation>Guardar Archivo de Time Tracker</translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="260"/> - <source> %n duplicate entries were detected.</source> - <translation> - <numerusform>Se han detectado %n entrada duplicada.</numerusform> - <numerusform>Se han detectado %n entradas duplicadas.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="199" /> + <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> + <translation><p>El archivo de time tracker <b>{0}</b> no ha podido guardarse.</p><p>Razón: {1}</p></translation> + </message> + <message> + <location filename="../TimeTracker.py" line="280" /> + <location filename="../TimeTracker.py" line="216" /> + <source>Import Time Tracker File</source> + <translation>Importar Archivo de Time Tracker</translation> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="273"/> - <source> %n entries have been ignored.</p></source> - <translation> - <numerusform>Se han ignorado %n entrada.</p></numerusform> - <numerusform>Se han ignorado %n entradas.</p></numerusform> - </translation> + <location filename="../TimeTracker.py" line="271" /> + <location filename="../TimeTracker.py" line="258" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> + <translation> + <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entrada no válida.</numerusform> + <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entradas no válidas.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>T&ime Tracker</source> - <translation>T&ime Tracker</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="262" /> + <source> %n duplicate entries were detected.</source> + <translation> + <numerusform>Se han detectado %n entrada duplicada.</numerusform> + <numerusform>Se han detectado %n entradas duplicadas.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Alt+Shift+I</source> - <translation>Alt+Shift+I</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="266" /> + <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> + <translation> + <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entrada duplicada.</numerusform> + <numerusform><p>El archivo de time tracker <b>{0}</b> contiene %n entradas duplicadas.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="82"/> - <source>Switch the input focus to the Time Tracker window.</source> - <translation>Cambiar el foco de input a la ventana de Time Tracker.</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="275" /> + <source> %n entries have been ignored.</p></source> + <translation> + <numerusform>Se han ignorado %n entrada.</p></numerusform> + <numerusform>Se han ignorado %n entradas.</p></numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="84"/> - <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> - <translation><b>Activar Time Tracker</b><p>Cambia el foco de input a la ventana de Time Tracker.</p></translation> - </message> -</context> -<context> + </context> + <context> <name>TimeTrackerEntryDialog</name> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="14"/> - <source>Edit Timer Entry</source> - <translation>Editar Entrada Temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit Timer Entry</source> + <translation>Editar Entrada Temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="25"/> - <source>Start Date/Time:</source> - <translation>Fecha/Hora Inicio:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Start Date/Time:</source> + <translation>Fecha/Hora Inicio:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="32"/> - <source>Edit the start date and time of the timer</source> - <translation>Editar la fecha y tiempo de inicio del temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the start date and time of the timer</source> + <translation>Editar la fecha y tiempo de inicio del temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="35"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation>yyyy-MM-dd HH:mm:ss</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation>yyyy-MM-dd HH:mm:ss</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="58"/> - <source>Duration:</source> - <translation>Duración:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Duration:</source> + <translation>Duración:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="65"/> - <source>Edit the duration of the timer</source> - <translation>Editar la duración del temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the duration of the timer</source> + <translation>Editar la duración del temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="71"/> - <source> min</source> - <translation> min</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="94"/> - <source>Task:</source> - <translation>Tarea:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Task:</source> + <translation>Tarea:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="107"/> - <source>Enter the task description for the timer</source> - <translation>Introducir la descripción de la tarea para el temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter the task description for the timer</source> + <translation>Introducir la descripción de la tarea para el temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="117"/> - <source>Comment:</source> - <translation>Comentario:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Comment:</source> + <translation>Comentario:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="130"/> - <source>Enter a comment for the timer</source> - <translation>Introducir un comentario para el temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter a comment for the timer</source> + <translation>Introducir un comentario para el temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.py" line="49"/> - <source>Add Tracker Entry</source> - <translation>Añadir Entrada al Tracker</translation> + <location filename="../TimeTrackerEntryDialog.py" line="55" /> + <source>Add Tracker Entry</source> + <translation>Añadir Entrada al Tracker</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPage</name> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="17"/> - <source><b>Configure Time Tracker</b></source> - <translation><b>Configurar Time Tracker</b></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source><b>Configure Time Tracker</b></source> + <translation><b>Configurar Time Tracker</b></translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="39"/> - <source>Minimum Duration:</source> - <translation>Duración Mínima:</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Minimum Duration:</source> + <translation>Duración Mínima:</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="46"/> - <source>Enter the value of the minimum duration for a valid tracker entry</source> - <translation>Introducir el valor de duración mínima para una entrada válida para el tracker</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Enter the value of the minimum duration for a valid tracker entry</source> + <translation>Introducir el valor de duración mínima para una entrada válida para el tracker</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="49"/> - <source> min</source> - <translation> min</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="75"/> - <source>Select to save automatically whenever a tracker is stopped</source> - <translation>Seleccionar para guardar automáticamente cuando un tracker es detenido</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to save automatically whenever a tracker is stopped</source> + <translation>Seleccionar para guardar automáticamente cuando un tracker es detenido</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="78"/> - <source>Auto Save Enabled</source> - <translation>Auto Guardar Habilitado</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Auto Save Enabled</source> + <translation>Auto Guardar Habilitado</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="85"/> - <source>Select to allow multiple entries with the same start date and time</source> - <translation>Seleccionar para permitir múltiples entradas con la misma hora y fecha de inicio</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to allow multiple entries with the same start date and time</source> + <translation>Seleccionar para permitir múltiples entradas con la misma hora y fecha de inicio</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="88"/> - <source>Allow entries with identical start date and time</source> - <translation>Permitir entradas con fecha y hora de inicio idénticos</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Allow entries with identical start date and time</source> + <translation>Permitir entradas con fecha y hora de inicio idénticos</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPlugin</name> <message> - <location filename="../../PluginTimeTracker.py" line="75"/> - <source>Time Tracker</source> - <translation>Time Tracker</translation> + <location filename="../../PluginTimeTracker.py" line="69" /> + <source>Time Tracker</source> + <translation>Time Tracker</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerWidget</name> <message> - <location filename="../TimeTrackerWidget.ui" line="22"/> - <source>Start Date/Time:</source> - <translation>Fecha/Hora Inicio:</translation> + <location filename="../TimeTrackerWidget.py" line="349" /> + <location filename="../TimeTrackerWidget.py" line="206" /> + <location filename="../TimeTrackerWidget.py" line="114" /> + <location filename="../TimeTrackerWidget.py" line="97" /> + <source>{0} min</source> + <translation>{0} min</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="29"/> - <source>Duration:</source> - <translation>Duración:</translation> - </message> - <message> - <location filename="../TimeTrackerWidget.ui" line="36"/> - <source>Task:</source> - <translation>Tarea:</translation> + <location filename="../TimeTrackerWidget.py" line="134" /> + <source>Edit</source> + <translation>Editar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="43"/> - <source>Comment:</source> - <translation>Comentario:</translation> + <location filename="../TimeTrackerWidget.py" line="140" /> + <source>Add</source> + <translation>Añadir</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="53"/> - <source>Shows the start date and time of the current timer</source> - <translation>Muestra la fecha y tiempo de inicio del temporizador actual</translation> + <location filename="../TimeTrackerWidget.py" line="141" /> + <source>Delete</source> + <translation>Borrar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="59"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation>yyyy-MM-dd HH:mm:ss</translation> + <location filename="../TimeTrackerWidget.py" line="149" /> + <source>Save</source> + <translation>Guardar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="72"/> - <source>Shows the duration of the current timer</source> - <translation>Muestra la duración del temporizador actual</translation> + <location filename="../TimeTrackerWidget.py" line="151" /> + <source>Import</source> + <translation>Importar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="81"/> - <source> min</source> - <translation> min</translation> + <location filename="../TimeTrackerWidget.py" line="152" /> + <source>Export Selected</source> + <translation>Exportar seleccionados</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.py" line="155" /> + <source>Export All</source> + <translation>Exportar Todos</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="97"/> - <source>Enter the task description for the current timer</source> - <translation>Introducir la descripción de la tarea para el temporizador actual</translation> + <location filename="../TimeTrackerWidget.py" line="157" /> + <source>Remove duplicates</source> + <translation>Eliminar duplicados</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="113"/> - <source>Enter a comment for the current timer</source> - <translation>Introducir un comentario para el temporizador actual</translation> + <location filename="../TimeTrackerWidget.py" line="158" /> + <source>Merge duplicates</source> + <translation>Combinar duplicados</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="140"/> - <source>Press to pause the current timer</source> - <translation>Pulsar para poner el temporizador actual en pausa</translation> + <location filename="../TimeTrackerWidget.py" line="347" /> + <location filename="../TimeTrackerWidget.py" line="203" /> + <source>{0}, {1}</source> + <comment>date, time</comment> + <translation>{0}, {1}</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="143"/> - <source>Pause</source> - <translation>Pausa</translation> + <location filename="../TimeTrackerWidget.py" line="217" /> + <source>Delete Selected Entries</source> + <translation>Borrar Entradas Seleccionadas</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="153"/> - <source>Press to end the current timer and start a new one</source> - <translation>Pulsar para finalizar el temporizador actual e iniciar uno nuevo</translation> + <location filename="../TimeTrackerWidget.py" line="218" /> + <source>Do you really want to delete the selected entries?</source> + <translation>¿Desea realmente eliminar las entradas seleccionadas?</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="156"/> - <source>End Current Timer and Start a New Timer</source> - <translation>Finalizar Temporizador Actual e Iniciar Uno Nuevo</translation> + <location filename="../TimeTrackerWidget.py" line="254" /> + <location filename="../TimeTrackerWidget.py" line="246" /> + <source>Import Time Tracker Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="200"/> - <source>Start Date/Time</source> - <translation>Fecha/Hora Inicio</translation> + <location filename="../TimeTrackerWidget.py" line="276" /> + <location filename="../TimeTrackerWidget.py" line="248" /> + <source>Time Tracker Files (*.ttj);;All Files (*)</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="205"/> - <source>Duration</source> - <translation>Duración</translation> + <location filename="../TimeTrackerWidget.py" line="255" /> + <source><p>The file <b>{0}</b> does not exist.</p></source> + <translation><p>El archivo <b>{0}</b> no existe.</p></translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="210"/> - <source>Task</source> - <translation>Tarea</translation> + <location filename="../TimeTrackerWidget.py" line="288" /> + <location filename="../TimeTrackerWidget.py" line="274" /> + <source>Export Time Tracker Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="215"/> - <source>Comment</source> - <translation>Comentario</translation> + <location filename="../TimeTrackerWidget.py" line="289" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>El archivo <b>{0}</b> ya existe.¿Sobreescribirlo?</p></translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0} min</source> - <translation>{0} min</translation> + <location filename="../TimeTrackerWidget.py" line="316" /> + <source>Remove Duplicate Tracker Entries</source> + <translation>Eliminar Entradas de Tracker Duplicadas</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="129"/> - <source>Edit</source> - <translation>Editar</translation> + <location filename="../TimeTrackerWidget.py" line="317" /> + <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> + <translation>¿Está seguro de que desea eliminar las entradas de tracker duplicadas? Solamente la de mayor duración será conservada.</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="134"/> - <source>Add</source> - <translation>Añadir</translation> + <location filename="../TimeTrackerWidget.py" line="329" /> + <source>Merge Duplicate Tracker Entries</source> + <translation>Combinar Entradas de Tracker Duplicadas</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="135"/> - <source>Delete</source> - <translation>Borrar</translation> + <location filename="../TimeTrackerWidget.py" line="330" /> + <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> + <translation>¿Está seguro de que desea combinar las entradas de tracker duplicadas? Las duraciones de las duplicadas serán sumadas.</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="142"/> - <source>Save</source> - <translation>Guardar</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time:</source> + <translation>Fecha/Hora Inicio:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="144"/> - <source>Import</source> - <translation>Importar</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration:</source> + <translation>Duración:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="145"/> - <source>Export Selected</source> - <translation>Exportar seleccionados</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task:</source> + <translation>Tarea:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="148"/> - <source>Export All</source> - <translation>Exportar Todos</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment:</source> + <translation>Comentario:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="150"/> - <source>Remove duplicates</source> - <translation>Eliminar duplicados</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the start date and time of the current timer</source> + <translation>Muestra la fecha y tiempo de inicio del temporizador actual</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="151"/> - <source>Merge duplicates</source> - <translation>Combinar duplicados</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation>yyyy-MM-dd HH:mm:ss</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0}, {1}</source> - <comment>date, time</comment> - <translation>{0}, {1}</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the duration of the current timer</source> + <translation>Muestra la duración del temporizador actual</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Delete Selected Entries</source> - <translation>Borrar Entradas Seleccionadas</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter the task description for the current timer</source> + <translation>Introducir la descripción de la tarea para el temporizador actual</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Do you really want to delete the selected entries?</source> - <translation>¿Desea realmente eliminar las entradas seleccionadas?</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter a comment for the current timer</source> + <translation>Introducir un comentario para el temporizador actual</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source>Import Tracker Entries</source> - <translation>Importar Entradas de Tracker</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to pause the current timer</source> + <translation>Pulsar para poner el temporizador actual en pausa</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="268"/> - <source>Text Files (*.txt);;All Files (*)</source> - <translation>Archivos de Texto (*.txt);;Todos los Archivos (*)</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Pause</source> + <translation>Pausa</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source><p>The file <b>{0}</b> does not exist.</p></source> - <translation><p>El archivo <b>{0}</b> no existe.</p></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to end the current timer and start a new one</source> + <translation>Pulsar para finalizar el temporizador actual e iniciar uno nuevo</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>End Current Timer and Start a New Timer</source> + <translation>Finalizar Temporizador Actual e Iniciar Uno Nuevo</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source>Export Tracker Entries</source> - <translation>Exportar Entradas de Tracker</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time</source> + <translation>Fecha/Hora Inicio</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> - <translation><p>El archivo <b>{0}</b> ya existe.¿Sobreescribirlo?</p></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration</source> + <translation>Duración</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Remove Duplicate Tracker Entries</source> - <translation>Eliminar Entradas de Tracker Duplicadas</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task</source> + <translation>Tarea</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> - <translation>¿Está seguro de que desea eliminar las entradas de tracker duplicadas? Solamente la de mayor duración será conservada.</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment</source> + <translation>Comentario</translation> + </message> + <message> + <source>Import Tracker Entries</source> + <translation type="vanished">Importar Entradas de Tracker</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Merge Duplicate Tracker Entries</source> - <translation>Combinar Entradas de Tracker Duplicadas</translation> + <source>Text Files (*.txt);;All Files (*)</source> + <translation type="vanished">Archivos de Texto (*.txt);;Todos los Archivos (*)</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> - <translation>¿Está seguro de que desea combinar las entradas de tracker duplicadas? Las duraciones de las duplicadas serán sumadas.</translation> + <source>Export Tracker Entries</source> + <translation type="vanished">Exportar Entradas de Tracker</translation> </message> -</context> + </context> </TS>
--- a/TimeTracker/i18n/timetracker_pt.ts Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/i18n/timetracker_pt.ts Fri Jun 04 16:40:54 2021 +0200 @@ -1,414 +1,427 @@ <?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS><TS version="2.0" language="pt" sourcelanguage=""> -<context> +<!DOCTYPE TS> +<TS version="2.1" language="pt"> + <context> <name>TimeTracker</name> <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Time Tracker</source> - <translation>Rastreador de Tempo</translation> + <location filename="../TimeTracker.py" line="78" /> + <location filename="../TimeTracker.py" line="75" /> + <source>Time Tracker</source> + <translation>Rastreador de Tempo</translation> </message> <message> - <location filename="../TimeTracker.py" line="165"/> - <source>Read Time Tracker File</source> - <translation>Ler Ficheiro do Rastreador de Tempo</translation> - </message> - <message> - <location filename="../TimeTracker.py" line="213"/> - <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> - <translation><p>O ficheiro do rastreador de tempo <b>{0}</b> não se pôde ler.</p><p>Motivo: {1}</p></translation> + <location filename="../TimeTracker.py" line="79" /> + <source>T&ime Tracker</source> + <translation>Rastrea&dor de Tempo</translation> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source>Save Time Tracker File</source> - <translation>Gravar Ficheiro do Rastreador de Tempo</translation> + <location filename="../TimeTracker.py" line="80" /> + <source>Alt+Shift+I</source> + <translation>Alt+Shift+I</translation> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> - <translation><p>O ficheiro <b>{0}</b> do rastreador de tempo não se pôde guardar.</p><p>Motivo: {1}</p></translation> + <location filename="../TimeTracker.py" line="83" /> + <source>Switch the input focus to the Time Tracker window.</source> + <translation>Mudar o foco de entrada à janela do Rastreador de Tempo.</translation> </message> <message> - <location filename="../TimeTracker.py" line="276"/> - <source>Import Time Tracker File</source> - <translation>Importar Ficheiro do Rastreador de Tempo</translation> + <location filename="../TimeTracker.py" line="85" /> + <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> + <translation><b>Ativar Rastreador de Tempo</b><p>Muda o foco de entrada à janela do Rastreador de Tempo.</p></translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="269"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> - <translation> - <numerusform><p>O ficheiro <b>{0}</b> do rastreador de tempo tem uma entrada inválida.</numerusform> - <numerusform><p>O ficheiro <b>{0}</b> do rastreador de tempo tem %n entradas inválidas.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="168" /> + <location filename="../TimeTracker.py" line="148" /> + <source>Read Time Tracker File</source> + <translation>Ler Ficheiro do Rastreador de Tempo</translation> + </message> + <message> + <location filename="../TimeTracker.py" line="217" /> + <location filename="../TimeTracker.py" line="149" /> + <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> + <translation><p>O ficheiro do rastreador de tempo <b>{0}</b> não se pôde ler.</p><p>Motivo: {1}</p></translation> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="264"/> - <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> - <translation> - <numerusform><p>O ficheiro <b>{0}</b> do rastreador de tempo tem uma entrada repetida.</numerusform> - <numerusform><p>O ficheiro <b>{0}</b> dorastreador de tempo tem %n entradas repetidas.</numerusform> - </translation> + <location filename="../TimeTracker.py" line="169" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> + <translation> + <numerusform><p>O ficheiro <b>{0}</b> do rastreador de tempo tem uma entrada inválida. Foi descartada.</p></numerusform> + <numerusform><p>O ficheiro <b>{0}</b> tem %n entradas inválidas. Foram descartadas.</p></numerusform> + </translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="165"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> - <translation> - <numerusform><p>O ficheiro <b>{0}</b> do rastreador de tempo tem uma entrada inválida. Foi descartada.</p></numerusform> - <numerusform><p>O ficheiro <b>{0}</b> tem %n entradas inválidas. Foram descartadas.</p></numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="198" /> + <source>Save Time Tracker File</source> + <translation>Gravar Ficheiro do Rastreador de Tempo</translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="260"/> - <source> %n duplicate entries were detected.</source> - <translation> - <numerusform> detectada uma entrada repetida.</numerusform> - <numerusform> detectadas %n entradas repetidas.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="199" /> + <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> + <translation><p>O ficheiro <b>{0}</b> do rastreador de tempo não se pôde guardar.</p><p>Motivo: {1}</p></translation> + </message> + <message> + <location filename="../TimeTracker.py" line="280" /> + <location filename="../TimeTracker.py" line="216" /> + <source>Import Time Tracker File</source> + <translation>Importar Ficheiro do Rastreador de Tempo</translation> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="273"/> - <source> %n entries have been ignored.</p></source> - <translation> - <numerusform> foi ignorada uma entrada.</p></numerusform> - <numerusform> foram ignoradas %n entradas.</p></numerusform> - </translation> + <location filename="../TimeTracker.py" line="271" /> + <location filename="../TimeTracker.py" line="258" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> + <translation> + <numerusform><p>O ficheiro <b>{0}</b> do rastreador de tempo tem uma entrada inválida.</numerusform> + <numerusform><p>O ficheiro <b>{0}</b> do rastreador de tempo tem %n entradas inválidas.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>T&ime Tracker</source> - <translation>Rastrea&dor de Tempo</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="262" /> + <source> %n duplicate entries were detected.</source> + <translation> + <numerusform> detectada uma entrada repetida.</numerusform> + <numerusform> detectadas %n entradas repetidas.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Alt+Shift+I</source> - <translation>Alt+Shift+I</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="266" /> + <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> + <translation> + <numerusform><p>O ficheiro <b>{0}</b> do rastreador de tempo tem uma entrada repetida.</numerusform> + <numerusform><p>O ficheiro <b>{0}</b> dorastreador de tempo tem %n entradas repetidas.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="82"/> - <source>Switch the input focus to the Time Tracker window.</source> - <translation>Mudar o foco de entrada à janela do Rastreador de Tempo.</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="275" /> + <source> %n entries have been ignored.</p></source> + <translation> + <numerusform> foi ignorada uma entrada.</p></numerusform> + <numerusform> foram ignoradas %n entradas.</p></numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="84"/> - <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> - <translation><b>Ativar Rastreador de Tempo</b><p>Muda o foco de entrada à janela do Rastreador de Tempo.</p></translation> - </message> -</context> -<context> + </context> + <context> <name>TimeTrackerEntryDialog</name> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="14"/> - <source>Edit Timer Entry</source> - <translation>Editar Entrada do Temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit Timer Entry</source> + <translation>Editar Entrada do Temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="25"/> - <source>Start Date/Time:</source> - <translation>Data/Hora de Inicio:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Start Date/Time:</source> + <translation>Data/Hora de Inicio:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="32"/> - <source>Edit the start date and time of the timer</source> - <translation>Editar a data e hora de inicio do temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the start date and time of the timer</source> + <translation>Editar a data e hora de inicio do temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="35"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation>dd-MM-yyyy HH:mm:ss</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation>dd-MM-yyyy HH:mm:ss</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="58"/> - <source>Duration:</source> - <translation>Duração:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Duration:</source> + <translation>Duração:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="65"/> - <source>Edit the duration of the timer</source> - <translation>Editar a duração do temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the duration of the timer</source> + <translation>Editar a duração do temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="71"/> - <source> min</source> - <translation> min</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="94"/> - <source>Task:</source> - <translation>Tarefa:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Task:</source> + <translation>Tarefa:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="107"/> - <source>Enter the task description for the timer</source> - <translation>Introduzir descrição da tarefa para o temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter the task description for the timer</source> + <translation>Introduzir descrição da tarefa para o temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="117"/> - <source>Comment:</source> - <translation>Comentário:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Comment:</source> + <translation>Comentário:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="130"/> - <source>Enter a comment for the timer</source> - <translation>Introduzir um comentário para o temporizador</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter a comment for the timer</source> + <translation>Introduzir um comentário para o temporizador</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.py" line="49"/> - <source>Add Tracker Entry</source> - <translation>Adicionar entrada de rastreio</translation> + <location filename="../TimeTrackerEntryDialog.py" line="55" /> + <source>Add Tracker Entry</source> + <translation>Adicionar entrada de rastreio</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPage</name> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="17"/> - <source><b>Configure Time Tracker</b></source> - <translation><b>Configurar Rastreador de Tempo</b></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source><b>Configure Time Tracker</b></source> + <translation><b>Configurar Rastreador de Tempo</b></translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="39"/> - <source>Minimum Duration:</source> - <translation>Duração Mínima:</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Minimum Duration:</source> + <translation>Duração Mínima:</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="46"/> - <source>Enter the value of the minimum duration for a valid tracker entry</source> - <translation>Introduzir o valor da duração mínima para uma entrada válida do rastreador</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Enter the value of the minimum duration for a valid tracker entry</source> + <translation>Introduzir o valor da duração mínima para uma entrada válida do rastreador</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="49"/> - <source> min</source> - <translation> min</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="75"/> - <source>Select to save automatically whenever a tracker is stopped</source> - <translation>Selecioar para gravar automaticamente quando o rastreador esteja parado</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to save automatically whenever a tracker is stopped</source> + <translation>Selecioar para gravar automaticamente quando o rastreador esteja parado</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="78"/> - <source>Auto Save Enabled</source> - <translation>Autogravar Habilitado</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Auto Save Enabled</source> + <translation>Autogravar Habilitado</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="85"/> - <source>Select to allow multiple entries with the same start date and time</source> - <translation>Selecionar para permitir múltiplas entradas com a mesma data e hora</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to allow multiple entries with the same start date and time</source> + <translation>Selecionar para permitir múltiplas entradas com a mesma data e hora</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="88"/> - <source>Allow entries with identical start date and time</source> - <translation>Permitir entradas com data e hora de inicio identicas</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Allow entries with identical start date and time</source> + <translation>Permitir entradas com data e hora de inicio identicas</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPlugin</name> <message> - <location filename="../../PluginTimeTracker.py" line="75"/> - <source>Time Tracker</source> - <translation>Rastreador de Tempo</translation> + <location filename="../../PluginTimeTracker.py" line="69" /> + <source>Time Tracker</source> + <translation>Rastreador de Tempo</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerWidget</name> <message> - <location filename="../TimeTrackerWidget.ui" line="22"/> - <source>Start Date/Time:</source> - <translation>Data/Hora de Inicio:</translation> + <location filename="../TimeTrackerWidget.py" line="349" /> + <location filename="../TimeTrackerWidget.py" line="206" /> + <location filename="../TimeTrackerWidget.py" line="114" /> + <location filename="../TimeTrackerWidget.py" line="97" /> + <source>{0} min</source> + <translation>{0} min</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="29"/> - <source>Duration:</source> - <translation>Duração:</translation> - </message> - <message> - <location filename="../TimeTrackerWidget.ui" line="36"/> - <source>Task:</source> - <translation>Tarefa:</translation> + <location filename="../TimeTrackerWidget.py" line="134" /> + <source>Edit</source> + <translation>Editar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="43"/> - <source>Comment:</source> - <translation>Comentário:</translation> + <location filename="../TimeTrackerWidget.py" line="140" /> + <source>Add</source> + <translation>Adicionar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="53"/> - <source>Shows the start date and time of the current timer</source> - <translation>Mostra a data e hora de inicio do temporizador atual</translation> + <location filename="../TimeTrackerWidget.py" line="141" /> + <source>Delete</source> + <translation>Apagar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="59"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation>dd-MM-yyyy HH:mm:ss</translation> + <location filename="../TimeTrackerWidget.py" line="149" /> + <source>Save</source> + <translation>Gravar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="72"/> - <source>Shows the duration of the current timer</source> - <translation>Mostra a duração do temporizador atual</translation> + <location filename="../TimeTrackerWidget.py" line="151" /> + <source>Import</source> + <translation>Importar</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="81"/> - <source> min</source> - <translation> min</translation> + <location filename="../TimeTrackerWidget.py" line="152" /> + <source>Export Selected</source> + <translation>Exportar Selecionados</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.py" line="155" /> + <source>Export All</source> + <translation>Exportar Todos</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="97"/> - <source>Enter the task description for the current timer</source> - <translation>Introduzir a descrição da tarefa para o temporizador atual</translation> + <location filename="../TimeTrackerWidget.py" line="157" /> + <source>Remove duplicates</source> + <translation>Retirar repetidos</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="113"/> - <source>Enter a comment for the current timer</source> - <translation>Introduzir um comentário para o temporizador atual</translation> + <location filename="../TimeTrackerWidget.py" line="158" /> + <source>Merge duplicates</source> + <translation>Mesclar repetidos</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="140"/> - <source>Press to pause the current timer</source> - <translation>Pressionar para pausar o temporizador atual</translation> + <location filename="../TimeTrackerWidget.py" line="347" /> + <location filename="../TimeTrackerWidget.py" line="203" /> + <source>{0}, {1}</source> + <comment>date, time</comment> + <translation>{0}, {1}</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="143"/> - <source>Pause</source> - <translation>Pausa</translation> + <location filename="../TimeTrackerWidget.py" line="217" /> + <source>Delete Selected Entries</source> + <translation>Apagar Entradas Selecionadas</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="153"/> - <source>Press to end the current timer and start a new one</source> - <translation>Pressionar para terminar o temporizador atual e iniciar um novo</translation> + <location filename="../TimeTrackerWidget.py" line="218" /> + <source>Do you really want to delete the selected entries?</source> + <translation>Tem a certeza de que quer apagar as entradas selecionadas?</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="156"/> - <source>End Current Timer and Start a New Timer</source> - <translation>Terminar Temporizador Atual e Iniciar Novo Temporizador</translation> + <location filename="../TimeTrackerWidget.py" line="254" /> + <location filename="../TimeTrackerWidget.py" line="246" /> + <source>Import Time Tracker Entries</source> + <translation>Importar Entradas do Rastreador</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="200"/> - <source>Start Date/Time</source> - <translation>Data/Hora de Inicio</translation> + <location filename="../TimeTrackerWidget.py" line="276" /> + <location filename="../TimeTrackerWidget.py" line="248" /> + <source>Time Tracker Files (*.ttj);;All Files (*)</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="205"/> - <source>Duration</source> - <translation>Duração</translation> + <location filename="../TimeTrackerWidget.py" line="255" /> + <source><p>The file <b>{0}</b> does not exist.</p></source> + <translation><p>O ficheiro <b>{0}</b> não existe.</p></translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="210"/> - <source>Task</source> - <translation>Tarefa</translation> + <location filename="../TimeTrackerWidget.py" line="288" /> + <location filename="../TimeTrackerWidget.py" line="274" /> + <source>Export Time Tracker Entries</source> + <translation>Exportar Entradas do Rastreador</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="215"/> - <source>Comment</source> - <translation>Comentário</translation> - </message> - <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0} min</source> - <translation>{0} min</translation> + <location filename="../TimeTrackerWidget.py" line="289" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>Já existe o ficheiro <b>{0}</b>. Sobreescrever-lo?</p></translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="129"/> - <source>Edit</source> - <translation>Editar</translation> + <location filename="../TimeTrackerWidget.py" line="316" /> + <source>Remove Duplicate Tracker Entries</source> + <translation>Retirar Entradas do Rastreador Repetidas</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="134"/> - <source>Add</source> - <translation>Adicionar</translation> + <location filename="../TimeTrackerWidget.py" line="317" /> + <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> + <translation>Tem a certeza de que quer retirar as entradas repetidas do rastreador ? Apenas a que tenha a maior duração será mantida.</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="135"/> - <source>Delete</source> - <translation>Apagar</translation> + <location filename="../TimeTrackerWidget.py" line="329" /> + <source>Merge Duplicate Tracker Entries</source> + <translation>Mesclar Entradas do Rastreador Repetidas</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="142"/> - <source>Save</source> - <translation>Gravar</translation> + <location filename="../TimeTrackerWidget.py" line="330" /> + <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> + <translation>Tem a certeza de que quer mesclar as entradas repetidas do rastreador? As durações das repetidas serão adicionadas.</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="144"/> - <source>Import</source> - <translation>Importar</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time:</source> + <translation>Data/Hora de Inicio:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="145"/> - <source>Export Selected</source> - <translation>Exportar Selecionados</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration:</source> + <translation>Duração:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="148"/> - <source>Export All</source> - <translation>Exportar Todos</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task:</source> + <translation>Tarefa:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="150"/> - <source>Remove duplicates</source> - <translation>Retirar repetidos</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment:</source> + <translation>Comentário:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="151"/> - <source>Merge duplicates</source> - <translation>Mesclar repetidos</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the start date and time of the current timer</source> + <translation>Mostra a data e hora de inicio do temporizador atual</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0}, {1}</source> - <comment>date, time</comment> - <translation>{0}, {1}</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation>dd-MM-yyyy HH:mm:ss</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the duration of the current timer</source> + <translation>Mostra a duração do temporizador atual</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Delete Selected Entries</source> - <translation>Apagar Entradas Selecionadas</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source> min</source> + <translation> min</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Do you really want to delete the selected entries?</source> - <translation>Tem a certeza de que quer apagar as entradas selecionadas?</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter the task description for the current timer</source> + <translation>Introduzir a descrição da tarefa para o temporizador atual</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source>Import Tracker Entries</source> - <translation>Importar Entradas do Rastreador</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter a comment for the current timer</source> + <translation>Introduzir um comentário para o temporizador atual</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="268"/> - <source>Text Files (*.txt);;All Files (*)</source> - <translation>Ficheiros de Texto (*.txt);;Ficheiros Todos (*)</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to pause the current timer</source> + <translation>Pressionar para pausar o temporizador atual</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source><p>The file <b>{0}</b> does not exist.</p></source> - <translation><p>O ficheiro <b>{0}</b> não existe.</p></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Pause</source> + <translation>Pausa</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source>Export Tracker Entries</source> - <translation>Exportar Entradas do Rastreador</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to end the current timer and start a new one</source> + <translation>Pressionar para terminar o temporizador atual e iniciar um novo</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> - <translation><p>Já existe o ficheiro <b>{0}</b>. Sobreescrever-lo?</p></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>End Current Timer and Start a New Timer</source> + <translation>Terminar Temporizador Atual e Iniciar Novo Temporizador</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Remove Duplicate Tracker Entries</source> - <translation>Retirar Entradas do Rastreador Repetidas</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time</source> + <translation>Data/Hora de Inicio</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> - <translation>Tem a certeza de que quer retirar as entradas repetidas do rastreador ? Apenas a que tenha a maior duração será mantida.</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration</source> + <translation>Duração</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Merge Duplicate Tracker Entries</source> - <translation>Mesclar Entradas do Rastreador Repetidas</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task</source> + <translation>Tarefa</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> - <translation>Tem a certeza de que quer mesclar as entradas repetidas do rastreador? As durações das repetidas serão adicionadas.</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment</source> + <translation>Comentário</translation> </message> -</context> + </context> </TS>
--- a/TimeTracker/i18n/timetracker_ru.ts Thu Jun 03 18:02:18 2021 +0200 +++ b/TimeTracker/i18n/timetracker_ru.ts Fri Jun 04 16:40:54 2021 +0200 @@ -1,419 +1,444 @@ <?xml version="1.0" encoding="utf-8"?> -<!DOCTYPE TS><TS version="2.0" language="ru" sourcelanguage=""> -<context> +<!DOCTYPE TS> +<TS version="2.0" language="ru" sourcelanguage=""> + <context> <name>TimeTracker</name> <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Time Tracker</source> - <translation>Time Tracker</translation> + <location filename="../TimeTracker.py" line="78" /> + <location filename="../TimeTracker.py" line="75" /> + <source>Time Tracker</source> + <translation>Time Tracker</translation> </message> <message> - <location filename="../TimeTracker.py" line="165"/> - <source>Read Time Tracker File</source> - <translation>Чтение файла Time Tracker</translation> - </message> - <message> - <location filename="../TimeTracker.py" line="213"/> - <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> - <translation><p>Файл трекера <b>{0}</b> не может быть прочитан.</p><p>Причина: {1}</p></translation> + <location filename="../TimeTracker.py" line="79" /> + <source>T&ime Tracker</source> + <translation>T&ime Tracker</translation> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source>Save Time Tracker File</source> - <translation>Сохранение файла Time Tracker</translation> + <location filename="../TimeTracker.py" line="80" /> + <source>Alt+Shift+I</source> + <translation>Alt+Shift+I</translation> </message> <message> - <location filename="../TimeTracker.py" line="195"/> - <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> - <translation><p>Файл трекера <b>{0}</b>не может быть сохранен.</p><p>Причина: {1}</p></translation> + <location filename="../TimeTracker.py" line="83" /> + <source>Switch the input focus to the Time Tracker window.</source> + <translation>Переключить фокус ввода в окно Time Tracker.</translation> </message> <message> - <location filename="../TimeTracker.py" line="276"/> - <source>Import Time Tracker File</source> - <translation>Импорт файла Time Tracker</translation> + <location filename="../TimeTracker.py" line="85" /> + <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> + <translation><b>Активация Time Tracker</b><p>Переключение фокуса ввода в окно Time Tracker.</p></translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="269"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> - <translation> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительную запись.</numerusform> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительные записи.</numerusform> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительных записей.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="168" /> + <location filename="../TimeTracker.py" line="148" /> + <source>Read Time Tracker File</source> + <translation>Чтение файла Time Tracker</translation> + </message> + <message> + <location filename="../TimeTracker.py" line="217" /> + <location filename="../TimeTracker.py" line="149" /> + <source><p>The time tracker file <b>{0}</b> could not be read.</p><p>Reason: {1}</p></source> + <translation><p>Файл трекера <b>{0}</b> не может быть прочитан.</p><p>Причина: {1}</p></translation> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="264"/> - <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> - <translation> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n дублирующую запись.</numerusform> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n дублирующие записи.</numerusform> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n дублирующих записей.</numerusform> - </translation> + <location filename="../TimeTracker.py" line="169" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> + <translation> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительную запись. Она была отброшена.</p></numerusform> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительные записи. Они были отброшены.</p></numerusform> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительных записей. Они были отброшены.</p></numerusform> + </translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="165"/> - <source><p>The time tracker file <b>{0}</b> contained %n invalid entries. These have been discarded.</p></source> - <translation> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительную запись. Она была отброшена.</p></numerusform> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительные записи. Они были отброшены.</p></numerusform> - <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительных записей. Они были отброшены.</p></numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="198" /> + <source>Save Time Tracker File</source> + <translation>Сохранение файла Time Tracker</translation> </message> - <message numerus="yes"> - <location filename="../TimeTracker.py" line="260"/> - <source> %n duplicate entries were detected.</source> - <translation> - <numerusform> Была определена %n дублирующая запись.</numerusform> - <numerusform> Были определены %n дублирующие записи.</numerusform> - <numerusform> Были определены %n дублирующих записей.</numerusform> - </translation> + <message> + <location filename="../TimeTracker.py" line="199" /> + <source><p>The time tracker file <b>{0}</b> could not be saved.</p><p>Reason: {1}</p></source> + <translation><p>Файл трекера <b>{0}</b>не может быть сохранен.</p><p>Причина: {1}</p></translation> + </message> + <message> + <location filename="../TimeTracker.py" line="280" /> + <location filename="../TimeTracker.py" line="216" /> + <source>Import Time Tracker File</source> + <translation>Импорт файла Time Tracker</translation> </message> <message numerus="yes"> - <location filename="../TimeTracker.py" line="273"/> - <source> %n entries have been ignored.</p></source> - <translation> - <numerusform> Была проигнорирована %n запись.</p></numerusform> - <numerusform> Были проигнорированы %n записи.</p></numerusform> - <numerusform> Были проигнорированы %n записей.</p></numerusform> - </translation> + <location filename="../TimeTracker.py" line="271" /> + <location filename="../TimeTracker.py" line="258" /> + <source><p>The time tracker file <b>{0}</b> contained %n invalid entries.</source> + <translation> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительную запись.</numerusform> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительные записи.</numerusform> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n недействительных записей.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>T&ime Tracker</source> - <translation>T&ime Tracker</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="262" /> + <source> %n duplicate entries were detected.</source> + <translation> + <numerusform> Была определена %n дублирующая запись.</numerusform> + <numerusform> Были определены %n дублирующие записи.</numerusform> + <numerusform> Были определены %n дублирующих записей.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="76"/> - <source>Alt+Shift+I</source> - <translation>Alt+Shift+I</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="266" /> + <source><p>The time tracker file <b>{0}</b> contained %n duplicate entries.</source> + <translation> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n дублирующую запись.</numerusform> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n дублирующие записи.</numerusform> + <numerusform><p>Файл трекера <b>{0}</b> содержит %n дублирующих записей.</numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="82"/> - <source>Switch the input focus to the Time Tracker window.</source> - <translation>Переключить фокус ввода в окно Time Tracker.</translation> + <message numerus="yes"> + <location filename="../TimeTracker.py" line="275" /> + <source> %n entries have been ignored.</p></source> + <translation> + <numerusform> Была проигнорирована %n запись.</p></numerusform> + <numerusform> Были проигнорированы %n записи.</p></numerusform> + <numerusform> Были проигнорированы %n записей.</p></numerusform> + </translation> </message> - <message> - <location filename="../TimeTracker.py" line="84"/> - <source><b>Activate Time Tracker</b><p>This switches the input focus to the Time Tracker window.</p></source> - <translation><b>Активация Time Tracker</b><p>Переключение фокуса ввода в окно Time Tracker.</p></translation> - </message> -</context> -<context> + </context> + <context> <name>TimeTrackerEntryDialog</name> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="14"/> - <source>Edit Timer Entry</source> - <translation>Править запись таймера</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit Timer Entry</source> + <translation>Править запись таймера</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="25"/> - <source>Start Date/Time:</source> - <translation>Начальные дата/время:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Start Date/Time:</source> + <translation>Начальные дата/время:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="32"/> - <source>Edit the start date and time of the timer</source> - <translation>Правка начала отсчета даты и времени таймера</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the start date and time of the timer</source> + <translation>Правка начала отсчета даты и времени таймера</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="35"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation>yyyy-MM-dd HH:mm:ss</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation>yyyy-MM-dd HH:mm:ss</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="58"/> - <source>Duration:</source> - <translation>Продолжительность:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Duration:</source> + <translation>Продолжительность:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="65"/> - <source>Edit the duration of the timer</source> - <translation>Правка отсчета таймера</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Edit the duration of the timer</source> + <translation>Правка отсчета таймера</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="71"/> - <source> min</source> - <translation> мин</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source> min</source> + <translation> мин</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="94"/> - <source>Task:</source> - <translation>Задача:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Task:</source> + <translation>Задача:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="107"/> - <source>Enter the task description for the timer</source> - <translation>Введите описание задачи таймера</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter the task description for the timer</source> + <translation>Введите описание задачи таймера</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="117"/> - <source>Comment:</source> - <translation>Комментарий:</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Comment:</source> + <translation>Комментарий:</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.ui" line="130"/> - <source>Enter a comment for the timer</source> - <translation>Введите комментарий для таймера</translation> + <location filename="../TimeTrackerEntryDialog.ui" line="0" /> + <source>Enter a comment for the timer</source> + <translation>Введите комментарий для таймера</translation> </message> <message> - <location filename="../TimeTrackerEntryDialog.py" line="49"/> - <source>Add Tracker Entry</source> - <translation>Добавить запись трекера</translation> + <location filename="../TimeTrackerEntryDialog.py" line="55" /> + <source>Add Tracker Entry</source> + <translation>Добавить запись трекера</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPage</name> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="17"/> - <source><b>Configure Time Tracker</b></source> - <translation><b>Настройка Time Tracker</b></translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source><b>Configure Time Tracker</b></source> + <translation><b>Настройка Time Tracker</b></translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="39"/> - <source>Minimum Duration:</source> - <translation>Минимальная продолжительность:</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Minimum Duration:</source> + <translation>Минимальная продолжительность:</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="46"/> - <source>Enter the value of the minimum duration for a valid tracker entry</source> - <translation>Задайте значение минимальной продолжительности для правильной записи трекера</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Enter the value of the minimum duration for a valid tracker entry</source> + <translation>Задайте значение минимальной продолжительности для правильной записи трекера</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="49"/> - <source> min</source> - <translation> мин</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source> min</source> + <translation> мин</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="75"/> - <source>Select to save automatically whenever a tracker is stopped</source> - <translation>Разрешить автоматическое сохранение при остановке трекера</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to save automatically whenever a tracker is stopped</source> + <translation>Разрешить автоматическое сохранение при остановке трекера</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="78"/> - <source>Auto Save Enabled</source> - <translation>Автосохранение включено</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Auto Save Enabled</source> + <translation>Автосохранение включено</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="85"/> - <source>Select to allow multiple entries with the same start date and time</source> - <translation>Разрешить несколько записей с одинаковой датой и временем запуска</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Select to allow multiple entries with the same start date and time</source> + <translation>Разрешить несколько записей с одинаковой датой и временем запуска</translation> </message> <message> - <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="88"/> - <source>Allow entries with identical start date and time</source> - <translation>Разрешены записи с одинаковыми датой и временем запуска</translation> + <location filename="../ConfigurationPage/TimeTrackerPage.ui" line="0" /> + <source>Allow entries with identical start date and time</source> + <translation>Разрешены записи с одинаковыми датой и временем запуска</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerPlugin</name> <message> - <location filename="../../PluginTimeTracker.py" line="75"/> - <source>Time Tracker</source> - <translation>Time Tracker</translation> + <location filename="../../PluginTimeTracker.py" line="69" /> + <source>Time Tracker</source> + <translation>Time Tracker</translation> </message> -</context> -<context> + </context> + <context> <name>TimeTrackerWidget</name> <message> - <location filename="../TimeTrackerWidget.ui" line="22"/> - <source>Start Date/Time:</source> - <translation>Начальные дата/время:</translation> + <location filename="../TimeTrackerWidget.py" line="349" /> + <location filename="../TimeTrackerWidget.py" line="206" /> + <location filename="../TimeTrackerWidget.py" line="114" /> + <location filename="../TimeTrackerWidget.py" line="97" /> + <source>{0} min</source> + <translation>{0} мин</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="29"/> - <source>Duration:</source> - <translation>Продолжительность:</translation> - </message> - <message> - <location filename="../TimeTrackerWidget.ui" line="36"/> - <source>Task:</source> - <translation>Задача:</translation> + <location filename="../TimeTrackerWidget.py" line="134" /> + <source>Edit</source> + <translation>Править</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="43"/> - <source>Comment:</source> - <translation>Комментарий:</translation> + <location filename="../TimeTrackerWidget.py" line="140" /> + <source>Add</source> + <translation>Добавить</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="53"/> - <source>Shows the start date and time of the current timer</source> - <translation>Дата и время запуска текущего таймера</translation> + <location filename="../TimeTrackerWidget.py" line="141" /> + <source>Delete</source> + <translation>Удалить</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="59"/> - <source>yyyy-MM-dd HH:mm:ss</source> - <translation>yyyy-MM-dd HH:mm:ss</translation> + <location filename="../TimeTrackerWidget.py" line="149" /> + <source>Save</source> + <translation>Сохранить</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="72"/> - <source>Shows the duration of the current timer</source> - <translation>Отсчет текущего таймера</translation> + <location filename="../TimeTrackerWidget.py" line="151" /> + <source>Import</source> + <translation>Импорт</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="81"/> - <source> min</source> - <translation> мин</translation> + <location filename="../TimeTrackerWidget.py" line="152" /> + <source>Export Selected</source> + <translation>Экспорт выбранного</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.py" line="155" /> + <source>Export All</source> + <translation>Экспортировать все</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="97"/> - <source>Enter the task description for the current timer</source> - <translation>Введите описание задачи для текущего таймера</translation> + <location filename="../TimeTrackerWidget.py" line="157" /> + <source>Remove duplicates</source> + <translation>Удалить повторения</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="113"/> - <source>Enter a comment for the current timer</source> - <translation>Введите комментарий для текущего таймера</translation> + <location filename="../TimeTrackerWidget.py" line="158" /> + <source>Merge duplicates</source> + <translation>Объединить повторения</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="140"/> - <source>Press to pause the current timer</source> - <translation>Пауза для текущего таймера</translation> + <location filename="../TimeTrackerWidget.py" line="347" /> + <location filename="../TimeTrackerWidget.py" line="203" /> + <source>{0}, {1}</source> + <comment>date, time</comment> + <translation>{0}, {1}</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="143"/> - <source>Pause</source> - <translation>Пауза</translation> + <location filename="../TimeTrackerWidget.py" line="217" /> + <source>Delete Selected Entries</source> + <translation>Удалить выбранные записи</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="153"/> - <source>Press to end the current timer and start a new one</source> - <translation>Завершение текущего таймера и запуск нового</translation> + <location filename="../TimeTrackerWidget.py" line="218" /> + <source>Do you really want to delete the selected entries?</source> + <translation>Вы действительно хотите удалить выбранные записи?</translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="156"/> - <source>End Current Timer and Start a New Timer</source> - <translation>Останов текущего таймера и запуск нового</translation> + <location filename="../TimeTrackerWidget.py" line="254" /> + <location filename="../TimeTrackerWidget.py" line="246" /> + <source>Import Time Tracker Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="200"/> - <source>Start Date/Time</source> - <translation>Начальные дата/время</translation> + <location filename="../TimeTrackerWidget.py" line="276" /> + <location filename="../TimeTrackerWidget.py" line="248" /> + <source>Time Tracker Files (*.ttj);;All Files (*)</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="205"/> - <source>Duration</source> - <translation>Продолжительность</translation> + <location filename="../TimeTrackerWidget.py" line="255" /> + <source><p>The file <b>{0}</b> does not exist.</p></source> + <translation><p>Файл <b>{0}</b> не существует.</p></translation> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="210"/> - <source>Task</source> - <translation>Задача</translation> + <location filename="../TimeTrackerWidget.py" line="288" /> + <location filename="../TimeTrackerWidget.py" line="274" /> + <source>Export Time Tracker Entries</source> + <translation type="unfinished" /> </message> <message> - <location filename="../TimeTrackerWidget.ui" line="215"/> - <source>Comment</source> - <translation>Комментарий</translation> + <location filename="../TimeTrackerWidget.py" line="289" /> + <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> + <translation><p>Файл <b>{0}</b> уже существует. Переписать его?</p></translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0} min</source> - <translation>{0} мин</translation> + <location filename="../TimeTrackerWidget.py" line="316" /> + <source>Remove Duplicate Tracker Entries</source> + <translation>Удалить повторяющиеся записи трекера</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="129"/> - <source>Edit</source> - <translation>Править</translation> + <location filename="../TimeTrackerWidget.py" line="317" /> + <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> + <translation>Вы действительно хотите удалить повторяющиеся записи трекера? Будет сохранена только одна запись с максимальной продолжительностью.</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="134"/> - <source>Add</source> - <translation>Добавить</translation> + <location filename="../TimeTrackerWidget.py" line="329" /> + <source>Merge Duplicate Tracker Entries</source> + <translation>Объединение повторяющихся записей трекера</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="135"/> - <source>Delete</source> - <translation>Удалить</translation> + <location filename="../TimeTrackerWidget.py" line="330" /> + <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> + <translation>Вы действительно хотите объединить повторяющиеся записи трекера? Будут сложены записи одинаковой продолжительности.</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="142"/> - <source>Save</source> - <translation>Сохранить</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time:</source> + <translation>Начальные дата/время:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="144"/> - <source>Import</source> - <translation>Импорт</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration:</source> + <translation>Продолжительность:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="145"/> - <source>Export Selected</source> - <translation>Экспорт выбранного</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task:</source> + <translation>Задача:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="148"/> - <source>Export All</source> - <translation>Экспортировать все</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment:</source> + <translation>Комментарий:</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="150"/> - <source>Remove duplicates</source> - <translation>Удалить повторения</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the start date and time of the current timer</source> + <translation>Дата и время запуска текущего таймера</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="151"/> - <source>Merge duplicates</source> - <translation>Объединить повторения</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>yyyy-MM-dd HH:mm:ss</source> + <translation>yyyy-MM-dd HH:mm:ss</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="341"/> - <source>{0}, {1}</source> - <comment>date, time</comment> - <translation>{0}, {1}</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Shows the duration of the current timer</source> + <translation>Отсчет текущего таймера</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source> min</source> + <translation> мин</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Delete Selected Entries</source> - <translation>Удалить выбранные записи</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter the task description for the current timer</source> + <translation>Введите описание задачи для текущего таймера</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="212"/> - <source>Do you really want to delete the selected entries?</source> - <translation>Вы действительно хотите удалить выбранные записи?</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Enter a comment for the current timer</source> + <translation>Введите комментарий для текущего таймера</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source>Import Tracker Entries</source> - <translation>Импорт записей трекера</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to pause the current timer</source> + <translation>Пауза для текущего таймера</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="268"/> - <source>Text Files (*.txt);;All Files (*)</source> - <translation>Текстовые файлы (*.txt);;Все файлы (*)</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Pause</source> + <translation>Пауза</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="249"/> - <source><p>The file <b>{0}</b> does not exist.</p></source> - <translation><p>Файл <b>{0}</b> не существует.</p></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Press to end the current timer and start a new one</source> + <translation>Завершение текущего таймера и запуск нового</translation> + </message> + <message> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>End Current Timer and Start a New Timer</source> + <translation>Останов текущего таймера и запуск нового</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source>Export Tracker Entries</source> - <translation>Экспорт записей трекера</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Start Date/Time</source> + <translation>Начальные дата/время</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="282"/> - <source><p>The file <b>{0}</b> already exists. Overwrite it?</p></source> - <translation><p>Файл <b>{0}</b> уже существует. Переписать его?</p></translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Duration</source> + <translation>Продолжительность</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Remove Duplicate Tracker Entries</source> - <translation>Удалить повторяющиеся записи трекера</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Task</source> + <translation>Задача</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="310"/> - <source>Are you sure you want to remove duplicate tracker entries? Only the one with the longest duration will be kept.</source> - <translation>Вы действительно хотите удалить повторяющиеся записи трекера? Будет сохранена только одна запись с максимальной продолжительностью.</translation> + <location filename="../TimeTrackerWidget.ui" line="0" /> + <source>Comment</source> + <translation>Комментарий</translation> + </message> + <message> + <source>Import Tracker Entries</source> + <translation type="vanished">Импорт записей трекера</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Merge Duplicate Tracker Entries</source> - <translation>Объединение повторяющихся записей трекера</translation> + <source>Text Files (*.txt);;All Files (*)</source> + <translation type="vanished">Текстовые файлы (*.txt);;Все файлы (*)</translation> </message> <message> - <location filename="../TimeTrackerWidget.py" line="323"/> - <source>Are you sure you want to merge duplicate tracker entries? The durations of duplicate ones will be added.</source> - <translation>Вы действительно хотите объединить повторяющиеся записи трекера? Будут сложены записи одинаковой продолжительности.</translation> + <source>Export Tracker Entries</source> + <translation type="vanished">Экспорт записей трекера</translation> </message> -</context> + </context> </TS>