Ported the plug-in to PyQt6 for eric7 and adopted it for Pyramid 2.x. eric7

Sun, 06 Jun 2021 16:30:37 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 06 Jun 2021 16:30:37 +0200
branch
eric7
changeset 148
dcbd3a96f03c
parent 147
eb28b4b6f7f5
child 149
da343a43e995

Ported the plug-in to PyQt6 for eric7 and adopted it for Pyramid 2.x.

PKGLIST file | annotate | diff | comparison | revisions
PluginProjectPyramid.py file | annotate | diff | comparison | revisions
PluginProjectPyramid.zip file | annotate | diff | comparison | revisions
PluginPyramid.epj file | annotate | diff | comparison | revisions
ProjectPyramid/CreateParametersDialog.py file | annotate | diff | comparison | revisions
ProjectPyramid/CreateParametersDialog.ui file | annotate | diff | comparison | revisions
ProjectPyramid/DistributionTypeSelectionDialog.py file | annotate | diff | comparison | revisions
ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.PluginProjectPyramid.html file | annotate | diff | comparison | revisions
ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.CreateParametersDialog.html file | annotate | diff | comparison | revisions
ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.MigrateSummaryDialog.html file | annotate | diff | comparison | revisions
ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.Project.html file | annotate | diff | comparison | revisions
ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.PyramidDialog.html file | annotate | diff | comparison | revisions
ProjectPyramid/Documentation/source/index-Plugin_Project_Pyramid.ProjectPyramid.html file | annotate | diff | comparison | revisions
ProjectPyramid/MigrateSummaryDialog.py file | annotate | diff | comparison | revisions
ProjectPyramid/MigrateSummaryDialog.ui file | annotate | diff | comparison | revisions
ProjectPyramid/Project.py file | annotate | diff | comparison | revisions
ProjectPyramid/PyramidDialog.py file | annotate | diff | comparison | revisions
ProjectPyramid/PyramidRoutesDialog.py file | annotate | diff | comparison | revisions
ProjectPyramid/i18n/pyramid_de.qm file | annotate | diff | comparison | revisions
ProjectPyramid/i18n/pyramid_de.ts file | annotate | diff | comparison | revisions
ProjectPyramid/i18n/pyramid_empty.ts file | annotate | diff | comparison | revisions
ProjectPyramid/i18n/pyramid_en.ts file | annotate | diff | comparison | revisions
ProjectPyramid/i18n/pyramid_es.ts file | annotate | diff | comparison | revisions
ProjectPyramid/i18n/pyramid_ru.ts file | annotate | diff | comparison | revisions
--- a/PKGLIST	Tue Jun 01 19:37:46 2021 +0200
+++ b/PKGLIST	Sun Jun 06 16:30:37 2021 +0200
@@ -1,20 +1,46 @@
 PluginProjectPyramid.py
-ProjectPyramid/APIs/Chameleon-2.9.2.api
-ProjectPyramid/APIs/Chameleon-2.9.2.bas
-ProjectPyramid/APIs/Mako-0.7.2.api
-ProjectPyramid/APIs/Mako-0.7.bas
-ProjectPyramid/APIs/MarkupSafe-0.15.api
-ProjectPyramid/APIs/MarkupSafe-0.bas
-ProjectPyramid/APIs/PasteDeploy-1.5.0.api
-ProjectPyramid/APIs/PasteDeploy-1.5.bas
-ProjectPyramid/APIs/Pyramid-1.3.3.api
-ProjectPyramid/APIs/Pyramid-1.3.bas
-ProjectPyramid/APIs/Translationstring-1.1.api
-ProjectPyramid/APIs/Translationstring-1.bas
-ProjectPyramid/APIs/Venusian-1.0a6.api
-ProjectPyramid/APIs/Venusian-1.bas
-ProjectPyramid/APIs/WebOb-1.2.2.api
-ProjectPyramid/APIs/WebOb-1.2.bas
+ProjectPyramid/APIs/Chameleon-3.9.1.api
+ProjectPyramid/APIs/Chameleon-3.9.1.bas
+ProjectPyramid/APIs/Jinja2-3.0.1.api
+ProjectPyramid/APIs/Jinja2-3.0.1.bas
+ProjectPyramid/APIs/Mako-1.1.4.api
+ProjectPyramid/APIs/Mako-1.1.4.bas
+ProjectPyramid/APIs/MarkupSafe-2.0.1.api
+ProjectPyramid/APIs/MarkupSafe-2.0.1.bas
+ProjectPyramid/APIs/PasteDeploy-2.1.1.api
+ProjectPyramid/APIs/PasteDeploy-2.1.1.bas
+ProjectPyramid/APIs/Pyramid-2.0.api
+ProjectPyramid/APIs/Pyramid-2.0.bas
+ProjectPyramid/APIs/PyramidDebugToolbar-4.9.api
+ProjectPyramid/APIs/PyramidDebugToolbar-4.9.bas
+ProjectPyramid/APIs/Pyramid_Chameleon-0.3.api
+ProjectPyramid/APIs/Pyramid_Chameleon-0.3.bas
+ProjectPyramid/APIs/Pyramid_Jinja2-2.8.api
+ProjectPyramid/APIs/Pyramid_Jinja2-2.8.bas
+ProjectPyramid/APIs/Pyramid_Mako-1.1.0.api
+ProjectPyramid/APIs/Pyramid_Mako-1.1.0.bas
+ProjectPyramid/APIs/Pyramid_Retry-2.1.1.api
+ProjectPyramid/APIs/Pyramid_Retry-2.1.1.bas
+ProjectPyramid/APIs/Pyramid_TM-2.4.api
+ProjectPyramid/APIs/Pyramid_TM-2.4.bas
+ProjectPyramid/APIs/Pyramid_ZODBConn-0.8.1.api
+ProjectPyramid/APIs/Pyramid_ZODBConn-0.8.1.bas
+ProjectPyramid/APIs/SQLAlchemy-1.4.17.api
+ProjectPyramid/APIs/SQLAlchemy-1.4.17.bas
+ProjectPyramid/APIs/TranslationString-1.4.api
+ProjectPyramid/APIs/TranslationString-1.4.bas
+ProjectPyramid/APIs/Venusian-3.0.0.api
+ProjectPyramid/APIs/Venusian-3.0.0.bas
+ProjectPyramid/APIs/WebOb-2.0.35.api
+ProjectPyramid/APIs/WebOb-2.0.35.bas
+ProjectPyramid/APIs/ZEO-5.2.2.api
+ProjectPyramid/APIs/ZEO-5.2.2.bas
+ProjectPyramid/APIs/ZODB-5.6.0.api
+ProjectPyramid/APIs/ZODB-5.6.0.bas
+ProjectPyramid/APIs/ZODBPickle-2.0.0.api
+ProjectPyramid/APIs/ZODBPickle-2.0.0.bas
+ProjectPyramid/APIs/ZODBUri-2.5.0.api
+ProjectPyramid/APIs/ZODBUri-2.5.0.bas
 ProjectPyramid/ConfigurationPage/PyramidPage.py
 ProjectPyramid/ConfigurationPage/PyramidPage.ui
 ProjectPyramid/ConfigurationPage/__init__.py
@@ -25,6 +51,8 @@
 ProjectPyramid/Documentation/LICENSE.GPL3
 ProjectPyramid/FormSelectionDialog.py
 ProjectPyramid/FormSelectionDialog.ui
+ProjectPyramid/MigrateSummaryDialog.py
+ProjectPyramid/MigrateSummaryDialog.ui
 ProjectPyramid/Project.py
 ProjectPyramid/PyramidDialog.py
 ProjectPyramid/PyramidDialog.ui
--- a/PluginProjectPyramid.py	Tue Jun 01 19:37:46 2021 +0200
+++ b/PluginProjectPyramid.py	Sun Jun 06 16:30:37 2021 +0200
@@ -435,3 +435,16 @@
             return list(self.__menus.keys())
         else:
             return []
+
+
+def installDependencies(pipInstall):
+    """
+    Function to install dependencies of this plug-in.
+    
+    @param pipInstall function to be called with a list of package names.
+    @type function
+    """
+    try:
+        import cookiecutter         # __IGNORE_WARNING__
+    except ImportError:
+        pipInstall(["cookiecutter"])
Binary file PluginProjectPyramid.zip has changed
--- a/PluginPyramid.epj	Tue Jun 01 19:37:46 2021 +0200
+++ b/PluginPyramid.epj	Sun Jun 06 16:30:37 2021 +0200
@@ -157,7 +157,8 @@
       "ProjectPyramid/DistributionTypeSelectionDialog.ui",
       "ProjectPyramid/FormSelectionDialog.ui",
       "ProjectPyramid/PyramidDialog.ui",
-      "ProjectPyramid/PyramidRoutesDialog.ui"
+      "ProjectPyramid/PyramidRoutesDialog.ui",
+      "ProjectPyramid/MigrateSummaryDialog.ui"
     ],
     "HASH": "16b809c49f4985b2bd6959b37c5612f6b30e89b4",
     "IDLPARAMS": {
@@ -182,29 +183,55 @@
       "ChangeLog",
       "PKGLIST",
       "PluginProjectPyramid.zip",
-      "ProjectPyramid/APIs/Chameleon-2.9.2.api",
-      "ProjectPyramid/APIs/Chameleon-2.9.2.bas",
-      "ProjectPyramid/APIs/Mako-0.7.2.api",
-      "ProjectPyramid/APIs/Mako-0.7.bas",
-      "ProjectPyramid/APIs/MarkupSafe-0.15.api",
-      "ProjectPyramid/APIs/MarkupSafe-0.bas",
-      "ProjectPyramid/APIs/PasteDeploy-1.5.0.api",
-      "ProjectPyramid/APIs/PasteDeploy-1.5.bas",
-      "ProjectPyramid/APIs/Pyramid-1.3.3.api",
-      "ProjectPyramid/APIs/Pyramid-1.3.bas",
-      "ProjectPyramid/APIs/Translationstring-1.1.api",
-      "ProjectPyramid/APIs/Translationstring-1.bas",
-      "ProjectPyramid/APIs/Venusian-1.0a6.api",
-      "ProjectPyramid/APIs/Venusian-1.bas",
-      "ProjectPyramid/APIs/WebOb-1.2.2.api",
-      "ProjectPyramid/APIs/WebOb-1.2.bas",
       "ProjectPyramid/Documentation/LICENSE.GPL3",
       "ProjectPyramid/Documentation/source",
       "ProjectPyramid/icons/pyramid-dark.svg",
       "ProjectPyramid/icons/pyramid-light.svg",
       "ProjectPyramid/icons/pyramid64-dark.svg",
       "ProjectPyramid/icons/pyramid64-light.svg",
-      "PluginPyramid.epj"
+      "PluginPyramid.epj",
+      "ProjectPyramid/APIs/Chameleon-3.9.1.api",
+      "ProjectPyramid/APIs/Chameleon-3.9.1.bas",
+      "ProjectPyramid/APIs/Jinja2-3.0.1.api",
+      "ProjectPyramid/APIs/Jinja2-3.0.1.bas",
+      "ProjectPyramid/APIs/Mako-1.1.4.api",
+      "ProjectPyramid/APIs/Mako-1.1.4.bas",
+      "ProjectPyramid/APIs/MarkupSafe-2.0.1.api",
+      "ProjectPyramid/APIs/MarkupSafe-2.0.1.bas",
+      "ProjectPyramid/APIs/PasteDeploy-2.1.1.api",
+      "ProjectPyramid/APIs/PasteDeploy-2.1.1.bas",
+      "ProjectPyramid/APIs/Pyramid_Chameleon-0.3.api",
+      "ProjectPyramid/APIs/Pyramid_Chameleon-0.3.bas",
+      "ProjectPyramid/APIs/Pyramid_Jinja2-2.8.api",
+      "ProjectPyramid/APIs/Pyramid_Jinja2-2.8.bas",
+      "ProjectPyramid/APIs/Pyramid_Mako-1.1.0.api",
+      "ProjectPyramid/APIs/Pyramid_Mako-1.1.0.bas",
+      "ProjectPyramid/APIs/Pyramid_Retry-2.1.1.api",
+      "ProjectPyramid/APIs/Pyramid_Retry-2.1.1.bas",
+      "ProjectPyramid/APIs/Pyramid_TM-2.4.api",
+      "ProjectPyramid/APIs/Pyramid_TM-2.4.bas",
+      "ProjectPyramid/APIs/Pyramid_ZODBConn-0.8.1.api",
+      "ProjectPyramid/APIs/Pyramid_ZODBConn-0.8.1.bas",
+      "ProjectPyramid/APIs/Pyramid-2.0.api",
+      "ProjectPyramid/APIs/Pyramid-2.0.bas",
+      "ProjectPyramid/APIs/PyramidDebugToolbar-4.9.api",
+      "ProjectPyramid/APIs/PyramidDebugToolbar-4.9.bas",
+      "ProjectPyramid/APIs/SQLAlchemy-1.4.17.api",
+      "ProjectPyramid/APIs/SQLAlchemy-1.4.17.bas",
+      "ProjectPyramid/APIs/TranslationString-1.4.api",
+      "ProjectPyramid/APIs/TranslationString-1.4.bas",
+      "ProjectPyramid/APIs/Venusian-3.0.0.api",
+      "ProjectPyramid/APIs/Venusian-3.0.0.bas",
+      "ProjectPyramid/APIs/WebOb-2.0.35.api",
+      "ProjectPyramid/APIs/WebOb-2.0.35.bas",
+      "ProjectPyramid/APIs/ZEO-5.2.2.api",
+      "ProjectPyramid/APIs/ZEO-5.2.2.bas",
+      "ProjectPyramid/APIs/ZODB-5.6.0.api",
+      "ProjectPyramid/APIs/ZODB-5.6.0.bas",
+      "ProjectPyramid/APIs/ZODBPickle-2.0.0.api",
+      "ProjectPyramid/APIs/ZODBPickle-2.0.0.bas",
+      "ProjectPyramid/APIs/ZODBUri-2.5.0.api",
+      "ProjectPyramid/APIs/ZODBUri-2.5.0.bas"
     ],
     "OTHERTOOLSPARMS": {},
     "PACKAGERSPARMS": {},
@@ -230,7 +257,8 @@
       "ProjectPyramid/PyramidDialog.py",
       "ProjectPyramid/PyramidRoutesDialog.py",
       "ProjectPyramid/__init__.py",
-      "__init__.py"
+      "__init__.py",
+      "ProjectPyramid/MigrateSummaryDialog.py"
     ],
     "SPELLEXCLUDES": "",
     "SPELLLANGUAGE": "en_US",
@@ -245,7 +273,8 @@
       "ProjectPyramid/i18n/pyramid_es.qm",
       "ProjectPyramid/i18n/pyramid_es.ts",
       "ProjectPyramid/i18n/pyramid_ru.qm",
-      "ProjectPyramid/i18n/pyramid_ru.ts"
+      "ProjectPyramid/i18n/pyramid_ru.ts",
+      "ProjectPyramid/i18n/pyramid_empty.ts"
     ],
     "TRANSLATIONSBINPATH": "",
     "UICPARAMS": {
--- a/ProjectPyramid/CreateParametersDialog.py	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/CreateParametersDialog.py	Sun Jun 06 16:30:37 2021 +0200
@@ -7,26 +7,23 @@
 Module implementing a dialog for entering the create parameters.
 """
 
-from PyQt6.QtCore import pyqtSlot, QProcess
+from PyQt6.QtCore import pyqtSlot
 from PyQt6.QtWidgets import QDialog, QDialogButtonBox
 
-from EricWidgets import EricMessageBox
-
 from .Ui_CreateParametersDialog import Ui_CreateParametersDialog
 
-import Preferences
-
 
 class CreateParametersDialog(QDialog, Ui_CreateParametersDialog):
     """
     Class implementing a dialog for entering the create parameters.
     """
-    def __init__(self, project, parent=None):
+    PyramidStarterGH = "gh:Pylons/pyramid-cookiecutter-starter"
+    PyramidStarter = "pyramid-cookiecutter-starter"
+    
+    def __init__(self, parent=None):
         """
         Constructor
         
-        @param project reference to the project object
-        @type Project
         @param parent reference to the parent widget
         @type QWidget
         """
@@ -37,53 +34,27 @@
             QDialogButtonBox.StandardButton.Ok)
         self.__okButton.setEnabled(False)
         
-        errMsg = ""
-        proc = QProcess()
-        args = []
-        args.append(project.getPyramidCommand("pcreate"))
-        args.append("--list")
-        proc.start(args[0], args[1:])
-        procStarted = proc.waitForStarted()
-        if procStarted:
-            finished = proc.waitForFinished(30000)
-            if finished and proc.exitCode() == 0:
-                output = str(proc.readAllStandardOutput(),
-                             Preferences.getSystem("IOEncoding"),
-                             'replace')
-            else:
-                if not finished:
-                    errMsg = self.tr(
-                        "The pcreate command did not finish within 30s.")
-        else:
-            errMsg = self.tr("Could not start the pcreate executable.")
-        if not errMsg:
-            lines = output.splitlines()
-            self.scaffoldCombo.addItem("")
-            for line in sorted(lines[1:]):
-                self.scaffoldCombo.addItem(
-                    self.__prepareScaffoldString(line))
-            self.scaffoldCombo.setCurrentIndex(0)
-        else:
-            EricMessageBox.critical(
-                None,
-                self.tr('Process Generation Error'),
-                errMsg)
+        self.templateCombo.addItems([
+            "",
+            CreateParametersDialog.PyramidStarter,
+            CreateParametersDialog.PyramidStarterGH,
+        ])
+        
+        self.templateLanguageCombo.addItem("Jinja2", "jinja")
+        self.templateLanguageCombo.addItem("Chameleon", "chameleon")
+        self.templateLanguageCombo.addItem("Mako", "mako")
+        
+        self.backendCombo.addItem(self.tr("No Database"), "none")
+        self.backendCombo.addItem("SQLAlchemy", "sqlalchemy")
+        self.backendCombo.addItem("ZODB", "zodb")
+        
+        self.starterGroupBox.setEnabled(False)
         
         msh = self.minimumSizeHint()
         self.resize(max(self.width(), msh.width()), msh.height())
     
     @pyqtSlot(str)
-    def on_nameEdit_textChanged(self, text):
-        """
-        Private slot to handle changes of the site name.
-        
-        @param text text of the site entry
-        @type str
-        """
-        self.__updateUi()
-    
-    @pyqtSlot(str)
-    def on_scaffoldCombo_currentTextChanged(self, text):
+    def on_templateCombo_currentTextChanged(self, text):
         """
         Private slot to handle changes of the selected scaffold.
         
@@ -96,37 +67,54 @@
         """
         Private slot to update the dialog.
         """
-        self.__okButton.setEnabled(
-            bool(self.scaffoldCombo.currentText()) and
-            bool(self.nameEdit.text())
-        )
-    
-    def __prepareScaffoldString(self, line):
-        """
-        Private method to prepare a scaffold string for the combo box.
+        template = self.templateCombo.currentText()
+        
+        self.__okButton.setEnabled(bool(template))
         
-        @param line output line containing the scaffold name and some
-            explanatory text
-        @type str
-        @return prepared scaffold text
-        @rtype str
-        """
-        parts = [part.strip() for part in line.split(":", 1)]
-        return self.tr(
-            "{0} ({1})", "scaffold name, explanatory text").format(*parts)
+        self.starterGroupBox.setEnabled(
+            template in (
+                CreateParametersDialog.PyramidStarter,
+                CreateParametersDialog.PyramidStarterGH,
+            )
+        )
+        
+        self.versionEdit.setEnabled(
+            template == CreateParametersDialog.PyramidStarterGH)
     
     def getData(self):
         """
         Public method to get the data.
         
-        @return tuple giving the scaffold, the project name, a flag indicating
-            to overwrite existing files and a flag indicating to simulate the
-            creation
-        @rtype tuple of (str, str, bool, bool)
+        @return tuple giving the template name, an optional template version,
+            a flag indicating to overwrite existing files and a dictionary
+            containing additional context data
+        @rtype tuple of (str, str, bool)
         """
+        template = self.templateCombo.currentText()
+        
+        contextData = (
+            {
+                "project_name": self.projectEdit.text(),
+                "repo_name": "_".join(self.projectEdit.text().split()).lower(),
+                "template_language": self.templateLanguageCombo.currentData(),
+                "backend": self.backendCombo.currentData(),
+            }
+            if template in (
+                CreateParametersDialog.PyramidStarter,
+                CreateParametersDialog.PyramidStarterGH,
+            ) else
+            {}
+        )
+        
+        version = (
+            self.versionEdit.text()
+            if template == CreateParametersDialog.PyramidStarterGH else
+            ""
+        )
+        
         return (
-            self.scaffoldCombo.currentText().split(":")[0],
-            self.nameEdit.text(),
+            template,
+            version,
             self.overwriteCheckBox.isChecked(),
-            self.simulateCheckBox.isChecked()
+            contextData
         )
--- a/ProjectPyramid/CreateParametersDialog.ui	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/CreateParametersDialog.ui	Sun Jun 06 16:30:37 2021 +0200
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>450</width>
-    <height>160</height>
+    <height>281</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -16,42 +16,109 @@
   <property name="sizeGripEnabled">
    <bool>true</bool>
   </property>
-  <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0">
-    <widget class="QLabel" name="label_2">
-     <property name="text">
-      <string>Project &amp;Name:</string>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <layout class="QGridLayout" name="gridLayout_2">
+     <item row="0" column="0">
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Template:</string>
+       </property>
+       <property name="buddy">
+        <cstring>templateCombo</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QComboBox" name="templateCombo">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="toolTip">
+        <string>Enter the template to be used</string>
+       </property>
+       <property name="editable">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>Template Version:</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1">
+      <widget class="QLineEdit" name="versionEdit">
+       <property name="toolTip">
+        <string>Enter an optional branch, tag or commit</string>
+       </property>
+       <property name="clearButtonEnabled">
+        <bool>true</bool>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <widget class="QGroupBox" name="starterGroupBox">
+     <property name="title">
+      <string>CookieCutter Starter Parameters</string>
      </property>
-     <property name="buddy">
-      <cstring>nameEdit</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="0" column="1">
-    <widget class="QLineEdit" name="nameEdit">
-     <property name="toolTip">
-      <string>Enter the name of the Pyramid project to create</string>
-     </property>
+     <layout class="QGridLayout" name="gridLayout">
+      <item row="0" column="0">
+       <widget class="QLabel" name="label_3">
+        <property name="text">
+         <string>Project Name:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <widget class="QLineEdit" name="projectEdit">
+        <property name="toolTip">
+         <string>Enter the name of the Pyramid project</string>
+        </property>
+        <property name="clearButtonEnabled">
+         <bool>true</bool>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="0">
+       <widget class="QLabel" name="label_4">
+        <property name="text">
+         <string>Template Language:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="1" column="1">
+       <widget class="QComboBox" name="templateLanguageCombo">
+        <property name="toolTip">
+         <string>Select the templating language</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="0">
+       <widget class="QLabel" name="label_5">
+        <property name="text">
+         <string>Backend:</string>
+        </property>
+       </widget>
+      </item>
+      <item row="2" column="1">
+       <widget class="QComboBox" name="backendCombo">
+        <property name="toolTip">
+         <string>Select the database backend</string>
+        </property>
+       </widget>
+      </item>
+     </layout>
     </widget>
    </item>
-   <item row="1" column="0">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>&amp;Scaffold:</string>
-     </property>
-     <property name="buddy">
-      <cstring>scaffoldCombo</cstring>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <widget class="QComboBox" name="scaffoldCombo">
-     <property name="toolTip">
-      <string>Select the scaffold to be used</string>
-     </property>
-    </widget>
-   </item>
-   <item row="2" column="0" colspan="2">
+   <item>
     <widget class="QCheckBox" name="overwriteCheckBox">
      <property name="toolTip">
       <string>Select to overwrite existing files</string>
@@ -61,17 +128,7 @@
      </property>
     </widget>
    </item>
-   <item row="3" column="0" colspan="2">
-    <widget class="QCheckBox" name="simulateCheckBox">
-     <property name="toolTip">
-      <string>Select to simulate the creation</string>
-     </property>
-     <property name="text">
-      <string>Simulate Pyramid project creation</string>
-     </property>
-    </widget>
-   </item>
-   <item row="4" column="0" colspan="2">
+   <item>
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
@@ -84,11 +141,12 @@
   </layout>
  </widget>
  <tabstops>
-  <tabstop>nameEdit</tabstop>
-  <tabstop>scaffoldCombo</tabstop>
+  <tabstop>templateCombo</tabstop>
+  <tabstop>versionEdit</tabstop>
+  <tabstop>projectEdit</tabstop>
+  <tabstop>templateLanguageCombo</tabstop>
+  <tabstop>backendCombo</tabstop>
   <tabstop>overwriteCheckBox</tabstop>
-  <tabstop>simulateCheckBox</tabstop>
-  <tabstop>buttonBox</tabstop>
  </tabstops>
  <resources/>
  <connections>
--- a/ProjectPyramid/DistributionTypeSelectionDialog.py	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/DistributionTypeSelectionDialog.py	Sun Jun 06 16:30:37 2021 +0200
@@ -40,7 +40,10 @@
         
         errMsg = ""
         proc = QProcess()
-        cmd = project.getPythonCommand()
+        cmd = project.getPyramidCommand(
+            "python",
+            virtualEnv=project.getProjectVirtualEnvironment()
+        )
         args = []
         args.append("setup.py")
         args.append("sdist")
--- a/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.PluginProjectPyramid.html	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.PluginProjectPyramid.html	Sun Jun 06 16:30:37 2021 +0200
@@ -56,6 +56,10 @@
 <td>Module function returning data as required by the configuration dialog.</td>
 </tr>
 <tr>
+<td><a href="#installDependencies">installDependencies</a></td>
+<td>Function to install dependencies of this plug-in.</td>
+</tr>
+<tr>
 <td><a href="#prepareUninstall">prepareUninstall</a></td>
 <td>Module function to prepare for an uninstallation.</td>
 </tr>
@@ -504,6 +508,23 @@
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
+<a NAME="installDependencies" ID="installDependencies"></a>
+<h2>installDependencies</h2>
+<b>installDependencies</b>(<i>pipInstall</i>)
+
+<p>
+    Function to install dependencies of this plug-in.
+</p>
+<dl>
+
+<dt><i>pipInstall</i> (function)</dt>
+<dd>
+function to be called with a list of package names.
+</dd>
+</dl>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+<hr />
 <a NAME="prepareUninstall" ID="prepareUninstall"></a>
 <h2>prepareUninstall</h2>
 <b>prepareUninstall</b>(<i></i>)
--- a/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.CreateParametersDialog.html	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.CreateParametersDialog.html	Sun Jun 06 16:30:37 2021 +0200
@@ -57,7 +57,7 @@
 <h3>Class Attributes</h3>
 
 <table>
-<tr><td>None</td></tr>
+<tr><td>PyramidStarter</td></tr><tr><td>PyramidStarterGH</td></tr>
 </table>
 <h3>Class Methods</h3>
 
@@ -73,10 +73,6 @@
 <td>Constructor</td>
 </tr>
 <tr>
-<td><a href="#CreateParametersDialog.__prepareScaffoldString">__prepareScaffoldString</a></td>
-<td>Private method to prepare a scaffold string for the combo box.</td>
-</tr>
-<tr>
 <td><a href="#CreateParametersDialog.__updateUi">__updateUi</a></td>
 <td>Private slot to update the dialog.</td>
 </tr>
@@ -85,11 +81,7 @@
 <td>Public method to get the data.</td>
 </tr>
 <tr>
-<td><a href="#CreateParametersDialog.on_nameEdit_textChanged">on_nameEdit_textChanged</a></td>
-<td>Private slot to handle changes of the site name.</td>
-</tr>
-<tr>
-<td><a href="#CreateParametersDialog.on_scaffoldCombo_currentTextChanged">on_scaffoldCombo_currentTextChanged</a></td>
+<td><a href="#CreateParametersDialog.on_templateCombo_currentTextChanged">on_templateCombo_currentTextChanged</a></td>
 <td>Private slot to handle changes of the selected scaffold.</td>
 </tr>
 </table>
@@ -101,49 +93,18 @@
 
 <a NAME="CreateParametersDialog.__init__" ID="CreateParametersDialog.__init__"></a>
 <h4>CreateParametersDialog (Constructor)</h4>
-<b>CreateParametersDialog</b>(<i>project, parent=None</i>)
+<b>CreateParametersDialog</b>(<i>parent=None</i>)
 
 <p>
         Constructor
 </p>
 <dl>
 
-<dt><i>project</i> (Project)</dt>
-<dd>
-reference to the project object
-</dd>
 <dt><i>parent</i> (QWidget)</dt>
 <dd>
 reference to the parent widget
 </dd>
 </dl>
-<a NAME="CreateParametersDialog.__prepareScaffoldString" ID="CreateParametersDialog.__prepareScaffoldString"></a>
-<h4>CreateParametersDialog.__prepareScaffoldString</h4>
-<b>__prepareScaffoldString</b>(<i>line</i>)
-
-<p>
-        Private method to prepare a scaffold string for the combo box.
-</p>
-<dl>
-
-<dt><i>line</i> (str)</dt>
-<dd>
-output line containing the scaffold name and some
-            explanatory text
-</dd>
-</dl>
-<dl>
-<dt>Return:</dt>
-<dd>
-prepared scaffold text
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-str
-</dd>
-</dl>
 <a NAME="CreateParametersDialog.__updateUi" ID="CreateParametersDialog.__updateUi"></a>
 <h4>CreateParametersDialog.__updateUi</h4>
 <b>__updateUi</b>(<i></i>)
@@ -161,34 +122,20 @@
 <dl>
 <dt>Return:</dt>
 <dd>
-tuple giving the scaffold, the project name, a flag indicating
-            to overwrite existing files and a flag indicating to simulate the
-            creation
+tuple giving the template name, an optional template version,
+            a flag indicating to overwrite existing files and a dictionary
+            containing additional context data
 </dd>
 </dl>
 <dl>
 <dt>Return Type:</dt>
 <dd>
-tuple of (str, str, bool, bool)
+tuple of (str, str, bool)
 </dd>
 </dl>
-<a NAME="CreateParametersDialog.on_nameEdit_textChanged" ID="CreateParametersDialog.on_nameEdit_textChanged"></a>
-<h4>CreateParametersDialog.on_nameEdit_textChanged</h4>
-<b>on_nameEdit_textChanged</b>(<i>text</i>)
-
-<p>
-        Private slot to handle changes of the site name.
-</p>
-<dl>
-
-<dt><i>text</i> (str)</dt>
-<dd>
-text of the site entry
-</dd>
-</dl>
-<a NAME="CreateParametersDialog.on_scaffoldCombo_currentTextChanged" ID="CreateParametersDialog.on_scaffoldCombo_currentTextChanged"></a>
-<h4>CreateParametersDialog.on_scaffoldCombo_currentTextChanged</h4>
-<b>on_scaffoldCombo_currentTextChanged</b>(<i>text</i>)
+<a NAME="CreateParametersDialog.on_templateCombo_currentTextChanged" ID="CreateParametersDialog.on_templateCombo_currentTextChanged"></a>
+<h4>CreateParametersDialog.on_templateCombo_currentTextChanged</h4>
+<b>on_templateCombo_currentTextChanged</b>(<i>text</i>)
 
 <p>
         Private slot to handle changes of the selected scaffold.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.MigrateSummaryDialog.html	Sun Jun 06 16:30:37 2021 +0200
@@ -0,0 +1,201 @@
+<!DOCTYPE html>
+<html><head>
+<title>Plugin_Project_Pyramid.ProjectPyramid.MigrateSummaryDialog</title>
+<meta charset="UTF-8">
+<style>
+body {
+    background: #EDECE6;
+    margin: 0em 1em 10em 1em;
+    color: black;
+}
+
+h1 { color: white; background: #85774A; }
+h2 { color: white; background: #85774A; }
+h3 { color: white; background: #9D936E; }
+h4 { color: white; background: #9D936E; }
+    
+a { color: #BA6D36; }
+
+</style>
+</head>
+<body>
+<a NAME="top" ID="top"></a>
+<h1>Plugin_Project_Pyramid.ProjectPyramid.MigrateSummaryDialog</h1>
+
+<p>
+Module implementing a dialog showing a summary of all created.migrations.
+</p>
+<h3>Global Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Classes</h3>
+
+<table>
+
+<tr>
+<td><a href="#MigrateSummaryDialog">MigrateSummaryDialog</a></td>
+<td>Class implementing a dialog showing a summary of all created.migrations.</td>
+</tr>
+</table>
+<h3>Functions</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<hr />
+<hr />
+<a NAME="MigrateSummaryDialog" ID="MigrateSummaryDialog"></a>
+<h2>MigrateSummaryDialog</h2>
+
+<p>
+    Class implementing a dialog showing a summary of all created.migrations.
+</p>
+<h3>Derived from</h3>
+QDialog, Ui_MigrateSummaryDialog
+<h3>Class Attributes</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Class Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+<h3>Methods</h3>
+
+<table>
+
+<tr>
+<td><a href="#MigrateSummaryDialog.__init__">MigrateSummaryDialog</a></td>
+<td>Constructor</td>
+</tr>
+<tr>
+<td><a href="#MigrateSummaryDialog.__cancelProcess">__cancelProcess</a></td>
+<td>Private slot to terminate the current process.</td>
+</tr>
+<tr>
+<td><a href="#MigrateSummaryDialog.__processOutput">__processOutput</a></td>
+<td>Private method to process the flask output and populate the summary list.</td>
+</tr>
+<tr>
+<td><a href="#MigrateSummaryDialog.__selectItem">__selectItem</a></td>
+<td>Private method to select an item given its revision.</td>
+</tr>
+<tr>
+<td><a href="#MigrateSummaryDialog.on_buttonBox_clicked">on_buttonBox_clicked</a></td>
+<td>Private slot handling a button press of the button box.</td>
+</tr>
+<tr>
+<td><a href="#MigrateSummaryDialog.on_summaryWidget_itemSelectionChanged">on_summaryWidget_itemSelectionChanged</a></td>
+<td>Private slot to handle the selection of an entry.</td>
+</tr>
+<tr>
+<td><a href="#MigrateSummaryDialog.on_upDownButton_clicked">on_upDownButton_clicked</a></td>
+<td>Private slot to upgrade/downgrade to the selected revision.</td>
+</tr>
+<tr>
+<td><a href="#MigrateSummaryDialog.showSummary">showSummary</a></td>
+<td>Public method to show the migrations summary.</td>
+</tr>
+</table>
+<h3>Static Methods</h3>
+
+<table>
+<tr><td>None</td></tr>
+</table>
+
+<a NAME="MigrateSummaryDialog.__init__" ID="MigrateSummaryDialog.__init__"></a>
+<h4>MigrateSummaryDialog (Constructor)</h4>
+<b>MigrateSummaryDialog</b>(<i>project, parent=None</i>)
+
+<p>
+        Constructor
+</p>
+<dl>
+
+<dt><i>project</i> (Project)</dt>
+<dd>
+reference to the project object
+</dd>
+<dt><i>parent</i> (QWidget)</dt>
+<dd>
+reference to the parent widget
+</dd>
+</dl>
+<a NAME="MigrateSummaryDialog.__cancelProcess" ID="MigrateSummaryDialog.__cancelProcess"></a>
+<h4>MigrateSummaryDialog.__cancelProcess</h4>
+<b>__cancelProcess</b>(<i></i>)
+
+<p>
+        Private slot to terminate the current process.
+</p>
+<a NAME="MigrateSummaryDialog.__processOutput" ID="MigrateSummaryDialog.__processOutput"></a>
+<h4>MigrateSummaryDialog.__processOutput</h4>
+<b>__processOutput</b>(<i>output</i>)
+
+<p>
+        Private method to process the flask output and populate the summary
+        list.
+</p>
+<dl>
+
+<dt><i>output</i> (str)</dt>
+<dd>
+output of the flask process
+</dd>
+</dl>
+<a NAME="MigrateSummaryDialog.__selectItem" ID="MigrateSummaryDialog.__selectItem"></a>
+<h4>MigrateSummaryDialog.__selectItem</h4>
+<b>__selectItem</b>(<i>revision</i>)
+
+<p>
+        Private method to select an item given its revision.
+</p>
+<dl>
+
+<dt><i>revision</i> (str)</dt>
+<dd>
+revision of the item to select
+</dd>
+</dl>
+<a NAME="MigrateSummaryDialog.on_buttonBox_clicked" ID="MigrateSummaryDialog.on_buttonBox_clicked"></a>
+<h4>MigrateSummaryDialog.on_buttonBox_clicked</h4>
+<b>on_buttonBox_clicked</b>(<i>button</i>)
+
+<p>
+        Private slot handling a button press of the button box.
+</p>
+<dl>
+
+<dt><i>button</i> (QAbstractButton)</dt>
+<dd>
+reference to the pressed button
+</dd>
+</dl>
+<a NAME="MigrateSummaryDialog.on_summaryWidget_itemSelectionChanged" ID="MigrateSummaryDialog.on_summaryWidget_itemSelectionChanged"></a>
+<h4>MigrateSummaryDialog.on_summaryWidget_itemSelectionChanged</h4>
+<b>on_summaryWidget_itemSelectionChanged</b>(<i></i>)
+
+<p>
+        Private slot to handle the selection of an entry.
+</p>
+<a NAME="MigrateSummaryDialog.on_upDownButton_clicked" ID="MigrateSummaryDialog.on_upDownButton_clicked"></a>
+<h4>MigrateSummaryDialog.on_upDownButton_clicked</h4>
+<b>on_upDownButton_clicked</b>(<i></i>)
+
+<p>
+        Private slot to upgrade/downgrade to the selected revision.
+</p>
+<a NAME="MigrateSummaryDialog.showSummary" ID="MigrateSummaryDialog.showSummary"></a>
+<h4>MigrateSummaryDialog.showSummary</h4>
+<b>showSummary</b>(<i></i>)
+
+<p>
+        Public method to show the migrations summary.
+</p>
+<div align="right"><a href="#top">Up</a></div>
+<hr />
+</body></html>
\ No newline at end of file
--- a/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.Project.html	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.Project.html	Sun Jun 06 16:30:37 2021 +0200
@@ -85,10 +85,18 @@
 <td>Private method to adjust the working directory in the arguments list.</td>
 </tr>
 <tr>
+<td><a href="#Project.__assemblePyramidCommand">__assemblePyramidCommand</a></td>
+<td>Private method to assemble the full pyramid command for a given virtual environment.</td>
+</tr>
+<tr>
 <td><a href="#Project.__buildDistribution">__buildDistribution</a></td>
 <td>Private slot to build a distribution file for the current Pyramid project.</td>
 </tr>
 <tr>
+<td><a href="#Project.__createMigration">__createMigration</a></td>
+<td>Private slot to create a new database migration.</td>
+</tr>
+<tr>
 <td><a href="#Project.__createProject">__createProject</a></td>
 <td>Private slot to create a new Pyramid project.</td>
 </tr>
@@ -117,6 +125,10 @@
 <td>Private method to get the path of the virtual environment.</td>
 </tr>
 <tr>
+<td><a href="#Project.__initDatabaseActions">__initDatabaseActions</a></td>
+<td>Private method to initialize the database related actions.</td>
+</tr>
+<tr>
 <td><a href="#Project.__initializeDatabase">__initializeDatabase</a></td>
 <td>Private slot to initialize the database of the Pyramid project.</td>
 </tr>
@@ -141,10 +153,6 @@
 <td>Private slot handling the addition of a new language.</td>
 </tr>
 <tr>
-<td><a href="#Project.__projectPath">__projectPath</a></td>
-<td>Private method to calculate the full path of the Pyramid project.</td>
-</tr>
-<tr>
 <td><a href="#Project.__pyramidInfo">__pyramidInfo</a></td>
 <td>Private slot to show some info about Pyramid.</td>
 </tr>
@@ -153,10 +161,6 @@
 <td>Private slot to start the default web browser with the server URL.</td>
 </tr>
 <tr>
-<td><a href="#Project.__runLoggingServer">__runLoggingServer</a></td>
-<td>Private slot to start the Pyramid Web server with logging.</td>
-</tr>
-<tr>
 <td><a href="#Project.__runPythonShell">__runPythonShell</a></td>
 <td>Private slot to start a Python console for a Pyramid project.</td>
 </tr>
@@ -177,10 +181,6 @@
 <td>Private slot to set the current project.</td>
 </tr>
 <tr>
-<td><a href="#Project.__setupDevelop">__setupDevelop</a></td>
-<td>Private slot to set up the development environment for the current project.</td>
-</tr>
-<tr>
 <td><a href="#Project.__showDocumentation">__showDocumentation</a></td>
 <td>Private slot to show the helpviewer with the Pyramid documentation.</td>
 </tr>
@@ -189,6 +189,14 @@
 <td>Private slot showing all views that would match a given URL.</td>
 </tr>
 <tr>
+<td><a href="#Project.__showMigrationsHistory">__showMigrationsHistory</a></td>
+<td>Private slot to show the full migrations history.</td>
+</tr>
+<tr>
+<td><a href="#Project.__showMigrationsSummary">__showMigrationsSummary</a></td>
+<td>Private slot to show a migrations history summary.</td>
+</tr>
+<tr>
 <td><a href="#Project.__showRoutes">__showRoutes</a></td>
 <td>Private slot showing all URL dispatch routes.</td>
 </tr>
@@ -205,10 +213,18 @@
 <td>Public method to update the message catalogs.</td>
 </tr>
 <tr>
+<td><a href="#Project.downgradeDatabase">downgradeDatabase</a></td>
+<td>Public slot to downgrade the database to the previous or a given version.</td>
+</tr>
+<tr>
 <td><a href="#Project.extractMessages">extractMessages</a></td>
 <td>Public method to extract the messages catalog template file.</td>
 </tr>
 <tr>
+<td><a href="#Project.getAlembicCommand">getAlembicCommand</a></td>
+<td>Public method to get the path to the alembic executable of the current Pyramid project.</td>
+</tr>
+<tr>
 <td><a href="#Project.getMenu">getMenu</a></td>
 <td>Public method to get a reference to the requested menu.</td>
 </tr>
@@ -217,6 +233,10 @@
 <td>Public method to get the names of all menus.</td>
 </tr>
 <tr>
+<td><a href="#Project.getProjectVirtualEnvironment">getProjectVirtualEnvironment</a></td>
+<td>Public method to generate the path of the project virtual environment.</td>
+</tr>
+<tr>
 <td><a href="#Project.getPyramidCommand">getPyramidCommand</a></td>
 <td>Public method to build a Pyramid command.</td>
 </tr>
@@ -245,6 +265,10 @@
 <td>Public method to check, if the given console is a spawning console.</td>
 </tr>
 <tr>
+<td><a href="#Project.migrationsPath">migrationsPath</a></td>
+<td>Public method to get the path to the migrations directory of the current Pyramid project.</td>
+</tr>
+<tr>
 <td><a href="#Project.newForm">newForm</a></td>
 <td>Public method to create a new form.</td>
 </tr>
@@ -265,6 +289,10 @@
 <td>Public method to add our hook methods.</td>
 </tr>
 <tr>
+<td><a href="#Project.projectPath">projectPath</a></td>
+<td>Public method to calculate the full path of the Pyramid project.</td>
+</tr>
+<tr>
 <td><a href="#Project.registerOpenHook">registerOpenHook</a></td>
 <td>Public method to register the open hook to open a translations file in a translations editor.</td>
 </tr>
@@ -280,6 +308,10 @@
 <td><a href="#Project.updateSelectedCatalogs">updateSelectedCatalogs</a></td>
 <td>Public method to update the message catalogs.</td>
 </tr>
+<tr>
+<td><a href="#Project.upgradeDatabase">upgradeDatabase</a></td>
+<td>Public slot to upgrade the database to the head or a given version.</td>
+</tr>
 </table>
 <h3>Static Methods</h3>
 
@@ -327,6 +359,37 @@
 working directory
 </dd>
 </dl>
+<a NAME="Project.__assemblePyramidCommand" ID="Project.__assemblePyramidCommand"></a>
+<h4>Project.__assemblePyramidCommand</h4>
+<b>__assemblePyramidCommand</b>(<i>cmd, virtualEnv</i>)
+
+<p>
+        Private method to assemble the full pyramid command for a given virtual
+        environment.
+</p>
+<dl>
+
+<dt><i>cmd</i> (str)</dt>
+<dd>
+command
+</dd>
+<dt><i>virtualEnv</i> (str)</dt>
+<dd>
+path of the project's Python virtual environment
+</dd>
+</dl>
+<dl>
+<dt>Return:</dt>
+<dd>
+assembled pyramid command
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
 <a NAME="Project.__buildDistribution" ID="Project.__buildDistribution"></a>
 <h4>Project.__buildDistribution</h4>
 <b>__buildDistribution</b>(<i></i>)
@@ -335,6 +398,13 @@
         Private slot to build a distribution file for the current Pyramid
         project.
 </p>
+<a NAME="Project.__createMigration" ID="Project.__createMigration"></a>
+<h4>Project.__createMigration</h4>
+<b>__createMigration</b>(<i></i>)
+
+<p>
+        Private slot to create a new database migration.
+</p>
 <a NAME="Project.__createProject" ID="Project.__createProject"></a>
 <h4>Project.__createProject</h4>
 <b>__createProject</b>(<i></i>)
@@ -490,6 +560,13 @@
 str
 </dd>
 </dl>
+<a NAME="Project.__initDatabaseActions" ID="Project.__initDatabaseActions"></a>
+<h4>Project.__initDatabaseActions</h4>
+<b>__initDatabaseActions</b>(<i></i>)
+
+<p>
+        Private method to initialize the database related actions.
+</p>
 <a NAME="Project.__initializeDatabase" ID="Project.__initializeDatabase"></a>
 <h4>Project.__initializeDatabase</h4>
 <b>__initializeDatabase</b>(<i></i>)
@@ -621,33 +698,6 @@
 language code of the new language
 </dd>
 </dl>
-<a NAME="Project.__projectPath" ID="Project.__projectPath"></a>
-<h4>Project.__projectPath</h4>
-<b>__projectPath</b>(<i></i>)
-
-<p>
-        Private method to calculate the full path of the Pyramid project.
-</p>
-<dl>
-<dt>Return:</dt>
-<dd>
-path of the project
-</dd>
-</dl>
-<dl>
-<dt>Return Type:</dt>
-<dd>
-str
-</dd>
-</dl>
-<dl>
-
-<dt>Raises <b>PyramidNoProjectSelectedException</b>:</dt>
-<dd>
-raised, if no project is
-            selected
-</dd>
-</dl>
 <a NAME="Project.__pyramidInfo" ID="Project.__pyramidInfo"></a>
 <h4>Project.__pyramidInfo</h4>
 <b>__pyramidInfo</b>(<i></i>)
@@ -662,13 +712,6 @@
 <p>
         Private slot to start the default web browser with the server URL.
 </p>
-<a NAME="Project.__runLoggingServer" ID="Project.__runLoggingServer"></a>
-<h4>Project.__runLoggingServer</h4>
-<b>__runLoggingServer</b>(<i></i>)
-
-<p>
-        Private slot to start the Pyramid Web server with logging.
-</p>
 <a NAME="Project.__runPythonShell" ID="Project.__runPythonShell"></a>
 <h4>Project.__runPythonShell</h4>
 <b>__runPythonShell</b>(<i></i>)
@@ -678,18 +721,11 @@
 </p>
 <a NAME="Project.__runServer" ID="Project.__runServer"></a>
 <h4>Project.__runServer</h4>
-<b>__runServer</b>(<i>logging=False</i>)
+<b>__runServer</b>(<i></i>)
 
 <p>
         Private slot to start the Pyramid Web server.
 </p>
-<dl>
-
-<dt><i>logging</i> (bool)</dt>
-<dd>
-flag indicating to enable logging
-</dd>
-</dl>
 <a NAME="Project.__selectProject" ID="Project.__selectProject"></a>
 <h4>Project.__selectProject</h4>
 <b>__selectProject</b>(<i></i>)
@@ -718,14 +754,6 @@
 name of the project
 </dd>
 </dl>
-<a NAME="Project.__setupDevelop" ID="Project.__setupDevelop"></a>
-<h4>Project.__setupDevelop</h4>
-<b>__setupDevelop</b>(<i></i>)
-
-<p>
-        Private slot to set up the development environment for the current
-        project.
-</p>
 <a NAME="Project.__showDocumentation" ID="Project.__showDocumentation"></a>
 <h4>Project.__showDocumentation</h4>
 <b>__showDocumentation</b>(<i></i>)
@@ -740,6 +768,20 @@
 <p>
         Private slot showing all views that would match a given URL.
 </p>
+<a NAME="Project.__showMigrationsHistory" ID="Project.__showMigrationsHistory"></a>
+<h4>Project.__showMigrationsHistory</h4>
+<b>__showMigrationsHistory</b>(<i></i>)
+
+<p>
+        Private slot to show the full migrations history.
+</p>
+<a NAME="Project.__showMigrationsSummary" ID="Project.__showMigrationsSummary"></a>
+<h4>Project.__showMigrationsSummary</h4>
+<b>__showMigrationsSummary</b>(<i></i>)
+
+<p>
+        Private slot to show a migrations history summary.
+</p>
 <a NAME="Project.__showRoutes" ID="Project.__showRoutes"></a>
 <h4>Project.__showRoutes</h4>
 <b>__showRoutes</b>(<i></i>)
@@ -782,6 +824,21 @@
 list of file names
 </dd>
 </dl>
+<a NAME="Project.downgradeDatabase" ID="Project.downgradeDatabase"></a>
+<h4>Project.downgradeDatabase</h4>
+<b>downgradeDatabase</b>(<i>revision=None</i>)
+
+<p>
+        Public slot to downgrade the database to the previous or a given
+        version.
+</p>
+<dl>
+
+<dt><i>revision</i> (str)</dt>
+<dd>
+migration revision to downgrade to
+</dd>
+</dl>
 <a NAME="Project.extractMessages" ID="Project.extractMessages"></a>
 <h4>Project.extractMessages</h4>
 <b>extractMessages</b>(<i></i>)
@@ -789,6 +846,26 @@
 <p>
         Public method to extract the messages catalog template file.
 </p>
+<a NAME="Project.getAlembicCommand" ID="Project.getAlembicCommand"></a>
+<h4>Project.getAlembicCommand</h4>
+<b>getAlembicCommand</b>(<i></i>)
+
+<p>
+        Public method to get the path to the alembic executable of the current
+        Pyramid project.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+path to the alembic executable
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
 <a NAME="Project.getMenu" ID="Project.getMenu"></a>
 <h4>Project.getMenu</h4>
 <b>getMenu</b>(<i>name</i>)
@@ -835,9 +912,28 @@
 list of str
 </dd>
 </dl>
+<a NAME="Project.getProjectVirtualEnvironment" ID="Project.getProjectVirtualEnvironment"></a>
+<h4>Project.getProjectVirtualEnvironment</h4>
+<b>getProjectVirtualEnvironment</b>(<i></i>)
+
+<p>
+        Public method to generate the path of the project virtual environment.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+path of the Pyramid project virtual environment
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
 <a NAME="Project.getPyramidCommand" ID="Project.getPyramidCommand"></a>
 <h4>Project.getPyramidCommand</h4>
-<b>getPyramidCommand</b>(<i>cmd, language=""</i>)
+<b>getPyramidCommand</b>(<i>cmd, language="", virtualEnv=""</i>)
 
 <p>
         Public method to build a Pyramid command.
@@ -853,6 +949,10 @@
 Python variant to get the virtual environment
             for (one of '' or 'Python3')
 </dd>
+<dt><i>virtualEnv</i> (str)</dt>
+<dd>
+path of the project's Python virtual environment
+</dd>
 </dl>
 <dl>
 <dt>Return:</dt>
@@ -976,6 +1076,26 @@
 str
 </dd>
 </dl>
+<a NAME="Project.migrationsPath" ID="Project.migrationsPath"></a>
+<h4>Project.migrationsPath</h4>
+<b>migrationsPath</b>(<i></i>)
+
+<p>
+        Public method to get the path to the migrations directory of the
+        current Pyramid project.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+pathof the directory containing the migrations
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
 <a NAME="Project.newForm" ID="Project.newForm"></a>
 <h4>Project.newForm</h4>
 <b>newForm</b>(<i>path</i>)
@@ -1025,6 +1145,33 @@
 <p>
         Public method to add our hook methods.
 </p>
+<a NAME="Project.projectPath" ID="Project.projectPath"></a>
+<h4>Project.projectPath</h4>
+<b>projectPath</b>(<i></i>)
+
+<p>
+        Public method to calculate the full path of the Pyramid project.
+</p>
+<dl>
+<dt>Return:</dt>
+<dd>
+path of the project
+</dd>
+</dl>
+<dl>
+<dt>Return Type:</dt>
+<dd>
+str
+</dd>
+</dl>
+<dl>
+
+<dt>Raises <b>PyramidNoProjectSelectedException</b>:</dt>
+<dd>
+raised, if no project is
+            selected
+</dd>
+</dl>
 <a NAME="Project.registerOpenHook" ID="Project.registerOpenHook"></a>
 <h4>Project.registerOpenHook</h4>
 <b>registerOpenHook</b>(<i></i>)
@@ -1080,6 +1227,20 @@
 list of filenames
 </dd>
 </dl>
+<a NAME="Project.upgradeDatabase" ID="Project.upgradeDatabase"></a>
+<h4>Project.upgradeDatabase</h4>
+<b>upgradeDatabase</b>(<i>revision=None</i>)
+
+<p>
+        Public slot to upgrade the database to the head or a given version.
+</p>
+<dl>
+
+<dt><i>revision</i> (str)</dt>
+<dd>
+migration revision to upgrade to
+</dd>
+</dl>
 <div align="right"><a href="#top">Up</a></div>
 <hr />
 <hr />
--- a/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.PyramidDialog.html	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/Documentation/source/Plugin_Project_Pyramid.ProjectPyramid.PyramidDialog.html	Sun Jun 06 16:30:37 2021 +0200
@@ -138,7 +138,7 @@
 
 <a NAME="PyramidDialog.__init__" ID="PyramidDialog.__init__"></a>
 <h4>PyramidDialog (Constructor)</h4>
-<b>PyramidDialog</b>(<i>text, fixed=False, linewrap=True, msgSuccess=None, msgError=None, parent=None</i>)
+<b>PyramidDialog</b>(<i>text, fixed=False, linewrap=True, msgSuccess=None, msgError=None, combinedOutput=False, parent=None</i>)
 
 <p>
         Constructor
@@ -165,6 +165,11 @@
 <dd>
 optional string to show upon unsuccessful execution
 </dd>
+<dt><i>combinedOutput</i> (bool)</dt>
+<dd>
+flag indicating to combine the output into the
+            output pane
+</dd>
 <dt><i>parent</i> (QWidget)</dt>
 <dd>
 parent widget
--- a/ProjectPyramid/Documentation/source/index-Plugin_Project_Pyramid.ProjectPyramid.html	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/Documentation/source/index-Plugin_Project_Pyramid.ProjectPyramid.html	Sun Jun 06 16:30:37 2021 +0200
@@ -50,6 +50,10 @@
 <td>Module implementing a dialog to select the template type.</td>
 </tr>
 <tr>
+<td><a href="Plugin_Project_Pyramid.ProjectPyramid.MigrateSummaryDialog.html">MigrateSummaryDialog</a></td>
+<td>Module implementing a dialog showing a summary of all created.migrations.</td>
+</tr>
+<tr>
 <td><a href="Plugin_Project_Pyramid.ProjectPyramid.Project.html">Project</a></td>
 <td>Module implementing the Pyramid project support.</td>
 </tr>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectPyramid/MigrateSummaryDialog.py	Sun Jun 06 16:30:37 2021 +0200
@@ -0,0 +1,232 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2020 - 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog showing a summary of all created.migrations.
+"""
+
+from PyQt6.QtCore import pyqtSlot, Qt, QProcess, QEventLoop, QTimer
+from PyQt6.QtGui import QGuiApplication
+from PyQt6.QtWidgets import (
+    QDialog, QDialogButtonBox, QAbstractButton, QTreeWidgetItem,
+    QAbstractItemView
+)
+
+from EricGui.EricOverrideCursor import EricOverrideCursor, EricOverridenCursor
+from EricWidgets import EricMessageBox
+
+from .Ui_MigrateSummaryDialog import Ui_MigrateSummaryDialog
+
+
+class MigrateSummaryDialog(QDialog, Ui_MigrateSummaryDialog):
+    """
+    Class implementing a dialog showing a summary of all created.migrations.
+    """
+    def __init__(self, project, parent=None):
+        """
+        Constructor
+        
+        @param project reference to the project object
+        @type Project
+        @param parent reference to the parent widget
+        @type QWidget
+        """
+        super().__init__(parent)
+        self.setupUi(self)
+        
+        self.__refreshButton = self.buttonBox.addButton(
+            self.tr("Refresh"), QDialogButtonBox.ButtonRole.ActionRole)
+        self.__refreshButton.clicked.connect(self.showSummary)
+        
+        self.__project = project
+        
+        self.__process = None
+        self.__currentItemIndex = 1000000
+        self.__currentRevision = ""
+    
+    def showSummary(self):
+        """
+        Public method to show the migrations summary.
+        """
+        projectPath = self.__project.projectPath()
+        
+        self.show()
+        self.raise_()
+        
+        self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Close).setEnabled(False)
+        self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Cancel).setDefault(True)
+        self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Cancel).setEnabled(True)
+        self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Cancel).setFocus(
+                Qt.FocusReason.OtherFocusReason)
+        QGuiApplication.processEvents(
+            QEventLoop.ProcessEventsFlag.ExcludeUserInputEvents)
+        
+        command = self.__project.getAlembicCommand()
+        
+        self.__process = QProcess()
+        self.__process.setWorkingDirectory(projectPath)
+        
+        args = ["-c", "development.ini", "history", "--indicate-current"]
+        
+        with EricOverrideCursor():
+            self.__process.start(command, args)
+            ok = self.__process.waitForStarted(10000)
+            if ok:
+                ok = self.__process.waitForFinished(10000)
+                if ok:
+                    out = str(self.__process.readAllStandardOutput(),
+                              "utf-8")
+                    self.__processOutput(out)
+                    self.__selectItem(self.__currentRevision)
+                else:
+                    with EricOverridenCursor():
+                        EricMessageBox.critical(
+                            None,
+                            self.tr("Migrations Summary"),
+                            self.tr("""The 'alembic' process did not finish"""
+                                    """ within 10 seconds."""))
+            else:
+                with EricOverridenCursor():
+                    EricMessageBox.critical(
+                        None,
+                        self.tr("Migrations Summary"),
+                        self.tr("""The 'alembic' process could not be"""
+                                """ started."""))
+            for column in range(self.summaryWidget.columnCount()):
+                self.summaryWidget.resizeColumnToContents(column)
+        
+        self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Cancel).setEnabled(False)
+        self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Close).setEnabled(True)
+        self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Close).setDefault(True)
+        self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Close).setFocus(
+                Qt.FocusReason.OtherFocusReason)
+    
+    def __processOutput(self, output):
+        """
+        Private method to process the flask output and populate the summary
+        list.
+        
+        @param output output of the flask process
+        @type str
+        """
+        self.summaryWidget.clear()
+        self.upDownButton.setEnabled(False)
+        self.__currentItemIndex = 1000000
+        self.__currentRevision = ""
+        
+        lines = output.splitlines()
+        for line in lines:
+            isCurrent = False
+            oldRev, rest = line.split("->")
+            rest, message = rest.split(",", 1)
+            newRev, *labels = rest.split()
+            if labels:
+                labelList = [
+                    label.replace("(", "").replace(")", "")
+                    for label in labels
+                ]
+                labelsStr = ", ".join(labelList)
+                if "current" in labelList:
+                    isCurrent = True
+            else:
+                labelsStr = ""
+            
+            itm = QTreeWidgetItem(self.summaryWidget, [
+                oldRev.strip(),
+                newRev.strip(),
+                message.strip(),
+                labelsStr,
+            ])
+            if isCurrent:
+                font = itm.font(0)
+                font.setBold(True)
+                for column in range(self.summaryWidget.columnCount()):
+                    itm.setFont(column, font)
+                
+                self.__currentItemIndex = (
+                    self.summaryWidget.indexOfTopLevelItem(itm)
+                )
+                self.__currentRevision = newRev.strip()
+    
+    @pyqtSlot()
+    def on_summaryWidget_itemSelectionChanged(self):
+        """
+        Private slot to handle the selection of an entry.
+        """
+        items = self.summaryWidget.selectedItems()
+        if items:
+            index = self.summaryWidget.indexOfTopLevelItem(items[0])
+            if index < self.__currentItemIndex:
+                self.upDownButton.setText(self.tr("Upgrade"))
+            elif index > self.__currentItemIndex:
+                self.upDownButton.setText(self.tr("Downgrade"))
+            self.upDownButton.setEnabled(index != self.__currentItemIndex)
+        else:
+            self.upDownButton.setEnabled(False)
+    
+    @pyqtSlot()
+    def on_upDownButton_clicked(self):
+        """
+        Private slot to upgrade/downgrade to the selected revision.
+        """
+        itm = self.summaryWidget.selectedItems()[0]
+        rev = itm.text(1)
+        if self.upDownButton.text() == self.tr("Upgrade"):
+            self.__project.upgradeDatabase(revision=rev)
+        else:
+            self.__project.downgradeDatabase(revision=rev)
+        self.showSummary()
+    
+    @pyqtSlot(QAbstractButton)
+    def on_buttonBox_clicked(self, button):
+        """
+        Private slot handling a button press of the button box.
+        
+        @param button reference to the pressed button
+        @type QAbstractButton
+        """
+        if button is self.buttonBox.button(
+            QDialogButtonBox.StandardButton.Cancel
+        ):
+            self.__cancelProcess()
+    
+    @pyqtSlot()
+    def __cancelProcess(self):
+        """
+        Private slot to terminate the current process.
+        """
+        if (
+            self.__process is not None and
+            self.__process.state() != QProcess.ProcessState.NotRunning
+        ):
+            self.__process.terminate()
+            QTimer.singleShot(2000, self.__process.kill)
+            self.__process.waitForFinished(3000)
+        
+        self.__process = None
+    
+    def __selectItem(self, revision):
+        """
+        Private method to select an item given its revision.
+        
+        @param revision revision of the item to select
+        @type str
+        """
+        if revision:
+            items = self.summaryWidget.findItems(
+                revision, Qt.MatchFlag.MatchExactly, 1)
+            if items:
+                # select the first item
+                items[0].setSelected(True)
+                self.summaryWidget.scrollToItem(
+                    items[0], QAbstractItemView.ScrollHint.PositionAtCenter)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectPyramid/MigrateSummaryDialog.ui	Sun Jun 06 16:30:37 2021 +0200
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MigrateSummaryDialog</class>
+ <widget class="QDialog" name="MigrateSummaryDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>800</width>
+    <height>500</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Migrations Summary</string>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QTreeWidget" name="summaryWidget">
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="rootIsDecorated">
+      <bool>false</bool>
+     </property>
+     <property name="itemsExpandable">
+      <bool>false</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string>Old Revision</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>New Revision</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Message</string>
+      </property>
+     </column>
+     <column>
+      <property name="text">
+       <string>Labels</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QPushButton" name="upDownButton">
+       <property name="toolTip">
+        <string>Press to upgrade or downgrade the database to the selected migration</string>
+       </property>
+       <property name="text">
+        <string>Upgrade</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+     <item>
+      <widget class="QDialogButtonBox" name="buttonBox">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="standardButtons">
+        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Close</set>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>MigrateSummaryDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>227</x>
+     <y>479</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>MigrateSummaryDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>295</x>
+     <y>485</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- a/ProjectPyramid/Project.py	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/Project.py	Sun Jun 06 16:30:37 2021 +0200
@@ -7,12 +7,17 @@
 Module implementing the Pyramid project support.
 """
 
+import configparser
+import contextlib
+import glob
 import os
 import re
-import configparser
-import contextlib
+import subprocess       # secok
+import sys
 
-from PyQt6.QtCore import QObject, QFileInfo, QTimer, QUrl, QIODeviceBase
+from PyQt6.QtCore import (
+    pyqtSlot, QObject, QFileInfo, QTimer, QUrl, QIODeviceBase
+)
 from PyQt6.QtGui import QDesktopServices
 from PyQt6.QtWidgets import QMenu, QDialog, QInputDialog, QLineEdit
 from PyQt6.QtCore import QProcess as QProcessPyQt
@@ -125,6 +130,8 @@
         self.__serverProc = None
         
         self.__pyramidVersion = ""
+        
+        self.__migrationSummaryDialog = None
     
     def initActions(self):
         """
@@ -184,21 +191,6 @@
         self.runServerAct.triggered.connect(self.__runServer)
         self.actions.append(self.runServerAct)
         
-        self.runLoggingServerAct = EricAction(
-            self.tr('Run Server with Logging'),
-            self.tr('Run Server with &Logging'),
-            0, 0,
-            self, 'pyramid_run_logging_server')
-        self.runLoggingServerAct.setStatusTip(self.tr(
-            'Starts the Pyramid Web server with logging'))
-        self.runLoggingServerAct.setWhatsThis(self.tr(
-            """<b>Run Server with Logging</b>"""
-            """<p>Starts the Pyramid Web server with logging using"""
-            """ "pserve --log-file=server.log --reload development.ini".</p>"""
-        ))
-        self.runLoggingServerAct.triggered.connect(self.__runLoggingServer)
-        self.actions.append(self.runLoggingServerAct)
-        
         self.runBrowserAct = EricAction(
             self.tr('Run Web-Browser'),
             self.tr('Run &Web-Browser'),
@@ -229,45 +221,6 @@
         self.runPythonShellAct.triggered.connect(self.__runPythonShell)
         self.actions.append(self.runPythonShellAct)
         
-        ##############################
-        ## setup actions below      ##
-        ##############################
-        
-        self.setupDevelopAct = EricAction(
-            self.tr('Setup Development Environment'),
-            self.tr('Setup &Development Environment'),
-            0, 0,
-            self, 'pyramid_setup_development')
-        self.setupDevelopAct.setStatusTip(self.tr(
-            'Setup the Pyramid project in development mode'))
-        self.setupDevelopAct.setWhatsThis(self.tr(
-            """<b>Setup Development Environment</b>"""
-            """<p>Setup the Pyramid project in development mode using"""
-            """ "python setup.py develop".</p>"""
-        ))
-        self.setupDevelopAct.triggered.connect(self.__setupDevelop)
-        self.actions.append(self.setupDevelopAct)
-        
-        ###############################
-        ## database actions below    ##
-        ###############################
-        
-        self.initializeDbAct = EricAction(
-            self.tr('Initialize Database'),
-            self.tr('Initialize &Database'),
-            0, 0,
-            self, 'pyramid_initialize_database')
-        self.initializeDbAct.setStatusTip(self.tr(
-            'Initializes (or re-initializes) the database of the current'
-            ' Pyramid project'))
-        self.initializeDbAct.setWhatsThis(self.tr(
-            """<b>Initialize Database</b>"""
-            """<p>Initializes (or re-initializes) the database of the"""
-            """ current Pyramid project.</p>"""
-        ))
-        self.initializeDbAct.triggered.connect(self.__initializeDatabase)
-        self.actions.append(self.initializeDbAct)
-        
         ###############################
         ## show actions below        ##
         ###############################
@@ -372,8 +325,120 @@
         self.aboutPyramidAct.triggered.connect(self.__pyramidInfo)
         self.actions.append(self.aboutPyramidAct)
         
+        self.__initDatabaseActions()
+        
         self.__setCurrentProject(None)
     
+    def __initDatabaseActions(self):
+        """
+        Private method to initialize the database related actions.
+        """
+        self.initializeDbAct = EricAction(
+            self.tr('Initialize Database'),
+            self.tr('Initialize &Database'),
+            0, 0,
+            self, 'pyramid_initialize_database')
+        self.initializeDbAct.setStatusTip(self.tr(
+            'Initializes (or re-initializes) the database of the current'
+            ' Pyramid project'))
+        self.initializeDbAct.setWhatsThis(self.tr(
+            """<b>Initialize Database</b>"""
+            """<p>Initializes (or re-initializes) the database of the"""
+            """ current Pyramid project.</p>"""
+        ))
+        self.initializeDbAct.triggered.connect(self.__initializeDatabase)
+        self.actions.append(self.initializeDbAct)
+        
+        #########################################################
+        ## action to create a new database migration
+        #########################################################
+        
+        self.migrateCreateAct = EricAction(
+            self.tr('Create Migration'),
+            self.tr('&Create Migration'),
+            0, 0,
+            self, 'flask_create_migration')
+        self.migrateCreateAct.setStatusTip(self.tr(
+            'Create a new migration for the current database'))
+        self.migrateCreateAct.setWhatsThis(self.tr(
+            """<b>Create Migration</b>"""
+            """<p>Creates a new migration for the current database"""
+            """ and stores it  in the configured migrations directory.</p>"""
+        ))
+        self.migrateCreateAct.triggered.connect(
+            self.__createMigration)
+        self.actions.append(self.migrateCreateAct)
+        
+        #########################################################
+        ## action to up- and downgrade a databse
+        #########################################################
+        
+        self.upgradeDatabaseAct = EricAction(
+            self.tr('Upgrade Database'),
+            self.tr('&Upgrade Database'),
+            0, 0,
+            self, 'flask_upgrade_database')
+        self.upgradeDatabaseAct.setStatusTip(self.tr(
+            'Upgrade the database to the current migration'))
+        self.upgradeDatabaseAct.setWhatsThis(self.tr(
+            """<b>Upgrade Database</b>"""
+            """<p>Upgrades the database to the current migration.</p>"""
+        ))
+        self.upgradeDatabaseAct.triggered.connect(
+            self.upgradeDatabase)
+        self.actions.append(self.upgradeDatabaseAct)
+        
+        self.downgradeDatabaseAct = EricAction(
+            self.tr('Downgrade Database'),
+            self.tr('&Downgrade Database'),
+            0, 0,
+            self, 'flask_downgrade_database')
+        self.downgradeDatabaseAct.setStatusTip(self.tr(
+            'Downgrade the database to the previous version'))
+        self.downgradeDatabaseAct.setWhatsThis(self.tr(
+            """<b>Downgrade Database</b>"""
+            """<p>Downgrades the database to the previous version.</p>"""
+        ))
+        self.downgradeDatabaseAct.triggered.connect(
+            self.downgradeDatabase)
+        self.actions.append(self.downgradeDatabaseAct)
+        
+        #########################################################
+        ## actions to show migrations history information
+        #########################################################
+        
+        self.migrationSummaryAct = EricAction(
+            self.tr('Show Migrations Summary'),
+            self.tr('Show Migrations &Summary'),
+            0, 0,
+            self, 'flask_show_migrations_summary')
+        self.migrationSummaryAct.setStatusTip(self.tr(
+            'Show a summary of the created database migrations'))
+        self.migrationSummaryAct.setWhatsThis(self.tr(
+            """<b>Show Migrations Summary</b>"""
+            """<p>Shows a summary list of the created database"""
+            """ migrations.</p>"""
+        ))
+        self.migrationSummaryAct.triggered.connect(
+            self.__showMigrationsSummary)
+        self.actions.append(self.migrationSummaryAct)
+        
+        self.migrationHistoryAct = EricAction(
+            self.tr('Show Migrations History'),
+            self.tr('Show Migrations &History'),
+            0, 0,
+            self, 'flask_show_migrations_history')
+        self.migrationHistoryAct.setStatusTip(self.tr(
+            'Show the full history of the created database migrations'))
+        self.migrationHistoryAct.setWhatsThis(self.tr(
+            """<b>Show Migrations History</b>"""
+            """<p>Shows the full history of the created database"""
+            """ migrations.</p>"""
+        ))
+        self.migrationHistoryAct.triggered.connect(
+            self.__showMigrationsHistory)
+        self.actions.append(self.migrationHistoryAct)
+    
     def initMenu(self):
         """
         Public slot to initialize the Pyramid menu.
@@ -383,27 +448,39 @@
         """
         self.__menus = {}   # clear menus references
         
+        # Database menu
+        dbMenu = QMenu(self.tr("Database"))
+        dbMenu.setTearOffEnabled(True)
+        
+        dbMenu.addAction(self.initializeDbAct)
+        dbMenu.addSeparator()
+        dbMenu.addAction(self.migrateCreateAct)
+        dbMenu.addSeparator()
+        dbMenu.addAction(self.upgradeDatabaseAct)
+        dbMenu.addAction(self.downgradeDatabaseAct)
+        dbMenu.addSeparator()
+        dbMenu.addAction(self.migrationSummaryAct)
+        dbMenu.addAction(self.migrationHistoryAct)
+        
+        # main Pyramid menu
         menu = QMenu(self.tr('P&yramid'), self.__ui)
         menu.setTearOffEnabled(True)
         
         menu.addAction(self.selectProjectAct)
         menu.addSeparator()
         menu.addAction(self.runServerAct)
-        menu.addAction(self.runLoggingServerAct)
         menu.addAction(self.runBrowserAct)
         menu.addSeparator()
+        menu.addAction(self.runPythonShellAct)
+        menu.addSeparator()
         menu.addAction(self.createProjectAct)
         menu.addSeparator()
-        menu.addAction(self.setupDevelopAct)
-        menu.addSeparator()
-        menu.addAction(self.initializeDbAct)
+        menu.addMenu(dbMenu)
         menu.addSeparator()
         menu.addAction(self.showViewsAct)
         menu.addAction(self.showRoutesAct)
         menu.addAction(self.showTweensAct)
         menu.addSeparator()
-        menu.addAction(self.runPythonShellAct)
-        menu.addSeparator()
         menu.addAction(self.buildDistroAct)
         menu.addSeparator()
         menu.addAction(self.documentationAct)
@@ -411,6 +488,9 @@
         menu.addAction(self.aboutPyramidAct)
         
         self.__menus["main"] = menu
+        self.__menus["database"] = dbMenu
+        
+        self.__setCurrentProject(None)
         
         return menu
     
@@ -581,6 +661,10 @@
         if self.__serverProc is not None:
             self.__serverProcFinished()
         self.__setCurrentProject(None)
+        
+        for dlg in (self.__migrationSummaryDialog,):
+            if dlg is not None:
+                dlg.close()
     
     def __getExecutablePaths(self, file):
         """
@@ -626,8 +710,7 @@
         @rtype list of str
         """
         variants = []
-        # TODO: that doesn't exist anymore
-        cmd = "pcreate"
+        cmd = "cookiecutter"
         
         for variant in ['Python3']:
             virtEnv = self.__getVirtualEnvironment(variant)
@@ -737,7 +820,16 @@
         
         return ""
 
-    def getPyramidCommand(self, cmd, language=""):
+    def getProjectVirtualEnvironment(self):
+        """
+        Public method to generate the path of the project virtual environment.
+        
+        @return path of the Pyramid project virtual environment
+        @rtype str
+        """
+        return os.path.join(self.projectPath(), "env")
+    
+    def getPyramidCommand(self, cmd, language="", virtualEnv=""):
         """
         Public method to build a Pyramid command.
         
@@ -746,15 +838,18 @@
         @param language Python variant to get the virtual environment
             for (one of '' or 'Python3')
         @type str
+        @param virtualEnv path of the project's Python virtual environment
+        @type str
         @return full pyramid command
         @rtype str
         """
         if not language:
             language = self.__ericProject.getProjectLanguage()
         
-        virtualEnv = self.__getVirtualEnvironment(language)
-        if isWindowsPlatform() and not virtualEnv:
-            virtualEnv = self.__getDebugEnvironment(language)
+        if not virtualEnv:
+            virtualEnv = self.__getVirtualEnvironment(language)
+            if not virtualEnv:
+                virtualEnv = self.__getDebugEnvironment(language)
         if isWindowsPlatform():
             fullCmds = [
                 os.path.join(virtualEnv, "Scripts", cmd + '.exe'),
@@ -776,6 +871,24 @@
                     break
         return cmd
     
+    def __assemblePyramidCommand(self, cmd, virtualEnv):
+        """
+        Private method to assemble the full pyramid command for a given virtual
+        environment.
+        
+        @param cmd command
+        @type str
+        @param virtualEnv path of the project's Python virtual environment
+        @type str
+        @return assembled pyramid command
+        @rtype str
+        """
+        return (
+            os.path.join(virtualEnv, "Scripts", cmd + '.exe')
+            if isWindowsPlatform() else
+            os.path.join(virtualEnv, "bin", cmd)
+        )
+    
     def getPythonCommand(self):
         """
         Public method to build the Python command.
@@ -835,19 +948,18 @@
         @rtype str
         """
         if not self.__pyramidVersion:
-            # TODO: that doesn't exist anymore
-            cmd = self.getPyramidCommand("pcreate")
-            if isWindowsPlatform():
-                cmd = os.path.join(os.path.dirname(cmd), "pcreate-script.py")
+            cmd = self.getPyramidCommand(
+                "pdistreport",
+                virtualEnv=self.getProjectVirtualEnvironment()
+            )
             try:
-                with open(cmd, 'r', encoding="utf-8") as f:
-                    lines = f.read().splitlines()
-                for line in lines:
-                    if line.startswith("__requires__"):
-                        #- sample: __requires__ = 'pyramid==1.4'
-                        vers = line.strip().split()[-1][1:-1].split("==")[1]
-                        self.__pyramidVersion = vers
-            except OSError:
+                output = subprocess.check_output([cmd])     # secok
+                outputLines = output.decode().splitlines()
+                for line in outputLines:
+                    if line.startswith("Pyramid version:"):
+                        self.__pyramidVersion = line.rsplit(None, 1)[1]
+                        break
+            except (OSError, subprocess.CalledProcessError):
                 self.__pyramidVersion = ""
         
         return self.__pyramidVersion
@@ -913,32 +1025,31 @@
         """
         from .CreateParametersDialog import CreateParametersDialog
         
-        dlg = CreateParametersDialog(self)
+        dlg = CreateParametersDialog(self.__ui)
         if dlg.exec() == QDialog.DialogCode.Accepted:
-            scaffold, project, overwrite, simulate = dlg.getData()
+            template, version, overwrite, contextData = dlg.getData()
             
-            # TODO: that doesn't exist anymore
-            cmd = self.getPyramidCommand("pcreate")
-            args = []
+            cmd = self.getPyramidCommand("cookiecutter")
+            args = ["--no-input"]
             if overwrite:
-                args.append("--overwrite")
-            else:
-                args.append("--interactive")
-            if simulate:
-                args.append("--simulate")
-            args.append("--scaffold={0}".format(scaffold))
-            args.append(project)
+                args.append("--overwrite-if-exists")
+            if version:
+                args += ["--checkout", version]
+            args.append(template)
+            for context, data in contextData.items():
+                args.append("{0}={1}".format(context, data))
             dlg = PyramidDialog(self.tr("Create Pyramid Project"),
                                 linewrap=False, parent=self.__ui)
             if dlg.startProcess(
                 cmd, args, self.__ericProject.getProjectPath()
             ):
                 dlg.exec()
-                if dlg.normalExit() and not simulate:
-                    # search for files created by pcreate and add them to the
-                    # project
+                if dlg.normalExit() and "repo_name" in contextData:
+                    # search for files created by cookiecutter and add them
+                    # to the project
                     projectPath = os.path.join(
-                        self.__ericProject.getProjectPath(), project)
+                        self.__ericProject.getProjectPath(),
+                        contextData["repo_name"])
                     for entry in os.walk(projectPath):
                         for fileName in entry[2]:
                             fullName = os.path.join(entry[0], fileName)
@@ -946,12 +1057,63 @@
                     
                     # create the base directory for translations
                     i18nPath = os.path.join(
-                        projectPath, project.lower(), "i18n")
+                        projectPath, contextData["repo_name"].lower(),
+                        "i18n")
                     if not os.path.exists(i18nPath):
                         os.makedirs(i18nPath)
                     self.__ericProject.setDirty(True)
                     
-                    self.__setCurrentProject(project)
+                    combinedOutput = False
+                    argsLists = []
+                    
+                    # 1. create a Python virtual environment for the project
+                    argsLists.append([sys.executable, "-m", "venv", "env"])
+                    # 2. upgrade packaging tools
+                    python = self.__assemblePyramidCommand(
+                        "python", os.path.join(projectPath, "env"))
+                    argsLists.append([python, "-m", "pip", "install",
+                                      "--upgrade", "pip", "setuptools"])
+                    # 3. install project in editable mode with testing
+                    argsLists.append([python, "-m", "pip", "install", "-e",
+                                      ".[testing]"])
+                    
+                    if (
+                        "backend" in contextData and
+                        contextData["backend"] == "sqlalchemy"
+                    ):
+                        # only SQLAlchemy needs initialization of alembic
+                        combinedOutput = True
+                        
+                        # 4. initialize database
+                        alembic = self.__assemblePyramidCommand(
+                            "alembic", os.path.join(projectPath, "env"))
+                        argsLists.append([alembic, "-c", "development.ini",
+                                          "revision", "--autogenerate",
+                                          "--message", "initialized database"])
+                        # 5. upgrade database to initial version
+                        argsLists.append([alembic, "-c", "development.ini",
+                                          "upgrade", "head"])
+                    
+                    dlg = PyramidDialog(
+                        self.tr("Initializing Pyramid Project"),
+                        linewrap=False, combinedOutput=combinedOutput,
+                        parent=self.__ui)
+                    if dlg.startBatchProcesses(argsLists,
+                                               workingDir=projectPath):
+                        dlg.exec()
+                    
+                    self.__setCurrentProject(contextData["repo_name"])
+                    
+                    if (
+                        "backend" in contextData and
+                        contextData["backend"] == "sqlalchemy"
+                    ):
+                        # add the alembic files created above to the project
+                        migrationsPath = self.migrationsPath()
+                        for entry in os.walk(migrationsPath):
+                            for fileName in entry[2]:
+                                fullName = os.path.join(entry[0], fileName)
+                                self.__ericProject.appendFile(fullName)
     
     ##################################################################
     ## methods below implement site related functions
@@ -973,7 +1135,7 @@
                 os.path.isdir(os.path.join(ppath, entry))
             ):
                 projects.append(entry)
-        return projects
+        return sorted(projects)
     
     def __selectProject(self):
         """
@@ -1002,9 +1164,9 @@
                 projects = None
         self.__setCurrentProject(project)
     
-    def __projectPath(self):
+    def projectPath(self):
         """
-        Private method to calculate the full path of the Pyramid project.
+        Public method to calculate the full path of the Pyramid project.
         
         @return path of the project
         @rtype str
@@ -1045,7 +1207,7 @@
         else:
             lowerProject = self.__project().lower()
             config = configparser.ConfigParser()
-            config.read(os.path.join(self.__projectPath(), "setup.cfg"))
+            config.read(os.path.join(self.projectPath(), "setup.cfg"))
             try:
                 outputDir = config.get("init_catalog", "output_dir")
             except (configparser.NoOptionError, configparser.NoSectionError):
@@ -1061,9 +1223,16 @@
         
         if self.__currentProject is None:
             self.initializeDbAct.setEnabled(False)
+            with contextlib.suppress(KeyError):
+                self.__menus["database"].setEnabled(False)
         else:
             initCmd = self.__getInitDbCommand()
             self.initializeDbAct.setEnabled(os.path.exists(initCmd))
+            
+            alembicDir = os.path.join(
+                self.projectPath(), self.__currentProject,
+                "alembic", "versions")
+            self.__menus["database"].setEnabled(os.path.exists(alembicDir))
     
     def __project(self):
         """
@@ -1086,18 +1255,15 @@
     ## slots below implement run functions
     ##################################################################
     
-    def __runServer(self, logging=False):
+    def __runServer(self):
         """
         Private slot to start the Pyramid Web server.
-        
-        @param logging flag indicating to enable logging
-        @type bool
         """
         consoleCmd = self.isSpawningConsole(
             self.__plugin.getPreferences("ConsoleCommand"))[1]
         if consoleCmd:
             try:
-                projectPath = self.__projectPath()
+                projectPath = self.projectPath()
             except PyramidNoProjectSelectedException:
                 EricMessageBox.warning(
                     self.__ui,
@@ -1108,9 +1274,10 @@
             
             args = Utilities.parseOptionString(consoleCmd)
             args[0] = Utilities.getExecutablePath(args[0])
-            args.append(self.getPyramidCommand("pserve"))
-            if logging:
-                args.append("--log-file=server.log")
+            args.append(self.getPyramidCommand(
+                "pserve",
+                virtualEnv=self.getProjectVirtualEnvironment()
+            ))
             args.append("--reload")
             args.append(os.path.join(projectPath, "development.ini"))
             
@@ -1132,12 +1299,6 @@
                     self.tr('Process Generation Error'),
                     self.tr('The Pyramid server could not be started.'))
     
-    def __runLoggingServer(self):
-        """
-        Private slot to start the Pyramid Web server with logging.
-        """
-        self.__runServer(True)
-    
     def __serverProcFinished(self):
         """
         Private slot connected to the finished signal.
@@ -1156,7 +1317,7 @@
         Private slot to start the default web browser with the server URL.
         """
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1168,10 +1329,10 @@
         config = configparser.ConfigParser()
         config.read(os.path.join(projectPath, "development.ini"))
         try:
-            port = config.get("server:main", "port")
+            listen = config.get("server:main", "listen")
         except (configparser.NoOptionError, configparser.NoSectionError):
-            port = "8080"
-        url = "http://localhost:{0}".format(port)
+            listen = "localhost:6543"
+        url = "http://{0}".format(listen)
         if self.__plugin.getPreferences("UseExternalBrowser"):
             res = QDesktopServices.openUrl(QUrl(url))
             if not res:
@@ -1191,7 +1352,7 @@
             self.__plugin.getPreferences("ConsoleCommand"))[1]
         if consoleCmd:
             try:
-                projectPath = self.__projectPath()
+                projectPath = self.projectPath()
             except PyramidNoProjectSelectedException:
                 EricMessageBox.warning(
                     self.__ui,
@@ -1202,7 +1363,10 @@
             
             args = Utilities.parseOptionString(consoleCmd)
             args[0] = Utilities.getExecutablePath(args[0])
-            args.append(self.getPyramidCommand("pshell"))
+            args.append(self.getPyramidCommand(
+                "pshell",
+                virtualEnv=self.getProjectVirtualEnvironment()
+            ))
             consoleType = self.__plugin.getPreferences("Python3ConsoleType")
             args.append("--python-shell={0}".format(consoleType))
             args.append(os.path.join(projectPath, "development.ini"))
@@ -1218,41 +1382,6 @@
                             ' started.'))
 
     ##################################################################
-    ## slots below implement setup functions
-    ##################################################################
-    
-    def __setupDevelop(self):
-        """
-        Private slot to set up the development environment for the current
-        project.
-        """
-        title = self.tr("Setup Development Environment")
-        try:
-            wd = self.__projectPath()
-        except PyramidNoProjectSelectedException:
-            EricMessageBox.warning(
-                self.__ui,
-                title,
-                self.tr('No current Pyramid project selected or no Pyramid'
-                        ' project created yet. Aborting...'))
-            return
-        
-        cmd = self.getPythonCommand()
-        args = []
-        args.append("setup.py")
-        args.append("develop")
-        
-        dia = PyramidDialog(
-            title,
-            msgSuccess=self.tr("Pyramid development environment setup"
-                               " successfully."))
-        res = dia.startProcess(cmd, args, wd)
-        if res:
-            dia.exec()
-            initCmd = self.__getInitDbCommand()
-            self.initializeDbAct.setEnabled(os.path.exists(initCmd))
-    
-    ##################################################################
     ## slots below implement distribution functions
     ##################################################################
     
@@ -1263,7 +1392,7 @@
         """
         title = self.tr("Build Distribution File")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1279,7 +1408,10 @@
         dlg = DistributionTypeSelectionDialog(self, projectPath, self.__ui)
         if dlg.exec() == QDialog.DialogCode.Accepted:
             formats = dlg.getFormats()
-            cmd = self.getPythonCommand()
+            cmd = self.getPyramidCommand(
+                "python",
+                virtualEnv=self.getProjectVirtualEnvironment()
+            )
             args = []
             args.append("setup.py")
             args.append("sdist")
@@ -1295,54 +1427,6 @@
                 dia.exec()
     
     ##################################################################
-    ## slots below implement database functions
-    ##################################################################
-    
-    def __getInitDbCommand(self):
-        """
-        Private method to create the path to the initialization script.
-        
-        @return path to the initialization script
-        @rtype str
-        """
-        try:
-            cmd = "initialize_{0}_db".format(self.__project())
-            return self.getPyramidCommand(cmd)
-        except PyramidNoProjectSelectedException:
-            EricMessageBox.warning(
-                self.__ui,
-                self.tr("Initialize Database"),
-                self.tr('No current Pyramid project selected or no Pyramid'
-                        ' project created yet. Aborting...'))
-            return ""
-    
-    def __initializeDatabase(self):
-        """
-        Private slot to initialize the database of the Pyramid project.
-        """
-        title = self.tr("Initialize Database")
-        try:
-            projectPath = self.__projectPath()
-        except PyramidNoProjectSelectedException:
-            EricMessageBox.warning(
-                self.__ui,
-                title,
-                self.tr('No current Pyramid project selected or no Pyramid'
-                        ' project created yet. Aborting...'))
-            return
-        
-        cmd = self.__getInitDbCommand()
-        args = []
-        args.append("development.ini")
-        
-        dia = PyramidDialog(
-            title,
-            msgSuccess=self.tr("Database initialized successfully."))
-        res = dia.startProcess(cmd, args, projectPath)
-        if res:
-            dia.exec()
-    
-    ##################################################################
     ## slots below implement various debugging functions
     ##################################################################
     
@@ -1352,7 +1436,7 @@
         """
         title = self.tr("Show Matching Views")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1370,7 +1454,10 @@
         if not ok or url == "":
             return
         
-        cmd = self.getPyramidCommand("pviews")
+        cmd = self.getPyramidCommand(
+            "pviews",
+            virtualEnv=self.getProjectVirtualEnvironment()
+        )
         args = []
         args.append("development.ini")
         args.append(url)
@@ -1386,7 +1473,7 @@
         """
         title = self.tr("Show Routes")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1408,7 +1495,7 @@
         """
         title = self.tr("Show Tween Objects")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1417,7 +1504,10 @@
                         ' project created yet. Aborting...'))
             return
         
-        cmd = self.getPyramidCommand("ptweens")
+        cmd = self.getPyramidCommand(
+            "ptweens",
+            virtualEnv=self.getProjectVirtualEnvironment()
+        )
         args = []
         args.append("development.ini")
 
@@ -1505,7 +1595,7 @@
         """
         title = self.tr("Extract messages")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1559,7 +1649,7 @@
         title = self.tr(
             "Initializing message catalog for '{0}'").format(code)
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1596,7 +1686,7 @@
         """
         title = self.tr("Compiling message catalogs")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1633,7 +1723,7 @@
         """
         title = self.tr("Compiling message catalogs")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1686,7 +1776,7 @@
         """
         title = self.tr("Updating message catalogs")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1716,7 +1806,7 @@
         """
         title = self.tr("Updating message catalogs")
         try:
-            projectPath = self.__projectPath()
+            projectPath = self.projectPath()
         except PyramidNoProjectSelectedException:
             EricMessageBox.warning(
                 self.__ui,
@@ -1763,7 +1853,7 @@
         editor = self.__plugin.getPreferences("TranslationsEditor")
         if poFile.endswith(".po") and editor:
             try:
-                wd = self.__projectPath()
+                wd = self.projectPath()
             except PyramidNoProjectSelectedException:
                 wd = ""
             started, pid = QProcess.startDetached(editor, [poFile], wd)
@@ -1774,3 +1864,199 @@
                     self.tr('The translations editor process ({0}) could'
                             ' not be started.').format(
                         os.path.basename(editor)))
+    
+    #######################################################################
+    ## database related methods and slots below
+    #######################################################################
+    
+    def getAlembicCommand(self):
+        """
+        Public method to get the path to the alembic executable of the current
+        Pyramid project.
+        
+        @return path to the alembic executable
+        @rtype str
+        """
+        return self.getPyramidCommand(
+            "alembic",
+            virtualEnv=self.getProjectVirtualEnvironment()
+        )
+    
+    def migrationsPath(self):
+        """
+        Public method to get the path to the migrations directory of the
+        current Pyramid project.
+        
+        @return pathof the directory containing the migrations
+        @rtype str
+        """
+        return os.path.join(self.projectPath(), self.__currentProject,
+                            "alembic", "versions")
+    
+    def __getInitDbCommand(self):
+        """
+        Private method to create the path to the initialization script.
+        
+        @return path to the initialization script
+        @rtype str
+        """
+        try:
+            cmd = "initialize_{0}_db".format(self.__project())
+            return self.getPyramidCommand(
+                cmd,
+                virtualEnv=self.getProjectVirtualEnvironment()
+            )
+        except PyramidNoProjectSelectedException:
+            EricMessageBox.warning(
+                self.__ui,
+                self.tr("Initialize Database"),
+                self.tr('No current Pyramid project selected or no Pyramid'
+                        ' project created yet. Aborting...'))
+            return ""
+    
+    @pyqtSlot()
+    def __initializeDatabase(self):
+        """
+        Private slot to initialize the database of the Pyramid project.
+        """
+        title = self.tr("Initialize Database")
+        try:
+            projectPath = self.projectPath()
+        except PyramidNoProjectSelectedException:
+            EricMessageBox.warning(
+                self.__ui,
+                title,
+                self.tr('No current Pyramid project selected or no Pyramid'
+                        ' project created yet. Aborting...'))
+            return
+        
+        cmd = self.__getInitDbCommand()
+        args = []
+        args.append("development.ini")
+        
+        dia = PyramidDialog(
+            title,
+            msgSuccess=self.tr("Database initialized successfully."))
+        res = dia.startProcess(cmd, args, projectPath)
+        if res:
+            dia.exec()
+    
+    @pyqtSlot()
+    def __createMigration(self):
+        """
+        Private slot to create a new database migration.
+        """
+        title = self.tr("Create Migration")
+        projectPath = self.projectPath()
+        migrations = self.migrationsPath()
+        
+        message, ok = QInputDialog.getText(
+            None,
+            title,
+            self.tr("Enter a short message for the migration:"),
+            QLineEdit.EchoMode.Normal)
+        if ok:
+            args = ["-c", "development.ini", "revision", "--autogenerate"]
+            if migrations:
+                args += ["--version-path", migrations]
+            if message:
+                args += ["--message", message]
+            
+            dlg = PyramidDialog(
+                title,
+                msgSuccess=self.tr("\nMigration created successfully."),
+                linewrap=False, combinedOutput=True,
+                parent=self.__ui
+            )
+            if dlg.startProcess(self.getAlembicCommand(), args,
+                                workingDir=projectPath):
+                dlg.exec()
+                if dlg.normalExit():
+                    versionsPattern = os.path.join(migrations, "*.py")
+                    for fileName in glob.iglob(versionsPattern):
+                        self.__ericProject.appendFile(fileName)
+    
+    @pyqtSlot()
+    def upgradeDatabase(self, revision=None):
+        """
+        Public slot to upgrade the database to the head or a given version.
+        
+        @param revision migration revision to upgrade to
+        @type str
+        """
+        title = self.tr("Upgrade Database")
+        projectPath = self.projectPath()
+        
+        args = ["-c", "development.ini", "upgrade"]
+        if revision:
+            args.append(revision)
+        else:
+            args.append("head")
+        
+        dlg = PyramidDialog(
+            title,
+            msgSuccess=self.tr("\nDatabase upgraded successfully."),
+            linewrap=False, combinedOutput=True, parent=self.__ui
+        )
+        if dlg.startProcess(self.getAlembicCommand(), args,
+                            workingDir=projectPath):
+            dlg.exec()
+    
+    @pyqtSlot()
+    def downgradeDatabase(self, revision=None):
+        """
+        Public slot to downgrade the database to the previous or a given
+        version.
+        
+        @param revision migration revision to downgrade to
+        @type str
+        """
+        title = self.tr("Downgrade Database")
+        projectPath = self.projectPath()
+        
+        args = ["-c", "development.ini", "downgrade"]
+        if revision:
+            args.append(revision)
+        else:
+            args.append("-1")
+        
+        dlg = PyramidDialog(
+            title,
+            msgSuccess=self.tr("\nDatabase downgraded successfully."),
+            linewrap=False, combinedOutput=True, parent=self.__ui
+        )
+        if dlg.startProcess(self.getAlembicCommand(), args,
+                            workingDir=projectPath):
+            dlg.exec()
+    
+    @pyqtSlot()
+    def __showMigrationsSummary(self):
+        """
+        Private slot to show a migrations history summary.
+        """
+        from .MigrateSummaryDialog import MigrateSummaryDialog
+        
+        if self.__migrationSummaryDialog is None:
+            self.__migrationSummaryDialog = MigrateSummaryDialog(
+                self, parent=self.__ui)
+        
+        self.__migrationSummaryDialog.showSummary()
+    
+    @pyqtSlot()
+    def __showMigrationsHistory(self):
+        """
+        Private slot to show the full migrations history.
+        """
+        title = self.tr("Migrations History")
+        projectPath = self.projectPath()
+        
+        args = ["-c", "development.ini", "history", "--indicate-current",
+                "--verbose"]
+        
+        dlg = PyramidDialog(
+            title,
+            linewrap=False, combinedOutput=True, parent=self.__ui
+        )
+        if dlg.startProcess(self.getAlembicCommand(), args,
+                            workingDir=projectPath):
+            dlg.exec()
--- a/ProjectPyramid/PyramidDialog.py	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/PyramidDialog.py	Sun Jun 06 16:30:37 2021 +0200
@@ -30,7 +30,7 @@
     """
     def __init__(self, text, fixed=False, linewrap=True,
                  msgSuccess=None, msgError=None,
-                 parent=None):
+                 combinedOutput=False, parent=None):
         """
         Constructor
         
@@ -44,6 +44,9 @@
         @type str
         @param msgError optional string to show upon unsuccessful execution
         @type str
+        @param combinedOutput flag indicating to combine the output into the
+            output pane
+        @type bool
         @param parent parent widget
         @type QWidget
         """
@@ -55,11 +58,13 @@
         self.buttonBox.button(
             QDialogButtonBox.StandardButton.Cancel).setDefault(True)
         
-        self.proc = None
-        self.argsLists = []
-        self.workingDir = None
-        self.msgSuccess = msgSuccess
-        self.msgError = msgError
+        self.__proc = None
+        self.__argsLists = []
+        self.__workingDir = None
+        self.__msgSuccess = msgSuccess
+        self.__msgError = msgError
+        self.__combinedOutput = combinedOutput
+        self.__batchMode = False
         
         self.outputGroup.setTitle(text)
         
@@ -83,17 +88,17 @@
         button.
         """
         if (
-            self.proc is not None and
-            self.proc.state() != QProcess.ProcessState.NotRunning
+            self.__proc is not None and
+            self.__proc.state() != QProcess.ProcessState.NotRunning
         ):
-            self.proc.terminate()
-            QTimer.singleShot(2000, self.proc.kill)
-            self.proc.waitForFinished(3000)
+            self.__proc.terminate()
+            QTimer.singleShot(2000, self.__proc.kill)
+            self.__proc.waitForFinished(3000)
         
         self.inputGroup.setEnabled(False)
         self.inputGroup.hide()
         
-        self.proc = None
+        self.__proc = None
         
         self.buttonBox.button(
             QDialogButtonBox.StandardButton.Close).setEnabled(True)
@@ -105,10 +110,9 @@
             QDialogButtonBox.StandardButton.Close).setFocus(
                 Qt.FocusReason.OtherFocusReason)
         
-        if self.argsLists:
-            args = self.argsLists[0][:]
-            del self.argsLists[0]
-            self.startProcess(args[0], args[1:], self.workingDir)
+        if self.__argsLists:
+            args = self.__argsLists.pop(0)[:]
+            self.startProcess(args[0], args[1:], self.__workingDir)
     
     def on_buttonBox_clicked(self, button):
         """
@@ -141,10 +145,10 @@
         )
         self.finish()
         
-        if self.normal and self.msgSuccess:
-            self.resultbox.insertPlainText(self.msgSuccess)
-        elif not self.normal and self.msgError:
-            self.resultbox.insertPlainText(self.msgError)
+        if self.normal and self.__msgSuccess:
+            self.resultbox.insertPlainText(self.__msgSuccess)
+        elif not self.normal and self.__msgError:
+            self.resultbox.insertPlainText(self.__msgError)
         self.resultbox.ensureCursorVisible()
     
     def startProcess(self, command, args, workingDir=None, showArgs=True):
@@ -176,20 +180,26 @@
             QDialogButtonBox.StandardButton.Cancel).setFocus(
                 Qt.FocusReason.OtherFocusReason)
         
+        if self.__batchMode:
+            self.resultbox.append(80 * '#')
+        
         if showArgs:
             self.resultbox.append(command + ' ' + ' '.join(args))
             self.resultbox.append('')
         
-        self.proc = QProcess()
+        self.__proc = QProcess()
+        if self.__combinedOutput:
+            self.__proc.setProcessChannelMode(
+                QProcess.ProcessChannelMode.MergedChannels)
         
-        self.proc.finished.connect(self.__procFinished)
-        self.proc.readyReadStandardOutput.connect(self.__readStdout)
-        self.proc.readyReadStandardError.connect(self.__readStderr)
+        self.__proc.finished.connect(self.__procFinished)
+        self.__proc.readyReadStandardOutput.connect(self.__readStdout)
+        self.__proc.readyReadStandardError.connect(self.__readStderr)
         
         if workingDir:
-            self.proc.setWorkingDirectory(workingDir)
-        self.proc.start(command, args)
-        procStarted = self.proc.waitForStarted()
+            self.__proc.setWorkingDirectory(workingDir)
+        self.__proc.start(command, args)
+        procStarted = self.__proc.waitForStarted()
         if not procStarted:
             self.buttonBox.setFocus()
             self.inputGroup.setEnabled(False)
@@ -216,15 +226,15 @@
         @return flag indicating a successful start of the first process
         @rtype bool
         """
-        self.argsLists = argsLists[:]
-        self.workingDir = workingDir
+        self.__argsLists = argsLists[:]
+        self.__workingDir = workingDir
+        self.__batchMode = True
         
         # start the first process
-        args = self.argsLists[0][:]
-        del self.argsLists[0]
-        res = self.startProcess(args[0], args[1:], self.workingDir)
+        args = self.__argsLists.pop(0)[:]
+        res = self.startProcess(args[0], args[1:], self.__workingDir)
         if not res:
-            self.argsLists = []
+            self.__argsLists = []
         
         return res
     
@@ -254,8 +264,8 @@
         It reads the output of the process, formats it and inserts it into
         the contents pane.
         """
-        if self.proc is not None:
-            out = str(self.proc.readAllStandardOutput(),
+        if self.__proc is not None:
+            out = str(self.__proc.readAllStandardOutput(),
                       Preferences.getSystem("IOEncoding"),
                       'replace')
             self.resultbox.insertPlainText(out)
@@ -270,8 +280,8 @@
         It reads the error output of the process and inserts it into the
         error pane.
         """
-        if self.proc is not None:
-            err = str(self.proc.readAllStandardError(),
+        if self.__proc is not None:
+            err = str(self.__proc.readAllStandardError(),
                       Preferences.getSystem("IOEncoding"),
                       'replace')
             self.errorGroup.show()
@@ -307,7 +317,7 @@
             self.resultbox.insertPlainText(inputTxt)
             self.resultbox.ensureCursorVisible()
         
-        self.proc.write(strToQByteArray(inputTxt))
+        self.__proc.write(strToQByteArray(inputTxt))
         
         self.passwordCheckBox.setChecked(False)
         self.input.clear()
--- a/ProjectPyramid/PyramidRoutesDialog.py	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/PyramidRoutesDialog.py	Sun Jun 06 16:30:37 2021 +0200
@@ -174,7 +174,10 @@
         self.proc.readyReadStandardOutput.connect(self.__readStdout)
         self.proc.readyReadStandardError.connect(self.__readStderr)
         
-        cmd = self.__project.getPyramidCommand("proutes")
+        cmd = self.__project.getPyramidCommand(
+            "proutes",
+            virtualEnv=self.__project.getProjectVirtualEnvironment()
+        )
         args = []
         args.append("development.ini")
 
Binary file ProjectPyramid/i18n/pyramid_de.qm has changed
--- a/ProjectPyramid/i18n/pyramid_de.ts	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/i18n/pyramid_de.ts	Sun Jun 06 16:30:37 2021 +0200
@@ -4,25 +4,9 @@
   <context>
     <name>CreateParametersDialog</name>
     <message>
-      <location filename="../CreateParametersDialog.py" line="55" />
-      <source>The pcreate command did not finish within 30s.</source>
-      <translation>Das pcreate Kommando endete nicht innerhalb von 30s.</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="58" />
-      <source>Could not start the pcreate executable.</source>
-      <translation>Der pcreate Prozess konnte nicht gestartet werden.</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="69" />
-      <source>Process Generation Error</source>
-      <translation>Fehler bei der Prozessgenerierung</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="115" />
-      <source>{0} ({1})</source>
-      <comment>scaffold name, explanatory text</comment>
-      <translation>{0} ({1})</translation>
+      <location filename="../CreateParametersDialog.py" line="47" />
+      <source>No Database</source>
+      <translation>Keine Datenbank</translation>
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
@@ -31,23 +15,58 @@
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Project &amp;Name:</source>
-      <translation>Projekt&amp;name:</translation>
+      <source>Template:</source>
+      <translation>Vorlage:</translation>
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the template to be used</source>
+      <translation>Gib die zu verwendende Vorlage ein</translation>
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Template Version:</source>
+      <translation>Version der Vorlage:</translation>
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter an optional branch, tag or commit</source>
+      <translation>Gib einen optionalen Zweig, eine Marke oder eine Revision ein</translation>
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>CookieCutter Starter Parameters</source>
+      <translation>CookieCutter Starter Parameter</translation>
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Enter the name of the Pyramid project to create</source>
-      <translation>Gib den Namen des zu erstellenden Pyramid Projektes ein</translation>
+      <source>Project Name:</source>
+      <translation>Projektname:</translation>
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the name of the Pyramid project</source>
+      <translation>Gib den Namen des Pyramidprojektes ein</translation>
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>&amp;Scaffold:</source>
-      <translation>&amp;Vorlage:</translation>
+      <source>Template Language:</source>
+      <translation>Vorlagensprache:</translation>
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Select the scaffold to be used</source>
-      <translation>Wähle die zu verwendende Vorlage aus</translation>
+      <source>Select the templating language</source>
+      <translation>Wähle die Sprache der Vorlagen</translation>
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Backend:</source>
+      <translation>Datenbank:</translation>
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Select the database backend</source>
+      <translation>Wähle die Datenbankanbindung</translation>
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
@@ -59,16 +78,6 @@
       <source>Overwrite existing files</source>
       <translation>Existierende Dateien überschreiben</translation>
     </message>
-    <message>
-      <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Select to simulate the creation</source>
-      <translation>Auswählen, um die Erstellung zu simulieren</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Simulate Pyramid project creation</source>
-      <translation>Pyramid Projekterstellung simulieren</translation>
-    </message>
   </context>
   <context>
     <name>DistributionTypeSelectionDialog</name>
@@ -152,522 +161,681 @@
     </message>
   </context>
   <context>
+    <name>MigrateSummaryDialog</name>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="40" />
+      <source>Refresh</source>
+      <translation>Erneuern</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="98" />
+      <location filename="../MigrateSummaryDialog.py" line="91" />
+      <source>Migrations Summary</source>
+      <translation>Zusammenfassung der Migrationen</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="92" />
+      <source>The 'alembic' process did not finish within 10 seconds.</source>
+      <translation>Der 'alembic' Prozess wurde nicht innerhalb 10 Sekunden beendet.</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="99" />
+      <source>The 'alembic' process could not be started.</source>
+      <translation>Der 'alembic' Prozess konnte nicht gestartet werden.</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="184" />
+      <location filename="../MigrateSummaryDialog.py" line="170" />
+      <source>Upgrade</source>
+      <translation>Db Aktualisierung</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="172" />
+      <source>Downgrade</source>
+      <translation>Db Rückstufung</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Old Revision</source>
+      <translation>Alte Version</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>New Revision</source>
+      <translation>Neue Version</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Message</source>
+      <translation>Bezeichnung</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Labels</source>
+      <translation>Label</translation>
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Press to upgrade or downgrade the database to the selected migration</source>
+      <translation>Drücken, um die Datenbank auf die ausgewählte Migration zu aktualisieren oder rückzustufen</translation>
+    </message>
+  </context>
+  <context>
     <name>Project</name>
     <message>
-      <location filename="../Project.py" line="136" />
+      <location filename="../Project.py" line="143" />
       <source>Current Pyramid Project</source>
       <translation>Aktuelles Pyramid Projekt</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="140" />
+      <location filename="../Project.py" line="147" />
       <source>Selects the current Pyramid project</source>
       <translation>Wählt das aktuelle Pyramid Projekt aus</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="142" />
+      <location filename="../Project.py" line="149" />
       <source>&lt;b&gt;Current Pyramid Project&lt;/b&gt;&lt;p&gt;Selects the Pyramid project. Used for multi-project Pyramid projects to switch between the projects.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Aktuelles Pyramid Projekt&lt;/b&gt;&lt;p&gt;Wählt das Pyramid Projekt aus. Wird bei Multiprojekt Pyramid Projekten eingesetzt, um zwischen den Projekten umzuschalten.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="931" />
-      <location filename="../Project.py" line="155" />
+      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="162" />
       <source>Create Pyramid Project</source>
       <translation>Pyramid Projekt erstellen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="156" />
+      <location filename="../Project.py" line="163" />
       <source>Create Pyramid &amp;Project</source>
       <translation>Pyramid &amp;Projekt erstellen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="159" />
+      <location filename="../Project.py" line="166" />
       <source>Creates a new Pyramid project</source>
       <translation>Erstellt ein neues Pyramid Projekt</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="161" />
+      <location filename="../Project.py" line="168" />
       <source>&lt;b&gt;Create Pyramid Project&lt;/b&gt;&lt;p&gt;Creates a new Pyramid project using "pcreate".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Pyramid Projekt erstellen&lt;/b&gt;&lt;p&gt;Erstellt ein neues Pyramid Projekt mittels "pcreate".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1104" />
-      <location filename="../Project.py" line="173" />
+      <location filename="../Project.py" line="1270" />
+      <location filename="../Project.py" line="180" />
       <source>Run Server</source>
       <translation>Server starten</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="174" />
+      <location filename="../Project.py" line="181" />
       <source>Run &amp;Server</source>
       <translation>&amp;Server starten</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="177" />
+      <location filename="../Project.py" line="184" />
       <source>Starts the Pyramid Web server</source>
       <translation>Startet den Pyramid Web Server</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="179" />
+      <location filename="../Project.py" line="186" />
       <source>&lt;b&gt;Run Server&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server using "pserve --reload development.ini".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Server starten&lt;/b&gt;&lt;p&gt;Startet den Pyramid Web Server mittels "pserve --reload development.ini".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="188" />
-      <source>Run Server with Logging</source>
-      <translation>Server mit Logging starten</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="189" />
-      <source>Run Server with &amp;Logging</source>
-      <translation>Server mit &amp;Logging starten</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="192" />
-      <source>Starts the Pyramid Web server with logging</source>
-      <translation>Startet den Pyramid Web Server mit Logging</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="194" />
-      <source>&lt;b&gt;Run Server with Logging&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server with logging using "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Server mit Logging starten&lt;/b&gt;&lt;p&gt;Startet den Pyramid Web Server mit Logging mittels "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1180" />
-      <location filename="../Project.py" line="1163" />
-      <location filename="../Project.py" line="203" />
+      <location filename="../Project.py" line="1341" />
+      <location filename="../Project.py" line="1324" />
+      <location filename="../Project.py" line="195" />
       <source>Run Web-Browser</source>
       <translation>Web-Browser starten</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="204" />
+      <location filename="../Project.py" line="196" />
       <source>Run &amp;Web-Browser</source>
       <translation>Web-&amp;Browser starten</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="207" />
+      <location filename="../Project.py" line="199" />
       <source>Starts the default Web-Browser with the URL of the Pyramid Web server</source>
       <translation>Startet den Standard Web-Browser mit der URL des Pyramid Web-Servers</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="210" />
+      <location filename="../Project.py" line="202" />
       <source>&lt;b&gt;Run Web-Browser&lt;/b&gt;&lt;p&gt;Starts the default Web-Browser with the URL of the Pyramid Web server.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Web-Browser starten&lt;/b&gt;&lt;p&gt;Startet den Standard Web-Browser mit der URL des Pyramid Web-Servers.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1198" />
-      <location filename="../Project.py" line="219" />
+      <location filename="../Project.py" line="1359" />
+      <location filename="../Project.py" line="211" />
       <source>Start Pyramid Python Console</source>
       <translation>Starte Pyramid Python Konsole</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="220" />
+      <location filename="../Project.py" line="212" />
       <source>Start Pyramid &amp;Python Console</source>
       <translation>Starte Pyramid &amp;Python Konsole</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="223" />
+      <location filename="../Project.py" line="215" />
       <source>Starts an interactive Python interpreter</source>
       <translation>Startet einen interaktiven Python Interpreter</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="225" />
+      <location filename="../Project.py" line="217" />
       <source>&lt;b&gt;Start Pyramid Python Console&lt;/b&gt;&lt;p&gt;Starts an interactive Python interpreter.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Starte Pyramid Python Konsole&lt;/b&gt;&lt;p&gt;Startet einen interaktiven Python Interpreter&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1229" />
-      <location filename="../Project.py" line="237" />
-      <source>Setup Development Environment</source>
-      <translation>Entwicklungsumgebung einrichten</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="238" />
-      <source>Setup &amp;Development Environment</source>
-      <translation>Entwicklungs&amp;umgebung einrichten</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="241" />
-      <source>Setup the Pyramid project in development mode</source>
-      <translation>Richtet das Pyramid Projekt im Entwicklungsmodus ein</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="243" />
-      <source>&lt;b&gt;Setup Development Environment&lt;/b&gt;&lt;p&gt;Setup the Pyramid project in development mode using "python setup.py develop".&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Entwicklungsumgebung einrichten&lt;/b&gt;&lt;p&gt;Richtet das Pyramid Projekt im Entwicklungsmodus mittels "python setup.py develop" ein.&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1323" />
-      <location filename="../Project.py" line="1314" />
-      <location filename="../Project.py" line="256" />
-      <source>Initialize Database</source>
-      <translation>Datenbank initialisieren</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="257" />
-      <source>Initialize &amp;Database</source>
-      <translation>&amp;Datenbank initialisieren</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="260" />
-      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
-      <translation>Initialisiert (oder reinitialisiert) die Datenbank des aktuellen Pyramid Projektes</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="263" />
-      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Datenbank initialisieren&lt;/b&gt;&lt;p&gt;Initialisiert (oder reinitialisiert) die Datenbank des aktuellen Pyramid Projektes.&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1366" />
-      <location filename="../Project.py" line="1353" />
-      <location filename="../Project.py" line="276" />
+      <location filename="../Project.py" line="1447" />
+      <location filename="../Project.py" line="1434" />
+      <location filename="../Project.py" line="229" />
       <source>Show Matching Views</source>
       <translation>Passende Ansichten anzeigen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="277" />
+      <location filename="../Project.py" line="230" />
       <source>Show Matching &amp;Views</source>
       <translation>Passende &amp;Ansichten anzeigen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="280" />
+      <location filename="../Project.py" line="233" />
       <source>Show views matching a given URL</source>
       <translation>Zeigt Ansichten zu einer gegebenen URL an</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="282" />
+      <location filename="../Project.py" line="235" />
       <source>&lt;b&gt;Show Matching Views&lt;/b&gt;&lt;p&gt;Show views matching a given URL.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Passende Ansichten anzeigen&lt;/b&gt;&lt;p&gt;Zeigt Ansichten zu einer gegebenen URL an.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1387" />
-      <location filename="../Project.py" line="290" />
+      <location filename="../Project.py" line="1471" />
+      <location filename="../Project.py" line="243" />
       <source>Show Routes</source>
       <translation>Routen anzeigen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="291" />
+      <location filename="../Project.py" line="244" />
       <source>Show &amp;Routes</source>
       <translation>&amp;Routen anzeigen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="294" />
+      <location filename="../Project.py" line="247" />
       <source>Show all URL dispatch routes used by a Pyramid application</source>
       <translation>Zeigt alle durch eine Pyramid Anwendung verwendete URL Routen an</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="296" />
+      <location filename="../Project.py" line="249" />
       <source>&lt;b&gt;Show Routes&lt;/b&gt;&lt;p&gt;Show all URL dispatch routes used by a Pyramid application in the order in which they are evaluated.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Routen anzeigen&lt;/b&gt;&lt;p&gt;Zeigt alle durch eine Pyramid Anwendung verwendete URL Routen in der Reihenfolge ihrer Auswertung an.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1409" />
-      <location filename="../Project.py" line="305" />
+      <location filename="../Project.py" line="1493" />
+      <location filename="../Project.py" line="258" />
       <source>Show Tween Objects</source>
       <translation>Tween Objekte anzeigen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="306" />
+      <location filename="../Project.py" line="259" />
       <source>Show &amp;Tween Objects</source>
       <translation>&amp;Tween Objekte anzeigen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="309" />
+      <location filename="../Project.py" line="262" />
       <source>Show all implicit and explicit tween objects used by a Pyramid application</source>
       <translation>Zeigt alle von einer Pyramid Anwendung verwendeten impliziten und expliziten Tween Objekte an</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="312" />
+      <location filename="../Project.py" line="265" />
       <source>&lt;b&gt;Show Tween Objects&lt;/b&gt;&lt;p&gt;Show all implicit and explicit tween objects used by a Pyramid application.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Tween Objekte anzeigen&lt;/b&gt;&lt;p&gt;Zeigt alle von einer Pyramid Anwendung verwendeten impliziten und expliziten Tween Objekte an.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="325" />
+      <location filename="../Project.py" line="278" />
       <source>Build Distribution</source>
       <translation>Distribution erzeugen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="326" />
+      <location filename="../Project.py" line="279" />
       <source>Build &amp;Distribution</source>
       <translation>&amp;Distribution erzeugen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="329" />
+      <location filename="../Project.py" line="282" />
       <source>Builds a distribution file for the Pyramid project</source>
       <translation>Erzeugt Dateien zur Distribution eines Pyramid Projektes</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="331" />
+      <location filename="../Project.py" line="284" />
       <source>&lt;b&gt;Build Distribution&lt;/b&gt;&lt;p&gt;Builds a distribution file for the Pyramid project using "python setup.py sdist".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Distribution erzeugen&lt;/b&gt;&lt;p&gt;Erzeugt Dateien zur Distribution eines Pyramid Projektes mittels "python setup.py sdist".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="344" />
+      <location filename="../Project.py" line="297" />
       <source>Documentation</source>
       <translation>Dokumentation</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="345" />
+      <location filename="../Project.py" line="298" />
       <source>D&amp;ocumentation</source>
       <translation>D&amp;okumentation</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="348" />
+      <location filename="../Project.py" line="301" />
       <source>Shows the help viewer with the Pyramid documentation</source>
       <translation>Zeigt die Hilfeanzeige mit der Pyramid Dokumentation</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="350" />
+      <location filename="../Project.py" line="303" />
       <source>&lt;b&gt;Documentation&lt;/b&gt;&lt;p&gt;Shows the help viewer with the Pyramid documentation.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Dokumentation&lt;/b&gt;&lt;p&gt;Zeigt die Hilfeanzeige mit der Pyramid Dokumentation.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="811" />
-      <location filename="../Project.py" line="362" />
+      <location filename="../Project.py" line="924" />
+      <location filename="../Project.py" line="315" />
       <source>About Pyramid</source>
       <translation>Über Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="363" />
+      <location filename="../Project.py" line="316" />
       <source>About P&amp;yramid</source>
       <translation>Über P&amp;yramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="366" />
+      <location filename="../Project.py" line="319" />
       <source>Shows some information about Pyramid</source>
       <translation>Zeigt einige Informationen über Pyramid an</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="368" />
+      <location filename="../Project.py" line="321" />
       <source>&lt;b&gt;About Pyramid&lt;/b&gt;&lt;p&gt;Shows some information about Pyramid.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Über Pyramid&lt;/b&gt;&lt;p&gt;Zeigt einige Informationen über Pyramid an.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="386" />
+      <location filename="../Project.py" line="1919" />
+      <location filename="../Project.py" line="1909" />
+      <location filename="../Project.py" line="337" />
+      <source>Initialize Database</source>
+      <translation>Datenbank initialisieren</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="338" />
+      <source>Initialize &amp;Database</source>
+      <translation>&amp;Datenbank initialisieren</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="341" />
+      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
+      <translation>Initialisiert (oder reinitialisiert) die Datenbank des aktuellen Pyramid Projektes</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="344" />
+      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Datenbank initialisieren&lt;/b&gt;&lt;p&gt;Initialisiert (oder reinitialisiert) die Datenbank des aktuellen Pyramid Projektes.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1946" />
+      <location filename="../Project.py" line="357" />
+      <source>Create Migration</source>
+      <translation>Migration erzeugen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="358" />
+      <source>&amp;Create Migration</source>
+      <translation>Migration &amp;erzeugen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="361" />
+      <source>Create a new migration for the current database</source>
+      <translation>Erzeugt eine neue Migration für die aktuelle Datenbank</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="363" />
+      <source>&lt;b&gt;Create Migration&lt;/b&gt;&lt;p&gt;Creates a new migration for the current database and stores it  in the configured migrations directory.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Migration erzeugen&lt;/b&gt;&lt;p&gt;Erzeugt eine neue Migration für die aktuelle Datenbank und speichert sie im konfigurierten Migrationsverzeichnis.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1984" />
+      <location filename="../Project.py" line="377" />
+      <source>Upgrade Database</source>
+      <translation>Datenbank aktualisieren</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="378" />
+      <source>&amp;Upgrade Database</source>
+      <translation>Datenbank &amp;aktualisieren</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="381" />
+      <source>Upgrade the database to the current migration</source>
+      <translation>Aktualisiert die Datenbank auf die aktuelle Migrationsstufe</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="383" />
+      <source>&lt;b&gt;Upgrade Database&lt;/b&gt;&lt;p&gt;Upgrades the database to the current migration.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Datenbank aktualisieren&lt;/b&gt;&lt;p&gt;Aktualisiert die Datenbank auf die aktuelle Migrationsstufe.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="2011" />
+      <location filename="../Project.py" line="392" />
+      <source>Downgrade Database</source>
+      <translation>Datenbank rückstufen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="393" />
+      <source>&amp;Downgrade Database</source>
+      <translation>Datenbank &amp;rückstufen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="396" />
+      <source>Downgrade the database to the previous version</source>
+      <translation>Stuft die Datenbank auf die vorherige Version zurück</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="398" />
+      <source>&lt;b&gt;Downgrade Database&lt;/b&gt;&lt;p&gt;Downgrades the database to the previous version.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Datenbank rückstufen&lt;/b&gt;&lt;p&gt;Stuft die Datenbank auf die vorherige Version zurück.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="411" />
+      <source>Show Migrations Summary</source>
+      <translation>Zusammenfassung der Migrationen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="412" />
+      <source>Show Migrations &amp;Summary</source>
+      <translation>&amp;Zusammenfassung der Migrationen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="415" />
+      <source>Show a summary of the created database migrations</source>
+      <translation>Zeigt eine Übersicht der erzeugten Datenbankmigrationen an</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="417" />
+      <source>&lt;b&gt;Show Migrations Summary&lt;/b&gt;&lt;p&gt;Shows a summary list of the created database migrations.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Zusammenfassung der Migrationen&lt;/b&gt;&lt;p&gt;Zeigt eine Übersicht der erzeugten Datenbankmigrationen an.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="427" />
+      <source>Show Migrations History</source>
+      <translation>Verlauf der Migrationen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="428" />
+      <source>Show Migrations &amp;History</source>
+      <translation>&amp;Verlauf der Migrationen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="431" />
+      <source>Show the full history of the created database migrations</source>
+      <translation>Zeigt den vollständigen Verlauf der erzeugten Datenbankmigrationen</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="433" />
+      <source>&lt;b&gt;Show Migrations History&lt;/b&gt;&lt;p&gt;Shows the full history of the created database migrations.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Verlauf der Migrationen&lt;/b&gt;&lt;p&gt;Zeigt den vollständigen Verlauf der erzeugten Datenbankmigrationen.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="452" />
+      <source>Database</source>
+      <translation>Datenbank</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="466" />
       <source>P&amp;yramid</source>
       <translation>P&amp;yramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="451" />
+      <location filename="../Project.py" line="531" />
       <source>Open with {0}</source>
       <translation>Mit {0} öffnen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="465" />
+      <location filename="../Project.py" line="545" />
       <source>New template...</source>
       <translation>Neues Template...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="474" />
+      <location filename="../Project.py" line="554" />
       <source>Extract Messages</source>
       <translation>Texte extrahieren</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="477" />
+      <location filename="../Project.py" line="557" />
       <source>Compile All Catalogs</source>
       <translation>Alle Kataloge übersetzen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="480" />
+      <location filename="../Project.py" line="560" />
       <source>Compile Selected Catalogs</source>
       <translation>Ausgewählte Kataloge übersetzen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="483" />
+      <location filename="../Project.py" line="563" />
       <source>Update All Catalogs</source>
       <translation>Alle Kataloge aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="486" />
+      <location filename="../Project.py" line="566" />
       <source>Update Selected Catalogs</source>
       <translation>Ausgewählte Kataloge aktualisieren</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="525" />
+      <location filename="../Project.py" line="605" />
       <source>Chameleon Templates (*.pt);;Chameleon Text Templates (*.txt);;Mako Templates (*.mako);;Mako Templates (*.mak);;HTML Files (*.html);;HTML Files (*.htm);;All Files (*)</source>
       <translation>Chameleon Templates (*.pt);;Chameleon Text Templates (*.txt);;Mako Templates (*.mako);;Mako Templates (*.mak);;HTML Dateien (*.html);;HTML Dateien (*.htm);;Alle Dateien (*)</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="564" />
-      <location filename="../Project.py" line="550" />
-      <location filename="../Project.py" line="535" />
+      <location filename="../Project.py" line="644" />
+      <location filename="../Project.py" line="630" />
+      <location filename="../Project.py" line="615" />
       <source>New Form</source>
       <translation>Neues Formular</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="551" />
+      <location filename="../Project.py" line="631" />
       <source>The file already exists! Overwrite it?</source>
       <translation>Die Datei existiert bereits. Überschreiben?</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="565" />
+      <location filename="../Project.py" line="645" />
       <source>&lt;p&gt;The new form file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;br/&gt; Problem: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;Die neue Formulardatei &lt;b&gt;{0}&lt;/b&gt; konnte nicht erstellt werden.&lt;br/&gt; Problem: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="812" />
+      <location filename="../Project.py" line="925" />
       <source>&lt;p&gt;Pyramid is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Version:&lt;/td&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URL:&lt;/td&gt;&lt;td&gt;&lt;a href="{1}"&gt;{1}&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
       <translation>&lt;p&gt;Pyramid ist ein Python Web-Framework, das eine schnelle Entwicklung und ein klares, pragmatisches Design fördert.&lt;/p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Version:&lt;/td&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URL:&lt;/td&gt;&lt;td&gt;&lt;a href="{1}"&gt;{1}&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="997" />
+      <location filename="../Project.py" line="1098" />
+      <source>Initializing Pyramid Project</source>
+      <translation>Initialisiere Pyramid Projekt</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1159" />
       <source>Select Pyramid Project</source>
       <translation>Pyramid Projekt auswählen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="998" />
+      <location filename="../Project.py" line="1160" />
       <source>Select the Pyramid project to work with.</source>
       <translation>Wähle das Pyramid Projekt aus, mit dem gearbeitet werden soll.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1036" />
+      <location filename="../Project.py" line="1198" />
       <source>None</source>
       <translation>keines</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="1203" />
       <source>&amp;Current Pyramid Project ({0})</source>
       <translation>&amp;Aktuelles Pyramid Projekt ({0})</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1724" />
-      <location filename="../Project.py" line="1694" />
-      <location filename="../Project.py" line="1641" />
-      <location filename="../Project.py" line="1604" />
-      <location filename="../Project.py" line="1567" />
-      <location filename="../Project.py" line="1513" />
-      <location filename="../Project.py" line="1416" />
-      <location filename="../Project.py" line="1394" />
+      <location filename="../Project.py" line="1926" />
+      <location filename="../Project.py" line="1910" />
+      <location filename="../Project.py" line="1811" />
+      <location filename="../Project.py" line="1781" />
+      <location filename="../Project.py" line="1728" />
+      <location filename="../Project.py" line="1691" />
+      <location filename="../Project.py" line="1654" />
+      <location filename="../Project.py" line="1600" />
+      <location filename="../Project.py" line="1500" />
+      <location filename="../Project.py" line="1478" />
+      <location filename="../Project.py" line="1441" />
+      <location filename="../Project.py" line="1400" />
       <location filename="../Project.py" line="1360" />
-      <location filename="../Project.py" line="1330" />
-      <location filename="../Project.py" line="1315" />
+      <location filename="../Project.py" line="1325" />
       <location filename="../Project.py" line="1271" />
-      <location filename="../Project.py" line="1236" />
-      <location filename="../Project.py" line="1199" />
-      <location filename="../Project.py" line="1164" />
-      <location filename="../Project.py" line="1105" />
       <source>No current Pyramid project selected or no Pyramid project created yet. Aborting...</source>
       <translation>Kein aktuelles Pyramid Projekt ausgewählt oder noch keines erstellt. Abbruch...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1773" />
-      <location filename="../Project.py" line="1216" />
-      <location filename="../Project.py" line="1132" />
+      <location filename="../Project.py" line="1860" />
+      <location filename="../Project.py" line="1380" />
+      <location filename="../Project.py" line="1299" />
       <source>Process Generation Error</source>
       <translation>Fehler bei der Prozessgenerierung</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1133" />
+      <location filename="../Project.py" line="1300" />
       <source>The Pyramid server could not be started.</source>
       <translation>Der Pyramid Server konnte nicht gestartet werden.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1181" />
+      <location filename="../Project.py" line="1342" />
       <source>Could not start the web-browser for the URL "{0}".</source>
       <translation>Der Web-Browser konnte nicht für die URL "{0}" gestartet werden.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1217" />
+      <location filename="../Project.py" line="1381" />
       <source>The Pyramid Shell process could not be started.</source>
       <translation>Der Pyramid Konsolenprozess konnte nicht gestartet werden.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1247" />
-      <source>Pyramid development environment setup successfully.</source>
-      <translation>Die Pyramid Entwicklungsumgebung wurde erfolgreich eingerichtet.</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1264" />
+      <location filename="../Project.py" line="1393" />
       <source>Build Distribution File</source>
       <translation>Distributionsdateien erzeugen</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1291" />
+      <location filename="../Project.py" line="1420" />
       <source>Python distribution file built successfully.</source>
       <translation>Python Distributionsdateien erfolgreich erzeugt.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1340" />
-      <source>Database initialized successfully.</source>
-      <translation>Datenbank erfolgreich initialisiert.</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1367" />
+      <location filename="../Project.py" line="1448" />
       <source>Enter the URL to be matched:</source>
       <translation>Gib die zu überprüfende URL ein:</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1506" />
+      <location filename="../Project.py" line="1593" />
       <source>Extract messages</source>
       <translation>Texte extrahieren</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1525" />
+      <location filename="../Project.py" line="1612" />
       <source>No setup.cfg found or no "extract_messages" section found in setup.cfg.</source>
       <translation>Keine setup.cfg gefunden bzw. keine Sektion "extract_messages" in setup.cfg vorhanden.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1532" />
+      <location filename="../Project.py" line="1619" />
       <source>No "output_file" option found in setup.cfg.</source>
       <translation>Keine Option "output_file" in setup.cfg vorhanden.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1546" />
+      <location filename="../Project.py" line="1633" />
       <source>
 Messages extracted successfully.</source>
       <translation>
 Texte erfolgreich extrahiert.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1559" />
+      <location filename="../Project.py" line="1646" />
       <source>Initializing message catalog for '{0}'</source>
       <translation>Initialisiere Textkatalog für '{0}'</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1580" />
+      <location filename="../Project.py" line="1667" />
       <source>
 Message catalog initialized successfully.</source>
       <translation>
 Textkatalog erfolgreich initialisiert.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1634" />
-      <location filename="../Project.py" line="1597" />
+      <location filename="../Project.py" line="1721" />
+      <location filename="../Project.py" line="1684" />
       <source>Compiling message catalogs</source>
       <translation>Übersetze Textkataloge</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1668" />
-      <location filename="../Project.py" line="1615" />
+      <location filename="../Project.py" line="1755" />
+      <location filename="../Project.py" line="1702" />
       <source>
 Message catalogs compiled successfully.</source>
       <translation>
 Textkataloge erfolgreich übersetzt.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1746" />
-      <location filename="../Project.py" line="1663" />
+      <location filename="../Project.py" line="1833" />
+      <location filename="../Project.py" line="1750" />
       <source>No locales detected. Aborting...</source>
       <translation>Keine Sprachen erkannt. Abbruch...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1717" />
-      <location filename="../Project.py" line="1687" />
+      <location filename="../Project.py" line="1804" />
+      <location filename="../Project.py" line="1774" />
       <source>Updating message catalogs</source>
       <translation>Aktualisiere Textkataloge</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1751" />
-      <location filename="../Project.py" line="1705" />
+      <location filename="../Project.py" line="1838" />
+      <location filename="../Project.py" line="1792" />
       <source>
 Message catalogs updated successfully.</source>
       <translation>
 Textkataloge erfolgreich aktualisiert.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1774" />
+      <location filename="../Project.py" line="1861" />
       <source>The translations editor process ({0}) could not be started.</source>
       <translation>Der Prozess für den Übersetzungseditor ({0}) konnte nicht gestartet werden.</translation>
     </message>
+    <message>
+      <location filename="../Project.py" line="1936" />
+      <source>Database initialized successfully.</source>
+      <translation>Datenbank erfolgreich initialisiert.</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1953" />
+      <source>Enter a short message for the migration:</source>
+      <translation>Gib eine Kurzbeschreibung für die Migration ein:</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1964" />
+      <source>
+Migration created successfully.</source>
+      <translation>
+Migration erfolgreich erzeugt.</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1995" />
+      <source>
+Database upgraded successfully.</source>
+      <translation>
+Datenbankaktualisierung erfolgreich durchgeführt.</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="2022" />
+      <source>
+Database downgraded successfully.</source>
+      <translation>
+Datenbankrückstufung erfolgreich durchgeführt.</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="2047" />
+      <source>Migrations History</source>
+      <translation>Migrationsverlauf</translation>
+    </message>
   </context>
   <context>
     <name>ProjectPyramidPlugin</name>
@@ -682,12 +850,12 @@
   <context>
     <name>PyramidDialog</name>
     <message>
-      <location filename="../PyramidDialog.py" line="198" />
+      <location filename="../PyramidDialog.py" line="208" />
       <source>Process Generation Error</source>
       <translation>Fehler bei der Prozessgenerierung</translation>
     </message>
     <message>
-      <location filename="../PyramidDialog.py" line="199" />
+      <location filename="../PyramidDialog.py" line="209" />
       <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
       <translation>Der Prozess {0} konnte nicht gestartet werden. Bitte stellen sie sicher, dass er sich im Suchpfad befindet.</translation>
     </message>
@@ -933,12 +1101,12 @@
       <translation>Ermittle Routen...</translation>
     </message>
     <message>
-      <location filename="../PyramidRoutesDialog.py" line="190" />
+      <location filename="../PyramidRoutesDialog.py" line="193" />
       <source>Process Generation Error</source>
       <translation>Fehler bei der Prozessgenerierung</translation>
     </message>
     <message>
-      <location filename="../PyramidRoutesDialog.py" line="191" />
+      <location filename="../PyramidRoutesDialog.py" line="194" />
       <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
       <translation>Der Prozess {0} konnte nicht gestartet werden. Bitte stellen sie sicher, dass er sich im Suchpfad befindet.</translation>
     </message>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ProjectPyramid/i18n/pyramid_empty.ts	Sun Jun 06 16:30:37 2021 +0200
@@ -0,0 +1,1107 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+  <context>
+    <name>CreateParametersDialog</name>
+    <message>
+      <location filename="../CreateParametersDialog.py" line="47" />
+      <source>No Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Create Parameters</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Template:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the template to be used</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Template Version:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter an optional branch, tag or commit</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>CookieCutter Starter Parameters</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Project Name:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the name of the Pyramid project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Template Language:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Select the templating language</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Backend:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Select the database backend</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Select to overwrite existing files</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Overwrite existing files</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
+    <name>DistributionTypeSelectionDialog</name>
+    <message>
+      <location filename="../DistributionTypeSelectionDialog.ui" line="0" />
+      <source>Distribution Type</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../DistributionTypeSelectionDialog.ui" line="0" />
+      <source>Select the distribution file formats below:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../DistributionTypeSelectionDialog.ui" line="0" />
+      <source>Check the distribution file formats that should be generated</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../DistributionTypeSelectionDialog.py" line="59" />
+      <source>The python setup.py command did not finish within 30s.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../DistributionTypeSelectionDialog.py" line="63" />
+      <source>Could not start the python executable.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../DistributionTypeSelectionDialog.py" line="78" />
+      <source>Process Generation Error</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
+    <name>FormSelectionDialog</name>
+    <message>
+      <location filename="../FormSelectionDialog.ui" line="0" />
+      <source>Template Type Selection</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../FormSelectionDialog.ui" line="0" />
+      <source>Template &amp;Type:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../FormSelectionDialog.ui" line="0" />
+      <source>Select the template type</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../FormSelectionDialog.ui" line="0" />
+      <source>Preview:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../FormSelectionDialog.ui" line="0" />
+      <source>Shows the text of the selected template</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../FormSelectionDialog.py" line="32" />
+      <source>Standard HTML 5 template</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../FormSelectionDialog.py" line="45" />
+      <source>Standard HTML template</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../FormSelectionDialog.py" line="59" />
+      <source>Chameleon template</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../FormSelectionDialog.py" line="115" />
+      <source>Mako template with sections</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
+    <name>MigrateSummaryDialog</name>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="40" />
+      <source>Refresh</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="98" />
+      <location filename="../MigrateSummaryDialog.py" line="91" />
+      <source>Migrations Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="92" />
+      <source>The 'alembic' process did not finish within 10 seconds.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="99" />
+      <source>The 'alembic' process could not be started.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="184" />
+      <location filename="../MigrateSummaryDialog.py" line="170" />
+      <source>Upgrade</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="172" />
+      <source>Downgrade</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Old Revision</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>New Revision</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Message</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Labels</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Press to upgrade or downgrade the database to the selected migration</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
+    <name>Project</name>
+    <message>
+      <location filename="../Project.py" line="143" />
+      <source>Current Pyramid Project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="147" />
+      <source>Selects the current Pyramid project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="149" />
+      <source>&lt;b&gt;Current Pyramid Project&lt;/b&gt;&lt;p&gt;Selects the Pyramid project. Used for multi-project Pyramid projects to switch between the projects.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="162" />
+      <source>Create Pyramid Project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="163" />
+      <source>Create Pyramid &amp;Project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="166" />
+      <source>Creates a new Pyramid project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="168" />
+      <source>&lt;b&gt;Create Pyramid Project&lt;/b&gt;&lt;p&gt;Creates a new Pyramid project using "pcreate".&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1270" />
+      <location filename="../Project.py" line="180" />
+      <source>Run Server</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="181" />
+      <source>Run &amp;Server</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="184" />
+      <source>Starts the Pyramid Web server</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="186" />
+      <source>&lt;b&gt;Run Server&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server using "pserve --reload development.ini".&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1341" />
+      <location filename="../Project.py" line="1324" />
+      <location filename="../Project.py" line="195" />
+      <source>Run Web-Browser</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="196" />
+      <source>Run &amp;Web-Browser</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="199" />
+      <source>Starts the default Web-Browser with the URL of the Pyramid Web server</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="202" />
+      <source>&lt;b&gt;Run Web-Browser&lt;/b&gt;&lt;p&gt;Starts the default Web-Browser with the URL of the Pyramid Web server.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1359" />
+      <location filename="../Project.py" line="211" />
+      <source>Start Pyramid Python Console</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="212" />
+      <source>Start Pyramid &amp;Python Console</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="215" />
+      <source>Starts an interactive Python interpreter</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="217" />
+      <source>&lt;b&gt;Start Pyramid Python Console&lt;/b&gt;&lt;p&gt;Starts an interactive Python interpreter.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1447" />
+      <location filename="../Project.py" line="1434" />
+      <location filename="../Project.py" line="229" />
+      <source>Show Matching Views</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="230" />
+      <source>Show Matching &amp;Views</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="233" />
+      <source>Show views matching a given URL</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="235" />
+      <source>&lt;b&gt;Show Matching Views&lt;/b&gt;&lt;p&gt;Show views matching a given URL.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1471" />
+      <location filename="../Project.py" line="243" />
+      <source>Show Routes</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="244" />
+      <source>Show &amp;Routes</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="247" />
+      <source>Show all URL dispatch routes used by a Pyramid application</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="249" />
+      <source>&lt;b&gt;Show Routes&lt;/b&gt;&lt;p&gt;Show all URL dispatch routes used by a Pyramid application in the order in which they are evaluated.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1493" />
+      <location filename="../Project.py" line="258" />
+      <source>Show Tween Objects</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="259" />
+      <source>Show &amp;Tween Objects</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="262" />
+      <source>Show all implicit and explicit tween objects used by a Pyramid application</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="265" />
+      <source>&lt;b&gt;Show Tween Objects&lt;/b&gt;&lt;p&gt;Show all implicit and explicit tween objects used by a Pyramid application.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="278" />
+      <source>Build Distribution</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="279" />
+      <source>Build &amp;Distribution</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="282" />
+      <source>Builds a distribution file for the Pyramid project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="284" />
+      <source>&lt;b&gt;Build Distribution&lt;/b&gt;&lt;p&gt;Builds a distribution file for the Pyramid project using "python setup.py sdist".&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="297" />
+      <source>Documentation</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="298" />
+      <source>D&amp;ocumentation</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="301" />
+      <source>Shows the help viewer with the Pyramid documentation</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="303" />
+      <source>&lt;b&gt;Documentation&lt;/b&gt;&lt;p&gt;Shows the help viewer with the Pyramid documentation.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="924" />
+      <location filename="../Project.py" line="315" />
+      <source>About Pyramid</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="316" />
+      <source>About P&amp;yramid</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="319" />
+      <source>Shows some information about Pyramid</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="321" />
+      <source>&lt;b&gt;About Pyramid&lt;/b&gt;&lt;p&gt;Shows some information about Pyramid.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1919" />
+      <location filename="../Project.py" line="1909" />
+      <location filename="../Project.py" line="337" />
+      <source>Initialize Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="338" />
+      <source>Initialize &amp;Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="341" />
+      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="344" />
+      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1946" />
+      <location filename="../Project.py" line="357" />
+      <source>Create Migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="358" />
+      <source>&amp;Create Migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="361" />
+      <source>Create a new migration for the current database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="363" />
+      <source>&lt;b&gt;Create Migration&lt;/b&gt;&lt;p&gt;Creates a new migration for the current database and stores it  in the configured migrations directory.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1984" />
+      <location filename="../Project.py" line="377" />
+      <source>Upgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="378" />
+      <source>&amp;Upgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="381" />
+      <source>Upgrade the database to the current migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="383" />
+      <source>&lt;b&gt;Upgrade Database&lt;/b&gt;&lt;p&gt;Upgrades the database to the current migration.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2011" />
+      <location filename="../Project.py" line="392" />
+      <source>Downgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="393" />
+      <source>&amp;Downgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="396" />
+      <source>Downgrade the database to the previous version</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="398" />
+      <source>&lt;b&gt;Downgrade Database&lt;/b&gt;&lt;p&gt;Downgrades the database to the previous version.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="411" />
+      <source>Show Migrations Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="412" />
+      <source>Show Migrations &amp;Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="415" />
+      <source>Show a summary of the created database migrations</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="417" />
+      <source>&lt;b&gt;Show Migrations Summary&lt;/b&gt;&lt;p&gt;Shows a summary list of the created database migrations.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="427" />
+      <source>Show Migrations History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="428" />
+      <source>Show Migrations &amp;History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="431" />
+      <source>Show the full history of the created database migrations</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="433" />
+      <source>&lt;b&gt;Show Migrations History&lt;/b&gt;&lt;p&gt;Shows the full history of the created database migrations.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="452" />
+      <source>Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="466" />
+      <source>P&amp;yramid</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="531" />
+      <source>Open with {0}</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="545" />
+      <source>New template...</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="554" />
+      <source>Extract Messages</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="557" />
+      <source>Compile All Catalogs</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="560" />
+      <source>Compile Selected Catalogs</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="563" />
+      <source>Update All Catalogs</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="566" />
+      <source>Update Selected Catalogs</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="605" />
+      <source>Chameleon Templates (*.pt);;Chameleon Text Templates (*.txt);;Mako Templates (*.mako);;Mako Templates (*.mak);;HTML Files (*.html);;HTML Files (*.htm);;All Files (*)</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="644" />
+      <location filename="../Project.py" line="630" />
+      <location filename="../Project.py" line="615" />
+      <source>New Form</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="631" />
+      <source>The file already exists! Overwrite it?</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="645" />
+      <source>&lt;p&gt;The new form file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;br/&gt; Problem: {1}&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="925" />
+      <source>&lt;p&gt;Pyramid is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Version:&lt;/td&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URL:&lt;/td&gt;&lt;td&gt;&lt;a href="{1}"&gt;{1}&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1098" />
+      <source>Initializing Pyramid Project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1159" />
+      <source>Select Pyramid Project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1160" />
+      <source>Select the Pyramid project to work with.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1198" />
+      <source>None</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1203" />
+      <source>&amp;Current Pyramid Project ({0})</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1926" />
+      <location filename="../Project.py" line="1910" />
+      <location filename="../Project.py" line="1811" />
+      <location filename="../Project.py" line="1781" />
+      <location filename="../Project.py" line="1728" />
+      <location filename="../Project.py" line="1691" />
+      <location filename="../Project.py" line="1654" />
+      <location filename="../Project.py" line="1600" />
+      <location filename="../Project.py" line="1500" />
+      <location filename="../Project.py" line="1478" />
+      <location filename="../Project.py" line="1441" />
+      <location filename="../Project.py" line="1400" />
+      <location filename="../Project.py" line="1360" />
+      <location filename="../Project.py" line="1325" />
+      <location filename="../Project.py" line="1271" />
+      <source>No current Pyramid project selected or no Pyramid project created yet. Aborting...</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1860" />
+      <location filename="../Project.py" line="1380" />
+      <location filename="../Project.py" line="1299" />
+      <source>Process Generation Error</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1300" />
+      <source>The Pyramid server could not be started.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1342" />
+      <source>Could not start the web-browser for the URL "{0}".</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1381" />
+      <source>The Pyramid Shell process could not be started.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1393" />
+      <source>Build Distribution File</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1420" />
+      <source>Python distribution file built successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1448" />
+      <source>Enter the URL to be matched:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1593" />
+      <source>Extract messages</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1612" />
+      <source>No setup.cfg found or no "extract_messages" section found in setup.cfg.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1619" />
+      <source>No "output_file" option found in setup.cfg.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1633" />
+      <source>
+Messages extracted successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1646" />
+      <source>Initializing message catalog for '{0}'</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1667" />
+      <source>
+Message catalog initialized successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1721" />
+      <location filename="../Project.py" line="1684" />
+      <source>Compiling message catalogs</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1755" />
+      <location filename="../Project.py" line="1702" />
+      <source>
+Message catalogs compiled successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1833" />
+      <location filename="../Project.py" line="1750" />
+      <source>No locales detected. Aborting...</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1804" />
+      <location filename="../Project.py" line="1774" />
+      <source>Updating message catalogs</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1838" />
+      <location filename="../Project.py" line="1792" />
+      <source>
+Message catalogs updated successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1861" />
+      <source>The translations editor process ({0}) could not be started.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1936" />
+      <source>Database initialized successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1953" />
+      <source>Enter a short message for the migration:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1964" />
+      <source>
+Migration created successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1995" />
+      <source>
+Database upgraded successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2022" />
+      <source>
+Database downgraded successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2047" />
+      <source>Migrations History</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
+    <name>ProjectPyramidPlugin</name>
+    <message>
+      <location filename="../../PluginProjectPyramid.py" line="407" />
+      <location filename="../../PluginProjectPyramid.py" line="187" />
+      <location filename="../../PluginProjectPyramid.py" line="71" />
+      <source>Pyramid</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
+    <name>PyramidDialog</name>
+    <message>
+      <location filename="../PyramidDialog.py" line="208" />
+      <source>Process Generation Error</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.py" line="209" />
+      <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Pyramid</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Output</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Errors</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Input</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Press to send the input to the Pyramid process</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>&amp;Send</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Alt+S</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Enter data to be sent to the Pyramid process</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Select to switch the input field to password mode</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>&amp;Password Mode</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidDialog.ui" line="0" />
+      <source>Alt+P</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
+    <name>PyramidPage</name>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>&lt;b&gt;Configure Pyramid&lt;/b&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Console Command</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Console Command:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Enter the console command</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>&lt;b&gt;Note:&lt;/b&gt; The console command for a console, that is spawning (i.e. exits before the console window is closed), should be prefixed by an '@' character.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Web-Browser</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Select to use an external web-browser</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Use external web-browser</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Python 3</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Pyramid Virtual Environment</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Select the Virtual Environment to be used with Pyramid</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Pyramid Python Console:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Select the Python console type</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Pyramid Documentation</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>URL:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Enter the URL of the Pyramid documentation</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Press to reset the URL to the default URL</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Translations Editor</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Enter the path of an editor to use to do the translations. Leave empty to disable this feature.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.ui" line="0" />
+      <source>Enter the path of the translations editor</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.py" line="59" />
+      <source>Plain Python</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.py" line="60" />
+      <source>IPython</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.py" line="61" />
+      <source>bpython</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../ConfigurationPage/PyramidPage.py" line="70" />
+      <source>All Files (*)</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
+    <name>PyramidRoutesDialog</name>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>Pyramid</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>Errors</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>Input</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>Press to send the input to the Pyramid process</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>&amp;Send</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>Alt+S</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>Enter data to be sent to the Pyramid process</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>Select to switch the input field to password mode</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>&amp;Password Mode</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.ui" line="0" />
+      <source>Alt+P</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.py" line="120" />
+      <source>No routes found.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.py" line="154" />
+      <source>Getting routes...</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.py" line="193" />
+      <source>Process Generation Error</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../PyramidRoutesDialog.py" line="194" />
+      <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+</TS>
--- a/ProjectPyramid/i18n/pyramid_en.ts	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/i18n/pyramid_en.ts	Sun Jun 06 16:30:37 2021 +0200
@@ -4,24 +4,8 @@
   <context>
     <name>CreateParametersDialog</name>
     <message>
-      <location filename="../CreateParametersDialog.py" line="55" />
-      <source>The pcreate command did not finish within 30s.</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="58" />
-      <source>Could not start the pcreate executable.</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="69" />
-      <source>Process Generation Error</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="115" />
-      <source>{0} ({1})</source>
-      <comment>scaffold name, explanatory text</comment>
+      <location filename="../CreateParametersDialog.py" line="47" />
+      <source>No Database</source>
       <translation type="unfinished" />
     </message>
     <message>
@@ -31,22 +15,57 @@
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Project &amp;Name:</source>
+      <source>Template:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the template to be used</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Template Version:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter an optional branch, tag or commit</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>CookieCutter Starter Parameters</source>
       <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Enter the name of the Pyramid project to create</source>
+      <source>Project Name:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the name of the Pyramid project</source>
       <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>&amp;Scaffold:</source>
+      <source>Template Language:</source>
       <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Select the scaffold to be used</source>
+      <source>Select the templating language</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Backend:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Select the database backend</source>
       <translation type="unfinished" />
     </message>
     <message>
@@ -59,16 +78,6 @@
       <source>Overwrite existing files</source>
       <translation type="unfinished" />
     </message>
-    <message>
-      <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Select to simulate the creation</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Simulate Pyramid project creation</source>
-      <translation type="unfinished" />
-    </message>
   </context>
   <context>
     <name>DistributionTypeSelectionDialog</name>
@@ -152,518 +161,674 @@
     </message>
   </context>
   <context>
+    <name>MigrateSummaryDialog</name>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="40" />
+      <source>Refresh</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="98" />
+      <location filename="../MigrateSummaryDialog.py" line="91" />
+      <source>Migrations Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="92" />
+      <source>The 'alembic' process did not finish within 10 seconds.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="99" />
+      <source>The 'alembic' process could not be started.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="184" />
+      <location filename="../MigrateSummaryDialog.py" line="170" />
+      <source>Upgrade</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="172" />
+      <source>Downgrade</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Old Revision</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>New Revision</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Message</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Labels</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Press to upgrade or downgrade the database to the selected migration</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>Project</name>
     <message>
-      <location filename="../Project.py" line="136" />
+      <location filename="../Project.py" line="143" />
       <source>Current Pyramid Project</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="140" />
+      <location filename="../Project.py" line="147" />
       <source>Selects the current Pyramid project</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="142" />
+      <location filename="../Project.py" line="149" />
       <source>&lt;b&gt;Current Pyramid Project&lt;/b&gt;&lt;p&gt;Selects the Pyramid project. Used for multi-project Pyramid projects to switch between the projects.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="931" />
-      <location filename="../Project.py" line="155" />
+      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="162" />
       <source>Create Pyramid Project</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="156" />
+      <location filename="../Project.py" line="163" />
       <source>Create Pyramid &amp;Project</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="159" />
+      <location filename="../Project.py" line="166" />
       <source>Creates a new Pyramid project</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="161" />
+      <location filename="../Project.py" line="168" />
       <source>&lt;b&gt;Create Pyramid Project&lt;/b&gt;&lt;p&gt;Creates a new Pyramid project using "pcreate".&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1104" />
-      <location filename="../Project.py" line="173" />
+      <location filename="../Project.py" line="1270" />
+      <location filename="../Project.py" line="180" />
       <source>Run Server</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="174" />
+      <location filename="../Project.py" line="181" />
       <source>Run &amp;Server</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="177" />
+      <location filename="../Project.py" line="184" />
       <source>Starts the Pyramid Web server</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="179" />
+      <location filename="../Project.py" line="186" />
       <source>&lt;b&gt;Run Server&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server using "pserve --reload development.ini".&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="188" />
-      <source>Run Server with Logging</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="189" />
-      <source>Run Server with &amp;Logging</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="192" />
-      <source>Starts the Pyramid Web server with logging</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="194" />
-      <source>&lt;b&gt;Run Server with Logging&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server with logging using "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="1180" />
-      <location filename="../Project.py" line="1163" />
-      <location filename="../Project.py" line="203" />
+      <location filename="../Project.py" line="1341" />
+      <location filename="../Project.py" line="1324" />
+      <location filename="../Project.py" line="195" />
       <source>Run Web-Browser</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="204" />
+      <location filename="../Project.py" line="196" />
       <source>Run &amp;Web-Browser</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="207" />
+      <location filename="../Project.py" line="199" />
       <source>Starts the default Web-Browser with the URL of the Pyramid Web server</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="210" />
+      <location filename="../Project.py" line="202" />
       <source>&lt;b&gt;Run Web-Browser&lt;/b&gt;&lt;p&gt;Starts the default Web-Browser with the URL of the Pyramid Web server.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1198" />
-      <location filename="../Project.py" line="219" />
+      <location filename="../Project.py" line="1359" />
+      <location filename="../Project.py" line="211" />
       <source>Start Pyramid Python Console</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="220" />
+      <location filename="../Project.py" line="212" />
       <source>Start Pyramid &amp;Python Console</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="223" />
+      <location filename="../Project.py" line="215" />
       <source>Starts an interactive Python interpreter</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="225" />
+      <location filename="../Project.py" line="217" />
       <source>&lt;b&gt;Start Pyramid Python Console&lt;/b&gt;&lt;p&gt;Starts an interactive Python interpreter.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1229" />
-      <location filename="../Project.py" line="237" />
-      <source>Setup Development Environment</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="238" />
-      <source>Setup &amp;Development Environment</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="241" />
-      <source>Setup the Pyramid project in development mode</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="243" />
-      <source>&lt;b&gt;Setup Development Environment&lt;/b&gt;&lt;p&gt;Setup the Pyramid project in development mode using "python setup.py develop".&lt;/p&gt;</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="1323" />
-      <location filename="../Project.py" line="1314" />
-      <location filename="../Project.py" line="256" />
-      <source>Initialize Database</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="257" />
-      <source>Initialize &amp;Database</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="260" />
-      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="263" />
-      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="1366" />
-      <location filename="../Project.py" line="1353" />
-      <location filename="../Project.py" line="276" />
+      <location filename="../Project.py" line="1447" />
+      <location filename="../Project.py" line="1434" />
+      <location filename="../Project.py" line="229" />
       <source>Show Matching Views</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="277" />
+      <location filename="../Project.py" line="230" />
       <source>Show Matching &amp;Views</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="280" />
+      <location filename="../Project.py" line="233" />
       <source>Show views matching a given URL</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="282" />
+      <location filename="../Project.py" line="235" />
       <source>&lt;b&gt;Show Matching Views&lt;/b&gt;&lt;p&gt;Show views matching a given URL.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1387" />
-      <location filename="../Project.py" line="290" />
+      <location filename="../Project.py" line="1471" />
+      <location filename="../Project.py" line="243" />
       <source>Show Routes</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="291" />
+      <location filename="../Project.py" line="244" />
       <source>Show &amp;Routes</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="294" />
+      <location filename="../Project.py" line="247" />
       <source>Show all URL dispatch routes used by a Pyramid application</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="296" />
+      <location filename="../Project.py" line="249" />
       <source>&lt;b&gt;Show Routes&lt;/b&gt;&lt;p&gt;Show all URL dispatch routes used by a Pyramid application in the order in which they are evaluated.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1409" />
-      <location filename="../Project.py" line="305" />
+      <location filename="../Project.py" line="1493" />
+      <location filename="../Project.py" line="258" />
       <source>Show Tween Objects</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="306" />
+      <location filename="../Project.py" line="259" />
       <source>Show &amp;Tween Objects</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="309" />
+      <location filename="../Project.py" line="262" />
       <source>Show all implicit and explicit tween objects used by a Pyramid application</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="312" />
+      <location filename="../Project.py" line="265" />
       <source>&lt;b&gt;Show Tween Objects&lt;/b&gt;&lt;p&gt;Show all implicit and explicit tween objects used by a Pyramid application.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="325" />
+      <location filename="../Project.py" line="278" />
       <source>Build Distribution</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="326" />
+      <location filename="../Project.py" line="279" />
       <source>Build &amp;Distribution</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="329" />
+      <location filename="../Project.py" line="282" />
       <source>Builds a distribution file for the Pyramid project</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="331" />
+      <location filename="../Project.py" line="284" />
       <source>&lt;b&gt;Build Distribution&lt;/b&gt;&lt;p&gt;Builds a distribution file for the Pyramid project using "python setup.py sdist".&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="344" />
+      <location filename="../Project.py" line="297" />
       <source>Documentation</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="345" />
+      <location filename="../Project.py" line="298" />
       <source>D&amp;ocumentation</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="348" />
+      <location filename="../Project.py" line="301" />
       <source>Shows the help viewer with the Pyramid documentation</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="350" />
+      <location filename="../Project.py" line="303" />
       <source>&lt;b&gt;Documentation&lt;/b&gt;&lt;p&gt;Shows the help viewer with the Pyramid documentation.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="811" />
-      <location filename="../Project.py" line="362" />
+      <location filename="../Project.py" line="924" />
+      <location filename="../Project.py" line="315" />
       <source>About Pyramid</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="363" />
+      <location filename="../Project.py" line="316" />
       <source>About P&amp;yramid</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="366" />
+      <location filename="../Project.py" line="319" />
       <source>Shows some information about Pyramid</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="368" />
+      <location filename="../Project.py" line="321" />
       <source>&lt;b&gt;About Pyramid&lt;/b&gt;&lt;p&gt;Shows some information about Pyramid.&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="386" />
+      <location filename="../Project.py" line="1919" />
+      <location filename="../Project.py" line="1909" />
+      <location filename="../Project.py" line="337" />
+      <source>Initialize Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="338" />
+      <source>Initialize &amp;Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="341" />
+      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="344" />
+      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1946" />
+      <location filename="../Project.py" line="357" />
+      <source>Create Migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="358" />
+      <source>&amp;Create Migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="361" />
+      <source>Create a new migration for the current database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="363" />
+      <source>&lt;b&gt;Create Migration&lt;/b&gt;&lt;p&gt;Creates a new migration for the current database and stores it  in the configured migrations directory.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1984" />
+      <location filename="../Project.py" line="377" />
+      <source>Upgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="378" />
+      <source>&amp;Upgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="381" />
+      <source>Upgrade the database to the current migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="383" />
+      <source>&lt;b&gt;Upgrade Database&lt;/b&gt;&lt;p&gt;Upgrades the database to the current migration.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2011" />
+      <location filename="../Project.py" line="392" />
+      <source>Downgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="393" />
+      <source>&amp;Downgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="396" />
+      <source>Downgrade the database to the previous version</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="398" />
+      <source>&lt;b&gt;Downgrade Database&lt;/b&gt;&lt;p&gt;Downgrades the database to the previous version.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="411" />
+      <source>Show Migrations Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="412" />
+      <source>Show Migrations &amp;Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="415" />
+      <source>Show a summary of the created database migrations</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="417" />
+      <source>&lt;b&gt;Show Migrations Summary&lt;/b&gt;&lt;p&gt;Shows a summary list of the created database migrations.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="427" />
+      <source>Show Migrations History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="428" />
+      <source>Show Migrations &amp;History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="431" />
+      <source>Show the full history of the created database migrations</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="433" />
+      <source>&lt;b&gt;Show Migrations History&lt;/b&gt;&lt;p&gt;Shows the full history of the created database migrations.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="452" />
+      <source>Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="466" />
       <source>P&amp;yramid</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="451" />
+      <location filename="../Project.py" line="531" />
       <source>Open with {0}</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="465" />
+      <location filename="../Project.py" line="545" />
       <source>New template...</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="474" />
+      <location filename="../Project.py" line="554" />
       <source>Extract Messages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="477" />
+      <location filename="../Project.py" line="557" />
       <source>Compile All Catalogs</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="480" />
+      <location filename="../Project.py" line="560" />
       <source>Compile Selected Catalogs</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="483" />
+      <location filename="../Project.py" line="563" />
       <source>Update All Catalogs</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="486" />
+      <location filename="../Project.py" line="566" />
       <source>Update Selected Catalogs</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="525" />
+      <location filename="../Project.py" line="605" />
       <source>Chameleon Templates (*.pt);;Chameleon Text Templates (*.txt);;Mako Templates (*.mako);;Mako Templates (*.mak);;HTML Files (*.html);;HTML Files (*.htm);;All Files (*)</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="564" />
-      <location filename="../Project.py" line="550" />
-      <location filename="../Project.py" line="535" />
+      <location filename="../Project.py" line="644" />
+      <location filename="../Project.py" line="630" />
+      <location filename="../Project.py" line="615" />
       <source>New Form</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="551" />
+      <location filename="../Project.py" line="631" />
       <source>The file already exists! Overwrite it?</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="565" />
+      <location filename="../Project.py" line="645" />
       <source>&lt;p&gt;The new form file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;br/&gt; Problem: {1}&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="812" />
+      <location filename="../Project.py" line="925" />
       <source>&lt;p&gt;Pyramid is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Version:&lt;/td&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URL:&lt;/td&gt;&lt;td&gt;&lt;a href="{1}"&gt;{1}&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="997" />
+      <location filename="../Project.py" line="1098" />
+      <source>Initializing Pyramid Project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1159" />
       <source>Select Pyramid Project</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="998" />
+      <location filename="../Project.py" line="1160" />
       <source>Select the Pyramid project to work with.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1036" />
+      <location filename="../Project.py" line="1198" />
       <source>None</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="1203" />
       <source>&amp;Current Pyramid Project ({0})</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1724" />
-      <location filename="../Project.py" line="1694" />
-      <location filename="../Project.py" line="1641" />
-      <location filename="../Project.py" line="1604" />
-      <location filename="../Project.py" line="1567" />
-      <location filename="../Project.py" line="1513" />
-      <location filename="../Project.py" line="1416" />
-      <location filename="../Project.py" line="1394" />
+      <location filename="../Project.py" line="1926" />
+      <location filename="../Project.py" line="1910" />
+      <location filename="../Project.py" line="1811" />
+      <location filename="../Project.py" line="1781" />
+      <location filename="../Project.py" line="1728" />
+      <location filename="../Project.py" line="1691" />
+      <location filename="../Project.py" line="1654" />
+      <location filename="../Project.py" line="1600" />
+      <location filename="../Project.py" line="1500" />
+      <location filename="../Project.py" line="1478" />
+      <location filename="../Project.py" line="1441" />
+      <location filename="../Project.py" line="1400" />
       <location filename="../Project.py" line="1360" />
-      <location filename="../Project.py" line="1330" />
-      <location filename="../Project.py" line="1315" />
+      <location filename="../Project.py" line="1325" />
       <location filename="../Project.py" line="1271" />
-      <location filename="../Project.py" line="1236" />
-      <location filename="../Project.py" line="1199" />
-      <location filename="../Project.py" line="1164" />
-      <location filename="../Project.py" line="1105" />
       <source>No current Pyramid project selected or no Pyramid project created yet. Aborting...</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1773" />
-      <location filename="../Project.py" line="1216" />
-      <location filename="../Project.py" line="1132" />
+      <location filename="../Project.py" line="1860" />
+      <location filename="../Project.py" line="1380" />
+      <location filename="../Project.py" line="1299" />
       <source>Process Generation Error</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1133" />
+      <location filename="../Project.py" line="1300" />
       <source>The Pyramid server could not be started.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1181" />
+      <location filename="../Project.py" line="1342" />
       <source>Could not start the web-browser for the URL "{0}".</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1217" />
+      <location filename="../Project.py" line="1381" />
       <source>The Pyramid Shell process could not be started.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1247" />
-      <source>Pyramid development environment setup successfully.</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="1264" />
+      <location filename="../Project.py" line="1393" />
       <source>Build Distribution File</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1291" />
+      <location filename="../Project.py" line="1420" />
       <source>Python distribution file built successfully.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1340" />
-      <source>Database initialized successfully.</source>
-      <translation type="unfinished" />
-    </message>
-    <message>
-      <location filename="../Project.py" line="1367" />
+      <location filename="../Project.py" line="1448" />
       <source>Enter the URL to be matched:</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1506" />
+      <location filename="../Project.py" line="1593" />
       <source>Extract messages</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1525" />
+      <location filename="../Project.py" line="1612" />
       <source>No setup.cfg found or no "extract_messages" section found in setup.cfg.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1532" />
+      <location filename="../Project.py" line="1619" />
       <source>No "output_file" option found in setup.cfg.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1546" />
+      <location filename="../Project.py" line="1633" />
       <source>
 Messages extracted successfully.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1559" />
+      <location filename="../Project.py" line="1646" />
       <source>Initializing message catalog for '{0}'</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1580" />
+      <location filename="../Project.py" line="1667" />
       <source>
 Message catalog initialized successfully.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1634" />
-      <location filename="../Project.py" line="1597" />
+      <location filename="../Project.py" line="1721" />
+      <location filename="../Project.py" line="1684" />
       <source>Compiling message catalogs</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1668" />
-      <location filename="../Project.py" line="1615" />
+      <location filename="../Project.py" line="1755" />
+      <location filename="../Project.py" line="1702" />
       <source>
 Message catalogs compiled successfully.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1746" />
-      <location filename="../Project.py" line="1663" />
+      <location filename="../Project.py" line="1833" />
+      <location filename="../Project.py" line="1750" />
       <source>No locales detected. Aborting...</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1717" />
-      <location filename="../Project.py" line="1687" />
+      <location filename="../Project.py" line="1804" />
+      <location filename="../Project.py" line="1774" />
       <source>Updating message catalogs</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1751" />
-      <location filename="../Project.py" line="1705" />
+      <location filename="../Project.py" line="1838" />
+      <location filename="../Project.py" line="1792" />
       <source>
 Message catalogs updated successfully.</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../Project.py" line="1774" />
+      <location filename="../Project.py" line="1861" />
       <source>The translations editor process ({0}) could not be started.</source>
       <translation type="unfinished" />
     </message>
+    <message>
+      <location filename="../Project.py" line="1936" />
+      <source>Database initialized successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1953" />
+      <source>Enter a short message for the migration:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1964" />
+      <source>
+Migration created successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1995" />
+      <source>
+Database upgraded successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2022" />
+      <source>
+Database downgraded successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2047" />
+      <source>Migrations History</source>
+      <translation type="unfinished" />
+    </message>
   </context>
   <context>
     <name>ProjectPyramidPlugin</name>
@@ -678,12 +843,12 @@
   <context>
     <name>PyramidDialog</name>
     <message>
-      <location filename="../PyramidDialog.py" line="198" />
+      <location filename="../PyramidDialog.py" line="208" />
       <source>Process Generation Error</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PyramidDialog.py" line="199" />
+      <location filename="../PyramidDialog.py" line="209" />
       <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
       <translation type="unfinished" />
     </message>
@@ -929,12 +1094,12 @@
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PyramidRoutesDialog.py" line="190" />
+      <location filename="../PyramidRoutesDialog.py" line="193" />
       <source>Process Generation Error</source>
       <translation type="unfinished" />
     </message>
     <message>
-      <location filename="../PyramidRoutesDialog.py" line="191" />
+      <location filename="../PyramidRoutesDialog.py" line="194" />
       <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
       <translation type="unfinished" />
     </message>
--- a/ProjectPyramid/i18n/pyramid_es.ts	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/i18n/pyramid_es.ts	Sun Jun 06 16:30:37 2021 +0200
@@ -4,25 +4,9 @@
   <context>
     <name>CreateParametersDialog</name>
     <message>
-      <location filename="../CreateParametersDialog.py" line="55" />
-      <source>The pcreate command did not finish within 30s.</source>
-      <translation>El comando pcreate no ha terminado en 30s o menos.</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="58" />
-      <source>Could not start the pcreate executable.</source>
-      <translation>No se ha podido iniciar el ejecutable de pcreate.</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="69" />
-      <source>Process Generation Error</source>
-      <translation>Error de Generación de Proceso</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="115" />
-      <source>{0} ({1})</source>
-      <comment>scaffold name, explanatory text</comment>
-      <translation>{0} ({1})</translation>
+      <location filename="../CreateParametersDialog.py" line="47" />
+      <source>No Database</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
@@ -31,23 +15,58 @@
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Project &amp;Name:</source>
-      <translation>&amp;Nombre del Proyecto:</translation>
+      <source>Template:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the template to be used</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Template Version:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter an optional branch, tag or commit</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>CookieCutter Starter Parameters</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Enter the name of the Pyramid project to create</source>
-      <translation>Introducir el nombre del proyecto Piramid a crear</translation>
+      <source>Project Name:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the name of the Pyramid project</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>&amp;Scaffold:</source>
-      <translation>&amp;Scaffold:</translation>
+      <source>Template Language:</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Select the scaffold to be used</source>
-      <translation>Seleccionar el scaffold a utilizar</translation>
+      <source>Select the templating language</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Backend:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Select the database backend</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
@@ -60,14 +79,45 @@
       <translation>Sobreescribir archivos existentes</translation>
     </message>
     <message>
-      <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Select to simulate the creation</source>
-      <translation>Seleccionar para simular la creación</translation>
+      <source>The pcreate command did not finish within 30s.</source>
+      <translation type="vanished">El comando pcreate no ha terminado en 30s o menos.</translation>
+    </message>
+    <message>
+      <source>Could not start the pcreate executable.</source>
+      <translation type="vanished">No se ha podido iniciar el ejecutable de pcreate.</translation>
+    </message>
+    <message>
+      <source>Process Generation Error</source>
+      <translation type="vanished">Error de Generación de Proceso</translation>
+    </message>
+    <message>
+      <source>{0} ({1})</source>
+      <comment>scaffold name, explanatory text</comment>
+      <translation type="vanished">{0} ({1})</translation>
     </message>
     <message>
-      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Project &amp;Name:</source>
+      <translation type="vanished">&amp;Nombre del Proyecto:</translation>
+    </message>
+    <message>
+      <source>Enter the name of the Pyramid project to create</source>
+      <translation type="vanished">Introducir el nombre del proyecto Piramid a crear</translation>
+    </message>
+    <message>
+      <source>&amp;Scaffold:</source>
+      <translation type="vanished">&amp;Scaffold:</translation>
+    </message>
+    <message>
+      <source>Select the scaffold to be used</source>
+      <translation type="vanished">Seleccionar el scaffold a utilizar</translation>
+    </message>
+    <message>
+      <source>Select to simulate the creation</source>
+      <translation type="vanished">Seleccionar para simular la creación</translation>
+    </message>
+    <message>
       <source>Simulate Pyramid project creation</source>
-      <translation>Simular creación de proyecto Piramid</translation>
+      <translation type="vanished">Simular creación de proyecto Piramid</translation>
     </message>
   </context>
   <context>
@@ -152,519 +202,711 @@
     </message>
   </context>
   <context>
+    <name>MigrateSummaryDialog</name>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="40" />
+      <source>Refresh</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="98" />
+      <location filename="../MigrateSummaryDialog.py" line="91" />
+      <source>Migrations Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="92" />
+      <source>The 'alembic' process did not finish within 10 seconds.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="99" />
+      <source>The 'alembic' process could not be started.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="184" />
+      <location filename="../MigrateSummaryDialog.py" line="170" />
+      <source>Upgrade</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="172" />
+      <source>Downgrade</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Old Revision</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>New Revision</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Message</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Labels</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Press to upgrade or downgrade the database to the selected migration</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>Project</name>
     <message>
-      <location filename="../Project.py" line="136" />
+      <location filename="../Project.py" line="143" />
       <source>Current Pyramid Project</source>
       <translation>Proyecto Pyramid Actual</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="140" />
+      <location filename="../Project.py" line="147" />
       <source>Selects the current Pyramid project</source>
       <translation>Selecciona el proyecto Piramid actual</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="142" />
+      <location filename="../Project.py" line="149" />
       <source>&lt;b&gt;Current Pyramid Project&lt;/b&gt;&lt;p&gt;Selects the Pyramid project. Used for multi-project Pyramid projects to switch between the projects.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Proyecto Pyramid Actual&lt;/b&gt;&lt;p&gt;Seleciona el proyecto Pyramid. Se utiliza en proyectos Pyramid multi-proyecto Pyramid projects para cambiar entre proyectos.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="931" />
-      <location filename="../Project.py" line="155" />
+      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="162" />
       <source>Create Pyramid Project</source>
       <translation>Crear Proyecto Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="156" />
+      <location filename="../Project.py" line="163" />
       <source>Create Pyramid &amp;Project</source>
       <translation>Crear &amp;Proyecto Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="159" />
+      <location filename="../Project.py" line="166" />
       <source>Creates a new Pyramid project</source>
       <translation>Crea un nuevo proyecto Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="161" />
+      <location filename="../Project.py" line="168" />
       <source>&lt;b&gt;Create Pyramid Project&lt;/b&gt;&lt;p&gt;Creates a new Pyramid project using "pcreate".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Crear Proyecto Pyramid &lt;/b&gt;&lt;p&gt;Crea un nuevo proyecto Pyramid usando "pcreate".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1104" />
-      <location filename="../Project.py" line="173" />
+      <location filename="../Project.py" line="1270" />
+      <location filename="../Project.py" line="180" />
       <source>Run Server</source>
       <translation>Lanzar Servidor</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="174" />
+      <location filename="../Project.py" line="181" />
       <source>Run &amp;Server</source>
       <translation>Lanzar &amp;Servidor</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="177" />
+      <location filename="../Project.py" line="184" />
       <source>Starts the Pyramid Web server</source>
       <translation>Inicia el servidor Web de Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="179" />
+      <location filename="../Project.py" line="186" />
       <source>&lt;b&gt;Run Server&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server using "pserve --reload development.ini".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Lanzar Servidor&lt;/b&gt;&lt;p&gt;Inicia el servidor Web de Pyramid usando "pserve --reload development.ini".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="188" />
-      <source>Run Server with Logging</source>
-      <translation>Lanzar Servidor con Log</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="189" />
-      <source>Run Server with &amp;Logging</source>
-      <translation>Lanzar Servidor con &amp;Log</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="192" />
-      <source>Starts the Pyramid Web server with logging</source>
-      <translation>Inicia el servidor Web de Pyramid con log</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="194" />
-      <source>&lt;b&gt;Run Server with Logging&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server with logging using "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Lanzar Servidor con Log&lt;/b&gt;&lt;p&gt;Inicia el servidor Web de Pyramid con log usando "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1180" />
-      <location filename="../Project.py" line="1163" />
-      <location filename="../Project.py" line="203" />
+      <location filename="../Project.py" line="1341" />
+      <location filename="../Project.py" line="1324" />
+      <location filename="../Project.py" line="195" />
       <source>Run Web-Browser</source>
       <translation>Lanzar Navegador Web</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="204" />
+      <location filename="../Project.py" line="196" />
       <source>Run &amp;Web-Browser</source>
       <translation>Lanzar Navegador &amp;Web</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="207" />
+      <location filename="../Project.py" line="199" />
       <source>Starts the default Web-Browser with the URL of the Pyramid Web server</source>
       <translation>Inicia el Navegador Web por defecto con la URL del servidor Web de Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="210" />
+      <location filename="../Project.py" line="202" />
       <source>&lt;b&gt;Run Web-Browser&lt;/b&gt;&lt;p&gt;Starts the default Web-Browser with the URL of the Pyramid Web server.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Lanzar Navegador Web&lt;/b&gt;&lt;p&gt;Inicia el Navegador Web por defecto con la URL del servidor Web de Pyramid.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1198" />
-      <location filename="../Project.py" line="219" />
+      <location filename="../Project.py" line="1359" />
+      <location filename="../Project.py" line="211" />
       <source>Start Pyramid Python Console</source>
       <translation>Iniciar Consola Python de Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="220" />
+      <location filename="../Project.py" line="212" />
       <source>Start Pyramid &amp;Python Console</source>
       <translation>Iniciar Consola &amp;Python de Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="223" />
+      <location filename="../Project.py" line="215" />
       <source>Starts an interactive Python interpreter</source>
       <translation>Inicia un intérprete interactivo de Python</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="225" />
+      <location filename="../Project.py" line="217" />
       <source>&lt;b&gt;Start Pyramid Python Console&lt;/b&gt;&lt;p&gt;Starts an interactive Python interpreter.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Iniciar Consola Python de Pyramid&lt;/b&gt;&lt;p&gt;Inicia un intérprete interactivo de Python.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1229" />
-      <location filename="../Project.py" line="237" />
-      <source>Setup Development Environment</source>
-      <translation>Configurar Entorno de Desarrollo</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="238" />
-      <source>Setup &amp;Development Environment</source>
-      <translation>Configurar Entorno de &amp;Desarrollo</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="241" />
-      <source>Setup the Pyramid project in development mode</source>
-      <translation>Configurar el proyecto Pyramid en modo de desarrollo</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="243" />
-      <source>&lt;b&gt;Setup Development Environment&lt;/b&gt;&lt;p&gt;Setup the Pyramid project in development mode using "python setup.py develop".&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Configurar Entorno de Desarrollo&lt;/b&gt;&lt;p&gt;Configurar el proyecto Pyramid en modo de desarrollo usando "python setup.py develop".&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1323" />
-      <location filename="../Project.py" line="1314" />
-      <location filename="../Project.py" line="256" />
-      <source>Initialize Database</source>
-      <translation>Inicializar Base de Datos</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="257" />
-      <source>Initialize &amp;Database</source>
-      <translation>Inicializar Base de &amp;Datos</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="260" />
-      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
-      <translation>Inicializa (o reinicializa) la base de datos del proyecto Pyramid actual</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="263" />
-      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Inicializar Base de Datos&lt;/b&gt;&lt;p&gt;Inicializa (o reinicializa) la base de datos del proyecto Pyramid actual.&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1366" />
-      <location filename="../Project.py" line="1353" />
-      <location filename="../Project.py" line="276" />
+      <location filename="../Project.py" line="1447" />
+      <location filename="../Project.py" line="1434" />
+      <location filename="../Project.py" line="229" />
       <source>Show Matching Views</source>
       <translation>Mostrar Vistas Concordantes</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="277" />
+      <location filename="../Project.py" line="230" />
       <source>Show Matching &amp;Views</source>
       <translation>Mostrar &amp;Vistas Concordantes</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="280" />
+      <location filename="../Project.py" line="233" />
       <source>Show views matching a given URL</source>
       <translation>Mostrar vistas que concuerdan con una URL dada</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="282" />
+      <location filename="../Project.py" line="235" />
       <source>&lt;b&gt;Show Matching Views&lt;/b&gt;&lt;p&gt;Show views matching a given URL.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Mostrar Vistas Concordantes&lt;/b&gt;&lt;p&gt;Mostrar vistas que concuerdan con una URL dada.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1387" />
-      <location filename="../Project.py" line="290" />
+      <location filename="../Project.py" line="1471" />
+      <location filename="../Project.py" line="243" />
       <source>Show Routes</source>
       <translation>Mostrar Rutas</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="291" />
+      <location filename="../Project.py" line="244" />
       <source>Show &amp;Routes</source>
       <translation>Mostrar &amp;Rutas</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="294" />
+      <location filename="../Project.py" line="247" />
       <source>Show all URL dispatch routes used by a Pyramid application</source>
       <translation>Mostrar todas las rutas URL de despacho usadas por una aplicación Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="296" />
+      <location filename="../Project.py" line="249" />
       <source>&lt;b&gt;Show Routes&lt;/b&gt;&lt;p&gt;Show all URL dispatch routes used by a Pyramid application in the order in which they are evaluated.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Mostrar Rutas&lt;/b&gt;&lt;p&gt;Mostrar todas las rutas URL de despacho usadas por una aplicación Pyramid en el orden en que son evaluadas.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1409" />
-      <location filename="../Project.py" line="305" />
+      <location filename="../Project.py" line="1493" />
+      <location filename="../Project.py" line="258" />
       <source>Show Tween Objects</source>
       <translation>Mostrar Objetos Gemelos</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="306" />
+      <location filename="../Project.py" line="259" />
       <source>Show &amp;Tween Objects</source>
       <translation>Mos&amp;trar Objetos Gemelos</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="309" />
+      <location filename="../Project.py" line="262" />
       <source>Show all implicit and explicit tween objects used by a Pyramid application</source>
       <translation>Mostrar todos los objetos gemelos implícitos y explícitos usados por una aplicación Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="312" />
+      <location filename="../Project.py" line="265" />
       <source>&lt;b&gt;Show Tween Objects&lt;/b&gt;&lt;p&gt;Show all implicit and explicit tween objects used by a Pyramid application.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Mostrar Objetos Gemelos&lt;/b&gt;&lt;p&gt;Mostrar todos los objetos gemelos implícitos y explícitos usados por una aplicación Pyramid.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="325" />
+      <location filename="../Project.py" line="278" />
       <source>Build Distribution</source>
       <translation>Construir Distribución</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="326" />
+      <location filename="../Project.py" line="279" />
       <source>Build &amp;Distribution</source>
       <translation>Construir &amp;Distribución</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="329" />
+      <location filename="../Project.py" line="282" />
       <source>Builds a distribution file for the Pyramid project</source>
       <translation>Construye un archivo de distribución para el proyecto Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="331" />
+      <location filename="../Project.py" line="284" />
       <source>&lt;b&gt;Build Distribution&lt;/b&gt;&lt;p&gt;Builds a distribution file for the Pyramid project using "python setup.py sdist".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Construir Distribución&lt;/b&gt;&lt;p&gt;Construye un archivo de distribución para el proyecto Pyramid usando "python setup.py sdist".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="344" />
+      <location filename="../Project.py" line="297" />
       <source>Documentation</source>
       <translation>Documentación</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="345" />
+      <location filename="../Project.py" line="298" />
       <source>D&amp;ocumentation</source>
       <translation>D&amp;ocumentación</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="348" />
+      <location filename="../Project.py" line="301" />
       <source>Shows the help viewer with the Pyramid documentation</source>
       <translation>Muestra el visor de ayuda con la documentación de Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="350" />
+      <location filename="../Project.py" line="303" />
       <source>&lt;b&gt;Documentation&lt;/b&gt;&lt;p&gt;Shows the help viewer with the Pyramid documentation.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Documentación&lt;/b&gt;&lt;p&gt;Muestra el visor de ayuda con la documentación de Pyramid.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="811" />
-      <location filename="../Project.py" line="362" />
+      <location filename="../Project.py" line="924" />
+      <location filename="../Project.py" line="315" />
       <source>About Pyramid</source>
       <translation>Acerca de Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="363" />
+      <location filename="../Project.py" line="316" />
       <source>About P&amp;yramid</source>
       <translation>Acerca de P&amp;yramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="366" />
+      <location filename="../Project.py" line="319" />
       <source>Shows some information about Pyramid</source>
       <translation>Muestra información sobre Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="368" />
+      <location filename="../Project.py" line="321" />
       <source>&lt;b&gt;About Pyramid&lt;/b&gt;&lt;p&gt;Shows some information about Pyramid.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Acerca de Pyramid&lt;/b&gt;&lt;p&gt;Muestra información acerca de Pyramid.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="386" />
+      <location filename="../Project.py" line="1919" />
+      <location filename="../Project.py" line="1909" />
+      <location filename="../Project.py" line="337" />
+      <source>Initialize Database</source>
+      <translation>Inicializar Base de Datos</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="338" />
+      <source>Initialize &amp;Database</source>
+      <translation>Inicializar Base de &amp;Datos</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="341" />
+      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
+      <translation>Inicializa (o reinicializa) la base de datos del proyecto Pyramid actual</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="344" />
+      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Inicializar Base de Datos&lt;/b&gt;&lt;p&gt;Inicializa (o reinicializa) la base de datos del proyecto Pyramid actual.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1946" />
+      <location filename="../Project.py" line="357" />
+      <source>Create Migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="358" />
+      <source>&amp;Create Migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="361" />
+      <source>Create a new migration for the current database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="363" />
+      <source>&lt;b&gt;Create Migration&lt;/b&gt;&lt;p&gt;Creates a new migration for the current database and stores it  in the configured migrations directory.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1984" />
+      <location filename="../Project.py" line="377" />
+      <source>Upgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="378" />
+      <source>&amp;Upgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="381" />
+      <source>Upgrade the database to the current migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="383" />
+      <source>&lt;b&gt;Upgrade Database&lt;/b&gt;&lt;p&gt;Upgrades the database to the current migration.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2011" />
+      <location filename="../Project.py" line="392" />
+      <source>Downgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="393" />
+      <source>&amp;Downgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="396" />
+      <source>Downgrade the database to the previous version</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="398" />
+      <source>&lt;b&gt;Downgrade Database&lt;/b&gt;&lt;p&gt;Downgrades the database to the previous version.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="411" />
+      <source>Show Migrations Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="412" />
+      <source>Show Migrations &amp;Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="415" />
+      <source>Show a summary of the created database migrations</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="417" />
+      <source>&lt;b&gt;Show Migrations Summary&lt;/b&gt;&lt;p&gt;Shows a summary list of the created database migrations.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="427" />
+      <source>Show Migrations History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="428" />
+      <source>Show Migrations &amp;History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="431" />
+      <source>Show the full history of the created database migrations</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="433" />
+      <source>&lt;b&gt;Show Migrations History&lt;/b&gt;&lt;p&gt;Shows the full history of the created database migrations.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="452" />
+      <source>Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="466" />
       <source>P&amp;yramid</source>
       <translation>P&amp;yramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="451" />
+      <location filename="../Project.py" line="531" />
       <source>Open with {0}</source>
       <translation>Abrir con {0}</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="465" />
+      <location filename="../Project.py" line="545" />
       <source>New template...</source>
       <translation>Nueva Plantilla...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="474" />
+      <location filename="../Project.py" line="554" />
       <source>Extract Messages</source>
       <translation>Extraer Mensajes</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="477" />
+      <location filename="../Project.py" line="557" />
       <source>Compile All Catalogs</source>
       <translation>Compilar Todos los Catálogos</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="480" />
+      <location filename="../Project.py" line="560" />
       <source>Compile Selected Catalogs</source>
       <translation>Compilar Catálogos Seleccionados</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="483" />
+      <location filename="../Project.py" line="563" />
       <source>Update All Catalogs</source>
       <translation>Actualizar Todos los Catálogos</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="486" />
+      <location filename="../Project.py" line="566" />
       <source>Update Selected Catalogs</source>
       <translation>Actualizar Catálogos Seleccionados</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="525" />
+      <location filename="../Project.py" line="605" />
       <source>Chameleon Templates (*.pt);;Chameleon Text Templates (*.txt);;Mako Templates (*.mako);;Mako Templates (*.mak);;HTML Files (*.html);;HTML Files (*.htm);;All Files (*)</source>
       <translation>Plantillas Chameleon (*.pt);;Plantillas de Texto Chameleon (*.txt);;Plantillas Mako (*.mako);;Plantillas Mako (*.mak);;Archivos HTML (*.html);;Archivos HTML (*.htm);;Todos los Archivos (*)</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="564" />
-      <location filename="../Project.py" line="550" />
-      <location filename="../Project.py" line="535" />
+      <location filename="../Project.py" line="644" />
+      <location filename="../Project.py" line="630" />
+      <location filename="../Project.py" line="615" />
       <source>New Form</source>
       <translation>Nuevo Formulario</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="551" />
+      <location filename="../Project.py" line="631" />
       <source>The file already exists! Overwrite it?</source>
       <translation>¡El archivo ya existe!¿Sobreescribirlo?</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="565" />
+      <location filename="../Project.py" line="645" />
       <source>&lt;p&gt;The new form file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;br/&gt; Problem: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;No se ha podido crear el nuevo archivo de formulario &lt;b&gt;{0}&lt;/b&gt;.&lt;br/&gt;Problema: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="812" />
+      <location filename="../Project.py" line="925" />
       <source>&lt;p&gt;Pyramid is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Version:&lt;/td&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URL:&lt;/td&gt;&lt;td&gt;&lt;a href="{1}"&gt;{1}&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
       <translation>&lt;p&gt;Pyramid es un framework Web de alto nivel para Python que promueve desarrollo rápido, y diseño pragmático
  y limpio.&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Versión:&lt;/td&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URL:&lt;/td&gt;&lt;td&gt;&lt;a href="{1}"&gt;{1}&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="997" />
+      <location filename="../Project.py" line="1098" />
+      <source>Initializing Pyramid Project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1159" />
       <source>Select Pyramid Project</source>
       <translation>Seleccionar Proyecto Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="998" />
+      <location filename="../Project.py" line="1160" />
       <source>Select the Pyramid project to work with.</source>
       <translation>Seleccionar el proyecto Pyramid con el que trabajar.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1036" />
+      <location filename="../Project.py" line="1198" />
       <source>None</source>
       <translation>Ninguno</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="1203" />
       <source>&amp;Current Pyramid Project ({0})</source>
       <translation>Proyecto Pyramid A&amp;ctual ({0})</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1724" />
-      <location filename="../Project.py" line="1694" />
-      <location filename="../Project.py" line="1641" />
-      <location filename="../Project.py" line="1604" />
-      <location filename="../Project.py" line="1567" />
-      <location filename="../Project.py" line="1513" />
-      <location filename="../Project.py" line="1416" />
-      <location filename="../Project.py" line="1394" />
+      <location filename="../Project.py" line="1926" />
+      <location filename="../Project.py" line="1910" />
+      <location filename="../Project.py" line="1811" />
+      <location filename="../Project.py" line="1781" />
+      <location filename="../Project.py" line="1728" />
+      <location filename="../Project.py" line="1691" />
+      <location filename="../Project.py" line="1654" />
+      <location filename="../Project.py" line="1600" />
+      <location filename="../Project.py" line="1500" />
+      <location filename="../Project.py" line="1478" />
+      <location filename="../Project.py" line="1441" />
+      <location filename="../Project.py" line="1400" />
       <location filename="../Project.py" line="1360" />
-      <location filename="../Project.py" line="1330" />
-      <location filename="../Project.py" line="1315" />
+      <location filename="../Project.py" line="1325" />
       <location filename="../Project.py" line="1271" />
-      <location filename="../Project.py" line="1236" />
-      <location filename="../Project.py" line="1199" />
-      <location filename="../Project.py" line="1164" />
-      <location filename="../Project.py" line="1105" />
       <source>No current Pyramid project selected or no Pyramid project created yet. Aborting...</source>
       <translation>No se ha seleccionado proyecto Pyramid actual o no hay creado todavía ningún proyecto Pyramid. Abortando...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1773" />
-      <location filename="../Project.py" line="1216" />
-      <location filename="../Project.py" line="1132" />
+      <location filename="../Project.py" line="1860" />
+      <location filename="../Project.py" line="1380" />
+      <location filename="../Project.py" line="1299" />
       <source>Process Generation Error</source>
       <translation>Error de Generación de Proceso</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1133" />
+      <location filename="../Project.py" line="1300" />
       <source>The Pyramid server could not be started.</source>
       <translation>No se ha podido iniciar el servidor de Pyramid.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1181" />
+      <location filename="../Project.py" line="1342" />
       <source>Could not start the web-browser for the URL "{0}".</source>
       <translation>No se ha podido inicialr el navegador web para la URL "{0}".</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1217" />
+      <location filename="../Project.py" line="1381" />
       <source>The Pyramid Shell process could not be started.</source>
       <translation>No se ha podido iniciar el proceso Shell de Pyramid.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1247" />
-      <source>Pyramid development environment setup successfully.</source>
-      <translation>Entorno de desarrollo de Pyramid configurado con éxito.</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1264" />
+      <location filename="../Project.py" line="1393" />
       <source>Build Distribution File</source>
       <translation>Construir Archivo de Distribución</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1291" />
+      <location filename="../Project.py" line="1420" />
       <source>Python distribution file built successfully.</source>
       <translation>Archivo de distribución Python construido con éxito.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1340" />
-      <source>Database initialized successfully.</source>
-      <translation>Base de Datos inicializada con éxito.</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1367" />
+      <location filename="../Project.py" line="1448" />
       <source>Enter the URL to be matched:</source>
       <translation>Introducir la URL a ser concordada:</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1506" />
+      <location filename="../Project.py" line="1593" />
       <source>Extract messages</source>
       <translation>Extraer mensajes</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1525" />
+      <location filename="../Project.py" line="1612" />
       <source>No setup.cfg found or no "extract_messages" section found in setup.cfg.</source>
       <translation>No se ha encontrado setup.cfg o no se ha encontrado la sección 'extract_messages' de setup.cfg.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1532" />
+      <location filename="../Project.py" line="1619" />
       <source>No "output_file" option found in setup.cfg.</source>
       <translation>No se ha encontrado opción "output_file" en setup.cfg.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1546" />
+      <location filename="../Project.py" line="1633" />
       <source>
 Messages extracted successfully.</source>
       <translation>Mensajes extraídos con éxito.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1559" />
+      <location filename="../Project.py" line="1646" />
       <source>Initializing message catalog for '{0}'</source>
       <translation>Inicializando catálogo de mensajes para '{0}'</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1580" />
+      <location filename="../Project.py" line="1667" />
       <source>
 Message catalog initialized successfully.</source>
       <translation>Catálogo de Mensajes inicializado con éxito.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1634" />
-      <location filename="../Project.py" line="1597" />
+      <location filename="../Project.py" line="1721" />
+      <location filename="../Project.py" line="1684" />
       <source>Compiling message catalogs</source>
       <translation>Compilando catálogos de mensajes</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1668" />
-      <location filename="../Project.py" line="1615" />
+      <location filename="../Project.py" line="1755" />
+      <location filename="../Project.py" line="1702" />
       <source>
 Message catalogs compiled successfully.</source>
       <translation>Catálogo de Mensajes compilado con éxito.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1746" />
-      <location filename="../Project.py" line="1663" />
+      <location filename="../Project.py" line="1833" />
+      <location filename="../Project.py" line="1750" />
       <source>No locales detected. Aborting...</source>
       <translation>No se han detectado traducciones. Abortando...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1717" />
-      <location filename="../Project.py" line="1687" />
+      <location filename="../Project.py" line="1804" />
+      <location filename="../Project.py" line="1774" />
       <source>Updating message catalogs</source>
       <translation>Actualizando catálogos de mensajes</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1751" />
-      <location filename="../Project.py" line="1705" />
+      <location filename="../Project.py" line="1838" />
+      <location filename="../Project.py" line="1792" />
       <source>
 Message catalogs updated successfully.</source>
       <translation>Catálogo de Mensajes actualizado con éxito.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1774" />
+      <location filename="../Project.py" line="1861" />
       <source>The translations editor process ({0}) could not be started.</source>
       <translation>El proceso de edición de traducciones ({0}) no ha podido ser iniciado.</translation>
     </message>
+    <message>
+      <location filename="../Project.py" line="1936" />
+      <source>Database initialized successfully.</source>
+      <translation>Base de Datos inicializada con éxito.</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1953" />
+      <source>Enter a short message for the migration:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1964" />
+      <source>
+Migration created successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1995" />
+      <source>
+Database upgraded successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2022" />
+      <source>
+Database downgraded successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2047" />
+      <source>Migrations History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <source>Run Server with Logging</source>
+      <translation type="vanished">Lanzar Servidor con Log</translation>
+    </message>
+    <message>
+      <source>Run Server with &amp;Logging</source>
+      <translation type="vanished">Lanzar Servidor con &amp;Log</translation>
+    </message>
+    <message>
+      <source>Starts the Pyramid Web server with logging</source>
+      <translation type="vanished">Inicia el servidor Web de Pyramid con log</translation>
+    </message>
+    <message>
+      <source>&lt;b&gt;Run Server with Logging&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server with logging using "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</source>
+      <translation type="vanished">&lt;b&gt;Lanzar Servidor con Log&lt;/b&gt;&lt;p&gt;Inicia el servidor Web de Pyramid con log usando "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <source>Setup Development Environment</source>
+      <translation type="vanished">Configurar Entorno de Desarrollo</translation>
+    </message>
+    <message>
+      <source>Setup &amp;Development Environment</source>
+      <translation type="vanished">Configurar Entorno de &amp;Desarrollo</translation>
+    </message>
+    <message>
+      <source>Setup the Pyramid project in development mode</source>
+      <translation type="vanished">Configurar el proyecto Pyramid en modo de desarrollo</translation>
+    </message>
+    <message>
+      <source>&lt;b&gt;Setup Development Environment&lt;/b&gt;&lt;p&gt;Setup the Pyramid project in development mode using "python setup.py develop".&lt;/p&gt;</source>
+      <translation type="vanished">&lt;b&gt;Configurar Entorno de Desarrollo&lt;/b&gt;&lt;p&gt;Configurar el proyecto Pyramid en modo de desarrollo usando "python setup.py develop".&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <source>Pyramid development environment setup successfully.</source>
+      <translation type="vanished">Entorno de desarrollo de Pyramid configurado con éxito.</translation>
+    </message>
   </context>
   <context>
     <name>ProjectPyramidPlugin</name>
@@ -679,12 +921,12 @@
   <context>
     <name>PyramidDialog</name>
     <message>
-      <location filename="../PyramidDialog.py" line="198" />
+      <location filename="../PyramidDialog.py" line="208" />
       <source>Process Generation Error</source>
       <translation>Error de Generación de Proceso</translation>
     </message>
     <message>
-      <location filename="../PyramidDialog.py" line="199" />
+      <location filename="../PyramidDialog.py" line="209" />
       <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
       <translation>No se ha podido iniciar el proceso {0}. Asegúrese de que está en la ruta de búsqueda.</translation>
     </message>
@@ -930,12 +1172,12 @@
       <translation>Obteniendo rutas...</translation>
     </message>
     <message>
-      <location filename="../PyramidRoutesDialog.py" line="190" />
+      <location filename="../PyramidRoutesDialog.py" line="193" />
       <source>Process Generation Error</source>
       <translation>Error de Generación de Proceso</translation>
     </message>
     <message>
-      <location filename="../PyramidRoutesDialog.py" line="191" />
+      <location filename="../PyramidRoutesDialog.py" line="194" />
       <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
       <translation>No se ha podido iniciar el proceso {0}. Asegúrese de que está en la ruta de búsqueda.</translation>
     </message>
--- a/ProjectPyramid/i18n/pyramid_ru.ts	Tue Jun 01 19:37:46 2021 +0200
+++ b/ProjectPyramid/i18n/pyramid_ru.ts	Sun Jun 06 16:30:37 2021 +0200
@@ -4,25 +4,9 @@
   <context>
     <name>CreateParametersDialog</name>
     <message>
-      <location filename="../CreateParametersDialog.py" line="55" />
-      <source>The pcreate command did not finish within 30s.</source>
-      <translation>Команда pcreate не завершилась за 30 сек.</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="58" />
-      <source>Could not start the pcreate executable.</source>
-      <translation>Не удается запустить исполняемый файл pcreate.</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="69" />
-      <source>Process Generation Error</source>
-      <translation>Ошибка при запуске процесса</translation>
-    </message>
-    <message>
-      <location filename="../CreateParametersDialog.py" line="115" />
-      <source>{0} ({1})</source>
-      <comment>scaffold name, explanatory text</comment>
-      <translation>{0} ({1})</translation>
+      <location filename="../CreateParametersDialog.py" line="47" />
+      <source>No Database</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
@@ -31,23 +15,58 @@
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Project &amp;Name:</source>
-      <translation>&amp;Имя проекта:</translation>
+      <source>Template:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the template to be used</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Template Version:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter an optional branch, tag or commit</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>CookieCutter Starter Parameters</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Enter the name of the Pyramid project to create</source>
-      <translation>Введите имя Pyramid проекта для его создания</translation>
+      <source>Project Name:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Enter the name of the Pyramid project</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>&amp;Scaffold:</source>
-      <translation>&amp;Каркас:</translation>
+      <source>Template Language:</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Select the scaffold to be used</source>
-      <translation>Выберите каркас представления для использования</translation>
+      <source>Select the templating language</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Backend:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Select the database backend</source>
+      <translation type="unfinished" />
     </message>
     <message>
       <location filename="../CreateParametersDialog.ui" line="0" />
@@ -60,14 +79,45 @@
       <translation>Переписывать существующие файлы</translation>
     </message>
     <message>
-      <location filename="../CreateParametersDialog.ui" line="0" />
-      <source>Select to simulate the creation</source>
-      <translation>Разрешить имитацию создания проекта</translation>
+      <source>The pcreate command did not finish within 30s.</source>
+      <translation type="vanished">Команда pcreate не завершилась за 30 сек.</translation>
+    </message>
+    <message>
+      <source>Could not start the pcreate executable.</source>
+      <translation type="vanished">Не удается запустить исполняемый файл pcreate.</translation>
+    </message>
+    <message>
+      <source>Process Generation Error</source>
+      <translation type="vanished">Ошибка при запуске процесса</translation>
+    </message>
+    <message>
+      <source>{0} ({1})</source>
+      <comment>scaffold name, explanatory text</comment>
+      <translation type="vanished">{0} ({1})</translation>
     </message>
     <message>
-      <location filename="../CreateParametersDialog.ui" line="0" />
+      <source>Project &amp;Name:</source>
+      <translation type="vanished">&amp;Имя проекта:</translation>
+    </message>
+    <message>
+      <source>Enter the name of the Pyramid project to create</source>
+      <translation type="vanished">Введите имя Pyramid проекта для его создания</translation>
+    </message>
+    <message>
+      <source>&amp;Scaffold:</source>
+      <translation type="vanished">&amp;Каркас:</translation>
+    </message>
+    <message>
+      <source>Select the scaffold to be used</source>
+      <translation type="vanished">Выберите каркас представления для использования</translation>
+    </message>
+    <message>
+      <source>Select to simulate the creation</source>
+      <translation type="vanished">Разрешить имитацию создания проекта</translation>
+    </message>
+    <message>
       <source>Simulate Pyramid project creation</source>
-      <translation>Имитировать создание Pyramid проекта</translation>
+      <translation type="vanished">Имитировать создание Pyramid проекта</translation>
     </message>
   </context>
   <context>
@@ -152,522 +202,714 @@
     </message>
   </context>
   <context>
+    <name>MigrateSummaryDialog</name>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="40" />
+      <source>Refresh</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="98" />
+      <location filename="../MigrateSummaryDialog.py" line="91" />
+      <source>Migrations Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="92" />
+      <source>The 'alembic' process did not finish within 10 seconds.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="99" />
+      <source>The 'alembic' process could not be started.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <location filename="../MigrateSummaryDialog.py" line="184" />
+      <location filename="../MigrateSummaryDialog.py" line="170" />
+      <source>Upgrade</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.py" line="172" />
+      <source>Downgrade</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Old Revision</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>New Revision</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Message</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Labels</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../MigrateSummaryDialog.ui" line="0" />
+      <source>Press to upgrade or downgrade the database to the selected migration</source>
+      <translation type="unfinished" />
+    </message>
+  </context>
+  <context>
     <name>Project</name>
     <message>
-      <location filename="../Project.py" line="136" />
+      <location filename="../Project.py" line="143" />
       <source>Current Pyramid Project</source>
       <translation>Текущий Pyramid проект</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="140" />
+      <location filename="../Project.py" line="147" />
       <source>Selects the current Pyramid project</source>
       <translation>Выбор текущего Pyramid проекта</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="142" />
+      <location filename="../Project.py" line="149" />
       <source>&lt;b&gt;Current Pyramid Project&lt;/b&gt;&lt;p&gt;Selects the Pyramid project. Used for multi-project Pyramid projects to switch between the projects.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Текущий Pyramid проект&lt;/b&gt;&lt;p&gt;Выбор Pyramid проекта. Используется в мультипроектных  Pyramid-проектах для переключения между проектами.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="931" />
-      <location filename="../Project.py" line="155" />
+      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="162" />
       <source>Create Pyramid Project</source>
       <translation>Создать Pyramid проект</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="156" />
+      <location filename="../Project.py" line="163" />
       <source>Create Pyramid &amp;Project</source>
       <translation>Создать Pyramid &amp;проект</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="159" />
+      <location filename="../Project.py" line="166" />
       <source>Creates a new Pyramid project</source>
       <translation>Создание нового Pyramid проекта</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="161" />
+      <location filename="../Project.py" line="168" />
       <source>&lt;b&gt;Create Pyramid Project&lt;/b&gt;&lt;p&gt;Creates a new Pyramid project using "pcreate".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Создание Pyramid проекта&lt;/b&gt;&lt;p&gt;Создание нового Pyramid-проекта посредством команды "pcreate".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1104" />
-      <location filename="../Project.py" line="173" />
+      <location filename="../Project.py" line="1270" />
+      <location filename="../Project.py" line="180" />
       <source>Run Server</source>
       <translation>Сервер разработки</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="174" />
+      <location filename="../Project.py" line="181" />
       <source>Run &amp;Server</source>
       <translation>&amp;Сервер разработки</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="177" />
+      <location filename="../Project.py" line="184" />
       <source>Starts the Pyramid Web server</source>
       <translation>Запуск Pyramid Web сервера разработки</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="179" />
+      <location filename="../Project.py" line="186" />
       <source>&lt;b&gt;Run Server&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server using "pserve --reload development.ini".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Сервер разработки&lt;/b&gt;&lt;p&gt;Запуск Pyramid Web сервера разработки посредством команды "pserve --reload development.ini".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="188" />
-      <source>Run Server with Logging</source>
-      <translation>Сервер разработки с ведением журнала</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="189" />
-      <source>Run Server with &amp;Logging</source>
-      <translation>Сервер разработки с ведением &amp;журнала</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="192" />
-      <source>Starts the Pyramid Web server with logging</source>
-      <translation>Запуск Pyramid Web сервера разработки с ведением журнала</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="194" />
-      <source>&lt;b&gt;Run Server with Logging&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server with logging using "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Сервер с ведением журнала&lt;/b&gt;&lt;p&gt;Запуск Pyramid Web сервера разработки с ведением журнала посредством команды "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1180" />
-      <location filename="../Project.py" line="1163" />
-      <location filename="../Project.py" line="203" />
+      <location filename="../Project.py" line="1341" />
+      <location filename="../Project.py" line="1324" />
+      <location filename="../Project.py" line="195" />
       <source>Run Web-Browser</source>
       <translation>Запуск Web-браузера для администрирования</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="204" />
+      <location filename="../Project.py" line="196" />
       <source>Run &amp;Web-Browser</source>
       <translation>Запуск &amp;Web-браузера</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="207" />
+      <location filename="../Project.py" line="199" />
       <source>Starts the default Web-Browser with the URL of the Pyramid Web server</source>
       <translation>Запуск стандартного Web-браузера с URL Pyramid Web сервера (администрирование)</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="210" />
+      <location filename="../Project.py" line="202" />
       <source>&lt;b&gt;Run Web-Browser&lt;/b&gt;&lt;p&gt;Starts the default Web-Browser with the URL of the Pyramid Web server.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Запуск Web-браузера&lt;/b&gt;&lt;p&gt;Запуск стандартного Web-браузера с URL Pyramid Web сервера.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1198" />
-      <location filename="../Project.py" line="219" />
+      <location filename="../Project.py" line="1359" />
+      <location filename="../Project.py" line="211" />
       <source>Start Pyramid Python Console</source>
       <translation>Запуск консоли Pyramid Python</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="220" />
+      <location filename="../Project.py" line="212" />
       <source>Start Pyramid &amp;Python Console</source>
       <translation>Запуск Pyramid &amp;Python консоли</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="223" />
+      <location filename="../Project.py" line="215" />
       <source>Starts an interactive Python interpreter</source>
       <translation>Запуск интерактивного интерпретатора Python</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="225" />
+      <location filename="../Project.py" line="217" />
       <source>&lt;b&gt;Start Pyramid Python Console&lt;/b&gt;&lt;p&gt;Starts an interactive Python interpreter.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Запуск Pyramid Python консоли&lt;/b&gt;&lt;p&gt;Запуск интерактивного интерпретатора Python.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1229" />
-      <location filename="../Project.py" line="237" />
-      <source>Setup Development Environment</source>
-      <translation>Настройка среды разработки</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="238" />
-      <source>Setup &amp;Development Environment</source>
-      <translation>Настройка среды &amp;разработки</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="241" />
-      <source>Setup the Pyramid project in development mode</source>
-      <translation>Настройка Pyramid проекта в режиме разработки</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="243" />
-      <source>&lt;b&gt;Setup Development Environment&lt;/b&gt;&lt;p&gt;Setup the Pyramid project in development mode using "python setup.py develop".&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Настройка среды разработки&lt;/b&gt;&lt;p&gt;Настройка Pyramid проекта в режиме разработки посредством "python setup.py develop".&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1323" />
-      <location filename="../Project.py" line="1314" />
-      <location filename="../Project.py" line="256" />
-      <source>Initialize Database</source>
-      <translation>Инициализация базы данных</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="257" />
-      <source>Initialize &amp;Database</source>
-      <translation>Инициализация &amp;базы данных</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="260" />
-      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
-      <translation>Инициализация (или ре-инициализация) базы данных текущего Pyramid проекта</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="263" />
-      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
-      <translation>&lt;b&gt;Инициализация базы данных&lt;/b&gt;&lt;p&gt;Инициализация (или ре-инициализация) базы данных текущего Pyramid проекта.&lt;/p&gt;</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1366" />
-      <location filename="../Project.py" line="1353" />
-      <location filename="../Project.py" line="276" />
+      <location filename="../Project.py" line="1447" />
+      <location filename="../Project.py" line="1434" />
+      <location filename="../Project.py" line="229" />
       <source>Show Matching Views</source>
       <translation>Показ сопоставленных видов</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="277" />
+      <location filename="../Project.py" line="230" />
       <source>Show Matching &amp;Views</source>
       <translation>Показ сопоставленных &amp;видов</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="280" />
+      <location filename="../Project.py" line="233" />
       <source>Show views matching a given URL</source>
       <translation>Показ видов, сопоставленных заданному URL</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="282" />
+      <location filename="../Project.py" line="235" />
       <source>&lt;b&gt;Show Matching Views&lt;/b&gt;&lt;p&gt;Show views matching a given URL.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Показ сопоставленных видов&lt;/b&gt;&lt;p&gt;Отображение видов, сопоставленных заданным URL.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1387" />
-      <location filename="../Project.py" line="290" />
+      <location filename="../Project.py" line="1471" />
+      <location filename="../Project.py" line="243" />
       <source>Show Routes</source>
       <translation>Показ маршрутов</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="291" />
+      <location filename="../Project.py" line="244" />
       <source>Show &amp;Routes</source>
       <translation>Показ &amp;маршрутов</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="294" />
+      <location filename="../Project.py" line="247" />
       <source>Show all URL dispatch routes used by a Pyramid application</source>
       <translation>Отображение всех URL dispatch маршрутов, используемых Pyramid приложением</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="296" />
+      <location filename="../Project.py" line="249" />
       <source>&lt;b&gt;Show Routes&lt;/b&gt;&lt;p&gt;Show all URL dispatch routes used by a Pyramid application in the order in which they are evaluated.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Показ маршрутов&lt;/b&gt;&lt;p&gt;Отображение всех URL dispatch маршрутов, используемых Pyramid приложением, в том порядке, в котором они выполняются.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1409" />
-      <location filename="../Project.py" line="305" />
+      <location filename="../Project.py" line="1493" />
+      <location filename="../Project.py" line="258" />
       <source>Show Tween Objects</source>
       <translation>Показ Tween объектов</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="306" />
+      <location filename="../Project.py" line="259" />
       <source>Show &amp;Tween Objects</source>
       <translation>Показ &amp;Tween объектов</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="309" />
+      <location filename="../Project.py" line="262" />
       <source>Show all implicit and explicit tween objects used by a Pyramid application</source>
       <translation>Показ всех явных и неявных tween-объектов, используемых Pyramid приложением</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="312" />
+      <location filename="../Project.py" line="265" />
       <source>&lt;b&gt;Show Tween Objects&lt;/b&gt;&lt;p&gt;Show all implicit and explicit tween objects used by a Pyramid application.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Показ Tween объектов&lt;/b&gt;&lt;p&gt;Отображение всех явных и неявных tween-объектов, используемых Pyramid приложением.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="325" />
+      <location filename="../Project.py" line="278" />
       <source>Build Distribution</source>
       <translation>Создать дистрибутив</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="326" />
+      <location filename="../Project.py" line="279" />
       <source>Build &amp;Distribution</source>
       <translation>Создать &amp;дистрибутив</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="329" />
+      <location filename="../Project.py" line="282" />
       <source>Builds a distribution file for the Pyramid project</source>
       <translation>Создание файла дистрибутива для Pyramid проекта</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="331" />
+      <location filename="../Project.py" line="284" />
       <source>&lt;b&gt;Build Distribution&lt;/b&gt;&lt;p&gt;Builds a distribution file for the Pyramid project using "python setup.py sdist".&lt;/p&gt;</source>
       <translation>&lt;b&gt;Создать дистрибутив&lt;/b&gt;&lt;p&gt;Создание файла дистрибутива для Pyramid проекта посредством команды "python setup.py sdist".&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="344" />
+      <location filename="../Project.py" line="297" />
       <source>Documentation</source>
       <translation>Документация</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="345" />
+      <location filename="../Project.py" line="298" />
       <source>D&amp;ocumentation</source>
       <translation>Д&amp;окументация</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="348" />
+      <location filename="../Project.py" line="301" />
       <source>Shows the help viewer with the Pyramid documentation</source>
       <translation>Отображение справочника с документацией Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="350" />
+      <location filename="../Project.py" line="303" />
       <source>&lt;b&gt;Documentation&lt;/b&gt;&lt;p&gt;Shows the help viewer with the Pyramid documentation.&lt;/p&gt;</source>
       <translation>&lt;b&gt;Документация&lt;/b&gt;&lt;p&gt;Отображение справочника с документацией Pyramid.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="811" />
-      <location filename="../Project.py" line="362" />
+      <location filename="../Project.py" line="924" />
+      <location filename="../Project.py" line="315" />
       <source>About Pyramid</source>
       <translation>О Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="363" />
+      <location filename="../Project.py" line="316" />
       <source>About P&amp;yramid</source>
       <translation>О P&amp;yramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="366" />
+      <location filename="../Project.py" line="319" />
       <source>Shows some information about Pyramid</source>
       <translation>Отображение информации о Pyramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="368" />
+      <location filename="../Project.py" line="321" />
       <source>&lt;b&gt;About Pyramid&lt;/b&gt;&lt;p&gt;Shows some information about Pyramid.&lt;/p&gt;</source>
       <translation>&lt;b&gt;О Pyramid&lt;/b&gt;&lt;p&gt;Отображение информации о Pyramid.&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="386" />
+      <location filename="../Project.py" line="1919" />
+      <location filename="../Project.py" line="1909" />
+      <location filename="../Project.py" line="337" />
+      <source>Initialize Database</source>
+      <translation>Инициализация базы данных</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="338" />
+      <source>Initialize &amp;Database</source>
+      <translation>Инициализация &amp;базы данных</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="341" />
+      <source>Initializes (or re-initializes) the database of the current Pyramid project</source>
+      <translation>Инициализация (или ре-инициализация) базы данных текущего Pyramid проекта</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="344" />
+      <source>&lt;b&gt;Initialize Database&lt;/b&gt;&lt;p&gt;Initializes (or re-initializes) the database of the current Pyramid project.&lt;/p&gt;</source>
+      <translation>&lt;b&gt;Инициализация базы данных&lt;/b&gt;&lt;p&gt;Инициализация (или ре-инициализация) базы данных текущего Pyramid проекта.&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1946" />
+      <location filename="../Project.py" line="357" />
+      <source>Create Migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="358" />
+      <source>&amp;Create Migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="361" />
+      <source>Create a new migration for the current database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="363" />
+      <source>&lt;b&gt;Create Migration&lt;/b&gt;&lt;p&gt;Creates a new migration for the current database and stores it  in the configured migrations directory.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1984" />
+      <location filename="../Project.py" line="377" />
+      <source>Upgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="378" />
+      <source>&amp;Upgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="381" />
+      <source>Upgrade the database to the current migration</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="383" />
+      <source>&lt;b&gt;Upgrade Database&lt;/b&gt;&lt;p&gt;Upgrades the database to the current migration.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2011" />
+      <location filename="../Project.py" line="392" />
+      <source>Downgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="393" />
+      <source>&amp;Downgrade Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="396" />
+      <source>Downgrade the database to the previous version</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="398" />
+      <source>&lt;b&gt;Downgrade Database&lt;/b&gt;&lt;p&gt;Downgrades the database to the previous version.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="411" />
+      <source>Show Migrations Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="412" />
+      <source>Show Migrations &amp;Summary</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="415" />
+      <source>Show a summary of the created database migrations</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="417" />
+      <source>&lt;b&gt;Show Migrations Summary&lt;/b&gt;&lt;p&gt;Shows a summary list of the created database migrations.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="427" />
+      <source>Show Migrations History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="428" />
+      <source>Show Migrations &amp;History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="431" />
+      <source>Show the full history of the created database migrations</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="433" />
+      <source>&lt;b&gt;Show Migrations History&lt;/b&gt;&lt;p&gt;Shows the full history of the created database migrations.&lt;/p&gt;</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="452" />
+      <source>Database</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="466" />
       <source>P&amp;yramid</source>
       <translation>P&amp;yramid</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="451" />
+      <location filename="../Project.py" line="531" />
       <source>Open with {0}</source>
       <translation>Открыть с помощью {0}</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="465" />
+      <location filename="../Project.py" line="545" />
       <source>New template...</source>
       <translation>Новый шаблон...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="474" />
+      <location filename="../Project.py" line="554" />
       <source>Extract Messages</source>
       <translation>Извлечь сообщения</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="477" />
+      <location filename="../Project.py" line="557" />
       <source>Compile All Catalogs</source>
       <translation>Компилировать все каталоги</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="480" />
+      <location filename="../Project.py" line="560" />
       <source>Compile Selected Catalogs</source>
       <translation>Компилировать выбранные каталоги</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="483" />
+      <location filename="../Project.py" line="563" />
       <source>Update All Catalogs</source>
       <translation>Обновить все каталоги</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="486" />
+      <location filename="../Project.py" line="566" />
       <source>Update Selected Catalogs</source>
       <translation>Обновить выбранные каталоги</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="525" />
+      <location filename="../Project.py" line="605" />
       <source>Chameleon Templates (*.pt);;Chameleon Text Templates (*.txt);;Mako Templates (*.mako);;Mako Templates (*.mak);;HTML Files (*.html);;HTML Files (*.htm);;All Files (*)</source>
       <translation>Шаблоны Chameleon (*.pt);;Шаблоны Chameleon Text (*.txt);;Шаблоны Mako (*.mako);;Mako Шаблоны (*.mak);;Файлы HTML (*.html);;Файлы HTML (*.htm);;Все файлы (*)</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="564" />
-      <location filename="../Project.py" line="550" />
-      <location filename="../Project.py" line="535" />
+      <location filename="../Project.py" line="644" />
+      <location filename="../Project.py" line="630" />
+      <location filename="../Project.py" line="615" />
       <source>New Form</source>
       <translation>Новая форма</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="551" />
+      <location filename="../Project.py" line="631" />
       <source>The file already exists! Overwrite it?</source>
       <translation>Файл уже существует! Переписать его?</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="565" />
+      <location filename="../Project.py" line="645" />
       <source>&lt;p&gt;The new form file &lt;b&gt;{0}&lt;/b&gt; could not be created.&lt;br/&gt; Problem: {1}&lt;/p&gt;</source>
       <translation>&lt;p&gt;Новый файл формы &lt;b&gt;{0}&lt;/b&gt; не может быть создан.&lt;br/&gt; Проблема: {1}&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="812" />
+      <location filename="../Project.py" line="925" />
       <source>&lt;p&gt;Pyramid is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Version:&lt;/td&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URL:&lt;/td&gt;&lt;td&gt;&lt;a href="{1}"&gt;{1}&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</source>
       <translation>&lt;p&gt;Pyramid это высокоуровневый веб-фреймворк, созданный на Python, воодушевляющий к развитому, чистому и практичному дизайну.&lt;/p&gt;&lt;p&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;Версия:&lt;/td&gt;&lt;td&gt;{0}&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;URL:&lt;/td&gt;&lt;td&gt;&lt;a href="{1}"&gt;{1}&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/p&gt;</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="997" />
+      <location filename="../Project.py" line="1098" />
+      <source>Initializing Pyramid Project</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1159" />
       <source>Select Pyramid Project</source>
       <translation>Выбор Pyramid проекта</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="998" />
+      <location filename="../Project.py" line="1160" />
       <source>Select the Pyramid project to work with.</source>
       <translation>Выберите Pyramid проект для работы.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1036" />
+      <location filename="../Project.py" line="1198" />
       <source>None</source>
       <translation>None</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1041" />
+      <location filename="../Project.py" line="1203" />
       <source>&amp;Current Pyramid Project ({0})</source>
       <translation>&amp;Текущий Pyramid проект ({0})</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1724" />
-      <location filename="../Project.py" line="1694" />
-      <location filename="../Project.py" line="1641" />
-      <location filename="../Project.py" line="1604" />
-      <location filename="../Project.py" line="1567" />
-      <location filename="../Project.py" line="1513" />
-      <location filename="../Project.py" line="1416" />
-      <location filename="../Project.py" line="1394" />
+      <location filename="../Project.py" line="1926" />
+      <location filename="../Project.py" line="1910" />
+      <location filename="../Project.py" line="1811" />
+      <location filename="../Project.py" line="1781" />
+      <location filename="../Project.py" line="1728" />
+      <location filename="../Project.py" line="1691" />
+      <location filename="../Project.py" line="1654" />
+      <location filename="../Project.py" line="1600" />
+      <location filename="../Project.py" line="1500" />
+      <location filename="../Project.py" line="1478" />
+      <location filename="../Project.py" line="1441" />
+      <location filename="../Project.py" line="1400" />
       <location filename="../Project.py" line="1360" />
-      <location filename="../Project.py" line="1330" />
-      <location filename="../Project.py" line="1315" />
+      <location filename="../Project.py" line="1325" />
       <location filename="../Project.py" line="1271" />
-      <location filename="../Project.py" line="1236" />
-      <location filename="../Project.py" line="1199" />
-      <location filename="../Project.py" line="1164" />
-      <location filename="../Project.py" line="1105" />
       <source>No current Pyramid project selected or no Pyramid project created yet. Aborting...</source>
       <translation>Не выбран текущий Pyramid проект, или Pyramid проект еще не создан.  Отмена...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1773" />
-      <location filename="../Project.py" line="1216" />
-      <location filename="../Project.py" line="1132" />
+      <location filename="../Project.py" line="1860" />
+      <location filename="../Project.py" line="1380" />
+      <location filename="../Project.py" line="1299" />
       <source>Process Generation Error</source>
       <translation>Ошибка при запуске процесса</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1133" />
+      <location filename="../Project.py" line="1300" />
       <source>The Pyramid server could not be started.</source>
       <translation>Невозможно запустить Pyramid сервер.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1181" />
+      <location filename="../Project.py" line="1342" />
       <source>Could not start the web-browser for the URL "{0}".</source>
       <translation>Невозможно запустить web-браузер с URL "{0}".</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1217" />
+      <location filename="../Project.py" line="1381" />
       <source>The Pyramid Shell process could not be started.</source>
       <translation>Невозможно запустить процесс Pyramid Shell.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1247" />
-      <source>Pyramid development environment setup successfully.</source>
-      <translation>Среда разработки Pyramid успешно настроена.</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1264" />
+      <location filename="../Project.py" line="1393" />
       <source>Build Distribution File</source>
       <translation>Создание файла дистрибутива</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1291" />
+      <location filename="../Project.py" line="1420" />
       <source>Python distribution file built successfully.</source>
       <translation>Файл дистрибутива Python успешно создан.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1340" />
-      <source>Database initialized successfully.</source>
-      <translation>База данных успешно инициализирована.</translation>
-    </message>
-    <message>
-      <location filename="../Project.py" line="1367" />
+      <location filename="../Project.py" line="1448" />
       <source>Enter the URL to be matched:</source>
       <translation>Введите URL для сопоставления:</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1506" />
+      <location filename="../Project.py" line="1593" />
       <source>Extract messages</source>
       <translation>Извлечь сообщения</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1525" />
+      <location filename="../Project.py" line="1612" />
       <source>No setup.cfg found or no "extract_messages" section found in setup.cfg.</source>
       <translation>Не найден файл setup.cfg или не найдена "extract_messages" секция в setup.cfg.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1532" />
+      <location filename="../Project.py" line="1619" />
       <source>No "output_file" option found in setup.cfg.</source>
       <translation>Опция "output_file" не найдена в setup.cfg.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1546" />
+      <location filename="../Project.py" line="1633" />
       <source>
 Messages extracted successfully.</source>
       <translation>
 Сообщения успешно извлечены.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1559" />
+      <location filename="../Project.py" line="1646" />
       <source>Initializing message catalog for '{0}'</source>
       <translation>Инициализация каталога сообщений для '{0}'</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1580" />
+      <location filename="../Project.py" line="1667" />
       <source>
 Message catalog initialized successfully.</source>
       <translation>
 Каталог сообщений успешно инициализирован.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1634" />
-      <location filename="../Project.py" line="1597" />
+      <location filename="../Project.py" line="1721" />
+      <location filename="../Project.py" line="1684" />
       <source>Compiling message catalogs</source>
       <translation>Компиляция каталогов сообщений</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1668" />
-      <location filename="../Project.py" line="1615" />
+      <location filename="../Project.py" line="1755" />
+      <location filename="../Project.py" line="1702" />
       <source>
 Message catalogs compiled successfully.</source>
       <translation>
 Каталоги сообщений успешно компилированы.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1746" />
-      <location filename="../Project.py" line="1663" />
+      <location filename="../Project.py" line="1833" />
+      <location filename="../Project.py" line="1750" />
       <source>No locales detected. Aborting...</source>
       <translation>Локали не найдены. Прерывание выполнения...</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1717" />
-      <location filename="../Project.py" line="1687" />
+      <location filename="../Project.py" line="1804" />
+      <location filename="../Project.py" line="1774" />
       <source>Updating message catalogs</source>
       <translation>Обновление каталогов сообщений</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1751" />
-      <location filename="../Project.py" line="1705" />
+      <location filename="../Project.py" line="1838" />
+      <location filename="../Project.py" line="1792" />
       <source>
 Message catalogs updated successfully.</source>
       <translation>
 Каталоги сообщений успешно обновлены.</translation>
     </message>
     <message>
-      <location filename="../Project.py" line="1774" />
+      <location filename="../Project.py" line="1861" />
       <source>The translations editor process ({0}) could not be started.</source>
       <translation>Невозможен запуск редактора переводов ({0}).</translation>
     </message>
+    <message>
+      <location filename="../Project.py" line="1936" />
+      <source>Database initialized successfully.</source>
+      <translation>База данных успешно инициализирована.</translation>
+    </message>
+    <message>
+      <location filename="../Project.py" line="1953" />
+      <source>Enter a short message for the migration:</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1964" />
+      <source>
+Migration created successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="1995" />
+      <source>
+Database upgraded successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2022" />
+      <source>
+Database downgraded successfully.</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <location filename="../Project.py" line="2047" />
+      <source>Migrations History</source>
+      <translation type="unfinished" />
+    </message>
+    <message>
+      <source>Run Server with Logging</source>
+      <translation type="vanished">Сервер разработки с ведением журнала</translation>
+    </message>
+    <message>
+      <source>Run Server with &amp;Logging</source>
+      <translation type="vanished">Сервер разработки с ведением &amp;журнала</translation>
+    </message>
+    <message>
+      <source>Starts the Pyramid Web server with logging</source>
+      <translation type="vanished">Запуск Pyramid Web сервера разработки с ведением журнала</translation>
+    </message>
+    <message>
+      <source>&lt;b&gt;Run Server with Logging&lt;/b&gt;&lt;p&gt;Starts the Pyramid Web server with logging using "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</source>
+      <translation type="vanished">&lt;b&gt;Сервер с ведением журнала&lt;/b&gt;&lt;p&gt;Запуск Pyramid Web сервера разработки с ведением журнала посредством команды "pserve --log-file=server.log --reload development.ini".&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <source>Setup Development Environment</source>
+      <translation type="vanished">Настройка среды разработки</translation>
+    </message>
+    <message>
+      <source>Setup &amp;Development Environment</source>
+      <translation type="vanished">Настройка среды &amp;разработки</translation>
+    </message>
+    <message>
+      <source>Setup the Pyramid project in development mode</source>
+      <translation type="vanished">Настройка Pyramid проекта в режиме разработки</translation>
+    </message>
+    <message>
+      <source>&lt;b&gt;Setup Development Environment&lt;/b&gt;&lt;p&gt;Setup the Pyramid project in development mode using "python setup.py develop".&lt;/p&gt;</source>
+      <translation type="vanished">&lt;b&gt;Настройка среды разработки&lt;/b&gt;&lt;p&gt;Настройка Pyramid проекта в режиме разработки посредством "python setup.py develop".&lt;/p&gt;</translation>
+    </message>
+    <message>
+      <source>Pyramid development environment setup successfully.</source>
+      <translation type="vanished">Среда разработки Pyramid успешно настроена.</translation>
+    </message>
   </context>
   <context>
     <name>ProjectPyramidPlugin</name>
@@ -682,12 +924,12 @@
   <context>
     <name>PyramidDialog</name>
     <message>
-      <location filename="../PyramidDialog.py" line="198" />
+      <location filename="../PyramidDialog.py" line="208" />
       <source>Process Generation Error</source>
       <translation>Ошибка при запуске процесса</translation>
     </message>
     <message>
-      <location filename="../PyramidDialog.py" line="199" />
+      <location filename="../PyramidDialog.py" line="209" />
       <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
       <translation>Процесс {0} не может быть запущен. Убедитесь, что к нему указан путь доступа.</translation>
     </message>
@@ -933,12 +1175,12 @@
       <translation>Получение маршрутов...</translation>
     </message>
     <message>
-      <location filename="../PyramidRoutesDialog.py" line="190" />
+      <location filename="../PyramidRoutesDialog.py" line="193" />
       <source>Process Generation Error</source>
       <translation>Ошибка при запуске процесса</translation>
     </message>
     <message>
-      <location filename="../PyramidRoutesDialog.py" line="191" />
+      <location filename="../PyramidRoutesDialog.py" line="194" />
       <source>The process {0} could not be started. Ensure, that it is in the search path.</source>
       <translation>Процесс {0} не может быть запущен. Убедитесь, что к нему указан путь доступа.</translation>
     </message>

eric ide

mercurial