[spyder] 02/09: Imported Upstream version 2.3.0~beta1+dfsg

Frédéric-Emmanuel Picca picca at moszumanska.debian.org
Thu Dec 26 21:16:01 UTC 2013


This is an automated email from the git hooks/post-receive script.

picca pushed a commit to branch experimental
in repository spyder.

commit 20db28f60e4e99849ff42b855b12b5b72305aaa4
Author: Picca Frédéric-Emmanuel <picca at debian.org>
Date:   Wed Oct 23 22:40:47 2013 +0200

    Imported Upstream version 2.3.0~beta1+dfsg
---
 LICENSE                                            |     4 +
 PKG-INFO                                           |     7 +-
 README                                             |    25 +-
 app_example/create_exe.py                          |     2 +-
 bootstrap.py                                       |    49 +-
 doc/conf.py                                        |    11 +-
 scripts/spyder_win_post_install.py                 |   181 +-
 setup.py                                           |    18 +-
 spyderlib/__init__.py                              |     2 +-
 spyderlib/baseconfig.py                            |    44 +-
 spyderlib/cli_options.py                           |    17 +-
 spyderlib/config.py                                |     4 +-
 spyderlib/guiconfig.py                             |    10 +-
 spyderlib/images/actions/edit24.png                |   Bin 0 -> 3345 bytes
 spyderlib/images/console/history24.png             |   Bin 0 -> 450 bytes
 spyderlib/interpreter.py                           |    19 +-
 spyderlib/locale/fr/LC_MESSAGES/spyderlib.mo       |   Bin 89030 -> 85568 bytes
 spyderlib/locale/fr/LC_MESSAGES/spyderlib.po       | 10102 +++++++++----------
 spyderlib/locale/spyderlib.pot                     |  8206 ++++++++-------
 spyderlib/mpl_patch.py                             |    11 +-
 spyderlib/plugins/__init__.py                      |    13 +-
 spyderlib/plugins/configdialog.py                  |   124 +-
 spyderlib/plugins/console.py                       |    14 +-
 spyderlib/plugins/editor.py                        |    58 +-
 spyderlib/plugins/explorer.py                      |     5 +-
 spyderlib/plugins/externalconsole.py               |   170 +-
 spyderlib/plugins/findinfiles.py                   |     5 +-
 spyderlib/plugins/history.py                       |    14 +-
 spyderlib/plugins/inspector.py                     |   119 +-
 spyderlib/plugins/ipythonconsole.py                |   533 +-
 spyderlib/plugins/onlinehelp.py                    |    13 +-
 spyderlib/plugins/outlineexplorer.py               |     5 +-
 spyderlib/plugins/projectexplorer.py               |     3 +-
 spyderlib/plugins/runconfig.py                     |    33 +-
 spyderlib/plugins/shortcuts.py                     |    24 +-
 spyderlib/plugins/variableexplorer.py              |     4 +-
 spyderlib/plugins/workingdirectory.py              |    21 +-
 spyderlib/py3compat.py                             |   246 +
 spyderlib/qt/compat.py                             |    39 +-
 spyderlib/scientific_startup.py                    |    40 +-
 spyderlib/spyder.py                                |   210 +-
 spyderlib/start_app.py                             |    20 +-
 spyderlib/userconfig.py                            |   155 +-
 spyderlib/utils/bsdsocket.py                       |    18 +-
 spyderlib/utils/classparser.py                     |   196 -
 spyderlib/utils/codeanalysis.py                    |    34 +-
 spyderlib/utils/debug.py                           |   116 +-
 spyderlib/utils/dochelpers.py                      |    49 +-
 spyderlib/utils/encoding.py                        |    36 +-
 spyderlib/utils/external/lockfile.py               |   463 +-
 spyderlib/utils/external/path.py                   |   116 +-
 spyderlib/utils/external/pickleshare.py            |    92 +-
 spyderlib/utils/inspector/conf.py                  |     5 +-
 spyderlib/utils/inspector/static/css/default.css   |    18 +
 spyderlib/utils/iofuncs.py                         |    87 +-
 spyderlib/utils/misc.py                            |     8 +-
 spyderlib/utils/module_completion.py               |   644 +-
 spyderlib/utils/programs.py                        |    36 +-
 spyderlib/utils/qthelpers.py                       |    30 +-
 spyderlib/utils/sourcecode.py                      |     4 +-
 spyderlib/utils/system.py                          |    12 +-
 spyderlib/utils/vcs.py                             |   221 +-
 spyderlib/utils/windows.py                         |    52 +-
 spyderlib/widgets/arrayeditor.py                   |    55 +-
 spyderlib/widgets/browser.py                       |     7 +-
 spyderlib/widgets/colors.py                        |     5 +-
 spyderlib/widgets/comboboxes.py                    |     5 +-
 spyderlib/widgets/dicteditor.py                    |    75 +-
 spyderlib/widgets/dicteditorutils.py               |    46 +-
 spyderlib/widgets/editor.py                        |   120 +-
 spyderlib/widgets/editortools.py                   |    36 +-
 spyderlib/widgets/explorer.py                      |    91 +-
 spyderlib/widgets/externalshell/baseshell.py       |    25 +-
 spyderlib/widgets/externalshell/monitor.py         |    32 +-
 .../widgets/externalshell/namespacebrowser.py      |    56 +-
 spyderlib/widgets/externalshell/osx_app_site.py    |    29 +-
 spyderlib/widgets/externalshell/pythonshell.py     |    36 +-
 spyderlib/widgets/externalshell/sitecustomize.py   |    98 +-
 .../widgets/externalshell/start_ipython_kernel.py  |    20 +-
 spyderlib/widgets/externalshell/systemshell.py     |    22 +-
 spyderlib/widgets/figureoptions.py                 |    34 +-
 spyderlib/widgets/findinfiles.py                   |    37 +-
 spyderlib/widgets/findreplace.py                   |     9 +-
 spyderlib/widgets/formlayout.py                    |    41 +-
 spyderlib/widgets/importwizard.py                  |    79 +-
 spyderlib/widgets/internalshell.py                 |    32 +-
 spyderlib/widgets/ipython.py                       |   328 +-
 spyderlib/widgets/mixins.py                        |    48 +-
 spyderlib/widgets/objecteditor.py                  |    19 +-
 spyderlib/widgets/outlineexplorer.py               |   119 -
 spyderlib/widgets/pathmanager.py                   |     7 +-
 spyderlib/widgets/projectexplorer.py               |    62 +-
 spyderlib/widgets/pydocgui.py                      |    33 +-
 spyderlib/widgets/shell.py                         |    34 +-
 spyderlib/widgets/sourcecode/base.py               |    78 +-
 spyderlib/widgets/sourcecode/codeeditor.py         |   165 +-
 spyderlib/widgets/sourcecode/syntaxhighlighters.py |  1931 ++--
 spyderlib/widgets/status.py                        |     3 +-
 spyderlib/widgets/tabs.py                          |    18 +-
 spyderlib/widgets/texteditor.py                    |     9 +-
 spyderplugins/io_dicom.py                          |     2 +-
 spyderplugins/io_hdf5.py                           |    14 +-
 spyderplugins/p_breakpoints.py                     |     9 +-
 spyderplugins/widgets/breakpointsgui.py            |     6 +-
 spyderplugins/widgets/profilergui.py               |  1072 +-
 spyderplugins/widgets/pylintgui.py                 |    34 +-
 106 files changed, 14204 insertions(+), 13594 deletions(-)

diff --git a/LICENSE b/LICENSE
index f7fdd11..cb91353 100644
--- a/LICENSE
+++ b/LICENSE
@@ -332,3 +332,7 @@ spyderlib/images/editor/run_selection.png
 spyderlib/images/editor/run_settings.png
 spyderlib/images/console/run_small.png
 
+[13] http://www.ajaxload.info/
+(Acoording to the website: "Generated gifs are
+totally free for use")
+spyderlib/images/console/loading.gif
diff --git a/PKG-INFO b/PKG-INFO
index fd39f84..f4f23b1 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,12 +1,12 @@
 Metadata-Version: 1.1
 Name: spyder
-Version: 2.2.5
+Version: 2.3.0beta1
 Summary: Scientific PYthon Development EnviRonment
 Home-page: http://code.google.com/p/spyderlib
 Author: Pierre Raybaut
 Author-email: UNKNOWN
 License: MIT
-Download-URL: http://code.google.com/p/spyderlib/files/spyder-2.2.5.zip
+Download-URL: http://code.google.com/p/spyderlib/files/spyder-2.3.0beta1.zip
 Description: Spyder is an interactive Python development environment providing 
         MATLAB-like features in a simple and light-weighted software.
         It also provides ready-to-use pure-Python widgets to your PyQt4 or 
@@ -21,9 +21,8 @@ Classifier: Operating System :: Microsoft :: Windows
 Classifier: Operating System :: OS Independent
 Classifier: Operating System :: POSIX
 Classifier: Operating System :: Unix
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Topic :: Scientific/Engineering
 Classifier: Topic :: Software Development :: Widget Sets
diff --git a/README b/README
index b3e9b30..033a07c 100644
--- a/README
+++ b/README
@@ -47,10 +47,6 @@ Licensed under the terms of the MIT License
         PyQt4 4.4+ or PySide 1.1.1+ (PyQt4 is recommended)
             
         Recommended modules
-            pywin32 (Windows XP/7/8)
-                *Strongly* recommended on this platform. It is necessary to
-                maintain a single instance and it's also needed to hide the
-                parent console from which Spyder was started.
             rope v0.9.2+ (editor code completion, calltips and go-to-definition)
             pyflakes v0.5.0+ (real-time code analysis)
             sphinx v0.6+ (object inspector's rich text mode)
@@ -109,7 +105,26 @@ Licensed under the terms of the MIT License
                 * through MacPorts 
             * on GNU/Linux, through your package manager
         For more details on supported platforms, please go to http://spyderlib.googlecode.com.
-            
+
+    Build Windows installers
+
+        From the source package, you may build Windows installers to distribute
+        Spyder on all supported platforms and versions of Python.
+        Spyder has a single code base supporting both Python 2 and Python 3 but
+        the Windows installer will target a specific version of Python because 
+        of the two external libraries included in the Windows installers 
+        ('pyflakes' and 'rope') which have specific versions for Python 3. 
+        Moreover, despite the fact that Spyder code base supports all Python 
+        architectures (32 and 64bit), the Windows installers will also target 
+        specific architectures because of a limitation of the way distutils 
+        works (see http://bugs.python.org/issue6792).
+
+        Example of Spyder binary installers for Windows:
+            * Python 2.7 and 32bit: spyder-2.3.0-win32-py2.7.exe
+            * Python 2.7 and 64bit: spyder-2.3.0-win-amd64-py2.7.exe
+            * Python 3.3 and 32bit: spyder-2.3.0-win32-py3.3.exe
+            * Python 3.3 and 64bit: spyder-2.3.0-win-amd64-py3.3.exe
+
     More informations
     
         Downloads, bug reports and feature requests:
diff --git a/app_example/create_exe.py b/app_example/create_exe.py
index 00f0927..f370df7 100644
--- a/app_example/create_exe.py
+++ b/app_example/create_exe.py
@@ -18,7 +18,7 @@ def create_executable():
     """Build executable using ``guidata.disthelpers``"""
     dist = Distribution()
     dist.setup(name="Example", version="1.1",
-               description=u"Embedding Spyder Qt shell",
+               description="Embedding Spyder Qt shell",
                script="example.pyw", target_name="example.exe")
     spyderlib.add_to_distribution(dist)
     #dist.add_modules('matplotlib')  # Uncomment if you need matplotlib
diff --git a/bootstrap.py b/bootstrap.py
index 0c4ec3d..55a6697 100755
--- a/bootstrap.py
+++ b/bootstrap.py
@@ -22,16 +22,21 @@ import optparse
 # --- Parse command line
 parser = optparse.OptionParser(
     usage="python bootstrap.py [options] [-- spyder_options]",
-    epilog="Arguments for Spyder's main script are specified after the "\
-           "-- symbol\n(example: `python bootstrap.py -- --show-console`). "\
-           "Type `python bootstrap.py -- --help` to read more about Spyder "\
-           "options.\n")
-parser.add_option('--gui', dest="gui", default=None,
+    epilog="""\
+Arguments for Spyder's main script are specified after the --
+symbol (example: `python bootstrap.py -- --show-console`).
+Type `python bootstrap.py -- --help` to read about Spyder
+options.""")
+parser.add_option('--gui', default=None,
                   help="GUI toolkit: pyqt (for PyQt4) or pyside (for PySide)")
+parser.add_option('--hide-console', action='store_true',
+                  default=False, help="Hide parent console window (Windows only)")
 parser.add_option('--test', dest="test", action='store_true', default=False,
                   help="Test Spyder with a clean settings dir")
-parser.add_option('--hide-console', dest="hide_console", action='store_true',
-                  default=False, help="Hide parent console (Windows only)")
+parser.add_option('--no-apport', action='store_true',
+                  default=False, help="Disable Apport exception hook (Ubuntu)")
+parser.add_option('--debug', action='store_true',
+                  default=False, help="Run Spyder in debug mode")
 options, args = parser.parse_args()
 
 assert options.gui in (None, 'pyqt', 'pyside'), \
@@ -51,7 +56,8 @@ DEVPATH = osp.dirname(osp.abspath(__file__))
 # To activate/deactivate certain things for development
 os.environ['SPYDER_DEV'] = 'True'
 
-# --- Test environment for sanity
+# --- Test environment for surprises
+
 # Warn if Spyder is located on non-ASCII path
 # http://code.google.com/p/spyderlib/issues/detail?id=812
 try:
@@ -65,6 +71,23 @@ except UnicodeDecodeError:
         pass
     input("Press Enter to continue or Ctrl-C to abort...")
 
+# Warn if we're running under 3rd party exception hook, such as
+# apport_python_hook.py from Ubuntu
+if sys.excepthook != sys.__excepthook__:
+   if sys.excepthook.__name__ != 'apport_excepthook':
+     print("WARNING: 3rd party Python exception hook is active: '%s'"
+            % sys.excepthook.__name__)
+   else:
+     if not options.no_apport:
+       print("WARNING: Ubuntu Apport exception hook is detected")
+       print("         Use --no-apport option to disable it")
+     else:
+       sys.excepthook = sys.__excepthook__
+       print("NOTICE: Ubuntu Apport exception hook is disabed")
+
+
+# --- Continue
+
 from spyderlib.utils.vcs import get_hg_revision
 print("Revision %s:%s, Branch: %s" % get_hg_revision(DEVPATH))
 
@@ -89,6 +112,15 @@ else:
     print ("02. Skipping GUI toolkit detection")
     os.environ['QT_API'] = options.gui
 
+if options.debug:
+    # safety check - Spyder config should not be imported at this point
+    if "spyderlib.baseconfig" in sys.modules:
+        sys.exit("ERROR: Can't enable debug mode - Spyder is already imported")
+    print("0x. Switching debug mode on")
+    os.environ["SPYDER_DEBUG"] = "True"
+    # this way of interaction suxx, because there is no feedback
+    # if operation is successful
+
 # Importing Spyder (among other things, this has the effect of setting the 
 # QT_API environment variable if this has not yet been done just above)
 
@@ -108,5 +140,6 @@ print("    [Python %s %dbits, Qt %s, %s %s on %s]" % \
 if not options.hide_console and os.name == 'nt':
     print("0x. Enforcing parent console (Windows only)")
     sys.argv.append("--show-console")  # Windows only: show parent console
+
 print("04. Executing spyder.main()")
 start_app.main()
diff --git a/doc/conf.py b/doc/conf.py
index b19214d..bb7d32d 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -37,17 +37,17 @@ source_suffix = '.rst'
 master_doc = 'index'
 
 # General information about the project.
-project = u'Spyder'
-copyright = u'2009-2013, Pierre Raybaut'
+project = 'Spyder'
+copyright = '2009, Pierre Raybaut'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
 # The short X.Y version.
-version = '2.2'
+version = '2.3'
 # The full version, including alpha/beta/rc tags.
-release = '2.2'
+release = '2.3'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -173,8 +173,7 @@ htmlhelp_basename = 'Spyderdoc'
 # Grouping the document tree into LaTeX files. List of tuples
 # (source start file, target name, title, author, documentclass [howto/manual]).
 latex_documents = [
-  ('index', 'Spyder.tex', u'Spyder Documentation',
-   u'Pierre Raybaut', 'manual'),
+  ('index', 'Spyder.tex', 'Spyder Documentation', 'Pierre Raybaut', 'manual'),
 ]
 
 # The name of an image file (relative to this directory) to place at the top of
diff --git a/scripts/spyder_win_post_install.py b/scripts/spyder_win_post_install.py
index 3aa959f..8986877 100644
--- a/scripts/spyder_win_post_install.py
+++ b/scripts/spyder_win_post_install.py
@@ -1,86 +1,95 @@
-# postinstall script for Spyder
-"""Create Spyder start menu entries"""
-
-import os
-import sys
-import os.path as osp
-import struct
-import _winreg as winreg
-
-EWS = "Edit with Spyder"
-KEY_C = r"Software\Classes\%s"
-KEY_C0 = KEY_C % r"Python.%sFile\shell\%s"
-KEY_C1 = KEY_C0 + r"\command"
-
-def install():
-    """Function executed when running the script with the -install switch"""
-    # Create Spyder start menu folder
-    start_menu = osp.join(get_special_folder_path('CSIDL_COMMON_PROGRAMS'),
-                          'Spyder (Py%i.%i %i bit)' % (sys.version_info[0],
-                                                       sys.version_info[1],
-                                                       struct.calcsize('P')*8))
-    if not osp.isdir(start_menu):
-        os.mkdir(start_menu)
-        directory_created(start_menu)
-    
-    # Create Spyder start menu entries
-    python = osp.abspath(osp.join(sys.prefix, 'python.exe'))
-    pythonw = osp.abspath(osp.join(sys.prefix, 'pythonw.exe'))
-    script = osp.abspath(osp.join(sys.prefix, 'scripts', 'spyder'))
-    workdir = "%HOMEDRIVE%%HOMEPATH%"
-    import distutils.sysconfig
-    lib_dir = distutils.sysconfig.get_python_lib(plat_specific=1)
-    ico_dir = osp.join(lib_dir, 'spyderlib', 'windows')
-
-    desc = 'Scientific Python Development EnvironmEnt, an alternative to IDLE'
-    fname = osp.join(start_menu, 'Spyder (full).lnk')
-    create_shortcut(python, desc, fname, '"%s"' % script, workdir,
-                    osp.join(ico_dir, 'spyder.ico'))
-    file_created(fname)
-
-    desc += '. Light configuration: console and variable explorer only.'
-    fname = osp.join(start_menu, 'Spyder (light).lnk')
-    create_shortcut(python, desc, fname,
-                    '"%s" --light' % script, workdir,
-                    osp.join(ico_dir, 'spyder_light.ico'))
-    file_created(fname)
-
-    fname = osp.join(start_menu, 'Spyder-Reset all settings.lnk')
-    create_shortcut(python, 'Reset Spyder settings to defaults',
-                    fname, '"%s" --reset' % script, workdir)
-    file_created(fname)
-
-    current = True  # only affects current user
-    root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE
-    winreg.SetValueEx(winreg.CreateKey(root, KEY_C1 % ("", EWS)),
-                      "", 0, winreg.REG_SZ,
-                      '"%s" "%s\Scripts\spyder" "%%1"' % (pythonw, sys.prefix))
-    winreg.SetValueEx(winreg.CreateKey(root, KEY_C1 % ("NoCon", EWS)),
-                      "", 0, winreg.REG_SZ,
-                      '"%s" "%s\Scripts\spyder" "%%1"' % (pythonw, sys.prefix))
-
-
-def remove():
-    """Function executed when running the script with the -install switch"""
-    current = True  # only affects current user
-    root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE
-    for key in (KEY_C1 % ("", EWS), KEY_C1 % ("NoCon", EWS),
-                KEY_C0 % ("", EWS), KEY_C0 % ("NoCon", EWS)):
-        try:
-            winreg.DeleteKey(root, key)
-        except WindowsError:
-            pass
-
-
-if __name__=='__main__':
-    if len(sys.argv) > 1:
-        if sys.argv[1] == '-install':
-            try:
-                install()
-            except OSError:
-                print >>sys.stderr, "Failed to create Start Menu items, "\
-                                    "try running installer as administrator."
-        elif sys.argv[1] == '-remove':
-            remove()
-        else:
-            print >>sys.stderr, "Unknown command line option %s" % sys.argv[1]
+# postinstall script for Spyder
+"""Create Spyder start menu entries"""
+
+from __future__ import print_function
+
+import os
+import sys
+import os.path as osp
+import struct
+try:
+    # Python 2
+    import _winreg as winreg
+except ImportError:
+    # Python 3
+    import winreg
+
+
+EWS = "Edit with Spyder"
+KEY_C = r"Software\Classes\%s"
+KEY_C0 = KEY_C % r"Python.%sFile\shell\%s"
+KEY_C1 = KEY_C0 + r"\command"
+
+def install():
+    """Function executed when running the script with the -install switch"""
+    # Create Spyder start menu folder
+    start_menu = osp.join(get_special_folder_path('CSIDL_COMMON_PROGRAMS'),
+                          'Spyder (Py%i.%i %i bit)' % (sys.version_info[0],
+                                                       sys.version_info[1],
+                                                       struct.calcsize('P')*8))
+    if not osp.isdir(start_menu):
+        os.mkdir(start_menu)
+        directory_created(start_menu)
+    
+    # Create Spyder start menu entries
+    python = osp.abspath(osp.join(sys.prefix, 'python.exe'))
+    pythonw = osp.abspath(osp.join(sys.prefix, 'pythonw.exe'))
+    script = osp.abspath(osp.join(sys.prefix, 'scripts', 'spyder'))
+    workdir = "%HOMEDRIVE%%HOMEPATH%"
+    import distutils.sysconfig
+    lib_dir = distutils.sysconfig.get_python_lib(plat_specific=1)
+    ico_dir = osp.join(lib_dir, 'spyderlib', 'windows')
+
+    desc = 'Scientific Python Development EnvironmEnt, an alternative to IDLE'
+    fname = osp.join(start_menu, 'Spyder (full).lnk')
+    create_shortcut(python, desc, fname, '"%s"' % script, workdir,
+                    osp.join(ico_dir, 'spyder.ico'))
+    file_created(fname)
+
+    desc += '. Light configuration: console and variable explorer only.'
+    fname = osp.join(start_menu, 'Spyder (light).lnk')
+    create_shortcut(python, desc, fname,
+                    '"%s" --light' % script, workdir,
+                    osp.join(ico_dir, 'spyder_light.ico'))
+    file_created(fname)
+
+    fname = osp.join(start_menu, 'Spyder-Reset all settings.lnk')
+    create_shortcut(python, 'Reset Spyder settings to defaults',
+                    fname, '"%s" --reset' % script, workdir)
+    file_created(fname)
+
+    current = True  # only affects current user
+    root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE
+    winreg.SetValueEx(winreg.CreateKey(root, KEY_C1 % ("", EWS)),
+                      "", 0, winreg.REG_SZ,
+                      '"%s" "%s\Scripts\spyder" "%%1"' % (pythonw, sys.prefix))
+    winreg.SetValueEx(winreg.CreateKey(root, KEY_C1 % ("NoCon", EWS)),
+                      "", 0, winreg.REG_SZ,
+                      '"%s" "%s\Scripts\spyder" "%%1"' % (pythonw, sys.prefix))
+
+
+def remove():
+    """Function executed when running the script with the -install switch"""
+    current = True  # only affects current user
+    root = winreg.HKEY_CURRENT_USER if current else winreg.HKEY_LOCAL_MACHINE
+    for key in (KEY_C1 % ("", EWS), KEY_C1 % ("NoCon", EWS),
+                KEY_C0 % ("", EWS), KEY_C0 % ("NoCon", EWS)):
+        try:
+            winreg.DeleteKey(root, key)
+        except WindowsError:
+            pass
+
+
+if __name__=='__main__':
+    if len(sys.argv) > 1:
+        if sys.argv[1] == '-install':
+            try:
+                install()
+            except OSError:
+                print("Failed to create Start Menu items, try running "\
+                      "installer as administrator.", file=sys.stderr)
+        elif sys.argv[1] == '-remove':
+            remove()
+        else:
+            print("Unknown command line option %s" % sys.argv[1],
+                  file=sys.stderr)
diff --git a/setup.py b/setup.py
index bc81377..f627db4 100644
--- a/setup.py
+++ b/setup.py
@@ -21,6 +21,7 @@ import os
 import os.path as osp
 import subprocess
 import sys
+import re
 import shutil
 
 
@@ -133,8 +134,14 @@ LIBNAME = 'spyderlib'
 from spyderlib import __version__, __project_url__
 
 
-WINDOWS_INSTALLER = 'bdist_wininst' in ''.join(sys.argv) or\
-                    'bdist_msi' in ''.join(sys.argv)
+JOINEDARGS = ''.join(sys.argv)
+WINDOWS_INSTALLER = 'bdist_wininst' in JOINEDARGS or 'bdist_msi' in JOINEDARGS
+TARGET_MATCH = re.search(r'--target-version=([0-9]*)\.([0-9]*)', JOINEDARGS)
+if TARGET_MATCH:
+    TARGET_VERSION = TARGET_MATCH.groups()
+else:
+    TARGET_VERSION = (str(sys.version_info.major), str(sys.version_info.minor))
+
 
 def get_packages():
     """Return package list"""
@@ -145,8 +152,9 @@ def get_packages():
         # Windows platforms, so...)
         import shutil
         import atexit
+        extdir = 'external-py' + TARGET_VERSION[0]
         for name in ('rope', 'pyflakes'):
-            srcdir = osp.join('external-py2', name)
+            srcdir = osp.join(extdir, name)
             if osp.isdir(srcdir):
                 dstdir = osp.join(LIBNAME, 'utils', 'external', name)
                 shutil.copytree(srcdir, dstdir)
@@ -198,6 +206,7 @@ editor, Python console, etc.""",
                {"install_script": "%s_win_post_install.py" % NAME,
                 "title": "%s %s" % (NAME.capitalize(), __version__),
                 "bitmap": osp.join('img_src', 'spyder-bdist_wininst.bmp'),
+                "target_version": '%s.%s' % TARGET_VERSION,
                 "user_access_control": "auto"},
                "bdist_msi":
                {"install_script": "%s_win_post_install.py" % NAME}},
@@ -207,9 +216,8 @@ editor, Python console, etc.""",
                    'Operating System :: OS Independent',
                    'Operating System :: POSIX',
                    'Operating System :: Unix',
-                   'Programming Language :: Python :: 2.5',
-                   'Programming Language :: Python :: 2.6',
                    'Programming Language :: Python :: 2.7',
+                   'Programming Language :: Python :: 3',
                    'Development Status :: 5 - Production/Stable',
                    'Topic :: Scientific/Engineering',
                    'Topic :: Software Development :: Widget Sets'],
diff --git a/spyderlib/__init__.py b/spyderlib/__init__.py
index 3e59750..bc7cdb5 100644
--- a/spyderlib/__init__.py
+++ b/spyderlib/__init__.py
@@ -27,7 +27,7 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 """
 
-__version__ = '2.2.5'
+__version__ = '2.3.0beta1'
 __license__ = __doc__
 __project_url__ = 'http://code.google.com/p/spyderlib'
 __forum_url__   = 'http://groups.google.com/group/spyderlib'
diff --git a/spyderlib/baseconfig.py b/spyderlib/baseconfig.py
index ebafb93..d4e70d5 100644
--- a/spyderlib/baseconfig.py
+++ b/spyderlib/baseconfig.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright © 2011 Pierre Raybaut
+# Copyright © 2011-2013 Pierre Raybaut
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
@@ -13,12 +13,16 @@ exclusively with non-GUI features configuration only
 sip API incompatibility issue in spyderlib's non-gui modules)
 """
 
+from __future__ import print_function
+
 import os.path as osp
 import os
 import sys
 
 # Local imports
 from spyderlib import __version__
+from spyderlib.py3compat import (is_unicode, TEXT_TYPES, INT_TYPES, PY3,
+                                 to_text_string, is_text_string)
 
 
 #==============================================================================
@@ -45,16 +49,30 @@ def _get_debug_env():
     return int(debug_env)    
 DEBUG = _get_debug_env()
 
+def debug_print(message):
+    """Output debug messages to stdout"""
+    if DEBUG:
+        ss = STDOUT
+        print(message, file=ss)
 
 #==============================================================================
 # Configuration paths
 #==============================================================================
+# Spyder settings dir
 if TEST is None:
     SUBFOLDER = '.spyder%s' % __version__.split('.')[0]
 else:
     SUBFOLDER = 'spyder_test'
 
 
+# We can't have PY2 and PY3 settings in the same dir because:
+# 1. This leads to ugly crashes and freezes (e.g. by trying to
+#    embed a PY2 interpreter in PY3)
+# 2. We need to save the list of installed modules (for code
+#    completion) separately for each version
+if PY3:
+    SUBFOLDER = SUBFOLDER + '-py3'
+
 def get_conf_path(filename=None):
     """Return absolute path for configuration file with specified filename"""
     if TEST is None:
@@ -177,15 +195,19 @@ def get_translation(modname, dirname=None):
         _trans = gettext.translation(modname, locale_path, codeset="utf-8")
         lgettext = _trans.lgettext
         def translate_gettext(x):
-            if isinstance(x, unicode):
+            if not PY3 and is_unicode(x):
                 x = x.encode("utf-8")
-            return unicode(lgettext(x), "utf-8")
+            y = lgettext(x)
+            if is_text_string(y) and PY3:
+                return y
+            else:
+                return to_text_string(y, "utf-8")
         return translate_gettext
-    except IOError, _e:  # analysis:ignore
+    except IOError as _e:  # analysis:ignore
         #print "Not using translations (%s)" % _e
         def translate_dumb(x):
-            if not isinstance(x, unicode):
-                return unicode(x, "utf-8")
+            if not is_unicode(x):
+                return to_text_string(x, "utf-8")
             return x
         return translate_dumb
 
@@ -211,10 +233,11 @@ def get_supported_types():
     If you update this list, don't forget to update doc/variablexplorer.rst
     """
     from datetime import date
-    editable_types = [int, long, float, list, dict, tuple, str, unicode, date]
+    editable_types = [int, float, list, dict, tuple, date
+                      ] + list(TEXT_TYPES) + list(INT_TYPES)
     try:
-        from numpy import ndarray, matrix
-        editable_types += [ndarray, matrix]
+        from numpy import ndarray, matrix, generic
+        editable_types += [ndarray, matrix, generic]
     except ImportError:
         pass
     picklable_types = editable_types[:]
@@ -232,4 +255,5 @@ CHECK_ALL = False #XXX: If True, this should take too much to compute...
 
 EXCLUDED_NAMES = ['nan', 'inf', 'infty', 'little_endian', 'colorbar_doc',
                   'typecodes', '__builtins__', '__main__', '__doc__', 'NaN',
-                  'Inf', 'Infinity', 'sctypes']
\ No newline at end of file
+                  'Inf', 'Infinity', 'sctypes', 'rcParams', 'rcParamsDefault',
+                  'sctypeNA', 'typeNA', 'False_', 'True_',]
diff --git a/spyderlib/cli_options.py b/spyderlib/cli_options.py
index d6de0bc..31910da 100644
--- a/spyderlib/cli_options.py
+++ b/spyderlib/cli_options.py
@@ -12,11 +12,9 @@ def get_options():
     return commands, message
     """
     parser = optparse.OptionParser(usage="spyder [options] files")
-    parser.add_option('-l', '--light', dest="light", action='store_true',
-                      default=False,
+    parser.add_option('-l', '--light', action='store_true', default=False,
                       help="Light version (all add-ons are disabled)")
-    parser.add_option('--new-instance', dest="new_instance",
-                      action='store_true', default=False,
+    parser.add_option('--new-instance', action='store_true', default=False,
                       help="Run a new instance of Spyder, even if the single "
                            "instance mode has been turned on (default)")
     parser.add_option('--session', dest="startup_session", default='',
@@ -27,21 +25,18 @@ def get_options():
     parser.add_option('--reset', dest="reset_session",
                       action='store_true', default=False,
                       help="Remove all configuration files!")
-    parser.add_option('--optimize', dest="optimize",
-                      action='store_true', default=False,
+    parser.add_option('--optimize', action='store_true', default=False,
                       help="Optimize Spyder bytecode (this may require "
                            "administrative privileges)")
     parser.add_option('-w', '--workdir', dest="working_directory", default=None,
                       help="Default working directory")
-    parser.add_option('--show-console', dest="show_console",
-                      action='store_true', default=False,
-                      help="Show parent console (Windows only)")
+    parser.add_option('--show-console', action='store_true', default=False,
+                      help="Do not hide parent console window (Windows)")
     parser.add_option('--multithread', dest="multithreaded",
                       action='store_true', default=False,
                       help="Internal console is executed in another thread "
                            "(separate from main application thread)")
-    parser.add_option('--profile', dest="profile", action='store_true',
-                      default=False,
+    parser.add_option('--profile', action='store_true', default=False,
                       help="Profile mode (internal test, "
                            "not related with Python profiling)")
     options, args = parser.parse_args()
diff --git a/spyderlib/config.py b/spyderlib/config.py
index c876833..4caa40a 100644
--- a/spyderlib/config.py
+++ b/spyderlib/config.py
@@ -97,7 +97,7 @@ EDIT_FILTERS = _get_filters(EDIT_FILETYPES)
 EDIT_EXT = _get_extensions(EDIT_FILETYPES)+['']
 
 # Extensions supported by Spyder's Variable explorer
-IMPORT_EXT = iofuncs.iofunctions.load_extensions.values()
+IMPORT_EXT = list(iofuncs.iofunctions.load_extensions.values())
 
 # Extensions that should be visible in Spyder's file/project explorers
 SHOW_EXT = ['.png', '.ico', '.svg']
@@ -409,7 +409,7 @@ DEFAULTS = [
               'show_hidden': True,
               'show_all': False,
               'show_toolbar': True,
-              'show_icontext': True,
+              'show_icontext': False,
               }),
             ('find_in_files',
              {
diff --git a/spyderlib/guiconfig.py b/spyderlib/guiconfig.py
index 1f2e9d0..56c202f 100644
--- a/spyderlib/guiconfig.py
+++ b/spyderlib/guiconfig.py
@@ -19,11 +19,13 @@ from spyderlib.qt.QtGui import QFont, QFontDatabase
 from spyderlib.config import CONF
 from spyderlib.userconfig import NoDefault
 from spyderlib.widgets.sourcecode import syntaxhighlighters as sh
+from spyderlib.py3compat import to_text_string
 
 
 def font_is_installed(font):
     """Check if font is installed"""
-    return [fam for fam in QFontDatabase().families() if unicode(fam)==font]
+    return [fam for fam in QFontDatabase().families()
+            if to_text_string(fam)==font]
     
 def get_family(families):
     """Return the first installed font family in family list"""
@@ -33,7 +35,7 @@ def get_family(families):
         if font_is_installed(family):
             return family
     else:
-        print "Warning: None of the following fonts is installed: %r" % families
+        print("Warning: None of the following fonts is installed: %r" % families)
         return QFont().family()
     
 FONT_CACHE = {}
@@ -65,7 +67,7 @@ def set_font(font, section, option=None):
         option = 'font'
     else:
         option += '/font'
-    CONF.set(section, option+'/family', unicode(font.family()))
+    CONF.set(section, option+'/family', to_text_string(font.family()))
     CONF.set(section, option+'/size', float(font.pointSize()))
     CONF.set(section, option+'/italic', int(font.italic()))
     CONF.set(section, option+'/bold', int(font.bold()))
@@ -116,7 +118,7 @@ def set_color_scheme(name, color_scheme, replace=True):
         value = CONF.get(section, option, default=None)
         if value is None or replace or name not in names:
             CONF.set(section, option, color_scheme[key])
-    names.append(unicode(name))
+    names.append(to_text_string(name))
     CONF.set(section, "names", sorted(list(set(names))))
 
 def set_default_color_scheme(name, replace=True):
diff --git a/spyderlib/images/actions/edit24.png b/spyderlib/images/actions/edit24.png
new file mode 100644
index 0000000..7d62300
Binary files /dev/null and b/spyderlib/images/actions/edit24.png differ
diff --git a/spyderlib/images/console/history24.png b/spyderlib/images/console/history24.png
new file mode 100644
index 0000000..a366e64
Binary files /dev/null and b/spyderlib/images/console/history24.png differ
diff --git a/spyderlib/interpreter.py b/spyderlib/interpreter.py
index ebdd4c7..a8dbf2f 100644
--- a/spyderlib/interpreter.py
+++ b/spyderlib/interpreter.py
@@ -6,6 +6,8 @@
 
 """Shell Interpreter"""
 
+from __future__ import print_function
+
 import sys
 import atexit
 import threading
@@ -20,6 +22,7 @@ from code import InteractiveConsole
 # Local imports:
 from spyderlib.utils.dochelpers import isdefined
 from spyderlib.utils import encoding
+from spyderlib.py3compat import is_text_string, getcwd
 from spyderlib.utils.misc import remove_backslashes
 
 # Force Python to search modules in the current directory first:
@@ -32,7 +35,7 @@ def guess_filename(filename):
         return filename
     if not filename.endswith('.py'):
         filename += '.py'
-    for path in [os.getcwdu()]+sys.path:
+    for path in [getcwd()] + sys.path:
         fname = osp.join(path, filename)
         if osp.isfile(fname):
             return fname
@@ -81,7 +84,7 @@ class Interpreter(InteractiveConsole, threading.Thread):
         # Create communication pipes
         pr, pw = os.pipe()
         self.stdin_read = os.fdopen(pr, "r")
-        self.stdin_write = os.fdopen(pw, "w", 0)
+        self.stdin_write = os.fdopen(pw, "wb", 0)
         self.stdout_write = Output()
         self.stderr_write = Output()
         
@@ -142,7 +145,7 @@ such as "spam", type "modules spam".
             try:
                 eval("pydoc.help(%s)" % text)
             except (NameError, SyntaxError):
-                print "no Python documentation found for '%r'" % text
+                print("no Python documentation found for '%r'" % text)
         self.write(os.linesep)
         self.widget_proxy.new_prompt("help> ")
         inp = self.raw_input_replacement()
@@ -210,8 +213,8 @@ has the same effect as typing a particular string at the help> prompt.
             # System ! command
             pipe = Popen(cmd[1:], shell=True,
                          stdin=PIPE, stderr=PIPE, stdout=PIPE)
-            txt_out = encoding.transcode( pipe.stdout.read() )
-            txt_err = encoding.transcode( pipe.stderr.read().rstrip() )
+            txt_out = encoding.transcode( pipe.stdout.read().decode() )
+            txt_err = encoding.transcode( pipe.stderr.read().decode().rstrip() )
             if txt_err:
                 self.stderr_write.write(txt_err)
             if txt_out:
@@ -245,7 +248,7 @@ has the same effect as typing a particular string at the help> prompt.
     def get_thread_id(self):
         """Return thread id"""
         if self._id is None:
-            for thread_id, obj in threading._active.items():
+            for thread_id, obj in list(threading._active.items()):
                 if obj is self:
                     self._id = thread_id
         return self._id
@@ -282,7 +285,7 @@ has the same effect as typing a particular string at the help> prompt.
         Run filename
         args: command line arguments (string)
         """
-        if args is not None and not isinstance(args, basestring):
+        if args is not None and not is_text_string(args):
             raise TypeError("expected a character buffer object")
         self.namespace['__file__'] = filename
         sys.argv = [filename]
@@ -299,7 +302,7 @@ has the same effect as typing a particular string at the help> prompt.
         where *obj* is the object represented by *text*
         and *valid* is True if object evaluation did not raise any exception
         """
-        assert isinstance(text, (str, unicode))
+        assert is_text_string(text)
         try:
             return eval(text, self.locals), True
         except:
diff --git a/spyderlib/locale/fr/LC_MESSAGES/spyderlib.mo b/spyderlib/locale/fr/LC_MESSAGES/spyderlib.mo
index 9f384a6..7f564af 100644
Binary files a/spyderlib/locale/fr/LC_MESSAGES/spyderlib.mo and b/spyderlib/locale/fr/LC_MESSAGES/spyderlib.mo differ
diff --git a/spyderlib/locale/fr/LC_MESSAGES/spyderlib.po b/spyderlib/locale/fr/LC_MESSAGES/spyderlib.po
index d7026e5..c86791f 100644
--- a/spyderlib/locale/fr/LC_MESSAGES/spyderlib.po
+++ b/spyderlib/locale/fr/LC_MESSAGES/spyderlib.po
@@ -2,5078 +2,5030 @@
 # Spyder's french translation file
 # Copyright (C) 2009-2011 Pierre Raybaut
 # 
-msgid ""
-msgstr ""
-"Project-Id-Version: 2.1\n"
-"POT-Creation-Date: 2013-10-12 19:49+COT\n"
-"PO-Revision-Date: 2011-04-11 21:41+2\n"
-"Last-Translator: Pierre Raybaut\n"
-"Language-Team: Python\n"
-"Language: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=utf-8\n"
-"Content-Transfer-Encoding: utf-8\n"
-"Generated-By: pygettext.py 1.5\n"
-
-#: spyderlib/config.py:46
-msgid "Python files"
-msgstr "Fichiers Python"
-
-#: spyderlib/config.py:47
-msgid "Cython/Pyrex files"
-msgstr "Fichiers Cython/Pyrex"
-
-#: spyderlib/config.py:48
-msgid "C files"
-msgstr "Fichiers C"
-
-#: spyderlib/config.py:49
-msgid "C++ files"
-msgstr "Fichiers C++"
-
-#: spyderlib/config.py:50
-msgid "OpenCL files"
-msgstr "Fichiers OpenCL"
-
-#: spyderlib/config.py:51
-msgid "Fortran files"
-msgstr "Fichiers Fortran"
-
-#: spyderlib/config.py:52
-msgid "IDL files"
-msgstr "Fichiers IDL"
-
-#: spyderlib/config.py:53
-msgid "MATLAB files"
-msgstr "Fichiers MATLAB"
-
-#: spyderlib/config.py:54
-msgid "Patch and diff files"
-msgstr "Fichiers patch et diff"
-
-#: spyderlib/config.py:55
-msgid "Batch files"
-msgstr "Fichiers Batch"
-
-#: spyderlib/config.py:56 spyderlib/utils/iofuncs.py:345
-msgid "Text files"
-msgstr "Fichiers texte"
-
-#: spyderlib/config.py:57
-msgid "reStructured Text files"
-msgstr "Fichiers reST"
-
-#: spyderlib/config.py:58
-msgid "gettext files"
-msgstr "Fichiers gettext"
-
-#: spyderlib/config.py:59
-msgid "NSIS files"
-msgstr "Fichiers NSIS"
-
-#: spyderlib/config.py:60
-msgid "Web page files"
-msgstr "Fichiers web"
-
-#: spyderlib/config.py:61
-msgid "XML files"
-msgstr "Fichiers XML"
-
-#: spyderlib/config.py:62
-msgid "Javascript files"
-msgstr "Fichiers Javascript"
-
-#: spyderlib/config.py:63
-msgid "Enaml files"
-msgstr "Fichiers Enaml"
-
-#: spyderlib/config.py:64
-msgid "Configuration files"
-msgstr "Configurations"
-
-#: spyderlib/config.py:71 spyderlib/widgets/explorer.py:619
-msgid "All files"
-msgstr "Tous les fichiers"
-
-#: spyderlib/plugins/configdialog.py:134
-msgid "Preferences"
-msgstr "Préférences"
-
-#: spyderlib/plugins/configdialog.py:413
-msgid "Invalid directory path"
-msgstr "Chemin d'accès de répertoire incorrect"
-
-#: spyderlib/plugins/configdialog.py:416 spyderlib/plugins/configdialog.py:432
-#: spyderlib/plugins/runconfig.py:169 spyderlib/plugins/runconfig.py:229
-#: spyderlib/plugins/workingdirectory.py:293 spyderlib/widgets/explorer.py:535
-#: spyderlib/widgets/externalshell/pythonshell.py:602
-#: spyderlib/widgets/findinfiles.py:502 spyderlib/widgets/pathmanager.py:217
-#: spyderlib/widgets/projectexplorer.py:888
-msgid "Select directory"
-msgstr "Sélectionner un répertoire"
-
-#: spyderlib/plugins/configdialog.py:444
-msgid "Invalid file path"
-msgstr "Chemin d'accès de fichier incorrect"
-
-#: spyderlib/plugins/configdialog.py:447 spyderlib/plugins/configdialog.py:465
-msgid "Select file"
-msgstr "Sélectionner un fichier"
-
-#: spyderlib/plugins/configdialog.py:464
-msgid "All files (*)"
-msgstr "Tous les fichiers (*)"
-
-#: spyderlib/plugins/configdialog.py:528 spyderlib/widgets/formlayout.py:216
-msgid "Bold"
-msgstr "Gras"
-
-#: spyderlib/plugins/configdialog.py:531 spyderlib/widgets/formlayout.py:211
-msgid "Italic"
-msgstr "Italique"
-
-#: spyderlib/plugins/configdialog.py:569
-msgid "Font: "
-msgstr "Police : "
-
-#: spyderlib/plugins/configdialog.py:573
-msgid "Size: "
-msgstr "Taille : "
-
-#: spyderlib/plugins/configdialog.py:582 spyderlib/plugins/history.py:41
-msgid "Font style"
-msgstr "Police d'écriture"
-
-#: spyderlib/plugins/configdialog.py:626
-msgid "General"
-msgstr "Général"
-
-#: spyderlib/plugins/configdialog.py:635 spyderlib/plugins/editor.py:93
-#: spyderlib/plugins/externalconsole.py:74
-#: spyderlib/plugins/ipythonconsole.py:70
-msgid "Interface"
-msgstr "Interface"
-
-#: spyderlib/plugins/configdialog.py:638
-msgid "Qt windows style"
-msgstr "Style de fenêtres Qt"
-
-#: spyderlib/plugins/configdialog.py:642
-msgid "Use a single instance"
-msgstr "Ouvrir une seule instance de Spyder"
-
-#: spyderlib/plugins/configdialog.py:644
-msgid ""
-"Set this to open external<br> Python files in an already running instance "
-"(Requires a restart)"
-msgstr ""
-"Activer cette option afin que les fichiers ouverts<br>depuis l'extérieur "
-"soit affichés dans une instance unique de Spyder<br>(redémarrage requis)"
-
-#: spyderlib/plugins/configdialog.py:647
-msgid "Vertical dockwidget title bars"
-msgstr "Barres de titre orientées verticalement"
-
-#: spyderlib/plugins/configdialog.py:649
-msgid "Vertical dockwidget tabs"
-msgstr "Onglets distribués verticalement"
-
-#: spyderlib/plugins/configdialog.py:651
-msgid "Animated toolbars and dockwidgets"
-msgstr "Panneaux et barres d'outils animés"
-
-#: spyderlib/plugins/configdialog.py:653
-msgid "Tear off menus"
-msgstr "Menus détachables"
-
-#: spyderlib/plugins/configdialog.py:654
-msgid "Set this to detach any<br> menu from the main window"
-msgstr ""
-"Activer cette option rend détachables tous les menus de la fenêtre principale"
-
-#: spyderlib/plugins/configdialog.py:656
-msgid "Custom dockwidget margin:"
-msgstr "Marges personnalisées :"
-
-#: spyderlib/plugins/configdialog.py:673
-msgid ""
-"This feature requires the pywin32 module.\n"
-"It seems you don't have it installed."
-msgstr ""
-"Cette fonctionnalité nécessite l'installation du module pywin32.\n"
-"Ce dernier n'est apparemment pas installé."
-
-#: spyderlib/plugins/configdialog.py:691
-msgid "Status bar"
-msgstr "Barre d'état"
-
-#: spyderlib/plugins/configdialog.py:692
-msgid "Show memory usage every"
-msgstr "Afficher l'occupation mémoire toutes les"
-
-#: spyderlib/plugins/configdialog.py:703
-msgid "Show CPU usage every"
-msgstr "Afficher la charge du CPU toutes les"
-
-#: spyderlib/plugins/configdialog.py:720
-msgid "Debugging"
-msgstr "Débogage"
-
-#: spyderlib/plugins/configdialog.py:721
-msgid "Pop up internal console when internal errors appear"
-msgstr "Afficher la console interne en cas d'erreur inattendue"
-
-#: spyderlib/plugins/configdialog.py:744
-msgid "Syntax coloring"
-msgstr "Coloration syntaxique"
-
-#: spyderlib/plugins/configdialog.py:755
-msgid "Background:"
-msgstr "Fond :"
-
-#: spyderlib/plugins/configdialog.py:756
-#: spyderlib/widgets/sourcecode/codeeditor.py:256
-msgid "Current line:"
-msgstr "Ligne actuelle :"
-
-#: spyderlib/plugins/configdialog.py:757
-msgid "Occurence:"
-msgstr "Occurence :"
-
-#: spyderlib/plugins/configdialog.py:758
-msgid "Link:"
-msgstr "Lien :"
-
-#: spyderlib/plugins/configdialog.py:759
-msgid "Side areas:"
-msgstr "Zones latérales :"
-
-#: spyderlib/plugins/configdialog.py:760
-msgid "Matched parentheses:"
-msgstr "Parenthèse fermée :"
-
-#: spyderlib/plugins/configdialog.py:761
-msgid "Unmatched parentheses:"
-msgstr "Parenthèse non fermée :"
-
-#: spyderlib/plugins/configdialog.py:762
-msgid "Normal text:"
-msgstr "Texte normal :"
-
-#: spyderlib/plugins/configdialog.py:763
-msgid "Keyword:"
-msgstr "Mot-clé :"
-
-#: spyderlib/plugins/configdialog.py:764
-msgid "Builtin:"
-msgstr "Objet intégré :"
-
-#: spyderlib/plugins/configdialog.py:765
-msgid "Definition:"
-msgstr "Définition :"
-
-#: spyderlib/plugins/configdialog.py:766
-msgid "Comment:"
-msgstr "Commentaire :"
-
-#: spyderlib/plugins/configdialog.py:767
-msgid "String:"
-msgstr "Chaîne :"
-
-#: spyderlib/plugins/configdialog.py:768
-msgid "Number:"
-msgstr "Nombre :"
-
-#: spyderlib/plugins/configdialog.py:769
-msgid "Instance:"
-msgstr "Instance :"
-
-#: spyderlib/plugins/configdialog.py:775
-msgid "Color scheme"
-msgstr "Paramètres de coloration syntaxique"
-
-#: spyderlib/plugins/configdialog.py:797 spyderlib/plugins/shortcuts.py:344
-msgid "Reset to default values"
-msgstr "Rétablir les valeurs par défaut"
-
-#: spyderlib/plugins/console.py:103
-msgid "Internal console"
-msgstr "Console interne"
-
-#: spyderlib/plugins/console.py:123 spyderlib/plugins/ipythonconsole.py:521
-#: spyderlib/spyder.py:757
-msgid "&Quit"
-msgstr "&Quitter"
-
-#: spyderlib/plugins/console.py:124 spyderlib/spyder.py:758
-msgid "Quit"
-msgstr "Quitter"
-
-#: spyderlib/plugins/console.py:127 spyderlib/plugins/externalconsole.py:1098
-msgid "&Run..."
-msgstr "Exécute&r..."
-
-#: spyderlib/plugins/console.py:128 spyderlib/plugins/externalconsole.py:1099
-msgid "Run a Python script"
-msgstr "Exécuter un script Python"
-
-#: spyderlib/plugins/console.py:131
-msgid "Environment variables..."
-msgstr "Variables d'environnement..."
-
-#: spyderlib/plugins/console.py:133
-msgid "Show and edit environment variables (for current session)"
-msgstr ""
-"Afficher et modifier les variables d'environnement (pour la session en cours)"
-
-#: spyderlib/plugins/console.py:137
-msgid "Show sys.path contents..."
-msgstr "Afficher le contenu de sys.path..."
-
-#: spyderlib/plugins/console.py:139
-msgid "Show (read-only) sys.path"
-msgstr "Afficher le contenu de sys.path (lecture seule)"
-
-#: spyderlib/plugins/console.py:142
-msgid "Buffer..."
-msgstr "Tampon..."
-
-#: spyderlib/plugins/console.py:143 spyderlib/plugins/externalconsole.py:94
-#: spyderlib/plugins/history.py:34
-msgid "Set maximum line count"
-msgstr "Modifier le nombre maximum de lignes"
-
-#: spyderlib/plugins/console.py:146 spyderlib/plugins/explorer.py:59
-#: spyderlib/plugins/history.py:149 spyderlib/plugins/inspector.py:284
-#: spyderlib/plugins/projectexplorer.py:57
-msgid "&Font..."
-msgstr "&Police..."
-
-#: spyderlib/plugins/console.py:147 spyderlib/plugins/history.py:150
-msgid "Set shell font style"
-msgstr "Changer la police d'écriture de la console"
-
-#: spyderlib/plugins/console.py:150
-msgid "External editor path..."
-msgstr "Éditeur externe..."
-
-#: spyderlib/plugins/console.py:151
-msgid "Set external editor executable path"
-msgstr "Modifier le chemin d'accès de l'éditeur externe"
-
-#: spyderlib/plugins/console.py:154 spyderlib/plugins/editor.py:131
-#: spyderlib/plugins/externalconsole.py:95 spyderlib/plugins/history.py:37
-#: spyderlib/plugins/history.py:152 spyderlib/plugins/inspector.py:96
-#: spyderlib/plugins/inspector.py:287
-msgid "Wrap lines"
-msgstr "Retour à la ligne automatique"
-
-#: spyderlib/plugins/console.py:157 spyderlib/plugins/editor.py:161
-#: spyderlib/plugins/externalconsole.py:144
-msgid "Balloon tips"
-msgstr "Info-bulles"
-
-#: spyderlib/plugins/console.py:161 spyderlib/plugins/editor.py:153
-#: spyderlib/plugins/externalconsole.py:136
-msgid "Automatic code completion"
-msgstr "Complétion de code automatique"
-
-#: spyderlib/plugins/console.py:165 spyderlib/plugins/editor.py:159
-#: spyderlib/plugins/externalconsole.py:142
-msgid "Enter key selects completion"
-msgstr "Entrée valide la complétion de code"
-
-#: spyderlib/plugins/console.py:170
-msgid "Internal console settings"
-msgstr "Options de la console interne"
-
-#: spyderlib/plugins/console.py:221 spyderlib/plugins/externalconsole.py:1272
-msgid "Run Python script"
-msgstr "Exécuter un script Python"
-
-#: spyderlib/plugins/console.py:222 spyderlib/plugins/externalconsole.py:258
-#: spyderlib/plugins/externalconsole.py:1273 spyderlib/widgets/explorer.py:633
-msgid "Python scripts"
-msgstr "Scripts Python"
-
-#: spyderlib/plugins/console.py:267 spyderlib/plugins/explorer.py:110
-#: spyderlib/plugins/history.py:267 spyderlib/plugins/inspector.py:548
-#: spyderlib/plugins/projectexplorer.py:119
-msgid "Select a new font"
-msgstr "Sélectionner une police d'écriture"
-
-#: spyderlib/plugins/console.py:274
-msgid "Buffer"
-msgstr "Tampon"
-
-#: spyderlib/plugins/console.py:275
-msgid "Maximum line count"
-msgstr "Nombre maximum de lignes"
-
-#: spyderlib/plugins/console.py:284
-msgid "External editor"
-msgstr "Éditeur externe"
-
-#: spyderlib/plugins/console.py:285
-msgid "External editor executable path:"
-msgstr "Chemin d'accès de l'exécutable :"
-
-#: spyderlib/plugins/editor.py:87 spyderlib/plugins/editor.py:510
-#: spyderlib/plugins/editor.py:1574 spyderlib/plugins/inspector.py:315
-#: spyderlib/widgets/editor.py:566
-#: spyderlib/widgets/sourcecode/codeeditor.py:246
-#: spyderlib/widgets/sourcecode/codeeditor.py:2535
-msgid "Editor"
-msgstr "Éditeur"
-
-#: spyderlib/plugins/editor.py:90
-msgid "Edit template for new modules"
-msgstr "Modifier le modèle (nouveaux modules)"
-
-#: spyderlib/plugins/editor.py:95
-msgid "Text and margin font style"
-msgstr "Police d'écriture du texte et de la marge"
-
-#: spyderlib/plugins/editor.py:98
-msgid "Sort files according to full path"
-msgstr "Classer les fichiers suivant leur chemin complet"
-
-#: spyderlib/plugins/editor.py:100
-msgid "Show tab bar"
-msgstr "Afficher la barre d'onglets"
-
-#: spyderlib/plugins/editor.py:107 spyderlib/plugins/editor.py:182
-#: spyderlib/plugins/externalconsole.py:90
-#: spyderlib/plugins/externalconsole.py:135 spyderlib/plugins/history.py:36
-#: spyderlib/plugins/inspector.py:95 spyderlib/plugins/ipythonconsole.py:116
-msgid "Source code"
-msgstr "Code source"
-
-#: spyderlib/plugins/editor.py:108
-msgid "Show line numbers"
-msgstr "Afficher les numéros de ligne"
-
-#: spyderlib/plugins/editor.py:109
-msgid "Show vertical line after"
-msgstr "Afficher une ligne verticale après"
-
-#: spyderlib/plugins/editor.py:110
-msgid "characters"
-msgstr "caractères"
-
-#: spyderlib/plugins/editor.py:118
-msgid "Highlight current line"
-msgstr "Surligner la ligne en cours d'édition"
-
-#: spyderlib/plugins/editor.py:120
-msgid "Highlight occurences after"
-msgstr "Surligner les occurences après"
-
-#: spyderlib/plugins/editor.py:134 spyderlib/plugins/history.py:45
-#: spyderlib/plugins/inspector.py:99
-msgid "Syntax color scheme: "
-msgstr "Thème de coloration syntaxique : "
-
-#: spyderlib/plugins/editor.py:146 spyderlib/plugins/runconfig.py:304
-#: spyderlib/plugins/runconfig.py:426 spyderlib/plugins/runconfig.py:433
-#: spyderlib/spyder.py:1713 spyderlib/widgets/explorer.py:229
-#: spyderlib/widgets/externalshell/baseshell.py:137
-msgid "Run"
-msgstr "Exécuter"
-
-#: spyderlib/plugins/editor.py:147
-msgid "Save all files before running script"
-msgstr "Enregistrer tous les fichiers avant l'exécution d'un script"
-
-#: spyderlib/plugins/editor.py:150 spyderlib/plugins/externalconsole.py:424
-msgid "Introspection"
-msgstr "Introspection"
-
-#: spyderlib/plugins/editor.py:155 spyderlib/plugins/externalconsole.py:138
-msgid "Case sensitive code completion"
-msgstr "Complétion de code sensible à la casse"
-
-#: spyderlib/plugins/editor.py:157 spyderlib/plugins/externalconsole.py:140
-msgid "Show single completion"
-msgstr "Afficher les listes de complétion avec un choix unique"
-
-#: spyderlib/plugins/editor.py:162
-msgid "Link to object definition"
-msgstr "Lien vers la définition d'un objet"
-
-#: spyderlib/plugins/editor.py:164
-msgid ""
-"If this option is enabled, clicking on an object\n"
-"name (left-click + Ctrl key) will go this object\n"
-"definition (if resolved)."
-msgstr ""
-"Si cette option est activée, cliquer sur le nom\n"
-"d'un objet (click gauche + touche Ctrl) ira à la\n"
-"définition de cet objet (si celle-ci est trouvée)."
-
-#: spyderlib/plugins/editor.py:168 spyderlib/plugins/externalconsole.py:146
-#: spyderlib/plugins/ipythonconsole.py:88
-msgid "Automatic notification to object inspector"
-msgstr "Notification automatique à l'inspecteur d'objets"
-
-#: spyderlib/plugins/editor.py:170
-msgid ""
-"If this option is enabled, object inspector\n"
-"will automatically show informations on functions\n"
-"entered in editor (this is triggered when entering\n"
-"a left parenthesis after a valid function name)"
-msgstr ""
-"Si cette option est activée, l'inspecteur d'objet\n"
-"affichera automatiquement des informations\n"
-"sur les fonctions saisies dans l'éditeur\n"
-"(le mécanisme est déclenché par la saisie d'une\n"
-"parenthèse gauche après un nom valide de fonction)"
-
-#: spyderlib/plugins/editor.py:175
-msgid ""
-"<b>Warning:</b><br>The Python module <i>rope</i> is not installed on this "
-"computer: calltips, code completion and go-to-definition features won't be "
-"available."
-msgstr ""
-"<b>Avertissement :</b><br>Le module Python <i>rope</i> n'est pas installé "
-"sur cet ordinateur : les fonctionnalités telles que la complétion de code ou "
-"le lien vers la définition d'un objet ne sont donc pas accessibles."
-
-#: spyderlib/plugins/editor.py:183
-msgid "Automatic insertion of parentheses, braces and brackets"
-msgstr "Insertion automatique des parenthèses, crochets et accolades"
-
-#: spyderlib/plugins/editor.py:186
-msgid "Automatic insertion of closing quotes"
-msgstr "Insertion automatique de guillemets de clôture"
-
-#: spyderlib/plugins/editor.py:188
-msgid "Automatic insertion of colons after 'for', 'if', 'def', etc"
-msgstr "Insertion automatique de ':' après 'for', 'if', 'def', etc."
-
-#: spyderlib/plugins/editor.py:191
-msgid "Automatic indentation after 'else', 'elif', etc."
-msgstr "Indentation automatique après 'else', 'elif', etc."
-
-#: spyderlib/plugins/editor.py:193
-msgid "Indentation characters: "
-msgstr "Caractères d'indentation : "
-
-#: spyderlib/plugins/editor.py:194
-msgid "4 spaces"
-msgstr "4 espaces"
-
-#: spyderlib/plugins/editor.py:195
-msgid "2 spaces"
-msgstr "2 espaces"
-
-#: spyderlib/plugins/editor.py:196
-msgid "tab"
-msgstr "tabulation"
-
-#: spyderlib/plugins/editor.py:197
-msgid "Tab stop width:"
-msgstr "Largeur des tabulations :"
-
-#: spyderlib/plugins/editor.py:197
-msgid "pixels"
-msgstr "pixels"
-
-#: spyderlib/plugins/editor.py:199
-msgid "Tab always indent"
-msgstr "Toujours indenter avec la touche Tab"
-
-#: spyderlib/plugins/editor.py:201
-msgid ""
-"If enabled, pressing Tab will always indent,\n"
-"even when the cursor is not at the beginning\n"
-"of a line (when this option is enabled, code\n"
-"completion may be triggered using the alternate\n"
-"shortcut: Ctrl+Space)"
-msgstr ""
-"Si cette option est activée, presser la touche Tab\n"
-"provoquera toujours l'indentation de la ligne,\n"
-"quelle que soit la position du curseur (lorsque cette\n"
-"option est activée, la complétion de code reste \n"
-"accessible via le raccourci Ctrl+Espace)"
-
-#: spyderlib/plugins/editor.py:206
-msgid "Intelligent backspace"
-msgstr "Retour arrière (\"backspace\") intelligent"
-
-#: spyderlib/plugins/editor.py:208
-msgid "Automatically remove trailing spaces when saving files"
-msgstr ""
-"Supprimer automatiquement les espaces en fin de ligne lors de "
-"l'enregistrement"
-
-#: spyderlib/plugins/editor.py:212
-msgid "Analysis"
-msgstr "Analyse"
-
-#: spyderlib/plugins/editor.py:214
-msgid ""
-"<u>Note</u>: add <b>analysis:ignore</b> in a comment to ignore code/style "
-"analysis warnings. For more informations on style guide for Python code, "
-"please refer to the %s page."
-msgstr ""
-"<u>Note</u>: ajouter <b>analysis:ignore</b> dans un commentaire pour ignorer "
-"les résultats de l'analyse de code ou de style. Pour plus d'informations sur "
-"les recommandations officielles de style d'écriture avec le langage Python, "
-"veuillez visiter la page de la %s."
-
-#: spyderlib/plugins/editor.py:223
-#: spyderlib/widgets/sourcecode/codeeditor.py:1587
-msgid "Code analysis"
-msgstr "Analyse de code"
-
-#: spyderlib/plugins/editor.py:225
-msgid ""
-"If enabled, Python source code will be analyzed\n"
-"using pyflakes, lines containing errors or \n"
-"warnings will be highlighted"
-msgstr ""
-"Si cette option est activée, le code source Python sera analysé\n"
-"avec des outils l'outil d'introspection de code pyflakes\n"
-"et les lignes contenant des erreurs seront indiquées"
-
-#: spyderlib/plugins/editor.py:230
-msgid "Code analysis requires pyflakes %s+"
-msgstr "L'analyse de code requiert pyflakes %s+"
-
-#: spyderlib/plugins/editor.py:232
-msgid "Style analysis"
-msgstr "Analyse de style"
-
-#: spyderlib/plugins/editor.py:234
-msgid ""
-"If enabled, Python source code will be analyzed\n"
-"using pep8, lines that are not following PEP8\n"
-"style guide will be highlighted"
-msgstr ""
-"Si cette option est activée, le style du code source Python sera analysé\n"
-"avec l'outil d'introspection de code pep8 et les lignes ne suivant pas\n"
-"les recommandations officielles seront indiquées"
-
-#: spyderlib/plugins/editor.py:241
-msgid "Tasks (TODO, FIXME, XXX, HINT, TIP)"
-msgstr "Tâches (TODO, FIXME, XXX, HINT, TIP)"
-
-#: spyderlib/plugins/editor.py:244
-msgid "Perform analysis when saving file and every"
-msgstr "Analyser lors de l'enregistrement et toutes les"
-
-#: spyderlib/plugins/editor.py:248
-msgid "Perform analysis only when saving file"
-msgstr "Analyser uniquement lors de l'enregistrement"
-
-#: spyderlib/plugins/editor.py:294
-msgid "End-of-line characters"
-msgstr "Caractères de fin de ligne"
-
-#: spyderlib/plugins/editor.py:295
-msgid ""
-"When opening a text file containing mixed end-of-line characters (this may "
-"raise syntax errors in Python interpreter on Windows platforms), Spyder may "
-"fix the file automatically."
-msgstr ""
-"Lors de l'ouverture d'un fichier contenant des caractères de fin de ligne "
-"mélangés (ce qui peut se traduire par des erreurs de syntaxe dans "
-"l'interpréteur Python sous Windows), Spyder peut réparer le fichier "
-"automatiquement."
-
-#: spyderlib/plugins/editor.py:301
-msgid "Fix automatically and show warning message box"
-msgstr "Réparer automatiquement et afficher un message d'avertissement"
-
-#: spyderlib/plugins/editor.py:312 spyderlib/plugins/externalconsole.py:422
-#: spyderlib/plugins/ipythonconsole.py:369
-#: spyderlib/plugins/variableexplorer.py:41
-msgid "Display"
-msgstr "Affichage"
-
-#: spyderlib/plugins/editor.py:314
-msgid "Code Introspection/Analysis"
-msgstr "Introspection et analyse de code"
-
-#: spyderlib/plugins/editor.py:317 spyderlib/plugins/externalconsole.py:427
-msgid "Advanced settings"
-msgstr "Options avancées"
-
-#: spyderlib/plugins/editor.py:566 spyderlib/widgets/editortools.py:467
-msgid "Show/hide outline explorer"
-msgstr "Afficher/masquer l'explorateur de structure"
-
-#: spyderlib/plugins/editor.py:572
-msgid "Show/hide project explorer"
-msgstr "Afficher/masquer l'explorateur de projets"
-
-#: spyderlib/plugins/editor.py:581
-msgid "&New file..."
-msgstr "&Nouveau fichier..."
-
-#: spyderlib/plugins/editor.py:582 spyderlib/plugins/workingdirectory.py:81
-#: spyderlib/widgets/explorer.py:611 spyderlib/widgets/explorer.py:618
-msgid "New file"
-msgstr "Nouveau fichier"
-
-#: spyderlib/plugins/editor.py:589
-msgid "&Open..."
-msgstr "&Ouvrir..."
-
-#: spyderlib/plugins/editor.py:590 spyderlib/plugins/editor.py:1615
-#: spyderlib/plugins/workingdirectory.py:68
-msgid "Open file"
-msgstr "Ouvrir un fichier"
-
-#: spyderlib/plugins/editor.py:597
-msgid "&Revert"
-msgstr "&Réinitialiser"
-
-#: spyderlib/plugins/editor.py:598
-msgid "Revert file from disk"
-msgstr "Revenir à la version du fichier enregistrée sur le disque"
-
-#: spyderlib/plugins/editor.py:601
-msgid "&Save"
-msgstr "&Enregistrer"
-
-#: spyderlib/plugins/editor.py:602
-#, fuzzy
-msgid "Save file"
-msgstr "Nouveau fichier"
-
-#: spyderlib/plugins/editor.py:609
-msgid "Sav&e all"
-msgstr "Enregistrer &tout"
-
-#: spyderlib/plugins/editor.py:610
-#, fuzzy
-msgid "Save all files"
-msgstr "Enregistrer tous les fichiers ouverts"
-
-#: spyderlib/plugins/editor.py:617
-msgid "Save &as..."
-msgstr "Enregistrer &sous..."
-
-#: spyderlib/plugins/editor.py:618
-msgid "Save current file as..."
-msgstr "Enregistrer le fichier en cours d'édition sous un autre nom..."
-
-#: spyderlib/plugins/editor.py:620 spyderlib/plugins/editor.py:621
-msgid "Print preview..."
-msgstr "Aperçu avant impression..."
-
-#: spyderlib/plugins/editor.py:622
-msgid "&Print..."
-msgstr "Im&primer..."
-
-#: spyderlib/plugins/editor.py:623
-msgid "Print current file..."
-msgstr "Imprimer le fichier en cours d'édition..."
-
-#: spyderlib/plugins/editor.py:627
-msgid "&Close"
-msgstr "&Fermer"
-
-#: spyderlib/plugins/editor.py:628
-msgid "Close current file"
-msgstr "Fermer le fichier en cours d'édition"
-
-#: spyderlib/plugins/editor.py:632
-msgid "C&lose all"
-msgstr "Fermer t&out"
-
-#: spyderlib/plugins/editor.py:633
-msgid "Close all opened files"
-msgstr "Fermer tous les fichiers ouverts"
-
-#: spyderlib/plugins/editor.py:640
-msgid "Set/Clear breakpoint"
-msgstr "Ajouter/supprimer un point d'arrêt"
-
-#: spyderlib/plugins/editor.py:647
-msgid "Set/Edit conditional breakpoint"
-msgstr "Ajouter/modifier un point d'arrêt conditionnel"
-
-#: spyderlib/plugins/editor.py:655
-msgid "Clear breakpoints in all files"
-msgstr "Supprimer les points d'arrêt dans tous les fichiers"
-
-#: spyderlib/plugins/editor.py:657
-msgid "Breakpoints"
-msgstr "Points d'arrêt"
-
-#: spyderlib/plugins/editor.py:661
-msgid "Debug with winpdb"
-msgstr "Déboguer avec winpdb"
-
-#: spyderlib/plugins/editor.py:668 spyderlib/spyder.py:565
-msgid "&Debug"
-msgstr "&Déboguer"
-
-#: spyderlib/plugins/editor.py:669
-msgid "Debug file"
-msgstr "Déboguer le script"
-
-#: spyderlib/plugins/editor.py:675
-msgid "Step"
-msgstr "Pas"
-
-#: spyderlib/plugins/editor.py:676
-msgid "Run current line"
-msgstr "Exécuter la ligne en cours"
-
-#: spyderlib/plugins/editor.py:683
-msgid "Continue"
-msgstr "Continuer"
-
-#: spyderlib/plugins/editor.py:684
-#, fuzzy
-msgid "Continue execution until next breakpoint"
-msgstr ""
-"Continuer l'exécution jusqu'au\n"
-"prochain point d'arrêt"
-
-#: spyderlib/plugins/editor.py:692
-msgid "Step Into"
-msgstr "Pas vers l'intérieur"
-
-#: spyderlib/plugins/editor.py:693
-#, fuzzy
-msgid "Step into function or method of current line"
-msgstr ""
-"Pas vers l'intérieur d'une fonction, d'une classe\n"
-"ou de la ligne en cours"
-
-#: spyderlib/plugins/editor.py:701
-msgid "Step Return"
-msgstr "Pas vers l'extérieur"
-
-#: spyderlib/plugins/editor.py:702
-#, fuzzy
-msgid "Run until current function or method returns"
-msgstr ""
-"Exécuter jusqu'au retour de la fonction\n"
-"ou de la méthode en cours"
-
-#: spyderlib/plugins/editor.py:710
-msgid "Exit"
-msgstr "Sortir"
-
-#: spyderlib/plugins/editor.py:711
-msgid "Exit Debug"
-msgstr "Quitter le débogage"
-
-#: spyderlib/plugins/editor.py:723
-msgid "Debugging control"
-msgstr "Contrôle du débogage"
-
-#: spyderlib/plugins/editor.py:727 spyderlib/plugins/editor.py:1226
-#: spyderlib/spyder.py:560
-msgid "&Run"
-msgstr "E&xécution"
-
-#: spyderlib/plugins/editor.py:728
-msgid "Run file"
-msgstr "Exécuter le fichier"
-
-#: spyderlib/plugins/editor.py:735
-msgid "&Configure..."
-msgstr "&Configurer..."
-
-#: spyderlib/plugins/editor.py:736
-#: spyderlib/widgets/externalshell/pythonshell.py:292
-msgid "Run settings"
-msgstr "Options d'exécution"
-
-#: spyderlib/plugins/editor.py:745
-msgid "Re-run &last script"
-msgstr "Exécuter de nouveau le &dernier script"
-
-#: spyderlib/plugins/editor.py:746
-msgid "Run again last file"
-msgstr "Exécuter de nouveau le dernier fichier"
-
-#: spyderlib/plugins/editor.py:753
-#: spyderlib/widgets/sourcecode/codeeditor.py:2222
-msgid "Run &selection"
-msgstr "Exécuter la &sélection"
-
-#: spyderlib/plugins/editor.py:755
-msgid "Run selection"
-msgstr "Exécuter la sélection"
-
-#: spyderlib/plugins/editor.py:761
-msgid "Run cell"
-msgstr "Exécuter la cellule"
-
-#: spyderlib/plugins/editor.py:763
-msgid ""
-"Run current cell (Ctrl+Enter)\n"
-"[Use #%% to create cells]"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:768
-msgid "Run cell and advance"
-msgstr "Exécuter la cellule et avancer"
-
-#: spyderlib/plugins/editor.py:771
-#, fuzzy
-msgid "Run current cell and go to the next one (Shift+Enter)"
-msgstr ""
-"Exécuter la cellule en cours d'édition et aller à la suivante\n"
-"(voir la documentation de l'Editeur, pour plus de détails sur les cellules)"
-
-#: spyderlib/plugins/editor.py:777
-msgid "Show todo list"
-msgstr "Afficher la liste des tâches"
-
-#: spyderlib/plugins/editor.py:778
-msgid "Show TODO/FIXME/XXX/HINT/TIP comments list"
-msgstr "Afficher la liste des commentaires du type TODO/FIXME/XXX/HINT/TIP"
-
-#: spyderlib/plugins/editor.py:786
-msgid "Show warning/error list"
-msgstr "Afficher la liste des avertissements/erreurs"
-
-#: spyderlib/plugins/editor.py:787
-msgid "Show code analysis warnings/errors"
-msgstr ""
-"Afficher la liste des avertissements/erreurs provenant de l'analyse de code"
-
-#: spyderlib/plugins/editor.py:794
-msgid "Previous warning/error"
-msgstr "Avertissement suivant"
-
-#: spyderlib/plugins/editor.py:795
-msgid "Go to previous code analysis warning/error"
-msgstr "Afficher le message d'avertissement ou d'erreur suivant"
-
-#: spyderlib/plugins/editor.py:798
-msgid "Next warning/error"
-msgstr "Avertissement précédent"
-
-#: spyderlib/plugins/editor.py:799
-msgid "Go to next code analysis warning/error"
-msgstr "Afficher le message d'avertissement ou d'erreur précédent"
-
-#: spyderlib/plugins/editor.py:803
-msgid "Last edit location"
-msgstr "Dernière position d'édition"
-
-#: spyderlib/plugins/editor.py:804
-msgid "Go to last edit location"
-msgstr "Aller à la dernière position d'édition"
-
-#: spyderlib/plugins/editor.py:811
-msgid "Previous cursor position"
-msgstr "Position suivante du curseur"
-
-#: spyderlib/plugins/editor.py:812
-msgid "Go to previous cursor position"
-msgstr "Aller à la position précédente du curseur"
-
-#: spyderlib/plugins/editor.py:819
-msgid "Next cursor position"
-msgstr "Position suivante du curseur"
-
-#: spyderlib/plugins/editor.py:820
-msgid "Go to next cursor position"
-msgstr "Aller à la position suivante du curseur"
-
-#: spyderlib/plugins/editor.py:828
-#: spyderlib/widgets/sourcecode/codeeditor.py:2216
-msgid "Comment"
-msgstr "Commenter"
-
-#: spyderlib/plugins/editor.py:828
-#: spyderlib/widgets/sourcecode/codeeditor.py:2216
-msgid "Uncomment"
-msgstr "Décommenter"
-
-#: spyderlib/plugins/editor.py:829
-msgid "Comment current line or selection"
-msgstr "Commenter la sélection ou la ligne en cours d'édition"
-
-#: spyderlib/plugins/editor.py:833
-msgid "Add &block comment"
-msgstr "Ajouter un &bloc de commentaires"
-
-#: spyderlib/plugins/editor.py:834
-msgid "Add block comment around current line or selection"
-msgstr ""
-"Ajouter un bloc de commentaires autour de la sélection ou de la ligne en "
-"cours d'édition"
-
-#: spyderlib/plugins/editor.py:840
-msgid "R&emove block comment"
-msgstr "&Supprimer un bloc de commentaires"
-
-#: spyderlib/plugins/editor.py:841
-msgid "Remove comment block around current line or selection"
-msgstr ""
-"Supprimer le bloc de commentaires autour de la ligne en cours d'édition"
-
-#: spyderlib/plugins/editor.py:852
-msgid "Indent"
-msgstr "Indenter"
-
-#: spyderlib/plugins/editor.py:853
-msgid "Indent current line or selection"
-msgstr "Indenter la sélection ou la ligne en cours d'édition"
-
-#: spyderlib/plugins/editor.py:856
-msgid "Unindent"
-msgstr "Désindenter"
-
-#: spyderlib/plugins/editor.py:857
-msgid "Unindent current line or selection"
-msgstr "Désindenter la sélection ou la ligne en cours d'édition"
-
-#: spyderlib/plugins/editor.py:862
-msgid "Carriage return and line feed (Windows)"
-msgstr "Retour chariot et retour à la ligne (Windows)"
-
-#: spyderlib/plugins/editor.py:865
-msgid "Line feed (UNIX)"
-msgstr "Retour à la ligne (UNIX)"
-
-#: spyderlib/plugins/editor.py:868
-msgid "Carriage return (Mac)"
-msgstr "Retour chariot (Mac)"
-
-#: spyderlib/plugins/editor.py:874
-msgid "Convert end-of-line characters"
-msgstr "Convertir les caractères de fin de ligne"
-
-#: spyderlib/plugins/editor.py:878
-msgid "Remove trailing spaces"
-msgstr "Supprimer les espaces en fin de ligne"
-
-#: spyderlib/plugins/editor.py:880
-msgid "Fix indentation"
-msgstr "Corriger l'indentation"
-
-#: spyderlib/plugins/editor.py:881
-msgid "Replace tab characters by space characters"
-msgstr "Remplacer les caractères de tabulation par des espaces"
-
-#: spyderlib/plugins/editor.py:884
-msgid "Go to line..."
-msgstr "Aller à la ligne..."
-
-#: spyderlib/plugins/editor.py:892
-msgid "Set console working directory"
-msgstr "Répertoire de travail de la console"
-
-#: spyderlib/plugins/editor.py:894
-msgid ""
-"Set current console (and file explorer) working directory to current script "
-"directory"
-msgstr ""
-"Choisir le répertoire du script comme répertoire de travail de la console "
-"courante (et de l'explorateur de fichier)"
-
-#: spyderlib/plugins/editor.py:899
-msgid "Maximum number of recent files..."
-msgstr "Nombre maximum de fichiers récents..."
-
-#: spyderlib/plugins/editor.py:902
-msgid "Clear recent files list"
-msgstr "Effacer la liste des fichiers récents"
-
-#: spyderlib/plugins/editor.py:902
-msgid "Clear this list"
-msgstr "Effacer cette liste"
-
-#: spyderlib/plugins/editor.py:904
-msgid "Open &recent"
-msgstr "Fichiers &récents"
-
-#: spyderlib/plugins/editor.py:1214 spyderlib/spyder.py:541
-msgid "File toolbar"
-msgstr "Barre d'outil fichiers"
-
-#: spyderlib/plugins/editor.py:1215 spyderlib/spyder.py:551
-msgid "Search toolbar"
-msgstr "Barre d'outil de recherche"
-
-#: spyderlib/plugins/editor.py:1216 spyderlib/spyder.py:556
-msgid "Source toolbar"
-msgstr "Barre d'outils code source"
-
-#: spyderlib/plugins/editor.py:1217 spyderlib/spyder.py:561
-msgid "Run toolbar"
-msgstr "Barre d'outil exécution"
-
-#: spyderlib/plugins/editor.py:1218 spyderlib/spyder.py:566
-msgid "Debug toolbar"
-msgstr "Barre d'outil de débogage"
-
-#: spyderlib/plugins/editor.py:1219 spyderlib/spyder.py:546
-msgid "Edit toolbar"
-msgstr "Barre d'outil édition"
-
-#: spyderlib/plugins/editor.py:1222 spyderlib/spyder.py:538
-msgid "&File"
-msgstr "&Fichier"
-
-#: spyderlib/plugins/editor.py:1223 spyderlib/spyder.py:545
-msgid "&Edit"
-msgstr "&Édition"
-
-#: spyderlib/plugins/editor.py:1224 spyderlib/spyder.py:550
-msgid "&Search"
-msgstr "&Recherche"
-
-#: spyderlib/plugins/editor.py:1225 spyderlib/spyder.py:555
-msgid "Sour&ce"
-msgstr "Sour&ce"
-
-#: spyderlib/plugins/editor.py:1227 spyderlib/spyder.py:573
-msgid "&Tools"
-msgstr "Ou&tils"
-
-#: spyderlib/plugins/editor.py:1228
-msgid "?"
-msgstr "?"
-
-#: spyderlib/plugins/editor.py:1442
-msgid "Spyder Editor"
-msgstr "Éditeur de Spyder"
-
-#: spyderlib/plugins/editor.py:1443
-msgid "This temporary script file is located here:"
-msgstr "Ce script temporaire est sauvegardé ici :"
-
-#: spyderlib/plugins/editor.py:1504
-msgid "untitled"
-msgstr "sanstitre"
-
-#: spyderlib/plugins/editor.py:1575
-msgid "Maximum number of recent files"
-msgstr "Nombre maximum de fichiers récents"
-
-#: spyderlib/plugins/editor.py:1697
-msgid "Printing..."
-msgstr "Impression en cours..."
-
-#: spyderlib/plugins/explorer.py:47
-msgid "File explorer"
-msgstr "Explorateur de fichiers"
-
-#: spyderlib/plugins/explorer.py:60 spyderlib/plugins/inspector.py:285
-#: spyderlib/plugins/projectexplorer.py:58
-msgid "Set font style"
-msgstr "Changer la police d'écriture"
-
-#: spyderlib/plugins/externalconsole.py:45
-msgid "Interactive data plotting"
-msgstr "Visualisation interactive de données"
-
-#: spyderlib/plugins/externalconsole.py:60
-#: spyderlib/plugins/externalconsole.py:1065
-#: spyderlib/plugins/inspector.py:315 spyderlib/plugins/ipythonconsole.py:444
-#: spyderlib/plugins/ipythonconsole.py:1198
-#: spyderlib/widgets/externalshell/baseshell.py:105
-msgid "Console"
-msgstr "Console"
-
-#: spyderlib/plugins/externalconsole.py:78
-msgid "One tab per script"
-msgstr "Un onglet par script"
-
-#: spyderlib/plugins/externalconsole.py:79
-#: spyderlib/widgets/externalshell/baseshell.py:170
-msgid "Show elapsed time"
-msgstr "Afficher le temps écoulé"
-
-#: spyderlib/plugins/externalconsole.py:80 spyderlib/widgets/explorer.py:955
-msgid "Show icons and text"
-msgstr "Afficher icônes et textes"
-
-#: spyderlib/plugins/externalconsole.py:92
-msgid "Buffer: "
-msgstr "Tampon : "
-
-#: spyderlib/plugins/externalconsole.py:92
-#: spyderlib/plugins/ipythonconsole.py:118
-msgid " lines"
-msgstr " lignes"
-
-#: spyderlib/plugins/externalconsole.py:97
-msgid "Merge process standard output/error channels"
-msgstr "Fusionner les canaux de sortie et d'erreur du processus"
-
-#: spyderlib/plugins/externalconsole.py:99
-msgid ""
-"Merging the output channels of the process means that\n"
-"the standard error won't be written in red anymore,\n"
-"but this has the effect of speeding up display."
-msgstr ""
-"Fusionner les canaux de sortie et d'erreur du processus\n"
-"signifie que les erreurs ne seront plus affichées en rouge,\n"
-"mais cela entraînera également une amélioration des performances\n"
-"d'affichage et une meilleure réactivité de la console."
-
-#: spyderlib/plugins/externalconsole.py:103
-msgid "Colorize standard error channel using ANSI escape codes"
-msgstr "Coloriser le canal d'erreur standard (codes d'échappement ANSI)"
-
-#: spyderlib/plugins/externalconsole.py:105
-msgid ""
-"This method is the only way to have colorized standard\n"
-"error channel when the output channels have been merged."
-msgstr ""
-"Cette méthode est le seul moyen de coloriser le canal\n"
-"d'erreur standard lorsque les canaux de sorties ont été fusionnés."
-
-#: spyderlib/plugins/externalconsole.py:123
-#: spyderlib/plugins/ipythonconsole.py:105
-#: spyderlib/widgets/arrayeditor.py:393
-msgid "Background color"
-msgstr "Couleur de fond"
-
-#: spyderlib/plugins/externalconsole.py:124
-msgid ""
-"This option will be applied the next time a Python console or a terminal is "
-"opened."
-msgstr ""
-"Cette option sera prise en compte lors de la prochaine ouverture de console "
-"(interpréteur Python ou terminal)."
-
-#: spyderlib/plugins/externalconsole.py:127
-msgid "Light background (white color)"
-msgstr "Fond blanc"
-
-#: spyderlib/plugins/externalconsole.py:148
-#: spyderlib/plugins/ipythonconsole.py:90
-msgid ""
-"If this option is enabled, object inspector\n"
-"will automatically show informations on functions\n"
-"entered in console (this is triggered when entering\n"
-"a left parenthesis after a valid function name)"
-msgstr ""
-"Si cette option est activée, l'inspecteur d'objet affichera automatiquement "
-"des informations sur les fonctions saisies dans la console (le mécanisme est "
-"déclenché par la saisie d'une parenthèse gauche après un nom valide de "
-"fonction)"
-
-#: spyderlib/plugins/externalconsole.py:163
-msgid "User Module Deleter (UMD)"
-msgstr "User Module Deleter (UMD)"
-
-#: spyderlib/plugins/externalconsole.py:164
-msgid ""
-"UMD forces Python to reload modules which were imported when executing a \n"
-"script in the external console with the 'runfile' function."
-msgstr ""
-"L'UMD force Python à recharger les modules importés lors de l'exécution "
-"d'un\n"
-"script dans la console interne avec la fonction 'runfile'."
-
-#: spyderlib/plugins/externalconsole.py:167
-msgid "Enable UMD"
-msgstr "Activer l'UMD"
-
-#: spyderlib/plugins/externalconsole.py:168
-msgid ""
-"This option will enable the User Module Deleter (UMD) in Python "
-"interpreters. UMD forces Python to reload deeply modules during import when "
-"running a Python script using the Spyder's builtin function <b>runfile</b>."
-"<br><br><b>1.</b> UMD may require to restart the Python interpreter in which "
-"it will be called (otherwise only newly imported modules will be reloaded "
-"when executing scripts).<br><br><b>2.</b> If errors occur when re-running a "
-"PyQt-based program, please check that the Qt objects are properly destroyed "
-"(e.g. you may have to use the attribute <b>Qt.WA_DeleteOnClose</b> on your "
-"main window, using the <b>setAttribute</b> method)"
-msgstr ""
-"Cette option active le User Module Deleter (UMD) dans les interpréteurs "
-"Python. L'UMD force Python à recharger complètement les modules lors de leur "
-"importation, dans le cadre de l'exécution d'un script Python avec la "
-"fonction Spyder <b>runfile</b>.<br><br><b>1.</b> UMD peut nécessiter le "
-"redémarrage de l'interpréteur Python dans lequel il va être utilisé (dans le "
-"cas contraire, seuls les modules importés après activation de l'UMD seront "
-"rechargés complètement lors de l'exécution de scripts).<br><br><b>2.</b> Si "
-"des erreurs survenaient lors de la réexécution de programmes utilisant PyQt, "
-"veuillez vérifier que les objets Qt sont correctement détruits à la sortie "
-"du programme (par exemple, il sera probablement nécessaire d'utiliser "
-"l'attribut <b>Qt.WA_DeleteOnClose</b> sur votre objet fenêtre principale "
-"grâce à la méthode <b>setAttribute</b>)"
-
-#: spyderlib/plugins/externalconsole.py:184
-msgid "Show reloaded modules list"
-msgstr "Afficher les modules rechargés"
-
-#: spyderlib/plugins/externalconsole.py:185
-msgid ""
-"Please note that these changes will be applied only to new Python "
-"interpreters"
-msgstr ""
-"Veuillez noter que ces changements ne seront pris en compte que par les "
-"nouveaux interpréteurs Python"
-
-#: spyderlib/plugins/externalconsole.py:189
-msgid "Set UMD excluded (not reloaded) modules"
-msgstr "Modifier la liste des modules non rechargés par l'UMD"
-
-#: spyderlib/plugins/externalconsole.py:201
-msgid "Python executable"
-msgstr "Exécutable Python"
-
-#: spyderlib/plugins/externalconsole.py:203
-msgid ""
-"Select the Python interpreter executable binary in which Spyder will run "
-"scripts:"
-msgstr "Sélectionner l'interpréteur Python utilisé pour exécuter des scripts:"
-
-#: spyderlib/plugins/externalconsole.py:206
-msgid "Default (i.e. the same as Spyder's)"
-msgstr ""
-"Par défaut (interpréteur identique à celui dans lequel Spyder est exécuté)"
-
-#: spyderlib/plugins/externalconsole.py:210
-msgid "Use the following Python interpreter:"
-msgstr "Utiliser l'interpréteur Python suivant :"
-
-#: spyderlib/plugins/externalconsole.py:214
-msgid "Executables"
-msgstr "Exécutables"
-
-#: spyderlib/plugins/externalconsole.py:234
-#: spyderlib/plugins/ipythonconsole.py:373
-#: spyderlib/plugins/workingdirectory.py:41
-msgid "Startup"
-msgstr "Démarrage"
-
-#: spyderlib/plugins/externalconsole.py:235
-msgid "Open a Python interpreter at startup"
-msgstr "Ouvrir un interpréteur Python au démarrage"
-
-#: spyderlib/plugins/externalconsole.py:243
-msgid "PYTHONSTARTUP replacement"
-msgstr "Substitution de PYTHONSTARTUP"
-
-#: spyderlib/plugins/externalconsole.py:245
-msgid ""
-"This option will override the PYTHONSTARTUP environment variable which\n"
-"defines the script to be executed during the Python interpreter startup."
-msgstr ""
-"Cette option permet de remplacer le script de démarrage défini par la\n"
-"variable d'environnement PYTHONSTARTUP."
-
-#: spyderlib/plugins/externalconsole.py:250
-msgid "Default PYTHONSTARTUP script"
-msgstr "Script PYTHONSTARTUP par défaut"
-
-#: spyderlib/plugins/externalconsole.py:254
-msgid "Use the following startup script:"
-msgstr "Utiliser le script de démarrage suivant :"
-
-#: spyderlib/plugins/externalconsole.py:273
-msgid "Monitor"
-msgstr "Moniteur"
-
-#: spyderlib/plugins/externalconsole.py:274
-msgid ""
-"The monitor provides introspection features to console: code completion, "
-"calltips and variable explorer. Because it relies on several modules, "
-"disabling the monitor may be useful to accelerate console startup."
-msgstr ""
-"Le moniteur fournit à la console des fonctionnalités d'introspection telles "
-"que la complétion de code, les info-bulles et l'explorateur de variables. "
-"Parce qu'il nécessite l'import de nombreux modules, désactiver le moniteur "
-"permet d'accélérer le démarrage de la console."
-
-#: spyderlib/plugins/externalconsole.py:281
-msgid "Enable monitor"
-msgstr "Activer le moniteur"
-
-#: spyderlib/plugins/externalconsole.py:293
-msgid "Default library"
-msgstr "Bibliothèque par défaut"
-
-#: spyderlib/plugins/externalconsole.py:295
-msgid "Qt (PyQt/PySide)"
-msgstr "Qt (PyQt/PySide)"
-
-#: spyderlib/plugins/externalconsole.py:297
-msgid "Qt-Python bindings library selection:"
-msgstr "Sélection de la bibliothèque d'interfaçage Qt :"
-
-#: spyderlib/plugins/externalconsole.py:299
-msgid ""
-"This option will act on<br> libraries such as Matplotlib, guidata or ETS"
-msgstr ""
-"Cette option est prise en charge par les bibliothèques telles que "
-"Matplotlib, guidata ou ETS"
-
-#: spyderlib/plugins/externalconsole.py:313
-msgid "Install Spyder's input hook for Qt"
-msgstr "Installer le \"input hook\" de Spyder pour Qt"
-
-#: spyderlib/plugins/externalconsole.py:315
-msgid ""
-"PyQt installs an input hook that allows<br> creating and interacting with Qt "
-"widgets in an interactive interpreter without blocking it. On Windows "
-"platforms, it is strongly recommended to replace it by Spyder's. Regarding "
-"PySide, note that it does not install an input hook, so it is required to "
-"enable this feature in order to be able to manipulate PySide/Qtobjects "
-"interactively."
-msgstr ""
-"PyQt installe un \"input hook\", mécanisme permettant d'interagir\n"
-"avec des widgets Qt dans un interpréteur Python sans bloquer ce dernier. \n"
-"Sous Windows, il est fortement conseillé de le remplacer par celui de "
-"Spyder. \n"
-"Concernant PySide, aucun \"input hook\" n'étant implémenté dans la version "
-"1.0, \n"
-"il est également recommandé d'activer cette option \n"
-"(cette fonctionnalité n'a aucun effet si le moniteur est désactivé)."
-
-#: spyderlib/plugins/externalconsole.py:334
-msgid "PyQt"
-msgstr "PyQt"
-
-#: spyderlib/plugins/externalconsole.py:336
-msgid "API selection for QString and QVariant objects:"
-msgstr "Sélection de l'API des objets QString et QVariant :"
-
-#: spyderlib/plugins/externalconsole.py:337
-msgid "API #1"
-msgstr "API n°1"
-
-#: spyderlib/plugins/externalconsole.py:337
-msgid "API #2"
-msgstr "API n°2"
-
-#: spyderlib/plugins/externalconsole.py:337
-msgid "Default API"
-msgstr "API par défaut"
-
-#: spyderlib/plugins/externalconsole.py:339
-msgid ""
-"PyQt API #1 is the default API for<br>Python 2. PyQt API #2 is the default "
-"API for Python 3 and is compatible with PySide. Note that switching to API "
-"#2 may require to enable the Matplotlib patch."
-msgstr ""
-"L'API n°1 de PyQt est l'API par défaut pour Python 2. L'API n°2 est l'API \n"
-"par défaut pour Python 3 : c'est l'API qui est compatible avec PySide.\n"
-"La sélection de l'API n°2 peut nécessiter l'activation du patch de "
-"Matplotlib."
-
-#: spyderlib/plugins/externalconsole.py:345
-msgid "Ignore API change errors (sip.setapi)"
-msgstr "Ignorer les erreurs de changement d'API (sip.setapi)"
-
-#: spyderlib/plugins/externalconsole.py:347
-msgid ""
-"Enabling this option will ignore <br>errors when changing PyQt API. As PyQt "
-"does not support dynamic API changes, it is strongly recommended to use this "
-"feature wisely, e.g. for debugging purpose."
-msgstr ""
-"L'activation de cette option permet d'ignorer les erreurs liées aux "
-"changements\n"
-"d'API de PyQt. Vu que PyQt ne prend pas en charge le changement dynamique\n"
-" d'API, il est fortement recommandé d'utiliser cette fonctionnalité "
-"exceptionnellement,\n"
-"par exemple pour du débogage."
-
-#: spyderlib/plugins/externalconsole.py:366
-msgid "Matplotlib"
-msgstr "Matplotlib"
-
-#: spyderlib/plugins/externalconsole.py:368
-msgid "GUI backend:"
-msgstr "Backend graphique :"
-
-#: spyderlib/plugins/externalconsole.py:370
-msgid ""
-"Set the GUI toolkit used by <br>Matplotlib to show figures (default: Qt4Agg)"
-msgstr ""
-"Spécifie la bibliothèque d'interfaces graphiques à utiliser pour l'affichage "
-"des figures Matplotlib (par défaut : Qt4Agg)"
-
-#: spyderlib/plugins/externalconsole.py:381
-msgid "Patch Matplotlib figures"
-msgstr "Patcher les figures Matplotlib"
-
-#: spyderlib/plugins/externalconsole.py:383
-msgid ""
-"Patching Matplotlib library will add a button to customize figure options "
-"(Qt4Agg only) and fix some issues."
-msgstr ""
-"Appliquer un patch à la bibliothèque Matplotlib permet d'ajouter un bouton "
-"(au backend Qt4Agg) pour modifier les options des courbes et images "
-"affichées et de corriger quelques bogues."
-
-#: spyderlib/plugins/externalconsole.py:403
-msgid "Enthought Tool Suite"
-msgstr "Enthought Tool Suite"
-
-#: spyderlib/plugins/externalconsole.py:404
-msgid ""
-"Enthought Tool Suite (ETS) supports PyQt4 (qt4) and wxPython (wx) graphical "
-"user interfaces."
-msgstr ""
-"Le logiciel Enthought Tool Suite (ETS) prend en charge les interfaces "
-"graphiques PyQt4 (qt4) et wxPython (wx)."
-
-#: spyderlib/plugins/externalconsole.py:408
-msgid "ETS_TOOLKIT:"
-msgstr "ETS_TOOLKIT:"
-
-#: spyderlib/plugins/externalconsole.py:429
-msgid "External modules"
-msgstr "Modules externes"
-
-#: spyderlib/plugins/externalconsole.py:617
-msgid "Trying to kill a kernel?"
-msgstr "Tentative d'arrêt d'un noyau"
-
-#: spyderlib/plugins/externalconsole.py:618
-msgid ""
-"You can't close this kernel because it has one or more consoles connected to "
-"it.<br><br>You need to close them instead or you can kill the kernel using "
-"the button far to the right."
-msgstr ""
-"Le noyau ne peut pas être fermé car au moins une console frontale y est "
-"connectée.\n"
-"\n"
-"Veuillez soit fermer au préalable toutes les consoles connectées ou appuyer "
-"sur le bouton à l'extrême droite pour tuer le processus du noyau."
-
-#: spyderlib/plugins/externalconsole.py:693
-#: spyderlib/plugins/ipythonconsole.py:741 spyderlib/spyder.py:1249
-#: spyderlib/spyder.py:1267 spyderlib/utils/environ.py:95
-#: spyderlib/utils/environ.py:108
-msgid "Warning"
-msgstr "Attention"
-
-#: spyderlib/plugins/externalconsole.py:694
-msgid ""
-"No Python shell is currently selected to run <b>%s</b>.<br><br>Please select "
-"or open a new Python interpreter and try again."
-msgstr ""
-"Aucune console Python n'est actuellement sélectionnée pour exécuter <b>%s</"
-"b>.<br><br>Merci de sélectionner ou d'ouvrir un interpréteur Python et de "
-"réessayer."
-
-#: spyderlib/plugins/externalconsole.py:771
-msgid ""
-"%s is already running in a separate process.\n"
-"Do you want to kill the process before starting a new one?"
-msgstr ""
-"%s est déjà en cours d'exécution dans un processus séparé.\n"
-"Souhaitez-vous tuer ce processus avant d'en démarrer un autre ?"
-
-#: spyderlib/plugins/externalconsole.py:934
-msgid "Kernel"
-msgstr "Noyau"
-
-#: spyderlib/plugins/externalconsole.py:944
-#: spyderlib/plugins/ipythonconsole.py:1015
-msgid "Mismatch between kernel and frontend"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:945
-#: spyderlib/plugins/ipythonconsole.py:1016
-msgid ""
-"Your IPython frontend and kernel versions are <b>incompatible!!</"
-"b><br><br>We're sorry but we can't create an IPython console for you."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:966
-msgid "Command Window"
-msgstr "Invite de commandes"
-
-#: spyderlib/plugins/externalconsole.py:968
-msgid "Terminal"
-msgstr "Terminal"
-
-#: spyderlib/plugins/externalconsole.py:1087
-msgid "Open a Python &interpreter"
-msgstr "Ouvrir un &interpréteur Python"
-
-#: spyderlib/plugins/externalconsole.py:1090
-msgid "Open &command prompt"
-msgstr "Ouvrir un invite de &commandes"
-
-#: spyderlib/plugins/externalconsole.py:1091
-msgid "Open a Windows command prompt"
-msgstr "Ouvrir un invite de commandes Windows"
-
-#: spyderlib/plugins/externalconsole.py:1093
-msgid "Open &terminal"
-msgstr "Ouvrir un &terminal"
-
-#: spyderlib/plugins/externalconsole.py:1094
-msgid "Open a terminal window inside Spyder"
-msgstr "Ouvrir un terminal de commandes dans Spyder"
-
-#: spyderlib/plugins/externalconsole.py:1215
-#: spyderlib/widgets/projectexplorer.py:334
-msgid " and "
-msgstr " et "
-
-#: spyderlib/plugins/externalconsole.py:1220
-msgid "<br><u>Installed version</u>: %s"
-msgstr "<br><u>Version installée</u>: %s"
-
-#: spyderlib/plugins/externalconsole.py:1222
-#: spyderlib/plugins/ipythonconsole.py:59
-#: spyderlib/plugins/ipythonconsole.py:692
-msgid "IPython console"
-msgstr "Console IPython"
-
-#: spyderlib/plugins/externalconsole.py:1223
-msgid ""
-"Unable to open IPython console because no supported IPython version was "
-"found.<br><br><u>Supported IPython versions</u>: %s"
-msgstr ""
-"Impossible d'ouvrir une console IPython car aucune version prise en charge "
-"n'est installée.<br><br><u>Versions IPython prises en charge</u>: %s"
-
-#: spyderlib/plugins/externalconsole.py:1244
-#: spyderlib/plugins/ipythonconsole.py:761
-msgid "Open an IPython console"
-msgstr "Ouvrir une console IPython"
-
-#: spyderlib/plugins/externalconsole.py:1245
-msgid ""
-"The console monitor was disabled: the IPython kernel will be started as "
-"expected, but an IPython console will have to be connected manually to the "
-"kernel."
-msgstr ""
-"Le moniteur (console) a été désactivé. Par conséquent, le noyau IPython sera "
-"démarré mais la console IPython devra y être connectée manuellement."
-
-#: spyderlib/plugins/externalconsole.py:1281
-#: spyderlib/plugins/externalconsole.py:1294
-#: spyderlib/plugins/externalconsole.py:1298
-msgid "UMD"
-msgstr "UMD"
-
-#: spyderlib/plugins/externalconsole.py:1282
-msgid ""
-"UMD excluded modules:\n"
-"(example: guidata, guiqwt)"
-msgstr ""
-"Modules non rechargés par l'UMD :\n"
-"(exemple: guidata, guiqwt)"
-
-#: spyderlib/plugins/externalconsole.py:1295
-msgid ""
-"The following modules are not installed on your machine:\n"
-"%s"
-msgstr ""
-"Les modules suivants ne sont pas installés sur votre ordinateur :\n"
-"%s"
-
-#: spyderlib/plugins/externalconsole.py:1299
-msgid ""
-"Please note that these changes will be applied only to new Python/IPython "
-"interpreters"
-msgstr ""
-"Veuillez noter que ces changements ne seront pris en compte que par les "
-"nouveaux interpréteurs Python/IPython"
-
-#: spyderlib/plugins/findinfiles.py:91 spyderlib/widgets/findinfiles.py:689
-msgid "Find in files"
-msgstr "Recherche dans des fichiers"
-
-#: spyderlib/plugins/findinfiles.py:115
-msgid "&Find in files"
-msgstr "Rechercher dans des &fichiers"
-
-#: spyderlib/plugins/findinfiles.py:118
-msgid "Search text in multiple files"
-msgstr "Rechercher une chaîne de caractères dans plusieurs fichiers à la fois"
-
-#: spyderlib/plugins/history.py:30
-msgid "Settings"
-msgstr "Options"
-
-#: spyderlib/plugins/history.py:32
-msgid " entries"
-msgstr " lignes"
-
-#: spyderlib/plugins/history.py:32
-msgid "History depth: "
-msgstr "Taille de l'historique : "
-
-#: spyderlib/plugins/history.py:39
-msgid "Scroll automatically to last entry"
-msgstr "Défiler automatiquement jusqu'à la dernière ligne"
-
-#: spyderlib/plugins/history.py:98 spyderlib/plugins/inspector.py:368
-#: spyderlib/plugins/ipythonconsole.py:497 spyderlib/widgets/editor.py:653
-#: spyderlib/widgets/explorer.py:985
-#: spyderlib/widgets/externalshell/baseshell.py:150
-#: spyderlib/widgets/externalshell/namespacebrowser.py:228
-msgid "Options"
-msgstr "Options"
-
-#: spyderlib/plugins/history.py:118
-msgid "History log"
-msgstr "Historique"
-
-#: spyderlib/plugins/history.py:145
-msgid "History..."
-msgstr "Historique..."
-
-#: spyderlib/plugins/history.py:147
-msgid "Set history maximum entries"
-msgstr "Modifier le nombre d'entrées maximum de l'historique"
-
-#: spyderlib/plugins/history.py:257
-msgid "History"
-msgstr "Historique"
-
-#: spyderlib/plugins/history.py:258
-msgid "Maximum entries"
-msgstr "Nombre maximum d'entrées"
-
-#: spyderlib/plugins/inspector.py:53
-msgid "Rich text help on the Object Inspector"
-msgstr "Texte enrichi dans l'inspecteur d'objets"
-
-#: spyderlib/plugins/inspector.py:108
-msgid "Plain text font style"
-msgstr "Police d'écriture du texte brut"
-
-#: spyderlib/plugins/inspector.py:111
-msgid "Rich text font style"
-msgstr "Police d'écriture du texte enrichi"
-
-#: spyderlib/plugins/inspector.py:113
-msgid "Additional features"
-msgstr "Options supplémentaires"
-
-#: spyderlib/plugins/inspector.py:114
-msgid "Render mathematical equations"
-msgstr "Styliser les équations mathématiques"
-
-#: spyderlib/plugins/inspector.py:120
-msgid "This feature requires Sphinx 1.1 or superior."
-msgstr "Cette fonctionnalité nécessite l'installation de Sphinx 1.1+."
-
-#: spyderlib/plugins/inspector.py:122
-msgid "Sphinx %s is currently installed."
-msgstr "Sphinx %s n'est pas installé."
-
-#: spyderlib/plugins/inspector.py:269
-msgid "No documentation available"
-msgstr "Aucune documentation disponible"
-
-#: spyderlib/plugins/inspector.py:308
-msgid "Source"
-msgstr "Source"
-
-#: spyderlib/plugins/inspector.py:323 spyderlib/widgets/dicteditor.py:161
-msgid "Object"
-msgstr "Objet"
-
-#: spyderlib/plugins/inspector.py:338
-msgid "Plain Text"
-msgstr "Texte brut"
-
-#: spyderlib/plugins/inspector.py:342
-msgid "Show Source"
-msgstr "Afficher les sources"
-
-#: spyderlib/plugins/inspector.py:346
-msgid "Rich Text"
-msgstr "Texte enrichi"
-
-#: spyderlib/plugins/inspector.py:356
-msgid "Automatic import"
-msgstr "Import automatique"
-
-#: spyderlib/plugins/inspector.py:412 spyderlib/plugins/inspector.py:799
-msgid "Object inspector"
-msgstr "Inspecteur d'objets"
-
-#: spyderlib/plugins/inspector.py:755
-msgid "Lock"
-msgstr "Verrouiller"
-
-#: spyderlib/plugins/inspector.py:755
-msgid "Unlock"
-msgstr "Déverrouiller"
-
-#: spyderlib/plugins/inspector.py:800
-msgid ""
-"The following error occured when calling <b>Sphinx %s</b>. <br>Incompatible "
-"Sphinx version or doc string decoding failed.<br><br>Error message:<br>%s"
-msgstr ""
-"L'erreur suivante s'est produite lors de l'exécution de <b>Sphinx %s</b>. "
-"<br>Veuillez vérifier si cette version de Sphinx est bien prise en charge "
-"par Spyder. <br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/plugins/inspector.py:850
-msgid "No source code available."
-msgstr "Aucun code source disponible."
-
-#: spyderlib/plugins/ipythonconsole.py:52
-msgid "Symbolic mathematics for the IPython Console"
-msgstr "Mathématiques symboliques pour la console IPython"
-
-#: spyderlib/plugins/ipythonconsole.py:71
-msgid "Display initial banner"
-msgstr "Afficher le message d'accueil"
-
-#: spyderlib/plugins/ipythonconsole.py:72
-msgid ""
-"This option lets you hide the message shown at\n"
-"the top of the console when it's opened."
-msgstr ""
-"Cette option permet de masquer la message d'accueil\n"
-"qui s'affiche à l'ouverture de la console."
-
-#: spyderlib/plugins/ipythonconsole.py:74
-msgid "Use a completion widget"
-msgstr "Utiliser un widget de complétion de code"
-
-#: spyderlib/plugins/ipythonconsole.py:76
-msgid "Use a widget instead of plain text output for tab completion"
-msgstr "Utiliser un widget de complétion au lieu d'une liste en texte brut"
-
-#: spyderlib/plugins/ipythonconsole.py:78
-msgid "Use a pager to display additional text inside the console"
-msgstr "Utiliser un pager pour afficher l'aide"
-
-#: spyderlib/plugins/ipythonconsole.py:80
-msgid ""
-"Useful if you don't want to fill the console with long help or completion "
-"texts.\n"
-"Note: Use the Q key to get out of the pager."
-msgstr ""
-"Le pager permet d'éviter de remplir la console de texte d'aide.\n"
-"Note : utiliser la touche Q pour quitter le pager."
-
-#: spyderlib/plugins/ipythonconsole.py:84
-msgid "Display balloon tips"
-msgstr "Afficher des info-bulles"
-
-#: spyderlib/plugins/ipythonconsole.py:85
-msgid "Ask for confirmation before closing"
-msgstr "Demander confirmation avant de fermer une console"
-
-#: spyderlib/plugins/ipythonconsole.py:106
-msgid "Light background"
-msgstr "Fond blanc"
-
-#: spyderlib/plugins/ipythonconsole.py:108
-msgid "Dark background"
-msgstr "Fond noir"
-
-#: spyderlib/plugins/ipythonconsole.py:118
-msgid "Buffer:  "
-msgstr "Tampon :  "
-
-#: spyderlib/plugins/ipythonconsole.py:120
-msgid ""
-"Set the maximum number of lines of text shown in the\n"
-"console before truncation. Specifying -1 disables it\n"
-"(not recommended!)"
-msgstr ""
-"Nombre maximum de lignes de texte affichées dans la console avant troncature "
-"(saisir -1 désactive cette dernière, ce qui est fortement déconseillé)."
-
-#: spyderlib/plugins/ipythonconsole.py:129
-#, fuzzy
-msgid "Support for graphics (Matplotlib)"
-msgstr "Prise en charge des graphes (Pylab)"
-
-#: spyderlib/plugins/ipythonconsole.py:130
-msgid "Activate support"
-msgstr "Activer"
-
-#: spyderlib/plugins/ipythonconsole.py:131
-#, fuzzy
-msgid "Automatically load Pylab and NumPy modules"
-msgstr "Importer automatiquement Pylab et NumPy"
-
-#: spyderlib/plugins/ipythonconsole.py:134
-msgid ""
-"This lets you load graphics support without importing \n"
-"the commands to do plots. Useful to work with other\n"
-"plotting libraries different to Matplotlib or to develop \n"
-"GUIs with Spyder."
-msgstr ""
-"Import automatique de toutes les fonctions de représentation graphique et de "
-"calcul numérique"
-
-#: spyderlib/plugins/ipythonconsole.py:153
-msgid ""
-"This feature requires the Matplotlib library.\n"
-"It seems you don't have it installed."
-msgstr ""
-"Cette fonctionnalité nécessite l'installation du module Matplotlib.\n"
-"Ce dernier n'est apparemment pas installé."
-
-#: spyderlib/plugins/ipythonconsole.py:158
-msgid "Inline"
-msgstr "En ligne"
-
-#: spyderlib/plugins/ipythonconsole.py:159
-msgid "Automatic"
-msgstr "Automatique"
-
-#: spyderlib/plugins/ipythonconsole.py:160
-msgid "Graphics backend"
-msgstr "Sortie graphique"
-
-#: spyderlib/plugins/ipythonconsole.py:161
-msgid ""
-"Decide how graphics are going to be displayed in the console. If unsure, "
-"please select <b>%s</b> to put graphics inside the console or <b>%s</b> to "
-"interact with them (through zooming and panning) in a separate window."
-msgstr ""
-"Cette option permet de régler la manière dont les graphes seront affichés "
-"dans la console. Par exemple, le mode <b>%s</b> permet l'affichage en ligne "
-"des graphes tandis que le mode <b>%s</b> permet d'interagir avec (zoom/pan) "
-"dans une fenêtre séparée."
-
-#: spyderlib/plugins/ipythonconsole.py:181
-msgid "Backend:"
-msgstr "Sortie :"
-
-#: spyderlib/plugins/ipythonconsole.py:183
-msgid "This option will be applied the next time a console is opened."
-msgstr ""
-"Cette option sera prise en compte lors de la prochaine ouverture de console."
-
-#: spyderlib/plugins/ipythonconsole.py:195
-msgid "Inline backend"
-msgstr "Backend intégré"
-
-#: spyderlib/plugins/ipythonconsole.py:196
-msgid "Decide how to render the figures created by this backend"
-msgstr "Option relative au rendu des figures dans ce backend"
-
-#: spyderlib/plugins/ipythonconsole.py:200
-msgid "Format:"
-msgstr "Format :"
-
-#: spyderlib/plugins/ipythonconsole.py:203
-msgid "Resolution:"
-msgstr "Résolution :"
-
-#: spyderlib/plugins/ipythonconsole.py:203
-msgid "dpi"
-msgstr "ppp"
-
-#: spyderlib/plugins/ipythonconsole.py:205
-msgid "Only used when the format is PNG. Default is 72"
-msgstr "Utilisé uniquement dans le cas du format PNG. Par défaut: 72"
-
-#: spyderlib/plugins/ipythonconsole.py:208
-msgid "Width:"
-msgstr "Largeur :"
-
-#: spyderlib/plugins/ipythonconsole.py:208
-#: spyderlib/plugins/ipythonconsole.py:212
-msgid "inches"
-msgstr "pouces"
-
-#: spyderlib/plugins/ipythonconsole.py:210
-msgid "Default is 6"
-msgstr "Par défaut : 6"
-
-#: spyderlib/plugins/ipythonconsole.py:212
-msgid "Height:"
-msgstr "Hauteur :"
-
-#: spyderlib/plugins/ipythonconsole.py:214
-msgid "Default is 4"
-msgstr "Par défaut : 4"
-
-#: spyderlib/plugins/ipythonconsole.py:229
-msgid "Run code"
-msgstr "Exécuter du code"
-
-#: spyderlib/plugins/ipythonconsole.py:230
-msgid ""
-"You can run several lines of code when a console is started. Please "
-"introduce each one separated by commas, for example:<br><i>import os, import "
-"sys</i>"
-msgstr ""
-"Plusieurs lignes de code peuvent être exécutées lors du démarrage de la "
-"console. Veuillez séparer deux lignes consécutives par une virgule - par "
-"exemple :<br><i>import os, import sys</i>"
-
-#: spyderlib/plugins/ipythonconsole.py:236
-msgid "Lines:"
-msgstr "Lignes :"
-
-#: spyderlib/plugins/ipythonconsole.py:245
-msgid "Run a file"
-msgstr "Exécuter un fichier"
-
-#: spyderlib/plugins/ipythonconsole.py:246
-msgid ""
-"You can also run a whole file at startup instead of just some lines (This is "
-"similar to have a PYTHONSTARTUP file)."
-msgstr "Option similaire à PYTHONSTARTUP pour un interpréteur standard"
-
-#: spyderlib/plugins/ipythonconsole.py:250
-msgid "Use the following file:"
-msgstr "Utiliser le fichier suivant :"
-
-#: spyderlib/plugins/ipythonconsole.py:264
-msgid "Spyder startup"
-msgstr "Démarrage de Spyder"
-
-#: spyderlib/plugins/ipythonconsole.py:265
-msgid "Open an IPython console at startup"
-msgstr "Ouvrir une console IPython au démarrage"
-
-#: spyderlib/plugins/ipythonconsole.py:273
-#, fuzzy
-msgid "Greedy completion"
-msgstr "Entrée valide la complétion de code"
-
-#: spyderlib/plugins/ipythonconsole.py:274
-msgid ""
-"Enable <tt>Tab</tt> completion on elements of lists, results of function "
-"calls, etc, <i>without</i> assigning them to a variable.<br>For example, you "
-"can get completions on things like <tt>li[0].<Tab></tt> or <tt>ins.meth"
-"().<Tab></tt>"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:282
-msgid "Use the greedy completer"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:293
-msgid "Autocall"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:294
-msgid ""
-"Autocall makes IPython automatically call any callable object even if you "
-"didn't type explicit parentheses.<br>For example, if you type <i>str 43</i> "
-"it becomes <i>str(43)</i> automatically."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:301
-#, fuzzy
-msgid "Smart"
-msgstr "Démarrage"
-
-#: spyderlib/plugins/ipythonconsole.py:302
-msgid "Full"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:303
-msgid "Off"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:305
-msgid "Autocall:  "
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:306
-msgid ""
-"On <b>%s</b> mode, Autocall is not applied if there are no arguments after "
-"the callable. On <b>%s</b> mode, all callable objects are automatically "
-"called (even if no arguments are present)."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:318
-msgid "Symbolic Mathematics"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:319
-msgid ""
-"Perfom symbolic operations in the console (e.g. integrals, derivatives, "
-"vector calculus, etc) and get the outputs in a beautifully printed style."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:324
-msgid "Use symbolic math"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:325
-msgid ""
-"This option loads the Sympy library to work with.<br>Please refer to its "
-"documentation to learn how to use it."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:338
-msgid ""
-"This feature requires the Sympy library.\n"
-"It seems you don't have it installed."
-msgstr ""
-"Cette fonctionnalité nécessite l'installation du module Sympy.\n"
-"Ce dernier n'est apparemment pas installé."
-
-#: spyderlib/plugins/ipythonconsole.py:343
-#, fuzzy
-msgid "Prompts"
-msgstr "Propriétés"
-
-#: spyderlib/plugins/ipythonconsole.py:344
-msgid "Modify how Input and Output prompts are shown in the console."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:347
-#, fuzzy
-msgid "Input prompt:"
-msgstr "Copier sans les préfixes"
-
-#: spyderlib/plugins/ipythonconsole.py:349
-msgid ""
-"Default is<br>In [<span class=\"in-prompt-number\">%i</span>]:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:353
-msgid "Output prompt:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:355
-msgid ""
-"Default is<br>Out[<span class=\"out-prompt-number\">%i</span>]:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:371
-msgid "Graphics"
-msgstr "Graphiques"
-
-#: spyderlib/plugins/ipythonconsole.py:375
-msgid "Advanced Settings"
-msgstr "Options avancées"
-
-#: spyderlib/plugins/ipythonconsole.py:458
-msgid "Interrupt kernel"
-msgstr "Interrompre le noyau"
-
-#: spyderlib/plugins/ipythonconsole.py:461
-msgid "Restart kernel"
-msgstr "Redémarrer le noyau"
-
-#: spyderlib/plugins/ipythonconsole.py:466
-msgid "Intro to IPython"
-msgstr "Introduction à IPython"
-
-#: spyderlib/plugins/ipythonconsole.py:468
-msgid "Quick Reference"
-msgstr "Documentation de IPython"
-
-#: spyderlib/plugins/ipythonconsole.py:470
-msgid "Console help"
-msgstr "Aide sur la console"
-
-#: spyderlib/plugins/ipythonconsole.py:472
-#: spyderlib/widgets/internalshell.py:253
-msgid "Help"
-msgstr "Aide"
-
-#: spyderlib/plugins/ipythonconsole.py:473
-msgid "IPython Help"
-msgstr "Aide IPython"
-
-#: spyderlib/plugins/ipythonconsole.py:509
-msgid "Inspect current object"
-msgstr "Inspecter l'onglet courant"
-
-#: spyderlib/plugins/ipythonconsole.py:513
-msgid "Clear line or block"
-msgstr "Effacer la ligne ou le bloc"
-
-#: spyderlib/plugins/ipythonconsole.py:517
-msgid "Clear console"
-msgstr "Effacer la console"
-
-#: spyderlib/plugins/ipythonconsole.py:556
-msgid ""
-"It seems the kernel died unexpectedly. Use 'Restart kernel' to continue "
-"using this console."
-msgstr ""
-"Le noyau a été arrêté de façon inattendue. Redémarrez le noyau pour "
-"continuer d'utiliser cette console."
-
-#: spyderlib/plugins/ipythonconsole.py:568
-msgid "Kernel process is either remote or unspecified. Cannot interrupt"
-msgstr ""
-"Le processus du noyau est soit distant, soit non spécifié : impossible "
-"d'arrêter le noyau."
-
-#: spyderlib/plugins/ipythonconsole.py:577
-msgid "Kernel process is either remote or unspecified. Cannot restart."
-msgstr ""
-"Le processus du noyau est soit distant, soit non spécifié : impossible de "
-"redémarrer le noyau."
-
-#: spyderlib/plugins/ipythonconsole.py:742
-msgid ""
-"No IPython console is currently available to run <b>%s</b>.<br><br>Please "
-"open a new one and try again."
-msgstr ""
-"Aucun client IPython n'est actuellement sélectionné pour exécuter <b>%s</b>."
-"<br><br>Merci d'ouvrir un nouveau client IPython et de réessayer."
-
-#: spyderlib/plugins/ipythonconsole.py:766
-msgid "Connect to an existing kernel"
-msgstr "Connecter à un noyau existant"
-
-#: spyderlib/plugins/ipythonconsole.py:768
-msgid "Open a new IPython client connected to an external kernel"
-msgstr "Ouvrir un nouveau client IPython connecté à un noyau externe"
-
-#: spyderlib/plugins/ipythonconsole.py:903
-msgid "(for example: `kernel-3764.json`, or simply `3764`)"
-msgstr "(exemple: `kernel-3764.json`, ou simplement `3764`)"
-
-#: spyderlib/plugins/ipythonconsole.py:905
-#: spyderlib/plugins/ipythonconsole.py:945
-msgid "IPython"
-msgstr "IPython"
-
-#: spyderlib/plugins/ipythonconsole.py:906
-msgid "Provide an IPython kernel connection file:"
-msgstr "Fichier de connexion du noyau IPython :"
-
-#: spyderlib/plugins/ipythonconsole.py:946
-msgid "Unable to connect to IPython kernel <b>`%s`"
-msgstr "Impossible de se connecter au noyau IPython <b>`%s`"
-
-#: spyderlib/plugins/ipythonconsole.py:1160
-msgid ""
-"%s will be closed.\n"
-"Do you want to kill the associated kernel and all of its clients?"
-msgstr ""
-"%s va être fermé.\n"
-"Souhaitez-vous fermer également le noyau associé et tous ses autres clients ?"
-
-#: spyderlib/plugins/ipythonconsole.py:1206
-msgid "Are you sure you want to restart the kernel?"
-msgstr "Souhaitez-vous vraiment redémarrer le noyau ?"
-
-#: spyderlib/plugins/ipythonconsole.py:1208
-msgid "Restart kernel?"
-msgstr "Redémarrer le noyau"
-
-#: spyderlib/plugins/onlinehelp.py:66
-msgid "Online help"
-msgstr "Aide en ligne"
-
-#: spyderlib/plugins/outlineexplorer.py:46
-#: spyderlib/widgets/editortools.py:160
-#: spyderlib/widgets/outlineexplorer.py:35
-msgid "Outline"
-msgstr "Structure"
-
-#: spyderlib/plugins/projectexplorer.py:42
-#: spyderlib/widgets/projectexplorer.py:1133
-#: spyderlib/widgets/projectexplorer.py:1147
-msgid "Project explorer"
-msgstr "Explorateur de projets"
-
-#: spyderlib/plugins/projectexplorer.py:53
-#: spyderlib/widgets/projectexplorer.py:544
-msgid "New project..."
-msgstr "Nouveau projet..."
-
-#: spyderlib/plugins/runconfig.py:28
-msgid "Execute in current Python or IPython interpreter"
-msgstr "Exécuter dans l'interpréteur Python ou IPython actif"
-
-#: spyderlib/plugins/runconfig.py:29
-msgid "Execute in a new dedicated Python interpreter"
-msgstr "Exécuter dans un nouvel interpréteur Python dédié"
-
-#: spyderlib/plugins/runconfig.py:30
-msgid "Execute in an external System terminal"
-msgstr "Exécuter dans un terminal système externe"
-
-#: spyderlib/plugins/runconfig.py:40
-msgid "Always show %s on a first file run"
-msgstr "Toujours afficher %s lors de la première exécution d'un script"
-
-#: spyderlib/plugins/runconfig.py:150
-msgid "General settings"
-msgstr "Options générales"
-
-#: spyderlib/plugins/runconfig.py:153 spyderlib/plugins/runconfig.py:194
-msgid "Command line options:"
-msgstr "Options en ligne de commande :"
-
-#: spyderlib/plugins/runconfig.py:160
-msgid "Working directory:"
-msgstr "Répertoire de travail :"
-
-#: spyderlib/plugins/runconfig.py:175 spyderlib/plugins/runconfig.py:440
-msgid "Interpreter"
-msgstr "Interpréteur"
-
-#: spyderlib/plugins/runconfig.py:186
-msgid "Dedicated Python interpreter"
-msgstr "Interpréteur Python dédié"
-
-#: spyderlib/plugins/runconfig.py:191
-msgid "Interact with the Python interpreter after execution"
-msgstr "Intéragir avec l'interpréteur Python après l'exécution"
-
-#: spyderlib/plugins/runconfig.py:200
-msgid "<b>-u</b> is added to the other options you set here"
-msgstr "L'option <b>-u</b> est ajoutée aux autres options spécifiées ici"
-
-#: spyderlib/plugins/runconfig.py:211
-msgid "this dialog"
-msgstr "cette fenêtre"
-
-#: spyderlib/plugins/runconfig.py:267
-msgid "Run configuration"
-msgstr "Configuration d'exécution"
-
-#: spyderlib/plugins/runconfig.py:268
-msgid "The following working directory is not valid:<br><b>%s</b>"
-msgstr "Le répertoire de travail suivant n'est pas valide :<br><b>%s</b>"
-
-#: spyderlib/plugins/runconfig.py:344
-msgid "Run settings for %s"
-msgstr "Options d'exécution pour %s"
-
-#: spyderlib/plugins/runconfig.py:375
-msgid "Select a run configuration:"
-msgstr "Sélectionner une configuration d'exécution :"
-
-#: spyderlib/plugins/runconfig.py:405 spyderlib/plugins/runconfig.py:432
-msgid "Run Settings"
-msgstr "Options d'exécution"
-
-#: spyderlib/plugins/runconfig.py:434
-msgid ""
-"The following are the default <i>%s</i>. These options may be overriden "
-"using the <b>%s</b> dialog box (see the <b>%s</b> menu)"
-msgstr ""
-"La page suivante présente les réglages par défaut pour les <i>%s</i>. Ces "
-"réglages peuvent être remplacés à tout moment en utilisant la boîte de "
-"dialogue <b>%s</b> (voir le menu <b>%s</b>)"
-
-#: spyderlib/plugins/runconfig.py:458
-#: spyderlib/widgets/externalshell/pythonshell.py:295
-msgid "Working directory"
-msgstr "Répertoire de travail"
-
-#: spyderlib/plugins/runconfig.py:460
-msgid "Default working directory is:"
-msgstr "Le répertoire de travail par défaut est :"
-
-#: spyderlib/plugins/runconfig.py:462
-msgid "the script directory"
-msgstr "le répertoire du fichier à exécuter"
-
-#: spyderlib/plugins/runconfig.py:465 spyderlib/plugins/workingdirectory.py:53
-msgid "the following directory:"
-msgstr "le répertoire suivant :"
-
-#: spyderlib/plugins/runconfig.py:485
-msgid "Run Settings dialog"
-msgstr "la fenêtre Options d'exécution"
-
-#: spyderlib/plugins/shortcuts.py:176
-msgid "Context"
-msgstr "Contexte"
-
-#: spyderlib/plugins/shortcuts.py:178 spyderlib/widgets/dicteditor.py:146
-#: spyderlib/widgets/importwizard.py:467
-msgid "Name"
-msgstr "Nom"
-
-#: spyderlib/plugins/shortcuts.py:180
-msgid "Mod1"
-msgstr "Mod1"
-
-#: spyderlib/plugins/shortcuts.py:182
-msgid "Mod2"
-msgstr "Mod2"
-
-#: spyderlib/plugins/shortcuts.py:184
-msgid "Mod3"
-msgstr "Mod3"
-
-#: spyderlib/plugins/shortcuts.py:186 spyderlib/widgets/dicteditor.py:157
-msgid "Key"
-msgstr "Clé"
-
-#: spyderlib/plugins/shortcuts.py:319
-msgid "Conflicts"
-msgstr "Conflits"
-
-#: spyderlib/plugins/shortcuts.py:320
-msgid "The following conflicts have been detected:"
-msgstr "Les conflits suivants ont été détectés :"
-
-#: spyderlib/plugins/shortcuts.py:332
-msgid "Keyboard shortcuts"
-msgstr "Raccourcis clavier"
-
-#: spyderlib/plugins/variableexplorer.py:24
-msgid "Autorefresh"
-msgstr "Rafraîchissement automatique"
-
-#: spyderlib/plugins/variableexplorer.py:25
-msgid "Enable autorefresh"
-msgstr "Activer le rafraîchissement automatique"
-
-#: spyderlib/plugins/variableexplorer.py:27
-msgid "Refresh interval: "
-msgstr "Période de rafraîchissement : "
-
-#: spyderlib/plugins/variableexplorer.py:28
-msgid " ms"
-msgstr " ms"
-
-#: spyderlib/plugins/variableexplorer.py:31
-msgid "Filter"
-msgstr "Filtre"
-
-#: spyderlib/plugins/variableexplorer.py:33
-#: spyderlib/widgets/externalshell/namespacebrowser.py:198
-msgid "Exclude private references"
-msgstr "Exclure les références privées"
-
-#: spyderlib/plugins/variableexplorer.py:34
-#: spyderlib/widgets/externalshell/namespacebrowser.py:213
-msgid "Exclude capitalized references"
-msgstr "Exclure les références commençant par une majuscule"
-
-#: spyderlib/plugins/variableexplorer.py:35
-#: spyderlib/widgets/externalshell/namespacebrowser.py:206
-msgid "Exclude all-uppercase references"
-msgstr "Exclure les références en lettres capitales"
-
-#: spyderlib/plugins/variableexplorer.py:36
-#: spyderlib/widgets/externalshell/namespacebrowser.py:221
-msgid "Exclude unsupported data types"
-msgstr "Exclure les types non supportés"
-
-#: spyderlib/plugins/variableexplorer.py:43
-#: spyderlib/widgets/dicteditor.py:590
-msgid "Truncate values"
-msgstr "Tronquer les valeurs"
-
-#: spyderlib/plugins/variableexplorer.py:44
-#: spyderlib/widgets/dicteditor.py:603
-msgid "Always edit in-place"
-msgstr "Édition en ligne pour tous les types"
-
-#: spyderlib/plugins/variableexplorer.py:45
-#: spyderlib/widgets/dicteditor.py:599
-msgid "Show collection contents"
-msgstr "Afficher le contenu des séquences"
-
-#: spyderlib/plugins/variableexplorer.py:48
-#: spyderlib/widgets/dicteditor.py:594
-msgid "Show arrays min/max"
-msgstr "Afficher les min/max des tableaux"
-
-#: spyderlib/plugins/variableexplorer.py:50
-#: spyderlib/widgets/dicteditor.py:1250
-msgid "Edit data in the remote process"
-msgstr "Éditeurs dans le processus distant"
-
-#: spyderlib/plugins/variableexplorer.py:51
-#: spyderlib/widgets/dicteditor.py:1251
-msgid ""
-"Editors are opened in the remote process for NumPy arrays, PIL images, "
-"lists, tuples and dictionaries.\n"
-"This avoids transfering large amount of data between the remote process and "
-"Spyder (through the socket)."
-msgstr ""
-"Les tableaux NumPy, images PIL, listes, tuples et dictionnaires seront "
-"modifiés dans un éditeur exécuté dans le processus distant.\n"
-"Cela permet d'éviter de transférer de gros volumes de données entre le "
-"processus distant et Spyder (à travers le socket)."
-
-#: spyderlib/plugins/variableexplorer.py:162
-msgid "Variable explorer"
-msgstr "Explorateur de variables"
-
-#: spyderlib/plugins/workingdirectory.py:34
-msgid ""
-"The <b>global working directory</b> is the working directory for newly "
-"opened <i>consoles</i> (Python/IPython interpreters and terminals), for the "
-"<i>file explorer</i>, for the <i>find in files</i> plugin and for new files "
-"created in the <i>editor</i>."
-msgstr ""
-"Le <b>répertoire de travail global</b> est le répertoire de travail utilisé "
-"pour les nouvelles <i>consoles</i> (interpréteurs Python/IPython et "
-"terminaux), pour l'<i>explorateur de fichiers</i>, pour la <i>recherche dans "
-"les fichiers</i> et pour les fichiers créés dans l'<i>éditeur</i>."
-
-#: spyderlib/plugins/workingdirectory.py:43
-msgid "At startup, the global working directory is:"
-msgstr "Au démarrage, le répertoire de travail global est :"
-
-#: spyderlib/plugins/workingdirectory.py:47
-msgid "the same as in last session"
-msgstr "celui utilisé lors de la dernière session"
-
-#: spyderlib/plugins/workingdirectory.py:49
-msgid "At startup, Spyder will restore the global directory from last session"
-msgstr ""
-"Au démarrage, Spyder reprendra le répertoire de travail global de la "
-"dernière session"
-
-#: spyderlib/plugins/workingdirectory.py:55
-msgid "At startup, the global working directory will be the specified path"
-msgstr ""
-"Au démarrage, le répertoire de travail global sera le chemin d'accès "
-"spécifié ici"
-
-#: spyderlib/plugins/workingdirectory.py:69
-msgid "Files are opened from:"
-msgstr "Les fichiers sont ouverts depuis :"
-
-#: spyderlib/plugins/workingdirectory.py:73
-#: spyderlib/plugins/workingdirectory.py:86
-msgid "the current file directory"
-msgstr "le répertoire du fichier en cours d'édition"
-
-#: spyderlib/plugins/workingdirectory.py:77
-#: spyderlib/plugins/workingdirectory.py:90
-msgid "the global working directory"
-msgstr "le répertoire de travail global"
-
-#: spyderlib/plugins/workingdirectory.py:82
-msgid "Files are created in:"
-msgstr "Les fichiers sont créés dans :"
-
-#: spyderlib/plugins/workingdirectory.py:96
-msgid "Change to file base directory"
-msgstr "Sélectionner le répertoire de base du fichier"
-
-#: spyderlib/plugins/workingdirectory.py:98
-msgid "When opening a file"
-msgstr "Lors de l'ouverture d'un fichier"
-
-#: spyderlib/plugins/workingdirectory.py:100
-msgid "When saving a file"
-msgstr "Lors de l'enregistrement d'un fichier"
-
-#: spyderlib/plugins/workingdirectory.py:167
-msgid "Back"
-msgstr "Retour"
-
-#: spyderlib/plugins/workingdirectory.py:175 spyderlib/widgets/explorer.py:972
-#: spyderlib/widgets/importwizard.py:486
-msgid "Next"
-msgstr "Suivant"
-
-#: spyderlib/plugins/workingdirectory.py:188
-msgid ""
-"This is the working directory for newly\n"
-"opened consoles (Python interpreters and\n"
-"terminals), for the file explorer, for the\n"
-"find in files plugin and for new files\n"
-"created in the editor"
-msgstr ""
-"Ceci est le répertoire de travail utilisé pour\n"
-"les nouvelles consoles (interpréteurs Python\n"
-"et fenêtres de commandes), pour l'explorateur\n"
-"de fichiers, pour la recherche dans les fichiers\n"
-"et pour les fichiers créés dans l'éditeur"
-
-#: spyderlib/plugins/workingdirectory.py:214
-msgid "Browse a working directory"
-msgstr "Sélectionner un répertoire de travail"
-
-#: spyderlib/plugins/workingdirectory.py:220
-msgid "Set as current console's working directory"
-msgstr "Changer le répertoire de travail de la console actuelle"
-
-#: spyderlib/plugins/workingdirectory.py:228
-msgid "Change to parent directory"
-msgstr "Aller au répertoire parent"
-
-#: spyderlib/plugins/workingdirectory.py:235
-msgid "Global working directory"
-msgstr "Répertoire de travail global"
-
-#: spyderlib/spyder.py:38
-#, fuzzy
-msgid "IPython Console integration"
-msgstr "Intégration de la console Qt IPython"
-
-#: spyderlib/spyder.py:245
-msgid "PyQt4 Reference Guide"
-msgstr "Guide de référence de PyQt4"
-
-#: spyderlib/spyder.py:248
-msgid "PyQt4 API Reference"
-msgstr "Documentation de l'API de PyQt4"
-
-#: spyderlib/spyder.py:250
-msgid "Python(x,y)"
-msgstr "Python(x,y)"
-
-#: spyderlib/spyder.py:252
-msgid "WinPython"
-msgstr "WinPython"
-
-#: spyderlib/spyder.py:254
-msgid "Numpy and Scipy documentation"
-msgstr "Documentation de Numpy et Scipy"
-
-#: spyderlib/spyder.py:257 spyderlib/spyder.py:915
-msgid "Matplotlib documentation"
-msgstr "Documentation de Matplotlib"
-
-#: spyderlib/spyder.py:291
-msgid "Reload last session"
-msgstr "Recharger la session précédente"
-
-#: spyderlib/spyder.py:295
-msgid "Load session..."
-msgstr "Charger une session..."
-
-#: spyderlib/spyder.py:298
-msgid "Load Spyder session"
-msgstr "Charger une session Spyder"
-
-#: spyderlib/spyder.py:300
-msgid "Save session and quit..."
-msgstr "Enregistrer la session et quitter..."
-
-#: spyderlib/spyder.py:303
-msgid "Save current session and quit application"
-msgstr "Enregistrer la session en cours et quitter l'application"
-
-#: spyderlib/spyder.py:412
-msgid "Initializing..."
-msgstr "Initialisation..."
-
-#: spyderlib/spyder.py:473
-msgid "Close current dockwidget"
-msgstr "Fermer le panneau actif"
-
-#: spyderlib/spyder.py:479
-msgid "&Find text"
-msgstr "Rec&hercher"
-
-#: spyderlib/spyder.py:485
-msgid "Find &next"
-msgstr "Rechercher le &suivant"
-
-#: spyderlib/spyder.py:491
-msgid "Find &previous"
-msgstr "Rechercher le &précédent"
-
-#: spyderlib/spyder.py:496
-msgid "&Replace text"
-msgstr "&Remplacer"
-
-#: spyderlib/spyder.py:511 spyderlib/widgets/sourcecode/codeeditor.py:2192
-msgid "Undo"
-msgstr "Annuler"
-
-#: spyderlib/spyder.py:513 spyderlib/widgets/sourcecode/codeeditor.py:2195
-msgid "Redo"
-msgstr "Répéter"
-
-#: spyderlib/spyder.py:514 spyderlib/widgets/arrayeditor.py:325
-#: spyderlib/widgets/dicteditor.py:562 spyderlib/widgets/shell.py:118
-#: spyderlib/widgets/sourcecode/codeeditor.py:2201
-msgid "Copy"
-msgstr "Copier"
-
-#: spyderlib/spyder.py:516 spyderlib/widgets/shell.py:114
-#: spyderlib/widgets/sourcecode/codeeditor.py:2198
-msgid "Cut"
-msgstr "Couper"
-
-#: spyderlib/spyder.py:517 spyderlib/widgets/dicteditor.py:559
-#: spyderlib/widgets/shell.py:122
-#: spyderlib/widgets/sourcecode/codeeditor.py:2204
-msgid "Paste"
-msgstr "Coller"
-
-#: spyderlib/spyder.py:519 spyderlib/widgets/explorer.py:452
-#: spyderlib/widgets/projectexplorer.py:1000 spyderlib/widgets/shell.py:131
-#: spyderlib/widgets/sourcecode/codeeditor.py:2207
-msgid "Delete"
-msgstr "Supprimer"
-
-#: spyderlib/spyder.py:522 spyderlib/widgets/shell.py:135
-#: spyderlib/widgets/sourcecode/codeeditor.py:2211
-msgid "Select All"
-msgstr "Sélectionner tout"
-
-#: spyderlib/spyder.py:570
-msgid "&Interpreters"
-msgstr "&Interpréteurs"
-
-#: spyderlib/spyder.py:576
-msgid "&View"
-msgstr "&Affichage"
-
-#: spyderlib/spyder.py:584
-msgid "Welcome to Spyder!"
-msgstr "Bienvenue dans Spyder !"
-
-#: spyderlib/spyder.py:588
-msgid "Pre&ferences"
-msgstr "Pré&férences"
-
-#: spyderlib/spyder.py:596 spyderlib/widgets/pathmanager.py:44
-#: spyderlib/widgets/projectexplorer.py:593
-msgid "PYTHONPATH manager"
-msgstr "Gestionnaire de PYTHONPATH"
-
-#: spyderlib/spyder.py:599
-msgid "Python Path Manager"
-msgstr ""
-
-#: spyderlib/spyder.py:602
-msgid "Update module names list"
-msgstr "Mise à jour de la liste des modules"
-
-#: spyderlib/spyder.py:605
-msgid "Refresh list of module names available in PYTHONPATH"
-msgstr ""
-"Mise à jour de la liste des modules disponibles notamment à travers "
-"PYTHONPATH"
-
-#: spyderlib/spyder.py:611
-msgid "Current user environment variables..."
-msgstr "Variables d'environnement de l'utilisateur..."
-
-#: spyderlib/spyder.py:613
-msgid ""
-"Show and edit current user environment variables in Windows registry (i.e. "
-"for all sessions)"
-msgstr ""
-"Afficher et modifier les variables d'environnement de l'utilisateur courant "
-"dans Windows (c'est-à-dire directement dans la base de registre)"
-
-#: spyderlib/spyder.py:620 spyderlib/spyder.py:990
-msgid "External Tools"
-msgstr "Outils externes"
-
-#: spyderlib/spyder.py:624
-msgid "Python(x,y) launcher"
-msgstr "Accueil de Python(x,y)"
-
-#: spyderlib/spyder.py:635
-msgid "WinPython control panel"
-msgstr "Panneau de contrôle WinPython"
-
-#: spyderlib/spyder.py:648
-msgid "Qt Designer"
-msgstr "Qt Designer"
-
-#: spyderlib/spyder.py:653
-msgid "Qt Linguist"
-msgstr "Qt Linguist"
-
-#: spyderlib/spyder.py:659
-msgid "Qt examples"
-msgstr "Exemples Qt"
-
-#: spyderlib/spyder.py:675
-msgid "guidata examples"
-msgstr "Exemples guidata"
-
-#: spyderlib/spyder.py:683
-msgid "guiqwt examples"
-msgstr "Exemples guiqwt"
-
-#: spyderlib/spyder.py:688
-msgid "Sift"
-msgstr "Sift"
-
-#: spyderlib/spyder.py:696
-msgid "ViTables"
-msgstr "ViTables"
-
-#: spyderlib/spyder.py:710
-msgid "Fullscreen mode"
-msgstr "Mode plein écran"
-
-#: spyderlib/spyder.py:722
-msgid "Main toolbar"
-msgstr "Barre d'outil principale"
-
-#: spyderlib/spyder.py:739
-msgid "Loading object inspector..."
-msgstr "Chargement de l'inspecteur d'objet..."
-
-#: spyderlib/spyder.py:745
-msgid "Loading outline explorer..."
-msgstr "Chargement de l'explorateur de structure..."
-
-#: spyderlib/spyder.py:752
-msgid "Loading editor..."
-msgstr "Chargement de l'éditeur..."
-
-#: spyderlib/spyder.py:774
-msgid "Loading file explorer..."
-msgstr "Chargement de l'explorateur de fichiers..."
-
-#: spyderlib/spyder.py:780
-msgid "Loading history plugin..."
-msgstr "Chargement du journal d'historique..."
-
-#: spyderlib/spyder.py:786
-msgid "Loading online help..."
-msgstr "Chargement de l'aide en ligne..."
-
-#: spyderlib/spyder.py:792
-msgid "Loading project explorer..."
-msgstr "Chargement de l'explorateur de projet..."
-
-#: spyderlib/spyder.py:802
-msgid "Loading external console..."
-msgstr "Chargement de la console externe..."
-
-#: spyderlib/spyder.py:810
-msgid "Loading namespace browser..."
-msgstr "Chargement de l'explorateur d'espace de noms..."
-
-#: spyderlib/spyder.py:817
-msgid "Loading IPython console..."
-msgstr "Chargement de la console IPython..."
-
-#: spyderlib/spyder.py:827
-msgid "Setting up main window..."
-msgstr "Configuration de la fenêtre principale..."
-
-#: spyderlib/spyder.py:831
-msgid "About %s..."
-msgstr "À propos de %s..."
-
-#: spyderlib/spyder.py:834
-msgid "Optional dependencies..."
-msgstr "Dépendances optionnelles..."
-
-#: spyderlib/spyder.py:838
-msgid "Report issue..."
-msgstr "Rapport d'erreur..."
-
-#: spyderlib/spyder.py:859
-msgid "Spyder documentation"
-msgstr "Documentation de Spyder"
-
-#: spyderlib/spyder.py:865
-msgid "Python documentation"
-msgstr "Documentation de Python"
-
-#: spyderlib/spyder.py:871
-msgid "Qt Assistant"
-msgstr "Qt Assistant (documentation Qt)"
-
-#: spyderlib/spyder.py:905
-msgid "Python(x,y) documentation folder"
-msgstr "Dossier de documentation Python(x,y)"
-
-#: spyderlib/spyder.py:907
-msgid "IPython documentation"
-msgstr "Documentation de IPython"
-
-#: spyderlib/spyder.py:909
-msgid "guidata documentation"
-msgstr "Documentation de guidata"
-
-#: spyderlib/spyder.py:912
-msgid "guiqwt documentation"
-msgstr "Documentation de guiqwt"
-
-#: spyderlib/spyder.py:918
-msgid "NumPy documentation"
-msgstr "Documentation de NumPy"
-
-#: spyderlib/spyder.py:920
-msgid "NumPy reference guide"
-msgstr "Manuel de référence de NumPy"
-
-#: spyderlib/spyder.py:922
-msgid "NumPy user guide"
-msgstr "Manuel de l'utilisateur de NumPy"
-
-#: spyderlib/spyder.py:924
-msgid "SciPy documentation"
-msgstr "Documentation de SciPy"
-
-#: spyderlib/spyder.py:931
-msgid "Web Resources"
-msgstr "Documentation en ligne"
-
-#: spyderlib/spyder.py:952
-msgid "Windows and toolbars"
-msgstr "Fenêtres et barres d'outils"
-
-#: spyderlib/spyder.py:956
-msgid "Reset window layout"
-msgstr "Réinitialiser la disposition des fenêtres"
-
-#: spyderlib/spyder.py:958
-msgid "Custom window layouts"
-msgstr "Dispositions de fenêtres personnalisées"
-
-#: spyderlib/spyder.py:964
-msgid "Switch to/from layout %d"
-msgstr "Basculer vers/depuis la disposition %d"
-
-#: spyderlib/spyder.py:970
-msgid "Set layout %d"
-msgstr "Définir la disposition %d"
-
-#: spyderlib/spyder.py:980
-msgid "Attached console window (debugging)"
-msgstr "Invite de commandes attaché (débogage)"
-
-#: spyderlib/spyder.py:1250
-msgid ""
-"Window layout will be reset to default settings: this affects window "
-"position, size and dockwidgets.\n"
-"Do you want to continue?"
-msgstr ""
-"La disposition des fenêtres sera réinitialisée selon les réglages par "
-"défaut.\n"
-"Souhaitez-vous continuer ?"
-
-#: spyderlib/spyder.py:1268
-msgid "Quick switch layout #%d has not yet been defined."
-msgstr ""
-"La disposition de fenêtre personnalisée n°%d n'a pas encore été définie."
-
-#: spyderlib/spyder.py:1459 spyderlib/spyder.py:1460
-msgid "Maximize current plugin"
-msgstr "Agrandir la fenêtre courante"
-
-#: spyderlib/spyder.py:1463
-msgid "Restore current plugin"
-msgstr "Réduire la fenêtre courante"
-
-#: spyderlib/spyder.py:1464
-msgid "Restore plugin to its original size"
-msgstr ""
-
-#: spyderlib/spyder.py:1535
-msgid "(not installed)"
-msgstr "(non installé)"
-
-#: spyderlib/spyder.py:1553
-msgid "About %s"
-msgstr "À propos de %s"
-
-#: spyderlib/spyder.py:1714
-msgid "Running an external system terminal is not supported on platform %s."
-msgstr ""
-"L'exécution dans un terminal système externe n'est pas prise en charge sur "
-"la plateforme %s."
-
-#: spyderlib/spyder.py:1911
-msgid "Open session"
-msgstr "Ouvrir une session"
-
-#: spyderlib/spyder.py:1912 spyderlib/spyder.py:1923
-msgid "Spyder sessions"
-msgstr "Sessions Spyder"
-
-#: spyderlib/spyder.py:1922
-msgid "Save session"
-msgstr "Enregistrer la session"
-
-#: spyderlib/utils/codeanalysis.py:76
-msgid "Real-time code analysis on the Editor"
-msgstr "Analyse de code temps réel dans l'éditeur"
-
-#: spyderlib/utils/codeanalysis.py:80
-msgid "Real-time code style analysis on the Editor"
-msgstr "Analyse de code temps réel dans l'éditeur"
-
-#: spyderlib/utils/environ.py:96
-msgid ""
-"Module <b>pywin32 was not found</b>.<br>Please restart this Windows "
-"<i>session</i> (not the computer) for changes to take effect."
-msgstr ""
-"Le module <b>pywin32 n'est pas installé</b>.<br>Merci de redémarrer la "
-"<i>session</i> en cours (et non l'ordinateur) pour que les changements "
-"effectués prennent effet."
-
-#: spyderlib/utils/environ.py:109
-msgid ""
-"If you accept changes, this will modify the current user environment "
-"variables directly <b>in Windows registry</b>. Use it with precautions, at "
-"your own risks.<br><br>Note that for changes to take effect, you will need "
-"to restart the parent process of this application (simply restart Spyder if "
-"you have executed it from a Windows shortcut, otherwise restart any "
-"application from which you may have executed it, like <i>Python(x,y) Home</"
-"i> for example)"
-msgstr ""
-"Si vous acceptez les changements effectués, cela modifiera les variables "
-"d'environnement de l'utilisateur courant directement <b>dans la base de "
-"registre Windows</b>. Utilisez cette fonctionnalité avec précautions et à "
-"vos risques et périls.<br><br>Notez que pour que les changements effectués "
-"prennent effet, il sera nécessaire de redémarrer le processus parent de "
-"cette application (redémarrez simplement Spyder si vous l'avez exécuté à "
-"partir d'un raccourci Windows, sinon redémarrez toute application ayant "
-"servie à exécuter Spyder : <i>Python(x,y) Home</i> ou un invite de commandes "
-"par exemple)"
-
-#: spyderlib/utils/inspector/sphinxify.py:197
-#: spyderlib/utils/inspector/sphinxify.py:207
-msgid ""
-"It was not possible to generate rich text help for this object.</br>Please "
-"see it in plain text."
-msgstr ""
-"Le processus de génération de l'aide sous la forme de texte enrichi a échoué."
-"</br>Merci d'activer le mode d'affichage en texte brut."
-
-#: spyderlib/utils/iofuncs.py:329
-msgid "Supported files"
-msgstr "Fichiers compatibles"
-
-#: spyderlib/utils/iofuncs.py:340
-msgid "Spyder data files"
-msgstr "Fichiers Spyder"
-
-#: spyderlib/utils/iofuncs.py:342 spyderlib/widgets/dicteditor.py:923
-msgid "NumPy arrays"
-msgstr "Tableaux NumPy"
-
-#: spyderlib/utils/iofuncs.py:343
-msgid "Matlab files"
-msgstr "Fichiers Matlab"
-
-#: spyderlib/utils/iofuncs.py:344
-msgid "CSV text files"
-msgstr "Fichiers texte CSV"
-
-#: spyderlib/utils/iofuncs.py:346
-msgid "JPEG images"
-msgstr "Images JPEG"
-
-#: spyderlib/utils/iofuncs.py:347
-msgid "PNG images"
-msgstr "Images PNG"
-
-#: spyderlib/utils/iofuncs.py:348
-msgid "GIF images"
-msgstr "Images GIF"
-
-#: spyderlib/utils/iofuncs.py:349
-msgid "TIFF images"
-msgstr "Images TIFF"
-
-#: spyderlib/utils/iofuncs.py:368 spyderlib/utils/iofuncs.py:375
-msgid "<b>Unsupported file type '%s'</b>"
-msgstr "<b>Type de fichier non pris en charge '%s'</b>"
-
-#: spyderlib/utils/vcs.py:68
-msgid ""
-"For %s support, please install one of the<br/> following tools:<br/><br/>  %s"
-msgstr ""
-"Pour ajouter la prise en charge de %s, merci d'installer <br/>l'un des "
-"outils suivants :<br/><br/>  %s"
-
-#: spyderlib/widgets/arrayeditor.py:313 spyderlib/widgets/arrayeditor.py:486
-#: spyderlib/widgets/arrayeditor.py:572
-msgid "Array editor"
-msgstr "Éditeur de tableaux"
-
-#: spyderlib/widgets/arrayeditor.py:314
-msgid ""
-"Resizing cells of a table of such size could take a long time.\n"
-"Do you want to continue anyway?"
-msgstr ""
-"Redimensionner les cellules d'un tableau d'une telle taille peut prendre du "
-"temps.\n"
-"Souhaitez-vous néanmoins continuer ?"
-
-#: spyderlib/widgets/arrayeditor.py:385 spyderlib/widgets/arrayeditor.py:418
-msgid "Format"
-msgstr "Format"
-
-#: spyderlib/widgets/arrayeditor.py:390
-msgid "Resize"
-msgstr "Ajuster"
-
-#: spyderlib/widgets/arrayeditor.py:419
-msgid "Float formatting"
-msgstr "Format de flottant"
-
-#: spyderlib/widgets/arrayeditor.py:426 spyderlib/widgets/explorer.py:548
-#: spyderlib/widgets/explorer.py:645
-#: spyderlib/widgets/externalshell/pythonshell.py:520
-#: spyderlib/widgets/externalshell/systemshell.py:91
-msgid "Error"
-msgstr "Erreur"
-
-#: spyderlib/widgets/arrayeditor.py:427
-msgid "Format (%s) is incorrect"
-msgstr "Le format (%s) n'est pas valide"
-
-#: spyderlib/widgets/arrayeditor.py:458
-msgid "Array is empty"
-msgstr "Ce tableau est vide"
-
-#: spyderlib/widgets/arrayeditor.py:461
-msgid "Arrays with more than 2 dimensions are not supported"
-msgstr "Les tableaux de plus de deux dimensions ne sont pas pris en charge"
-
-#: spyderlib/widgets/arrayeditor.py:465
-msgid "The 'xlabels' argument length do no match array column number"
-msgstr ""
-"La taille de 'xlabels' ne correspond pas au nombre de colonnes du tableau"
-
-#: spyderlib/widgets/arrayeditor.py:469
-msgid "The 'ylabels' argument length do no match array row number"
-msgstr ""
-"La taille de 'ylabels' ne correspond pas au nombre de lignes du tableau"
-
-#: spyderlib/widgets/arrayeditor.py:476
-msgid "%s arrays"
-msgstr "Les tableaux %s"
-
-#: spyderlib/widgets/arrayeditor.py:477
-msgid "%s are currently not supported"
-msgstr "%s ne sont actuellement pas pris en charge"
-
-#: spyderlib/widgets/arrayeditor.py:488
-msgid "read only"
-msgstr "lecture seule"
-
-#: spyderlib/widgets/arrayeditor.py:517
-msgid "Record array fields:"
-msgstr "Champs du tableau : "
-
-#: spyderlib/widgets/arrayeditor.py:529
-msgid "Data"
-msgstr "Données"
-
-#: spyderlib/widgets/arrayeditor.py:529
-msgid "Mask"
-msgstr "Masque"
-
-#: spyderlib/widgets/arrayeditor.py:529
-msgid "Masked data"
-msgstr "Données masquées"
-
-#: spyderlib/widgets/arrayeditor.py:536
-msgid "<u>Warning</u>: changes are applied separately"
-msgstr "<u>Attention</u>: les changements seront pris en compte séparément"
-
-#: spyderlib/widgets/arrayeditor.py:537
-msgid ""
-"For performance reasons, changes applied to masked array won't be reflected "
-"in array's data (and vice-versa)."
-msgstr ""
-"Pour des questions de performance, les changements effectués sur les données "
-"masquées ne seront pas reflétées sur les données du tableau (et "
-"réciproquement)."
-
-#: spyderlib/widgets/browser.py:29
-#: spyderlib/widgets/sourcecode/codeeditor.py:2227
-msgid "Zoom out"
-msgstr "Réduire"
-
-#: spyderlib/widgets/browser.py:32
-#: spyderlib/widgets/sourcecode/codeeditor.py:2224
-msgid "Zoom in"
-msgstr "Agrandir"
-
-#: spyderlib/widgets/browser.py:125
-msgid "Home"
-msgstr "Accueil"
-
-#: spyderlib/widgets/browser.py:165
-msgid "Find text"
-msgstr "Rechercher"
-
-#: spyderlib/widgets/browser.py:184
-msgid "Address:"
-msgstr "Adresse :"
-
-#: spyderlib/widgets/browser.py:219
-msgid "Unable to load page"
-msgstr "Impossible de charger la page"
-
-#: spyderlib/widgets/comboboxes.py:116
-msgid "Press enter to validate this entry"
-msgstr "Appuyer sur Entrée pour valider cette saisie"
-
-#: spyderlib/widgets/comboboxes.py:117
-msgid "This entry is incorrect"
-msgstr "Cette saisie n'est pas correcte"
-
-#: spyderlib/widgets/comboboxes.py:170
-msgid "Press enter to validate this path"
-msgstr "Appuyez sur Entrée pour valider ce chemin d'accès"
-
-#: spyderlib/widgets/comboboxes.py:171
-msgid ""
-"This path is incorrect.\n"
-"Enter a correct directory path,\n"
-"then press enter to validate"
-msgstr ""
-"Ce chemin d'accès n'est pas valide :\n"
-"veuillez entrer un chemin d'accès correct,\n"
-"puis appuyer sur Entrée pour le valider"
-
-#: spyderlib/widgets/dependencies.py:60
-msgid " Required "
-msgstr "  Requis  "
-
-#: spyderlib/widgets/dependencies.py:60
-msgid "Module"
-msgstr "Module"
-
-#: spyderlib/widgets/dependencies.py:61
-msgid " Installed "
-msgstr "  Installé  "
-
-#: spyderlib/widgets/dependencies.py:61
-msgid "Provided features"
-msgstr "Fonctionnalités associées"
-
-#: spyderlib/widgets/dependencies.py:127
-msgid "Optional Dependencies"
-msgstr "Dépendances optionnelles"
-
-#: spyderlib/widgets/dependencies.py:134
-msgid ""
-"Spyder depends on several Python modules to provide additional functionality "
-"for its plugins. The table below shows the required and installed versions "
-"(if any) of all of them.<br><br>Although Spyder can work without any of "
-"these modules, it's strongly recommended that at least you try to install <b>"
-"%s</b> and <b>%s</b> to have a much better experience."
-msgstr ""
-"Spyder dépend de nombreux modules Python pour disposer de l'intégralité des "
-"fonctionnalités potentiellement fournies par ses plugins. Le tableau suivant "
-"montre les versions requises et installées (le cas échéant) de toutes ces "
-"dépendances.<br><br>Même si Spyder est parfaitement fonctionnel sans tout "
-"ces modules, il est néanmoins fortement recommandé d'installer au minimum <b>"
-"%s</b> et <b>%s</b> afin de bénéficier des fonctionnalités les plus avancées."
-
-#: spyderlib/widgets/dependencies.py:149
-msgid "Copy to clipboard"
-msgstr "Copier dans le presse-papier"
-
-#: spyderlib/widgets/dicteditor.py:144
-msgid "Index"
-msgstr "Indice"
-
-#: spyderlib/widgets/dicteditor.py:149
-msgid "Tuple"
-msgstr "Tuple"
-
-#: spyderlib/widgets/dicteditor.py:152
-msgid "List"
-msgstr "Liste"
-
-#: spyderlib/widgets/dicteditor.py:155
-msgid "Dictionary"
-msgstr "Dictionnaire"
-
-#: spyderlib/widgets/dicteditor.py:163
-msgid "Attribute"
-msgstr "Attribut"
-
-#: spyderlib/widgets/dicteditor.py:164
-msgid "elements"
-msgstr "éléments"
-
-#: spyderlib/widgets/dicteditor.py:286
-msgid "Size"
-msgstr "Taille"
-
-#: spyderlib/widgets/dicteditor.py:286
-msgid "Type"
-msgstr "Type"
-
-#: spyderlib/widgets/dicteditor.py:286
-msgid "Value"
-msgstr "Valeur"
-
-#: spyderlib/widgets/dicteditor.py:360 spyderlib/widgets/dicteditor.py:494
-msgid "Edit item"
-msgstr "Modifier"
-
-#: spyderlib/widgets/dicteditor.py:361
-msgid "<b>Unable to retrieve data.</b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible d'accéder aux données</b><br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/widgets/dicteditor.py:495
-msgid "<b>Unable to assign data to item.</b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible d'assigner la valeur de l'objet.</b><br><br>Message d'erreur :"
-"<br>%s"
-
-#: spyderlib/widgets/dicteditor.py:557
-msgid "Resize rows to contents"
-msgstr "Ajuster la hauteur des lignes"
-
-#: spyderlib/widgets/dicteditor.py:565 spyderlib/widgets/explorer.py:231
-msgid "Edit"
-msgstr "Modifier"
-
-#: spyderlib/widgets/dicteditor.py:568 spyderlib/widgets/dicteditor.py:894
-#: spyderlib/widgets/dicteditor.py:910
-msgid "Plot"
-msgstr "Tracer"
-
-#: spyderlib/widgets/dicteditor.py:572
-msgid "Histogram"
-msgstr "Histogramme"
-
-#: spyderlib/widgets/dicteditor.py:576
-msgid "Show image"
-msgstr "Afficher l'image"
-
-#: spyderlib/widgets/dicteditor.py:580 spyderlib/widgets/dicteditor.py:917
-msgid "Save array"
-msgstr "Enregistrer le tableau"
-
-#: spyderlib/widgets/dicteditor.py:584 spyderlib/widgets/dicteditor.py:858
-#: spyderlib/widgets/dicteditor.py:866
-msgid "Insert"
-msgstr "Insérer"
-
-#: spyderlib/widgets/dicteditor.py:587 spyderlib/widgets/dicteditor.py:811
-msgid "Remove"
-msgstr "Supprimer"
-
-#: spyderlib/widgets/dicteditor.py:610 spyderlib/widgets/dicteditor.py:828
-#: spyderlib/widgets/explorer.py:494 spyderlib/widgets/explorer.py:502
-#: spyderlib/widgets/explorer.py:514
-msgid "Rename"
-msgstr "Renommer"
-
-#: spyderlib/widgets/dicteditor.py:613
-msgid "Duplicate"
-msgstr "Dupliquer"
-
-#: spyderlib/widgets/dicteditor.py:809
-msgid "Do you want to remove selected item?"
-msgstr "Souhaitez-vous supprimer l'élément sélectionné ?"
-
-#: spyderlib/widgets/dicteditor.py:810
-msgid "Do you want to remove all selected items?"
-msgstr "Souhaitez-vous supprimer les éléments sélectionnés ?"
-
-#: spyderlib/widgets/dicteditor.py:828 spyderlib/widgets/dicteditor.py:858
-msgid "Key:"
-msgstr "Clé :"
-
-#: spyderlib/widgets/dicteditor.py:866
-msgid "Value:"
-msgstr "Valeur :"
-
-#: spyderlib/widgets/dicteditor.py:882
-msgid "Import error"
-msgstr "Erreur d'import"
-
-#: spyderlib/widgets/dicteditor.py:883
-msgid "Please install <b>matplotlib</b> or <b>guiqwt</b>."
-msgstr "Merci d'installer <b>matplotlib</b> ou <b>guiqwt</b>."
-
-#: spyderlib/widgets/dicteditor.py:895
-msgid "<b>Unable to plot data.</b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible d'afficher les données</b><br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/widgets/dicteditor.py:911
-msgid "<b>Unable to show image.</b><br><br>Error message:<br>%s"
-msgstr "<b>Impossible d'afficher l'image</b><br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/widgets/dicteditor.py:933
-msgid "<b>Unable to save array</b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible d'enregistrer le tableau</b><br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/widgets/dicteditor.py:950
-msgid "Clipboard contents"
-msgstr "Contenu du presse-papiers"
-
-#: spyderlib/widgets/dicteditor.py:964
-msgid "Import from clipboard"
-msgstr "Importer depuis le presse-papiers"
-
-#: spyderlib/widgets/dicteditor.py:966
-msgid "Empty clipboard"
-msgstr "Presse-papiers vide"
-
-#: spyderlib/widgets/dicteditor.py:967
-msgid "Nothing to be imported from clipboard."
-msgstr "Aucune donnée ne peut être importée depuis le presse-papiers."
-
-#: spyderlib/widgets/editor.py:66 spyderlib/widgets/editor.py:549
-msgid "File list management"
-msgstr "Gestionnaire de fichiers"
-
-#: spyderlib/widgets/editor.py:70
-msgid "Filter:"
-msgstr "Filtre :"
-
-#: spyderlib/widgets/editor.py:75
-msgid "(press <b>Enter</b> to edit file)"
-msgstr "(appuyer sur <b>Entrée</b> pour modifier le fichier)"
-
-#: spyderlib/widgets/editor.py:90
-msgid "&Edit file"
-msgstr "Modifi&er le fichier"
-
-#: spyderlib/widgets/editor.py:99
-msgid "&Close file"
-msgstr "&Fermer le fichier"
-
-#: spyderlib/widgets/editor.py:107
-msgid "Hint: press <b>Alt</b> to show accelerators"
-msgstr "Astuce : la touche <b>Alt</b> affiche les accélérateurs"
-
-#: spyderlib/widgets/editor.py:552
-msgid "Copy path to clipboard"
-msgstr "Copier le chemin d'accès dans le presse-papier"
-
-#: spyderlib/widgets/editor.py:1090
-msgid "Temporary file"
-msgstr "Fichier temporaire"
-
-#: spyderlib/widgets/editor.py:1187
-msgid "New window"
-msgstr "Nouvelle fenêtre"
-
-#: spyderlib/widgets/editor.py:1188
-msgid "Create a new editor window"
-msgstr "Créer une nouvelle fenêtre d'édition"
-
-#: spyderlib/widgets/editor.py:1191
-msgid "Split vertically"
-msgstr "Séparation verticale"
-
-#: spyderlib/widgets/editor.py:1193
-msgid "Split vertically this editor window"
-msgstr "Séparer en deux verticalement cette fenêtre d'édition"
-
-#: spyderlib/widgets/editor.py:1195
-msgid "Split horizontally"
-msgstr "Séparation horizontale"
-
-#: spyderlib/widgets/editor.py:1197
-msgid "Split horizontally this editor window"
-msgstr "Séparer en deux horizontalement cette fenêtre d'édition"
-
-#: spyderlib/widgets/editor.py:1199
-msgid "Close this panel"
-msgstr "Fermer ce panneau"
-
-#: spyderlib/widgets/editor.py:1331
-msgid "<b>%s</b> has been modified.<br>Do you want to save changes?"
-msgstr ""
-"<b>%s</b> a été modifié.<br>Souhaitez-vous enregistrer ces changements ?"
-
-#: spyderlib/widgets/editor.py:1394
-msgid "Save"
-msgstr "Enregistrer"
-
-#: spyderlib/widgets/editor.py:1395
-msgid "<b>Unable to save script '%s'</b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible d'enregistrer le script '%s'</b><br><br>Message d'erreur :<br>"
-"%s"
-
-#: spyderlib/widgets/editor.py:1417
-msgid "Save Python script"
-msgstr "Enregistrer le script Python"
-
-#: spyderlib/widgets/editor.py:1638
-msgid ""
-"<b>%s</b> is unavailable (this file may have been removed, moved or renamed "
-"outside Spyder).<br>Do you want to close it?"
-msgstr ""
-"<b>%s</b> n'est pas accessible (ce fichier a peut-être été supprimé, déplacé "
-"ou renommé en dehors de Spyder).<br>Souhaitez-vous le fermer ?"
-
-#: spyderlib/widgets/editor.py:1658
-#, fuzzy
-msgid ""
-"<b>%s</b> has been modified outside Spyder.<br>Do you want to reload it and "
-"lose all your changes?"
-msgstr ""
-"<b>%s</b> a été modifié en dehors de Spyder.<br>Souhaitez-vous le recharger "
-"et perdre ainsi vos modifications ?"
-
-#: spyderlib/widgets/editor.py:1754
-msgid ""
-"All changes to <b>%s</b> will be lost.<br>Do you want to revert file from "
-"disk?"
-msgstr ""
-"Toutes les modifications effectuées sur <b>%s</b> seront perdues."
-"<br>Souhaitez-vous revenir à la version du fichier enregistrée sur le "
-"disque ?"
-
-#: spyderlib/widgets/editor.py:1893
-msgid "Loading %s..."
-msgstr "Chargement de \"%s\" en cours..."
-
-#: spyderlib/widgets/editor.py:1903
-msgid ""
-"<b>%s</b> contains mixed end-of-line characters.<br>Spyder will fix this "
-"automatically."
-msgstr ""
-"<b>%s</b> contient des caractères de fin de ligne mélangés.<br>Spyder va "
-"corriger ceci automatiquement."
-
-#: spyderlib/widgets/editor.py:2251
-msgid "Close window"
-msgstr "Fermer la fenêtre"
-
-#: spyderlib/widgets/editor.py:2253
-msgid "Close this window"
-msgstr "Fermer cette fenêtre d'édition"
-
-#: spyderlib/widgets/editortools.py:89
-msgid "Line %s"
-msgstr "Ligne %s"
-
-#: spyderlib/widgets/editortools.py:94
-msgid "Class defined at line %s"
-msgstr "Classe déclarée ligne %s"
-
-#: spyderlib/widgets/editortools.py:102
-msgid "Method defined at line %s"
-msgstr "Méthode déclarée ligne %s"
-
-#: spyderlib/widgets/editortools.py:112
-msgid "Function defined at line %s"
-msgstr "Fonction déclarée ligne %s"
-
-#: spyderlib/widgets/editortools.py:167 spyderlib/widgets/editortools.py:495
-msgid "Go to cursor position"
-msgstr "Aller à la position du curseur"
-
-#: spyderlib/widgets/editortools.py:170
-msgid "Show absolute path"
-msgstr "Afficher les chemins complets"
-
-#: spyderlib/widgets/editortools.py:173 spyderlib/widgets/explorer.py:173
-msgid "Show all files"
-msgstr "Afficher tous les fichiers"
-
-#: spyderlib/widgets/editortools.py:176
-msgid "Show special comments"
-msgstr "Afficher les commentaires spéciaux"
-
-#: spyderlib/widgets/explorer.py:169
-msgid "Edit filename filters..."
-msgstr "Modifier les filtres..."
-
-#: spyderlib/widgets/explorer.py:182
-msgid "Edit filename filters"
-msgstr "Modifier les filtres"
-
-#: spyderlib/widgets/explorer.py:183
-msgid "Name filters:"
-msgstr "Filtres sur les noms de fichiers :"
-
-#: spyderlib/widgets/explorer.py:201
-msgid "File..."
-msgstr "Fichier..."
-
-#: spyderlib/widgets/explorer.py:204
-msgid "Module..."
-msgstr "Module..."
-
-#: spyderlib/widgets/explorer.py:207
-msgid "Folder..."
-msgstr "Dossier..."
-
-#: spyderlib/widgets/explorer.py:211
-msgid "Package..."
-msgstr "Paquet..."
-
-#: spyderlib/widgets/explorer.py:233
-msgid "Move..."
-msgstr "Déplacer..."
-
-#: spyderlib/widgets/explorer.py:236
-msgid "Delete..."
-msgstr "Supprimer..."
-
-#: spyderlib/widgets/explorer.py:239
-msgid "Rename..."
-msgstr "Renommer..."
-
-#: spyderlib/widgets/explorer.py:242
-msgid "Open"
-msgstr "Ouvrir"
-
-#: spyderlib/widgets/explorer.py:261
-msgid "Commit"
-msgstr "Commiter"
-
-#: spyderlib/widgets/explorer.py:265
-msgid "Browse repository"
-msgstr "Explorer le dépôt"
-
-#: spyderlib/widgets/explorer.py:277
-msgid "Open command prompt here"
-msgstr "Ouvrir un invite de commandes ici"
-
-#: spyderlib/widgets/explorer.py:279
-msgid "Open terminal here"
-msgstr "Ouvrir un terminal ici"
-
-#: spyderlib/widgets/explorer.py:284
-msgid "Open Python interpreter here"
-msgstr "Ouvrir un interpréteur Python ici"
-
-#: spyderlib/widgets/explorer.py:298
-msgid "New"
-msgstr "Nouveau"
-
-#: spyderlib/widgets/explorer.py:306
-msgid "Import"
-msgstr "Import"
-
-#: spyderlib/widgets/explorer.py:453
-msgid "Do you really want to delete <b>%s</b>?"
-msgstr "Souhaitez-vous réellement supprimer <b>%s</b> ?"
-
-#: spyderlib/widgets/explorer.py:473
-msgid "delete"
-msgstr "supprimer"
-
-#: spyderlib/widgets/explorer.py:474 spyderlib/widgets/projectexplorer.py:813
-#: spyderlib/widgets/projectexplorer.py:820
-#: spyderlib/widgets/projectexplorer.py:1086
-#: spyderlib/widgets/projectexplorer.py:1169
-msgid "Project Explorer"
-msgstr "Explorateur de projets"
-
-#: spyderlib/widgets/explorer.py:475 spyderlib/widgets/projectexplorer.py:761
-#: spyderlib/widgets/projectexplorer.py:1170
-msgid "<b>Unable to %s <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr "<b>Impossible de %s <i>%s</i></b><br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/widgets/explorer.py:495
-msgid "New name:"
-msgstr "Nouveau nom :"
-
-#: spyderlib/widgets/explorer.py:503
-msgid ""
-"Do you really want to rename <b>%s</b> and overwrite the existing file <b>"
-"%s</b>?"
-msgstr ""
-"Souhaitez-vous réellement renommer <b>%s</b> et remplacer le ficher existant "
-"<b>%s</b> ?"
-
-#: spyderlib/widgets/explorer.py:515
-msgid "<b>Unable to rename file <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible de renommer l'élément <i>%s</i></b><br><br>Message d'erreur :"
-"<br>%s"
-
-#: spyderlib/widgets/explorer.py:549
-msgid "<b>Unable to move <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible de déplacer <i>%s</i></b><br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/widgets/explorer.py:567
-msgid "<b>Unable to create folder <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible de créer le répertoire <i>%s</i></b><br><br>Message d'erreur :"
-"<br>%s"
-
-#: spyderlib/widgets/explorer.py:579 spyderlib/widgets/explorer.py:612
-msgid "<b>Unable to create file <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible de créer le fichier <i>%s</i></b><br><br>Message d'erreur :<br>"
-"%s"
-
-#: spyderlib/widgets/explorer.py:586
-msgid "New folder"
-msgstr "Nouveau répertoire"
-
-#: spyderlib/widgets/explorer.py:587
-msgid "Folder name:"
-msgstr "Nom du dossier :"
-
-#: spyderlib/widgets/explorer.py:592
-msgid "New package"
-msgstr "Nouveau paquet"
-
-#: spyderlib/widgets/explorer.py:593
-msgid "Package name:"
-msgstr "Nom du paquet :"
-
-#: spyderlib/widgets/explorer.py:632
-msgid "New module"
-msgstr "Nouveau module"
-
-#: spyderlib/widgets/explorer.py:646
-msgid "<b>Unable to find external program.</b><br><br>%s"
-msgstr "<b>Impossible de trouver un programme externe.</b><br><br>%s"
-
-#: spyderlib/widgets/explorer.py:846
-msgid "Show current directory only"
-msgstr "Afficher uniquement le répertoire courant"
-
-#: spyderlib/widgets/explorer.py:953
-msgid "Show toolbar"
-msgstr "Afficher la barre d'outils"
-
-#: spyderlib/widgets/explorer.py:964 spyderlib/widgets/importwizard.py:481
-msgid "Previous"
-msgstr "Précédent"
-
-#: spyderlib/widgets/explorer.py:980
-msgid "Parent"
-msgstr "Parent"
-
-#: spyderlib/widgets/externalshell/baseshell.py:139
-msgid "Run again this program"
-msgstr "Exécuter de nouveau ce programme"
-
-#: spyderlib/widgets/externalshell/baseshell.py:142
-msgid "Kill"
-msgstr "Terminer"
-
-#: spyderlib/widgets/externalshell/baseshell.py:144
-msgid "Kills the current process, causing it to exit immediately"
-msgstr ""
-"Tue le processus, entraînant une sortie brutale et immédiate du programme"
-
-#: spyderlib/widgets/externalshell/baseshell.py:212
-msgid "<span style='color: #44AA44'><b>Running...</b></span>"
-msgstr "<span style='color: #44AA44'><b>En cours d'exécution...</b></span>"
-
-#: spyderlib/widgets/externalshell/baseshell.py:219
-msgid "Terminated."
-msgstr "Terminé."
-
-#: spyderlib/widgets/externalshell/baseshell.py:234
-#: spyderlib/widgets/mixins.py:509
-msgid "Arguments"
-msgstr "Arguments"
-
-#: spyderlib/widgets/externalshell/baseshell.py:235
-msgid "Command line arguments:"
-msgstr "Arguments en ligne de commande :"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:175
-msgid "Refresh"
-msgstr "Rafraîchir"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:179
-msgid "Refresh periodically"
-msgstr "Rafraîchir périodiquement"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:183
-#: spyderlib/widgets/externalshell/namespacebrowser.py:421
-msgid "Import data"
-msgstr "Importer des données"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:186
-#: spyderlib/widgets/externalshell/namespacebrowser.py:511
-#: spyderlib/widgets/externalshell/namespacebrowser.py:532
-msgid "Save data"
-msgstr "Enregistrer les données"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:191
-msgid "Save data as..."
-msgstr "Enregistrer les données sous..."
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:199
-msgid "Exclude references which name starts with an underscore"
-msgstr "Exclure les références dont le nom commence par un tiret bas"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:207
-msgid "Exclude references which name is uppercase"
-msgstr "Exclure les références dont le nom s'écrit en lettres capitales"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:214
-msgid "Exclude references which name starts with an uppercase character"
-msgstr "Exclure les références dont le nom commence par une lettre majuscule"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:222
-msgid ""
-"Exclude references to unsupported data types (i.e. which won't be handled/"
-"saved correctly)"
-msgstr ""
-"Exclure les références dont le type n'est pas supporté par l'espace de "
-"travail (en particulier, l'enregistrement ne fonctionnera pas)"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:338
-msgid "Object <b>%s</b> is not picklable"
-msgstr ""
-"L'objet <b>%s</b> n'est pas pris en charge par le protocole de sérialisation "
-"de <i>Pickle</i>"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:443
-msgid ""
-"<b>Unsupported file extension '%s'</b><br><br>Would you like to import it "
-"anyway (by selecting a known file format)?"
-msgstr ""
-"<b>Extension de fichier non pris en charge '%s'</b><br><br>Souhaitez-vous "
-"néanmoins ouvrir ce fichier (en choisissant un format de fichier connu) ?"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:451
-msgid "Open file as:"
-msgstr "Ouvrir le fichier en tant que :"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:499
-msgid "<b>Unable to load '%s'</b><br><br>Error message:<br>%s"
-msgstr "<b>Impossible d'ouvrir '%s'</b><br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:533
-msgid "<b>Unable to save current workspace</b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible d'enregistrer l'espace de travail</b><br><br>Message d'erreur :"
-"<br>%s"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:268
-msgid "Variables"
-msgstr "Variables"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:269
-msgid "Show/hide global variables explorer"
-msgstr "Afficher/masquer l'explorateur de variables globales"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:273
-msgid "Terminate"
-msgstr "Quitter"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:274
-msgid ""
-"Attempts to terminate the process.\n"
-"The process may not exit as a result of clicking this button\n"
-"(it is given the chance to prompt the user for any unsaved files, etc)."
-msgstr ""
-"Tentative de fermeture du processus.\n"
-"Le processus peut ne pas s'arrêter suite à cette tentative,\n"
-"mais cela permet au programme en cours de quitter proprement."
-
-#: spyderlib/widgets/externalshell/pythonshell.py:286
-msgid "Interact"
-msgstr "Interagir"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:288
-msgid "Debug"
-msgstr "Déboguer"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:290
-#: spyderlib/widgets/externalshell/pythonshell.py:353
-msgid "Arguments..."
-msgstr "Arguments..."
-
-#: spyderlib/widgets/externalshell/pythonshell.py:297
-msgid "Set current working directory"
-msgstr "Changer le répertoire de travail"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:299
-msgid "Environment variables"
-msgstr "Variables d'environnement"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:303
-msgid "Show sys.path contents"
-msgstr "Afficher le contenu de sys.path"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:349
-msgid "Arguments: %s"
-msgstr "Arguments : %s"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:351
-msgid "No argument"
-msgstr "Aucun argument"
-
-#: spyderlib/widgets/externalshell/pythonshell.py:521
-#, fuzzy
-msgid "A Python or IPython Console failed to start!"
-msgstr "Ouvrir une console IPython au démarrage"
-
-#: spyderlib/widgets/externalshell/systemshell.py:92
-msgid "Process failed to start"
-msgstr "Le processus n'a pas pu démarrer"
-
-#: spyderlib/widgets/findinfiles.py:154
-msgid "Unexpected error: see internal console"
-msgstr "Erreur inattendue : voir console interne"
-
-#: spyderlib/widgets/findinfiles.py:206 spyderlib/widgets/findinfiles.py:230
-#: spyderlib/widgets/findinfiles.py:276
-msgid "invalid regular expression"
-msgstr "expression régulière incorrecte"
-
-#: spyderlib/widgets/findinfiles.py:274
-msgid "permission denied errors were encountered"
-msgstr "des erreurs d'autorisation d'accès ont été rencontrées"
-
-#: spyderlib/widgets/findinfiles.py:308
-msgid "Search pattern"
-msgstr "Expression recherchée"
-
-#: spyderlib/widgets/findinfiles.py:311 spyderlib/widgets/findinfiles.py:345
-#: spyderlib/widgets/findinfiles.py:357 spyderlib/widgets/findreplace.py:81
-msgid "Regular expression"
-msgstr "Expression régulière"
-
-#: spyderlib/widgets/findinfiles.py:320
-msgid "Search"
-msgstr "Rechercher"
-
-#: spyderlib/widgets/findinfiles.py:323
-msgid "Start search"
-msgstr "Démarrer la recherche"
-
-#: spyderlib/widgets/findinfiles.py:326
-msgid "Stop"
-msgstr "Arrêter"
-
-#: spyderlib/widgets/findinfiles.py:329
-msgid "Stop search"
-msgstr "Arrêter la recherche"
-
-#: spyderlib/widgets/findinfiles.py:339
-msgid "Included filenames pattern"
-msgstr "Expression des noms de fichier à inclure"
-
-#: spyderlib/widgets/findinfiles.py:348
-msgid "Include:"
-msgstr "Inclure :"
-
-#: spyderlib/widgets/findinfiles.py:351
-msgid "Excluded filenames pattern"
-msgstr "Expression des noms de fichier à exclure"
-
-#: spyderlib/widgets/findinfiles.py:360
-msgid "Exclude:"
-msgstr "Exclure :"
-
-#: spyderlib/widgets/findinfiles.py:370
-msgid "PYTHONPATH"
-msgstr "PYTHONPATH"
-
-#: spyderlib/widgets/findinfiles.py:372
-msgid ""
-"Search in all directories listed in sys.path which are outside the Python "
-"installation directory"
-msgstr ""
-"Rechercher dans tous les répertoires listés dans sys.path qui sont situés en "
-"dehors du répertoire d'installation de Python"
-
-#: spyderlib/widgets/findinfiles.py:375
-msgid "Hg repository"
-msgstr "Dépôt Mercurial"
-
-#: spyderlib/widgets/findinfiles.py:378
-msgid "Search in current directory hg repository"
-msgstr "Rechercher dans le dépôt Mercurial du répertoire courant"
-
-#: spyderlib/widgets/findinfiles.py:379
-msgid "Here:"
-msgstr "Ici :"
-
-#: spyderlib/widgets/findinfiles.py:383
-msgid "Search recursively in this directory"
-msgstr "Rechercher de manière récursive dans ce répertoire"
-
-#: spyderlib/widgets/findinfiles.py:391
-msgid "Browse a search directory"
-msgstr "Sélectionner un répertoire de recherche"
-
-#: spyderlib/widgets/findinfiles.py:424
-msgid "Hide advanced options"
-msgstr "Masquer les options avancées"
-
-#: spyderlib/widgets/findinfiles.py:427
-msgid "Show advanced options"
-msgstr "Afficher les options avancées"
-
-#: spyderlib/widgets/findinfiles.py:569
-msgid "Search canceled"
-msgstr "Recherche annulée"
-
-#: spyderlib/widgets/findinfiles.py:573
-msgid "String not found"
-msgstr "Chaîne de caractères non trouvée"
-
-#: spyderlib/widgets/findinfiles.py:575
-msgid "matches in"
-msgstr "correspondances trouvées dans"
-
-#: spyderlib/widgets/findinfiles.py:576
-msgid "file"
-msgstr "fichier"
-
-#: spyderlib/widgets/findinfiles.py:584
-msgid "interrupted"
-msgstr "interrompu"
-
-#: spyderlib/widgets/findreplace.py:61
-msgid "Search string"
-msgstr "Chaîne de caractères à rechercher"
-
-#: spyderlib/widgets/findreplace.py:88
-msgid "Case Sensitive"
-msgstr "Respecter la casse"
-
-#: spyderlib/widgets/findreplace.py:95
-msgid "Whole words"
-msgstr "Mots entiers"
-
-#: spyderlib/widgets/findreplace.py:102
-msgid "Highlight matches"
-msgstr "Surligner les résultats"
-
-#: spyderlib/widgets/findreplace.py:117
-msgid "Replace with:"
-msgstr "Remplacer par :"
-
-#: spyderlib/widgets/findreplace.py:119
-msgid "Replace string"
-msgstr "Chaîne de caractères de remplacement"
-
-#: spyderlib/widgets/findreplace.py:122
-msgid "Replace/find"
-msgstr "Remplacer/rechercher"
-
-#: spyderlib/widgets/findreplace.py:131
-msgid "Replace all"
-msgstr "Remplacer tout"
-
-#: spyderlib/widgets/importwizard.py:101
-msgid "Import as"
-msgstr "Importer en tant que"
-
-#: spyderlib/widgets/importwizard.py:103
-msgid "data"
-msgstr "données"
-
-#: spyderlib/widgets/importwizard.py:107
-msgid "code"
-msgstr "code"
-
-#: spyderlib/widgets/importwizard.py:110 spyderlib/widgets/importwizard.py:456
-msgid "text"
-msgstr "texte"
-
-#: spyderlib/widgets/importwizard.py:122
-msgid "Column separator:"
-msgstr "Séparateur de colonne :"
-
-#: spyderlib/widgets/importwizard.py:126
-msgid "Tab"
-msgstr "Tab"
-
-#: spyderlib/widgets/importwizard.py:129 spyderlib/widgets/importwizard.py:147
-msgid "other"
-msgstr "autre"
-
-#: spyderlib/widgets/importwizard.py:140
-msgid "Row separator:"
-msgstr "Séparateur de ligne :"
-
-#: spyderlib/widgets/importwizard.py:144
-msgid "EOL"
-msgstr "EOL"
-
-#: spyderlib/widgets/importwizard.py:160
-msgid "Additionnal options"
-msgstr "Options supplémentaires"
-
-#: spyderlib/widgets/importwizard.py:164
-msgid "Skip rows:"
-msgstr "Sauter des lignes :"
-
-#: spyderlib/widgets/importwizard.py:175
-msgid "Comments:"
-msgstr "Commentaires :"
-
-#: spyderlib/widgets/importwizard.py:181
-msgid "Transpose"
-msgstr "Transposer"
-
-#: spyderlib/widgets/importwizard.py:403
-msgid "Import as array"
-msgstr "Importer en tant que tableau"
-
-#: spyderlib/widgets/importwizard.py:439 spyderlib/widgets/importwizard.py:530
-msgid "Import wizard"
-msgstr "Assistant d'importation"
-
-#: spyderlib/widgets/importwizard.py:444
-msgid "Raw text"
-msgstr "Text brut"
-
-#: spyderlib/widgets/importwizard.py:447
-msgid "variable_name"
-msgstr "nom_de_variable"
-
-#: spyderlib/widgets/importwizard.py:458
-msgid "table"
-msgstr "tableau"
-
-#: spyderlib/widgets/importwizard.py:459
-msgid "Preview"
-msgstr "Aperçu"
-
-#: spyderlib/widgets/importwizard.py:475
-msgid "Cancel"
-msgstr "Annuler"
-
-#: spyderlib/widgets/importwizard.py:490
-msgid "Done"
-msgstr "Terminer"
-
-#: spyderlib/widgets/importwizard.py:531
-msgid ""
-"<b>Unable to proceed to next step</b><br><br>Please check your entries."
-"<br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible de passer à l'étape suivante</b><br><br>Merci de vérifier "
-"votre saisie.<br><br>Message d'erreur :<br>%s"
-
-#: spyderlib/widgets/internalshell.py:246
-msgid "Help..."
-msgstr "Aide..."
-
-#: spyderlib/widgets/internalshell.py:262
-msgid "Shell special commands:"
-msgstr "Commandes spéciales de la console :"
-
-#: spyderlib/widgets/internalshell.py:263
-msgid "Internal editor:"
-msgstr "Éditeur interne :"
-
-#: spyderlib/widgets/internalshell.py:264
-msgid "External editor:"
-msgstr "Éditeur externe :"
-
-#: spyderlib/widgets/internalshell.py:265
-msgid "Run script:"
-msgstr "Exécuter un script :"
-
-#: spyderlib/widgets/internalshell.py:266
-msgid "Remove references:"
-msgstr "Supprimer des références :"
-
-#: spyderlib/widgets/internalshell.py:267
-msgid "System commands:"
-msgstr "Commandes systèmes :"
-
-#: spyderlib/widgets/internalshell.py:268
-msgid "Python help:"
-msgstr "Aide Python :"
-
-#: spyderlib/widgets/internalshell.py:269
-msgid "GUI-based editor:"
-msgstr "Éditeur graphique :"
-
-#: spyderlib/widgets/mixins.py:514
-msgid "Documentation"
-msgstr "Documentation"
-
-#: spyderlib/widgets/onecolumntree.py:63
-msgid "Collapse all"
-msgstr "Replier tout"
-
-#: spyderlib/widgets/onecolumntree.py:67
-msgid "Expand all"
-msgstr "Déplier tout"
-
-#: spyderlib/widgets/onecolumntree.py:71
-msgid "Restore"
-msgstr "Restaurer"
-
-#: spyderlib/widgets/onecolumntree.py:72
-msgid "Restore original tree layout"
-msgstr "Restaurer l'organisation initiale de l'arbre"
-
-#: spyderlib/widgets/onecolumntree.py:76
-msgid "Collapse selection"
-msgstr "Replier la sélection"
-
-#: spyderlib/widgets/onecolumntree.py:80
-msgid "Expand selection"
-msgstr "Déplier la sélection"
-
-#: spyderlib/widgets/pathmanager.py:83
-msgid "Move to top"
-msgstr "Placer en premier"
-
-#: spyderlib/widgets/pathmanager.py:89
-msgid "Move up"
-msgstr "Monter"
-
-#: spyderlib/widgets/pathmanager.py:95
-msgid "Move down"
-msgstr "Descendre"
-
-#: spyderlib/widgets/pathmanager.py:101
-msgid "Move to bottom"
-msgstr "Placer en dernier"
-
-#: spyderlib/widgets/pathmanager.py:112 spyderlib/widgets/pathmanager.py:224
-msgid "Add path"
-msgstr "Ajouter un chemin"
-
-#: spyderlib/widgets/pathmanager.py:117 spyderlib/widgets/pathmanager.py:208
-msgid "Remove path"
-msgstr "Supprimer"
-
-#: spyderlib/widgets/pathmanager.py:127
-msgid "Synchronize..."
-msgstr "Synchroniser..."
-
-#: spyderlib/widgets/pathmanager.py:129
-msgid "Synchronize Spyder's path list with PYTHONPATH environment variable"
-msgstr ""
-"Synchronise la liste des chemins d'accès de Spyder avec celle de la variable "
-"d'environnement PYTHONPATH"
-
-#: spyderlib/widgets/pathmanager.py:140
-msgid "Synchronize"
-msgstr "Synchroniser"
-
-#: spyderlib/widgets/pathmanager.py:141
-msgid ""
-"This will synchronize Spyder's path list with <b>PYTHONPATH</b> environment "
-"variable for current user, allowing you to run your Python modules outside "
-"Spyder without having to configure sys.path. <br>Do you want to clear "
-"contents of PYTHONPATH before adding Spyder's path list?"
-msgstr ""
-"Ceci synchronisera la liste des chemins d'accès de Spyder avec celle de la "
-"variable d'environnement <b>PYTHONPATH</b> pour l'utilisateur courant, vous "
-"permettant ainsi d'exécuter vos modules Python en dehors de Spyder sans "
-"avoir besoin de configurer sys.path. <br>Souhaitez-vous effacer le contenu "
-"de PYTHONPATH avant d'y ajouter la liste des chemins d'accès de Spyder ?"
-
-#: spyderlib/widgets/pathmanager.py:209
-msgid "Do you really want to remove selected path?"
-msgstr "Souhaitez-vous vraiment supprimer le chemin sélectionné ?"
-
-#: spyderlib/widgets/pathmanager.py:225
-msgid ""
-"This directory is already included in Spyder path list.<br>Do you want to "
-"move it to the top of the list?"
-msgstr ""
-"Ce répertoire est déjà inclus dans la liste des chemins d'accès de Spyder."
-"<br>Souhaitez-vous le placer en début de liste ?"
-
-#: spyderlib/widgets/projectexplorer.py:332
-msgid "its own configuration file"
-msgstr "son propre fichier de configuration"
-
-#: spyderlib/widgets/projectexplorer.py:338
-msgid "the following projects:<br>%s"
-msgstr "les projets suivants :<br>%s"
-
-#: spyderlib/widgets/projectexplorer.py:540
-msgid "Project..."
-msgstr "Projet..."
-
-#: spyderlib/widgets/projectexplorer.py:553
-msgid "Existing directory"
-msgstr "Répertoire existant"
-
-#: spyderlib/widgets/projectexplorer.py:557
-msgid "Existing Spyder project"
-msgstr "Projet Spyder existant"
-
-#: spyderlib/widgets/projectexplorer.py:561
-msgid "Existing Pydev project"
-msgstr "Projet Pydev existant"
-
-#: spyderlib/widgets/projectexplorer.py:578
-msgid "Open project"
-msgstr "Ouvrir le projet"
-
-#: spyderlib/widgets/projectexplorer.py:583
-msgid "Close project"
-msgstr "Fermer le projet"
-
-#: spyderlib/widgets/projectexplorer.py:588
-msgid "Close unrelated projects"
-msgstr "Fermer les projets non associés"
-
-#: spyderlib/widgets/projectexplorer.py:597
-msgid "Edit related projects"
-msgstr "Modifier les projets associés"
-
-#: spyderlib/widgets/projectexplorer.py:605
-msgid "Add to PYTHONPATH"
-msgstr "Ajouter à PYTHONPATH"
-
-#: spyderlib/widgets/projectexplorer.py:610
-msgid "Remove from PYTHONPATH"
-msgstr "Retirer de PYTHONPATH"
-
-#: spyderlib/widgets/projectexplorer.py:615
-msgid "Properties"
-msgstr "Propriétés"
-
-#: spyderlib/widgets/projectexplorer.py:650
-msgid "Show horizontal scrollbar"
-msgstr "Barre de défilement horizontale"
-
-#: spyderlib/widgets/projectexplorer.py:683
-msgid "Workspace"
-msgstr "Espace de travail"
-
-#: spyderlib/widgets/projectexplorer.py:684
-msgid ""
-"The workspace was unable to load or save %s<br><br>Please check if you have "
-"the permission to write the associated configuration files."
-msgstr ""
-"L'espace de travail n'est pas parvenu à ouvrir ou enregistrer "
-"%s<br><br>Veuillez vérifier que vous disposez bien des droits d'écriture sur "
-"les fichiers de configuration associés."
-
-#: spyderlib/widgets/projectexplorer.py:743
-msgid "Import directory"
-msgstr "Importer un répertoire"
-
-#: spyderlib/widgets/projectexplorer.py:745
-msgid ""
-"The following directory is not in workspace:<br><b>%s</b><br><br>Do you want "
-"to continue (and copy the directory to workspace)?"
-msgstr ""
-"Le répertoire suivant n'est pas dans l'espace de travail :<br><b>%s</"
-"b><br><br>Souhaitez-vous continuer (et copier ce répertoire dans l'espace de "
-"travail) ?"
-
-#: spyderlib/widgets/projectexplorer.py:763
-#: spyderlib/widgets/projectexplorer.py:1166
-msgid "copy"
-msgstr "copier"
-
-#: spyderlib/widgets/projectexplorer.py:814
-msgid "The project <b>%s</b> is already opened!"
-msgstr "Le projet <b>%s</b> est déjà ouvert !"
-
-#: spyderlib/widgets/projectexplorer.py:821
-msgid ""
-"The project root path directory is inside the workspace but not as the "
-"expected tree level. It is not a directory of the workspace:<br><b>%s</b>"
-msgstr ""
-"Le répertoire racine du projet est bien à l'intérieur de l'espace de travail "
-"mais pas au niveau d'arborescence attendu. Ce n'est pas un répertoire de "
-"l'espace de travail :<br><b>%s</b>"
-
-#: spyderlib/widgets/projectexplorer.py:832
-msgid "Project name:"
-msgstr "Nom du projet :"
-
-#: spyderlib/widgets/projectexplorer.py:841
-msgid "A project named <b>%s</b> already exists"
-msgstr "Un projet nommé <b>%s</b> existe déjà"
-
-#: spyderlib/widgets/projectexplorer.py:846
-msgid ""
-"Invalid project name.<br><br>Name must match the following regular "
-"expression:<br><b>%s</b>"
-msgstr ""
-"Nom de projet incorrect.<br><br>Le nom doit respecter l'expression régulière "
-"suivante :<br><b>%s</b>"
-
-#: spyderlib/widgets/projectexplorer.py:853
-msgid ""
-"The following directory is not empty:<br><b>%s</b><br><br>Do you want to "
-"continue?"
-msgstr ""
-"Le répertoire suivant n'est pas vide :<br><b>%s</b><br><br>Souhaitez-vous "
-"néanmoins continuer ?"
-
-#: spyderlib/widgets/projectexplorer.py:865
-msgid "New project"
-msgstr "Nouveau projet"
-
-#: spyderlib/widgets/projectexplorer.py:873
-msgid ""
-"The current workspace has not been configured yet.\n"
-"Do you want to do this now?"
-msgstr ""
-"L'espace de travail n'a pas encore été défini.\n"
-"Souhaitez-vous le faire maintenant ?"
-
-#: spyderlib/widgets/projectexplorer.py:910
-msgid "Import existing project"
-msgstr "Importer un projet existant"
-
-#: spyderlib/widgets/projectexplorer.py:923
-msgid "Select projects to import"
-msgstr "Sélectionner les projets à importer"
-
-#: spyderlib/widgets/projectexplorer.py:935
-msgid "The folder <i>%s</i> does not contain a valid %s project"
-msgstr "Le dossier <i>%s</i> ne contient pas de projet %s valide"
-
-#: spyderlib/widgets/projectexplorer.py:963
-msgid "Import existing Pydev project"
-msgstr "Importer un projet Pydev"
-
-#: spyderlib/widgets/projectexplorer.py:964
-msgid ""
-"<b>Unable to read Pydev project <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible d'ouvrir le projet Pydev <i>%s</i></b><br><br>Message "
-"d'erreur :<br>%s"
-
-#: spyderlib/widgets/projectexplorer.py:1001
-msgid ""
-"Do you really want to delete project <b>%s</b>?<br><br>Note: project files "
-"won't be deleted from disk."
-msgstr ""
-"Souhaitez-vous réellement supprimer le projet <b>%s</b> ?<br><br>Notez que "
-"les fichiers et répertoires du projet ne seront pas supprimés du disque."
-
-#: spyderlib/widgets/projectexplorer.py:1054
-msgid "Related projects"
-msgstr "Projets associés"
-
-#: spyderlib/widgets/projectexplorer.py:1062
-msgid "Select projects which are related to <b>%s</b>"
-msgstr "Sélectionner les projets à associer à <b>%s</b>"
-
-#: spyderlib/widgets/projectexplorer.py:1087
-msgid ""
-"Statistics on source files only:<br>(Python, C/C++, Fortran)<br><br><b>%s</"
-"b> files.<br><b>%s</b> lines of code."
-msgstr ""
-"Statistique sur les fichiers source uniquement:<br>(Python, C/C++, Fortran)"
-"<br><br><b>%s</b> fichiers.<br><b>%s</b> lignes de code."
-
-#: spyderlib/widgets/projectexplorer.py:1134
-msgid "File <b>%s</b> already exists.<br>Do you want to overwrite it?"
-msgstr "Le fichier <b>%s</b> existe déjà.<br>Souhaitez-vous le remplacer ?"
-
-#: spyderlib/widgets/projectexplorer.py:1148
-msgid "Folder <b>%s</b> already exists."
-msgstr "Le dossier <b>%s</b> existe déjà."
-
-#: spyderlib/widgets/projectexplorer.py:1168
-msgid "move"
-msgstr "déplacer"
-
-#: spyderlib/widgets/projectexplorer.py:1177
-msgid "Select an existing workspace directory, or create a new one"
-msgstr "Sélectionner un espace de travail existant, ou en créer un nouveau"
-
-#: spyderlib/widgets/projectexplorer.py:1178
-msgid ""
-"<u><b>What is the workspace?</b></u><br><br>A <b>Spyder workspace</b> is a "
-"directory on your filesystem that contains Spyder projects and <b>."
-"spyderworkspace</b> configuration file.<br><br>A <b>Spyder project</b> is a "
-"directory with source code (and other related files) and a configuration "
-"file (named <b>.spyderproject</b>) with project settings (PYTHONPATH, linked "
-"projects, ...).<br>"
-msgstr ""
-"<u><b>Qu'est-ce que l'espace de travail ?</b></u><br><br>L'<b>espace de "
-"travail Spyder</b> est un répertoire de votre système de fichiers qui "
-"contient les projets Spyder et le fichier de configuration <b>."
-"spyderworkspace</b>.<br><br>Un <b>projet Spyder</b> est un répertoire "
-"contenant du code source (et d'autres fichiers) ainsi qu'un fichier de "
-"configuration (nommé <b>.spyderproject</b>) dans lequel sont stockés les "
-"réglages du projet (PYTHONPATH, projets liés, ...).<br>"
-
-#: spyderlib/widgets/projectexplorer.py:1205
-msgid "This is the current workspace directory"
-msgstr "Ceci est l'espace de travail actif"
-
-#: spyderlib/widgets/projectexplorer.py:1236
-msgid ""
-"The following directory is not a Spyder workspace:<br>%s<br><br>Do you want "
-"to create a new workspace in this directory?"
-msgstr ""
-"Le répertoire suivant n'est pas un espace de travail Spyder :<br><b>%s</"
-"b><br><br>Souhaitez-vous créer un nouvel espace de travail dans ce "
-"répertoire ?"
-
-#: spyderlib/widgets/pydocgui.py:86
-msgid "Module or package:"
-msgstr "Module ou paquet :"
-
-#: spyderlib/widgets/shell.py:126
-msgid "Save history log..."
-msgstr "Enregistrer l'historique..."
-
-#: spyderlib/widgets/shell.py:128
-msgid "Save current history log (i.e. all inputs and outputs) in a text file"
-msgstr ""
-"Enregistrer l'historique complet (toutes les entrées et sorties) dans un "
-"fichier texte"
-
-#: spyderlib/widgets/shell.py:248
-msgid "Save history log"
-msgstr "Enregistrer l'historique"
-
-#: spyderlib/widgets/shell.py:251
-msgid "History logs"
-msgstr "Fichiers d'historique"
-
-#: spyderlib/widgets/shell.py:261
-msgid "<b>Unable to save file '%s'</b><br><br>Error message:<br>%s"
-msgstr ""
-"<b>Impossible d'enregistrer le fichier '%s'</b><br><br>Message d'erreur :<br>"
-"%s"
-
-#: spyderlib/widgets/shell.py:681
-msgid "Copy without prompts"
-msgstr "Copier sans les préfixes"
-
-#: spyderlib/widgets/shell.py:684 spyderlib/widgets/shell.py:687
-msgid "Clear line"
-msgstr "Effacer la ligne"
-
-#: spyderlib/widgets/shell.py:689
-msgid "Clear shell"
-msgstr "Effacer la console"
-
-#: spyderlib/widgets/shell.py:692
-msgid "Clear shell contents ('cls' command)"
-msgstr "Effacer le contenu de la console"
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:68
-msgid "Editor's code completion, go-to-definition and help"
-msgstr "Editeur : complétion de code, aller à la définition, etc."
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:249
-msgid "Go to line:"
-msgstr "Aller à la ligne :"
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:258
-msgid "Line count:"
-msgstr "Nombre de lignes :"
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:1193
-msgid "Breakpoint"
-msgstr "Point d'arrêt"
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:1194
-msgid "Condition:"
-msgstr "Condition :"
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:1641
-msgid "To do"
-msgstr "À faire"
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:2219
-msgid "Go to definition"
-msgstr "Aller à la définition de l'objet"
-
-#: spyderlib/widgets/status.py:82
-msgid "Memory:"
-msgstr "Mémoire :"
-
-#: spyderlib/widgets/status.py:83
-msgid ""
-"Memory usage status: requires the `psutil` (>=v0.3) library on non-Windows "
-"platforms"
-msgstr ""
-"Occupation mémoire : requiert la bibliothèque `psutil` (>=v0.3) sur les "
-"plateformes autres que Windows"
-
-#: spyderlib/widgets/status.py:95
-msgid "CPU:"
-msgstr "CPU :"
-
-#: spyderlib/widgets/status.py:96
-msgid "CPU usage status: requires the `psutil` (>=v0.3) library"
-msgstr "Occupation CPU : requiert la bibliothèque `psutil` (>=v0.3)"
-
-#: spyderlib/widgets/status.py:118
-msgid "Permissions:"
-msgstr "Droits d'accès :"
-
-#: spyderlib/widgets/status.py:132
-msgid "End-of-lines:"
-msgstr "Fins de ligne :"
-
-#: spyderlib/widgets/status.py:146
-msgid "Encoding:"
-msgstr "Encodage :"
-
-#: spyderlib/widgets/status.py:159
-msgid "Line:"
-msgstr "Ligne :"
-
-#: spyderlib/widgets/status.py:163
-msgid "Column:"
-msgstr "Colonne :"
-
-#: spyderlib/widgets/tabs.py:123
-msgid "Browse tabs"
-msgstr "Naviguer dans les onglets"
-
-#: spyderlib/widgets/tabs.py:246
-msgid "Close current tab"
-msgstr "Fermer l'onglet"
-
-#: spyderlib/widgets/texteditor.py:62
-msgid "Text editor"
-msgstr "Éditeur de texte"
-
-#~ msgid "Create a new Python script"
-#~ msgstr "Créer un nouveau script Python"
-
-#~ msgid "Open text file"
-#~ msgstr "Ouvrir un fichier texte"
-
-#~ msgid "Save current file"
-#~ msgstr "Enregistrer le fichier en cours d'édition"
-
-#~ msgid ""
-#~ "Run current cell \n"
-#~ "(see Editor documentation \n"
-#~ "for more details on cells)"
-#~ msgstr ""
-#~ "Exécuter la cellule en cours d'édition\n"
-#~ "(voir la documentation de l'Editeur, pour plus de détails sur les "
-#~ "cellules)"
-
-#~ msgid "Open Spyder path manager"
-#~ msgstr "Ouvre le gestionnaire de chemin d'accès de Spyder"
-
-#~ msgid "Maximize current plugin to fit the whole application window"
-#~ msgstr ""
-#~ "Agrandir la fenêtre courante sur toute la surface de la fenêtre principale"
-
-#~ msgid ""
-#~ "Restore current plugin to its original size and position within the "
-#~ "application window"
-#~ msgstr ""
-#~ "Réduire la fenêtre courante à sa taille et position d'origine au sein de "
-#~ "la fenêtre principale"
-
-#, fuzzy
-#~ msgid ""
-#~ "Run current cell \n"
-#~ "(see Editor section in documentation \n"
-#~ "for more details on cells) \n"
-#~ "and advance to the next cell"
-#~ msgstr ""
-#~ "Exécuter le bloc (voir la section 'Editor' de la documentation) \n"
-#~ "et avancer jusqu'au bloc suivant"
-
-#~ msgid "Run &selection or current block"
-#~ msgstr "Exécuter la &sélection ou le bloc de lignes"
-
-#~ msgid "Version"
-#~ msgstr "Version"
-
-#~ msgid "Status"
-#~ msgstr "Etat"
-
-#~ msgid "Run &selection or block (sep.: %s)"
-#~ msgstr "Exécuter la &sélection ou le bloc (sép. : %s)"
-
-#~ msgid "Step Over"
-#~ msgstr "Pas en avant"
-
-#~ msgid "Debug current script in selected console"
-#~ msgstr "Déboguer le script courant dans la console sélectionnée"
-
-#~ msgid "Debug Step Over"
-#~ msgstr "Pas en avant (débogage)"
-
-#~ msgid "Debug Continue"
-#~ msgstr "Continuer (débogage)"
-
-#~ msgid "Debug Step Into"
-#~ msgstr "Pas vers l'intérieur (débogage)"
-
-#~ msgid "Debug Step Return"
-#~ msgstr "Pas vers l'extérieur (débogage)"
-
-#~ msgid ""
-#~ "Run selected script in\n"
-#~ "current console"
-#~ msgstr "Exécuter le script sélectionné dans la console courante"
-
-#~ msgid "Edit Run settings"
-#~ msgstr "Modifier les options d'exécution"
-
-#~ msgid ""
-#~ "Run again last script in current\n"
-#~ "console with the same options"
-#~ msgstr ""
-#~ "Exécuter de nouveau le dernier script dans la console courante avec les "
-#~ "mêmes options"
-
-#~ msgid ""
-#~ "Run selected text or current block\n"
-#~ "of lines inside current console"
-#~ msgstr ""
-#~ "Exécuter le texte sélectionné ou le bloc de lignes \n"
-#~ "dans l'interpréteur de la console courante"
-
-#~ msgid "Run active script in a new Python interpreter"
-#~ msgstr "Exécuter le script actuel dans un nouvel interpréteur Python"
-
-#~ msgid ""
-#~ "Debug current script in external console\n"
-#~ "(external console is executed in a separate process)"
-#~ msgstr ""
-#~ "Déboguer le script en cours d'édition dans la console externe\n"
-#~ "(la console externe est exécutée dans un processus séparé)"
-
-#~ msgid "Edit run configurations"
-#~ msgstr "Modifier les configurations d'exécution des scripts récents"
-
-#~ msgid "Run %s"
-#~ msgstr "Exécution de %s"
-
-#~ msgid "Run configurations"
-#~ msgstr "Configurations d'exécution"
-
-#~ msgid "Type \"copyright\", \"credits\" or \"license\" for more information."
-#~ msgstr ""
-#~ "Type \"copyright\", \"credits\" or \"license\" for more information."
-
-#~ msgid "Start an IPython kernel at startup"
-#~ msgstr "Démarrer un noyau IPython au démarrage"
-
-#~ msgid "This option is not available for IPython versions prior to v0.12."
-#~ msgstr ""
-#~ "Cette option est désactivée pour les versions de IPython antérieures à "
-#~ "v0.12."
-
-#, fuzzy
-#~ msgid "Format:   "
-#~ msgstr "Format"
-
-#, fuzzy
-#~ msgid "  Source"
-#~ msgstr "Source"
-
-#~ msgid "Open &interpreter"
-#~ msgstr "Ouvrir un &interpréteur"
-
-#~ msgid "Start a new IPython kernel"
-#~ msgstr "Démarrer un nouveau noyau IPython"
-
-#~ msgid "Client"
-#~ msgstr "Client"
-
-#~ msgid "New IPython client..."
-#~ msgstr "Nouveau client IPython..."
-
-#~ msgid "Qt"
-#~ msgstr "Qt"
-
-#~ msgid "OS X"
-#~ msgstr "OS X"
-
-#~ msgid "Gtk"
-#~ msgstr "Gtk"
-
-#~ msgid "Wx"
-#~ msgstr "Wx"
-
-#~ msgid "Tkinter"
-#~ msgstr "Tkinter"
-
-#~ msgid "IPython kernels"
-#~ msgstr "Noyaux IPython"
-
-#~ msgid ""
-#~ "<b>Note:</b><br>IPython >=<u>v0.12</u> is not installed on this computer."
-#~ msgstr ""
-#~ "<b>Note :</b><br>IPython >=<u>v0.12</u> n'est pas installé sur cet "
-#~ "ordinateur."
-
-#~ msgid "Set the appropriate IPython color option"
-#~ msgstr "Utiliser le réglage de couleur IPython approprié"
-
-#~ msgid "Open an IPython interpreter at startup"
-#~ msgstr "Ouvrir un interpréteur IPython au démarrage"
-
-#~ msgid ""
-#~ "This option is not available for IPython\n"
-#~ "versions which are not fully supported\n"
-#~ "through Spyder's console (i.e. IPython v0.11+)."
-#~ msgstr ""
-#~ "Cette option est désactivée pour les versions de IPython\n"
-#~ "qui ne sont entièrement prises en charge par Spyder\n"
-#~ "à travers la console (i.e. IPython v0.11+)."
-
-#~ msgid "IPython interpreter command line options"
-#~ msgstr "IPython : options en ligne de commande"
-
-#~ msgid "Open IPython interpreter"
-#~ msgstr "Ouvrir un interpréteur IPython"
-
-#~ msgid "Open an IPython interpreter"
-#~ msgstr "Ouvrir un interpréteur IPython"
-
-#~ msgid "Open IPython here"
-#~ msgstr "Ouvrir IPython ici"
-
-#~ msgid "IPython Console"
-#~ msgstr "Console IPython"
-
-#~ msgid "Please install the %s tool named '%s'"
-#~ msgstr "Merci d'installer l'outil %s appelé '%s'"
-
-#~ msgid "Replace PyQt input hook by Spyder's"
-#~ msgstr "Remplacer le \"input hook\" de PyQt par celui de Spyder"
-
-#~ msgid "What is the workspace?"
-#~ msgstr "Qu'est-ce que l'espace de travail ?"
-
-#~ msgid ""
-#~ "A Spyder project is a folder with source code files (and any other kind "
-#~ "of related files) and a configuration file (named <b>.spyderproject</b>) "
-#~ "which stores the project settings (PYTHONPATH, related projects, ...)."
-#~ "<br><br>The workspace is a directory, which contains Spyder projects "
-#~ "(<u>top level</u> subdirectories) and a configuration file (named <b>."
-#~ "spyderworkspace</b>). "
-#~ msgstr ""
-#~ "Un projet Spyder est un répertoire contenant des fichiers source (et tout "
-#~ "autre type de fichier) et un fichier de configuration (nommé <b>."
-#~ "spyderproject</b>) qui stocke les paramètres du projet (PYTHONPATH, "
-#~ "projets associés, etc.).<br><br>L'espace de travail est un répertoire "
-#~ "contenant des projets Spyder (sous-répertoires <u>uniquement</u>) et un "
-#~ "fichier de configuration (nommé <b>.spyderworkspace</b>)."
-
-#~ msgid "Matplotlib backend (default: Qt4Agg):"
-#~ msgstr "Backend Matplotlib (valeur par défaut: Qt4Agg) :"
-
-#~ msgid "ETS_TOOLKIT (default value: qt4):"
-#~ msgstr "ETS_TOOLKIT (valeur par défaut: qt4) :"
-
-#~ msgid "&Interact"
-#~ msgstr "&Interagir"
-
-#~ msgid "Interact toolbar"
-#~ msgstr "Barre d'outil d'interaction"
-
-#~ msgid ""
-#~ "The project explorer shows a tree view of projects: the root of this tree "
-#~ "is called the workspace.<br><br>Each project is associated to a simple "
-#~ "source code folder containing a configuration file (named <b>."
-#~ "spyderproject</b>) which stores the project settings (PYTHONPATH, related "
-#~ "projects, ...). The workspace is also associated to a folder containing a "
-#~ "configuration file (named <b>.spyderworkspace</b>) <u>and</u> the folders "
-#~ "associated to its projects.<br><br>In other words, the workspace is "
-#~ "nothing but a list of projects whose associated folder share the same "
-#~ "parent directory."
-#~ msgstr ""
-#~ "L'explorateur de projet affiche une arborescence de projets dont la "
-#~ "racine est appelée l'espace de travail.<br><br>Chaque projet est associé "
-#~ "à un simple dossier de code source contenant un fichier de configuration "
-#~ "(nommé <b>.spyderproject</b>) qui stocke les paramètres du projet "
-#~ "(PYTHONPATH, projets associés, etc.). L'espace de travail est aussi "
-#~ "associé à un dossier qui contient un fichier de configuration (nommé <b>."
-#~ "spyderworkspace</b>) <u>et</u> tous les dossiers associés à ses projets."
-#~ "<br><br>En d'autres termes, l'espace de travail est simplement une liste "
-#~ "de projets dont les dossiers associés ont le même répertoire parent."
-
-#~ msgid "Browse"
-#~ msgstr "Parcourir"
-
-#~ msgid "Create a new workspace directory"
-#~ msgstr "Créer un nouvel espace de travail"
-
-#~ msgid "The directory <b>%s</b> is not a Spyder workspace."
-#~ msgstr "Le répertoire <b>%s</b> n'est pas un espace de travail Spyder."
-
-#~ msgid "New folder..."
-#~ msgstr "Nouveau répertoire..."
-
-#~ msgid "New file..."
-#~ msgstr "Nouveau fichier..."
-
-#~ msgid "Open outside Spyder"
-#~ msgstr "Ouvrir en dehors de Spyder"
-
-#~ msgid "<b>Unable to delete selected file</b><br><br>Error message:<br>%s"
-#~ msgstr ""
-#~ "<b>Impossible de supprimer le fichier sélectionné</b><br><br>Message "
-#~ "d'erreur :<br>%s"
-
-#~ msgid "<b>Unable to rename selected file</b><br><br>Error message:<br>%s"
-#~ msgstr ""
-#~ "<b>Impossible de renommer le fichier sélectionné</b><br><br>Message "
-#~ "d'erreur :<br>%s"
-
-#~ msgid "Folder name"
-#~ msgstr "Nom du répertoire"
-
-#~ msgid "project"
-#~ msgstr "projet"
-
-#~ msgid "Select project root path"
-#~ msgstr "Sélectionner la racine du projet"
-
-#~ msgid "Edit filename filter"
-#~ msgstr "Modifier le filtre des types de fichier affichés"
-
-#~ msgid "regular expressions"
-#~ msgstr "expressions régulières"
-
-#~ msgid "global patterns"
-#~ msgstr "syntaxe globale"
-
-#~ msgid "Include"
-#~ msgstr "Inclure"
-
-#~ msgid "Exclude"
-#~ msgstr "Exclure"
-
-#~ msgid "Edit filter"
-#~ msgstr "Modifier le filtre"
-
-#~ msgid "Warning:"
-#~ msgstr "Attention :"
-
-#~ msgid ""
-#~ "<i>%s</i> is not properly installed<br>(opening a terminal and typing "
-#~ "\"%s script.py\" do not work)"
-#~ msgstr ""
-#~ "<i>%s</i> n'est pas installé correctement<br>(l'exécution dans un "
-#~ "terminal de \"%s script.py\" ne fonctionne pas)"
-
-#~ msgid "More informations on style guide for Python code: %s."
-#~ msgstr ""
-#~ "Pour plus d'informations sur les recommandations de style d'écriture du "
-#~ "langage Python : %s."
-
-#~ msgid "unknown"
-#~ msgstr "inconnu"
-
-#~ msgid "Startup script:"
-#~ msgstr "Script de démarrage :"
-
-#~ msgid "Print"
-#~ msgstr "Impression"
-
-#~ msgid "<b>Unable to print document '%s'</b>"
-#~ msgstr "<b>Impossible d'imprimer le document '%s'</b>"
-
-#~ msgid "Show outline explorer"
-#~ msgstr "Afficher l'explorateur de structure"
-
-#~ msgid "Co&mment"
-#~ msgstr "Co&mmenter"
-
-#~ msgid "&Uncomment"
-#~ msgstr "&Décommenter"
-
-#~ msgid "Uncomment current line or selection"
-#~ msgstr "Décommenter la sélection ou la ligne en cours d'édition"
-
-#~ msgid "Matched braces:"
-#~ msgstr "Parenthèses correspondantes:"
-
-#~ msgid "Unmatched braces:"
-#~ msgstr "Parenthèse isolée:"
-
-#~ msgid "Please install <b>matplotlib</b>."
-#~ msgstr "Merci d'installer <b>matplotlib</b>."
-
-#~ msgid "Remote editing"
-#~ msgstr "Éditeurs dans le processus distant"
-
-#~ msgid ""
-#~ "Remote editing for NumPy arrays, PIL images, lists, tuples and "
-#~ "dictionaries"
-#~ msgstr ""
-#~ "Les tableaux NumPy, images PIL, listes, tuples et dictionnaires seront "
-#~ "modifiés dans un éditeur exécuté dans le processus distant"
-
-#~ msgid ""
-#~ "Editors are opened in the remote process for NumPy arrays, PIL images, "
-#~ "lists, tuples and dictionaries"
-#~ msgstr ""
-#~ "Les tableaux NumPy, images PIL, listes, tuples et dictionnaires seront "
-#~ "modifiés dans un éditeur exécuté dans le processus distant"
-
-#~ msgid "Open..."
-#~ msgstr "Ouvrir..."
-
-#~ msgid "Save as..."
-#~ msgstr "Enregistrer sous..."
-
-#~ msgid "Close"
-#~ msgstr "Fermer"
-
-#~ msgid "Close all"
-#~ msgstr "Fermer tout"
-
-#~ msgid "Add block comment"
-#~ msgstr "Ajouter un bloc de commentaires"
-
-#~ msgid "Remove block comment"
-#~ msgstr "Supprimer un bloc de commentaires"
-
-#~ msgid "Save all"
-#~ msgstr "Enregistrer tout"
-
-#~ msgid "Pyrex files"
-#~ msgstr "Fichiers Pyrex"
-
-#~ msgid "Print..."
-#~ msgstr "Imprimer..."
-
-#~ msgid "Re-run last script"
-#~ msgstr "Exécuter de nouveau le dernier script"
-
-#~ msgid "Close file"
-#~ msgstr "Fermer le fichier"
-
-#~ msgid "Show TODO/FIXME/XXX comments list"
-#~ msgstr "Afficher la liste des commentaires du type TODO/FIXME/XXX"
-
-#~ msgid "Configure..."
-#~ msgstr "Configurer..."
-
-#~ msgid "Previous file"
-#~ msgstr "Fichier précédent"
-
-#~ msgid "Next file"
-#~ msgstr "Fichier suivant"
-
-#~ msgid "Revert"
-#~ msgstr "Réinitialiser"
-
-#~ msgid "Add &block comment around current line or selection"
-#~ msgstr ""
-#~ "Ajouter un &bloc de commentaires autour de la sélection ou de la ligne en "
-#~ "cours d'édition"
-
-#~ msgid "Tasks (TODO, FIXME, XXX)"
-#~ msgstr "Tâches (TODO, FIXME, XXX)"
-
-#~ msgid ""
-#~ "IPython interpreter command line options:\n"
-#~ "(Qt4 support: -q4thread)\n"
-#~ "(Qt4 and matplotlib support: -q4thread -pylab)"
-#~ msgstr ""
-#~ "Options en ligne de commande de IPython :\n"
-#~ "(support Qt4 : -q4thread)\n"
-#~ "(support Qt4 et matplotlib : -q4thread -pylab)"
-
-#~ msgid ""
-#~ "PyQt installs an input hook that processes events when an interactive "
-#~ "interpreter is waiting for user input, thus allowing to interact with "
-#~ "widgets without blocking the Python shell. Unfortunately, this is not "
-#~ "working well on Windows platforms."
-#~ msgstr ""
-#~ "PyQt installe un mécanisme (\"input hook\") qui permet d'interagir avec "
-#~ "des widgets dans un interpréteur Python sans bloquer ce dernier. "
-#~ "Malheureusement, ce mécanisme ne fonctionne pas parfaitement sous Windows."
-
-#~ msgid "Replace text"
-#~ msgstr "Remplacer"
-
-#~ msgid "Find next"
-#~ msgstr "Rechercher le suivant"
-
-#~ msgid "Find previous"
-#~ msgstr "Rechercher le précédent"
-
-#~ msgid "All files (*.*)"
-#~ msgstr "Tous les fichiers (*.*)"
-
-#~ msgid "Edit filename filter..."
-#~ msgstr "Modifier le filtre des types de fichier affichés"
+msgid ""
+msgstr ""
+"Project-Id-Version: 2.1\n"
+"POT-Creation-Date: 2013-08-20 14:18+Paris, Madrid (heure dt)\n"
+"PO-Revision-Date: 2011-04-11 21:41+2\n"
+"Last-Translator: Pierre Raybaut\n"
+"Language-Team: Python\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: utf-8\n"
+"Generated-By: pygettext.py 1.5\n"
+
+#: spyderlib\config.py:46
+msgid "Python files"
+msgstr "Fichiers Python"
+
+#: spyderlib\config.py:47
+msgid "Cython/Pyrex files"
+msgstr "Fichiers Cython/Pyrex"
+
+#: spyderlib\config.py:48
+msgid "C files"
+msgstr "Fichiers C"
+
+#: spyderlib\config.py:49
+msgid "C++ files"
+msgstr "Fichiers C++"
+
+#: spyderlib\config.py:50
+msgid "OpenCL files"
+msgstr "Fichiers OpenCL"
+
+#: spyderlib\config.py:51
+msgid "Fortran files"
+msgstr "Fichiers Fortran"
+
+#: spyderlib\config.py:52
+msgid "IDL files"
+msgstr "Fichiers IDL"
+
+#: spyderlib\config.py:53
+msgid "MATLAB files"
+msgstr "Fichiers MATLAB"
+
+#: spyderlib\config.py:54
+msgid "Patch and diff files"
+msgstr "Fichiers patch et diff"
+
+#: spyderlib\config.py:55
+msgid "Batch files"
+msgstr "Fichiers Batch"
+
+#: spyderlib\config.py:56 spyderlib\utils\iofuncs.py:347
+msgid "Text files"
+msgstr "Fichiers texte"
+
+#: spyderlib\config.py:57
+msgid "reStructured Text files"
+msgstr "Fichiers reST"
+
+#: spyderlib\config.py:58
+msgid "gettext files"
+msgstr "Fichiers gettext"
+
+#: spyderlib\config.py:59
+msgid "NSIS files"
+msgstr "Fichiers NSIS"
+
+#: spyderlib\config.py:60
+msgid "Web page files"
+msgstr "Fichiers web"
+
+#: spyderlib\config.py:61
+msgid "XML files"
+msgstr "Fichiers XML"
+
+#: spyderlib\config.py:62
+msgid "Javascript files"
+msgstr "Fichiers Javascript"
+
+#: spyderlib\config.py:63
+msgid "Enaml files"
+msgstr "Fichiers Enaml"
+
+#: spyderlib\config.py:64
+msgid "Configuration files"
+msgstr "Configurations"
+
+#: spyderlib\config.py:71 spyderlib\widgets\explorer.py:621
+msgid "All files"
+msgstr "Tous les fichiers"
+
+#: spyderlib\plugins\configdialog.py:147
+msgid "Preferences"
+msgstr "Préférences"
+
+#: spyderlib\plugins\configdialog.py:428
+msgid "Invalid directory path"
+msgstr "Chemin d'accès de répertoire incorrect"
+
+#: spyderlib\plugins\configdialog.py:431 spyderlib\plugins\configdialog.py:447
+#: spyderlib\plugins\runconfig.py:169 spyderlib\plugins\runconfig.py:229
+#: spyderlib\plugins\workingdirectory.py:294 spyderlib\widgets\explorer.py:536
+#: spyderlib\widgets\externalshell\pythonshell.py:604
+#: spyderlib\widgets\findinfiles.py:504 spyderlib\widgets\pathmanager.py:218
+#: spyderlib\widgets\projectexplorer.py:889
+msgid "Select directory"
+msgstr "Sélectionner un répertoire"
+
+#: spyderlib\plugins\configdialog.py:459
+msgid "Invalid file path"
+msgstr "Chemin d'accès de fichier incorrect"
+
+#: spyderlib\plugins\configdialog.py:462 spyderlib\plugins\configdialog.py:480
+msgid "Select file"
+msgstr "Sélectionner un fichier"
+
+#: spyderlib\plugins\configdialog.py:479
+msgid "All files (*)"
+msgstr "Tous les fichiers (*)"
+
+#: spyderlib\plugins\configdialog.py:543 spyderlib\widgets\formlayout.py:213
+msgid "Bold"
+msgstr "Gras"
+
+#: spyderlib\plugins\configdialog.py:546 spyderlib\widgets\formlayout.py:208
+msgid "Italic"
+msgstr "Italique"
+
+#: spyderlib\plugins\configdialog.py:584
+msgid "Font: "
+msgstr "Police : "
+
+#: spyderlib\plugins\configdialog.py:588
+msgid "Size: "
+msgstr "Taille : "
+
+#: spyderlib\plugins\configdialog.py:597 spyderlib\plugins\history.py:45
+msgid "Font style"
+msgstr "Police d'écriture"
+
+#: spyderlib\plugins\configdialog.py:650
+msgid "General"
+msgstr "Général"
+
+#: spyderlib\plugins\configdialog.py:657 spyderlib\plugins\editor.py:95
+#: spyderlib\plugins\externalconsole.py:84
+#: spyderlib\plugins\ipythonconsole.py:71
+msgid "Interface"
+msgstr "Interface"
+
+#: spyderlib\plugins\configdialog.py:660
+msgid "Qt windows style"
+msgstr "Style de fenêtres Qt"
+
+#: spyderlib\plugins\configdialog.py:664
+msgid "Use a single instance"
+msgstr "Ouvrir une seule instance de Spyder"
+
+#: spyderlib\plugins\configdialog.py:666
+msgid ""
+"Set this to open external<br> Python files in an already running instance "
+"(Requires a restart)"
+msgstr ""
+"Activer cette option afin que les fichiers ouverts<br>depuis l'extérieur "
+"soit affichés dans une instance unique de Spyder<br>(redémarrage requis)"
+
+#: spyderlib\plugins\configdialog.py:669
+msgid "Vertical dockwidget title bars"
+msgstr "Barres de titre orientées verticalement"
+
+#: spyderlib\plugins\configdialog.py:671
+msgid "Vertical dockwidget tabs"
+msgstr "Onglets distribués verticalement"
+
+#: spyderlib\plugins\configdialog.py:673
+msgid "Animated toolbars and dockwidgets"
+msgstr "Panneaux et barres d'outils animés"
+
+#: spyderlib\plugins\configdialog.py:675
+msgid "Tear off menus"
+msgstr "Menus détachables"
+
+#: spyderlib\plugins\configdialog.py:676
+msgid "Set this to detach any<br> menu from the main window"
+msgstr ""
+"Activer cette option rend détachables tous les menus de la fenêtre principale"
+
+#: spyderlib\plugins\configdialog.py:678
+msgid "Custom dockwidget margin:"
+msgstr "Marges personnalisées :"
+
+#: spyderlib\plugins\configdialog.py:705
+msgid "Status bar"
+msgstr "Barre d'état"
+
+#: spyderlib\plugins\configdialog.py:706
+msgid "Show memory usage every"
+msgstr "Afficher l'occupation mémoire toutes les"
+
+#: spyderlib\plugins\configdialog.py:717
+msgid "Show CPU usage every"
+msgstr "Afficher la charge du CPU toutes les"
+
+#: spyderlib\plugins\configdialog.py:734
+msgid "Debugging"
+msgstr "Débogage"
+
+#: spyderlib\plugins\configdialog.py:735
+msgid "Pop up internal console when internal errors appear"
+msgstr "Afficher la console interne en cas d'erreur inattendue"
+
+#: spyderlib\plugins\configdialog.py:758
+msgid "Syntax coloring"
+msgstr "Coloration syntaxique"
+
+#: spyderlib\plugins\configdialog.py:767
+msgid "Background:"
+msgstr "Fond :"
+
+#: spyderlib\plugins\configdialog.py:768
+#: spyderlib\widgets\sourcecode\codeeditor.py:280
+msgid "Current line:"
+msgstr "Ligne actuelle :"
+
+#: spyderlib\plugins\configdialog.py:769
+msgid "Occurence:"
+msgstr "Occurence :"
+
+#: spyderlib\plugins\configdialog.py:770
+msgid "Link:"
+msgstr "Lien :"
+
+#: spyderlib\plugins\configdialog.py:771
+msgid "Side areas:"
+msgstr "Zones latérales :"
+
+#: spyderlib\plugins\configdialog.py:772
+msgid "Matched parentheses:"
+msgstr "Parenthèse fermée :"
+
+#: spyderlib\plugins\configdialog.py:773
+msgid "Unmatched parentheses:"
+msgstr "Parenthèse non fermée :"
+
+#: spyderlib\plugins\configdialog.py:774
+msgid "Normal text:"
+msgstr "Texte normal :"
+
+#: spyderlib\plugins\configdialog.py:775
+msgid "Keyword:"
+msgstr "Mot-clé :"
+
+#: spyderlib\plugins\configdialog.py:776
+msgid "Builtin:"
+msgstr "Objet intégré :"
+
+#: spyderlib\plugins\configdialog.py:777
+msgid "Definition:"
+msgstr "Définition :"
+
+#: spyderlib\plugins\configdialog.py:778
+msgid "Comment:"
+msgstr "Commentaire :"
+
+#: spyderlib\plugins\configdialog.py:779
+msgid "String:"
+msgstr "Chaîne :"
+
+#: spyderlib\plugins\configdialog.py:780
+msgid "Number:"
+msgstr "Nombre :"
+
+#: spyderlib\plugins\configdialog.py:781
+msgid "Instance:"
+msgstr "Instance :"
+
+#: spyderlib\plugins\configdialog.py:787
+msgid "Color scheme"
+msgstr "Paramètres de coloration syntaxique"
+
+#: spyderlib\plugins\configdialog.py:809 spyderlib\plugins\shortcuts.py:344
+msgid "Reset to default values"
+msgstr "Rétablir les valeurs par défaut"
+
+#: spyderlib\plugins\console.py:105
+msgid "Internal console"
+msgstr "Console interne"
+
+#: spyderlib\plugins\console.py:125 spyderlib\plugins\ipythonconsole.py:510
+#: spyderlib\spyder.py:757
+msgid "&Quit"
+msgstr "&Quitter"
+
+#: spyderlib\plugins\console.py:126 spyderlib\spyder.py:758
+msgid "Quit"
+msgstr "Quitter"
+
+#: spyderlib\plugins\console.py:129 spyderlib\plugins\externalconsole.py:1083
+msgid "&Run..."
+msgstr "Exécute&r..."
+
+#: spyderlib\plugins\console.py:130 spyderlib\plugins\externalconsole.py:1084
+msgid "Run a Python script"
+msgstr "Exécuter un script Python"
+
+#: spyderlib\plugins\console.py:133
+msgid "Environment variables..."
+msgstr "Variables d'environnement..."
+
+#: spyderlib\plugins\console.py:135
+msgid "Show and edit environment variables (for current session)"
+msgstr ""
+"Afficher et modifier les variables d'environnement (pour la session en cours)"
+
+#: spyderlib\plugins\console.py:139
+msgid "Show sys.path contents..."
+msgstr "Afficher le contenu de sys.path..."
+
+#: spyderlib\plugins\console.py:141
+msgid "Show (read-only) sys.path"
+msgstr "Afficher le contenu de sys.path (lecture seule)"
+
+#: spyderlib\plugins\console.py:144
+msgid "Buffer..."
+msgstr "Tampon..."
+
+#: spyderlib\plugins\console.py:145 spyderlib\plugins\externalconsole.py:104
+#: spyderlib\plugins\history.py:38
+msgid "Set maximum line count"
+msgstr "Modifier le nombre maximum de lignes"
+
+#: spyderlib\plugins\console.py:148 spyderlib\plugins\explorer.py:60
+#: spyderlib\plugins\history.py:153 spyderlib\plugins\inspector.py:296
+#: spyderlib\plugins\projectexplorer.py:58
+msgid "&Font..."
+msgstr "&Police..."
+
+#: spyderlib\plugins\console.py:149 spyderlib\plugins\history.py:154
+msgid "Set shell font style"
+msgstr "Changer la police d'écriture de la console"
+
+#: spyderlib\plugins\console.py:152
+msgid "External editor path..."
+msgstr "Éditeur externe..."
+
+#: spyderlib\plugins\console.py:153
+msgid "Set external editor executable path"
+msgstr "Modifier le chemin d'accès de l'éditeur externe"
+
+#: spyderlib\plugins\console.py:156 spyderlib\plugins\editor.py:133
+#: spyderlib\plugins\externalconsole.py:105 spyderlib\plugins\history.py:41
+#: spyderlib\plugins\history.py:156 spyderlib\plugins\inspector.py:96
+#: spyderlib\plugins\inspector.py:299
+msgid "Wrap lines"
+msgstr "Retour à la ligne automatique"
+
+#: spyderlib\plugins\console.py:159 spyderlib\plugins\editor.py:163
+#: spyderlib\plugins\externalconsole.py:154
+msgid "Balloon tips"
+msgstr "Info-bulles"
+
+#: spyderlib\plugins\console.py:163 spyderlib\plugins\editor.py:155
+#: spyderlib\plugins\externalconsole.py:146
+msgid "Automatic code completion"
+msgstr "Complétion de code automatique"
+
+#: spyderlib\plugins\console.py:167 spyderlib\plugins\editor.py:161
+#: spyderlib\plugins\externalconsole.py:152
+msgid "Enter key selects completion"
+msgstr "Entrée valide la complétion de code"
+
+#: spyderlib\plugins\console.py:172
+msgid "Internal console settings"
+msgstr "Options de la console interne"
+
+#: spyderlib\plugins\console.py:223 spyderlib\plugins\externalconsole.py:1257
+msgid "Run Python script"
+msgstr "Exécuter un script Python"
+
+#: spyderlib\plugins\console.py:224 spyderlib\plugins\externalconsole.py:268
+#: spyderlib\plugins\externalconsole.py:1258 spyderlib\widgets\explorer.py:635
+msgid "Python scripts"
+msgstr "Scripts Python"
+
+#: spyderlib\plugins\console.py:269 spyderlib\plugins\explorer.py:111
+#: spyderlib\plugins\history.py:271 spyderlib\plugins\inspector.py:559
+#: spyderlib\plugins\projectexplorer.py:120
+msgid "Select a new font"
+msgstr "Sélectionner une police d'écriture"
+
+#: spyderlib\plugins\console.py:276
+msgid "Buffer"
+msgstr "Tampon"
+
+#: spyderlib\plugins\console.py:277
+msgid "Maximum line count"
+msgstr "Nombre maximum de lignes"
+
+#: spyderlib\plugins\console.py:286
+msgid "External editor"
+msgstr "Éditeur externe"
+
+#: spyderlib\plugins\console.py:287
+msgid "External editor executable path:"
+msgstr "Chemin d'accès de l'exécutable :"
+
+#: spyderlib\plugins\editor.py:86 spyderlib\plugins\editor.py:512
+#: spyderlib\plugins\editor.py:1539 spyderlib\plugins\inspector.py:327
+#: spyderlib\widgets\editor.py:570
+#: spyderlib\widgets\sourcecode\codeeditor.py:270
+#: spyderlib\widgets\sourcecode\codeeditor.py:2564
+msgid "Editor"
+msgstr "Éditeur"
+
+#: spyderlib\plugins\editor.py:92
+msgid "Edit template for new modules"
+msgstr "Modifier le modèle (nouveaux modules)"
+
+#: spyderlib\plugins\editor.py:97
+msgid "Text and margin font style"
+msgstr "Police d'écriture du texte et de la marge"
+
+#: spyderlib\plugins\editor.py:100
+msgid "Sort files according to full path"
+msgstr "Classer les fichiers suivant leur chemin complet"
+
+#: spyderlib\plugins\editor.py:102
+msgid "Show tab bar"
+msgstr "Afficher la barre d'onglets"
+
+#: spyderlib\plugins\editor.py:109 spyderlib\plugins\editor.py:184
+#: spyderlib\plugins\externalconsole.py:100
+#: spyderlib\plugins\externalconsole.py:145 spyderlib\plugins\history.py:40
+#: spyderlib\plugins\inspector.py:95 spyderlib\plugins\ipythonconsole.py:106
+msgid "Source code"
+msgstr "Code source"
+
+#: spyderlib\plugins\editor.py:110
+msgid "Show line numbers"
+msgstr "Afficher les numéros de ligne"
+
+#: spyderlib\plugins\editor.py:111
+msgid "Show vertical line after"
+msgstr "Afficher une ligne verticale après"
+
+#: spyderlib\plugins\editor.py:112
+msgid "characters"
+msgstr "caractères"
+
+#: spyderlib\plugins\editor.py:120
+msgid "Highlight current line"
+msgstr "Surligner la ligne en cours d'édition"
+
+#: spyderlib\plugins\editor.py:122
+msgid "Highlight occurences after"
+msgstr "Surligner les occurences après"
+
+#: spyderlib\plugins\editor.py:136 spyderlib\plugins\history.py:49
+#: spyderlib\plugins\inspector.py:99
+msgid "Syntax color scheme: "
+msgstr "Thème de coloration syntaxique : "
+
+#: spyderlib\plugins\editor.py:148 spyderlib\plugins\runconfig.py:304
+#: spyderlib\plugins\runconfig.py:426 spyderlib\plugins\runconfig.py:431
+#: spyderlib\spyder.py:1710 spyderlib\widgets\explorer.py:230
+#: spyderlib\widgets\externalshell\baseshell.py:138
+msgid "Run"
+msgstr "Exécuter"
+
+#: spyderlib\plugins\editor.py:149
+msgid "Save all files before running script"
+msgstr "Enregistrer tous les fichiers avant l'exécution d'un script"
+
+#: spyderlib\plugins\editor.py:152 spyderlib\plugins\externalconsole.py:434
+msgid "Introspection"
+msgstr "Introspection"
+
+#: spyderlib\plugins\editor.py:157 spyderlib\plugins\externalconsole.py:148
+msgid "Case sensitive code completion"
+msgstr "Complétion de code sensible à la casse"
+
+#: spyderlib\plugins\editor.py:159 spyderlib\plugins\externalconsole.py:150
+msgid "Show single completion"
+msgstr "Afficher les listes de complétion avec un choix unique"
+
+#: spyderlib\plugins\editor.py:164
+msgid "Link to object definition"
+msgstr "Lien vers la définition d'un objet"
+
+#: spyderlib\plugins\editor.py:166
+msgid ""
+"If this option is enabled, clicking on an object\n"
+"name (left-click + Ctrl key) will go this object\n"
+"definition (if resolved)."
+msgstr ""
+"Si cette option est activée, cliquer sur le nom\n"
+"d'un objet (click gauche + touche Ctrl) ira à la\n"
+"définition de cet objet (si celle-ci est trouvée)."
+
+#: spyderlib\plugins\editor.py:170 spyderlib\plugins\externalconsole.py:156
+#: spyderlib\plugins\ipythonconsole.py:89
+msgid "Automatic notification to object inspector"
+msgstr "Notification automatique à l'inspecteur d'objets"
+
+#: spyderlib\plugins\editor.py:172
+msgid ""
+"If this option is enabled, object inspector\n"
+"will automatically show informations on functions\n"
+"entered in editor (this is triggered when entering\n"
+"a left parenthesis after a valid function name)"
+msgstr ""
+"Si cette option est activée, l'inspecteur d'objet\n"
+"affichera automatiquement des informations\n"
+"sur les fonctions saisies dans l'éditeur\n"
+"(le mécanisme est déclenché par la saisie d'une\n"
+"parenthèse gauche après un nom valide de fonction)"
+
+#: spyderlib\plugins\editor.py:177
+msgid ""
+"<b>Warning:</b><br>The Python module <i>rope</i> is not installed on this "
+"computer: calltips, code completion and go-to-definition features won't be "
+"available."
+msgstr ""
+"<b>Avertissement :</b><br>Le module Python <i>rope</i> n'est pas installé "
+"sur cet ordinateur : les fonctionnalités telles que la complétion de code ou "
+"le lien vers la définition d'un objet ne sont donc pas accessibles."
+
+#: spyderlib\plugins\editor.py:185
+msgid "Automatic insertion of parentheses, braces and brackets"
+msgstr "Insertion automatique des parenthèses, crochets et accolades"
+
+#: spyderlib\plugins\editor.py:188
+msgid "Automatic insertion of closing quotes"
+msgstr "Insertion automatique de guillemets de clôture"
+
+#: spyderlib\plugins\editor.py:190
+msgid "Automatic insertion of colons after 'for', 'if', 'def', etc"
+msgstr "Insertion automatique de ':' après 'for', 'if', 'def', etc."
+
+#: spyderlib\plugins\editor.py:193
+msgid "Automatic indentation after 'else', 'elif', etc."
+msgstr "Indentation automatique après 'else', 'elif', etc."
+
+#: spyderlib\plugins\editor.py:195
+msgid "Indentation characters: "
+msgstr "Caractères d'indentation : "
+
+#: spyderlib\plugins\editor.py:196
+msgid "4 spaces"
+msgstr "4 espaces"
+
+#: spyderlib\plugins\editor.py:197
+msgid "2 spaces"
+msgstr "2 espaces"
+
+#: spyderlib\plugins\editor.py:198
+msgid "tab"
+msgstr "tabulation"
+
+#: spyderlib\plugins\editor.py:199
+msgid "Tab stop width:"
+msgstr "Largeur des tabulations :"
+
+#: spyderlib\plugins\editor.py:199
+msgid "pixels"
+msgstr "pixels"
+
+#: spyderlib\plugins\editor.py:201
+msgid "Tab always indent"
+msgstr "Toujours indenter avec la touche Tab"
+
+#: spyderlib\plugins\editor.py:203
+msgid ""
+"If enabled, pressing Tab will always indent,\n"
+"even when the cursor is not at the beginning\n"
+"of a line (when this option is enabled, code\n"
+"completion may be triggered using the alternate\n"
+"shortcut: Ctrl+Space)"
+msgstr ""
+"Si cette option est activée, presser la touche Tab\n"
+"provoquera toujours l'indentation de la ligne,\n"
+"quelle que soit la position du curseur (lorsque cette\n"
+"option est activée, la complétion de code reste \n"
+"accessible via le raccourci Ctrl+Espace)"
+
+#: spyderlib\plugins\editor.py:208
+msgid "Intelligent backspace"
+msgstr "Retour arrière (\"backspace\") intelligent"
+
+#: spyderlib\plugins\editor.py:210
+msgid "Automatically remove trailing spaces when saving files"
+msgstr ""
+"Supprimer automatiquement les espaces en fin de ligne lors de "
+"l'enregistrement"
+
+#: spyderlib\plugins\editor.py:214
+msgid "Analysis"
+msgstr "Analyse"
+
+#: spyderlib\plugins\editor.py:216
+msgid ""
+"<u>Note</u>: add <b>analysis:ignore</b> in a comment to ignore code/style "
+"analysis warnings. For more informations on style guide for Python code, "
+"please refer to the %s page."
+msgstr ""
+"<u>Note</u>: ajouter <b>analysis:ignore</b> dans un commentaire pour ignorer "
+"les résultats de l'analyse de code ou de style. Pour plus d'informations sur "
+"les recommandations officielles de style d'écriture avec le langage Python, "
+"veuillez visiter la page de la %s."
+
+#: spyderlib\plugins\editor.py:225
+#: spyderlib\widgets\sourcecode\codeeditor.py:1613
+msgid "Code analysis"
+msgstr "Analyse de code"
+
+#: spyderlib\plugins\editor.py:227
+msgid ""
+"If enabled, Python source code will be analyzed\n"
+"using pyflakes, lines containing errors or \n"
+"warnings will be highlighted"
+msgstr ""
+"Si cette option est activée, le code source Python sera analysé\n"
+"avec des outils l'outil d'introspection de code pyflakes\n"
+"et les lignes contenant des erreurs seront indiquées"
+
+#: spyderlib\plugins\editor.py:232
+msgid "Code analysis requires pyflakes %s+"
+msgstr "L'analyse de code requiert pyflakes %s+"
+
+#: spyderlib\plugins\editor.py:234
+msgid "Style analysis"
+msgstr "Analyse de style"
+
+#: spyderlib\plugins\editor.py:236
+msgid ""
+"If enabled, Python source code will be analyzed\n"
+"using pep8, lines that are not following PEP8\n"
+"style guide will be highlighted"
+msgstr ""
+"Si cette option est activée, le style du code source Python sera analysé\n"
+"avec l'outil d'introspection de code pep8 et les lignes ne suivant pas\n"
+"les recommandations officielles seront indiquées"
+
+#: spyderlib\plugins\editor.py:243
+msgid "Tasks (TODO, FIXME, XXX, HINT, TIP)"
+msgstr "Tâches (TODO, FIXME, XXX, HINT, TIP)"
+
+#: spyderlib\plugins\editor.py:246
+msgid "Perform analysis when saving file and every"
+msgstr "Analyser lors de l'enregistrement et toutes les"
+
+#: spyderlib\plugins\editor.py:250
+msgid "Perform analysis only when saving file"
+msgstr "Analyser uniquement lors de l'enregistrement"
+
+#: spyderlib\plugins\editor.py:296
+msgid "End-of-line characters"
+msgstr "Caractères de fin de ligne"
+
+#: spyderlib\plugins\editor.py:297
+msgid ""
+"When opening a text file containing mixed end-of-line characters (this may "
+"raise syntax errors in Python interpreter on Windows platforms), Spyder may "
+"fix the file automatically."
+msgstr ""
+"Lors de l'ouverture d'un fichier contenant des caractères de fin de ligne "
+"mélangés (ce qui peut se traduire par des erreurs de syntaxe dans "
+"l'interpréteur Python sous Windows), Spyder peut réparer le fichier "
+"automatiquement."
+
+#: spyderlib\plugins\editor.py:303
+msgid "Fix automatically and show warning message box"
+msgstr "Réparer automatiquement et afficher un message d'avertissement"
+
+#: spyderlib\plugins\editor.py:314 spyderlib\plugins\externalconsole.py:432
+#: spyderlib\plugins\ipythonconsole.py:358
+#: spyderlib\plugins\variableexplorer.py:41
+msgid "Display"
+msgstr "Affichage"
+
+#: spyderlib\plugins\editor.py:316
+msgid "Code Introspection/Analysis"
+msgstr "Introspection et analyse de code"
+
+#: spyderlib\plugins\editor.py:319 spyderlib\plugins\externalconsole.py:437
+msgid "Advanced settings"
+msgstr "Options avancées"
+
+#: spyderlib\plugins\editor.py:568 spyderlib\widgets\editortools.py:471
+msgid "Show/hide outline explorer"
+msgstr "Afficher/masquer l'explorateur de structure"
+
+#: spyderlib\plugins\editor.py:574
+msgid "Show/hide project explorer"
+msgstr "Afficher/masquer l'explorateur de projets"
+
+#: spyderlib\plugins\editor.py:582
+msgid "&New file..."
+msgstr "&Nouveau fichier..."
+
+#: spyderlib\plugins\editor.py:583
+msgid "Create a new Python script"
+msgstr "Créer un nouveau script Python"
+
+#: spyderlib\plugins\editor.py:587
+msgid "&Open..."
+msgstr "&Ouvrir..."
+
+#: spyderlib\plugins\editor.py:588
+msgid "Open text file"
+msgstr "Ouvrir un fichier texte"
+
+#: spyderlib\plugins\editor.py:590
+msgid "&Revert"
+msgstr "&Réinitialiser"
+
+#: spyderlib\plugins\editor.py:591
+msgid "Revert file from disk"
+msgstr "Revenir à la version du fichier enregistrée sur le disque"
+
+#: spyderlib\plugins\editor.py:595
+msgid "&Save"
+msgstr "&Enregistrer"
+
+#: spyderlib\plugins\editor.py:596
+msgid "Save current file"
+msgstr "Enregistrer le fichier en cours d'édition"
+
+#: spyderlib\plugins\editor.py:600
+msgid "Sav&e all"
+msgstr "Enregistrer &tout"
+
+#: spyderlib\plugins\editor.py:601
+msgid "Save all opened files"
+msgstr "Enregistrer tous les fichiers ouverts"
+
+#: spyderlib\plugins\editor.py:605
+msgid "Save &as..."
+msgstr "Enregistrer &sous..."
+
+#: spyderlib\plugins\editor.py:606
+msgid "Save current file as..."
+msgstr "Enregistrer le fichier en cours d'édition sous un autre nom..."
+
+#: spyderlib\plugins\editor.py:608 spyderlib\plugins\editor.py:609
+msgid "Print preview..."
+msgstr "Aperçu avant impression..."
+
+#: spyderlib\plugins\editor.py:610
+msgid "&Print..."
+msgstr "Im&primer..."
+
+#: spyderlib\plugins\editor.py:611
+msgid "Print current file..."
+msgstr "Imprimer le fichier en cours d'édition..."
+
+#: spyderlib\plugins\editor.py:615
+msgid "&Close"
+msgstr "&Fermer"
+
+#: spyderlib\plugins\editor.py:616
+msgid "Close current file"
+msgstr "Fermer le fichier en cours d'édition"
+
+#: spyderlib\plugins\editor.py:620
+msgid "C&lose all"
+msgstr "Fermer t&out"
+
+#: spyderlib\plugins\editor.py:621
+msgid "Close all opened files"
+msgstr "Fermer tous les fichiers ouverts"
+
+#: spyderlib\plugins\editor.py:627
+msgid "Set/Clear breakpoint"
+msgstr "Ajouter/supprimer un point d'arrêt"
+
+#: spyderlib\plugins\editor.py:634
+msgid "Set/Edit conditional breakpoint"
+msgstr "Ajouter/modifier un point d'arrêt conditionnel"
+
+#: spyderlib\plugins\editor.py:642
+msgid "Clear breakpoints in all files"
+msgstr "Supprimer les points d'arrêt dans tous les fichiers"
+
+#: spyderlib\plugins\editor.py:644
+msgid "Breakpoints"
+msgstr "Points d'arrêt"
+
+#: spyderlib\plugins\editor.py:650
+msgid "&Debug"
+msgstr "&Déboguer"
+
+#: spyderlib\plugins\editor.py:651
+msgid "Debug file"
+msgstr "Déboguer le script"
+
+#: spyderlib\plugins\editor.py:655
+msgid "Step"
+msgstr "Pas"
+
+#: spyderlib\plugins\editor.py:656
+msgid "Run current line"
+msgstr "Exécuter la ligne en cours"
+
+#: spyderlib\plugins\editor.py:660
+msgid "Continue"
+msgstr "Continuer"
+
+#: spyderlib\plugins\editor.py:661
+msgid ""
+"Continue execution until\n"
+"next breakpoint"
+msgstr "Continuer l'exécution jusqu'au prochain point d'arrêt"
+
+#: spyderlib\plugins\editor.py:666
+msgid "Step Into"
+msgstr "Pas vers l'intérieur"
+
+#: spyderlib\plugins\editor.py:667
+msgid ""
+"Step into function, method\n"
+"or class of current line"
+msgstr ""
+"Avancer dans la fonction, méthode \n"
+"ou classe de la ligne en cours"
+
+#: spyderlib\plugins\editor.py:672
+msgid "Step Return"
+msgstr "Pas vers l'extérieur"
+
+#: spyderlib\plugins\editor.py:673
+msgid ""
+"Run until current function\n"
+"or method returns"
+msgstr "Exécuter jusqu'au retour de la fonction ou méthode"
+
+#: spyderlib\plugins\editor.py:678
+msgid "Exit"
+msgstr "Sortir"
+
+#: spyderlib\plugins\editor.py:679
+msgid "Exit Debug"
+msgstr "Quitter le débogage"
+
+#: spyderlib\plugins\editor.py:688
+msgid "Debugging control"
+msgstr "Contrôle du débogage"
+
+#: spyderlib\plugins\editor.py:692 spyderlib\plugins\editor.py:1191
+#: spyderlib\spyder.py:561
+msgid "&Run"
+msgstr "E&xécution"
+
+#: spyderlib\plugins\editor.py:693
+msgid "Run file"
+msgstr "Exécuter le fichier"
+
+#: spyderlib\plugins\editor.py:698
+msgid "&Configure..."
+msgstr "&Configurer..."
+
+#: spyderlib\plugins\editor.py:699
+#: spyderlib\widgets\externalshell\pythonshell.py:290
+msgid "Run settings"
+msgstr "Options d'exécution"
+
+#: spyderlib\plugins\editor.py:705
+msgid "Re-run &last script"
+msgstr "Exécuter de nouveau le &dernier script"
+
+#: spyderlib\plugins\editor.py:706
+msgid "Run again last file"
+msgstr "Exécuter de nouveau le dernier fichier"
+
+#: spyderlib\plugins\editor.py:711
+#: spyderlib\widgets\sourcecode\codeeditor.py:2249
+msgid "Run &selection"
+msgstr "Exécuter la &sélection"
+
+#: spyderlib\plugins\editor.py:713
+msgid "Run selection"
+msgstr "Exécuter la sélection"
+
+#: spyderlib\plugins\editor.py:718
+msgid "Run cell"
+msgstr "Exécuter la cellule"
+
+#: spyderlib\plugins\editor.py:720
+msgid ""
+"Run current cell \n"
+"(see Editor documentation \n"
+"for more details on cells)"
+msgstr "Exécuter la cellule en cours d'édition\n(voir la documentation de l'Editeur, pour plus de détails sur les cellules)"
+
+#: spyderlib\plugins\editor.py:725
+msgid "Run cell and advance"
+msgstr "Exécuter la cellule et avancer"
+
+#: spyderlib\plugins\editor.py:728
+msgid ""
+"Run current cell and go to the next one\n"
+"(see Editor documentation \n"
+"for more details on cells)"
+msgstr "Exécuter la cellule en cours d'édition et aller à la suivante\n(voir la documentation de l'Editeur, pour plus de détails sur les cellules)"
+
+#: spyderlib\plugins\editor.py:735
+msgid "Show todo list"
+msgstr "Afficher la liste des tâches"
+
+#: spyderlib\plugins\editor.py:736
+msgid "Show TODO/FIXME/XXX/HINT/TIP comments list"
+msgstr "Afficher la liste des commentaires du type TODO/FIXME/XXX/HINT/TIP"
+
+#: spyderlib\plugins\editor.py:744
+msgid "Show warning/error list"
+msgstr "Afficher la liste des avertissements/erreurs"
+
+#: spyderlib\plugins\editor.py:745
+msgid "Show code analysis warnings/errors"
+msgstr ""
+"Afficher la liste des avertissements/erreurs provenant de l'analyse de code"
+
+#: spyderlib\plugins\editor.py:752
+msgid "Previous warning/error"
+msgstr "Avertissement suivant"
+
+#: spyderlib\plugins\editor.py:753
+msgid "Go to previous code analysis warning/error"
+msgstr "Afficher le message d'avertissement ou d'erreur suivant"
+
+#: spyderlib\plugins\editor.py:756
+msgid "Next warning/error"
+msgstr "Avertissement précédent"
+
+#: spyderlib\plugins\editor.py:757
+msgid "Go to next code analysis warning/error"
+msgstr "Afficher le message d'avertissement ou d'erreur précédent"
+
+#: spyderlib\plugins\editor.py:761
+msgid "Last edit location"
+msgstr "Dernière position d'édition"
+
+#: spyderlib\plugins\editor.py:762
+msgid "Go to last edit location"
+msgstr "Aller à la dernière position d'édition"
+
+#: spyderlib\plugins\editor.py:769
+msgid "Previous cursor position"
+msgstr "Position suivante du curseur"
+
+#: spyderlib\plugins\editor.py:770
+msgid "Go to previous cursor position"
+msgstr "Aller à la position précédente du curseur"
+
+#: spyderlib\plugins\editor.py:777
+msgid "Next cursor position"
+msgstr "Position suivante du curseur"
+
+#: spyderlib\plugins\editor.py:778
+msgid "Go to next cursor position"
+msgstr "Aller à la position suivante du curseur"
+
+#: spyderlib\plugins\editor.py:786
+#: spyderlib\widgets\sourcecode\codeeditor.py:2243
+msgid "Comment"
+msgstr "Commenter"
+
+#: spyderlib\plugins\editor.py:786
+#: spyderlib\widgets\sourcecode\codeeditor.py:2243
+msgid "Uncomment"
+msgstr "Décommenter"
+
+#: spyderlib\plugins\editor.py:787
+msgid "Comment current line or selection"
+msgstr "Commenter la sélection ou la ligne en cours d'édition"
+
+#: spyderlib\plugins\editor.py:791
+msgid "Add &block comment"
+msgstr "Ajouter un &bloc de commentaires"
+
+#: spyderlib\plugins\editor.py:792
+msgid "Add block comment around current line or selection"
+msgstr ""
+"Ajouter un bloc de commentaires autour de la sélection ou de la ligne en "
+"cours d'édition"
+
+#: spyderlib\plugins\editor.py:798
+msgid "R&emove block comment"
+msgstr "&Supprimer un bloc de commentaires"
+
+#: spyderlib\plugins\editor.py:799
+msgid "Remove comment block around current line or selection"
+msgstr ""
+"Supprimer le bloc de commentaires autour de la ligne en cours d'édition"
+
+#: spyderlib\plugins\editor.py:810
+msgid "Indent"
+msgstr "Indenter"
+
+#: spyderlib\plugins\editor.py:811
+msgid "Indent current line or selection"
+msgstr "Indenter la sélection ou la ligne en cours d'édition"
+
+#: spyderlib\plugins\editor.py:814
+msgid "Unindent"
+msgstr "Désindenter"
+
+#: spyderlib\plugins\editor.py:815
+msgid "Unindent current line or selection"
+msgstr "Désindenter la sélection ou la ligne en cours d'édition"
+
+#: spyderlib\plugins\editor.py:819
+msgid "Debug with winpdb"
+msgstr "Déboguer avec winpdb"
+
+#: spyderlib\plugins\editor.py:826
+msgid "Carriage return and line feed (Windows)"
+msgstr "Retour chariot et retour à la ligne (Windows)"
+
+#: spyderlib\plugins\editor.py:829
+msgid "Line feed (UNIX)"
+msgstr "Retour à la ligne (UNIX)"
+
+#: spyderlib\plugins\editor.py:832
+msgid "Carriage return (Mac)"
+msgstr "Retour chariot (Mac)"
+
+#: spyderlib\plugins\editor.py:838
+msgid "Convert end-of-line characters"
+msgstr "Convertir les caractères de fin de ligne"
+
+#: spyderlib\plugins\editor.py:842
+msgid "Remove trailing spaces"
+msgstr "Supprimer les espaces en fin de ligne"
+
+#: spyderlib\plugins\editor.py:844
+msgid "Fix indentation"
+msgstr "Corriger l'indentation"
+
+#: spyderlib\plugins\editor.py:845
+msgid "Replace tab characters by space characters"
+msgstr "Remplacer les caractères de tabulation par des espaces"
+
+#: spyderlib\plugins\editor.py:848
+msgid "Go to line..."
+msgstr "Aller à la ligne..."
+
+#: spyderlib\plugins\editor.py:856
+msgid "Set console working directory"
+msgstr "Répertoire de travail de la console"
+
+#: spyderlib\plugins\editor.py:858
+msgid ""
+"Set current console (and file explorer) working directory to current script "
+"directory"
+msgstr ""
+"Choisir le répertoire du script comme répertoire de travail de la console "
+"courante (et de l'explorateur de fichier)"
+
+#: spyderlib\plugins\editor.py:863
+msgid "Maximum number of recent files..."
+msgstr "Nombre maximum de fichiers récents..."
+
+#: spyderlib\plugins\editor.py:866
+msgid "Clear recent files list"
+msgstr "Effacer la liste des fichiers récents"
+
+#: spyderlib\plugins\editor.py:866
+msgid "Clear this list"
+msgstr "Effacer cette liste"
+
+#: spyderlib\plugins\editor.py:868
+msgid "Open &recent"
+msgstr "Fichiers &récents"
+
+#: spyderlib\plugins\editor.py:1179 spyderlib\spyder.py:542
+msgid "File toolbar"
+msgstr "Barre d'outil fichiers"
+
+#: spyderlib\plugins\editor.py:1180 spyderlib\spyder.py:552
+msgid "Search toolbar"
+msgstr "Barre d'outil de recherche"
+
+#: spyderlib\plugins\editor.py:1181 spyderlib\spyder.py:557
+msgid "Source toolbar"
+msgstr "Barre d'outils code source"
+
+#: spyderlib\plugins\editor.py:1182 spyderlib\spyder.py:562
+msgid "Run toolbar"
+msgstr "Barre d'outil exécution"
+
+#: spyderlib\plugins\editor.py:1183 spyderlib\spyder.py:566
+msgid "Debug toolbar"
+msgstr "Barre d'outil de débogage"
+
+#: spyderlib\plugins\editor.py:1184 spyderlib\spyder.py:547
+msgid "Edit toolbar"
+msgstr "Barre d'outil édition"
+
+#: spyderlib\plugins\editor.py:1187 spyderlib\spyder.py:539
+msgid "&File"
+msgstr "&Fichier"
+
+#: spyderlib\plugins\editor.py:1188 spyderlib\spyder.py:546
+msgid "&Edit"
+msgstr "&Édition"
+
+#: spyderlib\plugins\editor.py:1189 spyderlib\spyder.py:551
+msgid "&Search"
+msgstr "&Recherche"
+
+#: spyderlib\plugins\editor.py:1190 spyderlib\spyder.py:556
+msgid "Sour&ce"
+msgstr "Sour&ce"
+
+#: spyderlib\plugins\editor.py:1192 spyderlib\spyder.py:573
+msgid "&Tools"
+msgstr "Ou&tils"
+
+#: spyderlib\plugins\editor.py:1193
+msgid "?"
+msgstr "?"
+
+#: spyderlib\plugins\editor.py:1408
+msgid "Spyder Editor"
+msgstr "Éditeur de Spyder"
+
+#: spyderlib\plugins\editor.py:1409
+msgid "This is a temporary script file."
+msgstr "Ceci est un script temporaire."
+
+#: spyderlib\plugins\editor.py:1469
+msgid "untitled"
+msgstr "sanstitre"
+
+#: spyderlib\plugins\editor.py:1540
+msgid "Maximum number of recent files"
+msgstr "Nombre maximum de fichiers récents"
+
+#: spyderlib\plugins\editor.py:1580 spyderlib\plugins\workingdirectory.py:69
+msgid "Open file"
+msgstr "Ouvrir un fichier"
+
+#: spyderlib\plugins\editor.py:1662
+msgid "Printing..."
+msgstr "Impression en cours..."
+
+#: spyderlib\plugins\explorer.py:48
+msgid "File explorer"
+msgstr "Explorateur de fichiers"
+
+#: spyderlib\plugins\explorer.py:61 spyderlib\plugins\inspector.py:297
+#: spyderlib\plugins\projectexplorer.py:59
+msgid "Set font style"
+msgstr "Changer la police d'écriture"
+
+#: spyderlib\plugins\externalconsole.py:45
+msgid "Interactive data plotting"
+msgstr "Visualisation interactive de données"
+
+#: spyderlib\plugins\externalconsole.py:70
+#: spyderlib\plugins\externalconsole.py:1050
+#: spyderlib\plugins\inspector.py:327 spyderlib\plugins\ipythonconsole.py:433
+#: spyderlib\plugins\ipythonconsole.py:1145
+#: spyderlib\widgets\externalshell\baseshell.py:106
+msgid "Console"
+msgstr "Console"
+
+#: spyderlib\plugins\externalconsole.py:88
+msgid "One tab per script"
+msgstr "Un onglet par script"
+
+#: spyderlib\plugins\externalconsole.py:89
+#: spyderlib\widgets\externalshell\baseshell.py:171
+msgid "Show elapsed time"
+msgstr "Afficher le temps écoulé"
+
+#: spyderlib\plugins\externalconsole.py:90 spyderlib\widgets\explorer.py:960
+msgid "Show icons and text"
+msgstr "Afficher icônes et textes"
+
+#: spyderlib\plugins\externalconsole.py:102
+msgid "Buffer: "
+msgstr "Tampon : "
+
+#: spyderlib\plugins\externalconsole.py:102
+#: spyderlib\plugins\ipythonconsole.py:108
+msgid " lines"
+msgstr " lignes"
+
+#: spyderlib\plugins\externalconsole.py:107
+msgid "Merge process standard output/error channels"
+msgstr "Fusionner les canaux de sortie et d'erreur du processus"
+
+#: spyderlib\plugins\externalconsole.py:109
+msgid ""
+"Merging the output channels of the process means that\n"
+"the standard error won't be written in red anymore,\n"
+"but this has the effect of speeding up display."
+msgstr ""
+"Fusionner les canaux de sortie et d'erreur du processus\n"
+"signifie que les erreurs ne seront plus affichées en rouge,\n"
+"mais cela entraînera également une amélioration des performances\n"
+"d'affichage et une meilleure réactivité de la console."
+
+#: spyderlib\plugins\externalconsole.py:113
+msgid "Colorize standard error channel using ANSI escape codes"
+msgstr "Coloriser le canal d'erreur standard (codes d'échappement ANSI)"
+
+#: spyderlib\plugins\externalconsole.py:115
+msgid ""
+"This method is the only way to have colorized standard\n"
+"error channel when the output channels have been merged."
+msgstr ""
+"Cette méthode est le seul moyen de coloriser le canal\n"
+"d'erreur standard lorsque les canaux de sorties ont été fusionnés."
+
+#: spyderlib\plugins\externalconsole.py:133
+#: spyderlib\widgets\arrayeditor.py:395
+msgid "Background color"
+msgstr "Couleur de fond"
+
+#: spyderlib\plugins\externalconsole.py:134
+msgid ""
+"This option will be applied the next time a Python console or a terminal is "
+"opened."
+msgstr ""
+"Cette option sera prise en compte lors de la prochaine ouverture de console "
+"(interpréteur Python ou terminal)."
+
+#: spyderlib\plugins\externalconsole.py:137
+msgid "Light background (white color)"
+msgstr "Fond blanc"
+
+#: spyderlib\plugins\externalconsole.py:158
+#: spyderlib\plugins\ipythonconsole.py:91
+msgid ""
+"If this option is enabled, object inspector\n"
+"will automatically show informations on functions\n"
+"entered in console (this is triggered when entering\n"
+"a left parenthesis after a valid function name)"
+msgstr ""
+"Si cette option est activée, l'inspecteur d'objet affichera automatiquement "
+"des informations sur les fonctions saisies dans la console (le mécanisme est "
+"déclenché par la saisie d'une parenthèse gauche après un nom valide de "
+"fonction)"
+
+#: spyderlib\plugins\externalconsole.py:173
+msgid "User Module Deleter (UMD)"
+msgstr "User Module Deleter (UMD)"
+
+#: spyderlib\plugins\externalconsole.py:174
+msgid ""
+"UMD forces Python to reload modules which were imported when executing a \n"
+"script in the external console with the 'runfile' function."
+msgstr ""
+"L'UMD force Python à recharger les modules importés lors de l'exécution "
+"d'un\n"
+"script dans la console interne avec la fonction 'runfile'."
+
+#: spyderlib\plugins\externalconsole.py:177
+msgid "Enable UMD"
+msgstr "Activer l'UMD"
+
+#: spyderlib\plugins\externalconsole.py:178
+msgid ""
+"This option will enable the User Module Deleter (UMD) in Python "
+"interpreters. UMD forces Python to reload deeply modules during import when "
+"running a Python script using the Spyder's builtin function <b>runfile</b>."
+"<br><br><b>1.</b> UMD may require to restart the Python interpreter in which "
+"it will be called (otherwise only newly imported modules will be reloaded "
+"when executing scripts).<br><br><b>2.</b> If errors occur when re-running a "
+"PyQt-based program, please check that the Qt objects are properly destroyed "
+"(e.g. you may have to use the attribute <b>Qt.WA_DeleteOnClose</b> on your "
+"main window, using the <b>setAttribute</b> method)"
+msgstr ""
+"Cette option active le User Module Deleter (UMD) dans les interpréteurs "
+"Python. L'UMD force Python à recharger complètement les modules lors de leur "
+"importation, dans le cadre de l'exécution d'un script Python avec la "
+"fonction Spyder <b>runfile</b>.<br><br><b>1.</b> UMD peut nécessiter le "
+"redémarrage de l'interpréteur Python dans lequel il va être utilisé (dans le "
+"cas contraire, seuls les modules importés après activation de l'UMD seront "
+"rechargés complètement lors de l'exécution de scripts).<br><br><b>2.</b> Si "
+"des erreurs survenaient lors de la réexécution de programmes utilisant PyQt, "
+"veuillez vérifier que les objets Qt sont correctement détruits à la sortie "
+"du programme (par exemple, il sera probablement nécessaire d'utiliser "
+"l'attribut <b>Qt.WA_DeleteOnClose</b> sur votre objet fenêtre principale "
+"grâce à la méthode <b>setAttribute</b>)"
+
+#: spyderlib\plugins\externalconsole.py:194
+msgid "Show reloaded modules list"
+msgstr "Afficher les modules rechargés"
+
+#: spyderlib\plugins\externalconsole.py:195
+msgid ""
+"Please note that these changes will be applied only to new Python "
+"interpreters"
+msgstr ""
+"Veuillez noter que ces changements ne seront pris en compte que par les "
+"nouveaux interpréteurs Python"
+
+#: spyderlib\plugins\externalconsole.py:199
+msgid "Set UMD excluded (not reloaded) modules"
+msgstr "Modifier la liste des modules non rechargés par l'UMD"
+
+#: spyderlib\plugins\externalconsole.py:211
+msgid "Python executable"
+msgstr "Exécutable Python"
+
+#: spyderlib\plugins\externalconsole.py:213
+msgid ""
+"Select the Python interpreter executable binary in which Spyder will run "
+"scripts:"
+msgstr "Sélectionner l'interpréteur Python utilisé pour exécuter des scripts:"
+
+#: spyderlib\plugins\externalconsole.py:216
+msgid "Default (i.e. the same as Spyder's)"
+msgstr ""
+"Par défaut (interpréteur identique à celui dans lequel Spyder est exécuté)"
+
+#: spyderlib\plugins\externalconsole.py:220
+msgid "Use the following Python interpreter:"
+msgstr "Utiliser l'interpréteur Python suivant :"
+
+#: spyderlib\plugins\externalconsole.py:224
+msgid "Executables"
+msgstr "Exécutables"
+
+#: spyderlib\plugins\externalconsole.py:244
+#: spyderlib\plugins\ipythonconsole.py:362
+#: spyderlib\plugins\workingdirectory.py:42
+msgid "Startup"
+msgstr "Démarrage"
+
+#: spyderlib\plugins\externalconsole.py:245
+msgid "Open a Python interpreter at startup"
+msgstr "Ouvrir un interpréteur Python au démarrage"
+
+#: spyderlib\plugins\externalconsole.py:253
+msgid "PYTHONSTARTUP replacement"
+msgstr "Substitution de PYTHONSTARTUP"
+
+#: spyderlib\plugins\externalconsole.py:255
+msgid ""
+"This option will override the PYTHONSTARTUP environment variable which\n"
+"defines the script to be executed during the Python interpreter startup."
+msgstr ""
+"Cette option permet de remplacer le script de démarrage défini par la\n"
+"variable d'environnement PYTHONSTARTUP."
+
+#: spyderlib\plugins\externalconsole.py:260
+msgid "Default PYTHONSTARTUP script"
+msgstr "Script PYTHONSTARTUP par défaut"
+
+#: spyderlib\plugins\externalconsole.py:264
+msgid "Use the following startup script:"
+msgstr "Utiliser le script de démarrage suivant :"
+
+#: spyderlib\plugins\externalconsole.py:283
+msgid "Monitor"
+msgstr "Moniteur"
+
+#: spyderlib\plugins\externalconsole.py:284
+msgid ""
+"The monitor provides introspection features to console: code completion, "
+"calltips and variable explorer. Because it relies on several modules, "
+"disabling the monitor may be useful to accelerate console startup."
+msgstr ""
+"Le moniteur fournit à la console des fonctionnalités d'introspection telles "
+"que la complétion de code, les info-bulles et l'explorateur de variables. "
+"Parce qu'il nécessite l'import de nombreux modules, désactiver le moniteur "
+"permet d'accélérer le démarrage de la console."
+
+#: spyderlib\plugins\externalconsole.py:291
+msgid "Enable monitor"
+msgstr "Activer le moniteur"
+
+#: spyderlib\plugins\externalconsole.py:303
+msgid "Default library"
+msgstr "Bibliothèque par défaut"
+
+#: spyderlib\plugins\externalconsole.py:305
+msgid "Qt (PyQt/PySide)"
+msgstr "Qt (PyQt/PySide)"
+
+#: spyderlib\plugins\externalconsole.py:307
+msgid "Qt-Python bindings library selection:"
+msgstr "Sélection de la bibliothèque d'interfaçage Qt :"
+
+#: spyderlib\plugins\externalconsole.py:309
+msgid ""
+"This option will act on<br> libraries such as Matplotlib, guidata or ETS"
+msgstr ""
+"Cette option est prise en charge par les bibliothèques telles que "
+"Matplotlib, guidata ou ETS"
+
+#: spyderlib\plugins\externalconsole.py:323
+msgid "Install Spyder's input hook for Qt"
+msgstr "Installer le \"input hook\" de Spyder pour Qt"
+
+#: spyderlib\plugins\externalconsole.py:325
+msgid ""
+"PyQt installs an input hook that allows<br> creating and interacting with Qt "
+"widgets in an interactive interpreter without blocking it. On Windows "
+"platforms, it is strongly recommended to replace it by Spyder's. Regarding "
+"PySide, note that it does not install an input hook, so it is required to "
+"enable this feature in order to be able to manipulate PySide/Qtobjects "
+"interactively."
+msgstr ""
+"PyQt installe un \"input hook\", mécanisme permettant d'interagir\n"
+"avec des widgets Qt dans un interpréteur Python sans bloquer ce dernier. \n"
+"Sous Windows, il est fortement conseillé de le remplacer par celui de "
+"Spyder. \n"
+"Concernant PySide, aucun \"input hook\" n'étant implémenté dans la version "
+"1.0, \n"
+"il est également recommandé d'activer cette option \n"
+"(cette fonctionnalité n'a aucun effet si le moniteur est désactivé)."
+
+#: spyderlib\plugins\externalconsole.py:344
+msgid "PyQt"
+msgstr "PyQt"
+
+#: spyderlib\plugins\externalconsole.py:346
+msgid "API selection for QString and QVariant objects:"
+msgstr "Sélection de l'API des objets QString et QVariant :"
+
+#: spyderlib\plugins\externalconsole.py:347
+msgid "API #1"
+msgstr "API n°1"
+
+#: spyderlib\plugins\externalconsole.py:347
+msgid "API #2"
+msgstr "API n°2"
+
+#: spyderlib\plugins\externalconsole.py:347
+msgid "Default API"
+msgstr "API par défaut"
+
+#: spyderlib\plugins\externalconsole.py:349
+msgid ""
+"PyQt API #1 is the default API for<br>Python 2. PyQt API #2 is the default "
+"API for Python 3 and is compatible with PySide. Note that switching to API "
+"#2 may require to enable the Matplotlib patch."
+msgstr ""
+"L'API n°1 de PyQt est l'API par défaut pour Python 2. L'API n°2 est l'API \n"
+"par défaut pour Python 3 : c'est l'API qui est compatible avec PySide.\n"
+"La sélection de l'API n°2 peut nécessiter l'activation du patch de "
+"Matplotlib."
+
+#: spyderlib\plugins\externalconsole.py:355
+msgid "Ignore API change errors (sip.setapi)"
+msgstr "Ignorer les erreurs de changement d'API (sip.setapi)"
+
+#: spyderlib\plugins\externalconsole.py:357
+msgid ""
+"Enabling this option will ignore <br>errors when changing PyQt API. As PyQt "
+"does not support dynamic API changes, it is strongly recommended to use this "
+"feature wisely, e.g. for debugging purpose."
+msgstr ""
+"L'activation de cette option permet d'ignorer les erreurs liées aux "
+"changements\n"
+"d'API de PyQt. Vu que PyQt ne prend pas en charge le changement dynamique\n"
+" d'API, il est fortement recommandé d'utiliser cette fonctionnalité "
+"exceptionnellement,\n"
+"par exemple pour du débogage."
+
+#: spyderlib\plugins\externalconsole.py:376
+msgid "Matplotlib"
+msgstr "Matplotlib"
+
+#: spyderlib\plugins\externalconsole.py:378
+msgid "GUI backend:"
+msgstr "Backend graphique :"
+
+#: spyderlib\plugins\externalconsole.py:380
+msgid ""
+"Set the GUI toolkit used by <br>Matplotlib to show figures (default: Qt4Agg)"
+msgstr ""
+"Spécifie la bibliothèque d'interfaces graphiques à utiliser pour l'affichage "
+"des figures Matplotlib (par défaut : Qt4Agg)"
+
+#: spyderlib\plugins\externalconsole.py:391
+msgid "Patch Matplotlib figures"
+msgstr "Patcher les figures Matplotlib"
+
+#: spyderlib\plugins\externalconsole.py:393
+msgid ""
+"Patching Matplotlib library will add a button to customize figure options "
+"(Qt4Agg only) and fix some issues."
+msgstr ""
+"Appliquer un patch à la bibliothèque Matplotlib permet d'ajouter un bouton "
+"(au backend Qt4Agg) pour modifier les options des courbes et images "
+"affichées et de corriger quelques bogues."
+
+#: spyderlib\plugins\externalconsole.py:413
+msgid "Enthought Tool Suite"
+msgstr "Enthought Tool Suite"
+
+#: spyderlib\plugins\externalconsole.py:414
+msgid ""
+"Enthought Tool Suite (ETS) supports PyQt4 (qt4) and wxPython (wx) graphical "
+"user interfaces."
+msgstr ""
+"Le logiciel Enthought Tool Suite (ETS) prend en charge les interfaces "
+"graphiques PyQt4 (qt4) et wxPython (wx)."
+
+#: spyderlib\plugins\externalconsole.py:418
+msgid "ETS_TOOLKIT:"
+msgstr "ETS_TOOLKIT:"
+
+#: spyderlib\plugins\externalconsole.py:439
+msgid "External modules"
+msgstr "Modules externes"
+
+#: spyderlib\plugins\externalconsole.py:643
+msgid "Trying to kill a kernel?"
+msgstr "Tentative d'arrêt d'un noyau"
+
+#: spyderlib\plugins\externalconsole.py:644
+msgid ""
+"You can't close this kernel because it has one or more consoles connected to "
+"it.<br><br>You need to close them instead or you can kill the kernel using "
+"the button far to the right."
+msgstr ""
+"Le noyau ne peut pas être fermé car au moins une console frontale y est "
+"connectée.\n"
+"\n"
+"Veuillez soit fermer au préalable toutes les consoles connectées ou appuyer "
+"sur le bouton à l'extrême droite pour tuer le processus du noyau."
+
+#: spyderlib\plugins\externalconsole.py:719
+#: spyderlib\plugins\ipythonconsole.py:729 spyderlib\spyder.py:1241
+#: spyderlib\spyder.py:1259 spyderlib\utils\environ.py:95
+#: spyderlib\utils\environ.py:108
+msgid "Warning"
+msgstr "Attention"
+
+#: spyderlib\plugins\externalconsole.py:720
+msgid ""
+"No Python shell is currently selected to run <b>%s</b>.<br><br>Please select "
+"or open a new Python interpreter and try again."
+msgstr ""
+"Aucune console Python n'est actuellement sélectionnée pour exécuter <b>%s</"
+"b>.<br><br>Merci de sélectionner ou d'ouvrir un interpréteur Python et de "
+"réessayer."
+
+#: spyderlib\plugins\externalconsole.py:797
+msgid ""
+"%s is already running in a separate process.\n"
+"Do you want to kill the process before starting a new one?"
+msgstr ""
+"%s est déjà en cours d'exécution dans un processus séparé.\n"
+"Souhaitez-vous tuer ce processus avant d'en démarrer un autre ?"
+
+#: spyderlib\plugins\externalconsole.py:931
+msgid "Kernel"
+msgstr "Noyau"
+
+#: spyderlib\plugins\externalconsole.py:951
+msgid "Command Window"
+msgstr "Invite de commandes"
+
+#: spyderlib\plugins\externalconsole.py:953
+msgid "Terminal"
+msgstr "Terminal"
+
+#: spyderlib\plugins\externalconsole.py:1072
+msgid "Open a Python &interpreter"
+msgstr "Ouvrir un &interpréteur Python"
+
+#: spyderlib\plugins\externalconsole.py:1075
+msgid "Open &command prompt"
+msgstr "Ouvrir un invite de &commandes"
+
+#: spyderlib\plugins\externalconsole.py:1076
+msgid "Open a Windows command prompt"
+msgstr "Ouvrir un invite de commandes Windows"
+
+#: spyderlib\plugins\externalconsole.py:1078
+msgid "Open &terminal"
+msgstr "Ouvrir un &terminal"
+
+#: spyderlib\plugins\externalconsole.py:1079
+msgid "Open a terminal window inside Spyder"
+msgstr "Ouvrir un terminal de commandes dans Spyder"
+
+#: spyderlib\plugins\externalconsole.py:1200
+#: spyderlib\widgets\projectexplorer.py:334
+msgid " and "
+msgstr " et "
+
+#: spyderlib\plugins\externalconsole.py:1205
+msgid "<br><u>Installed version</u>: %s"
+msgstr "<br><u>Version installée</u>: %s"
+
+#: spyderlib\plugins\externalconsole.py:1207
+#: spyderlib\plugins\ipythonconsole.py:60
+#: spyderlib\plugins\ipythonconsole.py:680
+msgid "IPython console"
+msgstr "Console IPython"
+
+#: spyderlib\plugins\externalconsole.py:1208
+msgid ""
+"Unable to open IPython console because no supported IPython version was "
+"found.<br><br><u>Supported IPython versions</u>: %s"
+msgstr ""
+"Impossible d'ouvrir une console IPython car aucune version prise en charge "
+"n'est installée.<br><br><u>Versions IPython prises en charge</u>: %s"
+
+#: spyderlib\plugins\externalconsole.py:1229
+#: spyderlib\plugins\ipythonconsole.py:749
+msgid "Open an IPython console"
+msgstr "Ouvrir une console IPython"
+
+#: spyderlib\plugins\externalconsole.py:1230
+msgid ""
+"The console monitor was disabled: the IPython kernel will be started as "
+"expected, but an IPython console will have to be connected manually to the "
+"kernel."
+msgstr ""
+"Le moniteur (console) a été désactivé. Par conséquent, le noyau IPython sera "
+"démarré mais la console IPython devra y être connectée manuellement."
+
+#: spyderlib\plugins\externalconsole.py:1266
+#: spyderlib\plugins\externalconsole.py:1279
+#: spyderlib\plugins\externalconsole.py:1283
+msgid "UMD"
+msgstr "UMD"
+
+#: spyderlib\plugins\externalconsole.py:1267
+msgid ""
+"UMD excluded modules:\n"
+"(example: guidata, guiqwt)"
+msgstr ""
+"Modules non rechargés par l'UMD :\n"
+"(exemple: guidata, guiqwt)"
+
+#: spyderlib\plugins\externalconsole.py:1280
+msgid ""
+"The following modules are not installed on your machine:\n"
+"%s"
+msgstr ""
+"Les modules suivants ne sont pas installés sur votre ordinateur :\n"
+"%s"
+
+#: spyderlib\plugins\externalconsole.py:1284
+msgid ""
+"Please note that these changes will be applied only to new Python/IPython "
+"interpreters"
+msgstr ""
+"Veuillez noter que ces changements ne seront pris en compte que par les "
+"nouveaux interpréteurs Python/IPython"
+
+#: spyderlib\plugins\findinfiles.py:90 spyderlib\widgets\findinfiles.py:691
+msgid "Find in files"
+msgstr "Recherche dans des fichiers"
+
+#: spyderlib\plugins\findinfiles.py:114
+msgid "&Find in files"
+msgstr "Rechercher dans des &fichiers"
+
+#: spyderlib\plugins\findinfiles.py:117
+msgid "Search text in multiple files"
+msgstr "Rechercher une chaîne de caractères dans plusieurs fichiers à la fois"
+
+#: spyderlib\plugins\history.py:34
+msgid "Settings"
+msgstr "Options"
+
+#: spyderlib\plugins\history.py:36
+msgid " entries"
+msgstr " lignes"
+
+#: spyderlib\plugins\history.py:36
+msgid "History depth: "
+msgstr "Taille de l'historique : "
+
+#: spyderlib\plugins\history.py:43
+msgid "Scroll automatically to last entry"
+msgstr "Défiler automatiquement jusqu'à la dernière ligne"
+
+#: spyderlib\plugins\history.py:102 spyderlib\plugins\inspector.py:380
+#: spyderlib\plugins\ipythonconsole.py:486 spyderlib\widgets\editor.py:657
+#: spyderlib\widgets\explorer.py:990
+#: spyderlib\widgets\externalshell\baseshell.py:151
+#: spyderlib\widgets\externalshell\namespacebrowser.py:221
+msgid "Options"
+msgstr "Options"
+
+#: spyderlib\plugins\history.py:122
+msgid "History log"
+msgstr "Historique"
+
+#: spyderlib\plugins\history.py:149
+msgid "History..."
+msgstr "Historique..."
+
+#: spyderlib\plugins\history.py:151
+msgid "Set history maximum entries"
+msgstr "Modifier le nombre d'entrées maximum de l'historique"
+
+#: spyderlib\plugins\history.py:261
+msgid "History"
+msgstr "Historique"
+
+#: spyderlib\plugins\history.py:262
+msgid "Maximum entries"
+msgstr "Nombre maximum d'entrées"
+
+#: spyderlib\plugins\inspector.py:53
+msgid "Rich text help on the Object Inspector"
+msgstr "Texte enrichi dans l'inspecteur d'objets"
+
+#: spyderlib\plugins\inspector.py:108
+msgid "Plain text font style"
+msgstr "Police d'écriture du texte brut"
+
+#: spyderlib\plugins\inspector.py:111
+msgid "Rich text font style"
+msgstr "Police d'écriture du texte enrichi"
+
+#: spyderlib\plugins\inspector.py:113
+msgid "Additional features"
+msgstr "Options supplémentaires"
+
+#: spyderlib\plugins\inspector.py:114
+msgid "Render mathematical equations"
+msgstr "Styliser les équations mathématiques"
+
+#: spyderlib\plugins\inspector.py:120
+msgid "This feature requires Sphinx 1.1 or superior."
+msgstr "Cette fonctionnalité nécessite l'installation de Sphinx 1.1+."
+
+#: spyderlib\plugins\inspector.py:122
+msgid "Sphinx %s is currently installed."
+msgstr "Sphinx %s n'est pas installé."
+
+#: spyderlib\plugins\inspector.py:281
+msgid "No documentation available"
+msgstr "Aucune documentation disponible"
+
+#: spyderlib\plugins\inspector.py:320
+msgid "Source"
+msgstr "Source"
+
+#: spyderlib\plugins\inspector.py:335 spyderlib\widgets\dicteditor.py:162
+msgid "Object"
+msgstr "Objet"
+
+#: spyderlib\plugins\inspector.py:350
+msgid "Plain Text"
+msgstr "Texte brut"
+
+#: spyderlib\plugins\inspector.py:354
+msgid "Show Source"
+msgstr "Afficher les sources"
+
+#: spyderlib\plugins\inspector.py:358
+msgid "Rich Text"
+msgstr "Texte enrichi"
+
+#: spyderlib\plugins\inspector.py:368
+msgid "Automatic import"
+msgstr "Import automatique"
+
+#: spyderlib\plugins\inspector.py:423 spyderlib\plugins\inspector.py:804
+msgid "Object inspector"
+msgstr "Inspecteur d'objets"
+
+#: spyderlib\plugins\inspector.py:765
+msgid "Lock"
+msgstr "Verrouiller"
+
+#: spyderlib\plugins\inspector.py:765
+msgid "Unlock"
+msgstr "Déverrouiller"
+
+#: spyderlib\plugins\inspector.py:805
+msgid ""
+"The following error occured when calling <b>Sphinx %s</b>. <br>Incompatible "
+"Sphinx version or doc string decoding failed.<br><br>Error message:<br>%s"
+msgstr ""
+"L'erreur suivante s'est produite lors de l'exécution de <b>Sphinx %s</b>. "
+"<br>Veuillez vérifier si cette version de Sphinx est bien prise en charge "
+"par Spyder. <br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\plugins\inspector.py:853
+msgid "No source code available."
+msgstr "Aucun code source disponible."
+
+#: spyderlib\plugins\ipythonconsole.py:53
+msgid "Symbolic mathematics for the IPython Console"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:72
+msgid "Display initial banner"
+msgstr "Afficher le message d'accueil"
+
+#: spyderlib\plugins\ipythonconsole.py:73
+msgid ""
+"This option lets you hide the message shown at\n"
+"the top of the console when it's opened."
+msgstr ""
+"Cette option permet de masquer la message d'accueil\n"
+"qui s'affiche à l'ouverture de la console."
+
+#: spyderlib\plugins\ipythonconsole.py:75
+msgid "Use a completion widget"
+msgstr "Utiliser un widget de complétion de code"
+
+#: spyderlib\plugins\ipythonconsole.py:77
+msgid "Use a widget instead of plain text output for tab completion"
+msgstr "Utiliser un widget de complétion au lieu d'une liste en texte brut"
+
+#: spyderlib\plugins\ipythonconsole.py:79
+msgid "Use a pager to display additional text inside the console"
+msgstr "Utiliser un pager pour afficher l'aide"
+
+#: spyderlib\plugins\ipythonconsole.py:81
+msgid ""
+"Useful if you don't want to fill the console with long help or completion "
+"texts.\n"
+"Note: Use the Q key to get out of the pager."
+msgstr ""
+"Le pager permet d'éviter de remplir la console de texte d'aide.\n"
+"Note : utiliser la touche Q pour quitter le pager."
+
+#: spyderlib\plugins\ipythonconsole.py:85
+msgid "Display balloon tips"
+msgstr "Afficher des info-bulles"
+
+#: spyderlib\plugins\ipythonconsole.py:86
+msgid "Ask for confirmation before closing"
+msgstr "Demander confirmation avant de fermer une console"
+
+#: spyderlib\plugins\ipythonconsole.py:108
+msgid "Buffer:  "
+msgstr "Tampon :  "
+
+#: spyderlib\plugins\ipythonconsole.py:110
+msgid ""
+"Set the maximum number of lines of text shown in the\n"
+"console before truncation. Specifying -1 disables it\n"
+"(not recommended!)"
+msgstr ""
+"Nombre maximum de lignes de texte affichées dans la console avant troncature "
+"(saisir -1 désactive cette dernière, ce qui est fortement déconseillé)."
+
+#: spyderlib\plugins\ipythonconsole.py:119
+msgid "Support for graphics (Pylab)"
+msgstr "Prise en charge des graphes (Pylab)"
+
+#: spyderlib\plugins\ipythonconsole.py:120
+msgid "Activate support"
+msgstr "Activer"
+
+#: spyderlib\plugins\ipythonconsole.py:121
+msgid "Automatically load Pylab and NumPy"
+msgstr "Importer automatiquement Pylab et NumPy"
+
+#: spyderlib\plugins\ipythonconsole.py:123
+msgid ""
+"This lets you load graphics support without importing \n"
+"the commands to do plots. Useful to work with other\n"
+"plotting libraries different to Matplotlib or to develop \n"
+"GUIs with Spyder."
+msgstr ""
+"Import automatique de toutes les fonctions de représentation graphique et de "
+"calcul numérique"
+
+#: spyderlib\plugins\ipythonconsole.py:142
+msgid ""
+"This feature requires the Matplotlib library.\n"
+"It seems you don't have it installed."
+msgstr ""
+"Cette fonctionnalité nécessite l'installation du module Matplotlib.\n"
+"Ce dernier n'est apparemment pas installé."
+
+#: spyderlib\plugins\ipythonconsole.py:147
+msgid "Inline"
+msgstr "En ligne"
+
+#: spyderlib\plugins\ipythonconsole.py:148
+msgid "Automatic"
+msgstr "Automatique"
+
+#: spyderlib\plugins\ipythonconsole.py:149
+msgid "Graphics backend"
+msgstr "Sortie graphique"
+
+#: spyderlib\plugins\ipythonconsole.py:150
+msgid ""
+"Decide how graphics are going to be displayed in the console. If unsure, "
+"please select <b>%s</b> to put graphics inside the console or <b>%s</b> to "
+"interact with them (through zooming and panning) in a separate window."
+msgstr ""
+"Cette option permet de régler la manière dont les graphes seront affichés "
+"dans la console. Par exemple, le mode <b>%s</b> permet l'affichage en ligne "
+"des graphes tandis que le mode <b>%s</b> permet d'interagir avec (zoom/pan) "
+"dans une fenêtre séparée."
+
+#: spyderlib\plugins\ipythonconsole.py:170
+msgid "Backend:"
+msgstr "Sortie :"
+
+#: spyderlib\plugins\ipythonconsole.py:172
+msgid "This option will be applied the next time a console is opened."
+msgstr ""
+"Cette option sera prise en compte lors de la prochaine ouverture de console."
+
+#: spyderlib\plugins\ipythonconsole.py:184
+msgid "Inline backend"
+msgstr "Backend intégré"
+
+#: spyderlib\plugins\ipythonconsole.py:185
+msgid "Decide how to render the figures created by this backend"
+msgstr "Option relative au rendu des figures dans ce backend"
+
+#: spyderlib\plugins\ipythonconsole.py:189
+msgid "Format:"
+msgstr "Format :"
+
+#: spyderlib\plugins\ipythonconsole.py:192
+msgid "Resolution:"
+msgstr "Résolution :"
+
+#: spyderlib\plugins\ipythonconsole.py:192
+msgid "dpi"
+msgstr "ppp"
+
+#: spyderlib\plugins\ipythonconsole.py:194
+msgid "Only used when the format is PNG. Default is 72"
+msgstr "Utilisé uniquement dans le cas du format PNG. Par défaut: 72"
+
+#: spyderlib\plugins\ipythonconsole.py:197
+msgid "Width:"
+msgstr "Largeur :"
+
+#: spyderlib\plugins\ipythonconsole.py:197
+#: spyderlib\plugins\ipythonconsole.py:201
+msgid "inches"
+msgstr "pouces"
+
+#: spyderlib\plugins\ipythonconsole.py:199
+msgid "Default is 6"
+msgstr "Par défaut : 6"
+
+#: spyderlib\plugins\ipythonconsole.py:201
+msgid "Height:"
+msgstr "Hauteur :"
+
+#: spyderlib\plugins\ipythonconsole.py:203
+msgid "Default is 4"
+msgstr "Par défaut : 4"
+
+#: spyderlib\plugins\ipythonconsole.py:218
+msgid "Run code"
+msgstr "Exécuter du code"
+
+#: spyderlib\plugins\ipythonconsole.py:219
+msgid ""
+"You can run several lines of code when a console is started. Please "
+"introduce each one separated by commas, for example:<br><i>import os, import "
+"sys</i>"
+msgstr ""
+"Plusieurs lignes de code peuvent être exécutées lors du démarrage de la "
+"console. Veuillez séparer deux lignes consécutives par une virgule - par "
+"exemple :<br><i>import os, import sys</i>"
+
+#: spyderlib\plugins\ipythonconsole.py:225
+msgid "Lines:"
+msgstr "Lignes :"
+
+#: spyderlib\plugins\ipythonconsole.py:234
+msgid "Run a file"
+msgstr "Exécuter un fichier"
+
+#: spyderlib\plugins\ipythonconsole.py:235
+msgid ""
+"You can also run a whole file at startup instead of just some lines (This is "
+"similar to have a PYTHONSTARTUP file)."
+msgstr "Option similaire à PYTHONSTARTUP pour un interpréteur standard"
+
+#: spyderlib\plugins\ipythonconsole.py:239
+msgid "Use the following file:"
+msgstr "Utiliser le fichier suivant :"
+
+#: spyderlib\plugins\ipythonconsole.py:253
+msgid "Spyder startup"
+msgstr "Démarrage de Spyder"
+
+#: spyderlib\plugins\ipythonconsole.py:254
+msgid "Open an IPython console at startup"
+msgstr "Ouvrir une console IPython au démarrage"
+
+#: spyderlib\plugins\ipythonconsole.py:262
+#, fuzzy
+msgid "Greedy completion"
+msgstr "Entrée valide la complétion de code"
+
+#: spyderlib\plugins\ipythonconsole.py:263
+msgid ""
+"Enable <tt>Tab</tt> completion on elements of lists, results of function "
+"calls, etc, <i>without</i> assigning them to a variable.<br>For example, you "
+"can get completions on things like <tt>li[0].<Tab></tt> or <tt>ins.meth"
+"().<Tab></tt>"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:271
+msgid "Use the greedy completer"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:282
+msgid "Autocall"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:283
+msgid ""
+"Autocall makes IPython automatically call any callable object even if you "
+"didn't type explicit parentheses.<br>For example, if you type <i>str 43</i> "
+"it becomes <i>str(43)</i> automatically."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:290
+#, fuzzy
+msgid "Smart"
+msgstr "Démarrage"
+
+#: spyderlib\plugins\ipythonconsole.py:291
+msgid "Full"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:292
+msgid "Off"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:294
+msgid "Autocall:  "
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:295
+msgid ""
+"On <b>%s</b> mode, Autocall is not applied if there are no arguments after "
+"the callable. On <b>%s</b> mode, all callable objects are automatically "
+"called (even if no arguments are present)."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:307
+msgid "Symbolic Mathematics"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:308
+msgid ""
+"Perfom symbolic operations in the console (e.g. integrals, derivatives, "
+"vector calculus, etc) and get the outputs in a beautifully printed style."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:313
+msgid "Use symbolic math"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:314
+msgid ""
+"This option loads the Sympy library to work with.<br>Please refer to its "
+"documentation to learn how to use it."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:327
+msgid ""
+"This feature requires the Sympy library.\n"
+"It seems you don't have it installed."
+msgstr ""
+"Cette fonctionnalité nécessite l'installation du module Sympy.\n"
+"Ce dernier n'est apparemment pas installé."
+
+#: spyderlib\plugins\ipythonconsole.py:332
+#, fuzzy
+msgid "Prompts"
+msgstr "Propriétés"
+
+#: spyderlib\plugins\ipythonconsole.py:333
+msgid "Modify how Input and Output prompts are shown in the console."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:336
+#, fuzzy
+msgid "Input prompt:"
+msgstr "Copier sans les préfixes"
+
+#: spyderlib\plugins\ipythonconsole.py:338
+msgid ""
+"Default is<br>In [<span class=\"in-prompt-number\">%i</span>]:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:342
+msgid "Output prompt:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:344
+msgid ""
+"Default is<br>Out[<span class=\"out-prompt-number\">%i</span>]:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:360
+msgid "Graphics"
+msgstr "Graphiques"
+
+#: spyderlib\plugins\ipythonconsole.py:364
+msgid "Advanced Settings"
+msgstr "Options avancées"
+
+#: spyderlib\plugins\ipythonconsole.py:447
+msgid "Interrupt kernel"
+msgstr "Interrompre le noyau"
+
+#: spyderlib\plugins\ipythonconsole.py:450
+msgid "Restart kernel"
+msgstr "Redémarrer le noyau"
+
+#: spyderlib\plugins\ipythonconsole.py:455
+msgid "Intro to IPython"
+msgstr "Introduction à IPython"
+
+#: spyderlib\plugins\ipythonconsole.py:457
+msgid "Quick Reference"
+msgstr "Documentation de IPython"
+
+#: spyderlib\plugins\ipythonconsole.py:459
+msgid "Console help"
+msgstr "Aide sur la console"
+
+#: spyderlib\plugins\ipythonconsole.py:461
+#: spyderlib\widgets\internalshell.py:254
+msgid "Help"
+msgstr "Aide"
+
+#: spyderlib\plugins\ipythonconsole.py:462
+msgid "IPython Help"
+msgstr "Aide IPython"
+
+#: spyderlib\plugins\ipythonconsole.py:498
+msgid "Inspect current object"
+msgstr "Inspecter l'onglet courant"
+
+#: spyderlib\plugins\ipythonconsole.py:502
+msgid "Clear line or block"
+msgstr "Effacer la ligne ou le bloc"
+
+#: spyderlib\plugins\ipythonconsole.py:506
+msgid "Clear console"
+msgstr "Effacer la console"
+
+#: spyderlib\plugins\ipythonconsole.py:545
+msgid ""
+"It seems the kernel died unexpectedly. Use 'Restart kernel' to continue "
+"using this console."
+msgstr ""
+"Le noyau a été arrêté de façon inattendue. Redémarrez le noyau pour "
+"continuer d'utiliser cette console."
+
+#: spyderlib\plugins\ipythonconsole.py:557
+msgid "Kernel process is either remote or unspecified. Cannot interrupt"
+msgstr ""
+"Le processus du noyau est soit distant, soit non spécifié : impossible "
+"d'arrêter le noyau."
+
+#: spyderlib\plugins\ipythonconsole.py:566
+msgid "Kernel process is either remote or unspecified. Cannot restart."
+msgstr ""
+"Le processus du noyau est soit distant, soit non spécifié : impossible de "
+"redémarrer le noyau."
+
+#: spyderlib\plugins\ipythonconsole.py:730
+msgid ""
+"No IPython console is currently available to run <b>%s</b>.<br><br>Please "
+"open a new one and try again."
+msgstr ""
+"Aucun client IPython n'est actuellement sélectionné pour exécuter <b>%s</b>."
+"<br><br>Merci d'ouvrir un nouveau client IPython et de réessayer."
+
+#: spyderlib\plugins\ipythonconsole.py:754
+msgid "Connect to an existing kernel"
+msgstr "Connecter à un noyau existant"
+
+#: spyderlib\plugins\ipythonconsole.py:756
+msgid "Open a new IPython client connected to an external kernel"
+msgstr "Ouvrir un nouveau client IPython connecté à un noyau externe"
+
+#: spyderlib\plugins\ipythonconsole.py:870
+msgid "(for example: `kernel-3764.json`, or simply `3764`)"
+msgstr "(exemple: `kernel-3764.json`, ou simplement `3764`)"
+
+#: spyderlib\plugins\ipythonconsole.py:872
+#: spyderlib\plugins\ipythonconsole.py:912
+msgid "IPython"
+msgstr "IPython"
+
+#: spyderlib\plugins\ipythonconsole.py:873
+msgid "Provide an IPython kernel connection file:"
+msgstr "Fichier de connexion du noyau IPython :"
+
+#: spyderlib\plugins\ipythonconsole.py:913
+msgid "Unable to connect to IPython kernel <b>`%s`"
+msgstr "Impossible de se connecter au noyau IPython <b>`%s`"
+
+#: spyderlib\plugins\ipythonconsole.py:1107
+msgid ""
+"%s will be closed.\n"
+"Do you want to kill the associated kernel and all of its clients?"
+msgstr ""
+"%s va être fermé.\n"
+"Souhaitez-vous fermer également le noyau associé et tous ses autres clients ?"
+
+#: spyderlib\plugins\ipythonconsole.py:1153
+msgid "Are you sure you want to restart the kernel?"
+msgstr "Souhaitez-vous vraiment redémarrer le noyau ?"
+
+#: spyderlib\plugins\ipythonconsole.py:1155
+msgid "Restart kernel?"
+msgstr "Redémarrer le noyau"
+
+#: spyderlib\plugins\onlinehelp.py:67
+msgid "Online help"
+msgstr "Aide en ligne"
+
+#: spyderlib\plugins\outlineexplorer.py:47
+#: spyderlib\widgets\editortools.py:164
+msgid "Outline"
+msgstr "Structure"
+
+#: spyderlib\plugins\projectexplorer.py:43
+#: spyderlib\widgets\projectexplorer.py:1136
+#: spyderlib\widgets\projectexplorer.py:1150
+msgid "Project explorer"
+msgstr "Explorateur de projets"
+
+#: spyderlib\plugins\projectexplorer.py:54
+#: spyderlib\widgets\projectexplorer.py:544
+msgid "New project..."
+msgstr "Nouveau projet..."
+
+#: spyderlib\plugins\runconfig.py:28
+msgid "Execute in current Python or IPython interpreter"
+msgstr "Exécuter dans l'interpréteur Python ou IPython actif"
+
+#: spyderlib\plugins\runconfig.py:29
+msgid "Execute in a new dedicated Python interpreter"
+msgstr "Exécuter dans un nouvel interpréteur Python dédié"
+
+#: spyderlib\plugins\runconfig.py:30
+msgid "Execute in an external System terminal"
+msgstr "Exécuter dans un terminal système externe"
+
+#: spyderlib\plugins\runconfig.py:40
+msgid "Always show %s on a first file run"
+msgstr "Toujours afficher %s lors de la première exécution d'un script"
+
+#: spyderlib\plugins\runconfig.py:150
+msgid "General settings"
+msgstr "Options générales"
+
+#: spyderlib\plugins\runconfig.py:153 spyderlib\plugins\runconfig.py:194
+msgid "Command line options:"
+msgstr "Options en ligne de commande :"
+
+#: spyderlib\plugins\runconfig.py:160
+msgid "Working directory:"
+msgstr "Répertoire de travail :"
+
+#: spyderlib\plugins\runconfig.py:175 spyderlib\plugins\runconfig.py:438
+msgid "Interpreter"
+msgstr "Interpréteur"
+
+#: spyderlib\plugins\runconfig.py:186
+msgid "Dedicated Python interpreter"
+msgstr "Interpréteur Python dédié"
+
+#: spyderlib\plugins\runconfig.py:191
+msgid "Interact with the Python interpreter after execution"
+msgstr "Intéragir avec l'interpréteur Python après l'exécution"
+
+#: spyderlib\plugins\runconfig.py:200
+msgid "<b>-u</b> is added to the other options you set here"
+msgstr "L'option <b>-u</b> est ajoutée aux autres options spécifiées ici"
+
+#: spyderlib\plugins\runconfig.py:211
+msgid "this dialog"
+msgstr "cette fenêtre"
+
+#: spyderlib\plugins\runconfig.py:267
+msgid "Run configuration"
+msgstr "Configuration d'exécution"
+
+#: spyderlib\plugins\runconfig.py:268
+msgid "The following working directory is not valid:<br><b>%s</b>"
+msgstr "Le répertoire de travail suivant n'est pas valide :<br><b>%s</b>"
+
+#: spyderlib\plugins\runconfig.py:344
+msgid "Run settings for %s"
+msgstr "Options d'exécution pour %s"
+
+#: spyderlib\plugins\runconfig.py:375
+msgid "Select a run configuration:"
+msgstr "Sélectionner une configuration d'exécution :"
+
+#: spyderlib\plugins\runconfig.py:405 spyderlib\plugins\runconfig.py:430
+msgid "Run Settings"
+msgstr "Options d'exécution"
+
+#: spyderlib\plugins\runconfig.py:432
+msgid ""
+"The following are the default <i>%s</i>. These options may be overriden "
+"using the <b>%s</b> dialog box (see the <b>%s</b> menu)"
+msgstr ""
+"La page suivante présente les réglages par défaut pour les <i>%s</i>. Ces "
+"réglages peuvent être remplacés à tout moment en utilisant la boîte de "
+"dialogue <b>%s</b> (voir le menu <b>%s</b>)"
+
+#: spyderlib\plugins\runconfig.py:456
+#: spyderlib\widgets\externalshell\pythonshell.py:293
+msgid "Working directory"
+msgstr "Répertoire de travail"
+
+#: spyderlib\plugins\runconfig.py:458
+msgid "Default working directory is:"
+msgstr "Le répertoire de travail par défaut est :"
+
+#: spyderlib\plugins\runconfig.py:460
+msgid "the script directory"
+msgstr "le répertoire du fichier à exécuter"
+
+#: spyderlib\plugins\runconfig.py:463 spyderlib\plugins\workingdirectory.py:54
+msgid "the following directory:"
+msgstr "le répertoire suivant :"
+
+#: spyderlib\plugins\runconfig.py:482
+msgid "Run Settings dialog"
+msgstr "la fenêtre Options d'exécution"
+
+#: spyderlib\plugins\shortcuts.py:178
+msgid "Context"
+msgstr "Contexte"
+
+#: spyderlib\plugins\shortcuts.py:180 spyderlib\widgets\dicteditor.py:147
+#: spyderlib\widgets\importwizard.py:470
+msgid "Name"
+msgstr "Nom"
+
+#: spyderlib\plugins\shortcuts.py:182
+msgid "Mod1"
+msgstr "Mod1"
+
+#: spyderlib\plugins\shortcuts.py:184
+msgid "Mod2"
+msgstr "Mod2"
+
+#: spyderlib\plugins\shortcuts.py:186
+msgid "Mod3"
+msgstr "Mod3"
+
+#: spyderlib\plugins\shortcuts.py:188 spyderlib\widgets\dicteditor.py:158
+msgid "Key"
+msgstr "Clé"
+
+#: spyderlib\plugins\shortcuts.py:321
+msgid "Conflicts"
+msgstr "Conflits"
+
+#: spyderlib\plugins\shortcuts.py:322
+msgid "The following conflicts have been detected:"
+msgstr "Les conflits suivants ont été détectés :"
+
+#: spyderlib\plugins\shortcuts.py:334
+msgid "Keyboard shortcuts"
+msgstr "Raccourcis clavier"
+
+#: spyderlib\plugins\variableexplorer.py:24
+msgid "Autorefresh"
+msgstr "Rafraîchissement automatique"
+
+#: spyderlib\plugins\variableexplorer.py:25
+msgid "Enable autorefresh"
+msgstr "Activer le rafraîchissement automatique"
+
+#: spyderlib\plugins\variableexplorer.py:27
+msgid "Refresh interval: "
+msgstr "Période de rafraîchissement : "
+
+#: spyderlib\plugins\variableexplorer.py:28
+msgid " ms"
+msgstr " ms"
+
+#: spyderlib\plugins\variableexplorer.py:31
+msgid "Filter"
+msgstr "Filtre"
+
+#: spyderlib\plugins\variableexplorer.py:33
+#: spyderlib\widgets\externalshell\namespacebrowser.py:191
+msgid "Exclude private references"
+msgstr "Exclure les références privées"
+
+#: spyderlib\plugins\variableexplorer.py:34
+#: spyderlib\widgets\externalshell\namespacebrowser.py:206
+msgid "Exclude capitalized references"
+msgstr "Exclure les références commençant par une majuscule"
+
+#: spyderlib\plugins\variableexplorer.py:35
+#: spyderlib\widgets\externalshell\namespacebrowser.py:199
+msgid "Exclude all-uppercase references"
+msgstr "Exclure les références en lettres capitales"
+
+#: spyderlib\plugins\variableexplorer.py:36
+#: spyderlib\widgets\externalshell\namespacebrowser.py:214
+msgid "Exclude unsupported data types"
+msgstr "Exclure les types non supportés"
+
+#: spyderlib\plugins\variableexplorer.py:43
+#: spyderlib\widgets\dicteditor.py:591
+msgid "Truncate values"
+msgstr "Tronquer les valeurs"
+
+#: spyderlib\plugins\variableexplorer.py:44
+#: spyderlib\widgets\dicteditor.py:604
+msgid "Always edit in-place"
+msgstr "Édition en ligne pour tous les types"
+
+#: spyderlib\plugins\variableexplorer.py:45
+#: spyderlib\widgets\dicteditor.py:600
+msgid "Show collection contents"
+msgstr "Afficher le contenu des séquences"
+
+#: spyderlib\plugins\variableexplorer.py:48
+#: spyderlib\widgets\dicteditor.py:595
+msgid "Show arrays min/max"
+msgstr "Afficher les min/max des tableaux"
+
+#: spyderlib\plugins\variableexplorer.py:50
+#: spyderlib\widgets\dicteditor.py:1251
+msgid "Edit data in the remote process"
+msgstr "Éditeurs dans le processus distant"
+
+#: spyderlib\plugins\variableexplorer.py:51
+#: spyderlib\widgets\dicteditor.py:1252
+msgid ""
+"Editors are opened in the remote process for NumPy arrays, PIL images, "
+"lists, tuples and dictionaries.\n"
+"This avoids transfering large amount of data between the remote process and "
+"Spyder (through the socket)."
+msgstr ""
+"Les tableaux NumPy, images PIL, listes, tuples et dictionnaires seront "
+"modifiés dans un éditeur exécuté dans le processus distant.\n"
+"Cela permet d'éviter de transférer de gros volumes de données entre le "
+"processus distant et Spyder (à travers le socket)."
+
+#: spyderlib\plugins\variableexplorer.py:162
+msgid "Variable explorer"
+msgstr "Explorateur de variables"
+
+#: spyderlib\plugins\workingdirectory.py:35
+msgid ""
+"The <b>global working directory</b> is the working directory for newly "
+"opened <i>consoles</i> (Python/IPython interpreters and terminals), for the "
+"<i>file explorer</i>, for the <i>find in files</i> plugin and for new files "
+"created in the <i>editor</i>."
+msgstr ""
+"Le <b>répertoire de travail global</b> est le répertoire de travail utilisé "
+"pour les nouvelles <i>consoles</i> (interpréteurs Python/IPython et "
+"terminaux), pour l'<i>explorateur de fichiers</i>, pour la <i>recherche dans "
+"les fichiers</i> et pour les fichiers créés dans l'<i>éditeur</i>."
+
+#: spyderlib\plugins\workingdirectory.py:44
+msgid "At startup, the global working directory is:"
+msgstr "Au démarrage, le répertoire de travail global est :"
+
+#: spyderlib\plugins\workingdirectory.py:48
+msgid "the same as in last session"
+msgstr "celui utilisé lors de la dernière session"
+
+#: spyderlib\plugins\workingdirectory.py:50
+msgid "At startup, Spyder will restore the global directory from last session"
+msgstr ""
+"Au démarrage, Spyder reprendra le répertoire de travail global de la "
+"dernière session"
+
+#: spyderlib\plugins\workingdirectory.py:56
+msgid "At startup, the global working directory will be the specified path"
+msgstr ""
+"Au démarrage, le répertoire de travail global sera le chemin d'accès "
+"spécifié ici"
+
+#: spyderlib\plugins\workingdirectory.py:70
+msgid "Files are opened from:"
+msgstr "Les fichiers sont ouverts depuis :"
+
+#: spyderlib\plugins\workingdirectory.py:74
+#: spyderlib\plugins\workingdirectory.py:87
+msgid "the current file directory"
+msgstr "le répertoire du fichier en cours d'édition"
+
+#: spyderlib\plugins\workingdirectory.py:78
+#: spyderlib\plugins\workingdirectory.py:91
+msgid "the global working directory"
+msgstr "le répertoire de travail global"
+
+#: spyderlib\plugins\workingdirectory.py:82 spyderlib\widgets\explorer.py:613
+#: spyderlib\widgets\explorer.py:620
+msgid "New file"
+msgstr "Nouveau fichier"
+
+#: spyderlib\plugins\workingdirectory.py:83
+msgid "Files are created in:"
+msgstr "Les fichiers sont créés dans :"
+
+#: spyderlib\plugins\workingdirectory.py:97
+msgid "Change to file base directory"
+msgstr "Sélectionner le répertoire de base du fichier"
+
+#: spyderlib\plugins\workingdirectory.py:99
+msgid "When opening a file"
+msgstr "Lors de l'ouverture d'un fichier"
+
+#: spyderlib\plugins\workingdirectory.py:101
+msgid "When saving a file"
+msgstr "Lors de l'enregistrement d'un fichier"
+
+#: spyderlib\plugins\workingdirectory.py:168
+msgid "Back"
+msgstr "Retour"
+
+#: spyderlib\plugins\workingdirectory.py:176 spyderlib\widgets\explorer.py:977
+#: spyderlib\widgets\importwizard.py:489
+msgid "Next"
+msgstr "Suivant"
+
+#: spyderlib\plugins\workingdirectory.py:189
+msgid ""
+"This is the working directory for newly\n"
+"opened consoles (Python interpreters and\n"
+"terminals), for the file explorer, for the\n"
+"find in files plugin and for new files\n"
+"created in the editor"
+msgstr ""
+"Ceci est le répertoire de travail utilisé pour\n"
+"les nouvelles consoles (interpréteurs Python\n"
+"et fenêtres de commandes), pour l'explorateur\n"
+"de fichiers, pour la recherche dans les fichiers\n"
+"et pour les fichiers créés dans l'éditeur"
+
+#: spyderlib\plugins\workingdirectory.py:215
+msgid "Browse a working directory"
+msgstr "Sélectionner un répertoire de travail"
+
+#: spyderlib\plugins\workingdirectory.py:221
+msgid "Set as current console's working directory"
+msgstr "Changer le répertoire de travail de la console actuelle"
+
+#: spyderlib\plugins\workingdirectory.py:229
+msgid "Change to parent directory"
+msgstr "Aller au répertoire parent"
+
+#: spyderlib\plugins\workingdirectory.py:236
+msgid "Global working directory"
+msgstr "Répertoire de travail global"
+
+#: spyderlib\spyder.py:38
+#, fuzzy
+msgid "IPython Console integration"
+msgstr "Intégration de la console Qt IPython"
+
+#: spyderlib\spyder.py:247
+msgid "PyQt4 Reference Guide"
+msgstr "Guide de référence de PyQt4"
+
+#: spyderlib\spyder.py:250
+msgid "PyQt4 API Reference"
+msgstr "Documentation de l'API de PyQt4"
+
+#: spyderlib\spyder.py:252
+msgid "Python(x,y)"
+msgstr "Python(x,y)"
+
+#: spyderlib\spyder.py:254
+msgid "WinPython"
+msgstr "WinPython"
+
+#: spyderlib\spyder.py:256
+msgid "Numpy and Scipy documentation"
+msgstr "Documentation de Numpy et Scipy"
+
+#: spyderlib\spyder.py:259 spyderlib\spyder.py:919
+msgid "Matplotlib documentation"
+msgstr "Documentation de Matplotlib"
+
+#: spyderlib\spyder.py:293
+msgid "Reload last session"
+msgstr "Recharger la session précédente"
+
+#: spyderlib\spyder.py:297
+msgid "Load session..."
+msgstr "Charger une session..."
+
+#: spyderlib\spyder.py:300
+msgid "Load Spyder session"
+msgstr "Charger une session Spyder"
+
+#: spyderlib\spyder.py:302
+msgid "Save session and quit..."
+msgstr "Enregistrer la session et quitter..."
+
+#: spyderlib\spyder.py:305
+msgid "Save current session and quit application"
+msgstr "Enregistrer la session en cours et quitter l'application"
+
+#: spyderlib\spyder.py:412
+msgid "Initializing..."
+msgstr "Initialisation..."
+
+#: spyderlib\spyder.py:473
+msgid "Close current dockwidget"
+msgstr "Fermer le panneau actif"
+
+#: spyderlib\spyder.py:479
+msgid "&Find text"
+msgstr "Rec&hercher"
+
+#: spyderlib\spyder.py:485
+msgid "Find &next"
+msgstr "Rechercher le &suivant"
+
+#: spyderlib\spyder.py:491
+msgid "Find &previous"
+msgstr "Rechercher le &précédent"
+
+#: spyderlib\spyder.py:496
+msgid "&Replace text"
+msgstr "&Remplacer"
+
+#: spyderlib\spyder.py:511 spyderlib\widgets\sourcecode\codeeditor.py:2219
+msgid "Undo"
+msgstr "Annuler"
+
+#: spyderlib\spyder.py:513 spyderlib\widgets\sourcecode\codeeditor.py:2222
+msgid "Redo"
+msgstr "Répéter"
+
+#: spyderlib\spyder.py:514 spyderlib\widgets\arrayeditor.py:327
+#: spyderlib\widgets\dicteditor.py:563 spyderlib\widgets\shell.py:121
+#: spyderlib\widgets\sourcecode\codeeditor.py:2228
+msgid "Copy"
+msgstr "Copier"
+
+#: spyderlib\spyder.py:516 spyderlib\widgets\shell.py:117
+#: spyderlib\widgets\sourcecode\codeeditor.py:2225
+msgid "Cut"
+msgstr "Couper"
+
+#: spyderlib\spyder.py:517 spyderlib\widgets\dicteditor.py:560
+#: spyderlib\widgets\shell.py:125
+#: spyderlib\widgets\sourcecode\codeeditor.py:2231
+msgid "Paste"
+msgstr "Coller"
+
+#: spyderlib\spyder.py:519 spyderlib\widgets\explorer.py:453
+#: spyderlib\widgets\projectexplorer.py:1002 spyderlib\widgets\shell.py:134
+#: spyderlib\widgets\sourcecode\codeeditor.py:2234
+msgid "Delete"
+msgstr "Supprimer"
+
+#: spyderlib\spyder.py:522 spyderlib\widgets\shell.py:138
+#: spyderlib\widgets\sourcecode\codeeditor.py:2238
+msgid "Select All"
+msgstr "Sélectionner tout"
+
+#: spyderlib\spyder.py:570
+msgid "&Interpreters"
+msgstr "&Interpréteurs"
+
+#: spyderlib\spyder.py:576
+msgid "&View"
+msgstr "&Affichage"
+
+#: spyderlib\spyder.py:584
+msgid "Welcome to Spyder!"
+msgstr "Bienvenue dans Spyder !"
+
+#: spyderlib\spyder.py:589
+msgid "Pre&ferences"
+msgstr "Pré&férences"
+
+#: spyderlib\spyder.py:595 spyderlib\widgets\pathmanager.py:45
+#: spyderlib\widgets\projectexplorer.py:593
+msgid "PYTHONPATH manager"
+msgstr "Gestionnaire de PYTHONPATH"
+
+#: spyderlib\spyder.py:598
+msgid "Open Spyder path manager"
+msgstr "Ouvre le gestionnaire de chemin d'accès de Spyder"
+
+#: spyderlib\spyder.py:601
+msgid "Update module names list"
+msgstr "Mise à jour de la liste des modules"
+
+#: spyderlib\spyder.py:604
+msgid "Refresh list of module names available in PYTHONPATH"
+msgstr ""
+"Mise à jour de la liste des modules disponibles notamment à travers "
+"PYTHONPATH"
+
+#: spyderlib\spyder.py:610
+msgid "Current user environment variables..."
+msgstr "Variables d'environnement de l'utilisateur..."
+
+#: spyderlib\spyder.py:612
+msgid ""
+"Show and edit current user environment variables in Windows registry (i.e. "
+"for all sessions)"
+msgstr ""
+"Afficher et modifier les variables d'environnement de l'utilisateur courant "
+"dans Windows (c'est-à-dire directement dans la base de registre)"
+
+#: spyderlib\spyder.py:619 spyderlib\spyder.py:994
+msgid "External Tools"
+msgstr "Outils externes"
+
+#: spyderlib\spyder.py:623
+msgid "Python(x,y) launcher"
+msgstr "Accueil de Python(x,y)"
+
+#: spyderlib\spyder.py:634
+msgid "WinPython control panel"
+msgstr "Panneau de contrôle WinPython"
+
+#: spyderlib\spyder.py:647
+msgid "Qt Designer"
+msgstr "Qt Designer"
+
+#: spyderlib\spyder.py:652
+msgid "Qt Linguist"
+msgstr "Qt Linguist"
+
+#: spyderlib\spyder.py:658
+msgid "Qt examples"
+msgstr "Exemples Qt"
+
+#: spyderlib\spyder.py:675
+msgid "guidata examples"
+msgstr "Exemples guidata"
+
+#: spyderlib\spyder.py:683
+msgid "guiqwt examples"
+msgstr "Exemples guiqwt"
+
+#: spyderlib\spyder.py:688
+msgid "Sift"
+msgstr "Sift"
+
+#: spyderlib\spyder.py:696
+msgid "ViTables"
+msgstr "ViTables"
+
+#: spyderlib\spyder.py:710
+msgid "Fullscreen mode"
+msgstr "Mode plein écran"
+
+#: spyderlib\spyder.py:720
+msgid "Main toolbar"
+msgstr "Barre d'outil principale"
+
+#: spyderlib\spyder.py:739
+msgid "Loading object inspector..."
+msgstr "Chargement de l'inspecteur d'objet..."
+
+#: spyderlib\spyder.py:745
+msgid "Loading outline explorer..."
+msgstr "Chargement de l'explorateur de structure..."
+
+#: spyderlib\spyder.py:752
+msgid "Loading editor..."
+msgstr "Chargement de l'éditeur..."
+
+#: spyderlib\spyder.py:775
+msgid "Loading file explorer..."
+msgstr "Chargement de l'explorateur de fichiers..."
+
+#: spyderlib\spyder.py:781
+msgid "Loading history plugin..."
+msgstr "Chargement du journal d'historique..."
+
+#: spyderlib\spyder.py:787
+msgid "Loading online help..."
+msgstr "Chargement de l'aide en ligne..."
+
+#: spyderlib\spyder.py:793
+msgid "Loading project explorer..."
+msgstr "Chargement de l'explorateur de projet..."
+
+#: spyderlib\spyder.py:803
+msgid "Loading external console..."
+msgstr "Chargement de la console externe..."
+
+#: spyderlib\spyder.py:811
+msgid "Loading namespace browser..."
+msgstr "Chargement de l'explorateur d'espace de noms..."
+
+#: spyderlib\spyder.py:820
+msgid "Loading IPython console..."
+msgstr "Chargement de la console IPython..."
+
+#: spyderlib\spyder.py:831
+msgid "Setting up main window..."
+msgstr "Configuration de la fenêtre principale..."
+
+#: spyderlib\spyder.py:835
+msgid "About %s..."
+msgstr "À propos de %s..."
+
+#: spyderlib\spyder.py:838
+msgid "Optional dependencies..."
+msgstr "Dépendances optionnelles..."
+
+#: spyderlib\spyder.py:842
+msgid "Report issue..."
+msgstr "Rapport d'erreur..."
+
+#: spyderlib\spyder.py:863
+msgid "Spyder documentation"
+msgstr "Documentation de Spyder"
+
+#: spyderlib\spyder.py:869
+msgid "Python documentation"
+msgstr "Documentation de Python"
+
+#: spyderlib\spyder.py:875
+msgid "Qt Assistant"
+msgstr "Qt Assistant (documentation Qt)"
+
+#: spyderlib\spyder.py:909
+msgid "Python(x,y) documentation folder"
+msgstr "Dossier de documentation Python(x,y)"
+
+#: spyderlib\spyder.py:911
+msgid "IPython documentation"
+msgstr "Documentation de IPython"
+
+#: spyderlib\spyder.py:913
+msgid "guidata documentation"
+msgstr "Documentation de guidata"
+
+#: spyderlib\spyder.py:916
+msgid "guiqwt documentation"
+msgstr "Documentation de guiqwt"
+
+#: spyderlib\spyder.py:922
+msgid "NumPy documentation"
+msgstr "Documentation de NumPy"
+
+#: spyderlib\spyder.py:924
+msgid "NumPy reference guide"
+msgstr "Manuel de référence de NumPy"
+
+#: spyderlib\spyder.py:926
+msgid "NumPy user guide"
+msgstr "Manuel de l'utilisateur de NumPy"
+
+#: spyderlib\spyder.py:928
+msgid "SciPy documentation"
+msgstr "Documentation de SciPy"
+
+#: spyderlib\spyder.py:935
+msgid "Web Resources"
+msgstr "Documentation en ligne"
+
+#: spyderlib\spyder.py:956
+msgid "Windows and toolbars"
+msgstr "Fenêtres et barres d'outils"
+
+#: spyderlib\spyder.py:960
+msgid "Reset window layout"
+msgstr "Réinitialiser la disposition des fenêtres"
+
+#: spyderlib\spyder.py:962
+msgid "Custom window layouts"
+msgstr "Dispositions de fenêtres personnalisées"
+
+#: spyderlib\spyder.py:968
+msgid "Switch to/from layout %d"
+msgstr "Basculer vers/depuis la disposition %d"
+
+#: spyderlib\spyder.py:974
+msgid "Set layout %d"
+msgstr "Définir la disposition %d"
+
+#: spyderlib\spyder.py:984
+msgid "Attached console window (debugging)"
+msgstr "Invite de commandes attaché (débogage)"
+
+#: spyderlib\spyder.py:1242
+msgid ""
+"Window layout will be reset to default settings: this affects window "
+"position, size and dockwidgets.\n"
+"Do you want to continue?"
+msgstr ""
+"La disposition des fenêtres sera réinitialisée selon les réglages par "
+"défaut.\n"
+"Souhaitez-vous continuer ?"
+
+#: spyderlib\spyder.py:1260
+msgid "Quick switch layout #%d has not yet been defined."
+msgstr ""
+"La disposition de fenêtre personnalisée n°%d n'a pas encore été définie."
+
+#: spyderlib\spyder.py:1451
+msgid "Maximize current plugin"
+msgstr "Agrandir la fenêtre courante"
+
+#: spyderlib\spyder.py:1452
+msgid "Maximize current plugin to fit the whole application window"
+msgstr ""
+"Agrandir la fenêtre courante sur toute la surface de la fenêtre principale"
+
+#: spyderlib\spyder.py:1456
+msgid "Restore current plugin"
+msgstr "Réduire la fenêtre courante"
+
+#: spyderlib\spyder.py:1457
+msgid ""
+"Restore current plugin to its original size and position within the "
+"application window"
+msgstr ""
+"Réduire la fenêtre courante à sa taille et position d'origine au sein de la "
+"fenêtre principale"
+
+#: spyderlib\spyder.py:1529
+msgid "(not installed)"
+msgstr "(non installé)"
+
+#: spyderlib\spyder.py:1547
+msgid "About %s"
+msgstr "À propos de %s"
+
+#: spyderlib\spyder.py:1711
+msgid "Running an external system terminal is not supported on platform %s."
+msgstr ""
+"L'exécution dans un terminal système externe n'est pas prise en charge sur "
+"la plateforme %s."
+
+#: spyderlib\spyder.py:1910
+msgid "Open session"
+msgstr "Ouvrir une session"
+
+#: spyderlib\spyder.py:1911 spyderlib\spyder.py:1922
+msgid "Spyder sessions"
+msgstr "Sessions Spyder"
+
+#: spyderlib\spyder.py:1921
+msgid "Save session"
+msgstr "Enregistrer la session"
+
+#: spyderlib\utils\codeanalysis.py:83
+msgid "Real-time code analysis on the Editor"
+msgstr "Analyse de code temps réel dans l'éditeur"
+
+#: spyderlib\utils\codeanalysis.py:87
+msgid "Real-time code style analysis on the Editor"
+msgstr "Analyse de code temps réel dans l'éditeur"
+
+#: spyderlib\utils\environ.py:96
+msgid ""
+"Module <b>pywin32 was not found</b>.<br>Please restart this Windows "
+"<i>session</i> (not the computer) for changes to take effect."
+msgstr ""
+"Le module <b>pywin32 n'est pas installé</b>.<br>Merci de redémarrer la "
+"<i>session</i> en cours (et non l'ordinateur) pour que les changements "
+"effectués prennent effet."
+
+#: spyderlib\utils\environ.py:109
+msgid ""
+"If you accept changes, this will modify the current user environment "
+"variables directly <b>in Windows registry</b>. Use it with precautions, at "
+"your own risks.<br><br>Note that for changes to take effect, you will need "
+"to restart the parent process of this application (simply restart Spyder if "
+"you have executed it from a Windows shortcut, otherwise restart any "
+"application from which you may have executed it, like <i>Python(x,y) Home</"
+"i> for example)"
+msgstr ""
+"Si vous acceptez les changements effectués, cela modifiera les variables "
+"d'environnement de l'utilisateur courant directement <b>dans la base de "
+"registre Windows</b>. Utilisez cette fonctionnalité avec précautions et à "
+"vos risques et périls.<br><br>Notez que pour que les changements effectués "
+"prennent effet, il sera nécessaire de redémarrer le processus parent de "
+"cette application (redémarrez simplement Spyder si vous l'avez exécuté à "
+"partir d'un raccourci Windows, sinon redémarrez toute application ayant "
+"servie à exécuter Spyder : <i>Python(x,y) Home</i> ou un invite de commandes "
+"par exemple)"
+
+#: spyderlib\utils\inspector\sphinxify.py:197
+#: spyderlib\utils\inspector\sphinxify.py:207
+msgid ""
+"It was not possible to generate rich text help for this object.</br>Please "
+"see it in plain text."
+msgstr ""
+"Le processus de génération de l'aide sous la forme de texte enrichi a échoué."
+"</br>Merci d'activer le mode d'affichage en texte brut."
+
+#: spyderlib\utils\iofuncs.py:331
+msgid "Supported files"
+msgstr "Fichiers compatibles"
+
+#: spyderlib\utils\iofuncs.py:342
+msgid "Spyder data files"
+msgstr "Fichiers Spyder"
+
+#: spyderlib\utils\iofuncs.py:344 spyderlib\widgets\dicteditor.py:924
+msgid "NumPy arrays"
+msgstr "Tableaux NumPy"
+
+#: spyderlib\utils\iofuncs.py:345
+msgid "Matlab files"
+msgstr "Fichiers Matlab"
+
+#: spyderlib\utils\iofuncs.py:346
+msgid "CSV text files"
+msgstr "Fichiers texte CSV"
+
+#: spyderlib\utils\iofuncs.py:348
+msgid "JPEG images"
+msgstr "Images JPEG"
+
+#: spyderlib\utils\iofuncs.py:349
+msgid "PNG images"
+msgstr "Images PNG"
+
+#: spyderlib\utils\iofuncs.py:350
+msgid "GIF images"
+msgstr "Images GIF"
+
+#: spyderlib\utils\iofuncs.py:351
+msgid "TIFF images"
+msgstr "Images TIFF"
+
+#: spyderlib\utils\iofuncs.py:370 spyderlib\utils\iofuncs.py:377
+msgid "<b>Unsupported file type '%s'</b>"
+msgstr "<b>Type de fichier non pris en charge '%s'</b>"
+
+#: spyderlib\widgets\arrayeditor.py:315 spyderlib\widgets\arrayeditor.py:488
+#: spyderlib\widgets\arrayeditor.py:574
+msgid "Array editor"
+msgstr "Éditeur de tableaux"
+
+#: spyderlib\widgets\arrayeditor.py:316
+msgid ""
+"Resizing cells of a table of such size could take a long time.\n"
+"Do you want to continue anyway?"
+msgstr ""
+"Redimensionner les cellules d'un tableau d'une telle taille peut prendre du "
+"temps.\n"
+"Souhaitez-vous néanmoins continuer ?"
+
+#: spyderlib\widgets\arrayeditor.py:387 spyderlib\widgets\arrayeditor.py:420
+msgid "Format"
+msgstr "Format"
+
+#: spyderlib\widgets\arrayeditor.py:392
+msgid "Resize"
+msgstr "Ajuster"
+
+#: spyderlib\widgets\arrayeditor.py:421
+msgid "Float formatting"
+msgstr "Format de flottant"
+
+#: spyderlib\widgets\arrayeditor.py:428 spyderlib\widgets\explorer.py:549
+#: spyderlib\widgets\explorer.py:650
+#: spyderlib\widgets\externalshell\pythonshell.py:522
+#: spyderlib\widgets\externalshell\systemshell.py:93
+msgid "Error"
+msgstr "Erreur"
+
+#: spyderlib\widgets\arrayeditor.py:429
+msgid "Format (%s) is incorrect"
+msgstr "Le format (%s) n'est pas valide"
+
+#: spyderlib\widgets\arrayeditor.py:460
+msgid "Array is empty"
+msgstr "Ce tableau est vide"
+
+#: spyderlib\widgets\arrayeditor.py:463
+msgid "Arrays with more than 2 dimensions are not supported"
+msgstr "Les tableaux de plus de deux dimensions ne sont pas pris en charge"
+
+#: spyderlib\widgets\arrayeditor.py:467
+msgid "The 'xlabels' argument length do no match array column number"
+msgstr ""
+"La taille de 'xlabels' ne correspond pas au nombre de colonnes du tableau"
+
+#: spyderlib\widgets\arrayeditor.py:471
+msgid "The 'ylabels' argument length do no match array row number"
+msgstr ""
+"La taille de 'ylabels' ne correspond pas au nombre de lignes du tableau"
+
+#: spyderlib\widgets\arrayeditor.py:478
+msgid "%s arrays"
+msgstr "Les tableaux %s"
+
+#: spyderlib\widgets\arrayeditor.py:479
+msgid "%s are currently not supported"
+msgstr "%s ne sont actuellement pas pris en charge"
+
+#: spyderlib\widgets\arrayeditor.py:490
+msgid "read only"
+msgstr "lecture seule"
+
+#: spyderlib\widgets\arrayeditor.py:519
+msgid "Record array fields:"
+msgstr "Champs du tableau : "
+
+#: spyderlib\widgets\arrayeditor.py:531
+msgid "Data"
+msgstr "Données"
+
+#: spyderlib\widgets\arrayeditor.py:531
+msgid "Mask"
+msgstr "Masque"
+
+#: spyderlib\widgets\arrayeditor.py:531
+msgid "Masked data"
+msgstr "Données masquées"
+
+#: spyderlib\widgets\arrayeditor.py:538
+msgid "<u>Warning</u>: changes are applied separately"
+msgstr "<u>Attention</u>: les changements seront pris en compte séparément"
+
+#: spyderlib\widgets\arrayeditor.py:539
+msgid ""
+"For performance reasons, changes applied to masked array won't be reflected "
+"in array's data (and vice-versa)."
+msgstr ""
+"Pour des questions de performance, les changements effectués sur les données "
+"masquées ne seront pas reflétées sur les données du tableau (et "
+"réciproquement)."
+
+#: spyderlib\widgets\browser.py:30
+#: spyderlib\widgets\sourcecode\codeeditor.py:2254
+msgid "Zoom out"
+msgstr "Réduire"
+
+#: spyderlib\widgets\browser.py:33
+#: spyderlib\widgets\sourcecode\codeeditor.py:2251
+msgid "Zoom in"
+msgstr "Agrandir"
+
+#: spyderlib\widgets\browser.py:126
+msgid "Home"
+msgstr "Accueil"
+
+#: spyderlib\widgets\browser.py:166
+msgid "Find text"
+msgstr "Rechercher"
+
+#: spyderlib\widgets\browser.py:185
+msgid "Address:"
+msgstr "Adresse :"
+
+#: spyderlib\widgets\browser.py:220
+msgid "Unable to load page"
+msgstr "Impossible de charger la page"
+
+#: spyderlib\widgets\comboboxes.py:117
+msgid "Press enter to validate this entry"
+msgstr "Appuyer sur Entrée pour valider cette saisie"
+
+#: spyderlib\widgets\comboboxes.py:118
+msgid "This entry is incorrect"
+msgstr "Cette saisie n'est pas correcte"
+
+#: spyderlib\widgets\comboboxes.py:171
+msgid "Press enter to validate this path"
+msgstr "Appuyez sur Entrée pour valider ce chemin d'accès"
+
+#: spyderlib\widgets\comboboxes.py:172
+msgid ""
+"This path is incorrect.\n"
+"Enter a correct directory path,\n"
+"then press enter to validate"
+msgstr ""
+"Ce chemin d'accès n'est pas valide :\n"
+"veuillez entrer un chemin d'accès correct,\n"
+"puis appuyer sur Entrée pour le valider"
+
+#: spyderlib\widgets\dependencies.py:59
+msgid " Required "
+msgstr "  Requis  "
+
+#: spyderlib\widgets\dependencies.py:59
+msgid "Module"
+msgstr "Module"
+
+#: spyderlib\widgets\dependencies.py:60
+msgid " Installed "
+msgstr "  Installé  "
+
+#: spyderlib\widgets\dependencies.py:60
+msgid "Provided features"
+msgstr "Fonctionnalités associées"
+
+#: spyderlib\widgets\dependencies.py:126
+msgid "Optional Dependencies"
+msgstr "Dépendances optionnelles"
+
+#: spyderlib\widgets\dependencies.py:131
+msgid ""
+"Spyder depends on several Python modules to provide additional functionality "
+"for its plugins. The table below shows the required and installed versions "
+"(if any) of all of them.<br><br>Although Spyder can work without any of "
+"these modules, it's strongly recommended that at least you try to install <b>"
+"%s</b> and <b>%s</b> to have a much better experience."
+msgstr "Spyder dépend de nombreux modules Python pour disposer de l'intégralité des fonctionnalités potentiellement fournies par ses plugins. Le tableau suivant montre les versions requises et installées (le cas échéant) de toutes ces dépendances.<br><br>Même si Spyder est parfaitement fonctionnel sans tout ces modules, il est néanmoins fortement recommandé d'installer au minimum <b>%s</b> et <b>%s</b> afin de bénéficier des fonctionnalités les plus avancées."
+
+#: spyderlib\widgets\dependencies.py:149
+msgid "Copy to clipboard"
+msgstr "Copier dans le presse-papier"
+
+#: spyderlib\widgets\dicteditor.py:145
+msgid "Index"
+msgstr "Indice"
+
+#: spyderlib\widgets\dicteditor.py:150
+msgid "Tuple"
+msgstr "Tuple"
+
+#: spyderlib\widgets\dicteditor.py:153
+msgid "List"
+msgstr "Liste"
+
+#: spyderlib\widgets\dicteditor.py:156
+msgid "Dictionary"
+msgstr "Dictionnaire"
+
+#: spyderlib\widgets\dicteditor.py:164
+msgid "Attribute"
+msgstr "Attribut"
+
+#: spyderlib\widgets\dicteditor.py:165
+msgid "elements"
+msgstr "éléments"
+
+#: spyderlib\widgets\dicteditor.py:287
+msgid "Size"
+msgstr "Taille"
+
+#: spyderlib\widgets\dicteditor.py:287
+msgid "Type"
+msgstr "Type"
+
+#: spyderlib\widgets\dicteditor.py:287
+msgid "Value"
+msgstr "Valeur"
+
+#: spyderlib\widgets\dicteditor.py:361 spyderlib\widgets\dicteditor.py:495
+msgid "Edit item"
+msgstr "Modifier"
+
+#: spyderlib\widgets\dicteditor.py:362
+msgid "<b>Unable to retrieve data.</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible d'accéder aux données</b><br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\widgets\dicteditor.py:496
+msgid "<b>Unable to assign data to item.</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible d'assigner la valeur de l'objet.</b><br><br>Message d'erreur :"
+"<br>%s"
+
+#: spyderlib\widgets\dicteditor.py:558
+msgid "Resize rows to contents"
+msgstr "Ajuster la hauteur des lignes"
+
+#: spyderlib\widgets\dicteditor.py:566 spyderlib\widgets\explorer.py:232
+msgid "Edit"
+msgstr "Modifier"
+
+#: spyderlib\widgets\dicteditor.py:569 spyderlib\widgets\dicteditor.py:895
+#: spyderlib\widgets\dicteditor.py:911
+msgid "Plot"
+msgstr "Tracer"
+
+#: spyderlib\widgets\dicteditor.py:573
+msgid "Histogram"
+msgstr "Histogramme"
+
+#: spyderlib\widgets\dicteditor.py:577
+msgid "Show image"
+msgstr "Afficher l'image"
+
+#: spyderlib\widgets\dicteditor.py:581 spyderlib\widgets\dicteditor.py:918
+msgid "Save array"
+msgstr "Enregistrer le tableau"
+
+#: spyderlib\widgets\dicteditor.py:585 spyderlib\widgets\dicteditor.py:859
+#: spyderlib\widgets\dicteditor.py:867
+msgid "Insert"
+msgstr "Insérer"
+
+#: spyderlib\widgets\dicteditor.py:588 spyderlib\widgets\dicteditor.py:812
+msgid "Remove"
+msgstr "Supprimer"
+
+#: spyderlib\widgets\dicteditor.py:611 spyderlib\widgets\dicteditor.py:829
+#: spyderlib\widgets\explorer.py:495 spyderlib\widgets\explorer.py:503
+#: spyderlib\widgets\explorer.py:515
+msgid "Rename"
+msgstr "Renommer"
+
+#: spyderlib\widgets\dicteditor.py:614
+msgid "Duplicate"
+msgstr "Dupliquer"
+
+#: spyderlib\widgets\dicteditor.py:810
+msgid "Do you want to remove selected item?"
+msgstr "Souhaitez-vous supprimer l'élément sélectionné ?"
+
+#: spyderlib\widgets\dicteditor.py:811
+msgid "Do you want to remove all selected items?"
+msgstr "Souhaitez-vous supprimer les éléments sélectionnés ?"
+
+#: spyderlib\widgets\dicteditor.py:829 spyderlib\widgets\dicteditor.py:859
+msgid "Key:"
+msgstr "Clé :"
+
+#: spyderlib\widgets\dicteditor.py:867
+msgid "Value:"
+msgstr "Valeur :"
+
+#: spyderlib\widgets\dicteditor.py:883
+msgid "Import error"
+msgstr "Erreur d'import"
+
+#: spyderlib\widgets\dicteditor.py:884
+msgid "Please install <b>matplotlib</b> or <b>guiqwt</b>."
+msgstr "Merci d'installer <b>matplotlib</b> ou <b>guiqwt</b>."
+
+#: spyderlib\widgets\dicteditor.py:896
+msgid "<b>Unable to plot data.</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible d'afficher les données</b><br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\widgets\dicteditor.py:912
+msgid "<b>Unable to show image.</b><br><br>Error message:<br>%s"
+msgstr "<b>Impossible d'afficher l'image</b><br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\widgets\dicteditor.py:934
+msgid "<b>Unable to save array</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible d'enregistrer le tableau</b><br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\widgets\dicteditor.py:951
+msgid "Clipboard contents"
+msgstr "Contenu du presse-papiers"
+
+#: spyderlib\widgets\dicteditor.py:965
+msgid "Import from clipboard"
+msgstr "Importer depuis le presse-papiers"
+
+#: spyderlib\widgets\dicteditor.py:967
+msgid "Empty clipboard"
+msgstr "Presse-papiers vide"
+
+#: spyderlib\widgets\dicteditor.py:968
+msgid "Nothing to be imported from clipboard."
+msgstr "Aucune donnée ne peut être importée depuis le presse-papiers."
+
+#: spyderlib\widgets\editor.py:69 spyderlib\widgets\editor.py:553
+msgid "File list management"
+msgstr "Gestionnaire de fichiers"
+
+#: spyderlib\widgets\editor.py:73
+msgid "Filter:"
+msgstr "Filtre :"
+
+#: spyderlib\widgets\editor.py:78
+msgid "(press <b>Enter</b> to edit file)"
+msgstr "(appuyer sur <b>Entrée</b> pour modifier le fichier)"
+
+#: spyderlib\widgets\editor.py:93
+msgid "&Edit file"
+msgstr "Modifi&er le fichier"
+
+#: spyderlib\widgets\editor.py:102
+msgid "&Close file"
+msgstr "&Fermer le fichier"
+
+#: spyderlib\widgets\editor.py:110
+msgid "Hint: press <b>Alt</b> to show accelerators"
+msgstr "Astuce : la touche <b>Alt</b> affiche les accélérateurs"
+
+#: spyderlib\widgets\editor.py:556
+msgid "Copy path to clipboard"
+msgstr "Copier le chemin d'accès dans le presse-papier"
+
+#: spyderlib\widgets\editor.py:1094
+msgid "Temporary file"
+msgstr "Fichier temporaire"
+
+#: spyderlib\widgets\editor.py:1191
+msgid "New window"
+msgstr "Nouvelle fenêtre"
+
+#: spyderlib\widgets\editor.py:1192
+msgid "Create a new editor window"
+msgstr "Créer une nouvelle fenêtre d'édition"
+
+#: spyderlib\widgets\editor.py:1195
+msgid "Split vertically"
+msgstr "Séparation verticale"
+
+#: spyderlib\widgets\editor.py:1197
+msgid "Split vertically this editor window"
+msgstr "Séparer en deux verticalement cette fenêtre d'édition"
+
+#: spyderlib\widgets\editor.py:1199
+msgid "Split horizontally"
+msgstr "Séparation horizontale"
+
+#: spyderlib\widgets\editor.py:1201
+msgid "Split horizontally this editor window"
+msgstr "Séparer en deux horizontalement cette fenêtre d'édition"
+
+#: spyderlib\widgets\editor.py:1203
+msgid "Close this panel"
+msgstr "Fermer ce panneau"
+
+#: spyderlib\widgets\editor.py:1335
+msgid "<b>%s</b> has been modified.<br>Do you want to save changes?"
+msgstr ""
+"<b>%s</b> a été modifié.<br>Souhaitez-vous enregistrer ces changements ?"
+
+#: spyderlib\widgets\editor.py:1398
+msgid "Save"
+msgstr "Enregistrer"
+
+#: spyderlib\widgets\editor.py:1399
+msgid "<b>Unable to save script '%s'</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible d'enregistrer le script '%s'</b><br><br>Message d'erreur :<br>%"
+"s"
+
+#: spyderlib\widgets\editor.py:1421
+msgid "Save Python script"
+msgstr "Enregistrer le script Python"
+
+#: spyderlib\widgets\editor.py:1642
+msgid ""
+"<b>%s</b> is unavailable (this file may have been removed, moved or renamed "
+"outside Spyder).<br>Do you want to close it?"
+msgstr ""
+"<b>%s</b> n'est pas accessible (ce fichier a peut-être été supprimé, déplacé "
+"ou renommé en dehors de Spyder).<br>Souhaitez-vous le fermer ?"
+
+#: spyderlib\widgets\editor.py:1662
+msgid ""
+"<b>%s</b> has been modified outside Spyder.<br>Do you want to reload it and "
+"loose all your changes?"
+msgstr ""
+"<b>%s</b> a été modifié en dehors de Spyder.<br>Souhaitez-vous le recharger "
+"et perdre ainsi vos modifications ?"
+
+#: spyderlib\widgets\editor.py:1758
+msgid ""
+"All changes to <b>%s</b> will be lost.<br>Do you want to revert file from "
+"disk?"
+msgstr ""
+"Toutes les modifications effectuées sur <b>%s</b> seront perdues."
+"<br>Souhaitez-vous revenir à la version du fichier enregistrée sur le "
+"disque ?"
+
+#: spyderlib\widgets\editor.py:1897
+msgid "Loading %s..."
+msgstr "Chargement de \"%s\" en cours..."
+
+#: spyderlib\widgets\editor.py:1907
+msgid ""
+"<b>%s</b> contains mixed end-of-line characters.<br>Spyder will fix this "
+"automatically."
+msgstr ""
+"<b>%s</b> contient des caractères de fin de ligne mélangés.<br>Spyder va "
+"corriger ceci automatiquement."
+
+#: spyderlib\widgets\editor.py:2254
+msgid "Close window"
+msgstr "Fermer la fenêtre"
+
+#: spyderlib\widgets\editor.py:2256
+msgid "Close this window"
+msgstr "Fermer cette fenêtre d'édition"
+
+#: spyderlib\widgets\editortools.py:93
+msgid "Line %s"
+msgstr "Ligne %s"
+
+#: spyderlib\widgets\editortools.py:98
+msgid "Class defined at line %s"
+msgstr "Classe déclarée ligne %s"
+
+#: spyderlib\widgets\editortools.py:106
+msgid "Method defined at line %s"
+msgstr "Méthode déclarée ligne %s"
+
+#: spyderlib\widgets\editortools.py:116
+msgid "Function defined at line %s"
+msgstr "Fonction déclarée ligne %s"
+
+#: spyderlib\widgets\editortools.py:171 spyderlib\widgets\editortools.py:499
+msgid "Go to cursor position"
+msgstr "Aller à la position du curseur"
+
+#: spyderlib\widgets\editortools.py:174
+msgid "Show absolute path"
+msgstr "Afficher les chemins complets"
+
+#: spyderlib\widgets\editortools.py:177 spyderlib\widgets\explorer.py:174
+msgid "Show all files"
+msgstr "Afficher tous les fichiers"
+
+#: spyderlib\widgets\editortools.py:180
+msgid "Show special comments"
+msgstr "Afficher les commentaires spéciaux"
+
+#: spyderlib\widgets\explorer.py:170
+msgid "Edit filename filters..."
+msgstr "Modifier les filtres..."
+
+#: spyderlib\widgets\explorer.py:183
+msgid "Edit filename filters"
+msgstr "Modifier les filtres"
+
+#: spyderlib\widgets\explorer.py:184
+msgid "Name filters:"
+msgstr "Filtres sur les noms de fichiers :"
+
+#: spyderlib\widgets\explorer.py:202
+msgid "File..."
+msgstr "Fichier..."
+
+#: spyderlib\widgets\explorer.py:205
+msgid "Module..."
+msgstr "Module..."
+
+#: spyderlib\widgets\explorer.py:208
+msgid "Folder..."
+msgstr "Dossier..."
+
+#: spyderlib\widgets\explorer.py:212
+msgid "Package..."
+msgstr "Paquet..."
+
+#: spyderlib\widgets\explorer.py:234
+msgid "Move..."
+msgstr "Déplacer..."
+
+#: spyderlib\widgets\explorer.py:237
+msgid "Delete..."
+msgstr "Supprimer..."
+
+#: spyderlib\widgets\explorer.py:240
+msgid "Rename..."
+msgstr "Renommer..."
+
+#: spyderlib\widgets\explorer.py:243
+msgid "Open"
+msgstr "Ouvrir"
+
+#: spyderlib\widgets\explorer.py:262
+msgid "Commit"
+msgstr "Commiter"
+
+#: spyderlib\widgets\explorer.py:266
+msgid "Browse repository"
+msgstr "Explorer le dépôt"
+
+#: spyderlib\widgets\explorer.py:278
+msgid "Open command prompt here"
+msgstr "Ouvrir un invite de commandes ici"
+
+#: spyderlib\widgets\explorer.py:280
+msgid "Open terminal here"
+msgstr "Ouvrir un terminal ici"
+
+#: spyderlib\widgets\explorer.py:285
+msgid "Open Python interpreter here"
+msgstr "Ouvrir un interpréteur Python ici"
+
+#: spyderlib\widgets\explorer.py:299
+msgid "New"
+msgstr "Nouveau"
+
+#: spyderlib\widgets\explorer.py:307
+msgid "Import"
+msgstr "Import"
+
+#: spyderlib\widgets\explorer.py:454
+msgid "Do you really want to delete <b>%s</b>?"
+msgstr "Souhaitez-vous réellement supprimer <b>%s</b> ?"
+
+#: spyderlib\widgets\explorer.py:474
+msgid "delete"
+msgstr "supprimer"
+
+#: spyderlib\widgets\explorer.py:475 spyderlib\widgets\projectexplorer.py:814
+#: spyderlib\widgets\projectexplorer.py:821
+#: spyderlib\widgets\projectexplorer.py:1088
+#: spyderlib\widgets\projectexplorer.py:1172
+msgid "Project Explorer"
+msgstr "Explorateur de projets"
+
+#: spyderlib\widgets\explorer.py:476 spyderlib\widgets\projectexplorer.py:761
+#: spyderlib\widgets\projectexplorer.py:1173
+msgid "<b>Unable to %s <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr "<b>Impossible de %s <i>%s</i></b><br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\widgets\explorer.py:496
+msgid "New name:"
+msgstr "Nouveau nom :"
+
+#: spyderlib\widgets\explorer.py:504
+msgid ""
+"Do you really want to rename <b>%s</b> and overwrite the existing file <b>%"
+"s</b>?"
+msgstr ""
+"Souhaitez-vous réellement renommer <b>%s</b> et remplacer le ficher existant "
+"<b>%s</b> ?"
+
+#: spyderlib\widgets\explorer.py:516
+msgid "<b>Unable to rename file <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible de renommer l'élément <i>%s</i></b><br><br>Message d'erreur :"
+"<br>%s"
+
+#: spyderlib\widgets\explorer.py:550
+msgid "<b>Unable to move <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible de déplacer <i>%s</i></b><br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\widgets\explorer.py:568
+msgid "<b>Unable to create folder <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible de créer le répertoire <i>%s</i></b><br><br>Message d'erreur :"
+"<br>%s"
+
+#: spyderlib\widgets\explorer.py:580 spyderlib\widgets\explorer.py:614
+msgid "<b>Unable to create file <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible de créer le fichier <i>%s</i></b><br><br>Message d'erreur :<br>"
+"%s"
+
+#: spyderlib\widgets\explorer.py:588
+msgid "New folder"
+msgstr "Nouveau répertoire"
+
+#: spyderlib\widgets\explorer.py:589
+msgid "Folder name:"
+msgstr "Nom du dossier :"
+
+#: spyderlib\widgets\explorer.py:594
+msgid "New package"
+msgstr "Nouveau paquet"
+
+#: spyderlib\widgets\explorer.py:595
+msgid "Package name:"
+msgstr "Nom du paquet :"
+
+#: spyderlib\widgets\explorer.py:634
+msgid "New module"
+msgstr "Nouveau module"
+
+#: spyderlib\widgets\explorer.py:647
+msgid ""
+"For %s support, please install one of the<br/> following tools:<br/><br/>  %s"
+msgstr ""
+"Pour ajouter la prise en charge de %s, merci d'installer <br/>l'un des "
+"outils suivants :<br/><br/>  %s"
+
+#: spyderlib\widgets\explorer.py:651
+msgid "<b>Unable to find external program.</b><br><br>%s"
+msgstr "<b>Impossible de trouver un programme externe.</b><br><br>%s"
+
+#: spyderlib\widgets\explorer.py:851
+msgid "Show current directory only"
+msgstr "Afficher uniquement le répertoire courant"
+
+#: spyderlib\widgets\explorer.py:958
+msgid "Show toolbar"
+msgstr "Afficher la barre d'outils"
+
+#: spyderlib\widgets\explorer.py:969 spyderlib\widgets\importwizard.py:484
+msgid "Previous"
+msgstr "Précédent"
+
+#: spyderlib\widgets\explorer.py:985
+msgid "Parent"
+msgstr "Parent"
+
+#: spyderlib\widgets\externalshell\baseshell.py:140
+msgid "Run again this program"
+msgstr "Exécuter de nouveau ce programme"
+
+#: spyderlib\widgets\externalshell\baseshell.py:143
+msgid "Kill"
+msgstr "Terminer"
+
+#: spyderlib\widgets\externalshell\baseshell.py:145
+msgid "Kills the current process, causing it to exit immediately"
+msgstr ""
+"Tue le processus, entraînant une sortie brutale et immédiate du programme"
+
+#: spyderlib\widgets\externalshell\baseshell.py:213
+msgid "<span style='color: #44AA44'><b>Running...</b></span>"
+msgstr "<span style='color: #44AA44'><b>En cours d'exécution...</b></span>"
+
+#: spyderlib\widgets\externalshell\baseshell.py:220
+msgid "Terminated."
+msgstr "Terminé."
+
+#: spyderlib\widgets\externalshell\baseshell.py:235
+#: spyderlib\widgets\mixins.py:511
+msgid "Arguments"
+msgstr "Arguments"
+
+#: spyderlib\widgets\externalshell\baseshell.py:236
+msgid "Command line arguments:"
+msgstr "Arguments en ligne de commande :"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:168
+msgid "Refresh"
+msgstr "Rafraîchir"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:172
+msgid "Refresh periodically"
+msgstr "Rafraîchir périodiquement"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:176
+#: spyderlib\widgets\externalshell\namespacebrowser.py:415
+msgid "Import data"
+msgstr "Importer des données"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:179
+#: spyderlib\widgets\externalshell\namespacebrowser.py:505
+#: spyderlib\widgets\externalshell\namespacebrowser.py:526
+msgid "Save data"
+msgstr "Enregistrer les données"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:184
+msgid "Save data as..."
+msgstr "Enregistrer les données sous..."
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:192
+msgid "Exclude references which name starts with an underscore"
+msgstr "Exclure les références dont le nom commence par un tiret bas"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:200
+msgid "Exclude references which name is uppercase"
+msgstr "Exclure les références dont le nom s'écrit en lettres capitales"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:207
+msgid "Exclude references which name starts with an uppercase character"
+msgstr "Exclure les références dont le nom commence par une lettre majuscule"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:215
+msgid ""
+"Exclude references to unsupported data types (i.e. which won't be handled/"
+"saved correctly)"
+msgstr ""
+"Exclure les références dont le type n'est pas supporté par l'espace de "
+"travail (en particulier, l'enregistrement ne fonctionnera pas)"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:331
+msgid "Object <b>%s</b> is not picklable"
+msgstr ""
+"L'objet <b>%s</b> n'est pas pris en charge par le protocole de sérialisation "
+"de <i>Pickle</i>"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:437
+msgid ""
+"<b>Unsupported file extension '%s'</b><br><br>Would you like to import it "
+"anyway (by selecting a known file format)?"
+msgstr ""
+"<b>Extension de fichier non pris en charge '%s'</b><br><br>Souhaitez-vous "
+"néanmoins ouvrir ce fichier (en choisissant un format de fichier connu) ?"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:445
+msgid "Open file as:"
+msgstr "Ouvrir le fichier en tant que :"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:493
+msgid "<b>Unable to load '%s'</b><br><br>Error message:<br>%s"
+msgstr "<b>Impossible d'ouvrir '%s'</b><br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:527
+msgid "<b>Unable to save current workspace</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible d'enregistrer l'espace de travail</b><br><br>Message d'erreur :"
+"<br>%s"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:266
+msgid "Variables"
+msgstr "Variables"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:267
+msgid "Show/hide global variables explorer"
+msgstr "Afficher/masquer l'explorateur de variables globales"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:271
+msgid "Terminate"
+msgstr "Quitter"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:272
+msgid ""
+"Attempts to terminate the process.\n"
+"The process may not exit as a result of clicking this button\n"
+"(it is given the chance to prompt the user for any unsaved files, etc)."
+msgstr ""
+"Tentative de fermeture du processus.\n"
+"Le processus peut ne pas s'arrêter suite à cette tentative,\n"
+"mais cela permet au programme en cours de quitter proprement."
+
+#: spyderlib\widgets\externalshell\pythonshell.py:284
+msgid "Interact"
+msgstr "Interagir"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:286
+msgid "Debug"
+msgstr "Déboguer"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:288
+#: spyderlib\widgets\externalshell\pythonshell.py:351
+msgid "Arguments..."
+msgstr "Arguments..."
+
+#: spyderlib\widgets\externalshell\pythonshell.py:295
+msgid "Set current working directory"
+msgstr "Changer le répertoire de travail"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:297
+msgid "Environment variables"
+msgstr "Variables d'environnement"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:301
+msgid "Show sys.path contents"
+msgstr "Afficher le contenu de sys.path"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:347
+msgid "Arguments: %s"
+msgstr "Arguments : %s"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:349
+msgid "No argument"
+msgstr "Aucun argument"
+
+#: spyderlib\widgets\externalshell\pythonshell.py:523
+#: spyderlib\widgets\externalshell\systemshell.py:94
+msgid "Process failed to start"
+msgstr "Le processus n'a pas pu démarrer"
+
+#: spyderlib\widgets\findinfiles.py:155
+msgid "Unexpected error: see internal console"
+msgstr "Erreur inattendue : voir console interne"
+
+#: spyderlib\widgets\findinfiles.py:207 spyderlib\widgets\findinfiles.py:231
+#: spyderlib\widgets\findinfiles.py:278
+msgid "invalid regular expression"
+msgstr "expression régulière incorrecte"
+
+#: spyderlib\widgets\findinfiles.py:276
+msgid "permission denied errors were encountered"
+msgstr "des erreurs d'autorisation d'accès ont été rencontrées"
+
+#: spyderlib\widgets\findinfiles.py:310
+msgid "Search pattern"
+msgstr "Expression recherchée"
+
+#: spyderlib\widgets\findinfiles.py:313 spyderlib\widgets\findinfiles.py:347
+#: spyderlib\widgets\findinfiles.py:359 spyderlib\widgets\findreplace.py:82
+msgid "Regular expression"
+msgstr "Expression régulière"
+
+#: spyderlib\widgets\findinfiles.py:322
+msgid "Search"
+msgstr "Rechercher"
+
+#: spyderlib\widgets\findinfiles.py:325
+msgid "Start search"
+msgstr "Démarrer la recherche"
+
+#: spyderlib\widgets\findinfiles.py:328
+msgid "Stop"
+msgstr "Arrêter"
+
+#: spyderlib\widgets\findinfiles.py:331
+msgid "Stop search"
+msgstr "Arrêter la recherche"
+
+#: spyderlib\widgets\findinfiles.py:341
+msgid "Included filenames pattern"
+msgstr "Expression des noms de fichier à inclure"
+
+#: spyderlib\widgets\findinfiles.py:350
+msgid "Include:"
+msgstr "Inclure :"
+
+#: spyderlib\widgets\findinfiles.py:353
+msgid "Excluded filenames pattern"
+msgstr "Expression des noms de fichier à exclure"
+
+#: spyderlib\widgets\findinfiles.py:362
+msgid "Exclude:"
+msgstr "Exclure :"
+
+#: spyderlib\widgets\findinfiles.py:372
+msgid "PYTHONPATH"
+msgstr "PYTHONPATH"
+
+#: spyderlib\widgets\findinfiles.py:374
+msgid ""
+"Search in all directories listed in sys.path which are outside the Python "
+"installation directory"
+msgstr ""
+"Rechercher dans tous les répertoires listés dans sys.path qui sont situés en "
+"dehors du répertoire d'installation de Python"
+
+#: spyderlib\widgets\findinfiles.py:377
+msgid "Hg repository"
+msgstr "Dépôt Mercurial"
+
+#: spyderlib\widgets\findinfiles.py:380
+msgid "Search in current directory hg repository"
+msgstr "Rechercher dans le dépôt Mercurial du répertoire courant"
+
+#: spyderlib\widgets\findinfiles.py:381
+msgid "Here:"
+msgstr "Ici :"
+
+#: spyderlib\widgets\findinfiles.py:385
+msgid "Search recursively in this directory"
+msgstr "Rechercher de manière récursive dans ce répertoire"
+
+#: spyderlib\widgets\findinfiles.py:393
+msgid "Browse a search directory"
+msgstr "Sélectionner un répertoire de recherche"
+
+#: spyderlib\widgets\findinfiles.py:426
+msgid "Hide advanced options"
+msgstr "Masquer les options avancées"
+
+#: spyderlib\widgets\findinfiles.py:429
+msgid "Show advanced options"
+msgstr "Afficher les options avancées"
+
+#: spyderlib\widgets\findinfiles.py:571
+msgid "Search canceled"
+msgstr "Recherche annulée"
+
+#: spyderlib\widgets\findinfiles.py:575
+msgid "String not found"
+msgstr "Chaîne de caractères non trouvée"
+
+#: spyderlib\widgets\findinfiles.py:577
+msgid "matches in"
+msgstr "correspondances trouvées dans"
+
+#: spyderlib\widgets\findinfiles.py:578
+msgid "file"
+msgstr "fichier"
+
+#: spyderlib\widgets\findinfiles.py:586
+msgid "interrupted"
+msgstr "interrompu"
+
+#: spyderlib\widgets\findreplace.py:62
+msgid "Search string"
+msgstr "Chaîne de caractères à rechercher"
+
+#: spyderlib\widgets\findreplace.py:89
+msgid "Case Sensitive"
+msgstr "Respecter la casse"
+
+#: spyderlib\widgets\findreplace.py:96
+msgid "Whole words"
+msgstr "Mots entiers"
+
+#: spyderlib\widgets\findreplace.py:103
+msgid "Highlight matches"
+msgstr "Surligner les résultats"
+
+#: spyderlib\widgets\findreplace.py:118
+msgid "Replace with:"
+msgstr "Remplacer par :"
+
+#: spyderlib\widgets\findreplace.py:120
+msgid "Replace string"
+msgstr "Chaîne de caractères de remplacement"
+
+#: spyderlib\widgets\findreplace.py:123
+msgid "Replace/find"
+msgstr "Remplacer/rechercher"
+
+#: spyderlib\widgets\findreplace.py:132
+msgid "Replace all"
+msgstr "Remplacer tout"
+
+#: spyderlib\widgets\importwizard.py:104
+msgid "Import as"
+msgstr "Importer en tant que"
+
+#: spyderlib\widgets\importwizard.py:106
+msgid "data"
+msgstr "données"
+
+#: spyderlib\widgets\importwizard.py:110
+msgid "code"
+msgstr "code"
+
+#: spyderlib\widgets\importwizard.py:113 spyderlib\widgets\importwizard.py:459
+msgid "text"
+msgstr "texte"
+
+#: spyderlib\widgets\importwizard.py:125
+msgid "Column separator:"
+msgstr "Séparateur de colonne :"
+
+#: spyderlib\widgets\importwizard.py:129
+msgid "Tab"
+msgstr "Tab"
+
+#: spyderlib\widgets\importwizard.py:132 spyderlib\widgets\importwizard.py:150
+msgid "other"
+msgstr "autre"
+
+#: spyderlib\widgets\importwizard.py:143
+msgid "Row separator:"
+msgstr "Séparateur de ligne :"
+
+#: spyderlib\widgets\importwizard.py:147
+msgid "EOL"
+msgstr "EOL"
+
+#: spyderlib\widgets\importwizard.py:163
+msgid "Additionnal options"
+msgstr "Options supplémentaires"
+
+#: spyderlib\widgets\importwizard.py:167
+msgid "Skip rows:"
+msgstr "Sauter des lignes :"
+
+#: spyderlib\widgets\importwizard.py:178
+msgid "Comments:"
+msgstr "Commentaires :"
+
+#: spyderlib\widgets\importwizard.py:184
+msgid "Transpose"
+msgstr "Transposer"
+
+#: spyderlib\widgets\importwizard.py:406
+msgid "Import as array"
+msgstr "Importer en tant que tableau"
+
+#: spyderlib\widgets\importwizard.py:442 spyderlib\widgets\importwizard.py:533
+msgid "Import wizard"
+msgstr "Assistant d'importation"
+
+#: spyderlib\widgets\importwizard.py:447
+msgid "Raw text"
+msgstr "Text brut"
+
+#: spyderlib\widgets\importwizard.py:450
+msgid "variable_name"
+msgstr "nom_de_variable"
+
+#: spyderlib\widgets\importwizard.py:461
+msgid "table"
+msgstr "tableau"
+
+#: spyderlib\widgets\importwizard.py:462
+msgid "Preview"
+msgstr "Aperçu"
+
+#: spyderlib\widgets\importwizard.py:478
+msgid "Cancel"
+msgstr "Annuler"
+
+#: spyderlib\widgets\importwizard.py:493
+msgid "Done"
+msgstr "Terminer"
+
+#: spyderlib\widgets\importwizard.py:534
+msgid ""
+"<b>Unable to proceed to next step</b><br><br>Please check your entries."
+"<br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible de passer à l'étape suivante</b><br><br>Merci de vérifier "
+"votre saisie.<br><br>Message d'erreur :<br>%s"
+
+#: spyderlib\widgets\internalshell.py:247
+msgid "Help..."
+msgstr "Aide..."
+
+#: spyderlib\widgets\internalshell.py:263
+msgid "Shell special commands:"
+msgstr "Commandes spéciales de la console :"
+
+#: spyderlib\widgets\internalshell.py:264
+msgid "Internal editor:"
+msgstr "Éditeur interne :"
+
+#: spyderlib\widgets\internalshell.py:265
+msgid "External editor:"
+msgstr "Éditeur externe :"
+
+#: spyderlib\widgets\internalshell.py:266
+msgid "Run script:"
+msgstr "Exécuter un script :"
+
+#: spyderlib\widgets\internalshell.py:267
+msgid "Remove references:"
+msgstr "Supprimer des références :"
+
+#: spyderlib\widgets\internalshell.py:268
+msgid "System commands:"
+msgstr "Commandes systèmes :"
+
+#: spyderlib\widgets\internalshell.py:269
+msgid "Python help:"
+msgstr "Aide Python :"
+
+#: spyderlib\widgets\internalshell.py:270
+msgid "GUI-based editor:"
+msgstr "Éditeur graphique :"
+
+#: spyderlib\widgets\mixins.py:516
+msgid "Documentation"
+msgstr "Documentation"
+
+#: spyderlib\widgets\onecolumntree.py:63
+msgid "Collapse all"
+msgstr "Replier tout"
+
+#: spyderlib\widgets\onecolumntree.py:67
+msgid "Expand all"
+msgstr "Déplier tout"
+
+#: spyderlib\widgets\onecolumntree.py:71
+msgid "Restore"
+msgstr "Restaurer"
+
+#: spyderlib\widgets\onecolumntree.py:72
+msgid "Restore original tree layout"
+msgstr "Restaurer l'organisation initiale de l'arbre"
+
+#: spyderlib\widgets\onecolumntree.py:76
+msgid "Collapse selection"
+msgstr "Replier la sélection"
+
+#: spyderlib\widgets\onecolumntree.py:80
+msgid "Expand selection"
+msgstr "Déplier la sélection"
+
+#: spyderlib\widgets\pathmanager.py:84
+msgid "Move to top"
+msgstr "Placer en premier"
+
+#: spyderlib\widgets\pathmanager.py:90
+msgid "Move up"
+msgstr "Monter"
+
+#: spyderlib\widgets\pathmanager.py:96
+msgid "Move down"
+msgstr "Descendre"
+
+#: spyderlib\widgets\pathmanager.py:102
+msgid "Move to bottom"
+msgstr "Placer en dernier"
+
+#: spyderlib\widgets\pathmanager.py:113 spyderlib\widgets\pathmanager.py:225
+msgid "Add path"
+msgstr "Ajouter un chemin"
+
+#: spyderlib\widgets\pathmanager.py:118 spyderlib\widgets\pathmanager.py:209
+msgid "Remove path"
+msgstr "Supprimer"
+
+#: spyderlib\widgets\pathmanager.py:128
+msgid "Synchronize..."
+msgstr "Synchroniser..."
+
+#: spyderlib\widgets\pathmanager.py:130
+msgid "Synchronize Spyder's path list with PYTHONPATH environment variable"
+msgstr ""
+"Synchronise la liste des chemins d'accès de Spyder avec celle de la variable "
+"d'environnement PYTHONPATH"
+
+#: spyderlib\widgets\pathmanager.py:141
+msgid "Synchronize"
+msgstr "Synchroniser"
+
+#: spyderlib\widgets\pathmanager.py:142
+msgid ""
+"This will synchronize Spyder's path list with <b>PYTHONPATH</b> environment "
+"variable for current user, allowing you to run your Python modules outside "
+"Spyder without having to configure sys.path. <br>Do you want to clear "
+"contents of PYTHONPATH before adding Spyder's path list?"
+msgstr ""
+"Ceci synchronisera la liste des chemins d'accès de Spyder avec celle de la "
+"variable d'environnement <b>PYTHONPATH</b> pour l'utilisateur courant, vous "
+"permettant ainsi d'exécuter vos modules Python en dehors de Spyder sans "
+"avoir besoin de configurer sys.path. <br>Souhaitez-vous effacer le contenu "
+"de PYTHONPATH avant d'y ajouter la liste des chemins d'accès de Spyder ?"
+
+#: spyderlib\widgets\pathmanager.py:210
+msgid "Do you really want to remove selected path?"
+msgstr "Souhaitez-vous vraiment supprimer le chemin sélectionné ?"
+
+#: spyderlib\widgets\pathmanager.py:226
+msgid ""
+"This directory is already included in Spyder path list.<br>Do you want to "
+"move it to the top of the list?"
+msgstr ""
+"Ce répertoire est déjà inclus dans la liste des chemins d'accès de Spyder."
+"<br>Souhaitez-vous le placer en début de liste ?"
+
+#: spyderlib\widgets\projectexplorer.py:332
+msgid "its own configuration file"
+msgstr "son propre fichier de configuration"
+
+#: spyderlib\widgets\projectexplorer.py:338
+msgid "the following projects:<br>%s"
+msgstr "les projets suivants :<br>%s"
+
+#: spyderlib\widgets\projectexplorer.py:540
+msgid "Project..."
+msgstr "Projet..."
+
+#: spyderlib\widgets\projectexplorer.py:553
+msgid "Existing directory"
+msgstr "Répertoire existant"
+
+#: spyderlib\widgets\projectexplorer.py:557
+msgid "Existing Spyder project"
+msgstr "Projet Spyder existant"
+
+#: spyderlib\widgets\projectexplorer.py:561
+msgid "Existing Pydev project"
+msgstr "Projet Pydev existant"
+
+#: spyderlib\widgets\projectexplorer.py:578
+msgid "Open project"
+msgstr "Ouvrir le projet"
+
+#: spyderlib\widgets\projectexplorer.py:583
+msgid "Close project"
+msgstr "Fermer le projet"
+
+#: spyderlib\widgets\projectexplorer.py:588
+msgid "Close unrelated projects"
+msgstr "Fermer les projets non associés"
+
+#: spyderlib\widgets\projectexplorer.py:597
+msgid "Edit related projects"
+msgstr "Modifier les projets associés"
+
+#: spyderlib\widgets\projectexplorer.py:605
+msgid "Add to PYTHONPATH"
+msgstr "Ajouter à PYTHONPATH"
+
+#: spyderlib\widgets\projectexplorer.py:610
+msgid "Remove from PYTHONPATH"
+msgstr "Retirer de PYTHONPATH"
+
+#: spyderlib\widgets\projectexplorer.py:615
+msgid "Properties"
+msgstr "Propriétés"
+
+#: spyderlib\widgets\projectexplorer.py:650
+msgid "Show horizontal scrollbar"
+msgstr "Barre de défilement horizontal"
+
+#: spyderlib\widgets\projectexplorer.py:683
+msgid "Workspace"
+msgstr "Espace de travail"
+
+#: spyderlib\widgets\projectexplorer.py:684
+msgid ""
+"The workspace was unable to load or save %s<br><br>Please check if you have "
+"the permission to write the associated configuration files."
+msgstr ""
+"L'espace de travail n'est pas parvenu à ouvrir ou enregistrer %"
+"s<br><br>Veuillez vérifier que vous disposez bien des droits d'écriture sur "
+"les fichiers de configuration associés."
+
+#: spyderlib\widgets\projectexplorer.py:743
+msgid "Import directory"
+msgstr "Importer un répertoire"
+
+#: spyderlib\widgets\projectexplorer.py:745
+msgid ""
+"The following directory is not in workspace:<br><b>%s</b><br><br>Do you want "
+"to continue (and copy the directory to workspace)?"
+msgstr ""
+"Le répertoire suivant n'est pas dans l'espace de travail :<br><b>%s</"
+"b><br><br>Souhaitez-vous continuer (et copier ce répertoire dans l'espace de "
+"travail) ?"
+
+#: spyderlib\widgets\projectexplorer.py:763
+#: spyderlib\widgets\projectexplorer.py:1169
+msgid "copy"
+msgstr "copier"
+
+#: spyderlib\widgets\projectexplorer.py:815
+msgid "The project <b>%s</b> is already opened!"
+msgstr "Le projet <b>%s</b> est déjà ouvert !"
+
+#: spyderlib\widgets\projectexplorer.py:822
+msgid ""
+"The project root path directory is inside the workspace but not as the "
+"expected tree level. It is not a directory of the workspace:<br><b>%s</b>"
+msgstr ""
+"Le répertoire racine du projet est bien à l'intérieur de l'espace de travail "
+"mais pas au niveau d'arborescence attendu. Ce n'est pas un répertoire de "
+"l'espace de travail :<br><b>%s</b>"
+
+#: spyderlib\widgets\projectexplorer.py:833
+msgid "Project name:"
+msgstr "Nom du projet :"
+
+#: spyderlib\widgets\projectexplorer.py:842
+msgid "A project named <b>%s</b> already exists"
+msgstr "Un projet nommé <b>%s</b> existe déjà"
+
+#: spyderlib\widgets\projectexplorer.py:847
+msgid ""
+"Invalid project name.<br><br>Name must match the following regular "
+"expression:<br><b>%s</b>"
+msgstr ""
+"Nom de projet incorrect.<br><br>Le nom doit respecter l'expression régulière "
+"suivante :<br><b>%s</b>"
+
+#: spyderlib\widgets\projectexplorer.py:854
+msgid ""
+"The following directory is not empty:<br><b>%s</b><br><br>Do you want to "
+"continue?"
+msgstr ""
+"Le répertoire suivant n'est pas vide :<br><b>%s</b><br><br>Souhaitez-vous "
+"néanmoins continuer ?"
+
+#: spyderlib\widgets\projectexplorer.py:866
+msgid "New project"
+msgstr "Nouveau projet"
+
+#: spyderlib\widgets\projectexplorer.py:874
+msgid ""
+"The current workspace has not been configured yet.\n"
+"Do you want to do this now?"
+msgstr ""
+"L'espace de travail n'a pas encore été défini.\n"
+"Souhaitez-vous le faire maintenant ?"
+
+#: spyderlib\widgets\projectexplorer.py:911
+msgid "Import existing project"
+msgstr "Importer un projet existant"
+
+#: spyderlib\widgets\projectexplorer.py:924
+msgid "Select projects to import"
+msgstr "Sélectionner les projets à importer"
+
+#: spyderlib\widgets\projectexplorer.py:936
+msgid "The folder <i>%s</i> does not contain a valid %s project"
+msgstr "Le dossier <i>%s</i> ne contient pas de projet %s valide"
+
+#: spyderlib\widgets\projectexplorer.py:964
+msgid "Import existing Pydev project"
+msgstr "Importer un projet Pydev"
+
+#: spyderlib\widgets\projectexplorer.py:965
+msgid ""
+"<b>Unable to read Pydev project <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible d'ouvrir le projet Pydev <i>%s</i></b><br><br>Message "
+"d'erreur :<br>%s"
+
+#: spyderlib\widgets\projectexplorer.py:1003
+msgid ""
+"Do you really want to delete project <b>%s</b>?<br><br>Note: project files "
+"won't be deleted from disk."
+msgstr ""
+"Souhaitez-vous réellement supprimer le projet <b>%s</b> ?<br><br>Notez que "
+"les fichiers et répertoires du projet ne seront pas supprimés du disque."
+
+#: spyderlib\widgets\projectexplorer.py:1056
+msgid "Related projects"
+msgstr "Projets associés"
+
+#: spyderlib\widgets\projectexplorer.py:1064
+msgid "Select projects which are related to <b>%s</b>"
+msgstr "Sélectionner les projets à associer à <b>%s</b>"
+
+#: spyderlib\widgets\projectexplorer.py:1089
+msgid ""
+"Statistics on source files only:<br>(Python, C/C++, Fortran)<br><br><b>%s</"
+"b> files.<br><b>%s</b> lines of code."
+msgstr ""
+"Statistique sur les fichiers source uniquement:<br>(Python, C/C++, Fortran)"
+"<br><br><b>%s</b> fichiers.<br><b>%s</b> lignes de code."
+
+#: spyderlib\widgets\projectexplorer.py:1137
+msgid "File <b>%s</b> already exists.<br>Do you want to overwrite it?"
+msgstr "Le fichier <b>%s</b> existe déjà.<br>Souhaitez-vous le remplacer ?"
+
+#: spyderlib\widgets\projectexplorer.py:1151
+msgid "Folder <b>%s</b> already exists."
+msgstr "Le dossier <b>%s</b> existe déjà."
+
+#: spyderlib\widgets\projectexplorer.py:1171
+msgid "move"
+msgstr "déplacer"
+
+#: spyderlib\widgets\projectexplorer.py:1181
+msgid "Select an existing workspace directory, or create a new one"
+msgstr "Sélectionner un espace de travail existant, ou en créer un nouveau"
+
+#: spyderlib\widgets\projectexplorer.py:1182
+msgid ""
+"<u><b>What is the workspace?</b></u><br><br>A <b>Spyder workspace</b> is a "
+"directory on your filesystem that contains Spyder projects and <b>."
+"spyderworkspace</b> configuration file.<br><br>A <b>Spyder project</b> is a "
+"directory with source code (and other related files) and a configuration "
+"file (named <b>.spyderproject</b>) with project settings (PYTHONPATH, linked "
+"projects, ...).<br>"
+msgstr ""
+"<u><b>Qu'est-ce que l'espace de travail ?</b></u><br><br>L'<b>espace de "
+"travail Spyder</b> est un répertoire de votre système de fichiers qui "
+"contient les projets Spyder et le fichier de configuration <b>."
+"spyderworkspace</b>.<br><br>Un <b>projet Spyder</b> est un répertoire "
+"contenant du code source (et d'autres fichiers) ainsi qu'un fichier de "
+"configuration (nommé <b>.spyderproject</b>) dans lequel sont stockés les "
+"réglages du projet (PYTHONPATH, projets liés, ...).<br>"
+
+#: spyderlib\widgets\projectexplorer.py:1209
+msgid "This is the current workspace directory"
+msgstr "Ceci est l'espace de travail actif"
+
+#: spyderlib\widgets\projectexplorer.py:1240
+msgid ""
+"The following directory is not a Spyder workspace:<br>%s<br><br>Do you want "
+"to create a new workspace in this directory?"
+msgstr ""
+"Le répertoire suivant n'est pas un espace de travail Spyder :<br><b>%s</"
+"b><br><br>Souhaitez-vous créer un nouvel espace de travail dans ce "
+"répertoire ?"
+
+#: spyderlib\widgets\pydocgui.py:107
+msgid "Module or package:"
+msgstr "Module ou paquet :"
+
+#: spyderlib\widgets\shell.py:129
+msgid "Save history log..."
+msgstr "Enregistrer l'historique..."
+
+#: spyderlib\widgets\shell.py:131
+msgid "Save current history log (i.e. all inputs and outputs) in a text file"
+msgstr ""
+"Enregistrer l'historique complet (toutes les entrées et sorties) dans un "
+"fichier texte"
+
+#: spyderlib\widgets\shell.py:251
+msgid "Save history log"
+msgstr "Enregistrer l'historique"
+
+#: spyderlib\widgets\shell.py:254
+msgid "History logs"
+msgstr "Fichiers d'historique"
+
+#: spyderlib\widgets\shell.py:265
+msgid "<b>Unable to save file '%s'</b><br><br>Error message:<br>%s"
+msgstr ""
+"<b>Impossible d'enregistrer le fichier '%s'</b><br><br>Message d'erreur :<br>"
+"%s"
+
+#: spyderlib\widgets\shell.py:690
+msgid "Copy without prompts"
+msgstr "Copier sans les préfixes"
+
+#: spyderlib\widgets\shell.py:693 spyderlib\widgets\shell.py:696
+msgid "Clear line"
+msgstr "Effacer la ligne"
+
+#: spyderlib\widgets\shell.py:698
+msgid "Clear shell"
+msgstr "Effacer la console"
+
+#: spyderlib\widgets\shell.py:701
+msgid "Clear shell contents ('cls' command)"
+msgstr "Effacer le contenu de la console"
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:69
+msgid "Editor's code completion, go-to-definition and help"
+msgstr "Editeur : complétion de code, aller à la définition, etc."
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:273
+msgid "Go to line:"
+msgstr "Aller à la ligne :"
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:282
+msgid "Line count:"
+msgstr "Nombre de lignes :"
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:1218
+msgid "Breakpoint"
+msgstr "Point d'arrêt"
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:1219
+msgid "Condition:"
+msgstr "Condition :"
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:1667
+msgid "To do"
+msgstr "À faire"
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:2246
+msgid "Go to definition"
+msgstr "Aller à la définition de l'objet"
+
+#: spyderlib\widgets\status.py:83
+msgid "Memory:"
+msgstr "Mémoire :"
+
+#: spyderlib\widgets\status.py:84
+msgid ""
+"Memory usage status: requires the `psutil` (>=v0.3) library on non-Windows "
+"platforms"
+msgstr ""
+"Occupation mémoire : requiert la bibliothèque `psutil` (>=v0.3) sur les "
+"plateformes autres que Windows"
+
+#: spyderlib\widgets\status.py:96
+msgid "CPU:"
+msgstr "CPU :"
+
+#: spyderlib\widgets\status.py:97
+msgid "CPU usage status: requires the `psutil` (>=v0.3) library"
+msgstr "Occupation CPU : requiert la bibliothèque `psutil` (>=v0.3)"
+
+#: spyderlib\widgets\status.py:119
+msgid "Permissions:"
+msgstr "Droits d'accès :"
+
+#: spyderlib\widgets\status.py:133
+msgid "End-of-lines:"
+msgstr "Fins de ligne :"
+
+#: spyderlib\widgets\status.py:147
+msgid "Encoding:"
+msgstr "Encodage :"
+
+#: spyderlib\widgets\status.py:160
+msgid "Line:"
+msgstr "Ligne :"
+
+#: spyderlib\widgets\status.py:164
+msgid "Column:"
+msgstr "Colonne :"
+
+#: spyderlib\widgets\tabs.py:120
+msgid "Browse tabs"
+msgstr "Naviguer dans les onglets"
+
+#: spyderlib\widgets\tabs.py:243
+msgid "Close current tab"
+msgstr "Fermer l'onglet"
+
+#: spyderlib\widgets\texteditor.py:65
+msgid "Text editor"
+msgstr "Éditeur de texte"
+
+#~ msgid ""
+#~ "Run current block \n"
+#~ "(see Editor section in documentation \n"
+#~ "for more details on blocks) \n"
+#~ "and advance to the next block"
+#~ msgstr ""
+#~ "Exécuter le bloc (voir la section 'Editor' de la documentation) \n"
+#~ "et avancer jusqu'au bloc suivant"
+
+#~ msgid "Run &selection or current block"
+#~ msgstr "Exécuter la &sélection ou le bloc de lignes"
+
+#~ msgid "Version"
+#~ msgstr "Version"
+
+#~ msgid "Status"
+#~ msgstr "Etat"
+
+#~ msgid ""
+#~ "This feature requires the pywin32 module.\n"
+#~ "It seems you don't have it installed."
+#~ msgstr ""
+#~ "Cette fonctionnalité nécessite l'installation du module pywin32.\n"
+#~ "Ce dernier n'est apparemment pas installé."
+
+#~ msgid "Step Over"
+#~ msgstr "Pas en avant"
+
+#~ msgid ""
+#~ "Run selection or current \n"
+#~ "block of lines"
+#~ msgstr "Exécuter la sélection ou le bloc de lignes"
+
+#~ msgid "Debug current script in selected console"
+#~ msgstr "Déboguer le script courant dans la console sélectionnée"
+
+#~ msgid "Debug Step Over"
+#~ msgstr "Pas en avant (débogage)"
+
+#~ msgid "Debug Continue"
+#~ msgstr "Continuer (débogage)"
+
+#~ msgid "Debug Step Into"
+#~ msgstr "Pas vers l'intérieur (débogage)"
+
+#~ msgid "Debug Step Return"
+#~ msgstr "Pas vers l'extérieur (débogage)"
+
+#~ msgid ""
+#~ "Run selected script in\n"
+#~ "current console"
+#~ msgstr "Exécuter le script sélectionné dans la console courante"
+
+#~ msgid "Edit Run settings"
+#~ msgstr "Modifier les options d'exécution"
+
+#~ msgid ""
+#~ "Run again last script in current\n"
+#~ "console with the same options"
+#~ msgstr ""
+#~ "Exécuter de nouveau le dernier script dans la console courante avec les "
+#~ "mêmes options"
+
+#~ msgid ""
+#~ "Run selected text or current block\n"
+#~ "of lines inside current console"
+#~ msgstr ""
+#~ "Exécuter le texte sélectionné ou le bloc de lignes \n"
+#~ "dans l'interpréteur de la console courante"
+
+#~ msgid "Run active script in a new Python interpreter"
+#~ msgstr "Exécuter le script actuel dans un nouvel interpréteur Python"
+
+#~ msgid ""
+#~ "Debug current script in external console\n"
+#~ "(external console is executed in a separate process)"
+#~ msgstr ""
+#~ "Déboguer le script en cours d'édition dans la console externe\n"
+#~ "(la console externe est exécutée dans un processus séparé)"
+
+#~ msgid "Edit run configurations"
+#~ msgstr "Modifier les configurations d'exécution des scripts récents"
+
+#~ msgid "Light background"
+#~ msgstr "Fond blanc"
+
+#~ msgid "Dark background"
+#~ msgstr "Fond noir"
+
+#~ msgid "Run %s"
+#~ msgstr "Exécution de %s"
+
+#~ msgid "Run configurations"
+#~ msgstr "Configurations d'exécution"
+
+#~ msgid "Type \"copyright\", \"credits\" or \"license\" for more information."
+#~ msgstr ""
+#~ "Type \"copyright\", \"credits\" or \"license\" for more information."
+
+#~ msgid "Start an IPython kernel at startup"
+#~ msgstr "Démarrer un noyau IPython au démarrage"
+
+#~ msgid "This option is not available for IPython versions prior to v0.12."
+#~ msgstr ""
+#~ "Cette option est désactivée pour les versions de IPython antérieures à "
+#~ "v0.12."
+
+#, fuzzy
+#~ msgid "Format:   "
+#~ msgstr "Format"
+
+#, fuzzy
+#~ msgid "  Source"
+#~ msgstr "Source"
+
+#~ msgid "Open &interpreter"
+#~ msgstr "Ouvrir un &interpréteur"
+
+#~ msgid "Start a new IPython kernel"
+#~ msgstr "Démarrer un nouveau noyau IPython"
+
+#~ msgid "Client"
+#~ msgstr "Client"
+
+#~ msgid "New IPython client..."
+#~ msgstr "Nouveau client IPython..."
+
+#~ msgid "Qt"
+#~ msgstr "Qt"
+
+#~ msgid "OS X"
+#~ msgstr "OS X"
+
+#~ msgid "Gtk"
+#~ msgstr "Gtk"
+
+#~ msgid "Wx"
+#~ msgstr "Wx"
+
+#~ msgid "Tkinter"
+#~ msgstr "Tkinter"
+
+#~ msgid "IPython kernels"
+#~ msgstr "Noyaux IPython"
+
+#~ msgid ""
+#~ "<b>Note:</b><br>IPython >=<u>v0.12</u> is not installed on this computer."
+#~ msgstr ""
+#~ "<b>Note :</b><br>IPython >=<u>v0.12</u> n'est pas installé sur cet "
+#~ "ordinateur."
+
+#~ msgid "Set the appropriate IPython color option"
+#~ msgstr "Utiliser le réglage de couleur IPython approprié"
+
+#~ msgid "Open an IPython interpreter at startup"
+#~ msgstr "Ouvrir un interpréteur IPython au démarrage"
+
+#~ msgid ""
+#~ "This option is not available for IPython\n"
+#~ "versions which are not fully supported\n"
+#~ "through Spyder's console (i.e. IPython v0.11+)."
+#~ msgstr ""
+#~ "Cette option est désactivée pour les versions de IPython\n"
+#~ "qui ne sont entièrement prises en charge par Spyder\n"
+#~ "à travers la console (i.e. IPython v0.11+)."
+
+#~ msgid "IPython interpreter command line options"
+#~ msgstr "IPython : options en ligne de commande"
+
+#~ msgid "Open IPython interpreter"
+#~ msgstr "Ouvrir un interpréteur IPython"
+
+#~ msgid "Open an IPython interpreter"
+#~ msgstr "Ouvrir un interpréteur IPython"
+
+#~ msgid "Open IPython here"
+#~ msgstr "Ouvrir IPython ici"
+
+#~ msgid "IPython Console"
+#~ msgstr "Console IPython"
+
+#~ msgid "Please install the %s tool named '%s'"
+#~ msgstr "Merci d'installer l'outil %s appelé '%s'"
+
+#~ msgid "Replace PyQt input hook by Spyder's"
+#~ msgstr "Remplacer le \"input hook\" de PyQt par celui de Spyder"
+
+#~ msgid "What is the workspace?"
+#~ msgstr "Qu'est-ce que l'espace de travail ?"
+
+#~ msgid ""
+#~ "A Spyder project is a folder with source code files (and any other kind "
+#~ "of related files) and a configuration file (named <b>.spyderproject</b>) "
+#~ "which stores the project settings (PYTHONPATH, related projects, ...)."
+#~ "<br><br>The workspace is a directory, which contains Spyder projects "
+#~ "(<u>top level</u> subdirectories) and a configuration file (named <b>."
+#~ "spyderworkspace</b>). "
+#~ msgstr ""
+#~ "Un projet Spyder est un répertoire contenant des fichiers source (et tout "
+#~ "autre type de fichier) et un fichier de configuration (nommé <b>."
+#~ "spyderproject</b>) qui stocke les paramètres du projet (PYTHONPATH, "
+#~ "projets associés, etc.).<br><br>L'espace de travail est un répertoire "
+#~ "contenant des projets Spyder (sous-répertoires <u>uniquement</u>) et un "
+#~ "fichier de configuration (nommé <b>.spyderworkspace</b>)."
+
+#~ msgid "Matplotlib backend (default: Qt4Agg):"
+#~ msgstr "Backend Matplotlib (valeur par défaut: Qt4Agg) :"
+
+#~ msgid "ETS_TOOLKIT (default value: qt4):"
+#~ msgstr "ETS_TOOLKIT (valeur par défaut: qt4) :"
+
+#~ msgid "&Interact"
+#~ msgstr "&Interagir"
+
+#~ msgid "Interact toolbar"
+#~ msgstr "Barre d'outil d'interaction"
+
+#~ msgid ""
+#~ "The project explorer shows a tree view of projects: the root of this tree "
+#~ "is called the workspace.<br><br>Each project is associated to a simple "
+#~ "source code folder containing a configuration file (named <b>."
+#~ "spyderproject</b>) which stores the project settings (PYTHONPATH, related "
+#~ "projects, ...). The workspace is also associated to a folder containing a "
+#~ "configuration file (named <b>.spyderworkspace</b>) <u>and</u> the folders "
+#~ "associated to its projects.<br><br>In other words, the workspace is "
+#~ "nothing but a list of projects whose associated folder share the same "
+#~ "parent directory."
+#~ msgstr ""
+#~ "L'explorateur de projet affiche une arborescence de projets dont la "
+#~ "racine est appelée l'espace de travail.<br><br>Chaque projet est associé "
+#~ "à un simple dossier de code source contenant un fichier de configuration "
+#~ "(nommé <b>.spyderproject</b>) qui stocke les paramètres du projet "
+#~ "(PYTHONPATH, projets associés, etc.). L'espace de travail est aussi "
+#~ "associé à un dossier qui contient un fichier de configuration (nommé <b>."
+#~ "spyderworkspace</b>) <u>et</u> tous les dossiers associés à ses projets."
+#~ "<br><br>En d'autres termes, l'espace de travail est simplement une liste "
+#~ "de projets dont les dossiers associés ont le même répertoire parent."
+
+#~ msgid "Browse"
+#~ msgstr "Parcourir"
+
+#~ msgid "Create a new workspace directory"
+#~ msgstr "Créer un nouvel espace de travail"
+
+#~ msgid "The directory <b>%s</b> is not a Spyder workspace."
+#~ msgstr "Le répertoire <b>%s</b> n'est pas un espace de travail Spyder."
+
+#~ msgid "New folder..."
+#~ msgstr "Nouveau répertoire..."
+
+#~ msgid "New file..."
+#~ msgstr "Nouveau fichier..."
+
+#~ msgid "Open outside Spyder"
+#~ msgstr "Ouvrir en dehors de Spyder"
+
+#~ msgid "<b>Unable to delete selected file</b><br><br>Error message:<br>%s"
+#~ msgstr ""
+#~ "<b>Impossible de supprimer le fichier sélectionné</b><br><br>Message "
+#~ "d'erreur :<br>%s"
+
+#~ msgid "<b>Unable to rename selected file</b><br><br>Error message:<br>%s"
+#~ msgstr ""
+#~ "<b>Impossible de renommer le fichier sélectionné</b><br><br>Message "
+#~ "d'erreur :<br>%s"
+
+#~ msgid "Folder name"
+#~ msgstr "Nom du répertoire"
+
+#~ msgid "project"
+#~ msgstr "projet"
+
+#~ msgid "Select project root path"
+#~ msgstr "Sélectionner la racine du projet"
+
+#~ msgid "Edit filename filter"
+#~ msgstr "Modifier le filtre des types de fichier affichés"
+
+#~ msgid "regular expressions"
+#~ msgstr "expressions régulières"
+
+#~ msgid "global patterns"
+#~ msgstr "syntaxe globale"
+
+#~ msgid "Include"
+#~ msgstr "Inclure"
+
+#~ msgid "Exclude"
+#~ msgstr "Exclure"
+
+#~ msgid "Edit filter"
+#~ msgstr "Modifier le filtre"
+
+#~ msgid "Warning:"
+#~ msgstr "Attention :"
+
+#~ msgid ""
+#~ "<i>%s</i> is not properly installed<br>(opening a terminal and typing \"%"
+#~ "s script.py\" do not work)"
+#~ msgstr ""
+#~ "<i>%s</i> n'est pas installé correctement<br>(l'exécution dans un "
+#~ "terminal de \"%s script.py\" ne fonctionne pas)"
+
+#~ msgid "More informations on style guide for Python code: %s."
+#~ msgstr ""
+#~ "Pour plus d'informations sur les recommandations de style d'écriture du "
+#~ "langage Python : %s."
+
+#~ msgid "unknown"
+#~ msgstr "inconnu"
+
+#~ msgid "Startup script:"
+#~ msgstr "Script de démarrage :"
+
+#~ msgid "Print"
+#~ msgstr "Impression"
+
+#~ msgid "<b>Unable to print document '%s'</b>"
+#~ msgstr "<b>Impossible d'imprimer le document '%s'</b>"
+
+#~ msgid "Show outline explorer"
+#~ msgstr "Afficher l'explorateur de structure"
+
+#~ msgid "Co&mment"
+#~ msgstr "Co&mmenter"
+
+#~ msgid "&Uncomment"
+#~ msgstr "&Décommenter"
+
+#~ msgid "Uncomment current line or selection"
+#~ msgstr "Décommenter la sélection ou la ligne en cours d'édition"
+
+#~ msgid "Matched braces:"
+#~ msgstr "Parenthèses correspondantes:"
+
+#~ msgid "Unmatched braces:"
+#~ msgstr "Parenthèse isolée:"
+
+#~ msgid "Please install <b>matplotlib</b>."
+#~ msgstr "Merci d'installer <b>matplotlib</b>."
+
+#~ msgid "Remote editing"
+#~ msgstr "Éditeurs dans le processus distant"
+
+#~ msgid ""
+#~ "Remote editing for NumPy arrays, PIL images, lists, tuples and "
+#~ "dictionaries"
+#~ msgstr ""
+#~ "Les tableaux NumPy, images PIL, listes, tuples et dictionnaires seront "
+#~ "modifiés dans un éditeur exécuté dans le processus distant"
+
+#~ msgid ""
+#~ "Editors are opened in the remote process for NumPy arrays, PIL images, "
+#~ "lists, tuples and dictionaries"
+#~ msgstr ""
+#~ "Les tableaux NumPy, images PIL, listes, tuples et dictionnaires seront "
+#~ "modifiés dans un éditeur exécuté dans le processus distant"
+
+#~ msgid "Open..."
+#~ msgstr "Ouvrir..."
+
+#~ msgid "Save as..."
+#~ msgstr "Enregistrer sous..."
+
+#~ msgid "Close"
+#~ msgstr "Fermer"
+
+#~ msgid "Close all"
+#~ msgstr "Fermer tout"
+
+#~ msgid "Add block comment"
+#~ msgstr "Ajouter un bloc de commentaires"
+
+#~ msgid "Remove block comment"
+#~ msgstr "Supprimer un bloc de commentaires"
+
+#~ msgid "Save all"
+#~ msgstr "Enregistrer tout"
+
+#~ msgid "Pyrex files"
+#~ msgstr "Fichiers Pyrex"
+
+#~ msgid "Print..."
+#~ msgstr "Imprimer..."
+
+#~ msgid "Re-run last script"
+#~ msgstr "Exécuter de nouveau le dernier script"
+
+#~ msgid "Close file"
+#~ msgstr "Fermer le fichier"
+
+#~ msgid "Show TODO/FIXME/XXX comments list"
+#~ msgstr "Afficher la liste des commentaires du type TODO/FIXME/XXX"
+
+#~ msgid "Configure..."
+#~ msgstr "Configurer..."
+
+#~ msgid "Previous file"
+#~ msgstr "Fichier précédent"
+
+#~ msgid "Next file"
+#~ msgstr "Fichier suivant"
+
+#~ msgid "Revert"
+#~ msgstr "Réinitialiser"
+
+#~ msgid "Add &block comment around current line or selection"
+#~ msgstr ""
+#~ "Ajouter un &bloc de commentaires autour de la sélection ou de la ligne en "
+#~ "cours d'édition"
+
+#~ msgid "Tasks (TODO, FIXME, XXX)"
+#~ msgstr "Tâches (TODO, FIXME, XXX)"
+
+#~ msgid ""
+#~ "IPython interpreter command line options:\n"
+#~ "(Qt4 support: -q4thread)\n"
+#~ "(Qt4 and matplotlib support: -q4thread -pylab)"
+#~ msgstr ""
+#~ "Options en ligne de commande de IPython :\n"
+#~ "(support Qt4 : -q4thread)\n"
+#~ "(support Qt4 et matplotlib : -q4thread -pylab)"
+
+#~ msgid ""
+#~ "PyQt installs an input hook that processes events when an interactive "
+#~ "interpreter is waiting for user input, thus allowing to interact with "
+#~ "widgets without blocking the Python shell. Unfortunately, this is not "
+#~ "working well on Windows platforms."
+#~ msgstr ""
+#~ "PyQt installe un mécanisme (\"input hook\") qui permet d'interagir avec "
+#~ "des widgets dans un interpréteur Python sans bloquer ce dernier. "
+#~ "Malheureusement, ce mécanisme ne fonctionne pas parfaitement sous Windows."
+
+#~ msgid "Replace text"
+#~ msgstr "Remplacer"
+
+#~ msgid "Find next"
+#~ msgstr "Rechercher le suivant"
+
+#~ msgid "Find previous"
+#~ msgstr "Rechercher le précédent"
+
+#~ msgid "All files (*.*)"
+#~ msgstr "Tous les fichiers (*.*)"
+
+#~ msgid "Edit filename filter..."
+#~ msgstr "Modifier le filtre des types de fichier affichés"
diff --git a/spyderlib/locale/spyderlib.pot b/spyderlib/locale/spyderlib.pot
index ed29e93..3e15e1f 100755
--- a/spyderlib/locale/spyderlib.pot
+++ b/spyderlib/locale/spyderlib.pot
@@ -1,4107 +1,4099 @@
-# SOME DESCRIPTIVE TITLE.
-# Copyright (C) YEAR ORGANIZATION
-# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2013-10-12 19:49+COT\n"
-"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
-"Language-Team: LANGUAGE <LL at li.org>\n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
-"Content-Transfer-Encoding: ENCODING\n"
-"Generated-By: pygettext.py 1.5\n"
-
-
-#: spyderlib/config.py:46
-msgid "Python files"
-msgstr ""
-
-#: spyderlib/config.py:47
-msgid "Cython/Pyrex files"
-msgstr ""
-
-#: spyderlib/config.py:48
-msgid "C files"
-msgstr ""
-
-#: spyderlib/config.py:49
-msgid "C++ files"
-msgstr ""
-
-#: spyderlib/config.py:50
-msgid "OpenCL files"
-msgstr ""
-
-#: spyderlib/config.py:51
-msgid "Fortran files"
-msgstr ""
-
-#: spyderlib/config.py:52
-msgid "IDL files"
-msgstr ""
-
-#: spyderlib/config.py:53
-msgid "MATLAB files"
-msgstr ""
-
-#: spyderlib/config.py:54
-msgid "Patch and diff files"
-msgstr ""
-
-#: spyderlib/config.py:55
-msgid "Batch files"
-msgstr ""
-
-#: spyderlib/config.py:56 spyderlib/utils/iofuncs.py:345
-msgid "Text files"
-msgstr ""
-
-#: spyderlib/config.py:57
-msgid "reStructured Text files"
-msgstr ""
-
-#: spyderlib/config.py:58
-msgid "gettext files"
-msgstr ""
-
-#: spyderlib/config.py:59
-msgid "NSIS files"
-msgstr ""
-
-#: spyderlib/config.py:60
-msgid "Web page files"
-msgstr ""
-
-#: spyderlib/config.py:61
-msgid "XML files"
-msgstr ""
-
-#: spyderlib/config.py:62
-msgid "Javascript files"
-msgstr ""
-
-#: spyderlib/config.py:63
-msgid "Enaml files"
-msgstr ""
-
-#: spyderlib/config.py:64
-msgid "Configuration files"
-msgstr ""
-
-#: spyderlib/config.py:71 spyderlib/widgets/explorer.py:619
-msgid "All files"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:134
-msgid "Preferences"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:413
-msgid "Invalid directory path"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:416 spyderlib/plugins/configdialog.py:432
-#: spyderlib/plugins/runconfig.py:169 spyderlib/plugins/runconfig.py:229
-#: spyderlib/plugins/workingdirectory.py:293 spyderlib/widgets/explorer.py:535
-#: spyderlib/widgets/externalshell/pythonshell.py:602
-#: spyderlib/widgets/findinfiles.py:502 spyderlib/widgets/pathmanager.py:217
-#: spyderlib/widgets/projectexplorer.py:888
-msgid "Select directory"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:444
-msgid "Invalid file path"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:447 spyderlib/plugins/configdialog.py:465
-msgid "Select file"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:464
-msgid "All files (*)"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:528 spyderlib/widgets/formlayout.py:216
-msgid "Bold"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:531 spyderlib/widgets/formlayout.py:211
-msgid "Italic"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:569
-msgid "Font: "
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:573
-msgid "Size: "
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:582 spyderlib/plugins/history.py:41
-msgid "Font style"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:626
-msgid "General"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:635 spyderlib/plugins/editor.py:93
-#: spyderlib/plugins/externalconsole.py:74
-#: spyderlib/plugins/ipythonconsole.py:70
-msgid "Interface"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:638
-msgid "Qt windows style"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:642
-msgid "Use a single instance"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:644
-msgid "Set this to open external<br> Python files in an already running instance (Requires a restart)"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:647
-msgid "Vertical dockwidget title bars"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:649
-msgid "Vertical dockwidget tabs"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:651
-msgid "Animated toolbars and dockwidgets"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:653
-msgid "Tear off menus"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:654
-msgid "Set this to detach any<br> menu from the main window"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:656
-msgid "Custom dockwidget margin:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:673
-msgid ""
-"This feature requires the pywin32 module.\n"
-"It seems you don't have it installed."
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:691
-msgid "Status bar"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:692
-msgid "Show memory usage every"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:703
-msgid "Show CPU usage every"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:720
-msgid "Debugging"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:721
-msgid "Pop up internal console when internal errors appear"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:744
-msgid "Syntax coloring"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:755
-msgid "Background:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:756
-#: spyderlib/widgets/sourcecode/codeeditor.py:256
-msgid "Current line:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:757
-msgid "Occurence:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:758
-msgid "Link:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:759
-msgid "Side areas:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:760
-msgid "Matched parentheses:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:761
-msgid "Unmatched parentheses:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:762
-msgid "Normal text:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:763
-msgid "Keyword:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:764
-msgid "Builtin:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:765
-msgid "Definition:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:766
-msgid "Comment:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:767
-msgid "String:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:768
-msgid "Number:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:769
-msgid "Instance:"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:775
-msgid "Color scheme"
-msgstr ""
-
-#: spyderlib/plugins/configdialog.py:797 spyderlib/plugins/shortcuts.py:344
-msgid "Reset to default values"
-msgstr ""
-
-#: spyderlib/plugins/console.py:103
-msgid "Internal console"
-msgstr ""
-
-#: spyderlib/plugins/console.py:123 spyderlib/plugins/ipythonconsole.py:521
-#: spyderlib/spyder.py:757
-msgid "&Quit"
-msgstr ""
-
-#: spyderlib/plugins/console.py:124 spyderlib/spyder.py:758
-msgid "Quit"
-msgstr ""
-
-#: spyderlib/plugins/console.py:127 spyderlib/plugins/externalconsole.py:1098
-msgid "&Run..."
-msgstr ""
-
-#: spyderlib/plugins/console.py:128 spyderlib/plugins/externalconsole.py:1099
-msgid "Run a Python script"
-msgstr ""
-
-#: spyderlib/plugins/console.py:131
-msgid "Environment variables..."
-msgstr ""
-
-#: spyderlib/plugins/console.py:133
-msgid "Show and edit environment variables (for current session)"
-msgstr ""
-
-#: spyderlib/plugins/console.py:137
-msgid "Show sys.path contents..."
-msgstr ""
-
-#: spyderlib/plugins/console.py:139
-msgid "Show (read-only) sys.path"
-msgstr ""
-
-#: spyderlib/plugins/console.py:142
-msgid "Buffer..."
-msgstr ""
-
-#: spyderlib/plugins/console.py:143 spyderlib/plugins/externalconsole.py:94
-#: spyderlib/plugins/history.py:34
-msgid "Set maximum line count"
-msgstr ""
-
-#: spyderlib/plugins/console.py:146 spyderlib/plugins/explorer.py:59
-#: spyderlib/plugins/history.py:149 spyderlib/plugins/inspector.py:284
-#: spyderlib/plugins/projectexplorer.py:57
-msgid "&Font..."
-msgstr ""
-
-#: spyderlib/plugins/console.py:147 spyderlib/plugins/history.py:150
-msgid "Set shell font style"
-msgstr ""
-
-#: spyderlib/plugins/console.py:150
-msgid "External editor path..."
-msgstr ""
-
-#: spyderlib/plugins/console.py:151
-msgid "Set external editor executable path"
-msgstr ""
-
-#: spyderlib/plugins/console.py:154 spyderlib/plugins/editor.py:131
-#: spyderlib/plugins/externalconsole.py:95 spyderlib/plugins/history.py:37
-#: spyderlib/plugins/history.py:152 spyderlib/plugins/inspector.py:96
-#: spyderlib/plugins/inspector.py:287
-msgid "Wrap lines"
-msgstr ""
-
-#: spyderlib/plugins/console.py:157 spyderlib/plugins/editor.py:161
-#: spyderlib/plugins/externalconsole.py:144
-msgid "Balloon tips"
-msgstr ""
-
-#: spyderlib/plugins/console.py:161 spyderlib/plugins/editor.py:153
-#: spyderlib/plugins/externalconsole.py:136
-msgid "Automatic code completion"
-msgstr ""
-
-#: spyderlib/plugins/console.py:165 spyderlib/plugins/editor.py:159
-#: spyderlib/plugins/externalconsole.py:142
-msgid "Enter key selects completion"
-msgstr ""
-
-#: spyderlib/plugins/console.py:170
-msgid "Internal console settings"
-msgstr ""
-
-#: spyderlib/plugins/console.py:221 spyderlib/plugins/externalconsole.py:1272
-msgid "Run Python script"
-msgstr ""
-
-#: spyderlib/plugins/console.py:222 spyderlib/plugins/externalconsole.py:258
-#: spyderlib/plugins/externalconsole.py:1273 spyderlib/widgets/explorer.py:633
-msgid "Python scripts"
-msgstr ""
-
-#: spyderlib/plugins/console.py:267 spyderlib/plugins/explorer.py:110
-#: spyderlib/plugins/history.py:267 spyderlib/plugins/inspector.py:548
-#: spyderlib/plugins/projectexplorer.py:119
-msgid "Select a new font"
-msgstr ""
-
-#: spyderlib/plugins/console.py:274
-msgid "Buffer"
-msgstr ""
-
-#: spyderlib/plugins/console.py:275
-msgid "Maximum line count"
-msgstr ""
-
-#: spyderlib/plugins/console.py:284
-msgid "External editor"
-msgstr ""
-
-#: spyderlib/plugins/console.py:285
-msgid "External editor executable path:"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:87 spyderlib/plugins/editor.py:510
-#: spyderlib/plugins/editor.py:1574 spyderlib/plugins/inspector.py:315
-#: spyderlib/widgets/editor.py:566
-#: spyderlib/widgets/sourcecode/codeeditor.py:246
-#: spyderlib/widgets/sourcecode/codeeditor.py:2535
-msgid "Editor"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:90
-msgid "Edit template for new modules"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:95
-msgid "Text and margin font style"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:98
-msgid "Sort files according to full path"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:100
-msgid "Show tab bar"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:107 spyderlib/plugins/editor.py:182
-#: spyderlib/plugins/externalconsole.py:90
-#: spyderlib/plugins/externalconsole.py:135 spyderlib/plugins/history.py:36
-#: spyderlib/plugins/inspector.py:95 spyderlib/plugins/ipythonconsole.py:116
-msgid "Source code"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:108
-msgid "Show line numbers"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:109
-msgid "Show vertical line after"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:110
-msgid "characters"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:118
-msgid "Highlight current line"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:120
-msgid "Highlight occurences after"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:134 spyderlib/plugins/history.py:45
-#: spyderlib/plugins/inspector.py:99
-msgid "Syntax color scheme: "
-msgstr ""
-
-#: spyderlib/plugins/editor.py:146 spyderlib/plugins/runconfig.py:304
-#: spyderlib/plugins/runconfig.py:426 spyderlib/plugins/runconfig.py:433
-#: spyderlib/spyder.py:1713 spyderlib/widgets/explorer.py:229
-#: spyderlib/widgets/externalshell/baseshell.py:137
-msgid "Run"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:147
-msgid "Save all files before running script"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:150 spyderlib/plugins/externalconsole.py:424
-msgid "Introspection"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:155 spyderlib/plugins/externalconsole.py:138
-msgid "Case sensitive code completion"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:157 spyderlib/plugins/externalconsole.py:140
-msgid "Show single completion"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:162
-msgid "Link to object definition"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:164
-msgid ""
-"If this option is enabled, clicking on an object\n"
-"name (left-click + Ctrl key) will go this object\n"
-"definition (if resolved)."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:168 spyderlib/plugins/externalconsole.py:146
-#: spyderlib/plugins/ipythonconsole.py:88
-msgid "Automatic notification to object inspector"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:170
-msgid ""
-"If this option is enabled, object inspector\n"
-"will automatically show informations on functions\n"
-"entered in editor (this is triggered when entering\n"
-"a left parenthesis after a valid function name)"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:175
-msgid "<b>Warning:</b><br>The Python module <i>rope</i> is not installed on this computer: calltips, code completion and go-to-definition features won't be available."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:183
-msgid "Automatic insertion of parentheses, braces and brackets"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:186
-msgid "Automatic insertion of closing quotes"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:188
-msgid "Automatic insertion of colons after 'for', 'if', 'def', etc"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:191
-msgid "Automatic indentation after 'else', 'elif', etc."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:193
-msgid "Indentation characters: "
-msgstr ""
-
-#: spyderlib/plugins/editor.py:194
-msgid "4 spaces"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:195
-msgid "2 spaces"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:196
-msgid "tab"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:197
-msgid "Tab stop width:"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:197
-msgid "pixels"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:199
-msgid "Tab always indent"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:201
-msgid ""
-"If enabled, pressing Tab will always indent,\n"
-"even when the cursor is not at the beginning\n"
-"of a line (when this option is enabled, code\n"
-"completion may be triggered using the alternate\n"
-"shortcut: Ctrl+Space)"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:206
-msgid "Intelligent backspace"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:208
-msgid "Automatically remove trailing spaces when saving files"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:212
-msgid "Analysis"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:214
-msgid "<u>Note</u>: add <b>analysis:ignore</b> in a comment to ignore code/style analysis warnings. For more informations on style guide for Python code, please refer to the %s page."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:223
-#: spyderlib/widgets/sourcecode/codeeditor.py:1587
-msgid "Code analysis"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:225
-msgid ""
-"If enabled, Python source code will be analyzed\n"
-"using pyflakes, lines containing errors or \n"
-"warnings will be highlighted"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:230
-msgid "Code analysis requires pyflakes %s+"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:232
-msgid "Style analysis"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:234
-msgid ""
-"If enabled, Python source code will be analyzed\n"
-"using pep8, lines that are not following PEP8\n"
-"style guide will be highlighted"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:241
-msgid "Tasks (TODO, FIXME, XXX, HINT, TIP)"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:244
-msgid "Perform analysis when saving file and every"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:248
-msgid "Perform analysis only when saving file"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:294
-msgid "End-of-line characters"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:295
-msgid "When opening a text file containing mixed end-of-line characters (this may raise syntax errors in Python interpreter on Windows platforms), Spyder may fix the file automatically."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:301
-msgid "Fix automatically and show warning message box"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:312 spyderlib/plugins/externalconsole.py:422
-#: spyderlib/plugins/ipythonconsole.py:369
-#: spyderlib/plugins/variableexplorer.py:41
-msgid "Display"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:314
-msgid "Code Introspection/Analysis"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:317 spyderlib/plugins/externalconsole.py:427
-msgid "Advanced settings"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:566 spyderlib/widgets/editortools.py:467
-msgid "Show/hide outline explorer"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:572
-msgid "Show/hide project explorer"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:581
-msgid "&New file..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:582 spyderlib/plugins/workingdirectory.py:81
-#: spyderlib/widgets/explorer.py:611 spyderlib/widgets/explorer.py:618
-msgid "New file"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:589
-msgid "&Open..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:590 spyderlib/plugins/editor.py:1615
-#: spyderlib/plugins/workingdirectory.py:68
-msgid "Open file"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:597
-msgid "&Revert"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:598
-msgid "Revert file from disk"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:601
-msgid "&Save"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:602
-msgid "Save file"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:609
-msgid "Sav&e all"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:610
-msgid "Save all files"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:617
-msgid "Save &as..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:618
-msgid "Save current file as..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:620 spyderlib/plugins/editor.py:621
-msgid "Print preview..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:622
-msgid "&Print..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:623
-msgid "Print current file..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:627
-msgid "&Close"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:628
-msgid "Close current file"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:632
-msgid "C&lose all"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:633
-msgid "Close all opened files"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:640
-msgid "Set/Clear breakpoint"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:647
-msgid "Set/Edit conditional breakpoint"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:655
-msgid "Clear breakpoints in all files"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:657
-msgid "Breakpoints"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:661
-msgid "Debug with winpdb"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:668 spyderlib/spyder.py:565
-msgid "&Debug"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:669
-msgid "Debug file"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:675
-msgid "Step"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:676
-msgid "Run current line"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:683
-msgid "Continue"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:684
-msgid "Continue execution until next breakpoint"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:692
-msgid "Step Into"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:693
-msgid "Step into function or method of current line"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:701
-msgid "Step Return"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:702
-msgid "Run until current function or method returns"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:710
-msgid "Exit"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:711
-msgid "Exit Debug"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:723
-msgid "Debugging control"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:727 spyderlib/plugins/editor.py:1226
-#: spyderlib/spyder.py:560
-msgid "&Run"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:728
-msgid "Run file"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:735
-msgid "&Configure..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:736
-#: spyderlib/widgets/externalshell/pythonshell.py:292
-msgid "Run settings"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:745
-msgid "Re-run &last script"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:746
-msgid "Run again last file"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:753
-#: spyderlib/widgets/sourcecode/codeeditor.py:2222
-msgid "Run &selection"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:755
-msgid "Run selection"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:761
-msgid "Run cell"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:763
-msgid ""
-"Run current cell (Ctrl+Enter)\n"
-"[Use #%% to create cells]"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:768
-msgid "Run cell and advance"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:771
-msgid "Run current cell and go to the next one (Shift+Enter)"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:777
-msgid "Show todo list"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:778
-msgid "Show TODO/FIXME/XXX/HINT/TIP comments list"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:786
-msgid "Show warning/error list"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:787
-msgid "Show code analysis warnings/errors"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:794
-msgid "Previous warning/error"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:795
-msgid "Go to previous code analysis warning/error"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:798
-msgid "Next warning/error"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:799
-msgid "Go to next code analysis warning/error"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:803
-msgid "Last edit location"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:804
-msgid "Go to last edit location"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:811
-msgid "Previous cursor position"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:812
-msgid "Go to previous cursor position"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:819
-msgid "Next cursor position"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:820
-msgid "Go to next cursor position"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:828
-#: spyderlib/widgets/sourcecode/codeeditor.py:2216
-msgid "Comment"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:828
-#: spyderlib/widgets/sourcecode/codeeditor.py:2216
-msgid "Uncomment"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:829
-msgid "Comment current line or selection"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:833
-msgid "Add &block comment"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:834
-msgid "Add block comment around current line or selection"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:840
-msgid "R&emove block comment"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:841
-msgid "Remove comment block around current line or selection"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:852
-msgid "Indent"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:853
-msgid "Indent current line or selection"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:856
-msgid "Unindent"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:857
-msgid "Unindent current line or selection"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:862
-msgid "Carriage return and line feed (Windows)"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:865
-msgid "Line feed (UNIX)"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:868
-msgid "Carriage return (Mac)"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:874
-msgid "Convert end-of-line characters"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:878
-msgid "Remove trailing spaces"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:880
-msgid "Fix indentation"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:881
-msgid "Replace tab characters by space characters"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:884
-msgid "Go to line..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:892
-msgid "Set console working directory"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:894
-msgid "Set current console (and file explorer) working directory to current script directory"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:899
-msgid "Maximum number of recent files..."
-msgstr ""
-
-#: spyderlib/plugins/editor.py:902
-msgid "Clear recent files list"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:902
-msgid "Clear this list"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:904
-msgid "Open &recent"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1214 spyderlib/spyder.py:541
-msgid "File toolbar"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1215 spyderlib/spyder.py:551
-msgid "Search toolbar"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1216 spyderlib/spyder.py:556
-msgid "Source toolbar"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1217 spyderlib/spyder.py:561
-msgid "Run toolbar"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1218 spyderlib/spyder.py:566
-msgid "Debug toolbar"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1219 spyderlib/spyder.py:546
-msgid "Edit toolbar"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1222 spyderlib/spyder.py:538
-msgid "&File"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1223 spyderlib/spyder.py:545
-msgid "&Edit"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1224 spyderlib/spyder.py:550
-msgid "&Search"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1225 spyderlib/spyder.py:555
-msgid "Sour&ce"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1227 spyderlib/spyder.py:573
-msgid "&Tools"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1228
-msgid "?"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1442
-msgid "Spyder Editor"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1443
-msgid "This temporary script file is located here:"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1504
-msgid "untitled"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1575
-msgid "Maximum number of recent files"
-msgstr ""
-
-#: spyderlib/plugins/editor.py:1697
-msgid "Printing..."
-msgstr ""
-
-#: spyderlib/plugins/explorer.py:47
-msgid "File explorer"
-msgstr ""
-
-#: spyderlib/plugins/explorer.py:60 spyderlib/plugins/inspector.py:285
-#: spyderlib/plugins/projectexplorer.py:58
-msgid "Set font style"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:45
-msgid "Interactive data plotting"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:60
-#: spyderlib/plugins/externalconsole.py:1065
-#: spyderlib/plugins/inspector.py:315 spyderlib/plugins/ipythonconsole.py:444
-#: spyderlib/plugins/ipythonconsole.py:1198
-#: spyderlib/widgets/externalshell/baseshell.py:105
-msgid "Console"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:78
-msgid "One tab per script"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:79
-#: spyderlib/widgets/externalshell/baseshell.py:170
-msgid "Show elapsed time"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:80 spyderlib/widgets/explorer.py:955
-msgid "Show icons and text"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:92
-msgid "Buffer: "
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:92
-#: spyderlib/plugins/ipythonconsole.py:118
-msgid " lines"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:97
-msgid "Merge process standard output/error channels"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:99
-msgid ""
-"Merging the output channels of the process means that\n"
-"the standard error won't be written in red anymore,\n"
-"but this has the effect of speeding up display."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:103
-msgid "Colorize standard error channel using ANSI escape codes"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:105
-msgid ""
-"This method is the only way to have colorized standard\n"
-"error channel when the output channels have been merged."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:123
-#: spyderlib/plugins/ipythonconsole.py:105
-#: spyderlib/widgets/arrayeditor.py:393
-msgid "Background color"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:124
-msgid "This option will be applied the next time a Python console or a terminal is opened."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:127
-msgid "Light background (white color)"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:148
-#: spyderlib/plugins/ipythonconsole.py:90
-msgid ""
-"If this option is enabled, object inspector\n"
-"will automatically show informations on functions\n"
-"entered in console (this is triggered when entering\n"
-"a left parenthesis after a valid function name)"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:163
-msgid "User Module Deleter (UMD)"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:164
-msgid ""
-"UMD forces Python to reload modules which were imported when executing a \n"
-"script in the external console with the 'runfile' function."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:167
-msgid "Enable UMD"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:168
-msgid "This option will enable the User Module Deleter (UMD) in Python interpreters. UMD forces Python to reload deeply modules during import when running a Python script using the Spyder's builtin function <b>runfile</b>.<br><br><b>1.</b> UMD may require to restart the Python interpreter in which it will be called (otherwise only newly imported modules will be reloaded when executing scripts).<br><br><b>2.</b> If errors occur when re-running a PyQt-based program, please check that the Q [...]
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:184
-msgid "Show reloaded modules list"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:185
-msgid "Please note that these changes will be applied only to new Python interpreters"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:189
-msgid "Set UMD excluded (not reloaded) modules"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:201
-msgid "Python executable"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:203
-msgid "Select the Python interpreter executable binary in which Spyder will run scripts:"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:206
-msgid "Default (i.e. the same as Spyder's)"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:210
-msgid "Use the following Python interpreter:"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:214
-msgid "Executables"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:234
-#: spyderlib/plugins/ipythonconsole.py:373
-#: spyderlib/plugins/workingdirectory.py:41
-msgid "Startup"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:235
-msgid "Open a Python interpreter at startup"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:243
-msgid "PYTHONSTARTUP replacement"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:245
-msgid ""
-"This option will override the PYTHONSTARTUP environment variable which\n"
-"defines the script to be executed during the Python interpreter startup."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:250
-msgid "Default PYTHONSTARTUP script"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:254
-msgid "Use the following startup script:"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:273
-msgid "Monitor"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:274
-msgid "The monitor provides introspection features to console: code completion, calltips and variable explorer. Because it relies on several modules, disabling the monitor may be useful to accelerate console startup."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:281
-msgid "Enable monitor"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:293
-msgid "Default library"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:295
-msgid "Qt (PyQt/PySide)"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:297
-msgid "Qt-Python bindings library selection:"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:299
-msgid "This option will act on<br> libraries such as Matplotlib, guidata or ETS"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:313
-msgid "Install Spyder's input hook for Qt"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:315
-msgid "PyQt installs an input hook that allows<br> creating and interacting with Qt widgets in an interactive interpreter without blocking it. On Windows platforms, it is strongly recommended to replace it by Spyder's. Regarding PySide, note that it does not install an input hook, so it is required to enable this feature in order to be able to manipulate PySide/Qtobjects interactively."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:334
-msgid "PyQt"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:336
-msgid "API selection for QString and QVariant objects:"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:337
-msgid "API #1"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:337
-msgid "API #2"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:337
-msgid "Default API"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:339
-msgid "PyQt API #1 is the default API for<br>Python 2. PyQt API #2 is the default API for Python 3 and is compatible with PySide. Note that switching to API #2 may require to enable the Matplotlib patch."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:345
-msgid "Ignore API change errors (sip.setapi)"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:347
-msgid "Enabling this option will ignore <br>errors when changing PyQt API. As PyQt does not support dynamic API changes, it is strongly recommended to use this feature wisely, e.g. for debugging purpose."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:366
-msgid "Matplotlib"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:368
-msgid "GUI backend:"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:370
-msgid "Set the GUI toolkit used by <br>Matplotlib to show figures (default: Qt4Agg)"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:381
-msgid "Patch Matplotlib figures"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:383
-msgid "Patching Matplotlib library will add a button to customize figure options (Qt4Agg only) and fix some issues."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:403
-msgid "Enthought Tool Suite"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:404
-msgid "Enthought Tool Suite (ETS) supports PyQt4 (qt4) and wxPython (wx) graphical user interfaces."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:408
-msgid "ETS_TOOLKIT:"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:429
-msgid "External modules"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:617
-msgid "Trying to kill a kernel?"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:618
-msgid "You can't close this kernel because it has one or more consoles connected to it.<br><br>You need to close them instead or you can kill the kernel using the button far to the right."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:693
-#: spyderlib/plugins/ipythonconsole.py:741 spyderlib/spyder.py:1249
-#: spyderlib/spyder.py:1267 spyderlib/utils/environ.py:95
-#: spyderlib/utils/environ.py:108
-msgid "Warning"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:694
-msgid "No Python shell is currently selected to run <b>%s</b>.<br><br>Please select or open a new Python interpreter and try again."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:771
-msgid ""
-"%s is already running in a separate process.\n"
-"Do you want to kill the process before starting a new one?"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:934
-msgid "Kernel"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:944
-#: spyderlib/plugins/ipythonconsole.py:1015
-msgid "Mismatch between kernel and frontend"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:945
-#: spyderlib/plugins/ipythonconsole.py:1016
-msgid "Your IPython frontend and kernel versions are <b>incompatible!!</b><br><br>We're sorry but we can't create an IPython console for you."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:966
-msgid "Command Window"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:968
-msgid "Terminal"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1087
-msgid "Open a Python &interpreter"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1090
-msgid "Open &command prompt"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1091
-msgid "Open a Windows command prompt"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1093
-msgid "Open &terminal"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1094
-msgid "Open a terminal window inside Spyder"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1215
-#: spyderlib/widgets/projectexplorer.py:334
-msgid " and "
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1220
-msgid "<br><u>Installed version</u>: %s"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1222
-#: spyderlib/plugins/ipythonconsole.py:59
-#: spyderlib/plugins/ipythonconsole.py:692
-msgid "IPython console"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1223
-msgid "Unable to open IPython console because no supported IPython version was found.<br><br><u>Supported IPython versions</u>: %s"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1244
-#: spyderlib/plugins/ipythonconsole.py:761
-msgid "Open an IPython console"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1245
-msgid "The console monitor was disabled: the IPython kernel will be started as expected, but an IPython console will have to be connected manually to the kernel."
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1281
-#: spyderlib/plugins/externalconsole.py:1294
-#: spyderlib/plugins/externalconsole.py:1298
-msgid "UMD"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1282
-msgid ""
-"UMD excluded modules:\n"
-"(example: guidata, guiqwt)"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1295
-msgid ""
-"The following modules are not installed on your machine:\n"
-"%s"
-msgstr ""
-
-#: spyderlib/plugins/externalconsole.py:1299
-msgid "Please note that these changes will be applied only to new Python/IPython interpreters"
-msgstr ""
-
-#: spyderlib/plugins/findinfiles.py:91 spyderlib/widgets/findinfiles.py:689
-msgid "Find in files"
-msgstr ""
-
-#: spyderlib/plugins/findinfiles.py:115
-msgid "&Find in files"
-msgstr ""
-
-#: spyderlib/plugins/findinfiles.py:118
-msgid "Search text in multiple files"
-msgstr ""
-
-#: spyderlib/plugins/history.py:30
-msgid "Settings"
-msgstr ""
-
-#: spyderlib/plugins/history.py:32
-msgid " entries"
-msgstr ""
-
-#: spyderlib/plugins/history.py:32
-msgid "History depth: "
-msgstr ""
-
-#: spyderlib/plugins/history.py:39
-msgid "Scroll automatically to last entry"
-msgstr ""
-
-#: spyderlib/plugins/history.py:98 spyderlib/plugins/inspector.py:368
-#: spyderlib/plugins/ipythonconsole.py:497 spyderlib/widgets/editor.py:653
-#: spyderlib/widgets/explorer.py:985
-#: spyderlib/widgets/externalshell/baseshell.py:150
-#: spyderlib/widgets/externalshell/namespacebrowser.py:228
-msgid "Options"
-msgstr ""
-
-#: spyderlib/plugins/history.py:118
-msgid "History log"
-msgstr ""
-
-#: spyderlib/plugins/history.py:145
-msgid "History..."
-msgstr ""
-
-#: spyderlib/plugins/history.py:147
-msgid "Set history maximum entries"
-msgstr ""
-
-#: spyderlib/plugins/history.py:257
-msgid "History"
-msgstr ""
-
-#: spyderlib/plugins/history.py:258
-msgid "Maximum entries"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:53
-msgid "Rich text help on the Object Inspector"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:108
-msgid "Plain text font style"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:111
-msgid "Rich text font style"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:113
-msgid "Additional features"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:114
-msgid "Render mathematical equations"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:120
-msgid "This feature requires Sphinx 1.1 or superior."
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:122
-msgid "Sphinx %s is currently installed."
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:269
-msgid "No documentation available"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:308
-msgid "Source"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:323 spyderlib/widgets/dicteditor.py:161
-msgid "Object"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:338
-msgid "Plain Text"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:342
-msgid "Show Source"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:346
-msgid "Rich Text"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:356
-msgid "Automatic import"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:412 spyderlib/plugins/inspector.py:799
-msgid "Object inspector"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:755
-msgid "Lock"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:755
-msgid "Unlock"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:800
-msgid "The following error occured when calling <b>Sphinx %s</b>. <br>Incompatible Sphinx version or doc string decoding failed.<br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/plugins/inspector.py:850
-msgid "No source code available."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:52
-msgid "Symbolic mathematics for the IPython Console"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:71
-msgid "Display initial banner"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:72
-msgid ""
-"This option lets you hide the message shown at\n"
-"the top of the console when it's opened."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:74
-msgid "Use a completion widget"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:76
-msgid "Use a widget instead of plain text output for tab completion"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:78
-msgid "Use a pager to display additional text inside the console"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:80
-msgid ""
-"Useful if you don't want to fill the console with long help or completion texts.\n"
-"Note: Use the Q key to get out of the pager."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:84
-msgid "Display balloon tips"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:85
-msgid "Ask for confirmation before closing"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:106
-msgid "Light background"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:108
-msgid "Dark background"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:118
-msgid "Buffer:  "
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:120
-msgid ""
-"Set the maximum number of lines of text shown in the\n"
-"console before truncation. Specifying -1 disables it\n"
-"(not recommended!)"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:129
-msgid "Support for graphics (Matplotlib)"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:130
-msgid "Activate support"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:131
-msgid "Automatically load Pylab and NumPy modules"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:134
-msgid ""
-"This lets you load graphics support without importing \n"
-"the commands to do plots. Useful to work with other\n"
-"plotting libraries different to Matplotlib or to develop \n"
-"GUIs with Spyder."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:153
-msgid ""
-"This feature requires the Matplotlib library.\n"
-"It seems you don't have it installed."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:158
-msgid "Inline"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:159
-msgid "Automatic"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:160
-msgid "Graphics backend"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:161
-msgid "Decide how graphics are going to be displayed in the console. If unsure, please select <b>%s</b> to put graphics inside the console or <b>%s</b> to interact with them (through zooming and panning) in a separate window."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:181
-msgid "Backend:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:183
-msgid "This option will be applied the next time a console is opened."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:195
-msgid "Inline backend"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:196
-msgid "Decide how to render the figures created by this backend"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:200
-msgid "Format:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:203
-msgid "Resolution:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:203
-msgid "dpi"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:205
-msgid "Only used when the format is PNG. Default is 72"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:208
-msgid "Width:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:208
-#: spyderlib/plugins/ipythonconsole.py:212
-msgid "inches"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:210
-msgid "Default is 6"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:212
-msgid "Height:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:214
-msgid "Default is 4"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:229
-msgid "Run code"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:230
-msgid "You can run several lines of code when a console is started. Please introduce each one separated by commas, for example:<br><i>import os, import sys</i>"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:236
-msgid "Lines:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:245
-msgid "Run a file"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:246
-msgid "You can also run a whole file at startup instead of just some lines (This is similar to have a PYTHONSTARTUP file)."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:250
-msgid "Use the following file:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:264
-msgid "Spyder startup"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:265
-msgid "Open an IPython console at startup"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:273
-msgid "Greedy completion"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:274
-msgid "Enable <tt>Tab</tt> completion on elements of lists, results of function calls, etc, <i>without</i> assigning them to a variable.<br>For example, you can get completions on things like <tt>li[0].<Tab></tt> or <tt>ins.meth().<Tab></tt>"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:282
-msgid "Use the greedy completer"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:293
-msgid "Autocall"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:294
-msgid "Autocall makes IPython automatically call any callable object even if you didn't type explicit parentheses.<br>For example, if you type <i>str 43</i> it becomes <i>str(43)</i> automatically."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:301
-msgid "Smart"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:302
-msgid "Full"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:303
-msgid "Off"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:305
-msgid "Autocall:  "
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:306
-msgid "On <b>%s</b> mode, Autocall is not applied if there are no arguments after the callable. On <b>%s</b> mode, all callable objects are automatically called (even if no arguments are present)."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:318
-msgid "Symbolic Mathematics"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:319
-msgid "Perfom symbolic operations in the console (e.g. integrals, derivatives, vector calculus, etc) and get the outputs in a beautifully printed style."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:324
-msgid "Use symbolic math"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:325
-msgid "This option loads the Sympy library to work with.<br>Please refer to its documentation to learn how to use it."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:338
-msgid ""
-"This feature requires the Sympy library.\n"
-"It seems you don't have it installed."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:343
-msgid "Prompts"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:344
-msgid "Modify how Input and Output prompts are shown in the console."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:347
-msgid "Input prompt:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:349
-msgid "Default is<br>In [<span class=\"in-prompt-number\">%i</span>]:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:353
-msgid "Output prompt:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:355
-msgid "Default is<br>Out[<span class=\"out-prompt-number\">%i</span>]:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:371
-msgid "Graphics"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:375
-msgid "Advanced Settings"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:458
-msgid "Interrupt kernel"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:461
-msgid "Restart kernel"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:466
-msgid "Intro to IPython"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:468
-msgid "Quick Reference"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:470
-msgid "Console help"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:472
-#: spyderlib/widgets/internalshell.py:253
-msgid "Help"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:473
-msgid "IPython Help"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:509
-msgid "Inspect current object"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:513
-msgid "Clear line or block"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:517
-msgid "Clear console"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:556
-msgid "It seems the kernel died unexpectedly. Use 'Restart kernel' to continue using this console."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:568
-msgid "Kernel process is either remote or unspecified. Cannot interrupt"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:577
-msgid "Kernel process is either remote or unspecified. Cannot restart."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:742
-msgid "No IPython console is currently available to run <b>%s</b>.<br><br>Please open a new one and try again."
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:766
-msgid "Connect to an existing kernel"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:768
-msgid "Open a new IPython client connected to an external kernel"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:903
-msgid "(for example: `kernel-3764.json`, or simply `3764`)"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:905
-#: spyderlib/plugins/ipythonconsole.py:945
-msgid "IPython"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:906
-msgid "Provide an IPython kernel connection file:"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:946
-msgid "Unable to connect to IPython kernel <b>`%s`"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:1160
-msgid ""
-"%s will be closed.\n"
-"Do you want to kill the associated kernel and all of its clients?"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:1206
-msgid "Are you sure you want to restart the kernel?"
-msgstr ""
-
-#: spyderlib/plugins/ipythonconsole.py:1208
-msgid "Restart kernel?"
-msgstr ""
-
-#: spyderlib/plugins/onlinehelp.py:66
-msgid "Online help"
-msgstr ""
-
-#: spyderlib/plugins/outlineexplorer.py:46
-#: spyderlib/widgets/editortools.py:160
-#: spyderlib/widgets/outlineexplorer.py:35
-msgid "Outline"
-msgstr ""
-
-#: spyderlib/plugins/projectexplorer.py:42
-#: spyderlib/widgets/projectexplorer.py:1133
-#: spyderlib/widgets/projectexplorer.py:1147
-msgid "Project explorer"
-msgstr ""
-
-#: spyderlib/plugins/projectexplorer.py:53
-#: spyderlib/widgets/projectexplorer.py:544
-msgid "New project..."
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:28
-msgid "Execute in current Python or IPython interpreter"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:29
-msgid "Execute in a new dedicated Python interpreter"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:30
-msgid "Execute in an external System terminal"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:40
-msgid "Always show %s on a first file run"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:150
-msgid "General settings"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:153 spyderlib/plugins/runconfig.py:194
-msgid "Command line options:"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:160
-msgid "Working directory:"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:175 spyderlib/plugins/runconfig.py:440
-msgid "Interpreter"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:186
-msgid "Dedicated Python interpreter"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:191
-msgid "Interact with the Python interpreter after execution"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:200
-msgid "<b>-u</b> is added to the other options you set here"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:211
-msgid "this dialog"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:267
-msgid "Run configuration"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:268
-msgid "The following working directory is not valid:<br><b>%s</b>"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:344
-msgid "Run settings for %s"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:375
-msgid "Select a run configuration:"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:405 spyderlib/plugins/runconfig.py:432
-msgid "Run Settings"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:434
-msgid "The following are the default <i>%s</i>. These options may be overriden using the <b>%s</b> dialog box (see the <b>%s</b> menu)"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:458
-#: spyderlib/widgets/externalshell/pythonshell.py:295
-msgid "Working directory"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:460
-msgid "Default working directory is:"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:462
-msgid "the script directory"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:465 spyderlib/plugins/workingdirectory.py:53
-msgid "the following directory:"
-msgstr ""
-
-#: spyderlib/plugins/runconfig.py:485
-msgid "Run Settings dialog"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:176
-msgid "Context"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:178 spyderlib/widgets/dicteditor.py:146
-#: spyderlib/widgets/importwizard.py:467
-msgid "Name"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:180
-msgid "Mod1"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:182
-msgid "Mod2"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:184
-msgid "Mod3"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:186 spyderlib/widgets/dicteditor.py:157
-msgid "Key"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:319
-msgid "Conflicts"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:320
-msgid "The following conflicts have been detected:"
-msgstr ""
-
-#: spyderlib/plugins/shortcuts.py:332
-msgid "Keyboard shortcuts"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:24
-msgid "Autorefresh"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:25
-msgid "Enable autorefresh"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:27
-msgid "Refresh interval: "
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:28
-msgid " ms"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:31
-msgid "Filter"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:33
-#: spyderlib/widgets/externalshell/namespacebrowser.py:198
-msgid "Exclude private references"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:34
-#: spyderlib/widgets/externalshell/namespacebrowser.py:213
-msgid "Exclude capitalized references"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:35
-#: spyderlib/widgets/externalshell/namespacebrowser.py:206
-msgid "Exclude all-uppercase references"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:36
-#: spyderlib/widgets/externalshell/namespacebrowser.py:221
-msgid "Exclude unsupported data types"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:43
-#: spyderlib/widgets/dicteditor.py:590
-msgid "Truncate values"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:44
-#: spyderlib/widgets/dicteditor.py:603
-msgid "Always edit in-place"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:45
-#: spyderlib/widgets/dicteditor.py:599
-msgid "Show collection contents"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:48
-#: spyderlib/widgets/dicteditor.py:594
-msgid "Show arrays min/max"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:50
-#: spyderlib/widgets/dicteditor.py:1250
-msgid "Edit data in the remote process"
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:51
-#: spyderlib/widgets/dicteditor.py:1251
-msgid ""
-"Editors are opened in the remote process for NumPy arrays, PIL images, lists, tuples and dictionaries.\n"
-"This avoids transfering large amount of data between the remote process and Spyder (through the socket)."
-msgstr ""
-
-#: spyderlib/plugins/variableexplorer.py:162
-msgid "Variable explorer"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:34
-msgid "The <b>global working directory</b> is the working directory for newly opened <i>consoles</i> (Python/IPython interpreters and terminals), for the <i>file explorer</i>, for the <i>find in files</i> plugin and for new files created in the <i>editor</i>."
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:43
-msgid "At startup, the global working directory is:"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:47
-msgid "the same as in last session"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:49
-msgid "At startup, Spyder will restore the global directory from last session"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:55
-msgid "At startup, the global working directory will be the specified path"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:69
-msgid "Files are opened from:"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:73
-#: spyderlib/plugins/workingdirectory.py:86
-msgid "the current file directory"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:77
-#: spyderlib/plugins/workingdirectory.py:90
-msgid "the global working directory"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:82
-msgid "Files are created in:"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:96
-msgid "Change to file base directory"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:98
-msgid "When opening a file"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:100
-msgid "When saving a file"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:167
-msgid "Back"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:175 spyderlib/widgets/explorer.py:972
-#: spyderlib/widgets/importwizard.py:486
-msgid "Next"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:188
-msgid ""
-"This is the working directory for newly\n"
-"opened consoles (Python interpreters and\n"
-"terminals), for the file explorer, for the\n"
-"find in files plugin and for new files\n"
-"created in the editor"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:214
-msgid "Browse a working directory"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:220
-msgid "Set as current console's working directory"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:228
-msgid "Change to parent directory"
-msgstr ""
-
-#: spyderlib/plugins/workingdirectory.py:235
-msgid "Global working directory"
-msgstr ""
-
-#: spyderlib/spyder.py:38
-msgid "IPython Console integration"
-msgstr ""
-
-#: spyderlib/spyder.py:245
-msgid "PyQt4 Reference Guide"
-msgstr ""
-
-#: spyderlib/spyder.py:248
-msgid "PyQt4 API Reference"
-msgstr ""
-
-#: spyderlib/spyder.py:250
-msgid "Python(x,y)"
-msgstr ""
-
-#: spyderlib/spyder.py:252
-msgid "WinPython"
-msgstr ""
-
-#: spyderlib/spyder.py:254
-msgid "Numpy and Scipy documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:257 spyderlib/spyder.py:915
-msgid "Matplotlib documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:291
-msgid "Reload last session"
-msgstr ""
-
-#: spyderlib/spyder.py:295
-msgid "Load session..."
-msgstr ""
-
-#: spyderlib/spyder.py:298
-msgid "Load Spyder session"
-msgstr ""
-
-#: spyderlib/spyder.py:300
-msgid "Save session and quit..."
-msgstr ""
-
-#: spyderlib/spyder.py:303
-msgid "Save current session and quit application"
-msgstr ""
-
-#: spyderlib/spyder.py:412
-msgid "Initializing..."
-msgstr ""
-
-#: spyderlib/spyder.py:473
-msgid "Close current dockwidget"
-msgstr ""
-
-#: spyderlib/spyder.py:479
-msgid "&Find text"
-msgstr ""
-
-#: spyderlib/spyder.py:485
-msgid "Find &next"
-msgstr ""
-
-#: spyderlib/spyder.py:491
-msgid "Find &previous"
-msgstr ""
-
-#: spyderlib/spyder.py:496
-msgid "&Replace text"
-msgstr ""
-
-#: spyderlib/spyder.py:511 spyderlib/widgets/sourcecode/codeeditor.py:2192
-msgid "Undo"
-msgstr ""
-
-#: spyderlib/spyder.py:513 spyderlib/widgets/sourcecode/codeeditor.py:2195
-msgid "Redo"
-msgstr ""
-
-#: spyderlib/spyder.py:514 spyderlib/widgets/arrayeditor.py:325
-#: spyderlib/widgets/dicteditor.py:562 spyderlib/widgets/shell.py:118
-#: spyderlib/widgets/sourcecode/codeeditor.py:2201
-msgid "Copy"
-msgstr ""
-
-#: spyderlib/spyder.py:516 spyderlib/widgets/shell.py:114
-#: spyderlib/widgets/sourcecode/codeeditor.py:2198
-msgid "Cut"
-msgstr ""
-
-#: spyderlib/spyder.py:517 spyderlib/widgets/dicteditor.py:559
-#: spyderlib/widgets/shell.py:122
-#: spyderlib/widgets/sourcecode/codeeditor.py:2204
-msgid "Paste"
-msgstr ""
-
-#: spyderlib/spyder.py:519 spyderlib/widgets/explorer.py:452
-#: spyderlib/widgets/projectexplorer.py:1000 spyderlib/widgets/shell.py:131
-#: spyderlib/widgets/sourcecode/codeeditor.py:2207
-msgid "Delete"
-msgstr ""
-
-#: spyderlib/spyder.py:522 spyderlib/widgets/shell.py:135
-#: spyderlib/widgets/sourcecode/codeeditor.py:2211
-msgid "Select All"
-msgstr ""
-
-#: spyderlib/spyder.py:570
-msgid "&Interpreters"
-msgstr ""
-
-#: spyderlib/spyder.py:576
-msgid "&View"
-msgstr ""
-
-#: spyderlib/spyder.py:584
-msgid "Welcome to Spyder!"
-msgstr ""
-
-#: spyderlib/spyder.py:588
-msgid "Pre&ferences"
-msgstr ""
-
-#: spyderlib/spyder.py:596 spyderlib/widgets/pathmanager.py:44
-#: spyderlib/widgets/projectexplorer.py:593
-msgid "PYTHONPATH manager"
-msgstr ""
-
-#: spyderlib/spyder.py:599
-msgid "Python Path Manager"
-msgstr ""
-
-#: spyderlib/spyder.py:602
-msgid "Update module names list"
-msgstr ""
-
-#: spyderlib/spyder.py:605
-msgid "Refresh list of module names available in PYTHONPATH"
-msgstr ""
-
-#: spyderlib/spyder.py:611
-msgid "Current user environment variables..."
-msgstr ""
-
-#: spyderlib/spyder.py:613
-msgid "Show and edit current user environment variables in Windows registry (i.e. for all sessions)"
-msgstr ""
-
-#: spyderlib/spyder.py:620 spyderlib/spyder.py:990
-msgid "External Tools"
-msgstr ""
-
-#: spyderlib/spyder.py:624
-msgid "Python(x,y) launcher"
-msgstr ""
-
-#: spyderlib/spyder.py:635
-msgid "WinPython control panel"
-msgstr ""
-
-#: spyderlib/spyder.py:648
-msgid "Qt Designer"
-msgstr ""
-
-#: spyderlib/spyder.py:653
-msgid "Qt Linguist"
-msgstr ""
-
-#: spyderlib/spyder.py:659
-msgid "Qt examples"
-msgstr ""
-
-#: spyderlib/spyder.py:675
-msgid "guidata examples"
-msgstr ""
-
-#: spyderlib/spyder.py:683
-msgid "guiqwt examples"
-msgstr ""
-
-#: spyderlib/spyder.py:688
-msgid "Sift"
-msgstr ""
-
-#: spyderlib/spyder.py:696
-msgid "ViTables"
-msgstr ""
-
-#: spyderlib/spyder.py:710
-msgid "Fullscreen mode"
-msgstr ""
-
-#: spyderlib/spyder.py:722
-msgid "Main toolbar"
-msgstr ""
-
-#: spyderlib/spyder.py:739
-msgid "Loading object inspector..."
-msgstr ""
-
-#: spyderlib/spyder.py:745
-msgid "Loading outline explorer..."
-msgstr ""
-
-#: spyderlib/spyder.py:752
-msgid "Loading editor..."
-msgstr ""
-
-#: spyderlib/spyder.py:774
-msgid "Loading file explorer..."
-msgstr ""
-
-#: spyderlib/spyder.py:780
-msgid "Loading history plugin..."
-msgstr ""
-
-#: spyderlib/spyder.py:786
-msgid "Loading online help..."
-msgstr ""
-
-#: spyderlib/spyder.py:792
-msgid "Loading project explorer..."
-msgstr ""
-
-#: spyderlib/spyder.py:802
-msgid "Loading external console..."
-msgstr ""
-
-#: spyderlib/spyder.py:810
-msgid "Loading namespace browser..."
-msgstr ""
-
-#: spyderlib/spyder.py:817
-msgid "Loading IPython console..."
-msgstr ""
-
-#: spyderlib/spyder.py:827
-msgid "Setting up main window..."
-msgstr ""
-
-#: spyderlib/spyder.py:831
-msgid "About %s..."
-msgstr ""
-
-#: spyderlib/spyder.py:834
-msgid "Optional dependencies..."
-msgstr ""
-
-#: spyderlib/spyder.py:838
-msgid "Report issue..."
-msgstr ""
-
-#: spyderlib/spyder.py:859
-msgid "Spyder documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:865
-msgid "Python documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:871
-msgid "Qt Assistant"
-msgstr ""
-
-#: spyderlib/spyder.py:905
-msgid "Python(x,y) documentation folder"
-msgstr ""
-
-#: spyderlib/spyder.py:907
-msgid "IPython documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:909
-msgid "guidata documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:912
-msgid "guiqwt documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:918
-msgid "NumPy documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:920
-msgid "NumPy reference guide"
-msgstr ""
-
-#: spyderlib/spyder.py:922
-msgid "NumPy user guide"
-msgstr ""
-
-#: spyderlib/spyder.py:924
-msgid "SciPy documentation"
-msgstr ""
-
-#: spyderlib/spyder.py:931
-msgid "Web Resources"
-msgstr ""
-
-#: spyderlib/spyder.py:952
-msgid "Windows and toolbars"
-msgstr ""
-
-#: spyderlib/spyder.py:956
-msgid "Reset window layout"
-msgstr ""
-
-#: spyderlib/spyder.py:958
-msgid "Custom window layouts"
-msgstr ""
-
-#: spyderlib/spyder.py:964
-msgid "Switch to/from layout %d"
-msgstr ""
-
-#: spyderlib/spyder.py:970
-msgid "Set layout %d"
-msgstr ""
-
-#: spyderlib/spyder.py:980
-msgid "Attached console window (debugging)"
-msgstr ""
-
-#: spyderlib/spyder.py:1250
-msgid ""
-"Window layout will be reset to default settings: this affects window position, size and dockwidgets.\n"
-"Do you want to continue?"
-msgstr ""
-
-#: spyderlib/spyder.py:1268
-msgid "Quick switch layout #%d has not yet been defined."
-msgstr ""
-
-#: spyderlib/spyder.py:1459 spyderlib/spyder.py:1460
-msgid "Maximize current plugin"
-msgstr ""
-
-#: spyderlib/spyder.py:1463
-msgid "Restore current plugin"
-msgstr ""
-
-#: spyderlib/spyder.py:1464
-msgid "Restore plugin to its original size"
-msgstr ""
-
-#: spyderlib/spyder.py:1535
-msgid "(not installed)"
-msgstr ""
-
-#: spyderlib/spyder.py:1553
-msgid "About %s"
-msgstr ""
-
-#: spyderlib/spyder.py:1714
-msgid "Running an external system terminal is not supported on platform %s."
-msgstr ""
-
-#: spyderlib/spyder.py:1911
-msgid "Open session"
-msgstr ""
-
-#: spyderlib/spyder.py:1912 spyderlib/spyder.py:1923
-msgid "Spyder sessions"
-msgstr ""
-
-#: spyderlib/spyder.py:1922
-msgid "Save session"
-msgstr ""
-
-#: spyderlib/utils/codeanalysis.py:76
-msgid "Real-time code analysis on the Editor"
-msgstr ""
-
-#: spyderlib/utils/codeanalysis.py:80
-msgid "Real-time code style analysis on the Editor"
-msgstr ""
-
-#: spyderlib/utils/environ.py:96
-msgid "Module <b>pywin32 was not found</b>.<br>Please restart this Windows <i>session</i> (not the computer) for changes to take effect."
-msgstr ""
-
-#: spyderlib/utils/environ.py:109
-msgid "If you accept changes, this will modify the current user environment variables directly <b>in Windows registry</b>. Use it with precautions, at your own risks.<br><br>Note that for changes to take effect, you will need to restart the parent process of this application (simply restart Spyder if you have executed it from a Windows shortcut, otherwise restart any application from which you may have executed it, like <i>Python(x,y) Home</i> for example)"
-msgstr ""
-
-#: spyderlib/utils/inspector/sphinxify.py:197
-#: spyderlib/utils/inspector/sphinxify.py:207
-msgid "It was not possible to generate rich text help for this object.</br>Please see it in plain text."
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:329
-msgid "Supported files"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:340
-msgid "Spyder data files"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:342 spyderlib/widgets/dicteditor.py:923
-msgid "NumPy arrays"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:343
-msgid "Matlab files"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:344
-msgid "CSV text files"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:346
-msgid "JPEG images"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:347
-msgid "PNG images"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:348
-msgid "GIF images"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:349
-msgid "TIFF images"
-msgstr ""
-
-#: spyderlib/utils/iofuncs.py:368 spyderlib/utils/iofuncs.py:375
-msgid "<b>Unsupported file type '%s'</b>"
-msgstr ""
-
-#: spyderlib/utils/vcs.py:68
-msgid "For %s support, please install one of the<br/> following tools:<br/><br/>  %s"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:313 spyderlib/widgets/arrayeditor.py:486
-#: spyderlib/widgets/arrayeditor.py:572
-msgid "Array editor"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:314
-msgid ""
-"Resizing cells of a table of such size could take a long time.\n"
-"Do you want to continue anyway?"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:385 spyderlib/widgets/arrayeditor.py:418
-msgid "Format"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:390
-msgid "Resize"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:419
-msgid "Float formatting"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:426 spyderlib/widgets/explorer.py:548
-#: spyderlib/widgets/explorer.py:645
-#: spyderlib/widgets/externalshell/pythonshell.py:520
-#: spyderlib/widgets/externalshell/systemshell.py:91
-msgid "Error"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:427
-msgid "Format (%s) is incorrect"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:458
-msgid "Array is empty"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:461
-msgid "Arrays with more than 2 dimensions are not supported"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:465
-msgid "The 'xlabels' argument length do no match array column number"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:469
-msgid "The 'ylabels' argument length do no match array row number"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:476
-msgid "%s arrays"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:477
-msgid "%s are currently not supported"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:488
-msgid "read only"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:517
-msgid "Record array fields:"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:529
-msgid "Data"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:529
-msgid "Mask"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:529
-msgid "Masked data"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:536
-msgid "<u>Warning</u>: changes are applied separately"
-msgstr ""
-
-#: spyderlib/widgets/arrayeditor.py:537
-msgid "For performance reasons, changes applied to masked array won't be reflected in array's data (and vice-versa)."
-msgstr ""
-
-#: spyderlib/widgets/browser.py:29
-#: spyderlib/widgets/sourcecode/codeeditor.py:2227
-msgid "Zoom out"
-msgstr ""
-
-#: spyderlib/widgets/browser.py:32
-#: spyderlib/widgets/sourcecode/codeeditor.py:2224
-msgid "Zoom in"
-msgstr ""
-
-#: spyderlib/widgets/browser.py:125
-msgid "Home"
-msgstr ""
-
-#: spyderlib/widgets/browser.py:165
-msgid "Find text"
-msgstr ""
-
-#: spyderlib/widgets/browser.py:184
-msgid "Address:"
-msgstr ""
-
-#: spyderlib/widgets/browser.py:219
-msgid "Unable to load page"
-msgstr ""
-
-#: spyderlib/widgets/comboboxes.py:116
-msgid "Press enter to validate this entry"
-msgstr ""
-
-#: spyderlib/widgets/comboboxes.py:117
-msgid "This entry is incorrect"
-msgstr ""
-
-#: spyderlib/widgets/comboboxes.py:170
-msgid "Press enter to validate this path"
-msgstr ""
-
-#: spyderlib/widgets/comboboxes.py:171
-msgid ""
-"This path is incorrect.\n"
-"Enter a correct directory path,\n"
-"then press enter to validate"
-msgstr ""
-
-#: spyderlib/widgets/dependencies.py:60
-msgid " Required "
-msgstr ""
-
-#: spyderlib/widgets/dependencies.py:60
-msgid "Module"
-msgstr ""
-
-#: spyderlib/widgets/dependencies.py:61
-msgid " Installed "
-msgstr ""
-
-#: spyderlib/widgets/dependencies.py:61
-msgid "Provided features"
-msgstr ""
-
-#: spyderlib/widgets/dependencies.py:127
-msgid "Optional Dependencies"
-msgstr ""
-
-#: spyderlib/widgets/dependencies.py:134
-msgid "Spyder depends on several Python modules to provide additional functionality for its plugins. The table below shows the required and installed versions (if any) of all of them.<br><br>Although Spyder can work without any of these modules, it's strongly recommended that at least you try to install <b>%s</b> and <b>%s</b> to have a much better experience."
-msgstr ""
-
-#: spyderlib/widgets/dependencies.py:149
-msgid "Copy to clipboard"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:144
-msgid "Index"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:149
-msgid "Tuple"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:152
-msgid "List"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:155
-msgid "Dictionary"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:163
-msgid "Attribute"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:164
-msgid "elements"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:286
-msgid "Size"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:286
-msgid "Type"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:286
-msgid "Value"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:360 spyderlib/widgets/dicteditor.py:494
-msgid "Edit item"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:361
-msgid "<b>Unable to retrieve data.</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:495
-msgid "<b>Unable to assign data to item.</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:557
-msgid "Resize rows to contents"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:565 spyderlib/widgets/explorer.py:231
-msgid "Edit"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:568 spyderlib/widgets/dicteditor.py:894
-#: spyderlib/widgets/dicteditor.py:910
-msgid "Plot"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:572
-msgid "Histogram"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:576
-msgid "Show image"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:580 spyderlib/widgets/dicteditor.py:917
-msgid "Save array"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:584 spyderlib/widgets/dicteditor.py:858
-#: spyderlib/widgets/dicteditor.py:866
-msgid "Insert"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:587 spyderlib/widgets/dicteditor.py:811
-msgid "Remove"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:610 spyderlib/widgets/dicteditor.py:828
-#: spyderlib/widgets/explorer.py:494 spyderlib/widgets/explorer.py:502
-#: spyderlib/widgets/explorer.py:514
-msgid "Rename"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:613
-msgid "Duplicate"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:809
-msgid "Do you want to remove selected item?"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:810
-msgid "Do you want to remove all selected items?"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:828 spyderlib/widgets/dicteditor.py:858
-msgid "Key:"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:866
-msgid "Value:"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:882
-msgid "Import error"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:883
-msgid "Please install <b>matplotlib</b> or <b>guiqwt</b>."
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:895
-msgid "<b>Unable to plot data.</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:911
-msgid "<b>Unable to show image.</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:933
-msgid "<b>Unable to save array</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:950
-msgid "Clipboard contents"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:964
-msgid "Import from clipboard"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:966
-msgid "Empty clipboard"
-msgstr ""
-
-#: spyderlib/widgets/dicteditor.py:967
-msgid "Nothing to be imported from clipboard."
-msgstr ""
-
-#: spyderlib/widgets/editor.py:66 spyderlib/widgets/editor.py:549
-msgid "File list management"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:70
-msgid "Filter:"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:75
-msgid "(press <b>Enter</b> to edit file)"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:90
-msgid "&Edit file"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:99
-msgid "&Close file"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:107
-msgid "Hint: press <b>Alt</b> to show accelerators"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:552
-msgid "Copy path to clipboard"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1090
-msgid "Temporary file"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1187
-msgid "New window"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1188
-msgid "Create a new editor window"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1191
-msgid "Split vertically"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1193
-msgid "Split vertically this editor window"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1195
-msgid "Split horizontally"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1197
-msgid "Split horizontally this editor window"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1199
-msgid "Close this panel"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1331
-msgid "<b>%s</b> has been modified.<br>Do you want to save changes?"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1394
-msgid "Save"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1395
-msgid "<b>Unable to save script '%s'</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1417
-msgid "Save Python script"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1638
-msgid "<b>%s</b> is unavailable (this file may have been removed, moved or renamed outside Spyder).<br>Do you want to close it?"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1658
-msgid "<b>%s</b> has been modified outside Spyder.<br>Do you want to reload it and lose all your changes?"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1754
-msgid "All changes to <b>%s</b> will be lost.<br>Do you want to revert file from disk?"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1893
-msgid "Loading %s..."
-msgstr ""
-
-#: spyderlib/widgets/editor.py:1903
-msgid "<b>%s</b> contains mixed end-of-line characters.<br>Spyder will fix this automatically."
-msgstr ""
-
-#: spyderlib/widgets/editor.py:2251
-msgid "Close window"
-msgstr ""
-
-#: spyderlib/widgets/editor.py:2253
-msgid "Close this window"
-msgstr ""
-
-#: spyderlib/widgets/editortools.py:89
-msgid "Line %s"
-msgstr ""
-
-#: spyderlib/widgets/editortools.py:94
-msgid "Class defined at line %s"
-msgstr ""
-
-#: spyderlib/widgets/editortools.py:102
-msgid "Method defined at line %s"
-msgstr ""
-
-#: spyderlib/widgets/editortools.py:112
-msgid "Function defined at line %s"
-msgstr ""
-
-#: spyderlib/widgets/editortools.py:167 spyderlib/widgets/editortools.py:495
-msgid "Go to cursor position"
-msgstr ""
-
-#: spyderlib/widgets/editortools.py:170
-msgid "Show absolute path"
-msgstr ""
-
-#: spyderlib/widgets/editortools.py:173 spyderlib/widgets/explorer.py:173
-msgid "Show all files"
-msgstr ""
-
-#: spyderlib/widgets/editortools.py:176
-msgid "Show special comments"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:169
-msgid "Edit filename filters..."
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:182
-msgid "Edit filename filters"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:183
-msgid "Name filters:"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:201
-msgid "File..."
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:204
-msgid "Module..."
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:207
-msgid "Folder..."
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:211
-msgid "Package..."
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:233
-msgid "Move..."
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:236
-msgid "Delete..."
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:239
-msgid "Rename..."
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:242
-msgid "Open"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:261
-msgid "Commit"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:265
-msgid "Browse repository"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:277
-msgid "Open command prompt here"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:279
-msgid "Open terminal here"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:284
-msgid "Open Python interpreter here"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:298
-msgid "New"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:306
-msgid "Import"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:453
-msgid "Do you really want to delete <b>%s</b>?"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:473
-msgid "delete"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:474 spyderlib/widgets/projectexplorer.py:813
-#: spyderlib/widgets/projectexplorer.py:820
-#: spyderlib/widgets/projectexplorer.py:1086
-#: spyderlib/widgets/projectexplorer.py:1169
-msgid "Project Explorer"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:475 spyderlib/widgets/projectexplorer.py:761
-#: spyderlib/widgets/projectexplorer.py:1170
-msgid "<b>Unable to %s <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:495
-msgid "New name:"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:503
-msgid "Do you really want to rename <b>%s</b> and overwrite the existing file <b>%s</b>?"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:515
-msgid "<b>Unable to rename file <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:549
-msgid "<b>Unable to move <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:567
-msgid "<b>Unable to create folder <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:579 spyderlib/widgets/explorer.py:612
-msgid "<b>Unable to create file <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:586
-msgid "New folder"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:587
-msgid "Folder name:"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:592
-msgid "New package"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:593
-msgid "Package name:"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:632
-msgid "New module"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:646
-msgid "<b>Unable to find external program.</b><br><br>%s"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:846
-msgid "Show current directory only"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:953
-msgid "Show toolbar"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:964 spyderlib/widgets/importwizard.py:481
-msgid "Previous"
-msgstr ""
-
-#: spyderlib/widgets/explorer.py:980
-msgid "Parent"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/baseshell.py:139
-msgid "Run again this program"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/baseshell.py:142
-msgid "Kill"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/baseshell.py:144
-msgid "Kills the current process, causing it to exit immediately"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/baseshell.py:212
-msgid "<span style='color: #44AA44'><b>Running...</b></span>"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/baseshell.py:219
-msgid "Terminated."
-msgstr ""
-
-#: spyderlib/widgets/externalshell/baseshell.py:234
-#: spyderlib/widgets/mixins.py:509
-msgid "Arguments"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/baseshell.py:235
-msgid "Command line arguments:"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:175
-msgid "Refresh"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:179
-msgid "Refresh periodically"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:183
-#: spyderlib/widgets/externalshell/namespacebrowser.py:421
-msgid "Import data"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:186
-#: spyderlib/widgets/externalshell/namespacebrowser.py:511
-#: spyderlib/widgets/externalshell/namespacebrowser.py:532
-msgid "Save data"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:191
-msgid "Save data as..."
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:199
-msgid "Exclude references which name starts with an underscore"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:207
-msgid "Exclude references which name is uppercase"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:214
-msgid "Exclude references which name starts with an uppercase character"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:222
-msgid "Exclude references to unsupported data types (i.e. which won't be handled/saved correctly)"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:338
-msgid "Object <b>%s</b> is not picklable"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:443
-msgid "<b>Unsupported file extension '%s'</b><br><br>Would you like to import it anyway (by selecting a known file format)?"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:451
-msgid "Open file as:"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:499
-msgid "<b>Unable to load '%s'</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/namespacebrowser.py:533
-msgid "<b>Unable to save current workspace</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:268
-msgid "Variables"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:269
-msgid "Show/hide global variables explorer"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:273
-msgid "Terminate"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:274
-msgid ""
-"Attempts to terminate the process.\n"
-"The process may not exit as a result of clicking this button\n"
-"(it is given the chance to prompt the user for any unsaved files, etc)."
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:286
-msgid "Interact"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:288
-msgid "Debug"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:290
-#: spyderlib/widgets/externalshell/pythonshell.py:353
-msgid "Arguments..."
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:297
-msgid "Set current working directory"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:299
-msgid "Environment variables"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:303
-msgid "Show sys.path contents"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:349
-msgid "Arguments: %s"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:351
-msgid "No argument"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/pythonshell.py:521
-msgid "A Python or IPython Console failed to start!"
-msgstr ""
-
-#: spyderlib/widgets/externalshell/systemshell.py:92
-msgid "Process failed to start"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:154
-msgid "Unexpected error: see internal console"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:206 spyderlib/widgets/findinfiles.py:230
-#: spyderlib/widgets/findinfiles.py:276
-msgid "invalid regular expression"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:274
-msgid "permission denied errors were encountered"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:308
-msgid "Search pattern"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:311 spyderlib/widgets/findinfiles.py:345
-#: spyderlib/widgets/findinfiles.py:357 spyderlib/widgets/findreplace.py:81
-msgid "Regular expression"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:320
-msgid "Search"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:323
-msgid "Start search"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:326
-msgid "Stop"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:329
-msgid "Stop search"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:339
-msgid "Included filenames pattern"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:348
-msgid "Include:"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:351
-msgid "Excluded filenames pattern"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:360
-msgid "Exclude:"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:370
-msgid "PYTHONPATH"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:372
-msgid "Search in all directories listed in sys.path which are outside the Python installation directory"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:375
-msgid "Hg repository"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:378
-msgid "Search in current directory hg repository"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:379
-msgid "Here:"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:383
-msgid "Search recursively in this directory"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:391
-msgid "Browse a search directory"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:424
-msgid "Hide advanced options"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:427
-msgid "Show advanced options"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:569
-msgid "Search canceled"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:573
-msgid "String not found"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:575
-msgid "matches in"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:576
-msgid "file"
-msgstr ""
-
-#: spyderlib/widgets/findinfiles.py:584
-msgid "interrupted"
-msgstr ""
-
-#: spyderlib/widgets/findreplace.py:61
-msgid "Search string"
-msgstr ""
-
-#: spyderlib/widgets/findreplace.py:88
-msgid "Case Sensitive"
-msgstr ""
-
-#: spyderlib/widgets/findreplace.py:95
-msgid "Whole words"
-msgstr ""
-
-#: spyderlib/widgets/findreplace.py:102
-msgid "Highlight matches"
-msgstr ""
-
-#: spyderlib/widgets/findreplace.py:117
-msgid "Replace with:"
-msgstr ""
-
-#: spyderlib/widgets/findreplace.py:119
-msgid "Replace string"
-msgstr ""
-
-#: spyderlib/widgets/findreplace.py:122
-msgid "Replace/find"
-msgstr ""
-
-#: spyderlib/widgets/findreplace.py:131
-msgid "Replace all"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:101
-msgid "Import as"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:103
-msgid "data"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:107
-msgid "code"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:110 spyderlib/widgets/importwizard.py:456
-msgid "text"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:122
-msgid "Column separator:"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:126
-msgid "Tab"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:129 spyderlib/widgets/importwizard.py:147
-msgid "other"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:140
-msgid "Row separator:"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:144
-msgid "EOL"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:160
-msgid "Additionnal options"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:164
-msgid "Skip rows:"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:175
-msgid "Comments:"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:181
-msgid "Transpose"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:403
-msgid "Import as array"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:439 spyderlib/widgets/importwizard.py:530
-msgid "Import wizard"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:444
-msgid "Raw text"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:447
-msgid "variable_name"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:458
-msgid "table"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:459
-msgid "Preview"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:475
-msgid "Cancel"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:490
-msgid "Done"
-msgstr ""
-
-#: spyderlib/widgets/importwizard.py:531
-msgid "<b>Unable to proceed to next step</b><br><br>Please check your entries.<br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:246
-msgid "Help..."
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:262
-msgid "Shell special commands:"
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:263
-msgid "Internal editor:"
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:264
-msgid "External editor:"
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:265
-msgid "Run script:"
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:266
-msgid "Remove references:"
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:267
-msgid "System commands:"
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:268
-msgid "Python help:"
-msgstr ""
-
-#: spyderlib/widgets/internalshell.py:269
-msgid "GUI-based editor:"
-msgstr ""
-
-#: spyderlib/widgets/mixins.py:514
-msgid "Documentation"
-msgstr ""
-
-#: spyderlib/widgets/onecolumntree.py:63
-msgid "Collapse all"
-msgstr ""
-
-#: spyderlib/widgets/onecolumntree.py:67
-msgid "Expand all"
-msgstr ""
-
-#: spyderlib/widgets/onecolumntree.py:71
-msgid "Restore"
-msgstr ""
-
-#: spyderlib/widgets/onecolumntree.py:72
-msgid "Restore original tree layout"
-msgstr ""
-
-#: spyderlib/widgets/onecolumntree.py:76
-msgid "Collapse selection"
-msgstr ""
-
-#: spyderlib/widgets/onecolumntree.py:80
-msgid "Expand selection"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:83
-msgid "Move to top"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:89
-msgid "Move up"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:95
-msgid "Move down"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:101
-msgid "Move to bottom"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:112 spyderlib/widgets/pathmanager.py:224
-msgid "Add path"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:117 spyderlib/widgets/pathmanager.py:208
-msgid "Remove path"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:127
-msgid "Synchronize..."
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:129
-msgid "Synchronize Spyder's path list with PYTHONPATH environment variable"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:140
-msgid "Synchronize"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:141
-msgid "This will synchronize Spyder's path list with <b>PYTHONPATH</b> environment variable for current user, allowing you to run your Python modules outside Spyder without having to configure sys.path. <br>Do you want to clear contents of PYTHONPATH before adding Spyder's path list?"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:209
-msgid "Do you really want to remove selected path?"
-msgstr ""
-
-#: spyderlib/widgets/pathmanager.py:225
-msgid "This directory is already included in Spyder path list.<br>Do you want to move it to the top of the list?"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:332
-msgid "its own configuration file"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:338
-msgid "the following projects:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:540
-msgid "Project..."
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:553
-msgid "Existing directory"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:557
-msgid "Existing Spyder project"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:561
-msgid "Existing Pydev project"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:578
-msgid "Open project"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:583
-msgid "Close project"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:588
-msgid "Close unrelated projects"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:597
-msgid "Edit related projects"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:605
-msgid "Add to PYTHONPATH"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:610
-msgid "Remove from PYTHONPATH"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:615
-msgid "Properties"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:650
-msgid "Show horizontal scrollbar"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:683
-msgid "Workspace"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:684
-msgid "The workspace was unable to load or save %s<br><br>Please check if you have the permission to write the associated configuration files."
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:743
-msgid "Import directory"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:745
-msgid "The following directory is not in workspace:<br><b>%s</b><br><br>Do you want to continue (and copy the directory to workspace)?"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:763
-#: spyderlib/widgets/projectexplorer.py:1166
-msgid "copy"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:814
-msgid "The project <b>%s</b> is already opened!"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:821
-msgid "The project root path directory is inside the workspace but not as the expected tree level. It is not a directory of the workspace:<br><b>%s</b>"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:832
-msgid "Project name:"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:841
-msgid "A project named <b>%s</b> already exists"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:846
-msgid "Invalid project name.<br><br>Name must match the following regular expression:<br><b>%s</b>"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:853
-msgid "The following directory is not empty:<br><b>%s</b><br><br>Do you want to continue?"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:865
-msgid "New project"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:873
-msgid ""
-"The current workspace has not been configured yet.\n"
-"Do you want to do this now?"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:910
-msgid "Import existing project"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:923
-msgid "Select projects to import"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:935
-msgid "The folder <i>%s</i> does not contain a valid %s project"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:963
-msgid "Import existing Pydev project"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:964
-msgid "<b>Unable to read Pydev project <i>%s</i></b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1001
-msgid "Do you really want to delete project <b>%s</b>?<br><br>Note: project files won't be deleted from disk."
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1054
-msgid "Related projects"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1062
-msgid "Select projects which are related to <b>%s</b>"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1087
-msgid "Statistics on source files only:<br>(Python, C/C++, Fortran)<br><br><b>%s</b> files.<br><b>%s</b> lines of code."
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1134
-msgid "File <b>%s</b> already exists.<br>Do you want to overwrite it?"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1148
-msgid "Folder <b>%s</b> already exists."
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1168
-msgid "move"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1177
-msgid "Select an existing workspace directory, or create a new one"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1178
-msgid "<u><b>What is the workspace?</b></u><br><br>A <b>Spyder workspace</b> is a directory on your filesystem that contains Spyder projects and <b>.spyderworkspace</b> configuration file.<br><br>A <b>Spyder project</b> is a directory with source code (and other related files) and a configuration file (named <b>.spyderproject</b>) with project settings (PYTHONPATH, linked projects, ...).<br>"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1205
-msgid "This is the current workspace directory"
-msgstr ""
-
-#: spyderlib/widgets/projectexplorer.py:1236
-msgid "The following directory is not a Spyder workspace:<br>%s<br><br>Do you want to create a new workspace in this directory?"
-msgstr ""
-
-#: spyderlib/widgets/pydocgui.py:86
-msgid "Module or package:"
-msgstr ""
-
-#: spyderlib/widgets/shell.py:126
-msgid "Save history log..."
-msgstr ""
-
-#: spyderlib/widgets/shell.py:128
-msgid "Save current history log (i.e. all inputs and outputs) in a text file"
-msgstr ""
-
-#: spyderlib/widgets/shell.py:248
-msgid "Save history log"
-msgstr ""
-
-#: spyderlib/widgets/shell.py:251
-msgid "History logs"
-msgstr ""
-
-#: spyderlib/widgets/shell.py:261
-msgid "<b>Unable to save file '%s'</b><br><br>Error message:<br>%s"
-msgstr ""
-
-#: spyderlib/widgets/shell.py:681
-msgid "Copy without prompts"
-msgstr ""
-
-#: spyderlib/widgets/shell.py:684 spyderlib/widgets/shell.py:687
-msgid "Clear line"
-msgstr ""
-
-#: spyderlib/widgets/shell.py:689
-msgid "Clear shell"
-msgstr ""
-
-#: spyderlib/widgets/shell.py:692
-msgid "Clear shell contents ('cls' command)"
-msgstr ""
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:68
-msgid "Editor's code completion, go-to-definition and help"
-msgstr ""
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:249
-msgid "Go to line:"
-msgstr ""
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:258
-msgid "Line count:"
-msgstr ""
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:1193
-msgid "Breakpoint"
-msgstr ""
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:1194
-msgid "Condition:"
-msgstr ""
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:1641
-msgid "To do"
-msgstr ""
-
-#: spyderlib/widgets/sourcecode/codeeditor.py:2219
-msgid "Go to definition"
-msgstr ""
-
-#: spyderlib/widgets/status.py:82
-msgid "Memory:"
-msgstr ""
-
-#: spyderlib/widgets/status.py:83
-msgid "Memory usage status: requires the `psutil` (>=v0.3) library on non-Windows platforms"
-msgstr ""
-
-#: spyderlib/widgets/status.py:95
-msgid "CPU:"
-msgstr ""
-
-#: spyderlib/widgets/status.py:96
-msgid "CPU usage status: requires the `psutil` (>=v0.3) library"
-msgstr ""
-
-#: spyderlib/widgets/status.py:118
-msgid "Permissions:"
-msgstr ""
-
-#: spyderlib/widgets/status.py:132
-msgid "End-of-lines:"
-msgstr ""
-
-#: spyderlib/widgets/status.py:146
-msgid "Encoding:"
-msgstr ""
-
-#: spyderlib/widgets/status.py:159
-msgid "Line:"
-msgstr ""
-
-#: spyderlib/widgets/status.py:163
-msgid "Column:"
-msgstr ""
-
-#: spyderlib/widgets/tabs.py:123
-msgid "Browse tabs"
-msgstr ""
-
-#: spyderlib/widgets/tabs.py:246
-msgid "Close current tab"
-msgstr ""
-
-#: spyderlib/widgets/texteditor.py:62
-msgid "Text editor"
-msgstr ""
-
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR ORGANIZATION
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2013-08-20 14:18+Paris, Madrid (heure d��t�)\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
+"Generated-By: pygettext.py 1.5\n"
+
+
+#: spyderlib\config.py:46
+msgid "Python files"
+msgstr ""
+
+#: spyderlib\config.py:47
+msgid "Cython/Pyrex files"
+msgstr ""
+
+#: spyderlib\config.py:48
+msgid "C files"
+msgstr ""
+
+#: spyderlib\config.py:49
+msgid "C++ files"
+msgstr ""
+
+#: spyderlib\config.py:50
+msgid "OpenCL files"
+msgstr ""
+
+#: spyderlib\config.py:51
+msgid "Fortran files"
+msgstr ""
+
+#: spyderlib\config.py:52
+msgid "IDL files"
+msgstr ""
+
+#: spyderlib\config.py:53
+msgid "MATLAB files"
+msgstr ""
+
+#: spyderlib\config.py:54
+msgid "Patch and diff files"
+msgstr ""
+
+#: spyderlib\config.py:55
+msgid "Batch files"
+msgstr ""
+
+#: spyderlib\config.py:56 spyderlib\utils\iofuncs.py:347
+msgid "Text files"
+msgstr ""
+
+#: spyderlib\config.py:57
+msgid "reStructured Text files"
+msgstr ""
+
+#: spyderlib\config.py:58
+msgid "gettext files"
+msgstr ""
+
+#: spyderlib\config.py:59
+msgid "NSIS files"
+msgstr ""
+
+#: spyderlib\config.py:60
+msgid "Web page files"
+msgstr ""
+
+#: spyderlib\config.py:61
+msgid "XML files"
+msgstr ""
+
+#: spyderlib\config.py:62
+msgid "Javascript files"
+msgstr ""
+
+#: spyderlib\config.py:63
+msgid "Enaml files"
+msgstr ""
+
+#: spyderlib\config.py:64
+msgid "Configuration files"
+msgstr ""
+
+#: spyderlib\config.py:71 spyderlib\widgets\explorer.py:621
+msgid "All files"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:147
+msgid "Preferences"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:428
+msgid "Invalid directory path"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:431 spyderlib\plugins\configdialog.py:447
+#: spyderlib\plugins\runconfig.py:169 spyderlib\plugins\runconfig.py:229
+#: spyderlib\plugins\workingdirectory.py:294 spyderlib\widgets\explorer.py:536
+#: spyderlib\widgets\externalshell\pythonshell.py:604
+#: spyderlib\widgets\findinfiles.py:504 spyderlib\widgets\pathmanager.py:218
+#: spyderlib\widgets\projectexplorer.py:889
+msgid "Select directory"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:459
+msgid "Invalid file path"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:462 spyderlib\plugins\configdialog.py:480
+msgid "Select file"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:479
+msgid "All files (*)"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:543 spyderlib\widgets\formlayout.py:213
+msgid "Bold"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:546 spyderlib\widgets\formlayout.py:208
+msgid "Italic"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:584
+msgid "Font: "
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:588
+msgid "Size: "
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:597 spyderlib\plugins\history.py:45
+msgid "Font style"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:650
+msgid "General"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:657 spyderlib\plugins\editor.py:95
+#: spyderlib\plugins\externalconsole.py:84
+#: spyderlib\plugins\ipythonconsole.py:71
+msgid "Interface"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:660
+msgid "Qt windows style"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:664
+msgid "Use a single instance"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:666
+msgid "Set this to open external<br> Python files in an already running instance (Requires a restart)"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:669
+msgid "Vertical dockwidget title bars"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:671
+msgid "Vertical dockwidget tabs"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:673
+msgid "Animated toolbars and dockwidgets"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:675
+msgid "Tear off menus"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:676
+msgid "Set this to detach any<br> menu from the main window"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:678
+msgid "Custom dockwidget margin:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:705
+msgid "Status bar"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:706
+msgid "Show memory usage every"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:717
+msgid "Show CPU usage every"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:734
+msgid "Debugging"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:735
+msgid "Pop up internal console when internal errors appear"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:758
+msgid "Syntax coloring"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:767
+msgid "Background:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:768
+#: spyderlib\widgets\sourcecode\codeeditor.py:280
+msgid "Current line:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:769
+msgid "Occurence:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:770
+msgid "Link:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:771
+msgid "Side areas:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:772
+msgid "Matched parentheses:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:773
+msgid "Unmatched parentheses:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:774
+msgid "Normal text:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:775
+msgid "Keyword:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:776
+msgid "Builtin:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:777
+msgid "Definition:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:778
+msgid "Comment:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:779
+msgid "String:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:780
+msgid "Number:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:781
+msgid "Instance:"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:787
+msgid "Color scheme"
+msgstr ""
+
+#: spyderlib\plugins\configdialog.py:809 spyderlib\plugins\shortcuts.py:344
+msgid "Reset to default values"
+msgstr ""
+
+#: spyderlib\plugins\console.py:105
+msgid "Internal console"
+msgstr ""
+
+#: spyderlib\plugins\console.py:125 spyderlib\plugins\ipythonconsole.py:510
+#: spyderlib\spyder.py:757
+msgid "&Quit"
+msgstr ""
+
+#: spyderlib\plugins\console.py:126 spyderlib\spyder.py:758
+msgid "Quit"
+msgstr ""
+
+#: spyderlib\plugins\console.py:129 spyderlib\plugins\externalconsole.py:1083
+msgid "&Run..."
+msgstr ""
+
+#: spyderlib\plugins\console.py:130 spyderlib\plugins\externalconsole.py:1084
+msgid "Run a Python script"
+msgstr ""
+
+#: spyderlib\plugins\console.py:133
+msgid "Environment variables..."
+msgstr ""
+
+#: spyderlib\plugins\console.py:135
+msgid "Show and edit environment variables (for current session)"
+msgstr ""
+
+#: spyderlib\plugins\console.py:139
+msgid "Show sys.path contents..."
+msgstr ""
+
+#: spyderlib\plugins\console.py:141
+msgid "Show (read-only) sys.path"
+msgstr ""
+
+#: spyderlib\plugins\console.py:144
+msgid "Buffer..."
+msgstr ""
+
+#: spyderlib\plugins\console.py:145 spyderlib\plugins\externalconsole.py:104
+#: spyderlib\plugins\history.py:38
+msgid "Set maximum line count"
+msgstr ""
+
+#: spyderlib\plugins\console.py:148 spyderlib\plugins\explorer.py:60
+#: spyderlib\plugins\history.py:153 spyderlib\plugins\inspector.py:296
+#: spyderlib\plugins\projectexplorer.py:58
+msgid "&Font..."
+msgstr ""
+
+#: spyderlib\plugins\console.py:149 spyderlib\plugins\history.py:154
+msgid "Set shell font style"
+msgstr ""
+
+#: spyderlib\plugins\console.py:152
+msgid "External editor path..."
+msgstr ""
+
+#: spyderlib\plugins\console.py:153
+msgid "Set external editor executable path"
+msgstr ""
+
+#: spyderlib\plugins\console.py:156 spyderlib\plugins\editor.py:133
+#: spyderlib\plugins\externalconsole.py:105 spyderlib\plugins\history.py:41
+#: spyderlib\plugins\history.py:156 spyderlib\plugins\inspector.py:96
+#: spyderlib\plugins\inspector.py:299
+msgid "Wrap lines"
+msgstr ""
+
+#: spyderlib\plugins\console.py:159 spyderlib\plugins\editor.py:163
+#: spyderlib\plugins\externalconsole.py:154
+msgid "Balloon tips"
+msgstr ""
+
+#: spyderlib\plugins\console.py:163 spyderlib\plugins\editor.py:155
+#: spyderlib\plugins\externalconsole.py:146
+msgid "Automatic code completion"
+msgstr ""
+
+#: spyderlib\plugins\console.py:167 spyderlib\plugins\editor.py:161
+#: spyderlib\plugins\externalconsole.py:152
+msgid "Enter key selects completion"
+msgstr ""
+
+#: spyderlib\plugins\console.py:172
+msgid "Internal console settings"
+msgstr ""
+
+#: spyderlib\plugins\console.py:223 spyderlib\plugins\externalconsole.py:1257
+msgid "Run Python script"
+msgstr ""
+
+#: spyderlib\plugins\console.py:224 spyderlib\plugins\externalconsole.py:268
+#: spyderlib\plugins\externalconsole.py:1258 spyderlib\widgets\explorer.py:635
+msgid "Python scripts"
+msgstr ""
+
+#: spyderlib\plugins\console.py:269 spyderlib\plugins\explorer.py:111
+#: spyderlib\plugins\history.py:271 spyderlib\plugins\inspector.py:559
+#: spyderlib\plugins\projectexplorer.py:120
+msgid "Select a new font"
+msgstr ""
+
+#: spyderlib\plugins\console.py:276
+msgid "Buffer"
+msgstr ""
+
+#: spyderlib\plugins\console.py:277
+msgid "Maximum line count"
+msgstr ""
+
+#: spyderlib\plugins\console.py:286
+msgid "External editor"
+msgstr ""
+
+#: spyderlib\plugins\console.py:287
+msgid "External editor executable path:"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:86 spyderlib\plugins\editor.py:512
+#: spyderlib\plugins\editor.py:1539 spyderlib\plugins\inspector.py:327
+#: spyderlib\widgets\editor.py:570
+#: spyderlib\widgets\sourcecode\codeeditor.py:270
+#: spyderlib\widgets\sourcecode\codeeditor.py:2564
+msgid "Editor"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:92
+msgid "Edit template for new modules"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:97
+msgid "Text and margin font style"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:100
+msgid "Sort files according to full path"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:102
+msgid "Show tab bar"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:109 spyderlib\plugins\editor.py:184
+#: spyderlib\plugins\externalconsole.py:100
+#: spyderlib\plugins\externalconsole.py:145 spyderlib\plugins\history.py:40
+#: spyderlib\plugins\inspector.py:95 spyderlib\plugins\ipythonconsole.py:106
+msgid "Source code"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:110
+msgid "Show line numbers"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:111
+msgid "Show vertical line after"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:112
+msgid "characters"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:120
+msgid "Highlight current line"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:122
+msgid "Highlight occurences after"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:136 spyderlib\plugins\history.py:49
+#: spyderlib\plugins\inspector.py:99
+msgid "Syntax color scheme: "
+msgstr ""
+
+#: spyderlib\plugins\editor.py:148 spyderlib\plugins\runconfig.py:304
+#: spyderlib\plugins\runconfig.py:426 spyderlib\plugins\runconfig.py:431
+#: spyderlib\spyder.py:1710 spyderlib\widgets\explorer.py:230
+#: spyderlib\widgets\externalshell\baseshell.py:138
+msgid "Run"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:149
+msgid "Save all files before running script"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:152 spyderlib\plugins\externalconsole.py:434
+msgid "Introspection"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:157 spyderlib\plugins\externalconsole.py:148
+msgid "Case sensitive code completion"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:159 spyderlib\plugins\externalconsole.py:150
+msgid "Show single completion"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:164
+msgid "Link to object definition"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:166
+msgid ""
+"If this option is enabled, clicking on an object\n"
+"name (left-click + Ctrl key) will go this object\n"
+"definition (if resolved)."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:170 spyderlib\plugins\externalconsole.py:156
+#: spyderlib\plugins\ipythonconsole.py:89
+msgid "Automatic notification to object inspector"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:172
+msgid ""
+"If this option is enabled, object inspector\n"
+"will automatically show informations on functions\n"
+"entered in editor (this is triggered when entering\n"
+"a left parenthesis after a valid function name)"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:177
+msgid "<b>Warning:</b><br>The Python module <i>rope</i> is not installed on this computer: calltips, code completion and go-to-definition features won't be available."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:185
+msgid "Automatic insertion of parentheses, braces and brackets"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:188
+msgid "Automatic insertion of closing quotes"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:190
+msgid "Automatic insertion of colons after 'for', 'if', 'def', etc"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:193
+msgid "Automatic indentation after 'else', 'elif', etc."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:195
+msgid "Indentation characters: "
+msgstr ""
+
+#: spyderlib\plugins\editor.py:196
+msgid "4 spaces"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:197
+msgid "2 spaces"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:198
+msgid "tab"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:199
+msgid "Tab stop width:"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:199
+msgid "pixels"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:201
+msgid "Tab always indent"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:203
+msgid ""
+"If enabled, pressing Tab will always indent,\n"
+"even when the cursor is not at the beginning\n"
+"of a line (when this option is enabled, code\n"
+"completion may be triggered using the alternate\n"
+"shortcut: Ctrl+Space)"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:208
+msgid "Intelligent backspace"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:210
+msgid "Automatically remove trailing spaces when saving files"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:214
+msgid "Analysis"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:216
+msgid "<u>Note</u>: add <b>analysis:ignore</b> in a comment to ignore code/style analysis warnings. For more informations on style guide for Python code, please refer to the %s page."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:225
+#: spyderlib\widgets\sourcecode\codeeditor.py:1613
+msgid "Code analysis"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:227
+msgid ""
+"If enabled, Python source code will be analyzed\n"
+"using pyflakes, lines containing errors or \n"
+"warnings will be highlighted"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:232
+msgid "Code analysis requires pyflakes %s+"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:234
+msgid "Style analysis"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:236
+msgid ""
+"If enabled, Python source code will be analyzed\n"
+"using pep8, lines that are not following PEP8\n"
+"style guide will be highlighted"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:243
+msgid "Tasks (TODO, FIXME, XXX, HINT, TIP)"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:246
+msgid "Perform analysis when saving file and every"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:250
+msgid "Perform analysis only when saving file"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:296
+msgid "End-of-line characters"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:297
+msgid "When opening a text file containing mixed end-of-line characters (this may raise syntax errors in Python interpreter on Windows platforms), Spyder may fix the file automatically."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:303
+msgid "Fix automatically and show warning message box"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:314 spyderlib\plugins\externalconsole.py:432
+#: spyderlib\plugins\ipythonconsole.py:358
+#: spyderlib\plugins\variableexplorer.py:41
+msgid "Display"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:316
+msgid "Code Introspection/Analysis"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:319 spyderlib\plugins\externalconsole.py:437
+msgid "Advanced settings"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:568 spyderlib\widgets\editortools.py:471
+msgid "Show/hide outline explorer"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:574
+msgid "Show/hide project explorer"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:582
+msgid "&New file..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:583
+msgid "Create a new Python script"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:587
+msgid "&Open..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:588
+msgid "Open text file"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:590
+msgid "&Revert"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:591
+msgid "Revert file from disk"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:595
+msgid "&Save"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:596
+msgid "Save current file"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:600
+msgid "Sav&e all"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:601
+msgid "Save all opened files"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:605
+msgid "Save &as..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:606
+msgid "Save current file as..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:608 spyderlib\plugins\editor.py:609
+msgid "Print preview..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:610
+msgid "&Print..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:611
+msgid "Print current file..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:615
+msgid "&Close"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:616
+msgid "Close current file"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:620
+msgid "C&lose all"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:621
+msgid "Close all opened files"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:627
+msgid "Set/Clear breakpoint"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:634
+msgid "Set/Edit conditional breakpoint"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:642
+msgid "Clear breakpoints in all files"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:644
+msgid "Breakpoints"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:650
+msgid "&Debug"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:651
+msgid "Debug file"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:655
+msgid "Step"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:656
+msgid "Run current line"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:660
+msgid "Continue"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:661
+msgid ""
+"Continue execution until\n"
+"next breakpoint"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:666
+msgid "Step Into"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:667
+msgid ""
+"Step into function, method\n"
+"or class of current line"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:672
+msgid "Step Return"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:673
+msgid ""
+"Run until current function\n"
+"or method returns"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:678
+msgid "Exit"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:679
+msgid "Exit Debug"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:688
+msgid "Debugging control"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:692 spyderlib\plugins\editor.py:1191
+#: spyderlib\spyder.py:561
+msgid "&Run"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:693
+msgid "Run file"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:698
+msgid "&Configure..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:699
+#: spyderlib\widgets\externalshell\pythonshell.py:290
+msgid "Run settings"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:705
+msgid "Re-run &last script"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:706
+msgid "Run again last file"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:711
+#: spyderlib\widgets\sourcecode\codeeditor.py:2249
+msgid "Run &selection"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:713
+msgid "Run selection"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:718
+msgid "Run cell"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:720
+msgid ""
+"Run current cell \n"
+"(see Editor documentation \n"
+"for more details on cells)"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:725
+msgid "Run cell and advance"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:728
+msgid ""
+"Run current cell and go to the next one\n"
+"(see Editor documentation \n"
+"for more details on cells)"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:735
+msgid "Show todo list"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:736
+msgid "Show TODO/FIXME/XXX/HINT/TIP comments list"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:744
+msgid "Show warning/error list"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:745
+msgid "Show code analysis warnings/errors"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:752
+msgid "Previous warning/error"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:753
+msgid "Go to previous code analysis warning/error"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:756
+msgid "Next warning/error"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:757
+msgid "Go to next code analysis warning/error"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:761
+msgid "Last edit location"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:762
+msgid "Go to last edit location"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:769
+msgid "Previous cursor position"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:770
+msgid "Go to previous cursor position"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:777
+msgid "Next cursor position"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:778
+msgid "Go to next cursor position"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:786
+#: spyderlib\widgets\sourcecode\codeeditor.py:2243
+msgid "Comment"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:786
+#: spyderlib\widgets\sourcecode\codeeditor.py:2243
+msgid "Uncomment"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:787
+msgid "Comment current line or selection"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:791
+msgid "Add &block comment"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:792
+msgid "Add block comment around current line or selection"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:798
+msgid "R&emove block comment"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:799
+msgid "Remove comment block around current line or selection"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:810
+msgid "Indent"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:811
+msgid "Indent current line or selection"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:814
+msgid "Unindent"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:815
+msgid "Unindent current line or selection"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:819
+msgid "Debug with winpdb"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:826
+msgid "Carriage return and line feed (Windows)"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:829
+msgid "Line feed (UNIX)"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:832
+msgid "Carriage return (Mac)"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:838
+msgid "Convert end-of-line characters"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:842
+msgid "Remove trailing spaces"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:844
+msgid "Fix indentation"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:845
+msgid "Replace tab characters by space characters"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:848
+msgid "Go to line..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:856
+msgid "Set console working directory"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:858
+msgid "Set current console (and file explorer) working directory to current script directory"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:863
+msgid "Maximum number of recent files..."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:866
+msgid "Clear recent files list"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:866
+msgid "Clear this list"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:868
+msgid "Open &recent"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1179 spyderlib\spyder.py:542
+msgid "File toolbar"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1180 spyderlib\spyder.py:552
+msgid "Search toolbar"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1181 spyderlib\spyder.py:557
+msgid "Source toolbar"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1182 spyderlib\spyder.py:562
+msgid "Run toolbar"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1183 spyderlib\spyder.py:566
+msgid "Debug toolbar"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1184 spyderlib\spyder.py:547
+msgid "Edit toolbar"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1187 spyderlib\spyder.py:539
+msgid "&File"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1188 spyderlib\spyder.py:546
+msgid "&Edit"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1189 spyderlib\spyder.py:551
+msgid "&Search"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1190 spyderlib\spyder.py:556
+msgid "Sour&ce"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1192 spyderlib\spyder.py:573
+msgid "&Tools"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1193
+msgid "?"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1408
+msgid "Spyder Editor"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1409
+msgid "This is a temporary script file."
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1469
+msgid "untitled"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1540
+msgid "Maximum number of recent files"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1580 spyderlib\plugins\workingdirectory.py:69
+msgid "Open file"
+msgstr ""
+
+#: spyderlib\plugins\editor.py:1662
+msgid "Printing..."
+msgstr ""
+
+#: spyderlib\plugins\explorer.py:48
+msgid "File explorer"
+msgstr ""
+
+#: spyderlib\plugins\explorer.py:61 spyderlib\plugins\inspector.py:297
+#: spyderlib\plugins\projectexplorer.py:59
+msgid "Set font style"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:45
+msgid "Interactive data plotting"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:70
+#: spyderlib\plugins\externalconsole.py:1050
+#: spyderlib\plugins\inspector.py:327 spyderlib\plugins\ipythonconsole.py:433
+#: spyderlib\plugins\ipythonconsole.py:1145
+#: spyderlib\widgets\externalshell\baseshell.py:106
+msgid "Console"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:88
+msgid "One tab per script"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:89
+#: spyderlib\widgets\externalshell\baseshell.py:171
+msgid "Show elapsed time"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:90 spyderlib\widgets\explorer.py:960
+msgid "Show icons and text"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:102
+msgid "Buffer: "
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:102
+#: spyderlib\plugins\ipythonconsole.py:108
+msgid " lines"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:107
+msgid "Merge process standard output/error channels"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:109
+msgid ""
+"Merging the output channels of the process means that\n"
+"the standard error won't be written in red anymore,\n"
+"but this has the effect of speeding up display."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:113
+msgid "Colorize standard error channel using ANSI escape codes"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:115
+msgid ""
+"This method is the only way to have colorized standard\n"
+"error channel when the output channels have been merged."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:133
+#: spyderlib\widgets\arrayeditor.py:395
+msgid "Background color"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:134
+msgid "This option will be applied the next time a Python console or a terminal is opened."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:137
+msgid "Light background (white color)"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:158
+#: spyderlib\plugins\ipythonconsole.py:91
+msgid ""
+"If this option is enabled, object inspector\n"
+"will automatically show informations on functions\n"
+"entered in console (this is triggered when entering\n"
+"a left parenthesis after a valid function name)"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:173
+msgid "User Module Deleter (UMD)"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:174
+msgid ""
+"UMD forces Python to reload modules which were imported when executing a \n"
+"script in the external console with the 'runfile' function."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:177
+msgid "Enable UMD"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:178
+msgid "This option will enable the User Module Deleter (UMD) in Python interpreters. UMD forces Python to reload deeply modules during import when running a Python script using the Spyder's builtin function <b>runfile</b>.<br><br><b>1.</b> UMD may require to restart the Python interpreter in which it will be called (otherwise only newly imported modules will be reloaded when executing scripts).<br><br><b>2.</b> If errors occur when re-running a PyQt-based program, please check that the Q [...]
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:194
+msgid "Show reloaded modules list"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:195
+msgid "Please note that these changes will be applied only to new Python interpreters"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:199
+msgid "Set UMD excluded (not reloaded) modules"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:211
+msgid "Python executable"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:213
+msgid "Select the Python interpreter executable binary in which Spyder will run scripts:"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:216
+msgid "Default (i.e. the same as Spyder's)"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:220
+msgid "Use the following Python interpreter:"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:224
+msgid "Executables"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:244
+#: spyderlib\plugins\ipythonconsole.py:362
+#: spyderlib\plugins\workingdirectory.py:42
+msgid "Startup"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:245
+msgid "Open a Python interpreter at startup"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:253
+msgid "PYTHONSTARTUP replacement"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:255
+msgid ""
+"This option will override the PYTHONSTARTUP environment variable which\n"
+"defines the script to be executed during the Python interpreter startup."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:260
+msgid "Default PYTHONSTARTUP script"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:264
+msgid "Use the following startup script:"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:283
+msgid "Monitor"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:284
+msgid "The monitor provides introspection features to console: code completion, calltips and variable explorer. Because it relies on several modules, disabling the monitor may be useful to accelerate console startup."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:291
+msgid "Enable monitor"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:303
+msgid "Default library"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:305
+msgid "Qt (PyQt/PySide)"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:307
+msgid "Qt-Python bindings library selection:"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:309
+msgid "This option will act on<br> libraries such as Matplotlib, guidata or ETS"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:323
+msgid "Install Spyder's input hook for Qt"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:325
+msgid "PyQt installs an input hook that allows<br> creating and interacting with Qt widgets in an interactive interpreter without blocking it. On Windows platforms, it is strongly recommended to replace it by Spyder's. Regarding PySide, note that it does not install an input hook, so it is required to enable this feature in order to be able to manipulate PySide/Qtobjects interactively."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:344
+msgid "PyQt"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:346
+msgid "API selection for QString and QVariant objects:"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:347
+msgid "API #1"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:347
+msgid "API #2"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:347
+msgid "Default API"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:349
+msgid "PyQt API #1 is the default API for<br>Python 2. PyQt API #2 is the default API for Python 3 and is compatible with PySide. Note that switching to API #2 may require to enable the Matplotlib patch."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:355
+msgid "Ignore API change errors (sip.setapi)"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:357
+msgid "Enabling this option will ignore <br>errors when changing PyQt API. As PyQt does not support dynamic API changes, it is strongly recommended to use this feature wisely, e.g. for debugging purpose."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:376
+msgid "Matplotlib"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:378
+msgid "GUI backend:"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:380
+msgid "Set the GUI toolkit used by <br>Matplotlib to show figures (default: Qt4Agg)"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:391
+msgid "Patch Matplotlib figures"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:393
+msgid "Patching Matplotlib library will add a button to customize figure options (Qt4Agg only) and fix some issues."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:413
+msgid "Enthought Tool Suite"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:414
+msgid "Enthought Tool Suite (ETS) supports PyQt4 (qt4) and wxPython (wx) graphical user interfaces."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:418
+msgid "ETS_TOOLKIT:"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:439
+msgid "External modules"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:643
+msgid "Trying to kill a kernel?"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:644
+msgid "You can't close this kernel because it has one or more consoles connected to it.<br><br>You need to close them instead or you can kill the kernel using the button far to the right."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:719
+#: spyderlib\plugins\ipythonconsole.py:729 spyderlib\spyder.py:1241
+#: spyderlib\spyder.py:1259 spyderlib\utils\environ.py:95
+#: spyderlib\utils\environ.py:108
+msgid "Warning"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:720
+msgid "No Python shell is currently selected to run <b>%s</b>.<br><br>Please select or open a new Python interpreter and try again."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:797
+msgid ""
+"%s is already running in a separate process.\n"
+"Do you want to kill the process before starting a new one?"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:931
+msgid "Kernel"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:951
+msgid "Command Window"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:953
+msgid "Terminal"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1072
+msgid "Open a Python &interpreter"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1075
+msgid "Open &command prompt"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1076
+msgid "Open a Windows command prompt"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1078
+msgid "Open &terminal"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1079
+msgid "Open a terminal window inside Spyder"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1200
+#: spyderlib\widgets\projectexplorer.py:334
+msgid " and "
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1205
+msgid "<br><u>Installed version</u>: %s"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1207
+#: spyderlib\plugins\ipythonconsole.py:60
+#: spyderlib\plugins\ipythonconsole.py:680
+msgid "IPython console"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1208
+msgid "Unable to open IPython console because no supported IPython version was found.<br><br><u>Supported IPython versions</u>: %s"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1229
+#: spyderlib\plugins\ipythonconsole.py:749
+msgid "Open an IPython console"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1230
+msgid "The console monitor was disabled: the IPython kernel will be started as expected, but an IPython console will have to be connected manually to the kernel."
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1266
+#: spyderlib\plugins\externalconsole.py:1279
+#: spyderlib\plugins\externalconsole.py:1283
+msgid "UMD"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1267
+msgid ""
+"UMD excluded modules:\n"
+"(example: guidata, guiqwt)"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1280
+msgid ""
+"The following modules are not installed on your machine:\n"
+"%s"
+msgstr ""
+
+#: spyderlib\plugins\externalconsole.py:1284
+msgid "Please note that these changes will be applied only to new Python/IPython interpreters"
+msgstr ""
+
+#: spyderlib\plugins\findinfiles.py:90 spyderlib\widgets\findinfiles.py:691
+msgid "Find in files"
+msgstr ""
+
+#: spyderlib\plugins\findinfiles.py:114
+msgid "&Find in files"
+msgstr ""
+
+#: spyderlib\plugins\findinfiles.py:117
+msgid "Search text in multiple files"
+msgstr ""
+
+#: spyderlib\plugins\history.py:34
+msgid "Settings"
+msgstr ""
+
+#: spyderlib\plugins\history.py:36
+msgid " entries"
+msgstr ""
+
+#: spyderlib\plugins\history.py:36
+msgid "History depth: "
+msgstr ""
+
+#: spyderlib\plugins\history.py:43
+msgid "Scroll automatically to last entry"
+msgstr ""
+
+#: spyderlib\plugins\history.py:102 spyderlib\plugins\inspector.py:380
+#: spyderlib\plugins\ipythonconsole.py:486 spyderlib\widgets\editor.py:657
+#: spyderlib\widgets\explorer.py:990
+#: spyderlib\widgets\externalshell\baseshell.py:151
+#: spyderlib\widgets\externalshell\namespacebrowser.py:221
+msgid "Options"
+msgstr ""
+
+#: spyderlib\plugins\history.py:122
+msgid "History log"
+msgstr ""
+
+#: spyderlib\plugins\history.py:149
+msgid "History..."
+msgstr ""
+
+#: spyderlib\plugins\history.py:151
+msgid "Set history maximum entries"
+msgstr ""
+
+#: spyderlib\plugins\history.py:261
+msgid "History"
+msgstr ""
+
+#: spyderlib\plugins\history.py:262
+msgid "Maximum entries"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:53
+msgid "Rich text help on the Object Inspector"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:108
+msgid "Plain text font style"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:111
+msgid "Rich text font style"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:113
+msgid "Additional features"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:114
+msgid "Render mathematical equations"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:120
+msgid "This feature requires Sphinx 1.1 or superior."
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:122
+msgid "Sphinx %s is currently installed."
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:281
+msgid "No documentation available"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:320
+msgid "Source"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:335 spyderlib\widgets\dicteditor.py:162
+msgid "Object"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:350
+msgid "Plain Text"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:354
+msgid "Show Source"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:358
+msgid "Rich Text"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:368
+msgid "Automatic import"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:423 spyderlib\plugins\inspector.py:804
+msgid "Object inspector"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:765
+msgid "Lock"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:765
+msgid "Unlock"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:805
+msgid "The following error occured when calling <b>Sphinx %s</b>. <br>Incompatible Sphinx version or doc string decoding failed.<br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\plugins\inspector.py:853
+msgid "No source code available."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:53
+msgid "Symbolic mathematics for the IPython Console"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:72
+msgid "Display initial banner"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:73
+msgid ""
+"This option lets you hide the message shown at\n"
+"the top of the console when it's opened."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:75
+msgid "Use a completion widget"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:77
+msgid "Use a widget instead of plain text output for tab completion"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:79
+msgid "Use a pager to display additional text inside the console"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:81
+msgid ""
+"Useful if you don't want to fill the console with long help or completion texts.\n"
+"Note: Use the Q key to get out of the pager."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:85
+msgid "Display balloon tips"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:86
+msgid "Ask for confirmation before closing"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:108
+msgid "Buffer:  "
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:110
+msgid ""
+"Set the maximum number of lines of text shown in the\n"
+"console before truncation. Specifying -1 disables it\n"
+"(not recommended!)"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:119
+msgid "Support for graphics (Pylab)"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:120
+msgid "Activate support"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:121
+msgid "Automatically load Pylab and NumPy"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:123
+msgid ""
+"This lets you load graphics support without importing \n"
+"the commands to do plots. Useful to work with other\n"
+"plotting libraries different to Matplotlib or to develop \n"
+"GUIs with Spyder."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:142
+msgid ""
+"This feature requires the Matplotlib library.\n"
+"It seems you don't have it installed."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:147
+msgid "Inline"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:148
+msgid "Automatic"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:149
+msgid "Graphics backend"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:150
+msgid "Decide how graphics are going to be displayed in the console. If unsure, please select <b>%s</b> to put graphics inside the console or <b>%s</b> to interact with them (through zooming and panning) in a separate window."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:170
+msgid "Backend:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:172
+msgid "This option will be applied the next time a console is opened."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:184
+msgid "Inline backend"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:185
+msgid "Decide how to render the figures created by this backend"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:189
+msgid "Format:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:192
+msgid "Resolution:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:192
+msgid "dpi"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:194
+msgid "Only used when the format is PNG. Default is 72"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:197
+msgid "Width:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:197
+#: spyderlib\plugins\ipythonconsole.py:201
+msgid "inches"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:199
+msgid "Default is 6"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:201
+msgid "Height:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:203
+msgid "Default is 4"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:218
+msgid "Run code"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:219
+msgid "You can run several lines of code when a console is started. Please introduce each one separated by commas, for example:<br><i>import os, import sys</i>"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:225
+msgid "Lines:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:234
+msgid "Run a file"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:235
+msgid "You can also run a whole file at startup instead of just some lines (This is similar to have a PYTHONSTARTUP file)."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:239
+msgid "Use the following file:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:253
+msgid "Spyder startup"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:254
+msgid "Open an IPython console at startup"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:262
+msgid "Greedy completion"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:263
+msgid "Enable <tt>Tab</tt> completion on elements of lists, results of function calls, etc, <i>without</i> assigning them to a variable.<br>For example, you can get completions on things like <tt>li[0].<Tab></tt> or <tt>ins.meth().<Tab></tt>"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:271
+msgid "Use the greedy completer"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:282
+msgid "Autocall"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:283
+msgid "Autocall makes IPython automatically call any callable object even if you didn't type explicit parentheses.<br>For example, if you type <i>str 43</i> it becomes <i>str(43)</i> automatically."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:290
+msgid "Smart"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:291
+msgid "Full"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:292
+msgid "Off"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:294
+msgid "Autocall:  "
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:295
+msgid "On <b>%s</b> mode, Autocall is not applied if there are no arguments after the callable. On <b>%s</b> mode, all callable objects are automatically called (even if no arguments are present)."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:307
+msgid "Symbolic Mathematics"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:308
+msgid "Perfom symbolic operations in the console (e.g. integrals, derivatives, vector calculus, etc) and get the outputs in a beautifully printed style."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:313
+msgid "Use symbolic math"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:314
+msgid "This option loads the Sympy library to work with.<br>Please refer to its documentation to learn how to use it."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:327
+msgid ""
+"This feature requires the Sympy library.\n"
+"It seems you don't have it installed."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:332
+msgid "Prompts"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:333
+msgid "Modify how Input and Output prompts are shown in the console."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:336
+msgid "Input prompt:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:338
+msgid "Default is<br>In [<span class=\"in-prompt-number\">%i</span>]:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:342
+msgid "Output prompt:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:344
+msgid "Default is<br>Out[<span class=\"out-prompt-number\">%i</span>]:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:360
+msgid "Graphics"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:364
+msgid "Advanced Settings"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:447
+msgid "Interrupt kernel"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:450
+msgid "Restart kernel"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:455
+msgid "Intro to IPython"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:457
+msgid "Quick Reference"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:459
+msgid "Console help"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:461
+#: spyderlib\widgets\internalshell.py:254
+msgid "Help"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:462
+msgid "IPython Help"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:498
+msgid "Inspect current object"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:502
+msgid "Clear line or block"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:506
+msgid "Clear console"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:545
+msgid "It seems the kernel died unexpectedly. Use 'Restart kernel' to continue using this console."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:557
+msgid "Kernel process is either remote or unspecified. Cannot interrupt"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:566
+msgid "Kernel process is either remote or unspecified. Cannot restart."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:730
+msgid "No IPython console is currently available to run <b>%s</b>.<br><br>Please open a new one and try again."
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:754
+msgid "Connect to an existing kernel"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:756
+msgid "Open a new IPython client connected to an external kernel"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:870
+msgid "(for example: `kernel-3764.json`, or simply `3764`)"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:872
+#: spyderlib\plugins\ipythonconsole.py:912
+msgid "IPython"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:873
+msgid "Provide an IPython kernel connection file:"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:913
+msgid "Unable to connect to IPython kernel <b>`%s`"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:1107
+msgid ""
+"%s will be closed.\n"
+"Do you want to kill the associated kernel and all of its clients?"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:1153
+msgid "Are you sure you want to restart the kernel?"
+msgstr ""
+
+#: spyderlib\plugins\ipythonconsole.py:1155
+msgid "Restart kernel?"
+msgstr ""
+
+#: spyderlib\plugins\onlinehelp.py:67
+msgid "Online help"
+msgstr ""
+
+#: spyderlib\plugins\outlineexplorer.py:47
+#: spyderlib\widgets\editortools.py:164
+msgid "Outline"
+msgstr ""
+
+#: spyderlib\plugins\projectexplorer.py:43
+#: spyderlib\widgets\projectexplorer.py:1136
+#: spyderlib\widgets\projectexplorer.py:1150
+msgid "Project explorer"
+msgstr ""
+
+#: spyderlib\plugins\projectexplorer.py:54
+#: spyderlib\widgets\projectexplorer.py:544
+msgid "New project..."
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:28
+msgid "Execute in current Python or IPython interpreter"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:29
+msgid "Execute in a new dedicated Python interpreter"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:30
+msgid "Execute in an external System terminal"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:40
+msgid "Always show %s on a first file run"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:150
+msgid "General settings"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:153 spyderlib\plugins\runconfig.py:194
+msgid "Command line options:"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:160
+msgid "Working directory:"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:175 spyderlib\plugins\runconfig.py:438
+msgid "Interpreter"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:186
+msgid "Dedicated Python interpreter"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:191
+msgid "Interact with the Python interpreter after execution"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:200
+msgid "<b>-u</b> is added to the other options you set here"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:211
+msgid "this dialog"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:267
+msgid "Run configuration"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:268
+msgid "The following working directory is not valid:<br><b>%s</b>"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:344
+msgid "Run settings for %s"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:375
+msgid "Select a run configuration:"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:405 spyderlib\plugins\runconfig.py:430
+msgid "Run Settings"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:432
+msgid "The following are the default <i>%s</i>. These options may be overriden using the <b>%s</b> dialog box (see the <b>%s</b> menu)"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:456
+#: spyderlib\widgets\externalshell\pythonshell.py:293
+msgid "Working directory"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:458
+msgid "Default working directory is:"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:460
+msgid "the script directory"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:463 spyderlib\plugins\workingdirectory.py:54
+msgid "the following directory:"
+msgstr ""
+
+#: spyderlib\plugins\runconfig.py:482
+msgid "Run Settings dialog"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:178
+msgid "Context"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:180 spyderlib\widgets\dicteditor.py:147
+#: spyderlib\widgets\importwizard.py:470
+msgid "Name"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:182
+msgid "Mod1"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:184
+msgid "Mod2"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:186
+msgid "Mod3"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:188 spyderlib\widgets\dicteditor.py:158
+msgid "Key"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:321
+msgid "Conflicts"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:322
+msgid "The following conflicts have been detected:"
+msgstr ""
+
+#: spyderlib\plugins\shortcuts.py:334
+msgid "Keyboard shortcuts"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:24
+msgid "Autorefresh"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:25
+msgid "Enable autorefresh"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:27
+msgid "Refresh interval: "
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:28
+msgid " ms"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:31
+msgid "Filter"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:33
+#: spyderlib\widgets\externalshell\namespacebrowser.py:191
+msgid "Exclude private references"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:34
+#: spyderlib\widgets\externalshell\namespacebrowser.py:206
+msgid "Exclude capitalized references"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:35
+#: spyderlib\widgets\externalshell\namespacebrowser.py:199
+msgid "Exclude all-uppercase references"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:36
+#: spyderlib\widgets\externalshell\namespacebrowser.py:214
+msgid "Exclude unsupported data types"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:43
+#: spyderlib\widgets\dicteditor.py:591
+msgid "Truncate values"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:44
+#: spyderlib\widgets\dicteditor.py:604
+msgid "Always edit in-place"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:45
+#: spyderlib\widgets\dicteditor.py:600
+msgid "Show collection contents"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:48
+#: spyderlib\widgets\dicteditor.py:595
+msgid "Show arrays min/max"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:50
+#: spyderlib\widgets\dicteditor.py:1251
+msgid "Edit data in the remote process"
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:51
+#: spyderlib\widgets\dicteditor.py:1252
+msgid ""
+"Editors are opened in the remote process for NumPy arrays, PIL images, lists, tuples and dictionaries.\n"
+"This avoids transfering large amount of data between the remote process and Spyder (through the socket)."
+msgstr ""
+
+#: spyderlib\plugins\variableexplorer.py:162
+msgid "Variable explorer"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:35
+msgid "The <b>global working directory</b> is the working directory for newly opened <i>consoles</i> (Python/IPython interpreters and terminals), for the <i>file explorer</i>, for the <i>find in files</i> plugin and for new files created in the <i>editor</i>."
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:44
+msgid "At startup, the global working directory is:"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:48
+msgid "the same as in last session"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:50
+msgid "At startup, Spyder will restore the global directory from last session"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:56
+msgid "At startup, the global working directory will be the specified path"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:70
+msgid "Files are opened from:"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:74
+#: spyderlib\plugins\workingdirectory.py:87
+msgid "the current file directory"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:78
+#: spyderlib\plugins\workingdirectory.py:91
+msgid "the global working directory"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:82 spyderlib\widgets\explorer.py:613
+#: spyderlib\widgets\explorer.py:620
+msgid "New file"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:83
+msgid "Files are created in:"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:97
+msgid "Change to file base directory"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:99
+msgid "When opening a file"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:101
+msgid "When saving a file"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:168
+msgid "Back"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:176 spyderlib\widgets\explorer.py:977
+#: spyderlib\widgets\importwizard.py:489
+msgid "Next"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:189
+msgid ""
+"This is the working directory for newly\n"
+"opened consoles (Python interpreters and\n"
+"terminals), for the file explorer, for the\n"
+"find in files plugin and for new files\n"
+"created in the editor"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:215
+msgid "Browse a working directory"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:221
+msgid "Set as current console's working directory"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:229
+msgid "Change to parent directory"
+msgstr ""
+
+#: spyderlib\plugins\workingdirectory.py:236
+msgid "Global working directory"
+msgstr ""
+
+#: spyderlib\spyder.py:38
+msgid "IPython Console integration"
+msgstr ""
+
+#: spyderlib\spyder.py:247
+msgid "PyQt4 Reference Guide"
+msgstr ""
+
+#: spyderlib\spyder.py:250
+msgid "PyQt4 API Reference"
+msgstr ""
+
+#: spyderlib\spyder.py:252
+msgid "Python(x,y)"
+msgstr ""
+
+#: spyderlib\spyder.py:254
+msgid "WinPython"
+msgstr ""
+
+#: spyderlib\spyder.py:256
+msgid "Numpy and Scipy documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:259 spyderlib\spyder.py:919
+msgid "Matplotlib documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:293
+msgid "Reload last session"
+msgstr ""
+
+#: spyderlib\spyder.py:297
+msgid "Load session..."
+msgstr ""
+
+#: spyderlib\spyder.py:300
+msgid "Load Spyder session"
+msgstr ""
+
+#: spyderlib\spyder.py:302
+msgid "Save session and quit..."
+msgstr ""
+
+#: spyderlib\spyder.py:305
+msgid "Save current session and quit application"
+msgstr ""
+
+#: spyderlib\spyder.py:412
+msgid "Initializing..."
+msgstr ""
+
+#: spyderlib\spyder.py:473
+msgid "Close current dockwidget"
+msgstr ""
+
+#: spyderlib\spyder.py:479
+msgid "&Find text"
+msgstr ""
+
+#: spyderlib\spyder.py:485
+msgid "Find &next"
+msgstr ""
+
+#: spyderlib\spyder.py:491
+msgid "Find &previous"
+msgstr ""
+
+#: spyderlib\spyder.py:496
+msgid "&Replace text"
+msgstr ""
+
+#: spyderlib\spyder.py:511 spyderlib\widgets\sourcecode\codeeditor.py:2219
+msgid "Undo"
+msgstr ""
+
+#: spyderlib\spyder.py:513 spyderlib\widgets\sourcecode\codeeditor.py:2222
+msgid "Redo"
+msgstr ""
+
+#: spyderlib\spyder.py:514 spyderlib\widgets\arrayeditor.py:327
+#: spyderlib\widgets\dicteditor.py:563 spyderlib\widgets\shell.py:121
+#: spyderlib\widgets\sourcecode\codeeditor.py:2228
+msgid "Copy"
+msgstr ""
+
+#: spyderlib\spyder.py:516 spyderlib\widgets\shell.py:117
+#: spyderlib\widgets\sourcecode\codeeditor.py:2225
+msgid "Cut"
+msgstr ""
+
+#: spyderlib\spyder.py:517 spyderlib\widgets\dicteditor.py:560
+#: spyderlib\widgets\shell.py:125
+#: spyderlib\widgets\sourcecode\codeeditor.py:2231
+msgid "Paste"
+msgstr ""
+
+#: spyderlib\spyder.py:519 spyderlib\widgets\explorer.py:453
+#: spyderlib\widgets\projectexplorer.py:1002 spyderlib\widgets\shell.py:134
+#: spyderlib\widgets\sourcecode\codeeditor.py:2234
+msgid "Delete"
+msgstr ""
+
+#: spyderlib\spyder.py:522 spyderlib\widgets\shell.py:138
+#: spyderlib\widgets\sourcecode\codeeditor.py:2238
+msgid "Select All"
+msgstr ""
+
+#: spyderlib\spyder.py:570
+msgid "&Interpreters"
+msgstr ""
+
+#: spyderlib\spyder.py:576
+msgid "&View"
+msgstr ""
+
+#: spyderlib\spyder.py:584
+msgid "Welcome to Spyder!"
+msgstr ""
+
+#: spyderlib\spyder.py:589
+msgid "Pre&ferences"
+msgstr ""
+
+#: spyderlib\spyder.py:595 spyderlib\widgets\pathmanager.py:45
+#: spyderlib\widgets\projectexplorer.py:593
+msgid "PYTHONPATH manager"
+msgstr ""
+
+#: spyderlib\spyder.py:598
+msgid "Open Spyder path manager"
+msgstr ""
+
+#: spyderlib\spyder.py:601
+msgid "Update module names list"
+msgstr ""
+
+#: spyderlib\spyder.py:604
+msgid "Refresh list of module names available in PYTHONPATH"
+msgstr ""
+
+#: spyderlib\spyder.py:610
+msgid "Current user environment variables..."
+msgstr ""
+
+#: spyderlib\spyder.py:612
+msgid "Show and edit current user environment variables in Windows registry (i.e. for all sessions)"
+msgstr ""
+
+#: spyderlib\spyder.py:619 spyderlib\spyder.py:994
+msgid "External Tools"
+msgstr ""
+
+#: spyderlib\spyder.py:623
+msgid "Python(x,y) launcher"
+msgstr ""
+
+#: spyderlib\spyder.py:634
+msgid "WinPython control panel"
+msgstr ""
+
+#: spyderlib\spyder.py:647
+msgid "Qt Designer"
+msgstr ""
+
+#: spyderlib\spyder.py:652
+msgid "Qt Linguist"
+msgstr ""
+
+#: spyderlib\spyder.py:658
+msgid "Qt examples"
+msgstr ""
+
+#: spyderlib\spyder.py:675
+msgid "guidata examples"
+msgstr ""
+
+#: spyderlib\spyder.py:683
+msgid "guiqwt examples"
+msgstr ""
+
+#: spyderlib\spyder.py:688
+msgid "Sift"
+msgstr ""
+
+#: spyderlib\spyder.py:696
+msgid "ViTables"
+msgstr ""
+
+#: spyderlib\spyder.py:710
+msgid "Fullscreen mode"
+msgstr ""
+
+#: spyderlib\spyder.py:720
+msgid "Main toolbar"
+msgstr ""
+
+#: spyderlib\spyder.py:739
+msgid "Loading object inspector..."
+msgstr ""
+
+#: spyderlib\spyder.py:745
+msgid "Loading outline explorer..."
+msgstr ""
+
+#: spyderlib\spyder.py:752
+msgid "Loading editor..."
+msgstr ""
+
+#: spyderlib\spyder.py:775
+msgid "Loading file explorer..."
+msgstr ""
+
+#: spyderlib\spyder.py:781
+msgid "Loading history plugin..."
+msgstr ""
+
+#: spyderlib\spyder.py:787
+msgid "Loading online help..."
+msgstr ""
+
+#: spyderlib\spyder.py:793
+msgid "Loading project explorer..."
+msgstr ""
+
+#: spyderlib\spyder.py:803
+msgid "Loading external console..."
+msgstr ""
+
+#: spyderlib\spyder.py:811
+msgid "Loading namespace browser..."
+msgstr ""
+
+#: spyderlib\spyder.py:820
+msgid "Loading IPython console..."
+msgstr ""
+
+#: spyderlib\spyder.py:831
+msgid "Setting up main window..."
+msgstr ""
+
+#: spyderlib\spyder.py:835
+msgid "About %s..."
+msgstr ""
+
+#: spyderlib\spyder.py:838
+msgid "Optional dependencies..."
+msgstr ""
+
+#: spyderlib\spyder.py:842
+msgid "Report issue..."
+msgstr ""
+
+#: spyderlib\spyder.py:863
+msgid "Spyder documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:869
+msgid "Python documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:875
+msgid "Qt Assistant"
+msgstr ""
+
+#: spyderlib\spyder.py:909
+msgid "Python(x,y) documentation folder"
+msgstr ""
+
+#: spyderlib\spyder.py:911
+msgid "IPython documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:913
+msgid "guidata documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:916
+msgid "guiqwt documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:922
+msgid "NumPy documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:924
+msgid "NumPy reference guide"
+msgstr ""
+
+#: spyderlib\spyder.py:926
+msgid "NumPy user guide"
+msgstr ""
+
+#: spyderlib\spyder.py:928
+msgid "SciPy documentation"
+msgstr ""
+
+#: spyderlib\spyder.py:935
+msgid "Web Resources"
+msgstr ""
+
+#: spyderlib\spyder.py:956
+msgid "Windows and toolbars"
+msgstr ""
+
+#: spyderlib\spyder.py:960
+msgid "Reset window layout"
+msgstr ""
+
+#: spyderlib\spyder.py:962
+msgid "Custom window layouts"
+msgstr ""
+
+#: spyderlib\spyder.py:968
+msgid "Switch to/from layout %d"
+msgstr ""
+
+#: spyderlib\spyder.py:974
+msgid "Set layout %d"
+msgstr ""
+
+#: spyderlib\spyder.py:984
+msgid "Attached console window (debugging)"
+msgstr ""
+
+#: spyderlib\spyder.py:1242
+msgid ""
+"Window layout will be reset to default settings: this affects window position, size and dockwidgets.\n"
+"Do you want to continue?"
+msgstr ""
+
+#: spyderlib\spyder.py:1260
+msgid "Quick switch layout #%d has not yet been defined."
+msgstr ""
+
+#: spyderlib\spyder.py:1451
+msgid "Maximize current plugin"
+msgstr ""
+
+#: spyderlib\spyder.py:1452
+msgid "Maximize current plugin to fit the whole application window"
+msgstr ""
+
+#: spyderlib\spyder.py:1456
+msgid "Restore current plugin"
+msgstr ""
+
+#: spyderlib\spyder.py:1457
+msgid "Restore current plugin to its original size and position within the application window"
+msgstr ""
+
+#: spyderlib\spyder.py:1529
+msgid "(not installed)"
+msgstr ""
+
+#: spyderlib\spyder.py:1547
+msgid "About %s"
+msgstr ""
+
+#: spyderlib\spyder.py:1711
+msgid "Running an external system terminal is not supported on platform %s."
+msgstr ""
+
+#: spyderlib\spyder.py:1910
+msgid "Open session"
+msgstr ""
+
+#: spyderlib\spyder.py:1911 spyderlib\spyder.py:1922
+msgid "Spyder sessions"
+msgstr ""
+
+#: spyderlib\spyder.py:1921
+msgid "Save session"
+msgstr ""
+
+#: spyderlib\utils\codeanalysis.py:83
+msgid "Real-time code analysis on the Editor"
+msgstr ""
+
+#: spyderlib\utils\codeanalysis.py:87
+msgid "Real-time code style analysis on the Editor"
+msgstr ""
+
+#: spyderlib\utils\environ.py:96
+msgid "Module <b>pywin32 was not found</b>.<br>Please restart this Windows <i>session</i> (not the computer) for changes to take effect."
+msgstr ""
+
+#: spyderlib\utils\environ.py:109
+msgid "If you accept changes, this will modify the current user environment variables directly <b>in Windows registry</b>. Use it with precautions, at your own risks.<br><br>Note that for changes to take effect, you will need to restart the parent process of this application (simply restart Spyder if you have executed it from a Windows shortcut, otherwise restart any application from which you may have executed it, like <i>Python(x,y) Home</i> for example)"
+msgstr ""
+
+#: spyderlib\utils\inspector\sphinxify.py:197
+#: spyderlib\utils\inspector\sphinxify.py:207
+msgid "It was not possible to generate rich text help for this object.</br>Please see it in plain text."
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:331
+msgid "Supported files"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:342
+msgid "Spyder data files"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:344 spyderlib\widgets\dicteditor.py:924
+msgid "NumPy arrays"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:345
+msgid "Matlab files"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:346
+msgid "CSV text files"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:348
+msgid "JPEG images"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:349
+msgid "PNG images"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:350
+msgid "GIF images"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:351
+msgid "TIFF images"
+msgstr ""
+
+#: spyderlib\utils\iofuncs.py:370 spyderlib\utils\iofuncs.py:377
+msgid "<b>Unsupported file type '%s'</b>"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:315 spyderlib\widgets\arrayeditor.py:488
+#: spyderlib\widgets\arrayeditor.py:574
+msgid "Array editor"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:316
+msgid ""
+"Resizing cells of a table of such size could take a long time.\n"
+"Do you want to continue anyway?"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:387 spyderlib\widgets\arrayeditor.py:420
+msgid "Format"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:392
+msgid "Resize"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:421
+msgid "Float formatting"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:428 spyderlib\widgets\explorer.py:549
+#: spyderlib\widgets\explorer.py:650
+#: spyderlib\widgets\externalshell\pythonshell.py:522
+#: spyderlib\widgets\externalshell\systemshell.py:93
+msgid "Error"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:429
+msgid "Format (%s) is incorrect"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:460
+msgid "Array is empty"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:463
+msgid "Arrays with more than 2 dimensions are not supported"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:467
+msgid "The 'xlabels' argument length do no match array column number"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:471
+msgid "The 'ylabels' argument length do no match array row number"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:478
+msgid "%s arrays"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:479
+msgid "%s are currently not supported"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:490
+msgid "read only"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:519
+msgid "Record array fields:"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:531
+msgid "Data"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:531
+msgid "Mask"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:531
+msgid "Masked data"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:538
+msgid "<u>Warning</u>: changes are applied separately"
+msgstr ""
+
+#: spyderlib\widgets\arrayeditor.py:539
+msgid "For performance reasons, changes applied to masked array won't be reflected in array's data (and vice-versa)."
+msgstr ""
+
+#: spyderlib\widgets\browser.py:30
+#: spyderlib\widgets\sourcecode\codeeditor.py:2254
+msgid "Zoom out"
+msgstr ""
+
+#: spyderlib\widgets\browser.py:33
+#: spyderlib\widgets\sourcecode\codeeditor.py:2251
+msgid "Zoom in"
+msgstr ""
+
+#: spyderlib\widgets\browser.py:126
+msgid "Home"
+msgstr ""
+
+#: spyderlib\widgets\browser.py:166
+msgid "Find text"
+msgstr ""
+
+#: spyderlib\widgets\browser.py:185
+msgid "Address:"
+msgstr ""
+
+#: spyderlib\widgets\browser.py:220
+msgid "Unable to load page"
+msgstr ""
+
+#: spyderlib\widgets\comboboxes.py:117
+msgid "Press enter to validate this entry"
+msgstr ""
+
+#: spyderlib\widgets\comboboxes.py:118
+msgid "This entry is incorrect"
+msgstr ""
+
+#: spyderlib\widgets\comboboxes.py:171
+msgid "Press enter to validate this path"
+msgstr ""
+
+#: spyderlib\widgets\comboboxes.py:172
+msgid ""
+"This path is incorrect.\n"
+"Enter a correct directory path,\n"
+"then press enter to validate"
+msgstr ""
+
+#: spyderlib\widgets\dependencies.py:59
+msgid " Required "
+msgstr ""
+
+#: spyderlib\widgets\dependencies.py:59
+msgid "Module"
+msgstr ""
+
+#: spyderlib\widgets\dependencies.py:60
+msgid " Installed "
+msgstr ""
+
+#: spyderlib\widgets\dependencies.py:60
+msgid "Provided features"
+msgstr ""
+
+#: spyderlib\widgets\dependencies.py:126
+msgid "Optional Dependencies"
+msgstr ""
+
+#: spyderlib\widgets\dependencies.py:131
+msgid "Spyder depends on several Python modules to provide additional functionality for its plugins. The table below shows the required and installed versions (if any) of all of them.<br><br>Although Spyder can work without any of these modules, it's strongly recommended that at least you try to install <b>%s</b> and <b>%s</b> to have a much better experience."
+msgstr ""
+
+#: spyderlib\widgets\dependencies.py:149
+msgid "Copy to clipboard"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:145
+msgid "Index"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:150
+msgid "Tuple"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:153
+msgid "List"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:156
+msgid "Dictionary"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:164
+msgid "Attribute"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:165
+msgid "elements"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:287
+msgid "Size"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:287
+msgid "Type"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:287
+msgid "Value"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:361 spyderlib\widgets\dicteditor.py:495
+msgid "Edit item"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:362
+msgid "<b>Unable to retrieve data.</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:496
+msgid "<b>Unable to assign data to item.</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:558
+msgid "Resize rows to contents"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:566 spyderlib\widgets\explorer.py:232
+msgid "Edit"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:569 spyderlib\widgets\dicteditor.py:895
+#: spyderlib\widgets\dicteditor.py:911
+msgid "Plot"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:573
+msgid "Histogram"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:577
+msgid "Show image"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:581 spyderlib\widgets\dicteditor.py:918
+msgid "Save array"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:585 spyderlib\widgets\dicteditor.py:859
+#: spyderlib\widgets\dicteditor.py:867
+msgid "Insert"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:588 spyderlib\widgets\dicteditor.py:812
+msgid "Remove"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:611 spyderlib\widgets\dicteditor.py:829
+#: spyderlib\widgets\explorer.py:495 spyderlib\widgets\explorer.py:503
+#: spyderlib\widgets\explorer.py:515
+msgid "Rename"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:614
+msgid "Duplicate"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:810
+msgid "Do you want to remove selected item?"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:811
+msgid "Do you want to remove all selected items?"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:829 spyderlib\widgets\dicteditor.py:859
+msgid "Key:"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:867
+msgid "Value:"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:883
+msgid "Import error"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:884
+msgid "Please install <b>matplotlib</b> or <b>guiqwt</b>."
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:896
+msgid "<b>Unable to plot data.</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:912
+msgid "<b>Unable to show image.</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:934
+msgid "<b>Unable to save array</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:951
+msgid "Clipboard contents"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:965
+msgid "Import from clipboard"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:967
+msgid "Empty clipboard"
+msgstr ""
+
+#: spyderlib\widgets\dicteditor.py:968
+msgid "Nothing to be imported from clipboard."
+msgstr ""
+
+#: spyderlib\widgets\editor.py:69 spyderlib\widgets\editor.py:553
+msgid "File list management"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:73
+msgid "Filter:"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:78
+msgid "(press <b>Enter</b> to edit file)"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:93
+msgid "&Edit file"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:102
+msgid "&Close file"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:110
+msgid "Hint: press <b>Alt</b> to show accelerators"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:556
+msgid "Copy path to clipboard"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1094
+msgid "Temporary file"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1191
+msgid "New window"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1192
+msgid "Create a new editor window"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1195
+msgid "Split vertically"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1197
+msgid "Split vertically this editor window"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1199
+msgid "Split horizontally"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1201
+msgid "Split horizontally this editor window"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1203
+msgid "Close this panel"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1335
+msgid "<b>%s</b> has been modified.<br>Do you want to save changes?"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1398
+msgid "Save"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1399
+msgid "<b>Unable to save script '%s'</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1421
+msgid "Save Python script"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1642
+msgid "<b>%s</b> is unavailable (this file may have been removed, moved or renamed outside Spyder).<br>Do you want to close it?"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1662
+msgid "<b>%s</b> has been modified outside Spyder.<br>Do you want to reload it and loose all your changes?"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1758
+msgid "All changes to <b>%s</b> will be lost.<br>Do you want to revert file from disk?"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1897
+msgid "Loading %s..."
+msgstr ""
+
+#: spyderlib\widgets\editor.py:1907
+msgid "<b>%s</b> contains mixed end-of-line characters.<br>Spyder will fix this automatically."
+msgstr ""
+
+#: spyderlib\widgets\editor.py:2254
+msgid "Close window"
+msgstr ""
+
+#: spyderlib\widgets\editor.py:2256
+msgid "Close this window"
+msgstr ""
+
+#: spyderlib\widgets\editortools.py:93
+msgid "Line %s"
+msgstr ""
+
+#: spyderlib\widgets\editortools.py:98
+msgid "Class defined at line %s"
+msgstr ""
+
+#: spyderlib\widgets\editortools.py:106
+msgid "Method defined at line %s"
+msgstr ""
+
+#: spyderlib\widgets\editortools.py:116
+msgid "Function defined at line %s"
+msgstr ""
+
+#: spyderlib\widgets\editortools.py:171 spyderlib\widgets\editortools.py:499
+msgid "Go to cursor position"
+msgstr ""
+
+#: spyderlib\widgets\editortools.py:174
+msgid "Show absolute path"
+msgstr ""
+
+#: spyderlib\widgets\editortools.py:177 spyderlib\widgets\explorer.py:174
+msgid "Show all files"
+msgstr ""
+
+#: spyderlib\widgets\editortools.py:180
+msgid "Show special comments"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:170
+msgid "Edit filename filters..."
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:183
+msgid "Edit filename filters"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:184
+msgid "Name filters:"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:202
+msgid "File..."
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:205
+msgid "Module..."
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:208
+msgid "Folder..."
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:212
+msgid "Package..."
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:234
+msgid "Move..."
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:237
+msgid "Delete..."
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:240
+msgid "Rename..."
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:243
+msgid "Open"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:262
+msgid "Commit"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:266
+msgid "Browse repository"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:278
+msgid "Open command prompt here"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:280
+msgid "Open terminal here"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:285
+msgid "Open Python interpreter here"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:299
+msgid "New"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:307
+msgid "Import"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:454
+msgid "Do you really want to delete <b>%s</b>?"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:474
+msgid "delete"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:475 spyderlib\widgets\projectexplorer.py:814
+#: spyderlib\widgets\projectexplorer.py:821
+#: spyderlib\widgets\projectexplorer.py:1088
+#: spyderlib\widgets\projectexplorer.py:1172
+msgid "Project Explorer"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:476 spyderlib\widgets\projectexplorer.py:761
+#: spyderlib\widgets\projectexplorer.py:1173
+msgid "<b>Unable to %s <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:496
+msgid "New name:"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:504
+msgid "Do you really want to rename <b>%s</b> and overwrite the existing file <b>%s</b>?"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:516
+msgid "<b>Unable to rename file <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:550
+msgid "<b>Unable to move <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:568
+msgid "<b>Unable to create folder <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:580 spyderlib\widgets\explorer.py:614
+msgid "<b>Unable to create file <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:588
+msgid "New folder"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:589
+msgid "Folder name:"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:594
+msgid "New package"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:595
+msgid "Package name:"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:634
+msgid "New module"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:647
+msgid "For %s support, please install one of the<br/> following tools:<br/><br/>  %s"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:651
+msgid "<b>Unable to find external program.</b><br><br>%s"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:851
+msgid "Show current directory only"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:958
+msgid "Show toolbar"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:969 spyderlib\widgets\importwizard.py:484
+msgid "Previous"
+msgstr ""
+
+#: spyderlib\widgets\explorer.py:985
+msgid "Parent"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\baseshell.py:140
+msgid "Run again this program"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\baseshell.py:143
+msgid "Kill"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\baseshell.py:145
+msgid "Kills the current process, causing it to exit immediately"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\baseshell.py:213
+msgid "<span style='color: #44AA44'><b>Running...</b></span>"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\baseshell.py:220
+msgid "Terminated."
+msgstr ""
+
+#: spyderlib\widgets\externalshell\baseshell.py:235
+#: spyderlib\widgets\mixins.py:511
+msgid "Arguments"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\baseshell.py:236
+msgid "Command line arguments:"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:168
+msgid "Refresh"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:172
+msgid "Refresh periodically"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:176
+#: spyderlib\widgets\externalshell\namespacebrowser.py:415
+msgid "Import data"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:179
+#: spyderlib\widgets\externalshell\namespacebrowser.py:505
+#: spyderlib\widgets\externalshell\namespacebrowser.py:526
+msgid "Save data"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:184
+msgid "Save data as..."
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:192
+msgid "Exclude references which name starts with an underscore"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:200
+msgid "Exclude references which name is uppercase"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:207
+msgid "Exclude references which name starts with an uppercase character"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:215
+msgid "Exclude references to unsupported data types (i.e. which won't be handled/saved correctly)"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:331
+msgid "Object <b>%s</b> is not picklable"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:437
+msgid "<b>Unsupported file extension '%s'</b><br><br>Would you like to import it anyway (by selecting a known file format)?"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:445
+msgid "Open file as:"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:493
+msgid "<b>Unable to load '%s'</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\namespacebrowser.py:527
+msgid "<b>Unable to save current workspace</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:266
+msgid "Variables"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:267
+msgid "Show/hide global variables explorer"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:271
+msgid "Terminate"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:272
+msgid ""
+"Attempts to terminate the process.\n"
+"The process may not exit as a result of clicking this button\n"
+"(it is given the chance to prompt the user for any unsaved files, etc)."
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:284
+msgid "Interact"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:286
+msgid "Debug"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:288
+#: spyderlib\widgets\externalshell\pythonshell.py:351
+msgid "Arguments..."
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:295
+msgid "Set current working directory"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:297
+msgid "Environment variables"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:301
+msgid "Show sys.path contents"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:347
+msgid "Arguments: %s"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:349
+msgid "No argument"
+msgstr ""
+
+#: spyderlib\widgets\externalshell\pythonshell.py:523
+#: spyderlib\widgets\externalshell\systemshell.py:94
+msgid "Process failed to start"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:155
+msgid "Unexpected error: see internal console"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:207 spyderlib\widgets\findinfiles.py:231
+#: spyderlib\widgets\findinfiles.py:278
+msgid "invalid regular expression"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:276
+msgid "permission denied errors were encountered"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:310
+msgid "Search pattern"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:313 spyderlib\widgets\findinfiles.py:347
+#: spyderlib\widgets\findinfiles.py:359 spyderlib\widgets\findreplace.py:82
+msgid "Regular expression"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:322
+msgid "Search"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:325
+msgid "Start search"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:328
+msgid "Stop"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:331
+msgid "Stop search"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:341
+msgid "Included filenames pattern"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:350
+msgid "Include:"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:353
+msgid "Excluded filenames pattern"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:362
+msgid "Exclude:"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:372
+msgid "PYTHONPATH"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:374
+msgid "Search in all directories listed in sys.path which are outside the Python installation directory"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:377
+msgid "Hg repository"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:380
+msgid "Search in current directory hg repository"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:381
+msgid "Here:"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:385
+msgid "Search recursively in this directory"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:393
+msgid "Browse a search directory"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:426
+msgid "Hide advanced options"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:429
+msgid "Show advanced options"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:571
+msgid "Search canceled"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:575
+msgid "String not found"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:577
+msgid "matches in"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:578
+msgid "file"
+msgstr ""
+
+#: spyderlib\widgets\findinfiles.py:586
+msgid "interrupted"
+msgstr ""
+
+#: spyderlib\widgets\findreplace.py:62
+msgid "Search string"
+msgstr ""
+
+#: spyderlib\widgets\findreplace.py:89
+msgid "Case Sensitive"
+msgstr ""
+
+#: spyderlib\widgets\findreplace.py:96
+msgid "Whole words"
+msgstr ""
+
+#: spyderlib\widgets\findreplace.py:103
+msgid "Highlight matches"
+msgstr ""
+
+#: spyderlib\widgets\findreplace.py:118
+msgid "Replace with:"
+msgstr ""
+
+#: spyderlib\widgets\findreplace.py:120
+msgid "Replace string"
+msgstr ""
+
+#: spyderlib\widgets\findreplace.py:123
+msgid "Replace/find"
+msgstr ""
+
+#: spyderlib\widgets\findreplace.py:132
+msgid "Replace all"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:104
+msgid "Import as"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:106
+msgid "data"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:110
+msgid "code"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:113 spyderlib\widgets\importwizard.py:459
+msgid "text"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:125
+msgid "Column separator:"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:129
+msgid "Tab"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:132 spyderlib\widgets\importwizard.py:150
+msgid "other"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:143
+msgid "Row separator:"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:147
+msgid "EOL"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:163
+msgid "Additionnal options"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:167
+msgid "Skip rows:"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:178
+msgid "Comments:"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:184
+msgid "Transpose"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:406
+msgid "Import as array"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:442 spyderlib\widgets\importwizard.py:533
+msgid "Import wizard"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:447
+msgid "Raw text"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:450
+msgid "variable_name"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:461
+msgid "table"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:462
+msgid "Preview"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:478
+msgid "Cancel"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:493
+msgid "Done"
+msgstr ""
+
+#: spyderlib\widgets\importwizard.py:534
+msgid "<b>Unable to proceed to next step</b><br><br>Please check your entries.<br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:247
+msgid "Help..."
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:263
+msgid "Shell special commands:"
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:264
+msgid "Internal editor:"
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:265
+msgid "External editor:"
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:266
+msgid "Run script:"
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:267
+msgid "Remove references:"
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:268
+msgid "System commands:"
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:269
+msgid "Python help:"
+msgstr ""
+
+#: spyderlib\widgets\internalshell.py:270
+msgid "GUI-based editor:"
+msgstr ""
+
+#: spyderlib\widgets\mixins.py:516
+msgid "Documentation"
+msgstr ""
+
+#: spyderlib\widgets\onecolumntree.py:63
+msgid "Collapse all"
+msgstr ""
+
+#: spyderlib\widgets\onecolumntree.py:67
+msgid "Expand all"
+msgstr ""
+
+#: spyderlib\widgets\onecolumntree.py:71
+msgid "Restore"
+msgstr ""
+
+#: spyderlib\widgets\onecolumntree.py:72
+msgid "Restore original tree layout"
+msgstr ""
+
+#: spyderlib\widgets\onecolumntree.py:76
+msgid "Collapse selection"
+msgstr ""
+
+#: spyderlib\widgets\onecolumntree.py:80
+msgid "Expand selection"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:84
+msgid "Move to top"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:90
+msgid "Move up"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:96
+msgid "Move down"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:102
+msgid "Move to bottom"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:113 spyderlib\widgets\pathmanager.py:225
+msgid "Add path"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:118 spyderlib\widgets\pathmanager.py:209
+msgid "Remove path"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:128
+msgid "Synchronize..."
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:130
+msgid "Synchronize Spyder's path list with PYTHONPATH environment variable"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:141
+msgid "Synchronize"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:142
+msgid "This will synchronize Spyder's path list with <b>PYTHONPATH</b> environment variable for current user, allowing you to run your Python modules outside Spyder without having to configure sys.path. <br>Do you want to clear contents of PYTHONPATH before adding Spyder's path list?"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:210
+msgid "Do you really want to remove selected path?"
+msgstr ""
+
+#: spyderlib\widgets\pathmanager.py:226
+msgid "This directory is already included in Spyder path list.<br>Do you want to move it to the top of the list?"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:332
+msgid "its own configuration file"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:338
+msgid "the following projects:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:540
+msgid "Project..."
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:553
+msgid "Existing directory"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:557
+msgid "Existing Spyder project"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:561
+msgid "Existing Pydev project"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:578
+msgid "Open project"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:583
+msgid "Close project"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:588
+msgid "Close unrelated projects"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:597
+msgid "Edit related projects"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:605
+msgid "Add to PYTHONPATH"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:610
+msgid "Remove from PYTHONPATH"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:615
+msgid "Properties"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:650
+msgid "Show horizontal scrollbar"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:683
+msgid "Workspace"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:684
+msgid "The workspace was unable to load or save %s<br><br>Please check if you have the permission to write the associated configuration files."
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:743
+msgid "Import directory"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:745
+msgid "The following directory is not in workspace:<br><b>%s</b><br><br>Do you want to continue (and copy the directory to workspace)?"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:763
+#: spyderlib\widgets\projectexplorer.py:1169
+msgid "copy"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:815
+msgid "The project <b>%s</b> is already opened!"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:822
+msgid "The project root path directory is inside the workspace but not as the expected tree level. It is not a directory of the workspace:<br><b>%s</b>"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:833
+msgid "Project name:"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:842
+msgid "A project named <b>%s</b> already exists"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:847
+msgid "Invalid project name.<br><br>Name must match the following regular expression:<br><b>%s</b>"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:854
+msgid "The following directory is not empty:<br><b>%s</b><br><br>Do you want to continue?"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:866
+msgid "New project"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:874
+msgid ""
+"The current workspace has not been configured yet.\n"
+"Do you want to do this now?"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:911
+msgid "Import existing project"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:924
+msgid "Select projects to import"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:936
+msgid "The folder <i>%s</i> does not contain a valid %s project"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:964
+msgid "Import existing Pydev project"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:965
+msgid "<b>Unable to read Pydev project <i>%s</i></b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1003
+msgid "Do you really want to delete project <b>%s</b>?<br><br>Note: project files won't be deleted from disk."
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1056
+msgid "Related projects"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1064
+msgid "Select projects which are related to <b>%s</b>"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1089
+msgid "Statistics on source files only:<br>(Python, C/C++, Fortran)<br><br><b>%s</b> files.<br><b>%s</b> lines of code."
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1137
+msgid "File <b>%s</b> already exists.<br>Do you want to overwrite it?"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1151
+msgid "Folder <b>%s</b> already exists."
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1171
+msgid "move"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1181
+msgid "Select an existing workspace directory, or create a new one"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1182
+msgid "<u><b>What is the workspace?</b></u><br><br>A <b>Spyder workspace</b> is a directory on your filesystem that contains Spyder projects and <b>.spyderworkspace</b> configuration file.<br><br>A <b>Spyder project</b> is a directory with source code (and other related files) and a configuration file (named <b>.spyderproject</b>) with project settings (PYTHONPATH, linked projects, ...).<br>"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1209
+msgid "This is the current workspace directory"
+msgstr ""
+
+#: spyderlib\widgets\projectexplorer.py:1240
+msgid "The following directory is not a Spyder workspace:<br>%s<br><br>Do you want to create a new workspace in this directory?"
+msgstr ""
+
+#: spyderlib\widgets\pydocgui.py:107
+msgid "Module or package:"
+msgstr ""
+
+#: spyderlib\widgets\shell.py:129
+msgid "Save history log..."
+msgstr ""
+
+#: spyderlib\widgets\shell.py:131
+msgid "Save current history log (i.e. all inputs and outputs) in a text file"
+msgstr ""
+
+#: spyderlib\widgets\shell.py:251
+msgid "Save history log"
+msgstr ""
+
+#: spyderlib\widgets\shell.py:254
+msgid "History logs"
+msgstr ""
+
+#: spyderlib\widgets\shell.py:265
+msgid "<b>Unable to save file '%s'</b><br><br>Error message:<br>%s"
+msgstr ""
+
+#: spyderlib\widgets\shell.py:690
+msgid "Copy without prompts"
+msgstr ""
+
+#: spyderlib\widgets\shell.py:693 spyderlib\widgets\shell.py:696
+msgid "Clear line"
+msgstr ""
+
+#: spyderlib\widgets\shell.py:698
+msgid "Clear shell"
+msgstr ""
+
+#: spyderlib\widgets\shell.py:701
+msgid "Clear shell contents ('cls' command)"
+msgstr ""
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:69
+msgid "Editor's code completion, go-to-definition and help"
+msgstr ""
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:273
+msgid "Go to line:"
+msgstr ""
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:282
+msgid "Line count:"
+msgstr ""
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:1218
+msgid "Breakpoint"
+msgstr ""
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:1219
+msgid "Condition:"
+msgstr ""
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:1667
+msgid "To do"
+msgstr ""
+
+#: spyderlib\widgets\sourcecode\codeeditor.py:2246
+msgid "Go to definition"
+msgstr ""
+
+#: spyderlib\widgets\status.py:83
+msgid "Memory:"
+msgstr ""
+
+#: spyderlib\widgets\status.py:84
+msgid "Memory usage status: requires the `psutil` (>=v0.3) library on non-Windows platforms"
+msgstr ""
+
+#: spyderlib\widgets\status.py:96
+msgid "CPU:"
+msgstr ""
+
+#: spyderlib\widgets\status.py:97
+msgid "CPU usage status: requires the `psutil` (>=v0.3) library"
+msgstr ""
+
+#: spyderlib\widgets\status.py:119
+msgid "Permissions:"
+msgstr ""
+
+#: spyderlib\widgets\status.py:133
+msgid "End-of-lines:"
+msgstr ""
+
+#: spyderlib\widgets\status.py:147
+msgid "Encoding:"
+msgstr ""
+
+#: spyderlib\widgets\status.py:160
+msgid "Line:"
+msgstr ""
+
+#: spyderlib\widgets\status.py:164
+msgid "Column:"
+msgstr ""
+
+#: spyderlib\widgets\tabs.py:120
+msgid "Browse tabs"
+msgstr ""
+
+#: spyderlib\widgets\tabs.py:243
+msgid "Close current tab"
+msgstr ""
+
+#: spyderlib\widgets\texteditor.py:65
+msgid "Text editor"
+msgstr ""
+
diff --git a/spyderlib/mpl_patch.py b/spyderlib/mpl_patch.py
index 3a8691c..d79e0d8 100644
--- a/spyderlib/mpl_patch.py
+++ b/spyderlib/mpl_patch.py
@@ -6,8 +6,13 @@
 
 """Patching matplotlib's FigureManager"""
 
+from __future__ import print_function
+
 import sys
 
+# Local imports
+from spyderlib.py3compat import to_text_string
+
 
 def is_available():
     """Is Matplotlib installed version supported by this patch?"""
@@ -58,7 +63,7 @@ def apply():
             import matplotlib
             
             if backend_qt4.DEBUG:
-                print 'FigureManagerQT.%s' % backend_qt4.fn_name()
+                print('FigureManagerQT.%s' % backend_qt4.fn_name())
             backend_qt4.FigureManagerBase.__init__(self, canvas, num)
             self.canvas = canvas
             
@@ -142,7 +147,7 @@ def apply():
                                                 'Select axes:', titles,
                                                 0, False)
                 if ok:
-                    axes = allaxes[titles.index(unicode(item))]
+                    axes = allaxes[titles.index(to_text_string(item))]
                 else:
                     return
             else:
@@ -151,7 +156,7 @@ def apply():
         def save_figure(self):
             super(NavigationToolbar2QT, self).save_figure()
         def set_cursor(self, cursor):
-            if backend_qt4.DEBUG: print 'Set cursor' , cursor
+            if backend_qt4.DEBUG: print('Set cursor', cursor)
             self.parent().setCursor(QCursor(backend_qt4.cursord[cursor]))
     # ****************************************************************
     backend_qt4.NavigationToolbar2QT = NavigationToolbar2QT
diff --git a/spyderlib/plugins/__init__.py b/spyderlib/plugins/__init__.py
index e51a994..f33af3e 100644
--- a/spyderlib/plugins/__init__.py
+++ b/spyderlib/plugins/__init__.py
@@ -28,7 +28,8 @@ from spyderlib.config import CONF
 from spyderlib.userconfig import NoDefault
 from spyderlib.guiconfig import get_font, set_font
 from spyderlib.plugins.configdialog import SpyderConfigPage
-    
+from spyderlib.py3compat import is_text_string
+
 
 class PluginConfigPage(SpyderConfigPage):
     """Plugin configuration dialog box page widget"""
@@ -36,12 +37,16 @@ class PluginConfigPage(SpyderConfigPage):
         self.plugin = plugin
         self.get_option = plugin.get_option
         self.set_option = plugin.set_option
-        self.get_name = plugin.get_plugin_title
-        self.get_icon = plugin.get_plugin_icon
         self.get_font = plugin.get_plugin_font
         self.set_font = plugin.set_plugin_font
         self.apply_settings = plugin.apply_plugin_settings
         SpyderConfigPage.__init__(self, parent)
+    
+    def get_name(self):
+        return self.plugin.get_plugin_title()
+
+    def get_icon(self):
+        return self.plugin.get_plugin_icon()
 
 
 class SpyderPluginMixin(object):
@@ -164,7 +169,7 @@ class SpyderPluginMixin(object):
         self.mainwindow = mainwindow = QMainWindow()
         mainwindow.setAttribute(Qt.WA_DeleteOnClose)
         icon = self.get_widget_icon()
-        if isinstance(icon, basestring):
+        if is_text_string(icon):
             icon = get_icon(icon)
         mainwindow.setWindowIcon(icon)
         mainwindow.setWindowTitle(self.get_plugin_title())
diff --git a/spyderlib/plugins/configdialog.py b/spyderlib/plugins/configdialog.py
index 9e3a73c..fc8fa89 100644
--- a/spyderlib/plugins/configdialog.py
+++ b/spyderlib/plugins/configdialog.py
@@ -31,10 +31,23 @@ from spyderlib.qt.QtGui import (QWidget, QDialog, QListWidget, QListWidgetItem,
 from spyderlib.qt.QtCore import Qt, QSize, SIGNAL, SLOT, Slot
 from spyderlib.qt.compat import (to_qvariant, from_qvariant,
                                  getexistingdirectory, getopenfilename)
+from spyderlib.py3compat import to_text_string, is_text_string, getcwd
+
+
+class ConfigAccessMixin(object):
+    """Namespace for methods that access config storage"""
+    CONF_SECTION = None
+
+    def set_option(self, option, value):
+        CONF.set(self.CONF_SECTION, option, value)
+
+    def get_option(self, option, default=NoDefault):
+        return CONF.get(self.CONF_SECTION, option, default)
 
 
 class ConfigPage(QWidget):
-    """Configuration page base class"""
+    """Base class for configuration page in Preferences"""
+
     def __init__(self, parent, apply_callback=None):
         QWidget.__init__(self, parent)
         self.apply_callback = apply_callback
@@ -50,11 +63,11 @@ class ConfigPage(QWidget):
         self.load_from_conf()
         
     def get_name(self):
-        """Return page name"""
+        """Return configuration page name"""
         raise NotImplementedError
     
     def get_icon(self):
-        """Return page icon"""
+        """Return configuration page icon (24x24)"""
         raise NotImplementedError
     
     def setup_page(self):
@@ -203,8 +216,10 @@ class ConfigDialog(QDialog):
         self.emit(SIGNAL("size_change(QSize)"), self.size())
 
 
-class SpyderConfigPage(ConfigPage):
+class SpyderConfigPage(ConfigPage, ConfigAccessMixin):
     """Plugin configuration dialog box page widget"""
+    CONF_SECTION = None
+
     def __init__(self, parent):
         ConfigPage.__init__(self, parent,
                             apply_callback=lambda:
@@ -239,7 +254,7 @@ class SpyderConfigPage(ConfigPage):
         for lineedit in self.lineedits:
             if lineedit in self.validate_data and lineedit.isEnabled():
                 validator, invalid_msg = self.validate_data[lineedit]
-                text = unicode(lineedit.text())
+                text = to_text_string(lineedit.text())
                 if not validator(text):
                     QMessageBox.critical(self, self.get_name(),
                                      "%s:<br><b>%s</b>" % (invalid_msg, text),
@@ -249,35 +264,35 @@ class SpyderConfigPage(ConfigPage):
         
     def load_from_conf(self):
         """Load settings from configuration file"""
-        for checkbox, (option, default) in self.checkboxes.items():
+        for checkbox, (option, default) in list(self.checkboxes.items()):
             checkbox.setChecked(self.get_option(option, default))
             self.connect(checkbox, SIGNAL("clicked(bool)"),
                          lambda _foo, opt=option: self.has_been_modified(opt))
-        for radiobutton, (option, default) in self.radiobuttons.items():
+        for radiobutton, (option, default) in list(self.radiobuttons.items()):
             radiobutton.setChecked(self.get_option(option, default))
             self.connect(radiobutton, SIGNAL("toggled(bool)"),
                          lambda _foo, opt=option: self.has_been_modified(opt))
-        for lineedit, (option, default) in self.lineedits.items():
+        for lineedit, (option, default) in list(self.lineedits.items()):
             lineedit.setText(self.get_option(option, default))
             self.connect(lineedit, SIGNAL("textChanged(QString)"),
                          lambda _foo, opt=option: self.has_been_modified(opt))
-        for spinbox, (option, default) in self.spinboxes.items():
+        for spinbox, (option, default) in list(self.spinboxes.items()):
             spinbox.setValue(self.get_option(option, default))
             self.connect(spinbox, SIGNAL('valueChanged(int)'),
                          lambda _foo, opt=option: self.has_been_modified(opt))
-        for combobox, (option, default) in self.comboboxes.items():
+        for combobox, (option, default) in list(self.comboboxes.items()):
             value = self.get_option(option, default)
             for index in range(combobox.count()):
-                data = from_qvariant(combobox.itemData(index), unicode)
+                data = from_qvariant(combobox.itemData(index), to_text_string)
                 # For PyQt API v2, it is necessary to convert `data` to 
                 # unicode in case the original type was not a string, like an 
                 # integer for example (see spyderlib.qt.compat.from_qvariant):
-                if unicode(data) == unicode(value):
+                if to_text_string(data) == to_text_string(value):
                     break
             combobox.setCurrentIndex(index)
             self.connect(combobox, SIGNAL('currentIndexChanged(int)'),
                          lambda _foo, opt=option: self.has_been_modified(opt))
-        for (fontbox, sizebox), option in self.fontboxes.items():
+        for (fontbox, sizebox), option in list(self.fontboxes.items()):
             font = self.get_font(option)
             fontbox.setCurrentFont(font)
             sizebox.setValue(font.pointSize())
@@ -289,7 +304,7 @@ class SpyderConfigPage(ConfigPage):
                          lambda _foo, opt=property: self.has_been_modified(opt))
             self.connect(sizebox, SIGNAL('valueChanged(int)'),
                          lambda _foo, opt=property: self.has_been_modified(opt))
-        for clayout, (option, default) in self.coloredits.items():
+        for clayout, (option, default) in list(self.coloredits.items()):
             property = to_qvariant(option)
             edit = clayout.lineedit
             btn = clayout.colorbtn
@@ -299,7 +314,7 @@ class SpyderConfigPage(ConfigPage):
             self.connect(edit, SIGNAL("textChanged(QString)"),
                          lambda _foo, opt=option: self.has_been_modified(opt))
         for (clayout, cb_bold, cb_italic
-             ), (option, default) in self.scedits.items():
+             ), (option, default) in list(self.scedits.items()):
             edit = clayout.lineedit
             btn = clayout.colorbtn
             color, bold, italic = self.get_option(option, default)
@@ -317,25 +332,25 @@ class SpyderConfigPage(ConfigPage):
     
     def save_to_conf(self):
         """Save settings to configuration file"""
-        for checkbox, (option, _default) in self.checkboxes.items():
+        for checkbox, (option, _default) in list(self.checkboxes.items()):
             self.set_option(option, checkbox.isChecked())
-        for radiobutton, (option, _default) in self.radiobuttons.items():
+        for radiobutton, (option, _default) in list(self.radiobuttons.items()):
             self.set_option(option, radiobutton.isChecked())
-        for lineedit, (option, _default) in self.lineedits.items():
-            self.set_option(option, unicode(lineedit.text()))
-        for spinbox, (option, _default) in self.spinboxes.items():
+        for lineedit, (option, _default) in list(self.lineedits.items()):
+            self.set_option(option, to_text_string(lineedit.text()))
+        for spinbox, (option, _default) in list(self.spinboxes.items()):
             self.set_option(option, spinbox.value())
-        for combobox, (option, _default) in self.comboboxes.items():
+        for combobox, (option, _default) in list(self.comboboxes.items()):
             data = combobox.itemData(combobox.currentIndex())
-            self.set_option(option, from_qvariant(data, unicode))
-        for (fontbox, sizebox), option in self.fontboxes.items():
+            self.set_option(option, from_qvariant(data, to_text_string))
+        for (fontbox, sizebox), option in list(self.fontboxes.items()):
             font = fontbox.currentFont()
             font.setPointSize(sizebox.value())
             self.set_font(font, option)
-        for clayout, (option, _default) in self.coloredits.items():
-            self.set_option(option, unicode(clayout.lineedit.text()))
-        for (clayout, cb_bold, cb_italic), (option, _default) in self.scedits.items():
-            color = unicode(clayout.lineedit.text())
+        for clayout, (option, _default) in list(self.coloredits.items()):
+            self.set_option(option, to_text_string(clayout.lineedit.text()))
+        for (clayout, cb_bold, cb_italic), (option, _default) in list(self.scedits.items()):
+            color = to_text_string(clayout.lineedit.text())
             bold = cb_bold.isChecked()
             italic = cb_italic.isChecked()
             self.set_option(option, (color, bold, italic))
@@ -426,9 +441,9 @@ class SpyderConfigPage(ConfigPage):
 
     def select_directory(self, edit):
         """Select directory"""
-        basedir = unicode(edit.text())
+        basedir = to_text_string(edit.text())
         if not osp.isdir(basedir):
-            basedir = os.getcwdu()
+            basedir = getcwd()
         title = _("Select directory")
         directory = getexistingdirectory(self, title, basedir)
         if directory:
@@ -457,9 +472,9 @@ class SpyderConfigPage(ConfigPage):
 
     def select_file(self, edit, filters=None):
         """Select File"""
-        basedir = osp.dirname(unicode(edit.text()))
+        basedir = osp.dirname(to_text_string(edit.text()))
         if not osp.isdir(basedir):
-            basedir = os.getcwdu()
+            basedir = getcwd()
         if filters is None:
             filters = _("All files (*)")
         title = _("Select file")
@@ -605,36 +620,43 @@ class SpyderConfigPage(ConfigPage):
 
 
 class GeneralConfigPage(SpyderConfigPage):
+    """Config page that maintains reference to main Spyder window
+       and allows to specify page name and icon declaratively
+    """
     CONF_SECTION = None
+
+    NAME = None    # configuration page name, e.g. _("General")
+    ICON = None    # name of icon resource (24x24)
+
     def __init__(self, parent, main):
         SpyderConfigPage.__init__(self, parent)
         self.main = main
 
-    def set_option(self, option, value):
-        CONF.set(self.CONF_SECTION, option, value)
+    def get_name(self):
+        """Configuration page name"""
+        return self.NAME
+    
+    def get_icon(self):
+        """Loads page icon named by self.ICON"""
+        return get_icon(self.ICON)
 
-    def get_option(self, option, default=NoDefault):
-        return CONF.get(self.CONF_SECTION, option, default)
-            
     def apply_settings(self, options):
         raise NotImplementedError
 
 
 class MainConfigPage(GeneralConfigPage):
     CONF_SECTION = "main"
-    def get_name(self):
-        return _("General")
     
-    def get_icon(self):
-        return get_icon("genprefs.png")
+    NAME = _("General")
+    ICON = "genprefs.png"
     
     def setup_page(self):
         newcb = self.create_checkbox
 
         # --- Interface
         interface_group = QGroupBox(_("Interface"))
-        styles = [str(txt) for txt in QStyleFactory.keys()]
-        choices = zip(styles, [style.lower() for style in styles])
+        styles = [str(txt) for txt in list(QStyleFactory.keys())]
+        choices = list(zip(styles, [style.lower() for style in styles]))
         style_combo = self.create_combobox(_('Qt windows style'), choices,
                                            'windows_style',
                                            default=self.main.default_style)
@@ -665,15 +687,7 @@ class MainConfigPage(GeneralConfigPage):
         margins_layout.addWidget(margin_spin)
 
         # Decide if it's possible to activate or not singie instance mode
-        if os.name == 'nt':
-            pywin32_present = programs.is_module_installed('win32api')
-            if not pywin32_present:
-                self.set_option("single_instance", False)
-                single_instance_box.setEnabled(False)
-                tip = _("This feature requires the pywin32 module.\n"
-                        "It seems you don't have it installed.")
-                single_instance_box.setToolTip(tip)
-        elif sys.platform == "darwin" and 'Spyder.app' in __file__:
+        if sys.platform == "darwin" and 'Spyder.app' in __file__:
             self.set_option("single_instance", True)
             single_instance_box.setEnabled(False)
         
@@ -740,11 +754,9 @@ class MainConfigPage(GeneralConfigPage):
 
 class ColorSchemeConfigPage(GeneralConfigPage):
     CONF_SECTION = "color_schemes"
-    def get_name(self):
-        return _("Syntax coloring")
     
-    def get_icon(self):
-        return get_icon("genprefs.png")
+    NAME = _("Syntax coloring")
+    ICON = "genprefs.png"
     
     def setup_page(self):
         tabs = QTabWidget()
@@ -778,7 +790,7 @@ class ColorSchemeConfigPage(GeneralConfigPage):
                 option = "%s/%s" % (tabname, key)
                 value = self.get_option(option)
                 name = fieldnames[key]
-                if isinstance(value, basestring):
+                if is_text_string(value):
                     label, clayout = self.create_coloredit(name, option,
                                                            without_layout=True)
                     label.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
diff --git a/spyderlib/plugins/console.py b/spyderlib/plugins/console.py
index 00e7890..b4d01ff 100644
--- a/spyderlib/plugins/console.py
+++ b/spyderlib/plugins/console.py
@@ -22,7 +22,7 @@ import os.path as osp
 
 
 # Local imports
-from spyderlib.baseconfig import _
+from spyderlib.baseconfig import _, debug_print
 from spyderlib.config import CONF
 from spyderlib.utils.misc import get_error_match, remove_backslashes
 from spyderlib.utils.qthelpers import (get_icon, create_action, add_actions,
@@ -32,6 +32,7 @@ from spyderlib.widgets.internalshell import InternalShell
 from spyderlib.widgets.findreplace import FindReplace
 from spyderlib.widgets.dicteditor import DictEditor
 from spyderlib.plugins import SpyderPluginWidget
+from spyderlib.py3compat import to_text_string, getcwd
 
     
 class Console(SpyderPluginWidget):
@@ -43,6 +44,7 @@ class Console(SpyderPluginWidget):
                  exitfunc=None, profile=False, multithreaded=False):
         SpyderPluginWidget.__init__(self, parent)
         
+        debug_print("    ..internal console: initializing")
         self.dialog_manager = DialogManager()
 
         # Shell
@@ -219,7 +221,7 @@ class Console(SpyderPluginWidget):
         if filename is None:
             self.shell.interpreter.restore_stds()
             filename, _selfilter = getopenfilename(self, _("Run Python script"),
-                   os.getcwdu(), _("Python scripts")+" (*.py ; *.pyw ; *.ipy)")
+                   getcwd(), _("Python scripts")+" (*.py ; *.pyw ; *.ipy)")
             self.shell.interpreter.redirect_stds()
             if filename:
                 os.chdir( osp.dirname(filename) )
@@ -240,7 +242,7 @@ class Console(SpyderPluginWidget):
             
     def go_to_error(self, text):
         """Go to error if relevant"""
-        match = get_error_match(unicode(text))
+        match = get_error_match(to_text_string(text))
         if match:
             fname, lnb = match.groups()
             self.edit_script(fname, int(lnb))
@@ -258,7 +260,7 @@ class Console(SpyderPluginWidget):
         
     def execute_lines(self, lines):
         """Execute lines and give focus to shell"""
-        self.shell.execute_lines(unicode(lines))
+        self.shell.execute_lines(to_text_string(lines))
         self.shell.setFocus()
         
     def change_font(self):
@@ -286,7 +288,7 @@ class Console(SpyderPluginWidget):
                           QLineEdit.Normal,
                           self.get_option('external_editor/path'))
         if valid:
-            self.set_option('external_editor/path', unicode(path))
+            self.set_option('external_editor/path', to_text_string(path))
             
     def toggle_wrap_mode(self, checked):
         """Toggle wrap mode"""
@@ -329,7 +331,7 @@ class Console(SpyderPluginWidget):
             pathlist = mimedata2url(source)
             self.shell.drop_pathlist(pathlist)
         elif source.hasText():
-            lines = unicode(source.text())
+            lines = to_text_string(source.text())
             self.shell.set_cursor_position('eof')
             self.shell.execute_lines(lines)
         event.acceptProposedAction()
diff --git a/spyderlib/plugins/editor.py b/spyderlib/plugins/editor.py
index 88d3fc8..191d21a 100644
--- a/spyderlib/plugins/editor.py
+++ b/spyderlib/plugins/editor.py
@@ -44,11 +44,12 @@ from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
 from spyderlib.plugins.runconfig import (RunConfigDialog, RunConfigOneDialog,
                                          get_run_configuration,
                                          ALWAYS_OPEN_FIRST_RUN_OPTION)
+from spyderlib.py3compat import to_text_string, getcwd, qbytearray_to_str
 
 
 def _load_all_breakpoints():
     bp_dict = CONF.get('run', 'breakpoints', {})
-    for filename in bp_dict.keys():
+    for filename in list(bp_dict.keys()):
         if not osp.isfile(filename):
             bp_dict.pop(filename)
     return bp_dict
@@ -82,9 +83,11 @@ WINPDB_PATH = programs.find_program('winpdb')
 
 
 class EditorConfigPage(PluginConfigPage):
-    def __init__(self, plugin, parent):
-        PluginConfigPage.__init__(self, plugin, parent)
-        self.get_name = lambda: _("Editor")
+    def get_name(self):
+        return _("Editor")
+        
+    def get_icon(self):
+        return get_icon("edit24.png")
     
     def setup_page(self):
         template_btn = self.create_button(_("Edit template for new modules"),
@@ -130,7 +133,7 @@ class EditorConfigPage(PluginConfigPage):
         occurence_layout.addWidget(occurence_spin)
         wrap_mode_box = newcb(_("Wrap lines"), 'wrap')
         names = CONF.get('color_schemes', 'names')
-        choices = zip(names, names)
+        choices = list(zip(names, names))
         cs_combo = self.create_combobox(_("Syntax color scheme: "),
                                         choices, 'color_scheme_name')
         
@@ -327,7 +330,7 @@ class Editor(SpyderPluginWidget):
     """
     CONF_SECTION = 'editor'
     CONFIGWIDGET_CLASS = EditorConfigPage
-    TEMPFILE_PATH = get_conf_path('.temp.py')
+    TEMPFILE_PATH = get_conf_path('temp.py')
     TEMPLATE_PATH = get_conf_path('template.py')
     DISABLE_ACTIONS_WHEN_HIDDEN = False # SpyderPluginWidget class attribute
     def __init__(self, parent, ignore_last_opened_files=False):
@@ -510,7 +513,7 @@ class Editor(SpyderPluginWidget):
         title = _('Editor')
         filename = self.get_current_filename()
         if filename:
-            title += ' - '+unicode(filename)
+            title += ' - '+to_text_string(filename)
         return title
     
     def get_plugin_icon(self):
@@ -543,7 +546,7 @@ class Editor(SpyderPluginWidget):
     def closing_plugin(self, cancelable=False):
         """Perform actions before parent main window is closed"""
         state = self.splitter.saveState()
-        self.set_option('splitter_state', str(state.toHex()))
+        self.set_option('splitter_state', qbytearray_to_str(state))
         filenames = []
         editorstack = self.editorstacks[0]
         filenames += [finfo.filename for finfo in editorstack.data]
@@ -1019,7 +1022,7 @@ class Editor(SpyderPluginWidget):
         return self.last_focus_editorstack[editorwindow]
     
     def remove_last_focus_editorstack(self, editorstack):
-        for editorwindow, widget in self.last_focus_editorstack.items():
+        for editorwindow, widget in list(self.last_focus_editorstack.items()):
             if widget is editorstack:
                 self.last_focus_editorstack[editorwindow] = None
         
@@ -1373,7 +1376,7 @@ class Editor(SpyderPluginWidget):
         self.update_todo_actions()
             
     def refresh_eol_chars(self, os_name):
-        os_name = unicode(os_name)
+        os_name = to_text_string(os_name)
         self.__set_eol_chars = False
         if os_name == 'nt':
             self.win_eol_action.setChecked(True)
@@ -1424,7 +1427,8 @@ class Editor(SpyderPluginWidget):
             
     #------ Breakpoints
     def save_breakpoints(self, filename, breakpoints):
-        filename, breakpoints = unicode(filename), unicode(breakpoints)
+        filename = to_text_string(filename)
+        breakpoints = to_text_string(breakpoints)
         filename = osp.normpath(osp.abspath(filename))
         if breakpoints:
             breakpoints = eval(breakpoints)
@@ -1440,12 +1444,11 @@ class Editor(SpyderPluginWidget):
             # Creating temporary file
             default = ['# -*- coding: utf-8 -*-',
                        '"""', _("Spyder Editor"), '',
-                       _("This temporary script file is located here:"),
-                       self.TEMPFILE_PATH,
+                       _("This is a temporary script file."),
                        '"""', '', '']
             text = os.linesep.join([encoding.to_unicode(qstr)
                                     for qstr in default])
-            encoding.write(unicode(text), self.TEMPFILE_PATH, 'utf-8')
+            encoding.write(to_text_string(text), self.TEMPFILE_PATH, 'utf-8')
         self.load(self.TEMPFILE_PATH)
 
     def __set_workdir(self):
@@ -1494,14 +1497,14 @@ class Editor(SpyderPluginWidget):
             username = encoding.to_unicode_from_fs(os.environ.get('USER',
                                                                   '-'))
         VARS = {
-            'date':time.ctime(),
-            'username':username,
+            'date': time.ctime(),
+            'username': username,
         }
         try:
             text = text % VARS
         except:
             pass
-        create_fname = lambda n: unicode(_("untitled")) + ("%d.py" % n)
+        create_fname = lambda n: to_text_string(_("untitled")) + ("%d.py" % n)
         # Creating editor widget
         if editorstack is None:
             current_es = self.get_current_editorstack()
@@ -1514,7 +1517,7 @@ class Editor(SpyderPluginWidget):
                 self.untitled_num += 1
                 if not osp.isfile(fname):
                     break
-            basedir = os.getcwdu()
+            basedir = getcwd()
             if CONF.get('workingdir', 'editor/new/browse_scriptdir'):
                 c_fname = self.get_current_filename()
                 if c_fname is not None and c_fname != self.TEMPFILE_PATH:
@@ -1522,7 +1525,7 @@ class Editor(SpyderPluginWidget):
             fname = osp.abspath(osp.join(basedir, fname))
         else:
             # QString when triggered by a Qt signal
-            fname = osp.abspath(unicode(fname))
+            fname = osp.abspath(to_text_string(fname))
             index = current_es.has_filename(fname)
             if index and not current_es.close_file(index):
                 return
@@ -1597,9 +1600,9 @@ class Editor(SpyderPluginWidget):
             # Recent files action
             action = self.sender()
             if isinstance(action, QAction):
-                filenames = from_qvariant(action.data(), unicode)
+                filenames = from_qvariant(action.data(), to_text_string)
         if not filenames:
-            basedir = os.getcwdu()
+            basedir = getcwd()
             if CONF.get('workingdir', 'editor/open/browse_scriptdir'):
                 c_fname = self.get_current_filename()
                 if c_fname is not None and c_fname != self.TEMPFILE_PATH:
@@ -1749,7 +1752,7 @@ class Editor(SpyderPluginWidget):
     #------ Explorer widget
     def close_file_from_name(self, filename):
         """Close file from its name"""
-        filename = osp.abspath(unicode(filename))
+        filename = osp.abspath(to_text_string(filename))
         index = self.editorstacks[0].has_filename(filename)
         if index is not None:
             self.editorstacks[0].close_file(index)
@@ -1760,18 +1763,19 @@ class Editor(SpyderPluginWidget):
     
     def removed_tree(self, dirname):
         """Directory was removed in project explorer widget"""
-        dirname = osp.abspath(unicode(dirname))
+        dirname = osp.abspath(to_text_string(dirname))
         for fname in self.get_filenames():
             if osp.abspath(fname).startswith(dirname):
                 self.__close(fname)
     
     def renamed(self, source, dest):
         """File was renamed in file explorer widget or in project explorer"""
-        filename = osp.abspath(unicode(source))
+        filename = osp.abspath(to_text_string(source))
         index = self.editorstacks[0].has_filename(filename)
         if index is not None:
             for editorstack in self.editorstacks:
-                editorstack.rename_in_data(index, new_filename=unicode(dest))
+                editorstack.rename_in_data(index,
+                                           new_filename=to_text_string(dest))
         
     
     #------ Source code
@@ -1892,10 +1896,10 @@ class Editor(SpyderPluginWidget):
         self.add_cursor_position_to_history(filename1, position1)
         
     def text_changed_at(self, filename, position):
-        self.last_edit_cursor_pos = (unicode(filename), position)
+        self.last_edit_cursor_pos = (to_text_string(filename), position)
         
     def current_file_changed(self, filename, position):
-        self.add_cursor_position_to_history(unicode(filename), position,
+        self.add_cursor_position_to_history(to_text_string(filename), position,
                                             fc=True)
         
     def go_to_last_edit_location(self):
diff --git a/spyderlib/plugins/explorer.py b/spyderlib/plugins/explorer.py
index 8f530ef..bf15d75 100644
--- a/spyderlib/plugins/explorer.py
+++ b/spyderlib/plugins/explorer.py
@@ -22,6 +22,7 @@ from spyderlib.config import VALID_EXT
 from spyderlib.utils.qthelpers import create_action
 from spyderlib.widgets.explorer import ExplorerWidget
 from spyderlib.plugins import SpyderPluginMixin
+from spyderlib.py3compat import to_text_string
 
 
 class Explorer(ExplorerWidget, SpyderPluginMixin):
@@ -74,8 +75,8 @@ class Explorer(ExplorerWidget, SpyderPluginMixin):
                      self.main.editor.new)
         self.connect(self, SIGNAL("run(QString)"),
                      lambda fname:
-                     self.main.open_external_console(unicode(fname),
-                                         osp.dirname(unicode(fname)),
+                     self.main.open_external_console(to_text_string(fname),
+                                         osp.dirname(to_text_string(fname)),
                                          '', False, False, True, '', False))
         # Signal "set_explorer_cwd(QString)" will refresh only the
         # contents of path passed by the signal in explorer:
diff --git a/spyderlib/plugins/externalconsole.py b/spyderlib/plugins/externalconsole.py
index 0a9741a..0f6403b 100644
--- a/spyderlib/plugins/externalconsole.py
+++ b/spyderlib/plugins/externalconsole.py
@@ -28,7 +28,6 @@ import sys
 
 # Local imports
 from spyderlib.baseconfig import _, SCIENTIFIC_STARTUP
-from spyderlib.ipythonconfig import SUPPORTED_IPYTHON
 from spyderlib.config import CONF
 from spyderlib.utils import programs
 from spyderlib.utils.misc import (get_error_match, get_python_executable,
@@ -39,6 +38,7 @@ from spyderlib.widgets.externalshell.pythonshell import ExternalPythonShell
 from spyderlib.widgets.externalshell.systemshell import ExternalSystemShell
 from spyderlib.widgets.findreplace import FindReplace
 from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
+from spyderlib.py3compat import to_text_string, is_text_string, getcwd
 from spyderlib import dependencies
 
 MPL_REQVER = '>=1.0'
@@ -233,7 +233,7 @@ class ExternalConsoleConfigPage(PluginConfigPage):
         # Startup Group
         startup_group = QGroupBox(_("Startup"))
         pystartup_box = newcb(_("Open a Python interpreter at startup"),
-                              'open_python_at_startup')
+                              'open_python_at_startup', True)
         
         startup_layout = QVBoxLayout()
         startup_layout.addWidget(pystartup_box)
@@ -451,8 +451,8 @@ class ExternalConsoleConfigPage(PluginConfigPage):
         """Custom Python executable value has been changed"""
         if not self.cus_exec_radio.isChecked():
             return
-        if not isinstance(pyexec, basestring):
-            pyexec = unicode(pyexec.toUtf8(), 'utf-8')
+        if not is_text_string(pyexec):
+            pyexec = to_text_string(pyexec.toUtf8(), 'utf-8')
         old_pyexec = self.get_option("pythonexecutable",
                                      get_python_executable())
         if pyexec != old_pyexec:
@@ -462,8 +462,8 @@ class ExternalConsoleConfigPage(PluginConfigPage):
         """Python executable default/custom radio button has been toggled"""
         def_pyexec = get_python_executable()
         cust_pyexec = self.pyexec_edit.text()
-        if not isinstance(cust_pyexec, basestring):
-            cust_pyexec = unicode(cust_pyexec.toUtf8(), 'utf-8')
+        if not is_text_string(cust_pyexec):
+            cust_pyexec = to_text_string(cust_pyexec.toUtf8(), 'utf-8')
         if def_pyexec != cust_pyexec:
             pyexec = cust_pyexec if custom else def_pyexec
             self._auto_change_qt_api(pyexec)
@@ -475,6 +475,7 @@ class ExternalConsole(SpyderPluginWidget):
     """
     CONF_SECTION = 'console'
     CONFIGWIDGET_CLASS = ExternalConsoleConfigPage
+    DISABLE_ACTIONS_WHEN_HIDDEN = False
     def __init__(self, parent, light_mode):
         SpyderPluginWidget.__init__(self, parent)
         self.light_mode = light_mode
@@ -640,7 +641,7 @@ class ExternalConsole(SpyderPluginWidget):
         if current_index == -1:
             return
         from spyderlib.widgets.externalshell import pythonshell
-        for index in [current_index]+range(self.tabwidget.count()):
+        for index in [current_index]+list(range(self.tabwidget.count())):
             shellwidget = self.tabwidget.widget(index)
             if isinstance(shellwidget, pythonshell.ExternalPythonShell):
                 if interpreter_only and not shellwidget.is_interpreter:
@@ -681,7 +682,7 @@ class ExternalConsole(SpyderPluginWidget):
         
     def run_script_in_current_shell(self, filename, wdir, args, debug):
         """Run script in current shell, if any"""
-        norm = lambda text: remove_backslashes(unicode(text))
+        norm = lambda text: remove_backslashes(to_text_string(text))
         line = "%s('%s'" % ('debugfile' if debug else 'runfile',
                             norm(filename))
         if args:
@@ -693,7 +694,8 @@ class ExternalConsole(SpyderPluginWidget):
             QMessageBox.warning(self, _('Warning'),
                 _("No Python shell is currently selected to run <b>%s</b>."
                   "<br><br>Please select or open a new Python interpreter "
-                  "and try again.") % osp.basename(filename), QMessageBox.Ok)
+                  "and try again."
+                  ) % osp.basename(norm(filename)), QMessageBox.Ok)
         else:
             self.visibility_changed(True)
             self.raise_()            
@@ -702,14 +704,14 @@ class ExternalConsole(SpyderPluginWidget):
         """Set current shell working directory"""
         shellwidget = self.__find_python_shell()
         if shellwidget is not None:
-            shellwidget.shell.set_cwd(unicode(directory))
+            shellwidget.shell.set_cwd(to_text_string(directory))
         
     def execute_python_code(self, lines, interpreter_only=False):
         """Execute Python code in an already opened Python interpreter"""
         shellwidget = self.__find_python_shell(
                                         interpreter_only=interpreter_only)
         if (shellwidget is not None) and (not shellwidget.is_ipykernel):
-            shellwidget.shell.execute_lines(unicode(lines))
+            shellwidget.shell.execute_lines(to_text_string(lines))
             self.activateWindow()
             shellwidget.shell.setFocus()
             return True
@@ -722,7 +724,7 @@ class ExternalConsole(SpyderPluginWidget):
         # prevent keyboard input from accidentally entering the editor
         # during repeated, rapid entry of debugging commands.    
         self.emit(SIGNAL("edit_goto(QString,int,QString,bool)"),
-                  fname, lineno, '',False)
+                  fname, lineno, '', False)
         if shellwidget.is_ipykernel:
             # Focus client widget, not kernel
             ipw = self.main.ipyconsole.get_focus_widget()
@@ -738,8 +740,7 @@ class ExternalConsole(SpyderPluginWidget):
             shellwidget.shell.set_spyder_breakpoints()    
     
     def start(self, fname, wdir=None, args='', interact=False, debug=False,
-              python=True, ipykernel=False, ipyclient=False,
-              python_args=''):
+              python=True, ipykernel=False, ipyclient=None, python_args=''):
         """
         Start new console
         
@@ -757,10 +758,10 @@ class ExternalConsole(SpyderPluginWidget):
                    (option "-u" is mandatory, see widgets.externalshell package)
         """
         # Note: fname is None <=> Python interpreter
-        if fname is not None and not isinstance(fname, basestring):
-            fname = unicode(fname)
-        if wdir is not None and not isinstance(wdir, basestring):
-            wdir = unicode(wdir)
+        if fname is not None and not is_text_string(fname):
+            fname = to_text_string(fname)
+        if wdir is not None and not is_text_string(wdir):
+            wdir = to_text_string(wdir)
         
         if fname is not None and fname in self.filenames:
             index = self.filenames.index(fname)
@@ -934,11 +935,14 @@ class ExternalConsole(SpyderPluginWidget):
                         tab_name = _("Kernel")
                         tab_icon1 = get_icon('ipython_console.png')
                         tab_icon2 = get_icon('ipython_console_t.png')
-                        if ipyclient:
-                            self.connect(shellwidget,
+                        self.connect(shellwidget,
                                      SIGNAL('create_ipython_client(QString)'),
-                                     lambda cf: self.create_ipyclient(
-                                             cf, kernel_widget=shellwidget))
+                                     lambda cf: self.register_ipyclient(cf,
+                                                                  ipyclient,
+                                                                  shellwidget))
+                        ipyclient.connect(shellwidget,
+                              SIGNAL("ipython_kernel_start_error(QString)"),
+                              lambda error: ipyclient.show_kernel_error(error))
                     else:
                         QMessageBox.critical(self,
                                      _("Mismatch between kernel and frontend"),
@@ -997,7 +1001,7 @@ class ExternalConsole(SpyderPluginWidget):
             self.activateWindow()
             shellwidget.shell.setFocus()
     
-    def set_ipykernel_attrs(self, connection_file, kernel_widget):
+    def set_ipykernel_attrs(self, connection_file, kernel_widget, kernel_id):
         """Add the pid of the kernel process to an IPython kernel tab"""
         # Set connection file
         kernel_widget.connection_file = connection_file
@@ -1009,27 +1013,43 @@ class ExternalConsole(SpyderPluginWidget):
         # connection file at the time Spyder exits.
         def cleanup_connection_file(connection_file):
             connection_file = osp.join(get_ipython_dir(), 'profile_default',
-                                   'security', connection_file)
+                                       'security', connection_file)
             try:
                 os.remove(connection_file)
             except OSError:
                 pass
         atexit.register(cleanup_connection_file, connection_file)            
         
-        # Set tab name
+        # Set tab name according to kernel_id
         index = self.get_shell_index_from_id(id(kernel_widget))
-        match = re.match('^kernel-(\d+).json', connection_file)
-        if match is not None:  # should not fail, but we never know...
-            text = unicode(self.tabwidget.tabText(index))
-            name = "%s %s" % (text, match.groups()[0])
-            self.tabwidget.setTabText(index, name)
+        text = to_text_string(self.tabwidget.tabText(index))
+        name = "%s %s" % (text, kernel_id)
+        self.tabwidget.setTabText(index, name)
     
-    def create_ipyclient(self, connection_file, kernel_widget):
-        """Create a new IPython client connected to a kernel just started"""
-        self.set_ipykernel_attrs(connection_file, kernel_widget)
-        self.main.ipyconsole.new_client(connection_file, id(kernel_widget))
-        # QApplication.restoreOverrideCursor()  # Stop busy cursor indication
-        # QApplication.processEvents()
+    def register_ipyclient(self, connection_file, ipyclient, kernel_widget):
+        """
+        Register `ipyclient` to be connected to `kernel_widget`
+        """
+        # Check if our client already has a connection_file and kernel_widget_id
+        # which means that we are asking for a kernel restart
+        cf = ipyclient.connection_file
+        kwid = ipyclient.kernel_widget_id
+        if cf is not None and kwid is not None:
+            restart_kernel = True
+        else:
+            restart_kernel = False
+        
+        # Setting kernel widget attributes
+        match = re.match('^kernel-(\d+).json', connection_file)
+        kernel_id = match.groups()[0]
+        self.set_ipykernel_attrs(connection_file, kernel_widget, kernel_id)
+        
+        # Creating the client
+        client_name = kernel_id + '/A'
+        ipyconsole = self.main.ipyconsole
+        ipyclient.connection_file = connection_file
+        ipyclient.kernel_widget_id = id(kernel_widget)
+        ipyconsole.register_client(ipyclient, client_name, restart_kernel)
         
     def open_file_in_spyder(self, fname, lineno):
         """Open file in Spyder's editor from remote process"""
@@ -1067,7 +1087,7 @@ class ExternalConsole(SpyderPluginWidget):
             index = self.tabwidget.currentIndex()
             fname = self.filenames[index]
             if fname:
-                title += ' - '+unicode(fname)
+                title += ' - ' + to_text_string(fname)
         return title
     
     def get_plugin_icon(self):
@@ -1084,29 +1104,29 @@ class ExternalConsole(SpyderPluginWidget):
     def get_plugin_actions(self):
         """Return a list of actions related to plugin"""
         interpreter_action = create_action(self,
-                            _("Open a Python &interpreter"), None,
+                            _("Open a &Python console"), None,
                             'python.png', triggered=self.open_interpreter)
         if os.name == 'nt':
             text = _("Open &command prompt")
             tip = _("Open a Windows command prompt")
         else:
-            text = _("Open &terminal")
-            tip = _("Open a terminal window inside Spyder")
-        terminal_action = create_action(self, text, None, 'cmdprompt.png', tip,
+            text = _("Open a &terminal")
+            tip = _("Open a terminal window")
+        terminal_action = create_action(self, text, None, None, tip,
                                         triggered=self.open_terminal)
         run_action = create_action(self,
                             _("&Run..."), None,
                             'run_small.png', _("Run a Python script"),
                             triggered=self.run_script)
 
-        interact_menu_actions = [interpreter_action]
+        consoles_menu_actions = [interpreter_action]
         tools_menu_actions = [terminal_action]
         self.menu_actions = [interpreter_action, terminal_action, run_action]
         
-        self.main.interact_menu_actions += interact_menu_actions
+        self.main.consoles_menu_actions += consoles_menu_actions
         self.main.tools_menu_actions += tools_menu_actions
         
-        return self.menu_actions+interact_menu_actions+tools_menu_actions
+        return self.menu_actions+consoles_menu_actions+tools_menu_actions
     
     def register_plugin(self):
         """Register plugin in Spyder's main window"""
@@ -1123,7 +1143,7 @@ class ExternalConsole(SpyderPluginWidget):
                          self.main.editor.load)
             self.connect(self, SIGNAL("edit_goto(QString,int,QString,bool)"),
                          lambda fname, lineno, word, processevents:
-                         self.main.editor.load(fname,lineno,word,
+                         self.main.editor.load(fname, lineno, word,
                                                processevents=processevents))
             self.connect(self.main.editor,
                          SIGNAL('run_in_current_extconsole(QString,QString,QString,bool)'),
@@ -1210,67 +1230,43 @@ class ExternalConsole(SpyderPluginWidget):
         """Open an interpreter or an IPython kernel at startup"""
         if self.get_option('open_python_at_startup', True):
             self.open_interpreter()
-        if CONF.get('ipython_console', 'open_ipython_at_startup', False):
-            if self.main.ipyconsole is None:
-                suffix = SUPPORTED_IPYTHON.replace(';', _(' and ')
-                                         ).replace('<', '<'
-                                         ).replace('>', '>')
-                if programs.is_module_installed('IPython'):
-                    import IPython
-                    suffix += _('<br><u>Installed version</u>: %s'
-                                ) % IPython.__version__
-                QMessageBox.critical(self, _('IPython console'),
-                    _("Unable to open IPython console because no supported "
-                      "IPython version was found.<br><br>"
-                      "<u>Supported IPython versions</u>: %s") % suffix,
-                    QMessageBox.Ok)
-                if not self.get_option('open_python_at_startup'):
-                    self.open_interpreter()
-            else:
-                self.start_ipykernel()
 
     def open_interpreter(self, wdir=None):
         """Open interpreter"""
         if wdir is None:
-            wdir = os.getcwdu()
+            wdir = getcwd()
         if not self.main.light:
             self.visibility_changed(True)
-        self.start(fname=None, wdir=unicode(wdir), args='',
+        self.start(fname=None, wdir=to_text_string(wdir), args='',
                    interact=True, debug=False, python=True)
-        
-    def start_ipykernel(self, wdir=None, create_client=True):
+    
+    def start_ipykernel(self, client, wdir=None):
         """Start new IPython kernel"""
-        if create_client and not self.get_option('monitor/enabled'):
+        if not self.get_option('monitor/enabled'):
             QMessageBox.warning(self, _('Open an IPython console'),
                 _("The console monitor was disabled: the IPython kernel will "
                   "be started as expected, but an IPython console will have "
                   "to be connected manually to the kernel."), QMessageBox.Ok)
         
-        # Add a WaitCursor visual indication, because it takes too much time
-        # to display a new console (3 to 5 secs). It's stopped in
-        # create_ipyclient
-        # QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
-        # QApplication.processEvents()
-        
         if wdir is None:
-            wdir = os.getcwdu()
+            wdir = getcwd()
         self.main.ipyconsole.visibility_changed(True)
-        self.start(fname=None, wdir=unicode(wdir), args='',
-                   interact=True, debug=False, python=True,
-                   ipykernel=True, ipyclient=create_client)
+        self.start(fname=None, wdir=to_text_string(wdir), args='',
+                   interact=True, debug=False, python=True, ipykernel=True,
+                   ipyclient=client)
 
     def open_terminal(self, wdir=None):
         """Open terminal"""
         if wdir is None:
-            wdir = os.getcwdu()
-        self.start(fname=None, wdir=unicode(wdir), args='',
+            wdir = getcwd()
+        self.start(fname=None, wdir=to_text_string(wdir), args='',
                    interact=True, debug=False, python=False)
         
     def run_script(self):
         """Run a Python script"""
         self.emit(SIGNAL('redirect_stdio(bool)'), False)
         filename, _selfilter = getopenfilename(self, _("Run Python script"),
-                os.getcwdu(), _("Python scripts")+" (*.py ; *.pyw ; *.ipy)")
+                getcwd(), _("Python scripts")+" (*.py ; *.pyw ; *.ipy)")
         self.emit(SIGNAL('redirect_stdio(bool)'), True)
         if filename:
             self.start(fname=filename, wdir=None, args='',
@@ -1284,7 +1280,7 @@ class ExternalConsole(SpyderPluginWidget):
                                   QLineEdit.Normal,
                                   ", ".join(self.get_option('umd/namelist')))
         if valid:
-            arguments = unicode(arguments)
+            arguments = to_text_string(arguments)
             if arguments:
                 namelist = arguments.replace(' ', '').split(',')
                 fixed_namelist = [module_name for module_name in namelist
@@ -1305,7 +1301,7 @@ class ExternalConsole(SpyderPluginWidget):
         
     def go_to_error(self, text):
         """Go to error if relevant"""
-        match = get_error_match(unicode(text))
+        match = get_error_match(to_text_string(text))
         if match:
             fname, lnb = match.groups()
             self.emit(SIGNAL("edit_goto(QString,int,QString)"),
@@ -1320,7 +1316,8 @@ class ExternalConsole(SpyderPluginWidget):
             if mimedata2url(source):
                 pathlist = mimedata2url(source)
                 shellwidget = self.tabwidget.currentWidget()
-                if all([is_python_script(unicode(qstr)) for qstr in pathlist]):
+                if all([is_python_script(to_text_string(qstr))
+                        for qstr in pathlist]):
                     event.acceptProposedAction()
                 elif shellwidget is None or not shellwidget.is_running():
                     event.ignore()
@@ -1338,13 +1335,14 @@ class ExternalConsole(SpyderPluginWidget):
         shellwidget = self.tabwidget.currentWidget()
         if source.hasText():
             qstr = source.text()
-            if is_python_script(unicode(qstr)):
+            if is_python_script(to_text_string(qstr)):
                 self.start(qstr)
             elif shellwidget:
                 shellwidget.shell.insert_text(qstr)
         elif source.hasUrls():
             pathlist = mimedata2url(source)
-            if all([is_python_script(unicode(qstr)) for qstr in pathlist]):
+            if all([is_python_script(to_text_string(qstr)) 
+                    for qstr in pathlist]):
                 for fname in pathlist:
                     self.start(fname)
             elif shellwidget:
diff --git a/spyderlib/plugins/findinfiles.py b/spyderlib/plugins/findinfiles.py
index 38f7937..8b9e160 100644
--- a/spyderlib/plugins/findinfiles.py
+++ b/spyderlib/plugins/findinfiles.py
@@ -11,8 +11,6 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-import os
-
 from spyderlib.qt.QtGui import QApplication
 from spyderlib.qt.QtCore import SIGNAL, Signal
 
@@ -21,6 +19,7 @@ from spyderlib.baseconfig import _
 from spyderlib.utils.qthelpers import create_action
 from spyderlib.widgets.findinfiles import FindInFilesWidget
 from spyderlib.plugins import SpyderPluginMixin
+from spyderlib.py3compat import getcwd
 
 
 class FindInFiles(FindInFilesWidget, SpyderPluginMixin):
@@ -66,7 +65,7 @@ class FindInFiles(FindInFilesWidget, SpyderPluginMixin):
     
     def refreshdir(self):
         """Refresh search directory"""
-        self.find_options.set_directory(os.getcwdu())
+        self.find_options.set_directory(getcwd())
 
     def findinfiles_callback(self):
         """Find in files callback"""
diff --git a/spyderlib/plugins/history.py b/spyderlib/plugins/history.py
index 7faf394..94db91d 100644
--- a/spyderlib/plugins/history.py
+++ b/spyderlib/plugins/history.py
@@ -23,9 +23,13 @@ from spyderlib.widgets.tabs import Tabs
 from spyderlib.widgets.sourcecode import codeeditor
 from spyderlib.widgets.findreplace import FindReplace
 from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
+from spyderlib.py3compat import to_text_string, is_text_string
 
 
 class HistoryConfigPage(PluginConfigPage):
+    def get_icon(self):
+        return get_icon('history24.png')
+    
     def setup_page(self):
         settings_group = QGroupBox(_("Settings"))
         hist_spin = self.create_spinbox(
@@ -41,7 +45,7 @@ class HistoryConfigPage(PluginConfigPage):
                                     text=_("Font style"),
                                     fontfilters=QFontComboBox.MonospacedFonts)
         names = CONF.get('color_schemes', 'names')
-        choices = zip(names, names)
+        choices = list(zip(names, names))
         cs_combo = self.create_combobox(_("Syntax color scheme: "),
                                         choices, 'color_scheme_name')
 
@@ -154,7 +158,7 @@ class HistoryLog(SpyderPluginWidget):
         self.wrap_action.setChecked( self.get_option('wrap') )
         self.menu_actions = [history_action, font_action, self.wrap_action]
         return self.menu_actions
-    
+
     def on_first_registration(self):
         """Action to be performed on first plugin registration"""
         self.main.tabify_plugins(self.main.extconsole, self)
@@ -243,9 +247,9 @@ class HistoryLog(SpyderPluginWidget):
         Slot for SIGNAL('append_to_history(QString,QString)')
         emitted by shell instance
         """
-        if not isinstance(filename, basestring): # filename is a QString
-            filename = unicode(filename.toUtf8(), 'utf-8')
-        command = unicode(command)
+        if not is_text_string(filename): # filename is a QString
+            filename = to_text_string(filename.toUtf8(), 'utf-8')
+        command = to_text_string(command)
         index = self.filenames.index(filename)
         self.editors[index].append(command)
         if self.get_option('go_to_eof'):
diff --git a/spyderlib/plugins/inspector.py b/spyderlib/plugins/inspector.py
index 348b063..8ef8c9d 100644
--- a/spyderlib/plugins/inspector.py
+++ b/spyderlib/plugins/inspector.py
@@ -32,6 +32,7 @@ from spyderlib.widgets.findreplace import FindReplace
 from spyderlib.widgets.browser import WebView
 from spyderlib.widgets.externalshell.pythonshell import ExtPythonShellWidget
 from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
+from spyderlib.py3compat import to_text_string, get_meth_class_inst
 
 #XXX: Hardcoded dependency on optional IPython plugin component
 #     that requires the hack to make this work without IPython
@@ -70,7 +71,7 @@ class ObjectComboBox(EditableComboBox):
             qstr = self.currentText()
         if not re.search('^[a-zA-Z0-9_\.]*$', str(qstr), 0):
             return False
-        objtxt = unicode(qstr)
+        objtxt = to_text_string(qstr)
         if self.object_inspector.get_option('automatic_import'):
             shell = self.object_inspector.internal_shell
             if shell is not None:
@@ -95,7 +96,7 @@ class ObjectInspectorConfigPage(PluginConfigPage):
         sourcecode_group = QGroupBox(_("Source code"))
         wrap_mode_box = self.create_checkbox(_("Wrap lines"), 'wrap')
         names = CONF.get('color_schemes', 'names')
-        choices = zip(names, names)
+        choices = list(zip(names, names))
         cs_combo = self.create_combobox(_("Syntax color scheme: "),
                                         choices, 'color_scheme_name')
 
@@ -221,32 +222,44 @@ class SphinxThread(QThread):
     
     Parameters
     ----------
-    text : dict
+    doc : dict
         A dict containing the doc string components to be rendered.
+        See spyderlib.utils.dochelpers.getdoc for description.
     html_text_no_doc : unicode
         Text to be rendered if doc string cannot be extracted.
     math_option : bool
         Use LaTeX math rendering.
         
     """
-    def __init__(self, text={}, html_text_no_doc='', math_option=False):
+    def __init__(self, html_text_no_doc=''):
         super(SphinxThread, self).__init__()
-        self.text = text
         self.html_text_no_doc = html_text_no_doc
-        self.math_option = math_option
+        self.doc = {}
+        self.math_option = False
+        
+    def render(self, doc, math_option=False):
+        """Start thread to render given doc string dictionary"""
+        # If the thread is already running wait for it to finish before
+        # starting it again.
+        if self.wait():
+            self.doc = doc
+            self.math_option = math_option
+            # This causes run() to be executed in separate thread
+            self.start()
 
     def run(self):
         html_text = self.html_text_no_doc
-        text = self.text
-        if text is not None and text['docstring'] != '':
+        doc = self.doc
+        if doc is not None and doc['docstring'] != '':
             try:
-                context = generate_context(name=text['name'],
-                                           argspec=text['argspec'],
-                                           note=text['note'],
+                context = generate_context(name=doc['name'],
+                                           argspec=doc['argspec'],
+                                           note=doc['note'],
                                            math=self.math_option)
-                html_text = sphinxify(text['docstring'], context)
-            except Exception, error:
-                self.emit(SIGNAL('error_msg(QString)'), unicode(error))
+                html_text = sphinxify(doc['docstring'], context)
+            except Exception as error:
+                self.emit(SIGNAL('error_msg(QString)'),
+                          to_text_string(error))
                 return
         self.emit(SIGNAL('html_ready(QString)'), html_text)
 
@@ -257,7 +270,7 @@ class ObjectInspector(SpyderPluginWidget):
     """
     CONF_SECTION = 'inspector'
     CONFIGWIDGET_CLASS = ObjectInspectorConfigPage
-    LOG_PATH = get_conf_path('.inspector')
+    LOG_PATH = get_conf_path(CONF_SECTION)
     def __init__(self, parent):
         SpyderPluginWidget.__init__(self, parent)
         
@@ -300,7 +313,7 @@ class ObjectInspector(SpyderPluginWidget):
         # locked = disable link with Console
         self.locked = False
         self._last_texts = [None, None]
-        self._last_rope_data = None
+        self._last_rope_doc = None
         
         # Object name
         layout_edit = QHBoxLayout()
@@ -396,9 +409,8 @@ class ObjectInspector(SpyderPluginWidget):
         if sphinxify is None:
             self._sphinx_thread = None
         else:
-            self._sphinx_thread = SphinxThread(text={},
-                                  html_text_no_doc=warning(self.no_doc_string),
-                                  math_option=self.get_option('math'))
+            self._sphinx_thread = SphinxThread(
+                                  html_text_no_doc=warning(self.no_doc_string))
             self.connect(self._sphinx_thread, SIGNAL('html_ready(QString)'), 
                          self._on_sphinx_thread_html_ready)
             self.connect(self._sphinx_thread, SIGNAL('error_msg(QString)'),
@@ -443,8 +455,8 @@ class ObjectInspector(SpyderPluginWidget):
         """Refresh widget"""
         if self._starting_up:
             self._starting_up = False
-            QTimer.singleShot(5000, self.refresh_plugin)
-        self.set_object_text(None, force_refresh=False)
+            # TODO: Change this to render a simple intro page
+            self.set_object_text('', force_refresh=False)
 
     def apply_plugin_settings(self, options):
         """Apply configuration file's plugin settings"""
@@ -517,7 +529,7 @@ class ObjectInspector(SpyderPluginWidget):
             func = cb[0]
             args = cb[1:]
             func(*args)
-            if func.im_self is self.rich_text:
+            if get_meth_class_inst(func) is self.rich_text:
                 self.switch_to_rich_text()
             else:
                 self.switch_to_plain_text()
@@ -625,9 +637,8 @@ class ObjectInspector(SpyderPluginWidget):
     def force_refresh(self):
         if self.source_is_console():
             self.set_object_text(None, force_refresh=True)
-        elif self._last_rope_data is not None:
-            text = self._last_rope_data
-            self.set_rope_doc(text, force_refresh=True)
+        elif self._last_rope_doc is not None:
+            self.set_rope_doc(self._last_rope_doc, force_refresh=True)
     
     def set_object_text(self, text, force_refresh=False, ignore_unknown=False):
         """Set object analyzed by Object Inspector"""
@@ -638,7 +649,7 @@ class ObjectInspector(SpyderPluginWidget):
 
         add_to_combo = True
         if text is None:
-            text = unicode(self.combo.currentText())
+            text = to_text_string(self.combo.currentText())
             add_to_combo = False
             
         found = self.show_help(text, ignore_unknown=ignore_unknown)
@@ -655,27 +666,27 @@ class ObjectInspector(SpyderPluginWidget):
         if self.dockwidget is not None:
             self.dockwidget.blockSignals(False)
         
-    def set_rope_doc(self, text, force_refresh=False):
+    def set_rope_doc(self, doc, force_refresh=False):
         """
-        Use the object inspector to show text computed with rope from the
-        Editor plugin
+        Use the object inspector to show docstring dictionary computed
+        with rope from the Editor plugin
         """
         if (self.locked and not force_refresh):
             return
         self.switch_to_editor_source()
         
-        self._last_rope_data = text
+        self._last_rope_doc = doc
         
-        self.object_edit.setText(text['obj_text'])
+        self.object_edit.setText(doc['obj_text'])
         
         if self.rich_help:
-            self.set_sphinx_text(text)
+            self.render_sphinx_doc(doc)
         else:
-            self.set_plain_text(text, is_code=False)
+            self.set_plain_text(doc, is_code=False)
         
         if self.dockwidget is not None:
             self.dockwidget.blockSignals(True)
-        self.__eventually_raise_inspector(text['docstring'],
+        self.__eventually_raise_inspector(doc['docstring'],
                                           force=force_refresh)
         if self.dockwidget is not None:
             self.dockwidget.blockSignals(False)
@@ -698,17 +709,17 @@ class ObjectInspector(SpyderPluginWidget):
     def load_history(self, obj=None):
         """Load history from a text file in user home directory"""
         if osp.isfile(self.LOG_PATH):
-            history = [line.replace('\n','')
-                       for line in file(self.LOG_PATH, 'r').readlines()]
+            history = [line.replace('\n', '')
+                       for line in open(self.LOG_PATH, 'r').readlines()]
         else:
             history = []
         return history
     
     def save_history(self):
         """Save history to a text file in user home directory"""
-        file(self.LOG_PATH, 'w').write("\n".join( \
-            [ unicode( self.combo.itemText(index) )
-                for index in range(self.combo.count()) ] ))
+        open(self.LOG_PATH, 'w').write("\n".join( \
+                [to_text_string(self.combo.itemText(index))
+                 for index in range(self.combo.count())] ))
         
     def toggle_plain_text(self, checked):
         """Toggle plain text docstring"""
@@ -731,7 +742,6 @@ class ObjectInspector(SpyderPluginWidget):
         if checked:
             self.docstring = not checked
             self.switch_to_rich_text()
-            self.force_refresh()
         self.set_option('rich_mode', checked)
         
     def toggle_auto_import(self, checked):
@@ -778,15 +788,10 @@ class ObjectInspector(SpyderPluginWidget):
                 self.shell = self.internal_shell
         return self.shell
         
-    def set_sphinx_text(self, text):
-        """Sphinxify text and display it"""
-        # If the thread is already running wait for it to finish before
-        # starting it again.
-        if self._sphinx_thread.wait():
-            # Math rendering option could have changed
-            self._sphinx_thread.math_option = self.get_option('math')
-            self._sphinx_thread.text = text
-            self._sphinx_thread.start()
+    def render_sphinx_doc(self, doc):
+        """Transform doc string dictionary to HTML and show it"""
+        # Math rendering option could have changed
+        self._sphinx_thread.render(doc, self.get_option('math'))
         
     def _on_sphinx_thread_html_ready(self, html_text):
         """Set our sphinx documentation based on thread result"""
@@ -808,7 +813,7 @@ class ObjectInspector(SpyderPluginWidget):
         shell = self.get_shell()
         if shell is None:
             return
-        obj_text = unicode(obj_text)
+        obj_text = to_text_string(obj_text)
         
         if not shell.is_defined(obj_text):
             if self.get_option('automatic_import') and\
@@ -816,26 +821,24 @@ class ObjectInspector(SpyderPluginWidget):
                 shell = self.internal_shell
             else:
                 shell = None
-                doc_text = None
+                doc = None
                 source_text = None
             
         if shell is not None:
-            doc_text = shell.get_doc(obj_text)
-            if isinstance(doc_text, bool):
-                doc_text = None
+            doc = shell.get_doc(obj_text)
             source_text = shell.get_source(obj_text)
             
         is_code = False
         
         if self.rich_help:
-            self.set_sphinx_text(doc_text)
+            self.render_sphinx_doc(doc)
             if ignore_unknown:
-                return doc_text is not None
+                return doc is not None
             else:
                 return True
         
         elif self.docstring:
-            hlp_text = doc_text
+            hlp_text = doc
             if hlp_text is None:
                 hlp_text = source_text
                 if hlp_text is None:
@@ -845,7 +848,7 @@ class ObjectInspector(SpyderPluginWidget):
         else:
             hlp_text = source_text
             if hlp_text is None:
-                hlp_text = doc_text
+                hlp_text = doc
                 if hlp_text is None:
                     hlp_text = _("No source code available.")
                     if ignore_unknown:
diff --git a/spyderlib/plugins/ipythonconsole.py b/spyderlib/plugins/ipythonconsole.py
index a04b3f9..457b573 100644
--- a/spyderlib/plugins/ipythonconsole.py
+++ b/spyderlib/plugins/ipythonconsole.py
@@ -14,18 +14,18 @@ Handles IPython clients (and in the future, will handle IPython kernels too
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from spyderlib.qt.QtGui import (QVBoxLayout, QMessageBox, QWidget, QGroupBox,
-                                QLineEdit, QInputDialog, QTabWidget, QMenu,
-                                QFontComboBox, QHBoxLayout, QApplication,
-                                QToolButton, QLabel, QKeySequence)
+# Qt imports
+from spyderlib.qt.QtGui import (QVBoxLayout, QMessageBox, QGroupBox, QLineEdit,
+                                QInputDialog, QTabWidget, QFontComboBox,
+                                QApplication, QLabel)
 from spyderlib.qt.QtCore import SIGNAL, Qt, QUrl
 
+# Stdlib imports
 import sys
 import re
-import os
 import os.path as osp
-import time
 
+# IPython imports
 from IPython.config.loader import Config, load_pyconfig_files
 from IPython.core.application import get_ipython_dir
 from IPython.lib.kernel import find_connection_file, get_connection_info
@@ -36,16 +36,15 @@ except ImportError:
     
 # Local imports
 from spyderlib import dependencies
-from spyderlib.baseconfig import get_conf_path, _
-from spyderlib.utils import programs
+from spyderlib.baseconfig import _
 from spyderlib.utils.misc import get_error_match, remove_backslashes
-from spyderlib.utils.qthelpers import (get_icon, get_std_icon, create_action,
-                                       create_toolbutton, add_actions)
+from spyderlib.utils import programs
+from spyderlib.utils.qthelpers import get_icon, create_action
 from spyderlib.widgets.tabs import Tabs
-from spyderlib.widgets.ipython import SpyderIPythonWidget
+from spyderlib.widgets.ipython import IPythonClient
 from spyderlib.widgets.findreplace import FindReplace
 from spyderlib.plugins import SpyderPluginWidget, PluginConfigPage
-from spyderlib.widgets.mixins import SaveHistoryMixin
+from spyderlib.py3compat import to_text_string, u
 
 
 SYMPY_REQVER = '>=0.7.0'
@@ -379,259 +378,6 @@ class IPythonConsoleConfigPage(PluginConfigPage):
         self.setLayout(vlayout)
 
 
-class IPythonClient(QWidget, SaveHistoryMixin):
-    """
-    Spyder IPython client or frontend.
-
-    This is a layer on top of the IPython Qt widget (i.e. RichIPythonWidget +
-    our additions = SpyderIPythonWidget), which becomes the ipywidget attribute
-    of this class. We are doing this for several reasons:
-
-    1. To add more variables and methods needed to connect the widget to other
-       Spyder plugins and also increase its funcionality.
-    2. To make it clear what has been added by us to IPython widgets.
-    3. To avoid possible name conflicts between our widgets and theirs (e.g.
-       self.history and self._history, respectively)
-    """
-    
-    CONF_SECTION = 'ipython'
-    SEPARATOR = '%s##---(%s)---' % (os.linesep*2, time.ctime())
-    
-    def __init__(self, plugin, connection_file, kernel_widget_id, client_name,
-                 ipywidget, history_filename, menu_actions=None):
-        super(IPythonClient, self).__init__(plugin)
-        SaveHistoryMixin.__init__(self)
-        self.options_button = None
-
-        self.connection_file = connection_file
-        self.kernel_widget_id = kernel_widget_id
-        self.client_name = client_name        
-        self.ipywidget = ipywidget
-        self.menu_actions = menu_actions
-        self.history_filename = get_conf_path(history_filename)
-        self.history = []
-        self.namespacebrowser = None
-        
-        vlayout = QVBoxLayout()
-        toolbar_buttons = self.get_toolbar_buttons()
-        hlayout = QHBoxLayout()
-        for button in toolbar_buttons:
-            hlayout.addWidget(button)
-        vlayout.addLayout(hlayout)
-        vlayout.setContentsMargins(0, 0, 0, 0)
-        vlayout.addWidget(self.ipywidget)
-        self.setLayout(vlayout)
-        
-        self.exit_callback = lambda: plugin.close_console(client=self)
-
-        # Connect the IPython widget to this IPython client:
-        # (see spyderlib/widgets/ipython.py for more details about this)
-        ipywidget.set_ipyclient(self)
-        
-        # To save history
-        self.ipywidget.executing.connect(
-                                      lambda c: self.add_to_history(command=c))
-        
-        # To update history after execution
-        self.ipywidget.executed.connect(self.update_history)
-        
-        # To update the Variable Explorer after execution
-        self.ipywidget.executed.connect(self.auto_refresh_namespacebrowser)
-        
-    #------ Public API --------------------------------------------------------
-    def get_name(self):
-        """Return client name"""
-        return _("Console") + " " + self.client_name
-    
-    def get_control(self):
-        """Return the text widget (or similar) to give focus to"""
-        # page_control is the widget used for paging
-        page_control = self.ipywidget._page_control
-        if page_control and page_control.isVisible():
-            return page_control
-        else:
-            return self.ipywidget._control
-
-    def get_options_menu(self):
-        """Return options menu"""
-        # Kernel
-        self.interrupt_action = create_action(self, _("Interrupt kernel"),
-                                              icon=get_icon('terminate.png'),
-                                              triggered=self.interrupt_kernel)
-        self.restart_action = create_action(self, _("Restart kernel"),
-                                            icon=get_icon('restart.png'),
-                                            triggered=self.restart_kernel)
-        
-        # Help
-        self.intro_action = create_action(self, _("Intro to IPython"),
-                                          triggered=self._show_intro)
-        self.quickref_action = create_action(self, _("Quick Reference"),
-                                             triggered=self._show_quickref)
-        self.guiref_action = create_action(self, _("Console help"),
-                                           triggered=self._show_guiref)                    
-        help_menu = QMenu(_("Help"), self)
-        help_action = create_action(self, _("IPython Help"),
-                                    icon=get_std_icon('DialogHelpButton'))
-        help_action.setMenu(help_menu)
-        add_actions(help_menu, (self.intro_action, self.guiref_action,
-                                self.quickref_action))
-        
-        # Main menu
-        if self.menu_actions is not None:
-            actions = [self.interrupt_action, self.restart_action, None] +\
-                      self.menu_actions + [None, help_menu]
-        else:
-            actions = [self.interrupt_action, self.restart_action, None,
-                       help_menu]
-        return actions
-    
-    def get_toolbar_buttons(self):
-        """Return toolbar buttons list"""
-        #TODO: Eventually add some buttons (Empty for now)
-        # (see for example: spyderlib/widgets/externalshell/baseshell.py)
-        buttons = []
-        if self.options_button is None:
-            options = self.get_options_menu()
-            if options:
-                self.options_button = create_toolbutton(self,
-                        text=_("Options"), icon=get_icon('tooloptions.png'))
-                self.options_button.setPopupMode(QToolButton.InstantPopup)
-                menu = QMenu(self)
-                add_actions(menu, options)
-                self.options_button.setMenu(menu)
-        if self.options_button is not None:
-            buttons.append(self.options_button)
-        return buttons
-    
-    def add_actions_to_context_menu(self, menu):
-        """Add actions to IPython widget context menu"""
-        # See spyderlib/widgets/ipython.py for more details on this method
-        inspect_action = create_action(self, _("Inspect current object"),
-                                    QKeySequence("Ctrl+I"),
-                                    icon=get_std_icon('MessageBoxInformation'),
-                                    triggered=self.inspect_object)
-        clear_line_action = create_action(self, _("Clear line or block"),
-                                          QKeySequence("Shift+Escape"),
-                                          icon=get_icon('eraser.png'),
-                                          triggered=self.clear_line)
-        clear_console_action = create_action(self, _("Clear console"),
-                                             QKeySequence("Ctrl+L"),
-                                             icon=get_icon('clear.png'),
-                                             triggered=self.clear_console)
-        quit_action = create_action(self, _("&Quit"), icon='exit.png',
-                                    triggered=self.exit_callback)
-        add_actions(menu, (None, inspect_action, clear_line_action,
-                           clear_console_action, None, quit_action))
-        return menu
-    
-    def set_font(self, font):
-        """Set IPython widget's font"""
-        self.ipywidget.font = font
-    
-    def interrupt_kernel(self):
-        """Interrupt the associanted Spyder kernel if it's running"""
-        self.ipywidget.request_interrupt_kernel()
-    
-    def restart_kernel(self):
-        """Restart the associanted Spyder kernel"""
-        self.ipywidget.request_restart_kernel()
-    
-    def inspect_object(self):
-        """Show how to inspect an object with our object inspector"""
-        self.ipywidget._control.inspect_current_object()
-    
-    def clear_line(self):
-        """Clear a console line"""
-        self.ipywidget._keyboard_quit()
-    
-    def clear_console(self):
-        """Clear the whole console"""
-        self.ipywidget.execute("%clear")
-    
-    def if_kernel_dies(self, t):
-        """
-        Show a message in the console if the kernel dies.
-        t is the time in seconds between the death and showing the message.
-        """
-        message = _("It seems the kernel died unexpectedly. Use "
-                    "'Restart kernel' to continue using this console.")
-        self.ipywidget._append_plain_text(message + '\n')
-    
-    def update_history(self):
-        self.history = self.ipywidget._history
-    
-    def interrupt_message(self):
-        """
-        Print an interrupt message when the client is connected to an external
-        kernel
-        """
-        message = _("Kernel process is either remote or unspecified. "
-                    "Cannot interrupt")
-        QMessageBox.information(self, "IPython", message)
-    
-    def restart_message(self):
-        """
-        Print a restart message when the client is connected to an external
-        kernel
-        """
-        message = _("Kernel process is either remote or unspecified. "
-                    "Cannot restart.")
-        QMessageBox.information(self, "IPython", message)
-
-    def set_namespacebrowser(self, namespacebrowser):
-        """Set namespace browser widget"""
-        self.namespacebrowser = namespacebrowser
-
-    def auto_refresh_namespacebrowser(self):
-        """Refresh namespace browser"""
-        if self.namespacebrowser:
-            self.namespacebrowser.refresh_table()
-    
-    #------ Private API -------------------------------------------------------
-    def _show_rich_help(self, text):
-        """Use our Object Inspector to show IPython help texts in rich mode"""
-        from spyderlib.utils.inspector import sphinxify as spx
-        
-        context = spx.generate_context(name='', argspec='', note='',
-                                       math=False)
-        html_text = spx.sphinxify(text, context)
-        inspector = self.get_control().inspector
-        inspector.switch_to_rich_text()
-        inspector.set_rich_text_html(html_text,
-                                     QUrl.fromLocalFile(spx.CSS_PATH))
-    
-    def _show_plain_help(self, text):
-        """Use our Object Inspector to show IPython help texts in plain mode"""
-        inspector = self.get_control().inspector
-        inspector.switch_to_plain_text()
-        inspector.set_plain_text(text, is_code=False)
-    
-    def _show_intro(self):
-        """Show intro to IPython help"""
-        from IPython.core.usage import interactive_usage
-        self._show_rich_help(interactive_usage)
-    
-    def _show_guiref(self):
-        """Show qtconsole help"""
-        from IPython.core.usage import gui_reference
-        self._show_rich_help(gui_reference)
-    
-    def _show_quickref(self):
-        """Show IPython Cheat Sheet"""
-        from IPython.core.usage import quick_reference
-        self._show_plain_help(quick_reference)
-    
-    #---- Qt methods ----------------------------------------------------------
-    def closeEvent(self, event):
-        """Reimplement Qt method to stop sending the custom_restart_kernel_died
-        signal"""
-        if programs.is_module_installed('IPython', '>=1.0'):
-            kc = self.ipywidget.kernel_client
-            kc.hb_channel.pause()
-        else:
-            self.ipywidget.custom_restart = False
-
-
 class IPythonConsole(SpyderPluginWidget):
     """
     IPython Console plugin
@@ -714,7 +460,7 @@ class IPythonConsole(SpyderPluginWidget):
 
     def run_script_in_current_client(self, filename, wdir, args, debug):
         """Run script in current client, if any"""
-        norm = lambda text: remove_backslashes(unicode(text))
+        norm = lambda text: remove_backslashes(to_text_string(text))
         client = self.get_current_client()
         if client is not None:
             # Internal kernels, use runfile
@@ -730,7 +476,7 @@ class IPythonConsole(SpyderPluginWidget):
                 line = "%run "
                 if debug:
                     line += "-d "
-                line += "\"%s\"" % unicode(filename)
+                line += "\"%s\"" % to_text_string(filename)
                 if args:
                     line += " %s" % norm(args)
             self.execute_python_code(line)
@@ -746,7 +492,7 @@ class IPythonConsole(SpyderPluginWidget):
     def execute_python_code(self, lines):
         client = self.get_current_client()
         if client is not None:
-            client.ipywidget.execute(unicode(lines))
+            client.ipywidget.execute(to_text_string(lines))
             self.activateWindow()
             client.get_control().setFocus()
 
@@ -754,24 +500,30 @@ class IPythonConsole(SpyderPluginWidget):
         client = self.get_current_client()
         if client is not None:
             client.ipywidget.write_to_stdin(line)
-    
+
+    def create_new_client(self):
+        """Create a new client"""
+        client = IPythonClient(self, history_filename='history.py',
+                               menu_actions=self.menu_actions)
+        self.add_tab(client, name=client.get_name())
+        self.main.extconsole.start_ipykernel(client)
+
     def get_plugin_actions(self):
         """Return a list of actions related to plugin"""
         create_client_action = create_action(self,
-                                _("Open an IPython console"),
+                                _("Open an &IPython console"),
                                 None, 'ipython_console.png',
-                                triggered=self.main.extconsole.start_ipykernel)
+                                triggered=self.create_new_client)
 
         connect_to_kernel_action = create_action(self,
-                _("Connect to an existing kernel"),
-                None, 'ipython_console.png',
-                _("Open a new IPython client connected to an external kernel"),
-                triggered=self.new_client)
+               _("Connect to an existing kernel"), None, None,
+               _("Open a new IPython console connected to an existing kernel"),
+               triggered=self.create_client_for_kernel)
         
-        # Add the action to the 'Interpreters' menu on the main window
-        interact_menu_actions = [create_client_action, None,
-                                 connect_to_kernel_action]
-        self.main.interact_menu_actions += interact_menu_actions
+        # Add the action to the 'Consoles' menu on the main window
+        main_consoles_menu = self.main.consoles_menu_actions
+        main_consoles_menu.insert(0, create_client_action)
+        main_consoles_menu += [None, connect_to_kernel_action]
         
         # Plugin actions
         self.menu_actions = [create_client_action, connect_to_kernel_action]
@@ -840,7 +592,7 @@ class IPythonConsole(SpyderPluginWidget):
         # Determine kernel version
         ci = get_connection_info(connection_file, unpack=True,
                                  profile='default')
-        if ci.has_key(u'control_port'):
+        if u('control_port') in ci:
             kernel_ver = '>=1.0'
         else:
             kernel_ver = '<1.0'
@@ -851,8 +603,6 @@ class IPythonConsole(SpyderPluginWidget):
     def create_kernel_manager_and_client(self, connection_file=None):
         """Create kernel manager and client"""
         cf = find_connection_file(connection_file, profile='default')
-        if not self.kernel_and_frontend_match(cf):
-            return None, None
         kernel_manager = QtKernelManager(connection_file=cf, config=None)
         if programs.is_module_installed('IPython', '>=1.0'):
             kernel_client = kernel_manager.client()
@@ -866,17 +616,38 @@ class IPythonConsole(SpyderPluginWidget):
             kernel_manager.start_channels()
         return kernel_manager, kernel_client
 
-    def new_ipywidget(self, connection_file=None, config=None):
+    def connect_client_to_kernel(self, client):
         """
-        Create and return a new IPyhon widget from a connection file basename
+        Connect a client to its kernel
         """
+        connection_file = client.connection_file
+        widget = client.ipywidget
         km, kc = self.create_kernel_manager_and_client(connection_file)
-        if (km, kc) == (None, None):
-            return None
-        widget = SpyderIPythonWidget(config=config, local_kernel=False)
         widget.kernel_manager = km
         widget.kernel_client = kc
-        return widget
+    
+    #------ Private API -------------------------------------------------------
+    def _show_rich_help(self, text):
+        """Use our Object Inspector to show IPython help texts in rich mode"""
+        from spyderlib.utils.inspector import sphinxify as spx
+        
+        context = spx.generate_context(name='', argspec='', note='',
+                                       math=False)
+        html_text = spx.sphinxify(text, context)
+        inspector = self.inspector
+        inspector.visibility_changed(True)
+        inspector.raise_()
+        inspector.switch_to_rich_text()
+        inspector.set_rich_text_html(html_text,
+                                     QUrl.fromLocalFile(spx.CSS_PATH))
+    
+    def _show_plain_help(self, text):
+        """Use our Object Inspector to show IPython help texts in plain mode"""
+        inspector = self.inspector
+        inspector.visibility_changed(True)
+        inspector.raise_()
+        inspector.switch_to_plain_text()
+        inspector.set_plain_text(text, is_code=False)
     
     #------ Public API --------------------------------------------------------
     def get_clients(self):
@@ -896,33 +667,36 @@ class IPythonConsole(SpyderPluginWidget):
             if widget is client or widget is client.get_control():
                 return client
 
-    def new_client(self, connection_file=None, kernel_widget_id=None):
-        """Create a new IPython client"""
-        cf = connection_file
-        if cf is None:
-            example = _('(for example: `kernel-3764.json`, or simply `3764`)')
-            while True:
-                cf, valid = QInputDialog.getText(self, _('IPython'),
-                              _('Provide an IPython kernel connection file:')+\
-                              '\n'+example,
-                              QLineEdit.Normal)
-                if valid:
-                    cf = str(cf)
-                    match = re.match('(kernel-|^)([a-fA-F0-9-]+)(.json|$)', cf)
+    def create_client_for_kernel(self):
+        """Create a client connected to an existing kernel"""
+        example = _("(for example: kernel-3764.json, or simply 3764)")
+        while True:
+            cf, valid = QInputDialog.getText(self, _('IPython'),
+                          _('Provide an IPython kernel connection file:')+\
+                          '\n'+example,
+                          QLineEdit.Normal)
+            if valid:
+                cf = str(cf)
+                match = re.match('(kernel-|^)([a-fA-F0-9-]+)(.json|$)', cf)
+                if match is not None:
                     kernel_num = match.groups()[1]
                     if kernel_num:
                         cf = 'kernel-%s.json' % kernel_num
                         break
-                else:
-                    return
+            else:
+                return
 
         # Generating the client name and setting kernel_widget_id
         match = re.match('^kernel-([a-fA-F0-9-]+).json', cf)
         count = 0
+        kernel_widget_id = None
         while True:
-            client_name = match.groups()[0]+'/'+chr(65+count)
+            client_name = match.groups()[0]
+            if '-' in client_name:  # Avoid long names
+                client_name = client_name.split('-')[0]
+            client_name = client_name + '/' + chr(65+count)
             for cl in self.get_clients():
-                if cl.client_name == client_name:
+                if cl.name == client_name:
                     kernel_widget_id = cl.kernel_widget_id
                     break
             else:
@@ -938,14 +712,33 @@ class IPythonConsole(SpyderPluginWidget):
                 if sw.connection_file == cf:
                     kernel_widget_id = id(sw)
 
-        # Creating the IPython client widget
+        # Verifying if the kernel exists
         try:
-            self.register_client(cf, kernel_widget_id, client_name)
+            find_connection_file(cf, profile='default')
         except (IOError, UnboundLocalError):
             QMessageBox.critical(self, _('IPython'),
-                                 _("Unable to connect to IPython kernel "
-                                   "<b>`%s`") % cf)
+                                 _("Unable to connect to IPython <b>%s") % cf)
+            return
+        
+        # Verifying if frontend and kernel have compatible versions
+        if not self.kernel_and_frontend_match(cf):
+            QMessageBox.critical(self,
+                                 _("Mismatch between kernel and frontend"),
+                                 _("Your IPython frontend and kernel versions "
+                                   "are <b>incompatible!!</b>"
+                                   "<br><br>"
+                                   "We're sorry but we can't create an IPython "
+                                   "console for you."
+                                ), QMessageBox.Ok)
             return
+        
+        # Creating the client
+        client = IPythonClient(self, history_filename='history.py',
+                               connection_file=cf,
+                               kernel_widget_id=kernel_widget_id,
+                               menu_actions=self.menu_actions)
+        self.add_tab(client, name=client.get_name())
+        self.register_client(client, client_name)
 
     def ipywidget_config(self):
         """Generate a Config instance for IPython widgets using our config
@@ -1004,31 +797,21 @@ class IPythonConsole(SpyderPluginWidget):
         # over IPython ones
         ip_cfg._merge(spy_cfg)
         return ip_cfg
-    
-    def register_client(self, connection_file, kernel_widget_id, client_name):
-        """Register new IPython client"""
 
-        ipywidget = self.new_ipywidget(connection_file,
-                                                config=self.ipywidget_config())
-        if ipywidget is None:
-            QMessageBox.critical(self,
-                                 _("Mismatch between kernel and frontend"),
-                                 _("Your IPython frontend and kernel versions "
-                                   "are <b>incompatible!!</b>"
-                                   "<br><br>"
-                                   "We're sorry but we can't create an IPython "
-                                   "console for you."
-                                ), QMessageBox.Ok)
+    def register_client(self, client, name, restart=False):
+        """Register new IPython client"""
+        self.connect_client_to_kernel(client)
+        client.show_ipywidget()
+        client.name = name
+        
+        # If we are restarting the kernel we just need to rename the client tab
+        if restart:
+            self.rename_ipyclient_tab(client)
             return
-
-        client = IPythonClient(self, connection_file, kernel_widget_id,
-                               client_name, ipywidget,
-                               history_filename='.history.py',
-                               menu_actions=self.menu_actions)
-
-        # QTextEdit Widgets
-        control = client.ipywidget._control
-        page_control = client.ipywidget._page_control
+        
+        ipywidget = client.ipywidget
+        control = ipywidget._control
+        page_control = ipywidget._page_control
         
         # For tracebacks
         self.connect(control, SIGNAL("go_to_error(QString)"), self.go_to_error)
@@ -1037,7 +820,7 @@ class IPythonConsole(SpyderPluginWidget):
         extconsoles = self.extconsole.shellwidgets
         kernel_widget = None
         if extconsoles:
-            if extconsoles[-1].connection_file == connection_file:
+            if extconsoles[-1].connection_file == client.connection_file:
                 kernel_widget = extconsoles[-1]
                 ipywidget.custom_interrupt_requested.connect(
                                               kernel_widget.keyboard_interrupt)
@@ -1047,7 +830,8 @@ class IPythonConsole(SpyderPluginWidget):
         
         # Handle kernel restarts asked by the user
         if kernel_widget is not None:
-            ipywidget.custom_restart_requested.connect(self.create_new_kernel)
+            ipywidget.custom_restart_requested.connect(
+                                 lambda cl=client: self.restart_kernel(client))
         else:
             ipywidget.custom_restart_requested.connect(client.restart_message)
         
@@ -1073,6 +857,7 @@ class IPythonConsole(SpyderPluginWidget):
             nsb.auto_refresh_button.setChecked(True)
             nsb.auto_refresh_button.setChecked(False)
             nsb.auto_refresh_button.setEnabled(False)
+            nsb.set_ipyclient(client)
             client.set_namespacebrowser(nsb)
         
         # Connect client to our history log
@@ -1085,7 +870,6 @@ class IPythonConsole(SpyderPluginWidget):
         client.set_font( self.get_plugin_font() )
         
         # Add tab and connect focus signal to client's control widget
-        self.add_tab(client, name=client.get_name())
         self.connect(control, SIGNAL('focus_changed()'),
                      lambda: self.emit(SIGNAL('focus_changed()')))
         
@@ -1101,6 +885,13 @@ class IPythonConsole(SpyderPluginWidget):
                          self.refresh_plugin)
             self.connect(page_control, SIGNAL('show_find_widget()'),
                          self.find_widget.show)
+
+        # Update client name
+        self.rename_ipyclient_tab(client)
+    
+    def open_client_at_startup(self):
+        if self.get_option('open_ipython_at_startup', False):
+            self.create_new_client()
     
     def close_related_ipyclients(self, client):
         """Close all IPython clients related to *client*, except itself"""
@@ -1178,67 +969,59 @@ class IPythonConsole(SpyderPluginWidget):
         
     def go_to_error(self, text):
         """Go to error if relevant"""
-        match = get_error_match(unicode(text))
+        match = get_error_match(to_text_string(text))
         if match:
             fname, lnb = match.groups()
             self.emit(SIGNAL("edit_goto(QString,int,QString)"),
                       osp.abspath(fname), int(lnb), '')
     
+    def show_intro(self):
+        """Show intro to IPython help"""
+        from IPython.core.usage import interactive_usage
+        self._show_rich_help(interactive_usage)
+    
+    def show_guiref(self):
+        """Show qtconsole help"""
+        from IPython.core.usage import gui_reference
+        self._show_rich_help(gui_reference)
+    
+    def show_quickref(self):
+        """Show IPython Cheat Sheet"""
+        from IPython.core.usage import quick_reference
+        self._show_plain_help(quick_reference)
+    
     def get_client_index_from_id(self, client_id):
         """Return client index from id"""
         for index, client in enumerate(self.clients):
             if id(client) == client_id:
                 return index
     
-    def rename_ipyclient_tab(self, connection_file, client_widget_id):
+    def rename_ipyclient_tab(self, client):
         """Add the pid of the kernel process to an IPython client tab"""
-        index = self.get_client_index_from_id(client_widget_id)
-        match = re.match('^kernel-(\d+).json', connection_file)
-        if match is not None:  # should not fail, but we never know...
-            name = _("Console") + " " + match.groups()[0] + '/' + chr(65)
-            self.tabwidget.setTabText(index, name)
+        index = self.get_client_index_from_id(id(client))
+        self.tabwidget.setTabText(index, client.get_name())
     
-    def create_new_kernel(self):
-        """Create a new kernel if the user asks for it"""
+    def restart_kernel(self, client):
+        """
+        Create a new kernel and connect it to `client` if the user asks for it
+        """
         # Took this bit of code (until if result == ) from the IPython project
-        # (frontend/qt/frontend_widget.py - restart_kernel).
+        # (qt/frontend_widget.py - restart_kernel).
         # Licensed under the BSD license
         message = _('Are you sure you want to restart the kernel?')
         buttons = QMessageBox.Yes | QMessageBox.No
         result = QMessageBox.question(self, _('Restart kernel?'),
                                       message, buttons)
         if result == QMessageBox.Yes:
-            self.extconsole.start_ipykernel(create_client=False)
-            kernel_widget = self.extconsole.shellwidgets[-1]
-            self.connect(kernel_widget,
-                      SIGNAL('create_ipython_client(QString)'),
-                      lambda cf: self.connect_to_new_kernel(cf, kernel_widget))
-    
-    def connect_to_new_kernel(self, connection_file, kernel_widget):
-        """
-        After a new kernel is created, execute this action to connect the new
-        kernel to the old client
-        """
-        client = self.tabwidget.currentWidget()
-        
-        # Close old kernel tab
-        idx = self.extconsole.get_shell_index_from_id(client.kernel_widget_id)
-        self.extconsole.close_console(index=idx, from_ipyclient=True)
-        
-        # Set attributes for the new kernel
-        self.extconsole.set_ipykernel_attrs(connection_file, kernel_widget)
-        
-        # Connect client to new kernel
-        km, kc = self.create_kernel_manager_and_client(connection_file)        
-        client.ipywidget.kernel_manager = km
-        client.ipywidget.kernel_client = kc
-        client.kernel_widget_id = id(kernel_widget)
-        client.get_control().setFocus()
-        
-        # Rename client tab
-        client_widget_id = id(client)
-        self.rename_ipyclient_tab(connection_file, client_widget_id)
+            client.show_restart_animation()
             
+            # Close old kernel tab
+            idx = self.extconsole.get_shell_index_from_id(client.kernel_widget_id)
+            self.extconsole.close_console(index=idx, from_ipyclient=True)
+            
+            # Create a new one and connect it to the client
+            self.main.extconsole.start_ipykernel(client)
+        
     #----Drag and drop
     #TODO: try and reimplement this block
     # (this is still the original code block copied from externalconsole.py)
diff --git a/spyderlib/plugins/onlinehelp.py b/spyderlib/plugins/onlinehelp.py
index 6778204..b07c28d 100644
--- a/spyderlib/plugins/onlinehelp.py
+++ b/spyderlib/plugins/onlinehelp.py
@@ -14,6 +14,7 @@ import os.path as osp
 from spyderlib.baseconfig import get_conf_path, _
 from spyderlib.widgets.pydocgui import PydocBrowser
 from spyderlib.plugins import SpyderPluginMixin
+from spyderlib.py3compat import to_text_string
 
 
 class OnlineHelp(PydocBrowser, SpyderPluginMixin):
@@ -22,7 +23,7 @@ class OnlineHelp(PydocBrowser, SpyderPluginMixin):
     """
     sig_option_changed = Signal(str, object)
     CONF_SECTION = 'onlinehelp'
-    LOG_PATH = get_conf_path('.onlinehelp')
+    LOG_PATH = get_conf_path(CONF_SECTION)
     def __init__(self, parent):
         self.main = parent
         PydocBrowser.__init__(self, parent)
@@ -41,17 +42,17 @@ class OnlineHelp(PydocBrowser, SpyderPluginMixin):
     def load_history(self, obj=None):
         """Load history from a text file in user home directory"""
         if osp.isfile(self.LOG_PATH):
-            history = [line.replace('\n','')
-                       for line in file(self.LOG_PATH, 'r').readlines()]
+            history = [line.replace('\n', '')
+                       for line in open(self.LOG_PATH, 'r').readlines()]
         else:
             history = []
         return history
     
     def save_history(self):
         """Save history to a text file in user home directory"""
-        file(self.LOG_PATH, 'w').write("\n".join( \
-            [ unicode( self.url_combo.itemText(index) )
-                for index in range(self.url_combo.count()) ] ))
+        open(self.LOG_PATH, 'w').write("\n".join( \
+                [to_text_string(self.url_combo.itemText(index))
+                 for index in range(self.url_combo.count())] ))
 
     #------ SpyderPluginMixin API ---------------------------------------------
     def visibility_changed(self, enable):
diff --git a/spyderlib/plugins/outlineexplorer.py b/spyderlib/plugins/outlineexplorer.py
index c24c34f..2cd1db7 100644
--- a/spyderlib/plugins/outlineexplorer.py
+++ b/spyderlib/plugins/outlineexplorer.py
@@ -18,6 +18,7 @@ from spyderlib.baseconfig import _
 from spyderlib.utils.qthelpers import get_icon
 from spyderlib.widgets.editortools import OutlineExplorerWidget
 from spyderlib.plugins import SpyderPluginMixin
+from spyderlib.py3compat import is_text_string
 
 
 class OutlineExplorer(OutlineExplorerWidget, SpyderPluginMixin):
@@ -91,7 +92,7 @@ class OutlineExplorer(OutlineExplorerWidget, SpyderPluginMixin):
 
     def save_config(self):
         """Save configuration: tree widget state"""
-        for option, value in self.get_options().items():
+        for option, value in list(self.get_options().items()):
             self.set_option(option, value)
         self.set_option('expanded_state', self.treewidget.get_expanded_state())
         self.set_option('scrollbar_position',
@@ -103,7 +104,7 @@ class OutlineExplorer(OutlineExplorerWidget, SpyderPluginMixin):
         # Sometimes the expanded state option may be truncated in .ini file
         # (for an unknown reason), in this case it would be converted to a
         # string by 'userconfig':
-        if isinstance(expanded_state, basestring):
+        if is_text_string(expanded_state):
             expanded_state = None
         if expanded_state is not None:
             self.treewidget.set_expanded_state(expanded_state)
diff --git a/spyderlib/plugins/projectexplorer.py b/spyderlib/plugins/projectexplorer.py
index f6aa6b0..396cea2 100644
--- a/spyderlib/plugins/projectexplorer.py
+++ b/spyderlib/plugins/projectexplorer.py
@@ -15,6 +15,7 @@ from spyderlib.config import VALID_EXT
 from spyderlib.utils.qthelpers import get_icon, create_action
 from spyderlib.widgets.projectexplorer import ProjectExplorerWidget
 from spyderlib.plugins import SpyderPluginMixin
+from spyderlib.py3compat import is_text_string
 
 
 class ProjectExplorer(ProjectExplorerWidget, SpyderPluginMixin):
@@ -139,7 +140,7 @@ class ProjectExplorer(ProjectExplorerWidget, SpyderPluginMixin):
         # Sometimes the expanded state option may be truncated in .ini file
         # (for an unknown reason), in this case it would be converted to a
         # string by 'userconfig':
-        if isinstance(expanded_state, basestring):
+        if is_text_string(expanded_state):
             expanded_state = None
         if expanded_state is not None:
             self.treewidget.set_expanded_state(expanded_state)
diff --git a/spyderlib/plugins/runconfig.py b/spyderlib/plugins/runconfig.py
index 39d7f6c..0d202cc 100644
--- a/spyderlib/plugins/runconfig.py
+++ b/spyderlib/plugins/runconfig.py
@@ -15,7 +15,6 @@ from spyderlib.qt.QtGui import (QVBoxLayout, QDialog, QWidget, QGroupBox,
 from spyderlib.qt.QtCore import SIGNAL, SLOT, Qt
 from spyderlib.qt.compat import getexistingdirectory
 
-import os
 import os.path as osp
 
 # Local imports
@@ -23,6 +22,7 @@ from spyderlib.baseconfig import _
 from spyderlib.config import CONF
 from spyderlib.utils.qthelpers import get_icon, get_std_icon
 from spyderlib.plugins.configdialog import GeneralConfigPage
+from spyderlib.py3compat import to_text_string, getcwd
 
 
 CURRENT_INTERPRETER = _("Execute in current Python or IPython interpreter")
@@ -63,11 +63,11 @@ class RunConfiguration(object):
         self.args = options.get('args', '')
         self.args_enabled = options.get('args/enabled', False)
         if CONF.get('run', WDIR_USE_FIXED_DIR_OPTION, False):
-            default_wdir = CONF.get('run', WDIR_FIXED_DIR_OPTION, os.getcwdu())
+            default_wdir = CONF.get('run', WDIR_FIXED_DIR_OPTION, getcwd())
             self.wdir = options.get('workdir', default_wdir)
             self.wdir_enabled = True
         else:
-            self.wdir = options.get('workdir', os.getcwdu())
+            self.wdir = options.get('workdir', getcwd())
             self.wdir_enabled = options.get('workdir/enabled', False)
         self.current = options.get('current',
                            CONF.get('run', CURRENT_INTERPRETER_OPTION, True))
@@ -223,9 +223,9 @@ class RunConfigOptions(QWidget):
 
     def select_directory(self):
         """Select directory"""
-        basedir = unicode(self.wd_edit.text())
+        basedir = to_text_string(self.wd_edit.text())
         if not osp.isdir(basedir):
-            basedir = os.getcwdu()
+            basedir = getcwd()
         directory = getexistingdirectory(self, _("Select directory"), basedir)
         if directory:
             self.wd_edit.setText(directory)
@@ -249,18 +249,18 @@ class RunConfigOptions(QWidget):
     
     def get(self):
         self.runconf.args_enabled = self.clo_cb.isChecked()
-        self.runconf.args = unicode(self.clo_edit.text())
+        self.runconf.args = to_text_string(self.clo_edit.text())
         self.runconf.wdir_enabled = self.wd_cb.isChecked()
-        self.runconf.wdir = unicode(self.wd_edit.text())
+        self.runconf.wdir = to_text_string(self.wd_edit.text())
         self.runconf.current = self.current_radio.isChecked()
         self.runconf.systerm = self.systerm_radio.isChecked()
         self.runconf.interact = self.interact_cb.isChecked()
         self.runconf.python_args_enabled = self.pclo_cb.isChecked()
-        self.runconf.python_args = unicode(self.pclo_edit.text())
+        self.runconf.python_args = to_text_string(self.pclo_edit.text())
         return self.runconf.get()
     
     def is_valid(self):
-        wdir = unicode(self.wd_edit.text())
+        wdir = to_text_string(self.wd_edit.text())
         if not self.wd_cb.isChecked() or osp.isdir(wdir):
             return True
         else:
@@ -368,7 +368,7 @@ class RunConfigDialog(BaseRunConfigDialog):
         
     def run_btn_clicked(self):
         """Run button was just clicked"""
-        self.file_to_run = unicode(self.combo.currentText())
+        self.file_to_run = to_text_string(self.combo.currentText())
         
     def setup(self, fname):
         """Setup Run Configuration dialog with filename *fname*"""
@@ -408,7 +408,7 @@ class RunConfigDialog(BaseRunConfigDialog):
         """Reimplement Qt method"""
         configurations = []
         for index in range(self.stack.count()):
-            filename = unicode(self.combo.itemText(index))
+            filename = to_text_string(self.combo.itemText(index))
             runconfigoptions = self.stack.widget(index)
             if index == self.stack.currentIndex() and\
                not runconfigoptions.is_valid():
@@ -422,11 +422,9 @@ class RunConfigDialog(BaseRunConfigDialog):
 class RunConfigPage(GeneralConfigPage):
     """Default Run Settings configuration page"""
     CONF_SECTION = "run"
-    def get_name(self):
-        return _("Run")
-    
-    def get_icon(self):
-        return get_icon("run.png")
+
+    NAME = _("Run")
+    ICON = "run.png"
     
     def setup_page(self):
         run_dlg = _("Run Settings")
@@ -465,8 +463,7 @@ class RunConfigPage(GeneralConfigPage):
         thisdir_radio = self.create_radiobutton(_("the following directory:"),
                                 WDIR_USE_FIXED_DIR_OPTION, False,
                                 button_group=wdir_bg)
-        thisdir_bd = self.create_browsedir("", WDIR_FIXED_DIR_OPTION,
-                                           os.getcwdu())
+        thisdir_bd = self.create_browsedir("", WDIR_FIXED_DIR_OPTION, getcwd())
         self.connect(thisdir_radio, SIGNAL("toggled(bool)"),
                      thisdir_bd.setEnabled)
         self.connect(dirname_radio, SIGNAL("toggled(bool)"),
diff --git a/spyderlib/plugins/shortcuts.py b/spyderlib/plugins/shortcuts.py
index 91fd346..762fc2b 100644
--- a/spyderlib/plugins/shortcuts.py
+++ b/spyderlib/plugins/shortcuts.py
@@ -6,6 +6,8 @@
 
 """Shortcut management"""
 
+from __future__ import print_function
+
 from spyderlib.qt.QtGui import (QVBoxLayout, QComboBox, QItemDelegate,
                                 QTableView, QMessageBox, QPushButton)
 from spyderlib.qt.QtCore import (Qt, QSize, QAbstractTableModel, QModelIndex,
@@ -18,8 +20,8 @@ import sys
 from spyderlib.baseconfig import _
 from spyderlib.guiconfig import (get_shortcut, set_shortcut,
                                  iter_shortcuts, reset_shortcuts)
-from spyderlib.utils.qthelpers import get_icon
 from spyderlib.plugins.configdialog import GeneralConfigPage
+from spyderlib.py3compat import to_text_string, is_text_string
 
 
 KEYSTRINGS = ["Escape", "Tab", "Backtab", "Backspace", "Return", "Enter",
@@ -72,23 +74,23 @@ class Key(object):
         return "+".join(tlist)
     
     def __unicode__(self):
-        return unicode(self.__str__())
+        return to_text_string(self.__str__())
     
     @staticmethod
     def modifier_from_str(modstr):
-        for k, v in Key.MODIFIERS.iteritems():
+        for k, v in list(Key.MODIFIERS.items()):
             if v.lower() == modstr.lower():
                 return k
     
     @staticmethod
     def key_from_str(keystr):
-        for k, v in Key.KEYS.iteritems():
+        for k, v in list(Key.KEYS.items()):
             if v.lower() == keystr.lower():
                 return k
 
     @staticmethod
     def modifier_from_name(modname):
-        for k, v in Key.MODIFIERNAMES.iteritems():
+        for k, v in list(Key.MODIFIERNAMES.items()):
             if v.lower() == modname.lower():
                 return k        
 
@@ -104,7 +106,7 @@ class Shortcut(object):
     def __init__(self, context, name, key=None):
         self.context = context
         self.name = name
-        if isinstance(key, basestring):
+        if is_text_string(key):
             key = keystr2key(key)
         self.key = key
         
@@ -118,7 +120,7 @@ class Shortcut(object):
         set_shortcut(self.context, self.name, str(self.key))
 
 
-CONTEXT, NAME, MOD1, MOD2, MOD3, KEY = range(6)
+CONTEXT, NAME, MOD1, MOD2, MOD3, KEY = list(range(6))
 
 class ShortcutsModel(QAbstractTableModel):
     def __init__(self):
@@ -328,11 +330,9 @@ class ShortcutsTable(QTableView):
 
 class ShortcutsConfigPage(GeneralConfigPage):
     CONF_SECTION = "shortcuts"
-    def get_name(self):
-        return _("Keyboard shortcuts")
     
-    def get_icon(self):
-        return get_icon("genprefs.png")
+    NAME = _("Keyboard shortcuts")
+    ICON = "genprefs.png"
     
     def setup_page(self):
         self.table = ShortcutsTable(self)
@@ -367,7 +367,7 @@ def test():
     table = ShortcutsTable()
     table.show()
     app.exec_()
-    print [str(s) for s in table.model.shortcuts]
+    print([str(s) for s in table.model.shortcuts])
     table.check_shortcuts()
 
 if __name__ == '__main__':
diff --git a/spyderlib/plugins/variableexplorer.py b/spyderlib/plugins/variableexplorer.py
index 5b2188f..03af4f0 100644
--- a/spyderlib/plugins/variableexplorer.py
+++ b/spyderlib/plugins/variableexplorer.py
@@ -153,7 +153,7 @@ class VariableExplorer(QStackedWidget, SpyderPluginMixin):
     def visibility_changed(self, enable):
         """DockWidget visibility has changed"""
         SpyderPluginMixin.visibility_changed(self, enable)
-        for nsb in self.shellwidgets.values():
+        for nsb in list(self.shellwidgets.values()):
             nsb.visibility_changed(enable and nsb is self.currentWidget())
     
     #------ SpyderPluginWidget API ---------------------------------------------
@@ -191,7 +191,7 @@ class VariableExplorer(QStackedWidget, SpyderPluginMixin):
         
     def apply_plugin_settings(self, options):
         """Apply configuration file's plugin settings"""
-        for nsb in self.shellwidgets.values():
+        for nsb in list(self.shellwidgets.values()):
             nsb.setup(**VariableExplorer.get_settings())
         ar_timeout = self.get_option('autorefresh/timeout')
         for shellwidget in self.main.extconsole.shellwidgets:
diff --git a/spyderlib/plugins/workingdirectory.py b/spyderlib/plugins/workingdirectory.py
index cebe387..bd5b510 100644
--- a/spyderlib/plugins/workingdirectory.py
+++ b/spyderlib/plugins/workingdirectory.py
@@ -27,6 +27,7 @@ from spyderlib.utils.qthelpers import get_icon, get_std_icon, create_action
 # Package local imports
 from spyderlib.widgets.comboboxes import PathComboBox
 from spyderlib.plugins import SpyderPluginMixin, PluginConfigPage
+from spyderlib.py3compat import to_text_string, getcwd
 
 
 class WorkingDirectoryConfigPage(PluginConfigPage):
@@ -56,7 +57,7 @@ class WorkingDirectoryConfigPage(PluginConfigPage):
                                         "directory will be the specified path"),
                                 button_group=startup_bg)
         thisdir_bd = self.create_browsedir("", 'startup/fixed_directory',
-                                           os.getcwdu())
+                                           getcwd())
         self.connect(thisdir_radio, SIGNAL("toggled(bool)"),
                      thisdir_bd.setEnabled)
         self.connect(lastdir_radio, SIGNAL("toggled(bool)"),
@@ -140,7 +141,7 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
     """
     CONF_SECTION = 'workingdir'
     CONFIGWIDGET_CLASS = WorkingDirectoryConfigPage
-    LOG_PATH = get_conf_path('.workingdir')
+    LOG_PATH = get_conf_path(CONF_SECTION)
     sig_option_changed = Signal(str, object)
     def __init__(self, parent, workdir=None):
         QToolBar.__init__(self, parent)
@@ -252,7 +253,7 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
         
     def refresh_plugin(self):
         """Refresh widget"""
-        curdir = os.getcwdu()
+        curdir = getcwd()
         self.pathedit.add_text(curdir)
         self.save_wdhistory()
         self.emit(SIGNAL("set_previous_enabled(bool)"),
@@ -277,13 +278,13 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
             wdhistory = [name for name in wdhistory if os.path.isdir(name)]
         else:
             if workdir is None:
-                workdir = os.getcwdu()
+                workdir = getcwd()
             wdhistory = [ workdir ]
         return wdhistory
     
     def save_wdhistory(self):
         """Save history to a text file in user home directory"""
-        text = [ unicode( self.pathedit.itemText(index) ) \
+        text = [ to_text_string( self.pathedit.itemText(index) ) \
                  for index in range(self.pathedit.count()) ]
         encoding.writelines(text, self.LOG_PATH)
         
@@ -291,7 +292,7 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
         """Select directory"""
         self.emit(SIGNAL('redirect_stdio(bool)'), False)
         directory = getexistingdirectory(self.main, _("Select directory"),
-                                         os.getcwdu())
+                                         getcwd())
         if directory:
             self.chdir(directory)
         self.emit(SIGNAL('redirect_stdio(bool)'), True)
@@ -308,14 +309,14 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
         
     def parent_directory(self):
         """Change working directory to parent directory"""
-        self.chdir(os.path.join(os.getcwdu(), os.path.pardir))
+        self.chdir(os.path.join(getcwd(), os.path.pardir))
         
     def chdir(self, directory=None, browsing_history=False,
               refresh_explorer=True):
         """Set directory as working directory"""
         # Working directory history management
         if directory is not None:
-            directory = osp.abspath(unicode(directory))
+            directory = osp.abspath(to_text_string(directory))
         if browsing_history:
             directory = self.history[self.histindex]
         elif directory in self.history:
@@ -329,7 +330,7 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
             self.histindex = len(self.history)-1
         
         # Changing working directory
-        os.chdir( unicode(directory) )
+        os.chdir( to_text_string(directory) )
         self.refresh_plugin()
         if refresh_explorer:
             self.emit(SIGNAL("set_explorer_cwd(QString)"), directory)
@@ -337,4 +338,4 @@ class WorkingDirectory(QToolBar, SpyderPluginMixin):
         
     def set_as_current_console_wd(self):
         """Set as current console working directory"""
-        self.emit(SIGNAL("set_current_console_wd(QString)"), os.getcwdu())
+        self.emit(SIGNAL("set_current_console_wd(QString)"), getcwd())
diff --git a/spyderlib/py3compat.py b/spyderlib/py3compat.py
new file mode 100644
index 0000000..7ff962f
--- /dev/null
+++ b/spyderlib/py3compat.py
@@ -0,0 +1,246 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2012-2013 Pierre Raybaut
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+"""
+spyderlib.py3compat
+-------------------
+
+Transitional module providing compatibility functions intended to help 
+migrating from Python 2 to Python 3.
+
+This module should be fully compatible with:
+    * Python >=v2.6
+    * Python 3
+"""
+
+from __future__ import print_function
+
+import sys
+import os
+
+PY2 = sys.version[0] == '2'
+PY3 = sys.version[0] == '3'
+
+
+#==============================================================================
+# Data types
+#==============================================================================
+if PY2:
+    # Python 2
+    TEXT_TYPES = (str, unicode)
+    INT_TYPES = (int, long)
+else:
+    # Python 3
+    TEXT_TYPES = (str,)
+    INT_TYPES = (int,)
+NUMERIC_TYPES = tuple(list(INT_TYPES) + [float, complex])
+
+
+#==============================================================================
+# Renamed/Reorganized modules
+#==============================================================================
+if PY2:
+    # Python 2
+    import __builtin__ as builtins
+    import ConfigParser as configparser
+    try:
+        import _winreg as winreg
+    except ImportError:
+        pass
+    from sys import maxint as maxsize
+    try:
+        import CStringIO as io
+    except ImportError:
+        import StringIO as io
+    try:
+        import cPickle as pickle
+    except ImportError:
+        import pickle
+    from UserDict import DictMixin as MutableMapping
+    import thread as _thread
+else:
+    # Python 3
+    import builtins
+    import configparser
+    try:
+        import winreg
+    except ImportError:
+        pass
+    from sys import maxsize
+    import io
+    import pickle
+    from collections import MutableMapping
+    import _thread
+
+
+#==============================================================================
+# Strings
+#==============================================================================
+if PY2:
+    # Python 2
+    import codecs
+    def u(obj):
+        """Make unicode object"""
+        return codecs.unicode_escape_decode(obj)[0]
+else:
+    # Python 3
+    def u(obj):
+        """Return string as it is"""
+        return obj
+
+def is_text_string(obj):
+    """Return True if `obj` is a text string, False if it is anything else,
+    like binary data (Python 3) or QString (Python 2, PyQt API #1)"""
+    if PY2:
+        # Python 2
+        return isinstance(obj, basestring)
+    else:
+        # Python 3
+        return isinstance(obj, str)
+
+def is_binary_string(obj):
+    """Return True if `obj` is a binary string, False if it is anything else"""
+    if PY2:
+        # Python 2
+        return isinstance(obj, str)
+    else:
+        # Python 3
+        return isinstance(obj, bytes)
+
+def is_string(obj):
+    """Return True if `obj` is a text or binary Python string object,
+    False if it is anything else, like a QString (Python 2, PyQt API #1)"""
+    return is_text_string(obj) or is_binary_string(obj)
+
+def is_unicode(obj):
+    """Return True if `obj` is unicode"""
+    if PY2:
+        # Python 2
+        return isinstance(obj, unicode)
+    else:
+        # Python 3
+        return isinstance(obj, str)
+
+def to_text_string(obj, encoding=None):
+    """Convert `obj` to (unicode) text string"""
+    if PY2:
+        # Python 2
+        if encoding is None:
+            return unicode(obj)
+        else:
+            return unicode(obj, encoding)
+    else:
+        # Python 3
+        if encoding is None:
+            return str(obj)
+        elif isinstance(obj, str):
+            # In case this function is not used properly, this could happen
+            return obj
+        else:
+            return str(obj, encoding)
+
+def to_binary_string(obj, encoding=None):
+    """Convert `obj` to binary string (bytes in Python 3, str in Python 2)"""
+    if PY2:
+        # Python 2
+        if encoding is None:
+            return str(obj)
+        else:
+            return obj.encode(encoding)
+    else:
+        # Python 3
+        return bytes(obj, 'utf-8' if encoding is None else encoding)
+
+
+#==============================================================================
+# Function attributes
+#==============================================================================
+def get_func_code(func):
+    """Return function code object"""
+    if PY2:
+        # Python 2
+        return func.func_code
+    else:
+        # Python 3
+        return func.__code__
+
+def get_func_name(func):
+    """Return function name"""
+    if PY2:
+        # Python 2
+        return func.func_name
+    else:
+        # Python 3
+        return func.__name__
+
+def get_func_defaults(func):
+    """Return function default argument values"""
+    if PY2:
+        # Python 2
+        return func.func_defaults
+    else:
+        # Python 3
+        return func.__defaults__
+
+
+#==============================================================================
+# Special method attributes
+#==============================================================================
+def get_meth_func(obj):
+    """Return method function object"""
+    if PY2:
+        # Python 2
+        return obj.im_func
+    else:
+        # Python 3
+        return obj.__func__
+
+def get_meth_class_inst(obj):
+    """Return method class instance"""
+    if PY2:
+        # Python 2
+        return obj.im_self
+    else:
+        # Python 3
+        return obj.__self__
+
+def get_meth_class(obj):
+    """Return method class"""
+    if PY2:
+        # Python 2
+        return obj.im_class
+    else:
+        # Python 3
+        return obj.__self__.__class__
+
+
+#==============================================================================
+# Misc.
+#==============================================================================
+if PY2:
+    # Python 2
+    input = raw_input
+    getcwd = os.getcwdu
+    cmp = cmp
+    import string
+    str_lower = string.lower
+    from itertools import izip_longest as zip_longest
+else:
+    # Python 3
+    input = input
+    getcwd = os.getcwd
+    def cmp(a, b):
+        return (a > b) - (a < b)
+    str_lower = str.lower
+    from itertools import zip_longest
+
+def qbytearray_to_str(qba):
+    """Convert QByteArray object to str in a way compatible with Python 2/3"""
+    return str(bytes(qba.toHex().data()).decode())
+
+
+if __name__ == '__main__':
+    pass
diff --git a/spyderlib/qt/compat.py b/spyderlib/qt/compat.py
index 8744b93..5c9c01c 100644
--- a/spyderlib/qt/compat.py
+++ b/spyderlib/qt/compat.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright © 2011 Pierre Raybaut
+# Copyright © 2011-2012 Pierre Raybaut
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
@@ -17,14 +17,19 @@ This module should be fully compatible with:
     * PySide
 """
 
+from __future__ import print_function
+
 import os
 import sys
+import collections
 
 from spyderlib.qt.QtGui import QFileDialog
 
-#===============================================================================
+from spyderlib.py3compat import is_text_string, to_text_string, TEXT_TYPES
+
+#==============================================================================
 # QVariant conversion utilities
-#===============================================================================
+#==============================================================================
 
 PYQT_API_1 = False
 if os.environ['QT_API'] == 'pyqt':
@@ -51,8 +56,8 @@ if os.environ['QT_API'] == 'pyqt':
         to PyQt API #2 and Pyside (QVariant does not exist)"""
         if PYQT_API_1:
             # PyQt API #1
-            assert callable(convfunc)
-            if convfunc in (unicode, str):
+            assert isinstance(convfunc, collections.Callable)
+            if convfunc in TEXT_TYPES or convfunc is to_text_string:
                 return convfunc(qobj.toString())
             elif convfunc is bool:
                 return qobj.toBool()
@@ -77,9 +82,9 @@ else:
         to PyQt API #2 and Pyside (QVariant does not exist)"""
         return qobj
 
-#===============================================================================
+#==============================================================================
 # Wrappers around QFileDialog static methods
-#===============================================================================
+#==============================================================================
 
 def getexistingdirectory(parent=None, caption='', basedir='',
                          options=QFileDialog.ShowDirsOnly):
@@ -97,9 +102,9 @@ def getexistingdirectory(parent=None, caption='', basedir='',
         if sys.platform == "win32":
             # On Windows platforms: restore standard outputs
             sys.stdout, sys.stderr = _temp1, _temp2
-    if not isinstance(result, basestring):
+    if not is_text_string(result):
         # PyQt API #1
-        result = unicode(result)
+        result = to_text_string(result)
     return result
 
 def _qfiledialog_wrapper(attr, parent=None, caption='', basedir='',
@@ -151,13 +156,13 @@ def _qfiledialog_wrapper(attr, parent=None, caption='', basedir='',
         output = result
     if QString is not None:
         # PyQt API #1: conversions needed from QString/QStringList
-        selectedfilter = unicode(selectedfilter)
+        selectedfilter = to_text_string(selectedfilter)
         if isinstance(output, QString):
             # Single filename
-            output = unicode(output)
+            output = to_text_string(output)
         else:
             # List of filenames
-            output = [unicode(fname) for fname in output]
+            output = [to_text_string(fname) for fname in output]
             
     # Always returns the tuple (output, selectedfilter)
     return output, selectedfilter
@@ -197,9 +202,9 @@ def getsavefilename(parent=None, caption='', basedir='', filters='',
 
 if __name__ == '__main__':
     from spyderlib.utils.qthelpers import qapplication
-    app = qapplication()
-    print repr(getexistingdirectory())
-    print repr(getopenfilename(filters='*.py;;*.txt'))
-    print repr(getopenfilenames(filters='*.py;;*.txt'))
-    print repr(getsavefilename(filters='*.py;;*.txt'))
+    _app = qapplication()
+    print(repr(getexistingdirectory()))
+    print(repr(getopenfilename(filters='*.py;;*.txt')))
+    print(repr(getopenfilenames(filters='*.py;;*.txt')))
+    print(repr(getsavefilename(filters='*.py;;*.txt')))
     sys.exit()
diff --git a/spyderlib/scientific_startup.py b/spyderlib/scientific_startup.py
index c979946..af28c38 100644
--- a/spyderlib/scientific_startup.py
+++ b/spyderlib/scientific_startup.py
@@ -10,7 +10,20 @@ Scientific Python startup script
 Requires NumPy, SciPy and Matplotlib
 """
 
-from __future__ import division
+# Need a temporary print function that is Python version agnostic.
+import sys
+
+def exec_print(string="", end_space=False):
+    if sys.version[0] == '2':
+        if end_space:
+            exec("print '" + string + "',")
+        else:
+            exec("print '" + string + "'")
+    else:
+        if end_space:
+            exec("print('" + string + "', end=' ')")
+        else:
+            exec("print('" + string + "')")
 
 __has_numpy = True
 __has_scipy = True
@@ -54,9 +67,9 @@ if __has_scipy:
 if __has_matplotlib:
     __imports += ", Matplotlib %s" % mpl.__version__
 
-print ""
+exec_print("")
 if __imports:
-    print __imports
+    exec_print(__imports)
 
 import os
 if os.environ.get('QT_API') != 'pyside':
@@ -65,18 +78,16 @@ if os.environ.get('QT_API') != 'pyside':
         import guiqwt.pyplot as plt_
         import guidata
         plt_.ion()
-        print "+ guidata %s, guiqwt %s" % (guidata.__version__,
-                                           guiqwt.__version__)
+        exec_print("+ guidata %s, guiqwt %s" % (guidata.__version__,
+                                           guiqwt.__version__))
     except ImportError:
-        print
+        exec_print()
 
 #==============================================================================
 # Add help about the "scientific" command
 #==============================================================================
 def setscientific():
     """Set 'scientific' in __builtin__"""
-    import __builtin__
-    from site import _Printer
     infos = ""
     
     if __has_numpy:
@@ -117,13 +128,20 @@ Within Spyder, this interpreter also provides:
     * system commands, i.e. all commands starting with '!' are subprocessed
       (e.g. !dir on Windows or !ls on Linux, and so on)
 """
-    __builtin__.scientific = _Printer("scientific", infos)
+    try:
+        # Python 2
+        import __builtin__ as builtins
+    except ImportError:
+        # Python 3
+        import builtins
+    from site import _Printer
+    builtins.scientific = _Printer("scientific", infos)
 
 
 setscientific()
-print 'Type "scientific" for more details.'
+exec_print('Type "scientific" for more details.')
 
 #==============================================================================
 # Delete temp vars
 #==============================================================================
-del setscientific, __has_numpy, __has_scipy, __has_matplotlib, __imports
+del setscientific, __has_numpy, __has_scipy, __has_matplotlib, __imports, exec_print
diff --git a/spyderlib/spyder.py b/spyderlib/spyder.py
index 39abb10..6e85c07 100644
--- a/spyderlib/spyder.py
+++ b/spyderlib/spyder.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright © 2009-2011 Pierre Raybaut
+# Copyright © 2009-2013 Pierre Raybaut
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
@@ -15,6 +15,8 @@ Licensed under the terms of the MIT License
 (see spyderlib/__init__.py for details)
 """
 
+from __future__ import print_function
+
 # Stdlib imports
 import atexit
 import errno
@@ -129,23 +131,27 @@ from spyderlib.utils.qthelpers import (create_action, add_actions, get_icon,
                                        create_python_script_action, file_uri)
 from spyderlib.baseconfig import (get_conf_path, _, get_module_data_path,
                                   get_module_source_path, STDOUT, STDERR,
-                                  DEBUG, get_image_path, DEV, TEST, SUBFOLDER)
+                                  DEBUG, DEV, debug_print, get_image_path,
+                                  TEST, SUBFOLDER)
 from spyderlib.config import CONF, EDIT_EXT, IMPORT_EXT, OPEN_FILES_PORT
 from spyderlib.guiconfig import get_shortcut, remove_deprecated_shortcuts
 from spyderlib.otherplugins import get_spyderplugins_mods
 from spyderlib.utils.iofuncs import load_session, save_session, reset_session
-from spyderlib.userconfig import NoDefault, NoOptionError
+from spyderlib.userconfig import NoDefault
 from spyderlib.utils import module_completion
 from spyderlib.utils.misc import select_port
 from spyderlib.cli_options import get_options
+from spyderlib.py3compat import (PY3, to_text_string, is_text_string, getcwd,
+                                 u, qbytearray_to_str, configparser as cp,
+                                 is_string, is_binary_string)
 from spyderlib.widgets.dependencies import DependenciesDialog
 
 
-TEMP_SESSION_PATH = get_conf_path('.temp.session.tar')
+TEMP_SESSION_PATH = get_conf_path('temp.session.tar')
 
 # Get the cwd before initializing WorkingDirectory, which sets it to the one
 # used in the last session
-CWD = os.getcwd()
+CWD = getcwd()
 
 
 def get_python_doc_path():
@@ -238,24 +244,22 @@ QMainWindow::separator:horizontal {
 class MainWindow(QMainWindow):
     """Spyder main window"""
     DOCKOPTIONS = QMainWindow.AllowTabbedDocks|QMainWindow.AllowNestedDocks
-    spyder_path = get_conf_path('.path')
+    SPYDER_PATH = get_conf_path('path')
     BOOKMARKS = (
          ('PyQt4',
           "http://pyqt.sourceforge.net/Docs/PyQt4/",
-          _("PyQt4 Reference Guide"), "qt.png"),
+          _("PyQt4 Reference Guide")),
          ('PyQt4',
           "http://pyqt.sourceforge.net/Docs/PyQt4/classes.html",
-          _("PyQt4 API Reference"), "qt.png"),
+          _("PyQt4 API Reference")),
          ('xy', "http://code.google.com/p/pythonxy/",
-          _("Python(x,y)"), "pythonxy.png"),
+          _("Python(x,y)")),
          ('winpython', "http://code.google.com/p/winpython/",
-          _("WinPython"), "winpython.svg"),
+          _("WinPython")),
          ('numpy', "http://docs.scipy.org/doc/",
-          _("Numpy and Scipy documentation"),
-          "scipy.png"),
+          _("Numpy and Scipy documentation")),
          ('matplotlib', "http://matplotlib.sourceforge.net/contents.html",
-          _("Matplotlib documentation"),
-          "matplotlib.png"),
+          _("Matplotlib documentation")),
                 )
     
     def __init__(self, options=None):
@@ -282,8 +286,8 @@ class MainWindow(QMainWindow):
         # Loading Spyder path
         self.path = []
         self.project_path = []
-        if osp.isfile(self.spyder_path):
-            self.path, _x = encoding.readlines(self.spyder_path)
+        if osp.isfile(self.SPYDER_PATH):
+            self.path, _x = encoding.readlines(self.SPYDER_PATH)
             self.path = [name for name in self.path if osp.isdir(name)]
         self.remove_path_from_sys_path()
         self.add_path_to_sys_path()
@@ -354,8 +358,8 @@ class MainWindow(QMainWindow):
         self.run_menu_actions = []
         self.debug_menu = None
         self.debug_menu_actions = []
-        self.interact_menu = None
-        self.interact_menu_actions = []
+        self.consoles_menu = None
+        self.consoles_menu_actions = []
         self.tools_menu = None
         self.tools_menu_actions = []
         self.external_tools_menu = None # We must keep a reference to this,
@@ -454,8 +458,7 @@ class MainWindow(QMainWindow):
     
     def debug_print(self, message):
         """Debug prints"""
-        if DEBUG:
-            print >>STDOUT, message
+        debug_print(message)
         
     #---- Window setup
     def create_toolbar(self, title, object_name, iconsize=24):
@@ -469,6 +472,7 @@ class MainWindow(QMainWindow):
         """Setup main window"""
         self.debug_print("*** Start of MainWindow setup ***")
         if not self.light:
+            self.debug_print("  ..core actions")
             self.close_dockwidget_action = create_action(self,
                                         _("Close current dockwidget"),
                                         triggered=self.close_current_dockwidget,
@@ -534,6 +538,7 @@ class MainWindow(QMainWindow):
 
         namespace = None
         if not self.light:
+            self.debug_print("  ..toolbars")
             # File menu/toolbar
             self.file_menu = self.menuBar().addMenu(_("&File"))
             self.connect(self.file_menu, SIGNAL("aboutToShow()"),
@@ -566,8 +571,8 @@ class MainWindow(QMainWindow):
             self.debug_toolbar = self.create_toolbar(_("Debug toolbar"),
                                                      "debug_toolbar")
                                                   
-            # Interact menu/toolbar
-            self.interact_menu = self.menuBar().addMenu(_("&Interpreters"))
+            # Consoles menu/toolbar
+            self.consoles_menu = self.menuBar().addMenu(_("C&onsoles"))
             
             # Tools menu
             self.tools_menu = self.menuBar().addMenu(_("&Tools"))
@@ -576,7 +581,7 @@ class MainWindow(QMainWindow):
             self.view_menu = self.menuBar().addMenu(_("&View"))
             
             # Help menu
-            self.help_menu = self.menuBar().addMenu("?")
+            self.help_menu = self.menuBar().addMenu(_("&Help"))
                     
             # Status bar
             status = self.statusBar()
@@ -584,6 +589,7 @@ class MainWindow(QMainWindow):
             status.showMessage(_("Welcome to Spyder!"), 5000)
             
             
+            self.debug_print("  ..tools")
             # Tools + External Tools
             prefs_action = create_action(self, _("Pre&ferences"),
                                          icon='configure.png',
@@ -600,7 +606,6 @@ class MainWindow(QMainWindow):
                                     menurole=QAction.ApplicationSpecificRole)
             update_modules_action = create_action(self,
                                         _("Update module names list"),
-                                        None, 'reload.png',
                                         triggered=module_completion.reset,
                                         tip=_("Refresh list of module names "
                                               "available in PYTHONPATH"))
@@ -646,12 +651,12 @@ class MainWindow(QMainWindow):
             additact = [None]
             for name in ("designer-qt4", "designer"):
                 qtdact = create_program_action(self, _("Qt Designer"),
-                                               'qtdesigner.png', name)
+                                               name, 'qtdesigner.png')
                 if qtdact:
                     break
             for name in ("linguist-qt4", "linguist"):
                 qtlact = create_program_action(self, _("Qt Linguist"),
-                                               'qtlinguist.png', "linguist")
+                                               "linguist", 'qtlinguist.png')
                 if qtlact:
                     break
             args = ['-no-opengl'] if os.name == 'nt' else []
@@ -662,10 +667,12 @@ class MainWindow(QMainWindow):
             for act in (qtdact, qtlact, qteact):
                 if act:
                     additact.append(act)
-            if len(additact) > 1:
+            if len(additact) > 1 and (is_module_installed('winpython') or \
+              is_module_installed('xy')):
                 self.external_tools_menu_actions += additact
                 
             # Sift
+            self.debug_print("  ..sift?")
             gdgq_act = []
             if is_module_installed('guidata'):
                 from guidata import configtools
@@ -694,7 +701,7 @@ class MainWindow(QMainWindow):
                 
             # ViTables
             vitables_act = create_program_action(self, _("ViTables"),
-                                                 'vitables.png', "vitables")
+                                                 "vitables", 'vitables.png')
             if vitables_act:
                 self.external_tools_menu_actions += [None, vitables_act]
             
@@ -722,6 +729,7 @@ class MainWindow(QMainWindow):
             self.main_toolbar = self.create_toolbar(_("Main toolbar"),
                                                     "main_toolbar")
             
+            self.debug_print("  ..plugin: internal console")
             # Internal console plugin
             self.console = Console(self, namespace, exitfunc=self.closing,
                                    profile=self.profile,
@@ -730,6 +738,7 @@ class MainWindow(QMainWindow):
                                            '  spy.app, spy.window, dir(spy)')
             self.console.register_plugin()
             
+            self.debug_print("  ..plugin: working directory")
             # Working directory plugin
             self.workingdirectory = WorkingDirectory(self, self.init_workdir)
             self.workingdirectory.register_plugin()
@@ -764,6 +773,7 @@ class MainWindow(QMainWindow):
                                        None, quit_action]
             self.set_splash("")
         
+            self.debug_print("  ..widgets")
             # Find in files
             if CONF.get('find_in_files', 'enable'):
                 self.findinfiles = FindInFiles(self)
@@ -832,7 +842,6 @@ class MainWindow(QMainWindow):
                                     icon=get_std_icon('MessageBoxInformation'),
                                     triggered=self.about)
             dep_action = create_action(self, _("Optional dependencies..."),
-                                       icon=get_icon('advanced.png'),
                                        triggered=self.show_dependencies)
             report_action = create_action(self,
                                     _("Report issue..."),
@@ -858,30 +867,41 @@ class MainWindow(QMainWindow):
             doc_action = create_bookmark_action(self, spyder_doc,
                                _("Spyder documentation"), shortcut="F1",
                                icon=get_std_icon('DialogHelpButton'))
-            self.help_menu_actions = [about_action, dep_action,
-                                      report_action, doc_action]
+            self.help_menu_actions = [doc_action, report_action, dep_action,
+                                      None]
             # Python documentation
             if get_python_doc_path() is not None:
                 pydoc_act = create_action(self, _("Python documentation"),
                                   icon=get_icon('python.png'),
                                   triggered=lambda:
                                   programs.start_file(get_python_doc_path()))
-                self.help_menu_actions += [None, pydoc_act]
+                self.help_menu_actions.append(pydoc_act)
+            # IPython documentation
+            if self.ipyconsole is not None:
+                ipython_menu = QMenu(_("IPython Help"), self)
+                intro_action = create_action(self, _("Intro to IPython"),
+                                          triggered=self.ipyconsole.show_intro)
+                quickref_action = create_action(self, _("Quick Reference"),
+                                       triggered=self.ipyconsole.show_quickref)
+                guiref_action = create_action(self, _("Console help"),
+                                         triggered=self.ipyconsole.show_guiref)                    
+                add_actions(ipython_menu, (intro_action, guiref_action,
+                                           quickref_action))
+                self.help_menu_actions.append(ipython_menu)
             # Qt assistant link
-            qta_act = create_program_action(self, _("Qt Assistant"),
-                                            'qtassistant.png', "assistant")
+            qta_act = create_program_action(self, _("Qt Help"), "assistant")
             if qta_act:
                 self.help_menu_actions.append(qta_act)
+            # Online documentation
+            web_resources = QMenu(_("Web Resources"))
+            add_actions(web_resources,
+                        create_module_bookmark_actions(self, self.BOOKMARKS))
+            self.help_menu_actions += [web_resources, None]
             # Windows-only: documentation located in sys.prefix/Doc
             def add_doc_action(text, path):
                 """Add doc action to help menu"""
-                ext = osp.splitext(path)[1]
-                if ext:
-                    icon = get_icon(ext[1:]+".png")
-                else:
-                    icon = get_std_icon("DirIcon")
                 path = file_uri(path)
-                action = create_action(self, text, icon=icon,
+                action = create_action(self, text, icon=None,
                        triggered=lambda path=path: programs.start_file(path))
                 self.help_menu_actions.append(action)
             sysdocpth = osp.join(sys.prefix, 'Doc')
@@ -927,12 +947,11 @@ class MainWindow(QMainWindow):
                 self.help_menu_actions.append(None)
             except (ImportError, KeyError, RuntimeError):
                 pass
-            # Online documentation
-            web_resources = QMenu(_("Web Resources"))
-            web_resources.setIcon(get_icon("browser.png"))
-            add_actions(web_resources,
-                        create_module_bookmark_actions(self, self.BOOKMARKS))
-            self.help_menu_actions.append(web_resources)
+            if self.help_menu_actions[-1] is None:
+                last_action = [about_action]
+            else:
+                last_action = [None, about_action]
+            self.help_menu_actions += last_action
             
             # Status bar widgets
             self.mem_status = MemoryStatus(self, status)
@@ -945,8 +964,8 @@ class MainWindow(QMainWindow):
                     plugin = mod.PLUGIN_CLASS(self)
                     self.thirdparty_plugins.append(plugin)
                     plugin.register_plugin()
-                except AttributeError, error:
-                    print >>STDERR, "%s: %s" % (mod, str(error))
+                except AttributeError as error:
+                    print("%s: %s" % (mod, str(error)), file=STDERR)
                                 
             # View menu
             self.windows_toolbars_menu = QMenu(_("Windows and toolbars"), self)
@@ -990,12 +1009,12 @@ class MainWindow(QMainWindow):
             external_tools_act = create_action(self, _("External Tools"),
                                                icon="ext_tools.png")
             external_tools_act.setMenu(self.external_tools_menu)
-            self.tools_menu_actions.append(external_tools_act)
             add_ext_tools = False
             for et in self.external_tools_menu_actions:
                 if et and et.isEnabled():
                     add_ext_tools = True
             if add_ext_tools:
+                self.tools_menu_actions.append(external_tools_act)
                 self.main_toolbar_actions.append(external_tools_act)
             
             # Filling out menu/toolbar entries:
@@ -1005,7 +1024,7 @@ class MainWindow(QMainWindow):
             add_actions(self.source_menu, self.source_menu_actions)
             add_actions(self.run_menu, self.run_menu_actions)
             add_actions(self.debug_menu, self.debug_menu_actions)
-            add_actions(self.interact_menu, self.interact_menu_actions)
+            add_actions(self.consoles_menu, self.consoles_menu_actions)
             add_actions(self.tools_menu, self.tools_menu_actions)
             add_actions(self.external_tools_menu,
                         self.external_tools_menu_actions)
@@ -1052,6 +1071,7 @@ class MainWindow(QMainWindow):
         """Actions to be performed only after the main window's `show` method 
         was triggered"""
         self.emit(SIGNAL('restore_scrollbar_position()'))
+       
         if self.projectexplorer is not None:
             self.projectexplorer.check_for_io_errors()
         
@@ -1101,6 +1121,8 @@ class MainWindow(QMainWindow):
             self.extconsole.open_interpreter()
         else:
             self.extconsole.open_interpreter_at_startup()
+            if self.ipyconsole is not None:
+                self.ipyconsole.open_client_at_startup()
         self.extconsole.setMinimumHeight(0)
         
     def load_window_settings(self, prefix, default=False, section='main'):
@@ -1132,7 +1154,7 @@ class MainWindow(QMainWindow):
             is_maximized = self.isMaximized()
         pos = self.window_position
         posx, posy = pos.x(), pos.y()
-        hexstate = str(self.saveState().toHex())
+        hexstate = qbytearray_to_str(self.saveState())
         return hexstate, width, height, posx, posy, is_maximized, is_fullscreen
         
     def set_window_settings(self, hexstate, window_size, prefs_dialog_size,
@@ -1185,7 +1207,7 @@ class MainWindow(QMainWindow):
         if not self.light:
             self.maximize_dockwidget(restore=True)# Restore non-maximized layout
             qba = self.saveState()
-            CONF.set(section, prefix+'state', str(qba.toHex()))
+            CONF.set(section, prefix+'state', qbytearray_to_str(qba))
             CONF.set(section, prefix+'statusbar',
                      not self.statusBar().isHidden())
 
@@ -1238,7 +1260,7 @@ class MainWindow(QMainWindow):
             for plugin in (self.projectexplorer, self.outlineexplorer):
                 plugin.dockwidget.close()
 
-        self.set_window_settings(hexstate,window_size, prefs_dialog_size, pos,
+        self.set_window_settings(hexstate, window_size, prefs_dialog_size, pos,
                                  is_maximized, is_fullscreen)
 
         for plugin in self.widgetlist:
@@ -1263,7 +1285,7 @@ class MainWindow(QMainWindow):
             try:
                 settings = self.load_window_settings('layout_%d/' % index,
                                                      section='quick_layouts')
-            except NoOptionError:
+            except cp.NoOptionError:
                 QMessageBox.critical(self, _("Warning"),
                                      _("Quick switch layout #%d has not yet "
                                        "been defined.") % index)
@@ -1601,7 +1623,10 @@ class MainWindow(QMainWindow):
         dlg.exec_()
 
     def report_issue(self):
-        import urllib
+        if PY3:
+            from urllib.parse import quote
+        else:
+            from urllib import quote
         versions = get_versions()
         # Get Mercurial revision for development version
         revlink = ''
@@ -1635,7 +1660,7 @@ Please provide any additional information below.
        dependencies.status())
        
         url = QUrl("http://code.google.com/p/spyderlib/issues/entry")
-        url.addEncodedQueryItem("comment", urllib.quote(issue_template))
+        url.addEncodedQueryItem("comment", quote(issue_template))
         QDesktopServices.openUrl(url)    
 
     #---- Global callbacks (called from plugins)
@@ -1690,7 +1715,7 @@ Please provide any additional information below.
         """Global callback"""
         widget = QApplication.focusWidget()
         action = self.sender()
-        callback = from_qvariant(action.data(), unicode)
+        callback = from_qvariant(action.data(), to_text_string)
         from spyderlib.widgets.editor import TextEditBaseWidget
         if isinstance(widget, TextEditBaseWidget):
             getattr(widget, callback)()
@@ -1718,9 +1743,10 @@ Please provide any additional information below.
             self.extconsole.visibility_changed(True)
             self.extconsole.raise_()
             self.extconsole.start(
-                fname=unicode(fname), wdir=unicode(wdir), args=unicode(args),
-                interact=interact, debug=debug, python=python,
-                python_args=unicode(python_args) )
+                fname=to_text_string(fname), wdir=to_text_string(wdir),
+                args=to_text_string(args), interact=interact,
+                debug=debug, python=python,
+                python_args=to_text_string(python_args) )
         
     def execute_in_external_console(self, lines, focus_to_editor):
         """Execute lines in external or IPython console 
@@ -1743,7 +1769,7 @@ Please provide any additional information below.
         Redirect to the right widget (txt -> editor, spydata -> workspace, ...)
         or open file outside Spyder (if extension is not supported)
         """
-        fname = unicode(fname)
+        fname = to_text_string(fname)
         ext = osp.splitext(fname)[1]
         if ext in EDIT_EXT:
             self.editor.load(fname)
@@ -1759,6 +1785,7 @@ Please provide any additional information below.
         Open external files that can be handled either by the Editor or the
         variable explorer inside Spyder.
         """
+        fname = encoding.to_unicode_from_fs(fname)
         if osp.isfile(fname):
             self.open_file(fname, external=True)
         elif osp.isfile(osp.join(CWD, fname)):
@@ -1789,7 +1816,7 @@ Please provide any additional information below.
                      self.redirect_internalshell_stdio)
         dialog.exec_()
         self.add_path_to_sys_path()
-        encoding.writelines(self.path, self.spyder_path) # Saving path
+        encoding.writelines(self.path, self.SPYDER_PATH) # Saving path
         self.emit(SIGNAL("pythonpath_changed()"))
         
     def pythonpath_changed(self):
@@ -1909,7 +1936,7 @@ Please provide any additional information below.
         if filename is None:
             self.redirect_internalshell_stdio(False)
             filename, _selfilter = getopenfilename(self, _("Open session"),
-                        os.getcwdu(), _("Spyder sessions")+" (*.session.tar)")
+                        getcwd(), _("Spyder sessions")+" (*.session.tar)")
             self.redirect_internalshell_stdio(True)
             if not filename:
                 return
@@ -1920,7 +1947,7 @@ Please provide any additional information below.
         """Save session and quit application"""
         self.redirect_internalshell_stdio(False)
         filename, _selfilter = getsavefilename(self, _("Save session"),
-                        os.getcwdu(), _("Spyder sessions")+" (*.session.tar)")
+                        getcwd(), _("Spyder sessions")+" (*.session.tar)")
         self.redirect_internalshell_stdio(True)
         if filename:
             if self.close():
@@ -1945,8 +1972,9 @@ Please provide any additional information below.
                 raise
             fname = req.recv(1024)
             if not self.light:
+                fname = fname.decode('utf-8')
                 self.emit(SIGNAL('open_external_file(QString)'), fname)
-            req.sendall(' ')
+            req.sendall(b' ')
 
         
 def initialize():
@@ -2028,7 +2056,7 @@ class Spy(object):
         self.app = app
         self.window = window
     def __dir__(self):
-        return self.__dict__.keys() +\
+        return list(self.__dict__.keys()) +\
                  [x for x in dir(self.__class__) if x[0] != '_']
     def versions(self):
         return get_versions()
@@ -2115,25 +2143,25 @@ def main():
     if CONF.get('main', 'crash', False):
         CONF.set('main', 'crash', False)
         QMessageBox.information(None, "Spyder",
-            u"Spyder crashed during last session.<br><br>"
-            u"If Spyder does not start at all and <u>before submitting a "
-            u"bug report</u>, please try to reset settings to defaults by "
-            u"running Spyder with the command line option '--reset':<br>"
-            u"<span style=\'color: #555555\'><b>python spyder --reset"
-            u"</b></span><br><br>"
-            u"<span style=\'color: #ff5555\'><b>Warning:</b></span> "
-            u"this command will remove all your Spyder configuration files "
-            u"located in '%s').<br><br>"
-            u"If restoring the default settings does not help, please take "
-            u"the time to search for <a href=\"%s\">known bugs</a> or "
-            u"<a href=\"%s\">discussions</a> matching your situation before "
-            u"eventually creating a new issue <a href=\"%s\">here</a>. "
-            u"Your feedback will always be greatly appreciated."
-            u"" % (get_conf_path(), __project_url__,
-                   __forum_url__, __project_url__))
+            "Spyder crashed during last session.<br><br>"
+            "If Spyder does not start at all and <u>before submitting a "
+            "bug report</u>, please try to reset settings to defaults by "
+            "running Spyder with the command line option '--reset':<br>"
+            "<span style=\'color: #555555\'><b>python spyder --reset"
+            "</b></span><br><br>"
+            "<span style=\'color: #ff5555\'><b>Warning:</b></span> "
+            "this command will remove all your Spyder configuration files "
+            "located in '%s').<br><br>"
+            "If restoring the default settings does not help, please take "
+            "the time to search for <a href=\"%s\">known bugs</a> or "
+            "<a href=\"%s\">discussions</a> matching your situation before "
+            "eventually creating a new issue <a href=\"%s\">here</a>. "
+            "Your feedback will always be greatly appreciated."
+            "" % (get_conf_path(), __project_url__,
+                  __forum_url__, __project_url__))
         
     next_session_name = options.startup_session
-    while isinstance(next_session_name, basestring):
+    while is_text_string(next_session_name):
         if next_session_name:
             error_message = load_session(next_session_name)
             if next_session_name == TEMP_SESSION_PATH:
@@ -2141,12 +2169,10 @@ def main():
             if error_message is None:
                 CONF.load_from_ini()
             else:
-                print error_message
+                print(error_message)
                 QMessageBox.critical(None, "Load session",
-                                     u"<b>Unable to load '%s'</b>"
-                                     u"<br><br>Error message:<br>%s"
-                                      % (osp.basename(next_session_name),
-                                         error_message))
+                    u("<b>Unable to load '%s'</b><br><br>Error message:<br>%s")
+                    % (osp.basename(next_session_name), error_message))
         mainwindow = None
         try:
             mainwindow = run_spyder(app, options, args)
@@ -2154,7 +2180,7 @@ def main():
             CONF.set('main', 'crash', True)
             import traceback
             traceback.print_exc(file=STDERR)
-            traceback.print_exc(file=open('spyder_crash.log', 'wb'))            
+            traceback.print_exc(file=open('spyder_crash.log', 'w'))            
         if mainwindow is None:
             # An exception occured
             return
@@ -2171,10 +2197,8 @@ def main():
             error_message = save_session(save_session_name)
             if error_message is not None:
                 QMessageBox.critical(None, "Save session",
-                                     u"<b>Unable to save '%s'</b>"
-                                     u"<br><br>Error message:<br>%s"
-                                       % (osp.basename(save_session_name),
-                                          error_message))
+                    u("<b>Unable to save '%s'</b><br><br>Error message:<br>%s")
+                    % (osp.basename(save_session_name), error_message))
     ORIGINAL_SYS_EXIT()
 
 
diff --git a/spyderlib/start_app.py b/spyderlib/start_app.py
index cef3160..9da71e5 100644
--- a/spyderlib/start_app.py
+++ b/spyderlib/start_app.py
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 
+import os
 import os.path as osp
 import socket
 import time
@@ -11,7 +12,9 @@ import sys
 from spyderlib.cli_options import get_options
 from spyderlib.baseconfig import get_conf_path
 from spyderlib.config import CONF
+from spyderlib.baseconfig import DEV
 from spyderlib.utils.external import lockfile
+from spyderlib.py3compat import is_unicode
 
 
 def send_args_to_spyder(args):
@@ -24,12 +27,14 @@ def send_args_to_spyder(args):
     
     # Wait ~50 secs for the server to be up
     # Taken from http://stackoverflow.com/a/4766598/438386
-    for _x in xrange(200):
+    for _x in range(200):
         try:
             for arg in args:
                 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM,
                                        socket.IPPROTO_TCP)
                 client.connect(("127.0.0.1", port))
+                if is_unicode(arg):
+                    arg = arg.encode('utf-8')
                 client.send(osp.abspath(arg))
                 client.close()
         except socket.error:
@@ -42,6 +47,19 @@ def main():
     """Start Spyder application. If single instance mode is turned on (default
     behavior) and an instance of Spyder is already running, this will just 
     parse and send command line options to the application."""
+
+    # Renaming old configuration files (the '.' prefix has been removed)
+    # (except for .spyder.ini --> spyder.ini, which is done in userconfig.py)
+    if DEV is None:
+        cpath = get_conf_path()
+        for fname in os.listdir(cpath):
+            if fname.startswith('.'):
+                old, new = osp.join(cpath, fname), osp.join(cpath, fname[1:])
+                try:
+                    os.rename(old, new)
+                except OSError:
+                    pass
+
     # Parse command line options
     options, args = get_options()
 
diff --git a/spyderlib/userconfig.py b/spyderlib/userconfig.py
index 2c4d6c9..e66eccf 100644
--- a/spyderlib/userconfig.py
+++ b/spyderlib/userconfig.py
@@ -1,50 +1,56 @@
+#!/usr/bin/env python
 # -*- coding: utf-8 -*-
-"""
-userconfig
-==========
-
-Module handling configuration files based on ConfigParser
-
 
-userconfig License Agreement (MIT License)
-------------------------------------------
+#    userconfig License Agreement (MIT License)
+#    ------------------------------------------
+#    
+#    Copyright © 2009-2012 Pierre Raybaut
+#    
+#    Permission is hereby granted, free of charge, to any person
+#    obtaining a copy of this software and associated documentation
+#    files (the "Software"), to deal in the Software without
+#    restriction, including without limitation the rights to use,
+#    copy, modify, merge, publish, distribute, sublicense, and/or sell
+#    copies of the Software, and to permit persons to whom the
+#    Software is furnished to do so, subject to the following
+#    conditions:
+#    
+#    The above copyright notice and this permission notice shall be
+#    included in all copies or substantial portions of the Software.
+#    
+#    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+#    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+#    OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+#    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+#    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+#    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+#    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+#    OTHER DEALINGS IN THE SOFTWARE.
 
-Copyright (c) 2009 Pierre Raybaut
 
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
+"""
+userconfig
+----------
 
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
+The ``spyderlib.userconfig`` module provides user configuration file (.ini file)
+management features based on ``ConfigParser`` (standard Python library).
 """
 
-from __future__ import with_statement
+from __future__ import print_function
 
-__version__ = '1.0.13'
+__version__ = '1.1.0'
 __license__ = __doc__
 
-import os, re, os.path as osp, shutil, time
-from ConfigParser import (ConfigParser, MissingSectionHeaderError,
-                          NoSectionError, NoOptionError)
+import os
+import re
+import os.path as osp
+import shutil
+import time
 
-from spyderlib.baseconfig import TEST
+from spyderlib.baseconfig import DEV, TEST
 from spyderlib.utils import encoding
-
+from spyderlib.py3compat import configparser as cp
+from spyderlib.py3compat import is_text_string, PY2
 
 def get_home_dir():
     """
@@ -73,7 +79,7 @@ class NoDefault:
     pass
 
 
-class UserConfig(ConfigParser):
+class UserConfig(cp.ConfigParser):
     """
     UserConfig class, based on ConfigParser
     name: name of the config
@@ -89,7 +95,7 @@ class UserConfig(ConfigParser):
     def __init__(self, name, defaults=None, load=True, version=None,
                  subfolder=None, backup=False, raw_mode=False,
                  remove_obsolete=False):
-        ConfigParser.__init__(self)
+        cp.ConfigParser.__init__(self)
         self.raw = 1 if raw_mode else 0
         self.subfolder = subfolder
         if (version is not None) and (re.match('^(\d+).(\d+).(\d+)$', version) is None):
@@ -147,9 +153,14 @@ class UserConfig(ConfigParser):
         Load config from the associated .ini file
         """
         try:
-            self.read(self.filename())
-        except MissingSectionHeaderError:
-            print "Warning: File contains no section headers."
+            if PY2:
+                # Python 2
+                self.read(self.filename())
+            else:
+                # Python 3
+                self.read(self.filename(), encoding='utf-8')
+        except cp.MissingSectionHeaderError:
+            print("Warning: File contains no section headers.")
         
     def __remove_deprecated_options(self):
         """
@@ -170,19 +181,27 @@ class UserConfig(ConfigParser):
         # method contains all the exception handling.
         fname = self.filename()
 
+        def _write_file(fname):
+            if PY2:
+                # Python 2
+                with open(fname, 'w') as configfile:
+                    self.write(configfile)
+            else:
+                # Python 3
+                with open(fname, 'w', encoding='utf-8') as configfile:
+                    self.write(configfile)
+
         try: # the "easy" way
-            with open(fname, 'w') as conf_file:
-                self.write(conf_file)
+            _write_file(fname)
         except IOError:
             try: # the "delete and sleep" way
                 if osp.isfile(fname):
                     os.remove(fname)
                 time.sleep(0.05)
-                with open(fname, 'w') as conf_file:
-                    self.write(conf_file)
+                _write_file(fname)
             except Exception as e:
-                print "Failed to write user configuration file."
-                print "Please submit a bug report."
+                print("Failed to write user configuration file.")
+                print("Please submit a bug report.")
                 raise(e)
 
     def filename(self):
@@ -194,14 +213,26 @@ class UserConfig(ConfigParser):
         else:
             import tempfile
             folder = tempfile.gettempdir()
-        if self.subfolder is not None:
+        w_dot = osp.join(folder, '.%s.ini' % self.name)
+        if self.subfolder is None:
+            return w_dot
+        else:
             folder = osp.join(folder, self.subfolder)
             try:
                 os.makedirs(folder)
             except os.error:
                 # Folder (or one of its parents) already exists
                 pass
-        return osp.join(folder, '.%s.ini' % self.name)
+            old, new = w_dot, osp.join(folder, '%s.ini' % self.name)
+            if osp.isfile(old) and DEV is None:
+                try:
+                    if osp.isfile(new):
+                        os.remove(old)
+                    else:
+                        os.rename(old, new)
+                except OSError:
+                    pass
+            return new
         
     def cleanup(self):
         """
@@ -237,10 +268,10 @@ class UserConfig(ConfigParser):
         """
         if section is None:
             section = self.DEFAULT_SECTION_NAME
-        elif not isinstance(section, (str, unicode)):
-            raise ValueError("Argument 'section' must be a string")
-        if not isinstance(option, (str, unicode)):
-            raise ValueError("Argument 'option' must be a string")
+        elif not is_text_string(section):
+            raise RuntimeError("Argument 'section' must be a string")
+        if not is_text_string(option):
+            raise RuntimeError("Argument 'option' must be a string")
         return section
 
     def get_default(self, section, option):
@@ -267,18 +298,18 @@ class UserConfig(ConfigParser):
 
         if not self.has_section(section):
             if default is NoDefault:
-                raise NoSectionError(section)
+                raise cp.NoSectionError(section)
             else:
                 self.add_section(section)
         
         if not self.has_option(section, option):
             if default is NoDefault:
-                raise NoOptionError(option, section)
+                raise cp.NoOptionError(option, section)
             else:
                 self.set(section, option, default)
                 return default
             
-        value = ConfigParser.get(self, section, option, self.raw)
+        value = cp.ConfigParser.get(self, section, option, raw=self.raw)
         default_value = self.get_default(section, option)
         if isinstance(default_value, bool):
             value = eval(value)
@@ -287,7 +318,7 @@ class UserConfig(ConfigParser):
         elif isinstance(default_value, int):
             value = int(value)
         else:
-            if isinstance(default_value, basestring):
+            if PY2 and is_text_string(default_value):
                 try:
                     value = value.decode('utf-8')
                 except (UnicodeEncodeError, UnicodeDecodeError):
@@ -305,11 +336,11 @@ class UserConfig(ConfigParser):
         """
         if not self.has_section(section):
             self.add_section( section )
-        if not isinstance(value, (str, unicode)):
+        if not is_text_string(value):
             value = repr( value )
         if verbose:
-            print '%s[ %s ] = %s' % (section, option, value)
-        ConfigParser.set(self, section, option, value)
+            print('%s[ %s ] = %s' % (section, option, value))
+        cp.ConfigParser.set(self, section, option, value)
 
     def set_default(self, section, option, default_value):
         """
@@ -337,16 +368,16 @@ class UserConfig(ConfigParser):
             value = float(value)
         elif isinstance(default_value, int):
             value = int(value)
-        else:
+        elif not is_text_string(default_value):
             value = repr(value)
         self.__set(section, option, value, verbose)
         if save:
             self.__save()
             
     def remove_section(self, section):
-        ConfigParser.remove_section(self, section)
+        cp.ConfigParser.remove_section(self, section)
         self.__save()
             
     def remove_option(self, section, option):
-        ConfigParser.remove_option(self, section, option)
+        cp.ConfigParser.remove_option(self, section, option)
         self.__save()
diff --git a/spyderlib/utils/bsdsocket.py b/spyderlib/utils/bsdsocket.py
index 5a95713..e8d1ef0 100644
--- a/spyderlib/utils/bsdsocket.py
+++ b/spyderlib/utils/bsdsocket.py
@@ -13,10 +13,12 @@
 import os
 import socket
 import struct
-import cPickle as pickle
 import threading
 import errno
 
+# Local imports
+from spyderlib.py3compat import pickle
+
 
 def temp_fail_retry(error, fun, *args):
     """Retry to execute function, ignoring EINTR error (interruptions)"""
@@ -57,7 +59,7 @@ def read_packet(sock, timeout=None):
             #  Windows implementation
             datalen = sock.recv(SZ)
             dlen, = struct.unpack("l", datalen)
-            data = ''
+            data = b''
             while len(data) < dlen:
                 data += sock.recv(dlen)
         else:
@@ -138,7 +140,7 @@ if __name__ == '__main__':
     # socket read/write testing - client and server in one thread
     
     # (techtonik): the stuff below is placed into public domain
-    print "-- Testing standard Python socket interface --"
+    print("-- Testing standard Python socket interface --")
 
     address = ("127.0.0.1", 9999)
     
@@ -155,9 +157,9 @@ if __name__ == '__main__':
     # accepted server socket is the one we can read from
     # note that it is different from server socket
     accsock, addr = server.accept()
-    print '..got "%s" from %s' % (accsock.recv(4096), addr)
+    print('..got "%s" from %s' % (accsock.recv(4096), addr))
     client.send("more data for recv")
-    print '..got "%s" from %s' % (accsock.recv(4096), addr)
+    print('..got "%s" from %s' % (accsock.recv(4096), addr))
     
     # accsock.close()
     # client.send("more data for recv")
@@ -166,12 +168,12 @@ if __name__ == '__main__':
     #socket.error: [Errno 11] Resource temporarily unavailable
     
 
-    print "-- Testing BSD socket write_packet/read_packet --"
+    print("-- Testing BSD socket write_packet/read_packet --")
 
     write_packet(client, "a tiny piece of data")
-    print '..got "%s" from read_packet()' % (read_packet(accsock))
+    print('..got "%s" from read_packet()' % (read_packet(accsock)))
     
     client.close()
     server.close()
     
-    print "-- Done."
+    print("-- Done.")
diff --git a/spyderlib/utils/classparser.py b/spyderlib/utils/classparser.py
deleted file mode 100644
index 33673ae..0000000
--- a/spyderlib/utils/classparser.py
+++ /dev/null
@@ -1,196 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""
-Python class/function parser
-
-Derived from "Demo/parser/example.py" from Python distribution
-
-******************************** WARNING ***************************************
-    This module is not used anymore in Spyder since v1.1.0.
-    However, it will still be part of spyderlib module for a little while -
-    we never know, it could be useful...
-********************************************************************************
-"""
-
-import os
-import parser
-import symbol
-from types import ListType, TupleType
-
-
-def get_info(fileName):
-    source = open(fileName, "U").read() + "\n"
-    basename = os.path.basename(os.path.splitext(fileName)[0])
-    ast = parser.suite(source)
-    return ModuleInfo(ast.totuple(line_info=True), basename)
-
-def get_classes(filename):
-    """
-    Return classes (with methods) and functions of module *filename*:
-    [ (class1_lineno, class1_name, [ (method1_lineno, method1_name), ]),
-      (func1_lineno, func1_name, None),]
-    """
-    moduleinfo = get_info(filename)
-    classes = []
-    for classname in moduleinfo.get_class_names():
-        clinfo = moduleinfo.get_class_info(classname)
-        methods = []
-        for methodname in clinfo.get_method_names():
-            minfo = clinfo.get_method_info(methodname)
-            methods.append( (minfo.get_lineno(), methodname) )
-        methods.sort()
-        classes.append( (clinfo.get_lineno(), classname, methods) )
-    for funcname in moduleinfo.get_function_names():
-        finfo = moduleinfo.get_function_info(funcname)
-        classes.append( (finfo.get_lineno(), funcname, None) )
-    classes.sort()
-    return classes
-
-
-class SuiteInfoBase:
-    _name = ''
-    _lineno = -1
-    #  This pattern identifies compound statements, allowing them to be readily
-    #  differentiated from simple statements.
-    #
-    COMPOUND_STMT_PATTERN = (
-        symbol.stmt,
-        (symbol.compound_stmt, ['compound'])
-        )
-
-    def __init__(self, tree = None):
-        self._class_info = {}
-        self._function_info = {}
-        if tree:
-            self._extract_info(tree)
-
-    def _extract_info(self, tree):
-        # extract docstring
-        # discover inner definitions
-        for node in tree[1:]:
-            found, vars = match(self.COMPOUND_STMT_PATTERN, node)
-            if found:
-                cstmt = vars['compound']
-                if cstmt[0] == symbol.funcdef:
-                    func_info = FunctionInfo(cstmt)
-                    self._function_info[func_info._name] = func_info
-                elif cstmt[0] == symbol.classdef:
-                    class_info = ClassInfo(cstmt)
-                    self._class_info[class_info._name] = class_info
-
-    def get_name(self):
-        return self._name
-        
-    def get_lineno(self):
-        return self._lineno
-
-    def get_class_names(self):
-        return self._class_info.keys()
-
-    def get_class_info(self, name):
-        return self._class_info[name]
-
-    def __getitem__(self, name):
-        try:
-            return self._class_info[name]
-        except KeyError:
-            return self._function_info[name]
-
-
-class SuiteFuncInfo:
-    #  Mixin class providing access to function names and info.
-
-    def get_function_names(self):
-        return self._function_info.keys()
-
-    def get_function_info(self, name):
-        return self._function_info[name]
-
-
-class FunctionInfo(SuiteInfoBase, SuiteFuncInfo):
-    def __init__(self, tree = None):
-        index = 2
-        prefix = ''
-        if tree[1][0] == symbol.decorators:
-            index += 1
-            prefix = '@'
-        self._name = prefix + tree[index][1]
-        self._lineno = tree[index][2]
-        SuiteInfoBase.__init__(self, tree and tree[-1] or None)
-
-
-class ClassInfo(SuiteInfoBase):
-    def __init__(self, tree = None):
-        self._name = tree[2][1]
-        self._lineno = tree[2][2]
-        SuiteInfoBase.__init__(self, tree and tree[-1] or None)
-
-    def get_method_names(self):
-        return self._function_info.keys()
-
-    def get_method_info(self, name):
-        return self._function_info[name]
-
-
-class ModuleInfo(SuiteInfoBase, SuiteFuncInfo):
-    def __init__(self, tree = None, name = "<string>"):
-        self._name = name
-        self._lineno = 0
-        if tree[0] == symbol.encoding_decl:
-            self._encoding = tree[2]
-            tree = tree[1]
-        else:
-            self._encoding = 'ascii'
-        SuiteInfoBase.__init__(self, tree)
-
-
-def match(pattern, data, vars=None):
-    """Match `data' to `pattern', with variable extraction.
-
-    pattern
-        Pattern to match against, possibly containing variables.
-
-    data
-        Data to be checked and against which variables are extracted.
-
-    vars
-        Dictionary of variables which have already been found.  If not
-        provided, an empty dictionary is created.
-
-    The `pattern' value may contain variables of the form ['varname'] which
-    are allowed to match anything.  The value that is matched is returned as
-    part of a dictionary which maps 'varname' to the matched value.  'varname'
-    is not required to be a string object, but using strings makes patterns
-    and the code which uses them more readable.
-
-    This function returns two values: a boolean indicating whether a match
-    was found and a dictionary mapping variable names to their associated
-    values.
-    """
-    if vars is None:
-        vars = {}
-    if type(pattern) is ListType:       # 'variables' are ['varname']
-        vars[pattern[0]] = data
-        return 1, vars
-    if type(pattern) is not TupleType:
-        return (pattern == data), vars
-    if len(data) != len(pattern):
-        return 0, vars
-    for pattern, data in map(None, pattern, data):
-        same, vars = match(pattern, data, vars)
-        if not same:
-            break
-    return same, vars
-
-
-if __name__ == '__main__':
-    import sys, time
-    t0 = time.time()
-    classes = get_classes(sys.argv[1])
-    print "Elapsed time: %s ms" % round((time.time()-t0)*1000)
-#    from pprint import pprint
-#    pprint(classes)
diff --git a/spyderlib/utils/codeanalysis.py b/spyderlib/utils/codeanalysis.py
index ab29b31..f6a8721 100644
--- a/spyderlib/utils/codeanalysis.py
+++ b/spyderlib/utils/codeanalysis.py
@@ -17,6 +17,7 @@ import tempfile
 # Local import
 from spyderlib.baseconfig import _
 from spyderlib.utils import programs
+from spyderlib.py3compat import to_text_string, to_binary_string, PY3
 from spyderlib import dependencies
 
 
@@ -40,13 +41,18 @@ def check_with_pyflakes(source_code, filename=None):
     Returns an empty list if pyflakes is not installed"""
     if filename is None:
         filename = '<string>'
-    source_code += '\n'
+    try:
+        source_code += '\n'
+    except TypeError:
+        # Python 3
+        source_code += to_binary_string('\n')
+        
     import _ast
     from pyflakes.checker import Checker
     # First, compile into an AST and handle syntax errors.
     try:
         tree = compile(source_code, filename, "exec", _ast.PyCF_ONLY_AST)
-    except SyntaxError, value:
+    except SyntaxError as value:
         # If there's an encoding problem with the file, the text is None.
         if value.text is None:
             return []
@@ -61,18 +67,19 @@ def check_with_pyflakes(source_code, filename=None):
     else:
         # Okay, it's syntactically valid.  Now check it.
         w = Checker(tree, filename)
-        w.messages.sort(lambda a, b: cmp(a.lineno, b.lineno))
+        w.messages.sort(key=lambda x: x.lineno)
         results = []
         lines = source_code.splitlines()
         for warning in w.messages:
-            if 'analysis:ignore' not in lines[warning.lineno-1]:
+            if 'analysis:ignore' not in \
+               to_text_string(lines[warning.lineno-1]):
                 results.append((warning.message % warning.message_args,
                                 warning.lineno))
         return results
 
-# Required versions
-# Why >=0.5.0? Because it's based on _ast (thread-safe)
-PYFLAKES_REQVER = '>=0.5.0'
+# Required version:
+# Why 0.5 (Python2)? Because it's based on _ast (thread-safe)
+PYFLAKES_REQVER = '>=0.6.0' if PY3 else '>=0.5.0'
 dependencies.add("pyflakes", _("Real-time code analysis on the Editor"),
                  required_version=PYFLAKES_REQVER)
 
@@ -129,14 +136,14 @@ def check(args, source_code, filename=None, options=None):
     else:
         args.append(filename)
     output = Popen(args, stdout=PIPE, stderr=PIPE
-                   ).communicate()[0].strip().splitlines()
+                   ).communicate()[0].strip().decode().splitlines()
     if filename is None:
         os.unlink(tempfd.name)
     results = []
     lines = source_code.splitlines()
     for line in output:
         lineno = int(re.search(r'(\:[\d]+\:)', line).group()[1:-1])
-        if 'analysis:ignore' not in lines[lineno-1]:
+        if 'analysis:ignore' not in to_text_string(lines[lineno-1]):
             message = line[line.find(': ')+2:]
             results.append((message, lineno))
     return results
@@ -149,9 +156,12 @@ def check_with_pep8(source_code, filename=None):
 
 
 if __name__ == '__main__':
-    fname = __file__
-    code = file(fname, 'U').read()
+#    fname = __file__
+    fname = os.path.join(os.path.dirname(__file__),
+                         os.pardir, os.pardir, 'bootstrap.py')
+    code = open(fname).read()
     check_results = check_with_pyflakes(code, fname)+\
                     check_with_pep8(code, fname)+find_tasks(code)
+#    check_results = check_with_pep8(code, fname)
     for message, line in check_results:
-        print "Message: %s -- Line: %s" % (message, line)
+        sys.stdout.write("Message: %s -- Line: %s\n" % (message, line))
diff --git a/spyderlib/utils/debug.py b/spyderlib/utils/debug.py
index 50d1ff2..4ef5538 100644
--- a/spyderlib/utils/debug.py
+++ b/spyderlib/utils/debug.py
@@ -1,10 +1,18 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright © 2009-2010 Pierre Raybaut
+# Copyright © 2009-2013 Pierre Raybaut
+# Copyright © 2012-2013 anatoly techtonik
+#
 # Licensed under the terms of the MIT License
 # (see spyderlib/__init__.py for details)
 
-"""Debug utilities"""
+"""
+Debug utilities that are independent of Spyder code.
+
+See spyderlib.baseconfig for other helpers.
+"""
+
+from __future__ import print_function
 
 import inspect
 import traceback
@@ -13,42 +21,43 @@ import time
 
 def log_time(fd):
     timestr = "Logging time: %s" % time.ctime(time.time())
-    print >>fd, "="*len(timestr)
-    print >>fd, timestr
-    print >>fd, "="*len(timestr)
-    print >>fd, ""
+    print("="*len(timestr), file=fd)
+    print(timestr, file=fd)
+    print("="*len(timestr), file=fd)
+    print("", file=fd)
 
 def log_last_error(fname, context=None):
     """Log last error in filename *fname* -- *context*: string (optional)"""
     fd = open(fname, 'a')
     log_time(fd)
     if context:
-        print >>fd, "Context"
-        print >>fd, "-------"
-        print >>fd, ""
-        print >>fd, context
-        print >>fd, ""
-        print >>fd, "Traceback"
-        print >>fd, "---------"
-        print >>fd, ""
+        print("Context", file=fd)
+        print("-------", file=fd)
+        print("", file=fd)
+        print(context, file=fd)
+        print("", file=fd)
+        print("Traceback", file=fd)
+        print("---------", file=fd)
+        print("", file=fd)
     traceback.print_exc(file=fd)
-    print >>fd, ""
-    print >>fd, ""
+    print("", file=fd)
+    print("", file=fd)
 
 def log_dt(fname, context, t0):
     fd = open(fname, 'a')
     log_time(fd)
-    print >>fd, "%s: %d ms" % (context, 10*round(1e2*(time.time()-t0)))
-    print >>fd, ""
-    print >>fd, ""
+    print("%s: %d ms" % (context, 10*round(1e2*(time.time()-t0))), file=fd)
+    print("", file=fd)
+    print("", file=fd)
 
 def caller_name(skip=2):
-    """Get a name of a caller in the format module.class.method
-    
-       `skip` specifies how many levels of stack to skip while getting caller
-       name. skip=1 means "who calls me", skip=2 "who calls my caller" etc.
+    """
+    Get name of a caller in the format module.class.method
+
+    `skip` specifies how many levels of call stack to skip for caller's name.
+    skip=1 means "who calls me", skip=2 "who calls my caller" etc.
        
-       An empty string is returned if skipped levels exceed stack height
+    An empty string is returned if skipped levels exceed stack height
     """
     stack = inspect.stack()
     start = 0 + skip
@@ -73,3 +82,62 @@ def caller_name(skip=2):
         name.append( codename ) # function or a method
     del parentframe
     return ".".join(name)
+
+def get_class_that_defined(method):
+    for cls in inspect.getmro(method.im_class):
+        if method.__name__ in cls.__dict__:
+            return cls.__name__
+
+def log_methods_calls(fname, some_class, prefix=None):
+    """
+    Hack `some_class` to log all method calls into `fname` file.
+    If `prefix` format is not set, each log entry is prefixed with:
+      --[ asked / called / defined ] --
+        asked   - name of `some_class`
+        called  - name of class for which a method is called
+        defined - name of class where method is defined
+    
+    Must be used carefully, because it monkeypatches __getattribute__ call.
+    
+    Example:  log_methods_calls('log.log', ShellBaseWidget)
+    """
+    # test if file is writable
+    open(fname, 'a').close()
+    FILENAME = fname
+    CLASS = some_class
+
+    PREFIX = "--[ %(asked)s / %(called)s / %(defined)s ]--"
+    if prefix != None:
+        PREFIX = prefix
+    MAXWIDTH = {'o_O': 10}  # hack with editable closure dict, to align names
+               
+    def format_prefix(method, methodobj):
+        """
+        --[ ShellBase / Internal / BaseEdit ]------- get_position
+        """
+        classnames = {
+            'asked': CLASS.__name__,
+            'called': methodobj.__class__.__name__,
+            'defined': get_class_that_defined(method)
+        }
+        line = PREFIX % classnames
+        MAXWIDTH['o_O'] = max(len(line), MAXWIDTH['o_O'])
+        return line.ljust(MAXWIDTH['o_O'], '-')
+       
+    import types
+    def __getattribute__(self, name):
+        attr = object.__getattribute__(self, name)
+        if type(attr) is not types.MethodType:
+            return attr
+        else:
+            def newfunc(*args, **kwargs):
+                log = open(FILENAME, 'a')
+                prefix = format_prefix(attr, self)
+                log.write('%s %s\n' % (prefix, name))
+                log.close()
+                result = attr(*args, **kwargs)
+                return result
+            return newfunc
+ 
+    some_class.__getattribute__ = __getattribute__
+    
diff --git a/spyderlib/utils/dochelpers.py b/spyderlib/utils/dochelpers.py
index 769f0da..286f2c9 100644
--- a/spyderlib/utils/dochelpers.py
+++ b/spyderlib/utils/dochelpers.py
@@ -6,11 +6,17 @@
 
 """Utilities and wrappers around inspect module"""
 
+from __future__ import print_function
+
 import inspect
 import re
 
 # Local imports:
 from spyderlib.utils import encoding
+from spyderlib.py3compat import (is_text_string, builtins, get_meth_func,
+                                 get_meth_class_inst, get_meth_class,
+                                 get_func_defaults, to_text_string)
+
 
 SYMBOLS = r"[^\'\"a-zA-Z0-9_.]"
 
@@ -48,7 +54,7 @@ def getobjdir(obj):
     In special cases (e.g. WrapITK package), will return only string elements
     of result returned by dir(obj)
     """
-    return [item for item in dir(obj) if isinstance(item, basestring)]
+    return [item for item in dir(obj) if is_text_string(item)]
 
 def getdoc(obj):
     """
@@ -74,7 +80,7 @@ def getdoc(obj):
     # yield anything, either. So assume the most commonly used
     # multi-byte file encoding (which also covers ascii). 
     try:
-        docstring = unicode(docstring, 'utf-8')
+        docstring = to_text_string(docstring)
     except:
         pass
     
@@ -91,13 +97,13 @@ def getdoc(obj):
             doc['docstring'] = docstring
             return doc
         if inspect.ismethod(obj):
-            imclass = obj.im_class
-            if obj.im_self is not None:
+            imclass = get_meth_class(obj)
+            if get_meth_class_inst(obj) is not None:
                 doc['note'] = 'Method of %s instance' \
-                              % obj.im_self.__class__.__name__
+                              % get_meth_class_inst(obj).__class__.__name__
             else:
                 doc['note'] = 'Unbound %s method' % imclass.__name__
-            obj = obj.im_func
+            obj = get_meth_func(obj)
         elif hasattr(obj, '__module__'):
             doc['note'] = 'Function of %s module' % obj.__module__
         else:
@@ -183,7 +189,7 @@ def getargs(obj):
     if inspect.isfunction(obj) or inspect.isbuiltin(obj):
         func_obj = obj
     elif inspect.ismethod(obj):
-        func_obj = obj.im_func
+        func_obj = get_meth_func(obj)
     elif inspect.isclass(obj) and hasattr(obj, '__init__'):
         func_obj = getattr(obj, '__init__')
     else:
@@ -205,7 +211,7 @@ def getargs(obj):
         if isinstance(arg, list):
             args[i_arg] = "(%s)" % ", ".join(arg)
             
-    defaults = func_obj.func_defaults
+    defaults = get_func_defaults(func_obj)
     if defaults is not None:
         for index, default in enumerate(defaults):
             args[index+len(args)-len(defaults)] += '='+repr(default)
@@ -250,8 +256,7 @@ def isdefined(obj, force_import=False, namespace=None):
     base = attr_list.pop(0)
     if len(base) == 0:
         return False
-    import __builtin__
-    if base not in __builtin__.__dict__ and base not in namespace:
+    if base not in builtins.__dict__ and base not in namespace:
         if force_import:
             try:
                 module = __import__(base, globals(), namespace)
@@ -281,16 +286,16 @@ def isdefined(obj, force_import=False, namespace=None):
 
 if __name__ == "__main__":
     class Test(object):
-        def method(self, x, y=2, (u, v, w)=(None, 0, 0)):
+        def method(self, x, y=2):
             pass
-    print getargtxt(Test.__init__)
-    print getargtxt(Test.method)
-    print isdefined('numpy.take', force_import=True)
-    print isdefined('__import__')
-    print isdefined('.keys', force_import=True)
-    print getobj('globals')
-    print getobj('globals().keys')
-    print getobj('+scipy.signal.')
-    print getobj('4.')
-    print getdoc(sorted)
-    print getargtxt(sorted)
+    print(getargtxt(Test.__init__))
+    print(getargtxt(Test.method))
+    print(isdefined('numpy.take', force_import=True))
+    print(isdefined('__import__'))
+    print(isdefined('.keys', force_import=True))
+    print(getobj('globals'))
+    print(getobj('globals().keys'))
+    print(getobj('+scipy.signal.'))
+    print(getobj('4.'))
+    print(getdoc(sorted))
+    print(getargtxt(sorted))
diff --git a/spyderlib/utils/encoding.py b/spyderlib/utils/encoding.py
index 1516702..0c1fee3 100644
--- a/spyderlib/utils/encoding.py
+++ b/spyderlib/utils/encoding.py
@@ -11,14 +11,16 @@ Functions 'get_coding', 'decode', 'encode' and 'to_unicode' come from Eric4
 source code (Utilities/__init___.py) Copyright © 2003-2009 Detlev Offenbach
 """
 
-from __future__ import with_statement
-
 import re
 import os
 import locale
 import sys
 from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF32
 
+# Local imports
+from spyderlib.py3compat import (is_string, to_text_string, is_binary_string,
+                                 is_unicode)
+
 
 PREFERRED_ENCODING = locale.getpreferredencoding()
 
@@ -56,10 +58,10 @@ def to_unicode_from_fs(string):
     """
     Return a unicode version of string decoded using the file system encoding.
     """
-    if not isinstance(string, basestring): # string is a QString
-        string = unicode(string.toUtf8(), 'utf-8')
+    if not is_string(string): # string is a QString
+        string = to_text_string(string.toUtf8(), 'utf-8')
     else:
-        if not isinstance(string, unicode):
+        if is_binary_string(string):
             try:
                 unic = string.decode(FS_ENCODING)
             except (UnicodeError, TypeError):
@@ -73,7 +75,7 @@ def to_fs_from_unicode(unic):
     Return a byte string version of unic encoded using the file 
     system encoding.
     """
-    if isinstance(unic, unicode):
+    if is_unicode(unic):
         try:
             string = unic.encode(FS_ENCODING)
         except (UnicodeError, TypeError):
@@ -94,14 +96,14 @@ CODECS = ['utf-8', 'iso8859-1',  'iso8859-15', 'koi8-r',
           'iso8859-6', 'iso8859-7', 'iso8859-8', 'iso8859-9', 
           'iso8859-10', 'iso8859-13', 'iso8859-14', 'latin-1', 
           'utf-16']
-    
+
 def get_coding(text):
     """
     Function to get the coding of a text.
     @param text text to inspect (string)
     @return coding string
     """
-    for line in text.splitlines()[:2]:
+    for line in to_text_string(text.splitlines()[:2]):
         result = CODING_RE.search(line)
         if result:
             return result.group(1)
@@ -116,25 +118,25 @@ def decode(text):
     try:
         if text.startswith(BOM_UTF8):
             # UTF-8 with BOM
-            return unicode(text[len(BOM_UTF8):], 'utf-8'), 'utf-8-bom'
+            return to_text_string(text[len(BOM_UTF8):], 'utf-8'), 'utf-8-bom'
         elif text.startswith(BOM_UTF16):
             # UTF-16 with BOM
-            return unicode(text[len(BOM_UTF16):], 'utf-16'), 'utf-16'
+            return to_text_string(text[len(BOM_UTF16):], 'utf-16'), 'utf-16'
         elif text.startswith(BOM_UTF32):
             # UTF-32 with BOM
-            return unicode(text[len(BOM_UTF32):], 'utf-32'), 'utf-32'
+            return to_text_string(text[len(BOM_UTF32):], 'utf-32'), 'utf-32'
         coding = get_coding(text)
         if coding:
-            return unicode(text, coding), coding
+            return to_text_string(text, coding), coding
     except (UnicodeError, LookupError):
         pass
     # Assume UTF-8
     try:
-        return unicode(text, 'utf-8'), 'utf-8-guessed'
+        return to_text_string(text, 'utf-8'), 'utf-8-guessed'
     except (UnicodeError, LookupError):
         pass
     # Assume Latin-1 (behaviour before 3.7.1)
-    return unicode(text, "latin-1"), 'latin-1-guessed'
+    return to_text_string(text, "latin-1"), 'latin-1-guessed'
 
 def encode(text, orig_coding):
     """
@@ -173,10 +175,10 @@ def encode(text, orig_coding):
     
 def to_unicode(string):
     """Convert a string to unicode"""
-    if not isinstance(string, unicode):
+    if not is_unicode(string):
         for codec in CODECS:
             try:
-                unic = unicode(string, codec)
+                unic = to_text_string(string, codec)
             except UnicodeError:
                 pass
             except TypeError:
@@ -208,7 +210,7 @@ def read(filename, encoding='utf-8'):
     Read text from file ('filename')
     Return text and encoding
     """
-    text, encoding = decode( file(filename, 'rb').read() )
+    text, encoding = decode( open(filename, 'rb').read() )
     return text, encoding
 
 def readlines(filename, encoding='utf-8'):
diff --git a/spyderlib/utils/external/lockfile.py b/spyderlib/utils/external/lockfile.py
index 35984a8..20775e4 100644
--- a/spyderlib/utils/external/lockfile.py
+++ b/spyderlib/utils/external/lockfile.py
@@ -1,230 +1,233 @@
-# Copyright (c) 2005 Divmod, Inc.
-# Copyright (c) Twisted Matrix Laboratories.
-# Copyright (c) 2013 The Spyder Development Team
-# Twisted is distributed under the MIT license.
-
-"""
-Filesystem-based interprocess mutex.
-
-Changes by the Spyder Team to the original Twisted file:
--. Rewrite kill Windows function to make it more reliable
-"""
-
-__metaclass__ = type
-
-import errno, os
-
-from time import time as _uniquefloat
-
-def unique():
-    return str(long(_uniquefloat() * 1000))
-
-from os import rename
-if not os.name == 'nt':
-    from os import kill
-    from os import symlink
-    from os import readlink
-    from os import remove as rmlink
-    _windows = False
-else:
-    _windows = True
-
-    try:
-        import ctypes
-        from ctypes import wintypes
-        import win32con
-    except ImportError:
-        kill = None   #analysis:ignore
-    else:
-        # GetExitCodeProcess uses a special exit code to indicate that the
-        # process is still running.
-        STILL_ACTIVE = 259
-        
-        def _is_pid_running(pid):
-            """Taken from http://www.madebuild.org/blog/?p=30"""
-            kernel32 = ctypes.windll.kernel32
-            handle = kernel32.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, 0,
-                                          pid)
-            if handle == 0:
-                return False
-             
-            # If the process exited recently, a pid may still exist for the
-            # handle. So, check if we can get the exit code.
-            exit_code = wintypes.DWORD()
-            retval = kernel32.GetExitCodeProcess(handle,
-                                                 ctypes.byref(exit_code))
-            is_running = (retval == 0)
-            kernel32.CloseHandle(handle)
-             
-            # See if we couldn't get the exit code or the exit code indicates
-            # that the process is still running.
-            return is_running or exit_code.value == STILL_ACTIVE
-
-        def kill(pid, signal):
-            if not _is_pid_running(pid):
-                raise OSError(errno.ESRCH, None)
-            else:
-                return
-            
-    _open = file
-
-    # XXX Implement an atomic thingamajig for win32
-    def symlink(value, filename):    #analysis:ignore
-        newlinkname = filename+"."+unique()+'.newlink'
-        newvalname = os.path.join(newlinkname,"symlink")
-        os.mkdir(newlinkname)
-        f = _open(newvalname,'wcb')
-        f.write(value)
-        f.flush()
-        f.close()
-        try:
-            rename(newlinkname, filename)
-        except:
-            os.remove(newvalname)
-            os.rmdir(newlinkname)
-            raise
-
-    def readlink(filename):   #analysis:ignore
-        try:
-            fObj = _open(os.path.join(filename,'symlink'), 'rb')
-        except IOError, e:
-            if e.errno == errno.ENOENT or e.errno == errno.EIO:
-                raise OSError(e.errno, None)
-            raise
-        else:
-            result = fObj.read()
-            fObj.close()
-            return result
-
-    def rmlink(filename):    #analysis:ignore
-        os.remove(os.path.join(filename, 'symlink'))
-        os.rmdir(filename)
-
-
-
-class FilesystemLock:
-    """
-    A mutex.
-
-    This relies on the filesystem property that creating
-    a symlink is an atomic operation and that it will
-    fail if the symlink already exists.  Deleting the
-    symlink will release the lock.
-
-    @ivar name: The name of the file associated with this lock.
-
-    @ivar clean: Indicates whether this lock was released cleanly by its
-        last owner.  Only meaningful after C{lock} has been called and
-        returns True.
-
-    @ivar locked: Indicates whether the lock is currently held by this
-        object.
-    """
-
-    clean = None
-    locked = False
-
-    def __init__(self, name):
-        self.name = name
-
-
-    def lock(self):
-        """
-        Acquire this lock.
-
-        @rtype: C{bool}
-        @return: True if the lock is acquired, false otherwise.
-
-        @raise: Any exception os.symlink() may raise, other than
-        EEXIST.
-        """
-        clean = True
-        while True:
-            try:
-                symlink(str(os.getpid()), self.name)
-            except OSError, e:
-                if _windows and e.errno in (errno.EACCES, errno.EIO):
-                    # The lock is in the middle of being deleted because we're
-                    # on Windows where lock removal isn't atomic.  Give up, we
-                    # don't know how long this is going to take.
-                    return False
-                if e.errno == errno.EEXIST:
-                    try:
-                        pid = readlink(self.name)
-                    except OSError, e:
-                        if e.errno == errno.ENOENT:
-                            # The lock has vanished, try to claim it in the
-                            # next iteration through the loop.
-                            continue
-                        raise
-                    except IOError, e:
-                        if _windows and e.errno == errno.EACCES:
-                            # The lock is in the middle of being
-                            # deleted because we're on Windows where
-                            # lock removal isn't atomic.  Give up, we
-                            # don't know how long this is going to
-                            # take.
-                            return False
-                        raise
-                    try:
-                        if kill is not None:
-                            kill(int(pid), 0)
-                    except OSError, e:
-                        if e.errno == errno.ESRCH:
-                            # The owner has vanished, try to claim it in the next
-                            # iteration through the loop.
-                            try:
-                                rmlink(self.name)
-                            except OSError, e:
-                                if e.errno == errno.ENOENT:
-                                    # Another process cleaned up the lock.
-                                    # Race them to acquire it in the next
-                                    # iteration through the loop.
-                                    continue
-                                raise
-                            clean = False
-                            continue
-                        raise
-                    return False
-                raise
-            self.locked = True
-            self.clean = clean
-            return True
-
-
-    def unlock(self):
-        """
-        Release this lock.
-
-        This deletes the directory with the given name.
-
-        @raise: Any exception os.readlink() may raise, or
-        ValueError if the lock is not owned by this process.
-        """
-        pid = readlink(self.name)
-        if int(pid) != os.getpid():
-            raise ValueError("Lock %r not owned by this process" % (self.name,))
-        rmlink(self.name)
-        self.locked = False
-
-
-def isLocked(name):
-    """Determine if the lock of the given name is held or not.
-
-    @type name: C{str}
-    @param name: The filesystem path to the lock to test
-
-    @rtype: C{bool}
-    @return: True if the lock is held, False otherwise.
-    """
-    l = FilesystemLock(name)
-    result = None
-    try:
-        result = l.lock()
-    finally:
-        if result:
-            l.unlock()
-    return not result
-
-
-__all__ = ['FilesystemLock', 'isLocked']
+# Copyright (c) 2005 Divmod, Inc.
+# Copyright (c) Twisted Matrix Laboratories.
+# Copyright (c) 2013 The Spyder Development Team
+# Twisted is distributed under the MIT license.
+
+"""
+Filesystem-based interprocess mutex.
+
+Changes by the Spyder Team to the original Twisted file:
+-. Rewrite kill Windows function to make it more reliable
+"""
+
+__metaclass__ = type
+
+import errno, os
+
+from time import time as _uniquefloat
+
+from spyderlib.py3compat import PY2, to_binary_string, to_text_string
+
+def unique():
+    if PY2:
+        return str(long(_uniquefloat() * 1000))
+    else:
+        return str(int(_uniquefloat() * 1000))
+
+from os import rename
+if not os.name == 'nt':
+    from os import kill
+    from os import symlink
+    from os import readlink
+    from os import remove as rmlink
+    _windows = False
+else:
+    _windows = True
+
+    import ctypes
+    from ctypes import wintypes
+
+    # http://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx
+    PROCESS_QUERY_INFORMATION = 0x400
+
+    # GetExitCodeProcess uses a special exit code to indicate that the
+    # process is still running.
+    STILL_ACTIVE = 259
+    
+    def _is_pid_running(pid):
+        """Taken from http://www.madebuild.org/blog/?p=30"""
+        kernel32 = ctypes.windll.kernel32
+        handle = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
+        if handle == 0:
+            return False
+         
+        # If the process exited recently, a pid may still exist for the
+        # handle. So, check if we can get the exit code.
+        exit_code = wintypes.DWORD()
+        retval = kernel32.GetExitCodeProcess(handle,
+                                             ctypes.byref(exit_code))
+        is_running = (retval == 0)
+        kernel32.CloseHandle(handle)
+         
+        # See if we couldn't get the exit code or the exit code indicates
+        # that the process is still running.
+        return is_running or exit_code.value == STILL_ACTIVE
+
+    def kill(pid, signal):
+        if not _is_pid_running(pid):
+            raise OSError(errno.ESRCH, None)
+        else:
+            return
+            
+    _open = open
+
+    # XXX Implement an atomic thingamajig for win32
+    def symlink(value, filename):    #analysis:ignore
+        newlinkname = filename+"."+unique()+'.newlink'
+        newvalname = os.path.join(newlinkname, "symlink")
+        os.mkdir(newlinkname)
+        f = _open(newvalname, 'wb')
+        f.write(to_binary_string(value))
+        f.flush()
+        f.close()
+        try:
+            rename(newlinkname, filename)
+        except:
+            os.remove(newvalname)
+            os.rmdir(newlinkname)
+            raise
+
+    def readlink(filename):   #analysis:ignore
+        try:
+            fObj = _open(os.path.join(filename, 'symlink'), 'rb')
+        except IOError as e:
+            if e.errno == errno.ENOENT or e.errno == errno.EIO:
+                raise OSError(e.errno, None)
+            raise
+        else:
+            result = fObj.read().decode()
+            fObj.close()
+            return result
+
+    def rmlink(filename):    #analysis:ignore
+        os.remove(os.path.join(filename, 'symlink'))
+        os.rmdir(filename)
+
+
+
+class FilesystemLock:
+    """
+    A mutex.
+
+    This relies on the filesystem property that creating
+    a symlink is an atomic operation and that it will
+    fail if the symlink already exists.  Deleting the
+    symlink will release the lock.
+
+    @ivar name: The name of the file associated with this lock.
+
+    @ivar clean: Indicates whether this lock was released cleanly by its
+        last owner.  Only meaningful after C{lock} has been called and
+        returns True.
+
+    @ivar locked: Indicates whether the lock is currently held by this
+        object.
+    """
+
+    clean = None
+    locked = False
+
+    def __init__(self, name):
+        self.name = name
+
+
+    def lock(self):
+        """
+        Acquire this lock.
+
+        @rtype: C{bool}
+        @return: True if the lock is acquired, false otherwise.
+
+        @raise: Any exception os.symlink() may raise, other than
+        EEXIST.
+        """
+        clean = True
+        while True:
+            try:
+                symlink(str(os.getpid()), self.name)
+            except OSError as e:
+                if _windows and e.errno in (errno.EACCES, errno.EIO):
+                    # The lock is in the middle of being deleted because we're
+                    # on Windows where lock removal isn't atomic.  Give up, we
+                    # don't know how long this is going to take.
+                    return False
+                if e.errno == errno.EEXIST:
+                    try:
+                        pid = readlink(self.name)
+                    except OSError as e:
+                        if e.errno == errno.ENOENT:
+                            # The lock has vanished, try to claim it in the
+                            # next iteration through the loop.
+                            continue
+                        raise
+                    except IOError as e:
+                        if _windows and e.errno == errno.EACCES:
+                            # The lock is in the middle of being
+                            # deleted because we're on Windows where
+                            # lock removal isn't atomic.  Give up, we
+                            # don't know how long this is going to
+                            # take.
+                            return False
+                        raise
+                    try:
+                        if kill is not None:
+                            kill(int(pid), 0)
+                    except OSError as e:
+                        if e.errno == errno.ESRCH:
+                            # The owner has vanished, try to claim it in the next
+                            # iteration through the loop.
+                            try:
+                                rmlink(self.name)
+                            except OSError as e:
+                                if e.errno == errno.ENOENT:
+                                    # Another process cleaned up the lock.
+                                    # Race them to acquire it in the next
+                                    # iteration through the loop.
+                                    continue
+                                raise
+                            clean = False
+                            continue
+                        raise
+                    return False
+                raise
+            self.locked = True
+            self.clean = clean
+            return True
+
+
+    def unlock(self):
+        """
+        Release this lock.
+
+        This deletes the directory with the given name.
+
+        @raise: Any exception os.readlink() may raise, or
+        ValueError if the lock is not owned by this process.
+        """
+        pid = readlink(self.name)
+        if int(pid) != os.getpid():
+            raise ValueError("Lock %r not owned by this process" % (self.name,))
+        rmlink(self.name)
+        self.locked = False
+
+
+def isLocked(name):
+    """Determine if the lock of the given name is held or not.
+
+    @type name: C{str}
+    @param name: The filesystem path to the lock to test
+
+    @rtype: C{bool}
+    @return: True if the lock is held, False otherwise.
+    """
+    l = FilesystemLock(name)
+    result = None
+    try:
+        result = l.lock()
+    finally:
+        if result:
+            l.unlock()
+    return not result
+
+
+__all__ = ['FilesystemLock', 'isLocked']
diff --git a/spyderlib/utils/external/path.py b/spyderlib/utils/external/path.py
index 8d45e59..e14886c 100644
--- a/spyderlib/utils/external/path.py
+++ b/spyderlib/utils/external/path.py
@@ -27,6 +27,7 @@ Original author:
 
 Contributors:
  Mikhail Gusarov <dottedmag at dottedmag.net>
+ Marc Abramowitz <marc at marc-abramowitz.com>
 
 Example:
 
@@ -40,11 +41,25 @@ This module requires Python 2.3 or later.
 
 from __future__ import generators
 
-import sys, warnings, os, fnmatch, glob, shutil, codecs, hashlib, errno
+import sys
+import warnings
+import os
+import fnmatch
+import glob
+import shutil
+import codecs
+import hashlib
+import errno
 
-__version__ = '2.2.2.990'
+from spyderlib.py3compat import (TEXT_TYPES, getcwd, u,
+                                 is_text_string, is_unicode)
+
+__version__ = '2.4.1'
 __all__ = ['path']
 
+MODE_0777 = 511
+MODE_0666 = 438
+
 # Platform-specific support for path.owner
 if os.name == 'nt':
     try:
@@ -57,25 +72,12 @@ else:
     except ImportError:
         pwd = None
 
-# Pre-2.3 support.  Are unicode filenames supported?
-_base = str
-_getcwd = os.getcwd
-try:
-    if os.path.supports_unicode_filenames:
-        _base = unicode
-        _getcwd = os.getcwdu
-except AttributeError:
-    pass
-
-# Pre-2.3 workaround for basestring.
-try:
-    basestring
-except NameError:
-    basestring = (str, unicode)
+_base = TEXT_TYPES[-1]
+_getcwd = getcwd
 
 # Universal newline support
 _textmode = 'U'
-if hasattr(__builtins__, 'file') and not hasattr(file, 'newlines'):
+if hasattr(__builtins__, 'open') and not hasattr(open, 'newlines'):
     _textmode = 'r'
 
 class TreeWalkWarning(Warning):
@@ -97,14 +99,14 @@ class path(_base):
     def __add__(self, more):
         try:
             resultStr = _base.__add__(self, more)
-        except TypeError:  #Python bug
+        except TypeError:  # Python bug
             resultStr = NotImplemented
         if resultStr is NotImplemented:
             return resultStr
         return self.__class__(resultStr)
 
     def __radd__(self, other):
-        if isinstance(other, basestring):
+        if is_text_string(other):
             return self.__class__(other.__add__(self))
         else:
             return NotImplemented
@@ -133,7 +135,7 @@ class path(_base):
         return cls(_getcwd())
     getcwd = classmethod(getcwd)
 
-
+    #
     # --- Operations on path strings.
 
     def abspath(self):       return self.__class__(os.path.abspath(self))
@@ -522,7 +524,7 @@ class path(_base):
         cls = self.__class__
         return [cls(s) for s in glob.glob(_base(self / pattern))]
 
-
+    #
     # --- Reading or writing an entire file at once.
 
     def open(self, mode='r'):
@@ -584,11 +586,11 @@ class path(_base):
                 t = f.read()
             finally:
                 f.close()
-            return (t.replace(u'\r\n', u'\n')
-                     .replace(u'\r\x85', u'\n')
-                     .replace(u'\r', u'\n')
-                     .replace(u'\x85', u'\n')
-                     .replace(u'\u2028', u'\n'))
+            return (t.replace(u('\r\n'), u('\n'))
+                     .replace(u('\r\x85'), u('\n'))
+                     .replace(u('\r'), u('\n'))
+                     .replace(u('\x85'), u('\n'))
+                     .replace(u('\u2028'), u('\n')))
 
     def write_text(self, text, encoding=None, errors='strict', linesep=os.linesep, append=False):
         r""" Write the given text to this file.
@@ -638,7 +640,7 @@ class path(_base):
         u'\x85', u'\r\x85', and u'\u2028'.
 
         (This is slightly different from when you open a file for
-        writing with fopen(filename, "w") in C or file(filename, 'w')
+        writing with fopen(filename, "w") in C or open(filename, 'w')
         in Python.)
 
 
@@ -654,16 +656,16 @@ class path(_base):
         conversion.
 
         """
-        if isinstance(text, unicode):
+        if is_unicode(text):
             if linesep is not None:
                 # Convert all standard end-of-line sequences to
                 # ordinary newline characters.
-                text = (text.replace(u'\r\n', u'\n')
-                            .replace(u'\r\x85', u'\n')
-                            .replace(u'\r', u'\n')
-                            .replace(u'\x85', u'\n')
-                            .replace(u'\u2028', u'\n'))
-                text = text.replace(u'\n', linesep)
+                text = (text.replace(u('\r\n'), u('\n'))
+                            .replace(u('\r\x85'), u('\n'))
+                            .replace(u('\r'), u('\n'))
+                            .replace(u('\x85'), u('\n'))
+                            .replace(u('\u2028'), u('\n')))
+                text = text.replace(u('\n'), linesep)
             if encoding is None:
                 encoding = sys.getdefaultencoding()
             bytes = text.encode(encoding, errors)
@@ -746,15 +748,15 @@ class path(_base):
         f = self.open(mode)
         try:
             for line in lines:
-                isUnicode = isinstance(line, unicode)
+                isUnicode = is_unicode(line)
                 if linesep is not None:
                     # Strip off any existing line-end and add the
                     # specified linesep string.
                     if isUnicode:
-                        if line[-2:] in (u'\r\n', u'\x0d\x85'):
+                        if line[-2:] in (u('\r\n'), u('\x0d\x85')):
                             line = line[:-2]
-                        elif line[-1:] in (u'\r', u'\n',
-                                           u'\x85', u'\u2028'):
+                        elif line[-1:] in (u('\r'), u('\n'),
+                                           u('\x85'), u('\u2028')):
                             line = line[:-1]
                     else:
                         if line[-2:] == '\r\n':
@@ -873,7 +875,7 @@ class path(_base):
                 self, win32security.OWNER_SECURITY_INFORMATION)
             sid = desc.GetSecurityDescriptorOwner()
             account, domain, typecode = win32security.LookupAccountSid(None, sid)
-            return domain + u'\\' + account
+            return domain + u('\\') + account
         else:
             if pwd is None:
                 raise NotImplementedError("path.owner is not implemented on this platform.")
@@ -893,7 +895,7 @@ class path(_base):
         def pathconf(self, name):
             return os.pathconf(self, name)
 
-
+    #
     # --- Modifying operations on files and directories
 
     def utime(self, times):
@@ -913,26 +915,26 @@ class path(_base):
     def renames(self, new):
         os.renames(self, new)
 
-
+    #
     # --- Create/delete operations on directories
 
-    def mkdir(self, mode=0777):
+    def mkdir(self, mode=MODE_0777):
         os.mkdir(self, mode)
 
-    def mkdir_p(self, mode=0777):
+    def mkdir_p(self, mode=MODE_0777):
         try:
             self.mkdir(mode)
-        except OSError, e:
+        except OSError as e:
             if e.errno != errno.EEXIST:
                 raise
 
-    def makedirs(self, mode=0777):
+    def makedirs(self, mode=MODE_0777):
         os.makedirs(self, mode)
 
-    def makedirs_p(self, mode=0777):
+    def makedirs_p(self, mode=MODE_0777):
         try:
             self.makedirs(mode)
-        except OSError, e:
+        except OSError as e:
             if e.errno != errno.EEXIST:
                 raise
 
@@ -942,7 +944,7 @@ class path(_base):
     def rmdir_p(self):
         try:
             self.rmdir()
-        except OSError, e:
+        except OSError as e:
             if e.errno != errno.ENOTEMPTY and e.errno != errno.EEXIST:
                 raise
 
@@ -952,7 +954,7 @@ class path(_base):
     def removedirs_p(self):
         try:
             self.removedirs()
-        except OSError, e:
+        except OSError as e:
             if e.errno != errno.ENOTEMPTY and e.errno != errno.EEXIST:
                 raise
 
@@ -962,7 +964,7 @@ class path(_base):
         """ Set the access/modified times of this file to the current time.
         Create the file if it does not exist.
         """
-        fd = os.open(self, os.O_WRONLY | os.O_CREAT, 0666)
+        fd = os.open(self, os.O_WRONLY | os.O_CREAT, MODE_0666)
         os.close(fd)
         os.utime(self, None)
 
@@ -972,7 +974,7 @@ class path(_base):
     def remove_p(self):
         try:
             self.unlink()
-        except OSError, e:
+        except OSError as e:
             if e.errno != errno.ENOENT:
                 raise
 
@@ -1013,7 +1015,7 @@ class path(_base):
             else:
                 return (self.parent / p).abspath()
 
-
+    #
     # --- High-level functions from shutil
 
     copyfile = shutil.copyfile
@@ -1026,7 +1028,14 @@ class path(_base):
         move = shutil.move
     rmtree = shutil.rmtree
 
+    def rmtree_p(self):
+        try:
+            self.rmtree()
+        except OSError as e:
+            if e.errno != errno.ENOENT:
+                raise
 
+    #
     # --- Special stuff from os
 
     if hasattr(os, 'chroot'):
@@ -1036,4 +1045,3 @@ class path(_base):
     if hasattr(os, 'startfile'):
         def startfile(self):
             os.startfile(self)
-
diff --git a/spyderlib/utils/external/pickleshare.py b/spyderlib/utils/external/pickleshare.py
index 19599cd..ddd5666 100644
--- a/spyderlib/utils/external/pickleshare.py
+++ b/spyderlib/utils/external/pickleshare.py
@@ -33,11 +33,14 @@ License: MIT open source license.
 
 """
 
+from __future__ import print_function
+
 from spyderlib.utils.external.path import path as Path
-import os,stat,time
-import cPickle as pickle
-import UserDict
-import warnings
+from spyderlib.py3compat import pickle, MutableMapping
+
+import os
+import stat
+import time
 import glob
 
 def gethashfile(key):
@@ -45,18 +48,25 @@ def gethashfile(key):
 
 _sentinel = object()
 
-class PickleShareDB(UserDict.DictMixin):
+class PickleShareDB(MutableMapping):
     """ The main 'connection' object for PickleShare database """
-    def __init__(self,root):
+    def __init__(self, root):
         """ Return a db object that will manage the specied directory"""
         self.root = Path(root).expanduser().abspath()
         if not self.root.isdir():
             self.root.makedirs()
         # cache has { 'key' : (obj, orig_mod_time) }
         self.cache = {}
-        
+    
+    #==========================================================================
+    # Only affects Python 3
+    def __iter__(self):
+        return iter(self.cache)
+    def __len__(self):
+        return len(self.cache)
+    #==========================================================================
 
-    def __getitem__(self,key):
+    def __getitem__(self, key):
         """ db['key'] reading """
         fil = self.root / key
         try:
@@ -68,23 +78,25 @@ class PickleShareDB(UserDict.DictMixin):
             return self.cache[fil][0]
         try:
             # The cached item has expired, need to read
-            obj = pickle.load(fil.open())
+            obj = pickle.load(fil.open('rb'))
         except:
             raise KeyError(key)
             
-        self.cache[fil] = (obj,mtime)
+        self.cache[fil] = (obj, mtime)
         return obj
     
-    def __setitem__(self,key,value):
+    def __setitem__(self, key, value):
         """ db['key'] = 5 """
         fil = self.root / key
         parent = fil.parent
         if parent and not parent.isdir():
             parent.makedirs()
-        pickled = pickle.dump(value,fil.open('w'))
+        # We specify protocol 2, so that we can mostly go between Python 2
+        # and Python 3. We can upgrade to protocol 3 when Python 2 is obsolete.
+        pickled = pickle.dump(value, fil.open('wb'), protocol=2)
         try:
-            self.cache[fil] = (value,fil.mtime)
-        except OSError,e:
+            self.cache[fil] = (value, fil.mtime)
+        except OSError as e:
             if e.errno != 2:
                 raise
     
@@ -135,7 +147,7 @@ class PickleShareDB(UserDict.DictMixin):
             try:
                 all.update(self[f])
             except KeyError:
-                print "Corrupt",f,"deleted - hset is not threadsafe!"
+                print("Corrupt", f, "deleted - hset is not threadsafe!")
                 del self[f]
                 
             self.uncache(f)
@@ -165,10 +177,10 @@ class PickleShareDB(UserDict.DictMixin):
             
             
         
-    def __delitem__(self,key):
+    def __delitem__(self, key):
         """ del db["key"] """
         fil = self.root / key
-        self.cache.pop(fil,None)
+        self.cache.pop(fil, None)
         try:
             fil.remove()
         except OSError:
@@ -178,7 +190,7 @@ class PickleShareDB(UserDict.DictMixin):
         
     def _normalized(self, p):
         """ Make a key suitable for user's eyes """
-        return str(self.root.relpathto(p)).replace('\\','/')
+        return str(self.root.relpathto(p)).replace('\\', '/')
     
     def keys(self, globpat = None):
         """ All keys in DB, or all keys matching a glob"""
@@ -200,7 +212,7 @@ class PickleShareDB(UserDict.DictMixin):
         if not items:
             self.cache = {}
         for it in items:
-            self.cache.pop(it,None)
+            self.cache.pop(it, None)
             
     def waitget(self,key, maxwaittime = 60 ):
         """ Wait (poll) for a key to get a value
@@ -234,7 +246,7 @@ class PickleShareDB(UserDict.DictMixin):
             if tries < len(wtimes) -1:
                 tries+=1
     
-    def getlink(self,folder):
+    def getlink(self, folder):
         """ Get a convenient link for accessing items  """
         return PickleShareLink(self, folder)
     
@@ -256,9 +268,9 @@ class PickleShareLink:
     def __init__(self, db, keydir ):    
         self.__dict__.update(locals())
         
-    def __getattr__(self,key):
+    def __getattr__(self, key):
         return self.__dict__['db'][self.__dict__['keydir']+'/' + key]
-    def __setattr__(self,key,val):
+    def __setattr__(self, key, val):
         self.db[self.keydir+'/' + key] = val
     def __repr__(self):
         db = self.__dict__['db']
@@ -271,29 +283,29 @@ class PickleShareLink:
 def test():
     db = PickleShareDB('~/testpickleshare')
     db.clear()
-    print "Should be empty:",db.items()
+    print("Should be empty:", list(db.items()))
     db['hello'] = 15
-    db['aku ankka'] = [1,2,313]
-    db['paths/nest/ok/keyname'] = [1,(5,46)]
+    db['aku ankka'] = [1, 2, 313]
+    db['paths/nest/ok/keyname'] = [1, (5, 46)]
     db.hset('hash', 'aku', 12)
     db.hset('hash', 'ankka', 313)
-    print "12 =",db.hget('hash','aku')
-    print "313 =",db.hget('hash','ankka')
-    print "all hashed",db.hdict('hash')
-    print db.keys()
-    print db.keys('paths/nest/ok/k*')
-    print dict(db) # snapsot of whole db
+    print("12 =", db.hget('hash', 'aku'))
+    print("313 =", db.hget('hash', 'ankka'))
+    print("all hashed", db.hdict('hash'))
+    print(list(db.keys()))
+    print(db.keys('paths/nest/ok/k*'))
+    print(dict(db)) # snapsot of whole db
     db.uncache() # frees memory, causes re-reads later
 
     # shorthand for accessing deeply nested files
     lnk = db.getlink('myobjects/test')
     lnk.foo = 2
     lnk.bar = lnk.foo + 5
-    print lnk.bar # 7
+    print(lnk.bar) # 7
 
 def stress():
     db = PickleShareDB('~/fsdbtest')
-    import time,sys
+    import time, sys
     for i in range(1000):
         for j in range(1000):
             if i % 15 == 0 and i < 200:
@@ -304,10 +316,10 @@ def stress():
             if j%33 == 0:
                 time.sleep(0.02)
             
-            db[str(j)] = db.get(str(j), []) + [(i,j,"proc %d" % os.getpid())]
-            db.hset('hash',j, db.hget('hash',j,15) + 1 )
+            db[str(j)] = db.get(str(j), []) + [(i, j, "proc %d" % os.getpid())]
+            db.hset('hash', j, db.hget('hash', j, 15) + 1 )
             
-        print i,
+        print(i, end=' ')
         sys.stdout.flush()
         if i % 10 == 0:
             db.uncache()
@@ -326,7 +338,7 @@ def main():
     DB = PickleShareDB
     import sys
     if len(sys.argv) < 2:
-        print usage
+        print(usage)
         return
         
     cmd = sys.argv[1]
@@ -335,18 +347,18 @@ def main():
         if not args: args= ['.']
         db = DB(args[0])
         import pprint
-        pprint.pprint(db.items())
+        pprint.pprint(list(db.items()))
     elif cmd == 'load':
         cont = sys.stdin.read()
         db = DB(args[0])
         data = eval(cont)
         db.clear()
-        for k,v in db.items():
+        for k, v in list(db.items()):
             db[k] = v
     elif cmd == 'testwait':
         db = DB(args[0])
         db.clear()
-        print db.waitget('250')
+        print(db.waitget('250'))
     elif cmd == 'test':
         test()
         stress()
diff --git a/spyderlib/utils/inspector/conf.py b/spyderlib/utils/inspector/conf.py
index 325a3fe..36515fa 100644
--- a/spyderlib/utils/inspector/conf.py
+++ b/spyderlib/utils/inspector/conf.py
@@ -11,6 +11,7 @@ from sphinx import __version__ as sphinx_version
 
 # Local imports
 from spyderlib.config import CONF
+from spyderlib.py3compat import u
 
 #==============================================================================
 # General configuration
@@ -52,8 +53,8 @@ source_suffix = '.rst'
 master_doc = 'docstring'
 
 # General information about the project.
-project = u"Object Inspector"
-copyright = u'2009--2013, The Spyder Development Team'
+project = u("Object Inspector")
+copyright = u('2009--2013, The Spyder Development Team')
 
 # List of directories, relative to source directory, that shouldn't be searched
 # for source files.
diff --git a/spyderlib/utils/inspector/static/css/default.css b/spyderlib/utils/inspector/static/css/default.css
index 9c0325d..aefb4cb 100644
--- a/spyderlib/utils/inspector/static/css/default.css
+++ b/spyderlib/utils/inspector/static/css/default.css
@@ -233,3 +233,21 @@ tt {
     font-size: 95%;
     padding: 0px 1px;
 }
+
+/* --- Loading style--- */
+div.loading {
+    position: fixed;
+    left: 35%;
+    top: 40%;
+    background-color: #EEEEEE;
+    border: 1px solid #C9C9C9;
+    border-bottom-left-radius: 6px;
+    border-bottom-right-radius: 6px;
+    border-top-left-radius: 6px;
+    border-top-right-radius: 6px;
+    box-shadow: 1px 1px 7px #CACACA;
+    color: #333333;
+    padding: 12px;
+    font-family: 'Trebuchet MS', sans-serif;
+    font-size: 90%;
+}
diff --git a/spyderlib/utils/iofuncs.py b/spyderlib/utils/iofuncs.py
index 4f1591a..09c38c6 100644
--- a/spyderlib/utils/iofuncs.py
+++ b/spyderlib/utils/iofuncs.py
@@ -11,16 +11,18 @@ Note: 'load' functions has to return a dictionary from which a globals()
       namespace may be updated
 """
 
-from __future__ import with_statement
+from __future__ import print_function
 
 import sys
 import os
-import cPickle
 import tarfile
 import os.path as osp
 import shutil
 import warnings
 
+# Local imports
+from spyderlib.py3compat import pickle, to_text_string, getcwd
+
 
 try:
     import numpy as np
@@ -35,7 +37,7 @@ try:
         try:
             out = spio.loadmat(filename, struct_as_record=True,
                                squeeze_me=True)
-            for key, value in out.iteritems():
+            for key, value in list(out.items()):
                 if isinstance(value, np.ndarray):
                     if value.shape == ():
                         out[key] = value.tolist()
@@ -45,12 +47,12 @@ try:
 #                    elif value.shape == (1, 1):
 #                        out[key] = value[0][0]
             return out, None
-        except Exception, error:
+        except Exception as error:
             return None, str(error)
     def save_matlab(data, filename):
         try:
             spio.savemat(filename, data, oned_as='row')
-        except Exception, error:
+        except Exception as error:
             return str(error)
 except ImportError:
     load_matlab = None
@@ -63,7 +65,7 @@ try:
         try:
             name = osp.splitext(osp.basename(filename))[0]
             return {name: np.load(filename)}, None
-        except Exception, error:
+        except Exception as error:
             return None, str(error)    
     def __save_array(data, basename, index):
         """Save numpy array"""
@@ -108,7 +110,7 @@ try:
         try:
             name = osp.splitext(osp.basename(filename))[0]
             return {name: __image_to_array(filename)}, None
-        except Exception, error:
+        except Exception as error:
             return None, str(error)
 except ImportError:
     load_image = None
@@ -117,7 +119,7 @@ except ImportError:
 def save_dictionary(data, filename):
     """Save dictionary in a single file .spydata file"""
     filename = osp.abspath(filename)
-    old_cwd = os.getcwdu()
+    old_cwd = getcwd()
     os.chdir(osp.dirname(filename))
     error_message = None
     try:
@@ -125,7 +127,7 @@ def save_dictionary(data, filename):
         if load_array is not None:
             # Saving numpy arrays with np.save
             arr_fname = osp.splitext(filename)[0]
-            for name in data.keys():
+            for name in list(data.keys()):
                 if isinstance(data[name], np.ndarray) and data[name].size > 0:
                     # Saving arrays at data root
                     fname = __save_array(data[name], arr_fname,
@@ -137,7 +139,7 @@ def save_dictionary(data, filename):
                     if isinstance(data[name], list):
                         iterator = enumerate(data[name])
                     else:
-                        iterator = data[name].iteritems()
+                        iterator = iter(list(data[name].items()))
                     to_remove = []
                     for index, value in iterator:
                         if isinstance(value, np.ndarray) and value.size > 0:
@@ -151,23 +153,23 @@ def save_dictionary(data, filename):
                 data['__saved_arrays__'] = saved_arrays
         pickle_filename = osp.splitext(filename)[0]+'.pickle'
         with open(pickle_filename, 'wb') as fdesc:
-            cPickle.dump(data, fdesc, 2)
+            pickle.dump(data, fdesc, 2)
         tar = tarfile.open(filename, "w")
-        for fname in [pickle_filename]+[fn for fn in saved_arrays.itervalues()]:
+        for fname in [pickle_filename]+[fn for fn in list(saved_arrays.values())]:
             tar.add(osp.basename(fname))
             os.remove(fname)
         tar.close()
         if saved_arrays:
             data.pop('__saved_arrays__')
-    except (RuntimeError, cPickle.PicklingError, TypeError), error:
-        error_message = unicode(error)
+    except (RuntimeError, pickle.PicklingError, TypeError) as error:
+        error_message = to_text_string(error)
     os.chdir(old_cwd)
     return error_message
 
 def load_dictionary(filename):
     """Load dictionary from .spydata file"""
     filename = osp.abspath(filename)
-    old_cwd = os.getcwdu()
+    old_cwd = getcwd()
     os.chdir(osp.dirname(filename))
     data = None
     error_message = None
@@ -178,17 +180,17 @@ def load_dictionary(filename):
         try:
             # Old format (Spyder 2.0-2.1 for Python 2)
             with open(pickle_filename, 'U') as fdesc:
-                data = cPickle.loads(fdesc.read())
-        except cPickle.PickleError:
+                data = pickle.loads(fdesc.read())
+        except (pickle.PickleError, TypeError):
             # New format (Spyder >=2.2 for Python 2 and Python 3)
             with open(pickle_filename, 'rb') as fdesc:
-                data = cPickle.loads(fdesc.read())
+                data = pickle.loads(fdesc.read())
         saved_arrays = {}
         if load_array is not None:
             # Loading numpy arrays saved with np.save
             try:
                 saved_arrays = data.pop('__saved_arrays__')
-                for (name, index), fname in saved_arrays.iteritems():
+                for (name, index), fname in list(saved_arrays.items()):
                     arr = np.load( osp.join(osp.dirname(filename), fname) )
                     if index is None:
                         data[name] = arr
@@ -198,25 +200,25 @@ def load_dictionary(filename):
                         data[name].insert(index, arr)
             except KeyError:
                 pass
-        for fname in [pickle_filename]+[fn for fn in saved_arrays.itervalues()]:
+        for fname in [pickle_filename]+[fn for fn in list(saved_arrays.values())]:
             os.remove(fname)
-    except (EOFError, ValueError), error:
-        error_message = unicode(error)
+    except (EOFError, ValueError) as error:
+        error_message = to_text_string(error)
     os.chdir(old_cwd)
     return data, error_message
 
 
 from spyderlib.baseconfig import get_conf_path, STDERR
 
-SAVED_CONFIG_FILES = ('.inspector', '.onlinehelp', '.path', '.pylint.results',
-                      '.spyder.ini', '.temp.py', '.temp.spydata', 'template.py',
-                      '.projects', '.history.py', '.history_internal.py',
-                      '.spyderproject', '.ropeproject', '.workingdir',
+SAVED_CONFIG_FILES = ('inspector', 'onlinehelp', 'path', 'pylint.results',
+                      'spyder.ini', 'temp.py', 'temp.spydata', 'template.py',
+                      'history.py', 'history_internal.py', 'workingdir',
+                      '.projects', '.spyderproject', '.ropeproject',
                       'monitor.log', 'monitor_debug.log', 'rope.log')
 
 def reset_session():
     """Remove all config files"""
-    print >>STDERR, "*** Reset Spyder settings to defaults ***"
+    print("*** Reset Spyder settings to defaults ***", file=STDERR)
     for fname in SAVED_CONFIG_FILES:
         cfg_fname = get_conf_path(fname)
         if osp.isfile(cfg_fname):
@@ -225,13 +227,13 @@ def reset_session():
             shutil.rmtree(cfg_fname)
         else:
             continue
-        print >>STDERR, "removing:", cfg_fname
+        print("removing:", cfg_fname, file=STDERR)
 
 def save_session(filename):
     """Save Spyder session"""
     local_fname = get_conf_path(osp.basename(filename))
     filename = osp.abspath(filename)
-    old_cwd = os.getcwdu()
+    old_cwd = getcwd()
     os.chdir(get_conf_path())
     error_message = None
     try:
@@ -241,15 +243,15 @@ def save_session(filename):
                 tar.add(fname)
         tar.close()
         shutil.move(local_fname, filename)
-    except Exception, error:
-        error_message = unicode(error)
+    except Exception as error:
+        error_message = to_text_string(error)
     os.chdir(old_cwd)
     return error_message
 
 def load_session(filename):
     """Load Spyder session"""
     filename = osp.abspath(filename)
-    old_cwd = os.getcwdu()
+    old_cwd = getcwd()
     os.chdir(osp.dirname(filename))
     error_message = None
     renamed = False
@@ -272,8 +274,8 @@ def load_session(filename):
         for fname in extracted_files:
             shutil.move(fname, get_conf_path(fname))
             
-    except Exception, error:
-        error_message = unicode(error)
+    except Exception as error:
+        error_message = to_text_string(error)
         if renamed:
             # Restore original config files
             for fname in extracted_files:
@@ -316,7 +318,7 @@ class IOFunctions(object):
         save_filters = []
         load_ext = []
         for ext, name, loadfunc, savefunc in iofuncs:
-            filter_str = unicode(name + " (*%s)" % ext)
+            filter_str = to_text_string(name + " (*%s)" % ext)
             if loadfunc is not None:
                 load_filters.append(filter_str)
                 load_extensions[filter_str] = ext
@@ -326,8 +328,8 @@ class IOFunctions(object):
                 save_extensions[filter_str] = ext
                 save_filters.append(filter_str)
                 save_funcs[ext] = savefunc
-        load_filters.insert(0, unicode(_("Supported files")+" (*"+\
-                                       " *".join(load_ext)+")"))
+        load_filters.insert(0, to_text_string(_("Supported files")+" (*"+\
+                                              " *".join(load_ext)+")"))
         self.load_filters = "\n".join(load_filters)
         self.save_filters = "\n".join(save_filters)
         self.load_funcs = load_funcs
@@ -356,8 +358,8 @@ class IOFunctions(object):
             try:
                 other_funcs.append((mod.FORMAT_EXT, mod.FORMAT_NAME,
                                     mod.FORMAT_LOAD, mod.FORMAT_SAVE))
-            except AttributeError, error:
-                print >>STDERR, "%s: %s" % (mod, str(error))
+            except AttributeError as error:
+                print("%s: %s" % (mod, str(error)), file=STDERR)
         return other_funcs
         
     def save(self, data, filename):
@@ -384,11 +386,12 @@ def save_auto(data, filename):
 
 
 if __name__ == "__main__":
+    from spyderlib.py3compat import u
     import datetime
     testdict = {'d': 1, 'a': np.random.rand(10, 10), 'b': [1, 2]}
     testdate = datetime.date(1945, 5, 8)
     example = {'str': 'kjkj kj k j j kj k jkj',
-               'unicode': u'éù',
+               'unicode': u('éù'),
                'list': [1, 3, [4, 5, 6], 'kjkj', None],
                'tuple': ([1, testdate, testdict], 'kjkj', None),
                'dict': testdict,
@@ -401,9 +404,9 @@ if __name__ == "__main__":
     import time
     t0 = time.time()
     save_dictionary(example, "test.spydata")
-    print " Data saved in %.3f seconds" % (time.time()-t0)
+    print(" Data saved in %.3f seconds" % (time.time()-t0))
     t0 = time.time()
     example2, ok = load_dictionary("test.spydata")
-    print "Data loaded in %.3f seconds" % (time.time()-t0)
+    print("Data loaded in %.3f seconds" % (time.time()-t0))
 #    for key in example:
 #        print key, ":", example[key] == example2[key]
diff --git a/spyderlib/utils/misc.py b/spyderlib/utils/misc.py
index 1f6cfb3..c4fa1ef 100644
--- a/spyderlib/utils/misc.py
+++ b/spyderlib/utils/misc.py
@@ -6,8 +6,6 @@
 
 """Miscellaneous utilities"""
 
-from __future__ import with_statement
-
 import os
 import os.path as osp
 import sys
@@ -73,7 +71,7 @@ def select_port(default_port=20128):
                                  socket.IPPROTO_TCP)
 #            sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
             sock.bind( ("127.0.0.1", default_port) )
-        except socket.error, _msg:  # analysis:ignore
+        except socket.error as _msg:  # analysis:ignore
             default_port += 1
         else:
             break
@@ -232,7 +230,7 @@ def get_common_path(pathlist):
 if __name__ == '__main__':
     assert get_common_path([
                             'D:\\Python\\spyder-v21\\spyderlib\\widgets',
-                            u'D:\\Python\\spyder\\spyderlib\\utils',
-                            u'D:\\Python\\spyder\\spyderlib\\widgets',
+                            'D:\\Python\\spyder\\spyderlib\\utils',
+                            'D:\\Python\\spyder\\spyderlib\\widgets',
                             'D:\\Python\\spyder-v21\\spyderlib\\utils',
                             ]) == 'D:\\Python'
diff --git a/spyderlib/utils/module_completion.py b/spyderlib/utils/module_completion.py
index 5140a37..bf7f2e3 100644
--- a/spyderlib/utils/module_completion.py
+++ b/spyderlib/utils/module_completion.py
@@ -1,322 +1,322 @@
-# -*- coding: utf-8 -*-
-"""Module completion auxiliary functions"""
-
-#------------------------------------------------------------------------------
-#
-#  Most functions on this file were taken from the file core/completerlib,
-#  which belongs to the IPython project (v0.13). They were added here because
-#  a) IPython is not an Spyder runtime dependency, and b) we want to perfom
-#  module completion not only on our Python console, but also on our source
-#  code editor.
-#
-#  Several of these functions were modified to make it work according to our
-#  needs
-#
-#  Distributed under the terms of the BSD License.
-#  Copyright (C) 2010-2011 The IPython Development Team.
-#  Copyright (C) 2013 The Spyder Development Team
-#
-#------------------------------------------------------------------------------
-
-import imp
-import inspect
-import os.path
-import pkgutil
-import re
-from time import time
-import sys
-from zipimport import zipimporter
-
-from spyderlib.baseconfig import get_conf_path
-from spyderlib.utils.external.pickleshare import PickleShareDB
-
-#-----------------------------------------------------------------------------
-# Globals and constants
-#-----------------------------------------------------------------------------
-
-# Path to the modules database
-MODULES_PATH = get_conf_path('db')
-
-# Time in seconds after which we give up
-TIMEOUT_GIVEUP = 20
-
-# Py2app only uses .pyc files for the stdlib when optimize=0,
-# so we need to add it as another suffix here
-if sys.platform == 'darwin' and 'Spyder.app' in __file__:
-    suffixes = imp.get_suffixes() + [('.pyc', 'rb', '2')]
-else:
-    suffixes = imp.get_suffixes()
-
-# Regular expression for the python import statement
-import_re = re.compile(r'(?P<name>[a-zA-Z_][a-zA-Z0-9_]*?)'
-                       r'(?P<package>[/\\]__init__)?'
-                       r'(?P<suffix>%s)$' %
-                       r'|'.join(re.escape(s[0]) for s in suffixes))
-
-# Modules database
-modules_db = PickleShareDB(MODULES_PATH)
-
-#-----------------------------------------------------------------------------
-# Utility functions
-#-----------------------------------------------------------------------------
-
-def module_list(path):
-    """
-    Return the list containing the names of the modules available in the given
-    folder.
-    """
-    # sys.path has the cwd as an empty string, but isdir/listdir need it as '.'
-    if path == '':
-        path = '.'
-
-    # A few local constants to be used in loops below
-    pjoin = os.path.join
-
-    if os.path.isdir(path):
-        # Build a list of all files in the directory and all files
-        # in its subdirectories. For performance reasons, do not
-        # recurse more than one level into subdirectories.
-        files = []
-        for root, dirs, nondirs in os.walk(path):
-            subdir = root[len(path)+1:]
-            if subdir:
-                files.extend(pjoin(subdir, f) for f in nondirs)
-                dirs[:] = [] # Do not recurse into additional subdirectories.
-            else:
-                files.extend(nondirs)
-    else:
-        try:
-            files = list(zipimporter(path)._files.keys())
-        except:
-            files = []
-
-    # Build a list of modules which match the import_re regex.
-    modules = []
-    for f in files:
-        m = import_re.match(f)
-        if m:
-            modules.append(m.group('name'))
-    return list(set(modules))
-
-
-def get_root_modules(paths):
-    """
-    Returns list of names of all modules from PYTHONPATH folders.
-    
-    paths : list
-        A list of additional paths that Spyder adds to PYTHONPATH. They are
-        comming from our PYTHONPATH manager and from the currently selected
-        project.
-    """
-    modules = []
-    spy_modules = []
-    
-    for path in paths:
-        spy_modules += module_list(path)
-    spy_modules = set(spy_modules)
-    if '__init__' in spy_modules:
-        spy_modules.remove('__init__')
-    spy_modules = list(spy_modules)
-    
-    if modules_db.has_key('rootmodules'):
-        return spy_modules + modules_db['rootmodules']
-
-    t = time()
-    modules = list(sys.builtin_module_names)
-    # TODO: Change this sys.path for console's interpreter sys.path
-    for path in sys.path:
-        modules += module_list(path)        
-        if time() - t > TIMEOUT_GIVEUP:
-            print "Module list generation is taking too long, we give up.\n"
-            modules_db['rootmodules'] = []
-            return []
-    
-    modules = set(modules)
-    excluded_modules = ['__init__'] + spy_modules
-    for mod in excluded_modules:
-        if mod in modules:
-            modules.remove(mod)
-    modules = list(modules)
-
-    modules_db['rootmodules'] = modules
-    return spy_modules + modules
-
-
-def get_submodules(mod):
-    """Get all submodules of a given module"""
-    def catch_exceptions(module):
-        pass
-    try:
-        m = __import__(mod)
-        submodules = [mod]
-        submods = pkgutil.walk_packages(m.__path__, m.__name__ + '.',
-                                        catch_exceptions)
-        for sm in submods:
-            sm_name = sm[1]
-            submodules.append(sm_name)
-    except ImportError:
-        return []
-    except:
-        return [mod]
-    
-    return submodules
-
-
-def is_importable(module, attr, only_modules):
-    if only_modules:
-        return inspect.ismodule(getattr(module, attr))
-    else:
-        return not(attr[:2] == '__' and attr[-2:] == '__')
-
-
-def try_import(mod, only_modules=False):
-    try:
-        m = __import__(mod)
-    except:
-        return []
-    mods = mod.split('.')
-    for module in mods[1:]:
-        m = getattr(m, module)
-
-    m_is_init = hasattr(m, '__file__') and '__init__' in m.__file__
-
-    completions = []
-    if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init:
-        completions.extend([attr for attr in dir(m) if
-                            is_importable(m, attr, only_modules)])
-
-    completions.extend(getattr(m, '__all__', []))
-    if m_is_init:
-        completions.extend(module_list(os.path.dirname(m.__file__)))
-    completions = set(completions)
-    if '__init__' in completions:
-        completions.remove('__init__')
-    return list(completions)
-
-
-def dot_completion(mod, paths):
-    if len(mod) < 2:
-        return filter(lambda x: x.startswith(mod[0]), get_root_modules(paths))
-    completion_list = try_import('.'.join(mod[:-1]), True)
-    completion_list = filter(lambda x: x.startswith(mod[-1]), completion_list)
-    completion_list = ['.'.join(mod[:-1] + [el]) for el in completion_list]
-    return completion_list
-
-#-----------------------------------------------------------------------------
-# Main functions
-#-----------------------------------------------------------------------------
-
-def module_completion(line, paths=[]):
-    """
-    Returns a list containing the completion possibilities for an import line.
-    
-    The line looks like this :
-    'import xml.d'
-    'from xml.dom import'
-    """
-
-    words = line.split(' ')
-    nwords = len(words)
-    
-    # from whatever <tab> -> 'import '
-    if nwords == 3 and words[0] == 'from':
-        if words[2].startswith('i') or words[2] == '':
-            return ['import ']
-        else:
-            return []
-
-    # 'import xy<tab> or import xy<tab>, '
-    if words[0] == 'import':
-        if nwords == 2 and words[1] == '':
-            return get_root_modules(paths)
-        if ',' == words[-1][-1]:
-            return [' ']       
-        mod = words[-1].split('.')
-        return dot_completion(mod, paths)
-
-    # 'from xy<tab>'
-    if nwords < 3 and (words[0] == 'from'):
-        if nwords == 1:
-            return get_root_modules(paths)
-        mod = words[1].split('.')
-        return dot_completion(mod, paths)
-
-    # 'from xyz import abc<tab>'
-    if nwords >= 3 and words[0] == 'from':
-        mod = words[1]
-        completion_list = try_import(mod)
-        if words[2] == 'import' and words[3] != '':
-            if '(' in words[-1]:
-                words = words[:-2] + words[-1].split('(')
-            if ',' in words[-1]:
-                words = words[:-2] + words[-1].split(',')
-            return filter(lambda x: x.startswith(words[-1]), completion_list)
-        else:
-            return completion_list
-    
-    return []
-        
-
-def reset():
-    """Clear root modules database"""
-    if modules_db.has_key('rootmodules'):
-        del modules_db['rootmodules']
-
-
-def get_preferred_submodules():
-    """
-    Get all submodules of the main scientific modules and others of our
-    interest
-    """
-    if modules_db.has_key('submodules'):
-        return modules_db['submodules']
-    
-    mods = ['numpy', 'scipy', 'sympy', 'pandas', 'networkx', 'statsmodels',
-            'matplotlib', 'sklearn', 'skimage', 'mpmath', 'os', 'PIL',
-            'OpenGL', 'array', 'audioop', 'binascii', 'cPickle', 'cStringIO',
-            'cmath', 'collections', 'datetime', 'errno', 'exceptions', 'gc',
-            'imageop', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt',
-            'nt', 'operator', 'parser', 'rgbimg', 'signal', 'strop', 'sys',
-            'thread', 'time', 'wx', 'xxsubtype', 'zipimport', 'zlib', 'nose',
-            'PyQt4', 'PySide', 'os.path']
-
-    submodules = []
-    for m in mods:
-        submods = get_submodules(m)
-        submodules += submods
-    
-    modules_db['submodules'] = submodules
-    return submodules
-
-#-----------------------------------------------------------------------------
-# Tests
-#-----------------------------------------------------------------------------
-
-if __name__ == "__main__":
-    # Some simple tests.
-    # Sort operations are done by the completion widget, so we have to
-    # replicate them here.
-    # We've chosen to use xml on most tests because it's on the standard
-    # library. This way we can ensure they work on all plataforms.
-    
-    assert sorted(module_completion('import xml.')) == \
-        ['xml.dom', 'xml.etree', 'xml.parsers', 'xml.sax']
-
-    assert sorted(module_completion('import xml.d')) ==  ['xml.dom']
-
-    assert module_completion('from xml.etree ') == ['import ']
-
-    assert sorted(module_completion('from xml.etree import '), key=str.lower) ==\
-        ['cElementTree', 'ElementInclude', 'ElementPath', 'ElementTree']
-
-    assert module_completion('import sys, zl') == ['zlib']
-
-    s = 'from xml.etree.ElementTree import '
-    assert module_completion(s + 'V') == ['VERSION']
-
-    assert sorted(module_completion(s + 'VERSION, XM')) == \
-        ['XML', 'XMLID', 'XMLParser', 'XMLTreeBuilder']
-
-    assert module_completion(s + '(dum') == ['dump']
-
-    assert module_completion(s + '(dump, Su') == ['SubElement']
+# -*- coding: utf-8 -*-
+"""Module completion auxiliary functions"""
+
+#------------------------------------------------------------------------------
+#
+#  Most functions on this file were taken from the file core/completerlib,
+#  which belongs to the IPython project (v0.13). They were added here because
+#  a) IPython is not an Spyder runtime dependency, and b) we want to perfom
+#  module completion not only on our Python console, but also on our source
+#  code editor.
+#
+#  Several of these functions were modified to make it work according to our
+#  needs
+#
+#  Distributed under the terms of the BSD License.
+#  Copyright (C) 2010-2011 The IPython Development Team.
+#  Copyright (C) 2013 The Spyder Development Team
+#
+#------------------------------------------------------------------------------
+
+import imp
+import inspect
+import os.path
+import pkgutil
+import re
+from time import time
+import sys
+from zipimport import zipimporter
+
+from spyderlib.baseconfig import get_conf_path
+from spyderlib.utils.external.pickleshare import PickleShareDB
+
+#-----------------------------------------------------------------------------
+# Globals and constants
+#-----------------------------------------------------------------------------
+
+# Path to the modules database
+MODULES_PATH = get_conf_path('db')
+
+# Time in seconds after which we give up
+TIMEOUT_GIVEUP = 20
+
+# Py2app only uses .pyc files for the stdlib when optimize=0,
+# so we need to add it as another suffix here
+if sys.platform == 'darwin' and 'Spyder.app' in __file__:
+    suffixes = imp.get_suffixes() + [('.pyc', 'rb', '2')]
+else:
+    suffixes = imp.get_suffixes()
+
+# Regular expression for the python import statement
+import_re = re.compile(r'(?P<name>[a-zA-Z_][a-zA-Z0-9_]*?)'
+                       r'(?P<package>[/\\]__init__)?'
+                       r'(?P<suffix>%s)$' %
+                       r'|'.join(re.escape(s[0]) for s in suffixes))
+
+# Modules database
+modules_db = PickleShareDB(MODULES_PATH)
+
+#-----------------------------------------------------------------------------
+# Utility functions
+#-----------------------------------------------------------------------------
+
+def module_list(path):
+    """
+    Return the list containing the names of the modules available in the given
+    folder.
+    """
+    # sys.path has the cwd as an empty string, but isdir/listdir need it as '.'
+    if path == '':
+        path = '.'
+
+    # A few local constants to be used in loops below
+    pjoin = os.path.join
+
+    if os.path.isdir(path):
+        # Build a list of all files in the directory and all files
+        # in its subdirectories. For performance reasons, do not
+        # recurse more than one level into subdirectories.
+        files = []
+        for root, dirs, nondirs in os.walk(path):
+            subdir = root[len(path)+1:]
+            if subdir:
+                files.extend(pjoin(subdir, f) for f in nondirs)
+                dirs[:] = [] # Do not recurse into additional subdirectories.
+            else:
+                files.extend(nondirs)
+    else:
+        try:
+            files = list(zipimporter(path)._files.keys())
+        except:
+            files = []
+
+    # Build a list of modules which match the import_re regex.
+    modules = []
+    for f in files:
+        m = import_re.match(f)
+        if m:
+            modules.append(m.group('name'))
+    return list(set(modules))
+
+
+def get_root_modules(paths):
+    """
+    Returns list of names of all modules from PYTHONPATH folders.
+    
+    paths : list
+        A list of additional paths that Spyder adds to PYTHONPATH. They are
+        comming from our PYTHONPATH manager and from the currently selected
+        project.
+    """
+    modules = []
+    spy_modules = []
+    
+    for path in paths:
+        spy_modules += module_list(path)
+    spy_modules = set(spy_modules)
+    if '__init__' in spy_modules:
+        spy_modules.remove('__init__')
+    spy_modules = list(spy_modules)
+    
+    if 'rootmodules' in modules_db:
+        return spy_modules + modules_db['rootmodules']
+
+    t = time()
+    modules = list(sys.builtin_module_names)
+    # TODO: Change this sys.path for console's interpreter sys.path
+    for path in sys.path:
+        modules += module_list(path)        
+        if time() - t > TIMEOUT_GIVEUP:
+            print("Module list generation is taking too long, we give up.\n")
+            modules_db['rootmodules'] = []
+            return []
+    
+    modules = set(modules)
+    excluded_modules = ['__init__'] + spy_modules
+    for mod in excluded_modules:
+        if mod in modules:
+            modules.remove(mod)
+    modules = list(modules)
+
+    modules_db['rootmodules'] = modules
+    return spy_modules + modules
+
+
+def get_submodules(mod):
+    """Get all submodules of a given module"""
+    def catch_exceptions(module):
+        pass
+    try:
+        m = __import__(mod)
+        submodules = [mod]
+        submods = pkgutil.walk_packages(m.__path__, m.__name__ + '.',
+                                        catch_exceptions)
+        for sm in submods:
+            sm_name = sm[1]
+            submodules.append(sm_name)
+    except ImportError:
+        return []
+    except:
+        return [mod]
+    
+    return submodules
+
+
+def is_importable(module, attr, only_modules):
+    if only_modules:
+        return inspect.ismodule(getattr(module, attr))
+    else:
+        return not(attr[:2] == '__' and attr[-2:] == '__')
+
+
+def try_import(mod, only_modules=False):
+    try:
+        m = __import__(mod)
+    except:
+        return []
+    mods = mod.split('.')
+    for module in mods[1:]:
+        m = getattr(m, module)
+
+    m_is_init = hasattr(m, '__file__') and '__init__' in m.__file__
+
+    completions = []
+    if (not hasattr(m, '__file__')) or (not only_modules) or m_is_init:
+        completions.extend([attr for attr in dir(m) if
+                            is_importable(m, attr, only_modules)])
+
+    completions.extend(getattr(m, '__all__', []))
+    if m_is_init:
+        completions.extend(module_list(os.path.dirname(m.__file__)))
+    completions = set(completions)
+    if '__init__' in completions:
+        completions.remove('__init__')
+    return list(completions)
+
+
+def dot_completion(mod, paths):
+    if len(mod) < 2:
+        return [x for x in get_root_modules(paths) if x.startswith(mod[0])]
+    completion_list = try_import('.'.join(mod[:-1]), True)
+    completion_list = [x for x in completion_list if x.startswith(mod[-1])]
+    completion_list = ['.'.join(mod[:-1] + [el]) for el in completion_list]
+    return completion_list
+
+#-----------------------------------------------------------------------------
+# Main functions
+#-----------------------------------------------------------------------------
+
+def module_completion(line, paths=[]):
+    """
+    Returns a list containing the completion possibilities for an import line.
+    
+    The line looks like this :
+    'import xml.d'
+    'from xml.dom import'
+    """
+
+    words = line.split(' ')
+    nwords = len(words)
+    
+    # from whatever <tab> -> 'import '
+    if nwords == 3 and words[0] == 'from':
+        if words[2].startswith('i') or words[2] == '':
+            return ['import ']
+        else:
+            return []
+
+    # 'import xy<tab> or import xy<tab>, '
+    if words[0] == 'import':
+        if nwords == 2 and words[1] == '':
+            return get_root_modules(paths)
+        if ',' == words[-1][-1]:
+            return [' ']       
+        mod = words[-1].split('.')
+        return dot_completion(mod, paths)
+
+    # 'from xy<tab>'
+    if nwords < 3 and (words[0] == 'from'):
+        if nwords == 1:
+            return get_root_modules(paths)
+        mod = words[1].split('.')
+        return dot_completion(mod, paths)
+
+    # 'from xyz import abc<tab>'
+    if nwords >= 3 and words[0] == 'from':
+        mod = words[1]
+        completion_list = try_import(mod)
+        if words[2] == 'import' and words[3] != '':
+            if '(' in words[-1]:
+                words = words[:-2] + words[-1].split('(')
+            if ',' in words[-1]:
+                words = words[:-2] + words[-1].split(',')
+            return [x for x in completion_list if x.startswith(words[-1])]
+        else:
+            return completion_list
+    
+    return []
+        
+
+def reset():
+    """Clear root modules database"""
+    if 'rootmodules' in modules_db:
+        del modules_db['rootmodules']
+
+
+def get_preferred_submodules():
+    """
+    Get all submodules of the main scientific modules and others of our
+    interest
+    """
+    if 'submodules' in modules_db:
+        return modules_db['submodules']
+    
+    mods = ['numpy', 'scipy', 'sympy', 'pandas', 'networkx', 'statsmodels',
+            'matplotlib', 'sklearn', 'skimage', 'mpmath', 'os', 'PIL',
+            'OpenGL', 'array', 'audioop', 'binascii', 'cPickle', 'cStringIO',
+            'cmath', 'collections', 'datetime', 'errno', 'exceptions', 'gc',
+            'imageop', 'imp', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt',
+            'nt', 'operator', 'parser', 'rgbimg', 'signal', 'strop', 'sys',
+            'thread', 'time', 'wx', 'xxsubtype', 'zipimport', 'zlib', 'nose',
+            'PyQt4', 'PySide', 'os.path']
+
+    submodules = []
+    for m in mods:
+        submods = get_submodules(m)
+        submodules += submods
+    
+    modules_db['submodules'] = submodules
+    return submodules
+
+#-----------------------------------------------------------------------------
+# Tests
+#-----------------------------------------------------------------------------
+
+if __name__ == "__main__":
+    # Some simple tests.
+    # Sort operations are done by the completion widget, so we have to
+    # replicate them here.
+    # We've chosen to use xml on most tests because it's on the standard
+    # library. This way we can ensure they work on all plataforms.
+    
+    assert sorted(module_completion('import xml.')) == \
+        ['xml.dom', 'xml.etree', 'xml.parsers', 'xml.sax']
+
+    assert sorted(module_completion('import xml.d')) ==  ['xml.dom']
+
+    assert module_completion('from xml.etree ') == ['import ']
+
+    assert sorted(module_completion('from xml.etree import '), key=str.lower) ==\
+        ['cElementTree', 'ElementInclude', 'ElementPath', 'ElementTree']
+
+    assert module_completion('import sys, zl') == ['zlib']
+
+    s = 'from xml.etree.ElementTree import '
+    assert module_completion(s + 'V') == ['VERSION']
+
+    assert sorted(module_completion(s + 'VERSION, XM')) == \
+        ['XML', 'XMLID', 'XMLParser', 'XMLTreeBuilder']
+
+    assert module_completion(s + '(dum') == ['dump']
+
+    assert module_completion(s + '(dump, Su') == ['SubElement']
diff --git a/spyderlib/utils/programs.py b/spyderlib/utils/programs.py
index eae6850..8d6e227 100644
--- a/spyderlib/utils/programs.py
+++ b/spyderlib/utils/programs.py
@@ -6,7 +6,7 @@
 
 """Running programs utilities"""
 
-from __future__ import with_statement
+from __future__ import print_function
 
 from distutils.version import LooseVersion
 import imp
@@ -18,7 +18,9 @@ import subprocess
 import sys
 import tempfile
 
+# Local imports
 from spyderlib.utils import encoding
+from spyderlib.py3compat import is_text_string
 
 
 if os.name == 'nt':
@@ -111,7 +113,7 @@ def shell_split(text):
     strings with spaces). This function is almost equivalent to the shlex.split
     function (see standard library `shlex`) except that it is supporting 
     unicode strings (shlex does not support unicode until Python 2.7.3)."""
-    assert isinstance(text, basestring)  # in case a QString is passed...
+    assert is_text_string(text)  # in case a QString is passed...
     pattern = r'(\s+|(?<!\\)".*?(?<!\\)"|(?<!\\)\'.*?(?<!\\)\')'
     out = []
     for token in re.split(pattern, text):
@@ -155,13 +157,13 @@ def run_python_script_in_terminal(fname, wdir, args, interact,
     p_args += get_python_args(fname, python_args, interact, debug, args)
     
     if os.name == 'nt':
-        cmd = 'start cmd.exe /c "cd %s && ' % wdir + ' '.join(p_args) + '"'
         # Command line and cwd have to be converted to the filesystem
         # encoding before passing them to subprocess
         # See http://bugs.python.org/issue1759845#msg74142
-        from spyderlib.utils.encoding import to_fs_from_unicode
-        subprocess.Popen(to_fs_from_unicode(cmd), shell=True,
-                         cwd=to_fs_from_unicode(wdir))
+        cmd = encoding.to_fs_from_unicode(
+                'start cmd.exe /c "cd %s && ' % wdir + ' '.join(p_args) + '"')
+        subprocess.Popen(cmd, shell=True,
+                         cwd=encoding.to_fs_from_unicode(wdir))
     elif os.name == 'posix':
         cmd = 'gnome-terminal'
         if is_program_installed(cmd):
@@ -242,17 +244,17 @@ def is_module_installed(module_name, version=None, installed_version=None,
                 f.write(get_modver + "\n")
                 f.write(ismod_inst + "\n")
                 if version:
-                    f.write("print is_module_installed('%s','%s')"\
+                    f.write("print(is_module_installed('%s','%s'))"\
                             % (module_name, version))
                 else:
-                    f.write("print is_module_installed('%s')" % module_name)
+                    f.write("print(is_module_installed('%s'))" % module_name)
             try:
-                output = subprocess.Popen([interpreter, script],
-                                      stdout=subprocess.PIPE).communicate()[0]
+                output, _err = subprocess.Popen([interpreter, script],
+                                        stdout=subprocess.PIPE).communicate()
             except subprocess.CalledProcessError:
-                output = 'True'
+                return True
             if output:  # TODO: Check why output could be empty!
-                return eval(output)
+                return eval(output.decode())
             else:
                 return False
         else:
@@ -291,8 +293,8 @@ def is_module_installed(module_name, version=None, installed_version=None,
 
 
 if __name__ == '__main__':
-    print find_program('hg')
-    print shell_split('-q -o -a')
-    print shell_split(u'-q "d:\\Python de xxxx\\t.txt" -o -a')
-    print is_module_installed('IPython', '>=0.12')
-    print is_module_installed('IPython', '>=0.13;<1.0')
+    print(find_program('hg'))
+    print(shell_split('-q -o -a'))
+    print(shell_split('-q "d:\\Python de xxxx\\t.txt" -o -a'))
+    print(is_module_installed('IPython', '>=0.12'))
+    print(is_module_installed('IPython', '>=0.13;<1.0'))
diff --git a/spyderlib/utils/qthelpers.py b/spyderlib/utils/qthelpers.py
index 460e401..72482d6 100644
--- a/spyderlib/utils/qthelpers.py
+++ b/spyderlib/utils/qthelpers.py
@@ -23,6 +23,7 @@ import sys
 from spyderlib.baseconfig import get_image_path
 from spyderlib.guiconfig import get_shortcut
 from spyderlib.utils import programs
+from spyderlib.py3compat import is_text_string, to_text_string
 
 # Note: How to redirect a signal from widget *a* to widget *b* ?
 # ----
@@ -151,11 +152,11 @@ def mimedata2url(source, extlist=None):
     pathlist = []
     if source.hasUrls():
         for url in source.urls():
-            path = _process_mime_path(unicode(url.toString()), extlist)
+            path = _process_mime_path(to_text_string(url.toString()), extlist)
             if path is not None:
                 pathlist.append(path)
     elif source.hasText():
-        for rawpath in unicode(source.text()).splitlines():
+        for rawpath in to_text_string(source.text()).splitlines():
             path = _process_mime_path(rawpath, extlist)
             if path is not None:
                 pathlist.append(path)
@@ -195,7 +196,7 @@ def create_toolbutton(parent, text=None, shortcut=None, icon=None, tip=None,
     if text is not None:
         button.setText(text)
     if icon is not None:
-        if isinstance(icon, (str, unicode)):
+        if is_text_string(icon):
             icon = get_icon(icon)
         button.setIcon(icon)
     if text is not None or tip is not None:
@@ -244,7 +245,7 @@ def create_action(parent, text, shortcut=None, icon=None, tip=None,
         parent.connect(action, SIGNAL("toggled(bool)"), toggled)
         action.setCheckable(True)
     if icon is not None:
-        if isinstance(icon, (str, unicode)):
+        if is_text_string(icon):
             icon = get_icon(icon)
         action.setIcon(icon)
     if shortcut is not None:
@@ -298,7 +299,7 @@ def add_actions(target, actions, insert_before=None):
 
 def get_item_user_text(item):
     """Get QTreeWidgetItem user role string"""
-    return from_qvariant(item.data(0, Qt.UserRole), unicode)
+    return from_qvariant(item.data(0, Qt.UserRole), to_text_string)
 
 
 def set_item_user_text(item, text):
@@ -308,8 +309,6 @@ def set_item_user_text(item, text):
 
 def create_bookmark_action(parent, url, title, icon=None, shortcut=None):
     """Create bookmark action"""
-    if icon is None:
-        icon = get_icon('browser.png')
     return create_action( parent, title, shortcut=shortcut, icon=icon,
                           triggered=lambda u=url: programs.start_file(u) )
 
@@ -320,16 +319,16 @@ def create_module_bookmark_actions(parent, bookmarks):
     bookmarks = ((module_name, url, title), ...)
     """
     actions = []
-    for key, url, title, icon in bookmarks:
+    for key, url, title in bookmarks:
         if programs.is_module_installed(key):
-            act = create_bookmark_action(parent, url, title, get_icon(icon))
+            act = create_bookmark_action(parent, url, title)
             actions.append(act)
     return actions
 
         
-def create_program_action(parent, text, icon, name, nt_name=None):
+def create_program_action(parent, text, name, icon=None, nt_name=None):
     """Create action to run a program"""
-    if isinstance(icon, basestring):
+    if is_text_string(icon):
         icon = get_icon(icon)
     if os.name == 'nt' and nt_name is not None:
         name = nt_name
@@ -341,7 +340,7 @@ def create_program_action(parent, text, icon, name, nt_name=None):
         
 def create_python_script_action(parent, text, icon, package, module, args=[]):
     """Create action to run a GUI based Python script"""
-    if isinstance(icon, basestring):
+    if is_text_string(icon):
         icon = get_icon(icon)
     if programs.python_script_exists(package, module):
         return create_action(parent, text, icon=icon,
@@ -361,8 +360,9 @@ class DialogManager(QObject):
     def show(self, dialog):
         """Generic method to show a non-modal dialog and keep reference
         to the Qt C++ object"""
-        for dlg in self.dialogs.values():
-            if unicode(dlg.windowTitle()) == unicode(dialog.windowTitle()):
+        for dlg in list(self.dialogs.values()):
+            if to_text_string(dlg.windowTitle()) \
+               == to_text_string(dialog.windowTitle()):
                 dlg.show()
                 dlg.raise_()
                 break
@@ -380,7 +380,7 @@ class DialogManager(QObject):
     
     def close_all(self):
         """Close all opened dialog boxes"""
-        for dlg in self.dialogs.values():
+        for dlg in list(self.dialogs.values()):
             dlg.reject()
 
         
diff --git a/spyderlib/utils/sourcecode.py b/spyderlib/utils/sourcecode.py
index f33abc4..9714385 100644
--- a/spyderlib/utils/sourcecode.py
+++ b/spyderlib/utils/sourcecode.py
@@ -44,8 +44,8 @@ def fix_indentation(text):
     
 def is_builtin(text):
     """Test if passed string is the name of a Python builtin object"""
-    import __builtin__
-    return text in [str(name) for name in dir(__builtin__)
+    from spyderlib.py3compat import builtins
+    return text in [str(name) for name in dir(builtins)
                     if not name.startswith('_')]
 
 def is_keyword(text):
diff --git a/spyderlib/utils/system.py b/spyderlib/utils/system.py
index 42f10cc..2321e97 100644
--- a/spyderlib/utils/system.py
+++ b/spyderlib/utils/system.py
@@ -53,9 +53,9 @@ else:
 
 
 if __name__ == '__main__':
-    print "*"*80
-    print memory_usage.__doc__
-    print memory_usage()
-    print "*"*80
-    print windows_memory_usage.__doc__
-    print windows_memory_usage()
+    print("*"*80)
+    print(memory_usage.__doc__)
+    print(memory_usage())
+    print("*"*80)
+    print(windows_memory_usage.__doc__)
+    print(windows_memory_usage())
diff --git a/spyderlib/utils/vcs.py b/spyderlib/utils/vcs.py
index c7151bd..51e3a5b 100644
--- a/spyderlib/utils/vcs.py
+++ b/spyderlib/utils/vcs.py
@@ -1,104 +1,117 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2011 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""Utilities for version control systems"""
-
-import os.path as osp
-import subprocess
-
-# Local imports
-from spyderlib.baseconfig import _
-from spyderlib.utils import programs
-from spyderlib.utils.misc import abspardir
-
-
-VCS_INFOS = {
-             '.hg':  dict(name="Mercurial",
-                          commit=( ('thg', ['commit']),
-                                   ('hgtk', ['commit']) ),
-                          browse=( ('thg', ['log']),
-                                   ('hgtk', ['log']) )
-                          ),
-             '.git': dict(name="git",
-                          commit=( ('git', ['gui']), ),
-                          browse=( ('gitk', []), )
-                          ),
-             }
-
-
-def get_vcs_infos(path):
-    """Return VCS infos if path is a supported VCS repository"""
-    for dirname, infos in VCS_INFOS.iteritems():
-        vcs_path = osp.join(path, dirname)
-        if osp.isdir(vcs_path):
-            return infos
-
-
-def get_vcs_root(path):
-    """Return VCS root directory path
-    Return None if path is not within a supported VCS repository"""
-    previous_path = path
-    while get_vcs_infos(path) is None:
-        path = abspardir(path)
-        if path == previous_path:
-            return
-        else:
-            previous_path = path
-    return osp.abspath(path)
-
-
-def is_vcs_repository(path):
-    """Return True if path is a supported VCS repository"""
-    return get_vcs_root(path) is not None
-
-
-def run_vcs_tool(path, tool):
-    """If path is a valid VCS repository, run the corresponding VCS tool
-    Supported VCS tools: 'commit', 'browse'
-    Return False if the VCS tool is not installed"""
-    infos = get_vcs_infos(get_vcs_root(path))
-    for name, args in infos[tool]:
-        if programs.find_program(name):
-            programs.run_program(name, args, cwd=path)
-            return
-    else:
-        raise RuntimeError(_("For %s support, please install one of the<br/> "
-                             "following tools:<br/><br/>  %s")
-                           % (infos['name'],
-                              ', '.join([name for name,cmd in infos['commit']])
-                              ))
-
-
-def is_hg_installed():
-    """Return True if Mercurial is installed"""
-    return programs.find_program('hg') is not None
-
-
-def get_hg_revision(repopath):
-    """Return Mercurial revision for the repository located at repopath
-       Result is a tuple (global, local, branch), with None values on error
-       For example:
-           >>> get_hg_revision(".")
-           ('eba7273c69df+', '2015+', 'default')
-    """
-    try:
-        hg = programs.find_program('hg')
-        assert hg is not None and osp.isdir(osp.join(repopath, '.hg'))
-        output = subprocess.Popen([hg, 'id', '-nib', repopath],
-                                  stdout=subprocess.PIPE).communicate()[0]
-        # output is now: ('eba7273c69df+ 2015+ default\n', None)
-        return tuple(output.strip().split())
-    except (subprocess.CalledProcessError, AssertionError, AttributeError):
-        # print("Error: Failed to get revision number from Mercurial - %s" % exc)
-        return (None, None, None)
-
-
-if __name__ == '__main__':
-    print get_vcs_root(osp.dirname(__file__))
-    print get_vcs_root(r'D:\Python\ipython\IPython\frontend')
-    #run_vcs_tool(r'D:\Python\userconfig\userconfig', 'commit')
-    print get_hg_revision(osp.dirname(__file__)+"/../..")
-    print get_hg_revision('/')
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2011 Pierre Raybaut
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+"""Utilities for version control systems"""
+
+from __future__ import print_function
+
+import os.path as osp
+import subprocess
+
+# Local imports
+from spyderlib.utils import programs
+from spyderlib.utils.misc import abspardir
+
+
+SUPPORTED = [
+{
+    'name': 'Mercurial',
+    'rootdir': '.hg',
+    'actions': dict(
+        commit=( ('thg', ['commit']),
+                 ('hgtk', ['commit']) ),
+        browse=( ('thg', ['log']),
+                 ('hgtk', ['log']) ))
+}, {
+    'name': 'Git',
+    'rootdir': '.git',
+    'actions': dict(
+        commit=( ('git', ['gui']), ),
+        browse=( ('gitk', []), ))
+}]
+
+
+class ActionToolNotFound(RuntimeError):
+    """Exception to transmit information about supported tools for
+       failed attempt to execute given action"""
+       
+    def __init__(self, vcsname, action, tools):
+        RuntimeError.__init__(self)
+        self.vcsname = vcsname
+        self.action = action
+        self.tools = tools
+
+
+def get_vcs_info(path):
+    """Return support status dict if path is under VCS root"""
+    for info in SUPPORTED:
+        vcs_path = osp.join(path, info['rootdir'])
+        if osp.isdir(vcs_path):
+            return info
+
+
+def get_vcs_root(path):
+    """Return VCS root directory path
+    Return None if path is not within a supported VCS repository"""
+    previous_path = path
+    while get_vcs_info(path) is None:
+        path = abspardir(path)
+        if path == previous_path:
+            return
+        else:
+            previous_path = path
+    return osp.abspath(path)
+
+
+def is_vcs_repository(path):
+    """Return True if path is a supported VCS repository"""
+    return get_vcs_root(path) is not None
+
+
+def run_vcs_tool(path, action):
+    """If path is a valid VCS repository, run the corresponding VCS tool
+    Supported VCS actions: 'commit', 'browse'
+    Return False if the VCS tool is not installed"""
+    info = get_vcs_info(get_vcs_root(path))
+    tools = info['actions'][action]
+    for tool, args in tools:
+        if programs.find_program(tool):
+            programs.run_program(tool, args, cwd=path)
+            return
+    else:
+        cmdnames = [name for name, args in tools]
+        raise ActionToolNotFound(info['name'], action, cmdnames)
+
+def is_hg_installed():
+    """Return True if Mercurial is installed"""
+    return programs.find_program('hg') is not None
+
+
+def get_hg_revision(repopath):
+    """Return Mercurial revision for the repository located at repopath
+       Result is a tuple (global, local, branch), with None values on error
+       For example:
+           >>> get_hg_revision(".")
+           ('eba7273c69df+', '2015+', 'default')
+    """
+    try:
+        hg = programs.find_program('hg')
+        assert hg is not None and osp.isdir(osp.join(repopath, '.hg'))
+        output, _err = subprocess.Popen([hg, 'id', '-nib', repopath],
+                                        stdout=subprocess.PIPE).communicate()
+        # output is now: ('eba7273c69df+ 2015+ default\n', None)
+        return tuple(output.decode().strip().split())
+    except (subprocess.CalledProcessError, AssertionError, AttributeError):
+        # print("Error: Failed to get revision number from Mercurial - %s" % exc)
+        return (None, None, None)
+
+
+if __name__ == '__main__':
+    print(get_vcs_root(osp.dirname(__file__)))
+    print(get_vcs_root(r'D:\Python\ipython\IPython\kernel'))
+    #run_vcs_tool(r'D:\Python\userconfig\userconfig', 'commit')
+    print(get_hg_revision(osp.dirname(__file__)+"/../.."))
+    print(get_hg_revision('/'))
diff --git a/spyderlib/utils/windows.py b/spyderlib/utils/windows.py
index 7bed9f5..238c9eb 100644
--- a/spyderlib/utils/windows.py
+++ b/spyderlib/utils/windows.py
@@ -6,24 +6,36 @@
 
 """Windows-specific utilities"""
 
-set_attached_console_visible = None
-is_attached_console_visible = None
-
-try:
-    import win32gui, win32console, win32con
-    win32console.GetConsoleWindow() # do nothing, this is just a test
-    def set_attached_console_visible(state):
-        """Show/hide console window attached to current window
-        
-        This is for Windows platforms only. Requires pywin32 library."""
-        win32gui.ShowWindow(win32console.GetConsoleWindow(),
-                            win32con.SW_SHOW if state else win32con.SW_HIDE)
-    def is_attached_console_visible():
-        """Return True if attached console window is visible"""
-        return win32gui.IsWindowVisible(win32console.GetConsoleWindow())
-except (ImportError, NotImplementedError):
-    # This is not a Windows platform (ImportError)
-    # or pywin32 is not installed (ImportError)
-    # or GetConsoleWindow is not implemented on current platform
-    pass
 
+from ctypes import windll
+
+
+# --- Window control ---
+
+SW_SHOW = 5    # activate and display
+SW_SHOWNA = 8  # show without activation
+SW_HIDE = 0
+
+GetConsoleWindow = windll.kernel32.GetConsoleWindow
+ShowWindow = windll.user32.ShowWindow
+IsWindowVisible = windll.user32.IsWindowVisible
+
+# Handle to console window associated with current Python
+# interpreter procss, 0 if there is no window
+console_window_handle = GetConsoleWindow()
+
+def set_attached_console_visible(state):
+    """Show/hide system console window attached to current process.
+       Return it's previous state.
+
+       Availability: Windows"""
+    flag = {True: SW_SHOW, False: SW_HIDE}
+    return bool(ShowWindow(console_window_handle, flag[state]))
+
+def is_attached_console_visible():
+    """Return True if attached console window is visible"""
+    return IsWindowVisible(console_window_handle)
+
+
+# [ ] the console state asks for a storage container
+# [ ] reopen console on exit - better die open than become a zombie
diff --git a/spyderlib/widgets/arrayeditor.py b/spyderlib/widgets/arrayeditor.py
index 481f4fe..80414ad 100644
--- a/spyderlib/widgets/arrayeditor.py
+++ b/spyderlib/widgets/arrayeditor.py
@@ -13,6 +13,8 @@ NumPy Array Editor Dialog based on Qt
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+from __future__ import print_function
+
 from spyderlib.qt.QtGui import (QHBoxLayout, QColor, QTableView, QItemDelegate,
                                 QLineEdit, QCheckBox, QGridLayout,
                                 QDoubleValidator, QDialog, QDialogButtonBox,
@@ -24,13 +26,13 @@ from spyderlib.qt.QtCore import (Qt, QModelIndex, QAbstractTableModel, SIGNAL,
 from spyderlib.qt.compat import to_qvariant, from_qvariant
 
 import numpy as np
-import StringIO
 
 # Local imports
 from spyderlib.baseconfig import _
 from spyderlib.guiconfig import get_font
 from spyderlib.utils.qthelpers import (add_actions, create_action, keybinding,
                                        qapplication, get_icon)
+from spyderlib.py3compat import io, to_text_string, is_text_string
 
 # Note: string and unicode data types will be formatted with '%s' (see below)
 SUPPORTED_FORMATS = {
@@ -85,7 +87,7 @@ def is_number(dtype):
 
 def get_idx_rect(index_list):
     """Extract the boundaries from a list of indexes"""
-    rows, cols = zip(*[(i.row(), i.column()) for i in index_list])
+    rows, cols = list(zip(*[(i.row(), i.column()) for i in index_list]))
     return ( min(rows), max(rows), min(cols), max(cols) )
 
 
@@ -205,7 +207,7 @@ class ArrayModel(QAbstractTableModel):
         elif self._data.dtype.name.startswith("string"):
             val = str(value)
         elif self._data.dtype.name.startswith("unicode"):
-            val = unicode(value)
+            val = to_text_string(value)
         else:
             if value.lower().startswith('e') or value.lower().endswith('e'):
                 return False
@@ -213,14 +215,14 @@ class ArrayModel(QAbstractTableModel):
                 val = complex(value)
                 if not val.imag:
                     val = val.real
-            except ValueError, e:
+            except ValueError as e:
                 QMessageBox.critical(self.dialog, "Error",
                                      "Value error: %s" % str(e))
                 return False
         try:
             self.test_array[0] = val # will raise an Exception eventually
-        except OverflowError, e:
-            print type(e.message)
+        except OverflowError as e:
+            print(type(e.message))
             QMessageBox.critical(self.dialog, "Error",
                                  "Overflow error: %s" % e.message)
             return False
@@ -298,7 +300,7 @@ class ArrayView(QTableView):
         self.setModel(model)
         self.setItemDelegate(ArrayDelegate(dtype, self))
         total_width = 0
-        for k in xrange(shape[1]):
+        for k in range(shape[1]):
             total_width += self.columnWidth(k)
         self.viewport().resize(min(total_width, 1024), self.height())
         self.shape = shape
@@ -347,7 +349,7 @@ class ArrayView(QTableView):
         """Copy an array portion to a unicode string"""
         row_min, row_max, col_min, col_max = get_idx_rect(cell_range)
         _data = self.model().get_data()
-        output = StringIO.StringIO()
+        output = io.StringIO()
         np.savetxt(output,
                   _data[row_min:row_max+1, col_min:col_max+1],
                   delimiter='\t')
@@ -403,7 +405,7 @@ class ArrayEditorWidget(QWidget):
         
     def accept_changes(self):
         """Accept changes"""
-        for (i, j), value in self.model.changes.iteritems():
+        for (i, j), value in list(self.model.changes.items()):
             self.data[i, j] = value
         if self.old_data_shape is not None:
             self.data.shape = self.old_data_shape
@@ -481,7 +483,7 @@ class ArrayEditor(QDialog):
         self.setLayout(self.layout)
         self.setWindowIcon(get_icon('arredit.png'))
         if title:
-            title = unicode(title) # in case title is not a string
+            title = to_text_string(title) # in case title is not a string
         else:
             title = _("Array editor")
         if readonly:
@@ -521,7 +523,7 @@ class ArrayEditor(QDialog):
                     text = name
                     if len(field) >= 3:
                         title = field[2]
-                        if not isinstance(title, basestring):
+                        if not is_text_string(title):
                             title = repr(title)
                         text += ' - '+title
                     names.append(text)
@@ -598,33 +600,34 @@ def test():
     _app = qapplication()
     
     arr = np.array(["kjrekrjkejr"])
-    print "out:", test_edit(arr, "string array")
-    arr = np.array([u"kjrekrjkejr"])
-    print "out:", test_edit(arr, "unicode array")
+    print("out:", test_edit(arr, "string array"))
+    from spyderlib.py3compat import u
+    arr = np.array([u("kjrekrjkejr")])
+    print("out:", test_edit(arr, "unicode array"))
     arr = np.ma.array([[1, 0], [1, 0]], mask=[[True, False], [False, False]])
-    print "out:", test_edit(arr, "masked array")
-    arr = np.zeros((2,2), {'names': ('red', 'green', 'blue'),
+    print("out:", test_edit(arr, "masked array"))
+    arr = np.zeros((2, 2), {'names': ('red', 'green', 'blue'),
                            'formats': (np.float32, np.float32, np.float32)})
-    print "out:", test_edit(arr, "record array")
+    print("out:", test_edit(arr, "record array"))
     arr = np.array([(0, 0.0), (0, 0.0), (0, 0.0)],
                    dtype=[(('title 1', 'x'), '|i1'),
                           (('title 2', 'y'), '>f4')])
-    print "out:", test_edit(arr, "record array with titles")
+    print("out:", test_edit(arr, "record array with titles"))
     arr = np.random.rand(5, 5)
-    print "out:", test_edit(arr, "float array",
-                            xlabels=['a', 'b', 'c', 'd', 'e'])
+    print("out:", test_edit(arr, "float array",
+                            xlabels=['a', 'b', 'c', 'd', 'e']))
     arr = np.round(np.random.rand(5, 5)*10)+\
                    np.round(np.random.rand(5, 5)*10)*1j
-    print "out:", test_edit(arr, "complex array",
+    print("out:", test_edit(arr, "complex array",
                             xlabels=np.linspace(-12, 12, 5),
-                            ylabels=np.linspace(-12, 12, 5))
+                            ylabels=np.linspace(-12, 12, 5)))
     arr_in = np.array([True, False, True])
-    print "in:", arr_in
+    print("in:", arr_in)
     arr_out = test_edit(arr_in, "bool array")
-    print "out:", arr_out
-    print arr_in is arr_out
+    print("out:", arr_out)
+    print(arr_in is arr_out)
     arr = np.array([1, 2, 3], dtype="int8")
-    print "out:", test_edit(arr, "int array")
+    print("out:", test_edit(arr, "int array"))
 
 
 if __name__ == "__main__":
diff --git a/spyderlib/widgets/browser.py b/spyderlib/widgets/browser.py
index 429833d..a3c7c6d 100644
--- a/spyderlib/widgets/browser.py
+++ b/spyderlib/widgets/browser.py
@@ -19,6 +19,7 @@ from spyderlib.utils.qthelpers import (get_icon, create_action, add_actions,
 from spyderlib.baseconfig import _
 from spyderlib.widgets.comboboxes import UrlComboBox
 from spyderlib.widgets.findreplace import FindReplace
+from spyderlib.py3compat import to_text_string, is_text_string
 
 
 class WebView(QWebView):
@@ -91,7 +92,7 @@ class WebView(QWebView):
     #------ QWebView API -------------------------------------------------------
     def createWindow(self, webwindowtype):
         import webbrowser
-        webbrowser.open(unicode(self.url().toString()))
+        webbrowser.open(to_text_string(self.url().toString()))
         
     def contextMenuEvent(self, event):
         menu = QMenu(self)
@@ -194,7 +195,7 @@ class WebBrowser(QWidget):
         
     def go_to(self, url_or_text):
         """Go to page *address*"""
-        if isinstance(url_or_text, basestring):
+        if is_text_string(url_or_text):
             url = QUrl(url_or_text)
         else:
             url = url_or_text
@@ -211,7 +212,7 @@ class WebBrowser(QWidget):
         
     def url_combo_activated(self, valid):
         """Load URL from combo box first item"""
-        text = unicode(self.url_combo.currentText())
+        text = to_text_string(self.url_combo.currentText())
         self.go_to(self.text_to_url(text))
         
     def load_finished(self, ok):
diff --git a/spyderlib/widgets/colors.py b/spyderlib/widgets/colors.py
index 512b736..4b7a140 100644
--- a/spyderlib/widgets/colors.py
+++ b/spyderlib/widgets/colors.py
@@ -4,6 +4,9 @@ from spyderlib.qt.QtGui import (QLineEdit, QIcon, QHBoxLayout, QColor,
                                 QPushButton, QColorDialog, QPixmap)
 from spyderlib.qt.QtCore import SIGNAL, QSize, Slot, Property
 
+# Local imports
+from spyderlib.py3compat import is_text_string
+
 
 class ColorButton(QPushButton):
     """
@@ -47,7 +50,7 @@ def text_to_qcolor(text):
     """
     color = QColor()
     text = str(text)
-    if not isinstance(text, (unicode, str)):
+    if not is_text_string(text):
         return color
     if text.startswith('#') and len(text)==7:
         correct = '#0123456789abcdef'
diff --git a/spyderlib/widgets/comboboxes.py b/spyderlib/widgets/comboboxes.py
index 7d05e8b..ce006e4 100644
--- a/spyderlib/widgets/comboboxes.py
+++ b/spyderlib/widgets/comboboxes.py
@@ -19,6 +19,7 @@ import os.path as osp
 
 # Local imports
 from spyderlib.baseconfig import _
+from spyderlib.py3compat import to_text_string
 
 
 class BaseComboBox(QComboBox):
@@ -176,7 +177,7 @@ class PathComboBox(EditableComboBox):
         """Return True if string is valid"""
         if qstr is None:
             qstr = self.currentText()
-        return osp.isdir( unicode(qstr) )
+        return osp.isdir( to_text_string(qstr) )
     
     def selected(self):
         """Action to be executed when a valid item has been selected"""
@@ -217,7 +218,7 @@ class PythonModulesComboBox(PathComboBox):
         """Return True if string is valid"""
         if qstr is None:
             qstr = self.currentText()
-        return is_module_or_package(unicode(qstr))
+        return is_module_or_package(to_text_string(qstr))
     
     def selected(self):
         """Action to be executed when a valid item has been selected"""
diff --git a/spyderlib/widgets/dicteditor.py b/spyderlib/widgets/dicteditor.py
index 3d9acbd..160870a 100644
--- a/spyderlib/widgets/dicteditor.py
+++ b/spyderlib/widgets/dicteditor.py
@@ -16,6 +16,7 @@ Dictionary Editor Widget and Dialog based on Qt
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+from __future__ import print_function
 from spyderlib.qt.QtGui import (QMessageBox, QTableView, QItemDelegate,
                                 QLineEdit, QVBoxLayout, QWidget, QColor,
                                 QDialog, QDateEdit, QDialogButtonBox, QMenu,
@@ -25,7 +26,6 @@ from spyderlib.qt.QtCore import (Qt, QModelIndex, QAbstractTableModel, SIGNAL,
                                  SLOT, QDateTime, Signal)
 from spyderlib.qt.compat import to_qvariant, from_qvariant, getsavefilename
 
-import os
 import sys
 import datetime
 
@@ -44,11 +44,12 @@ if ndarray is not FakeObject:
     from spyderlib.widgets.arrayeditor import ArrayEditor
 from spyderlib.widgets.texteditor import TextEditor
 from spyderlib.widgets.importwizard import ImportWizard
+from spyderlib.py3compat import to_text_string, is_text_string, getcwd, u
 
 
 def display_to_value(value, default_value, ignore_errors=True):
     """Convert back to value"""
-    value = from_qvariant(value, unicode)
+    value = from_qvariant(value, to_text_string)
     try:
         np_dtype = get_numpy_dtype(default_value)
         if isinstance(default_value, bool):
@@ -65,8 +66,8 @@ def display_to_value(value, default_value, ignore_errors=True):
                 value = np_dtype(value)
         elif isinstance(default_value, str):
             value = str(value)
-        elif isinstance(default_value, unicode):
-            value = unicode(value)
+        elif is_text_string(default_value):
+            value = to_text_string(value)
         elif isinstance(default_value, complex):
             value = complex(value)
         elif isinstance(default_value, float):
@@ -123,7 +124,7 @@ class ReadOnlyDictModel(QAbstractTableModel):
         self._data = None
         self.showndata = None
         self.keys = None
-        self.title = unicode(title) # in case title is not a string
+        self.title = to_text_string(title) # in case title is not a string
         if self.title:
             self.title = self.title + ' - '
         self.sizes = None
@@ -145,13 +146,13 @@ class ReadOnlyDictModel(QAbstractTableModel):
         if self.names:
             self.header0 = _("Name")
         if isinstance(data, tuple):
-            self.keys = range(len(data))
+            self.keys = list(range(len(data)))
             self.title += _("Tuple")
         elif isinstance(data, list):
-            self.keys = range(len(data))
+            self.keys = list(range(len(data)))
             self.title += _("List")
         elif isinstance(data, dict):
-            self.keys = data.keys()
+            self.keys = list(data.keys())
             self.title += _("Dictionary")
             if not self.names:
                 self.header0 = _("Key")
@@ -356,11 +357,11 @@ class DictDelegate(QItemDelegate):
             return None
         try:
             value = self.get_value(index)
-        except Exception, msg:
+        except Exception as msg:
             QMessageBox.critical(self.parent(), _("Edit item"),
                                  _("<b>Unable to retrieve data.</b>"
                                    "<br><br>Error message:<br>%s"
-                                   ) % unicode(msg))
+                                   ) % to_text_string(msg))
             return
         key = index.model().get_key(index)
         readonly = isinstance(value, tuple) or self.parent().readonly \
@@ -415,7 +416,7 @@ class DictDelegate(QItemDelegate):
                          self.commitAndCloseEditor)
             return editor
         #---editor = QTextEdit
-        elif isinstance(value, (str, unicode)) and len(value)>40:
+        elif is_text_string(value) and len(value)>40:
             editor = TextEditor(value, key)
             self.create_dialog(editor, dict(model=index.model(), editor=editor,
                                             key=key, readonly=readonly))
@@ -468,7 +469,7 @@ class DictDelegate(QItemDelegate):
         Model --> Editor"""
         value = self.get_value(index)
         if isinstance(editor, QLineEdit):
-            if not isinstance(value, basestring):
+            if not is_text_string(value):
                 value = repr(value)
             editor.setText(value)
         elif isinstance(editor, QDateEdit):
@@ -489,7 +490,7 @@ class DictDelegate(QItemDelegate):
                 value = display_to_value(to_qvariant(value),
                                          self.get_value(index),
                                          ignore_errors=False)
-            except Exception, msg:
+            except Exception as msg:
                 raise
                 QMessageBox.critical(editor, _("Edit item"),
                                      _("<b>Unable to assign data to item.</b>"
@@ -618,7 +619,7 @@ class BaseTableView(QTableView):
                         self.imshow_action, self.save_array_action,
                         self.insert_action, self.remove_action,
                         self.copy_action, self.paste_action,
-                        None, self.rename_action,self.duplicate_action,
+                        None, self.rename_action, self.duplicate_action,
                         None, resize_action, None, self.truncate_action,
                         self.inplace_action, self.collvalue_action]
         if ndarray is not FakeObject:
@@ -812,7 +813,7 @@ class BaseTableView(QTableView):
                                       one if len(indexes) == 1 else more,
                                       QMessageBox.Yes | QMessageBox.No)
         if answer == QMessageBox.Yes:
-            idx_rows = unsorted_unique(map(lambda idx: idx.row(), indexes))
+            idx_rows = unsorted_unique([idx.row() for idx in indexes])
             keys = [ self.model.keys[idx_row] for idx_row in idx_rows ]
             self.remove_values(keys)
 
@@ -821,14 +822,14 @@ class BaseTableView(QTableView):
         indexes = self.selectedIndexes()
         if not indexes:
             return
-        idx_rows = unsorted_unique(map(lambda idx: idx.row(), indexes))
+        idx_rows = unsorted_unique([idx.row() for idx in indexes])
         if len(idx_rows) > 1 or not indexes[0].isValid():
             return
         orig_key = self.model.keys[idx_rows[0]]
         new_key, valid = QInputDialog.getText(self, _( 'Rename'), _( 'Key:'),
-                                              QLineEdit.Normal,orig_key)
-        if valid and unicode(new_key):
-            new_key = try_to_eval(unicode(new_key))
+                                              QLineEdit.Normal, orig_key)
+        if valid and to_text_string(new_key):
+            new_key = try_to_eval(to_text_string(new_key))
             if new_key == orig_key:
                 return
             self.copy_value(orig_key, new_key)
@@ -857,16 +858,16 @@ class BaseTableView(QTableView):
         elif isinstance(data, dict):
             key, valid = QInputDialog.getText(self, _( 'Insert'), _( 'Key:'),
                                               QLineEdit.Normal)
-            if valid and unicode(key):
-                key = try_to_eval(unicode(key))
+            if valid and to_text_string(key):
+                key = try_to_eval(to_text_string(key))
             else:
                 return
         else:
             return
         value, valid = QInputDialog.getText(self, _('Insert'), _('Value:'),
                                             QLineEdit.Normal)
-        if valid and unicode(value):
-            self.new_value(key, try_to_eval(unicode(value)))
+        if valid and to_text_string(value):
+            self.new_value(key, try_to_eval(to_text_string(value)))
             
     def __prepare_plot(self):
         try:
@@ -890,7 +891,7 @@ class BaseTableView(QTableView):
             key = self.model.get_key(index)
             try:
                 self.plot(key, funcname)
-            except (ValueError, TypeError), error:
+            except (ValueError, TypeError) as error:
                 QMessageBox.critical(self, _( "Plot"),
                                      _("<b>Unable to plot data.</b>"
                                        "<br><br>Error message:<br>%s"
@@ -906,7 +907,7 @@ class BaseTableView(QTableView):
                     self.show_image(key)
                 else:
                     self.imshow(key)
-            except (ValueError, TypeError), error:
+            except (ValueError, TypeError) as error:
                 QMessageBox.critical(self, _( "Plot"),
                                      _("<b>Unable to show image.</b>"
                                        "<br><br>Error message:<br>%s"
@@ -916,7 +917,7 @@ class BaseTableView(QTableView):
         """Save array"""
         title = _( "Save array")
         if self.array_filename is None:
-            self.array_filename = os.getcwdu()
+            self.array_filename = getcwd()
         self.emit(SIGNAL('redirect_stdio(bool)'), False)
         filename, _selfilter = getsavefilename(self, title,
                                                self.array_filename,
@@ -928,7 +929,7 @@ class BaseTableView(QTableView):
             try:
                 import numpy as np
                 np.save(self.array_filename, data)
-            except Exception, error:
+            except Exception as error:
                 QMessageBox.critical(self, title,
                                      _("<b>Unable to save array</b>"
                                        "<br><br>Error message:<br>%s"
@@ -940,8 +941,8 @@ class BaseTableView(QTableView):
         for idx in self.selectedIndexes():
             if not idx.isValid():
                 continue
-            clipl.append(unicode(self.delegate.get_value(idx)))
-        clipboard.setText(u'\n'.join(clipl))
+            clipl.append(to_text_string(self.delegate.get_value(idx)))
+        clipboard.setText(u('\n').join(clipl))
     
     def import_from_string(self, text, title=None):
         """Import data from string"""
@@ -949,7 +950,7 @@ class BaseTableView(QTableView):
         editor = ImportWizard(self, text, title=title,
                               contents_title=_("Clipboard contents"),
                               varname=fix_reference_name("data",
-                                                         blacklist=data.keys()))
+                                                         blacklist=list(data.keys())))
         if editor.exec_():
             var_name, clip_data = editor.get_data()
             self.new_value(var_name, clip_data)
@@ -957,9 +958,9 @@ class BaseTableView(QTableView):
     def paste(self):
         """Import text/data/code from clipboard"""
         clipboard = QApplication.clipboard()
-        cliptext = u""
+        cliptext = ''
         if clipboard.mimeData().hasText():
-            cliptext = unicode(clipboard.text())
+            cliptext = to_text_string(clipboard.text())
         if cliptext.strip():
             self.import_from_string(cliptext, title=_("Import from clipboard"))
         else:
@@ -990,7 +991,7 @@ class DictEditorTableView(BaseTableView):
     def remove_values(self, keys):
         """Remove values from data"""
         data = self.model.get_data()
-        for key in sorted(keys,reverse=True):
+        for key in sorted(keys, reverse=True):
             data.pop(key)
             self.set_data(data)
 
@@ -1159,7 +1160,7 @@ class DictEditor(QDialog):
         self.resize(width, height)
         
         self.setWindowTitle(self.widget.get_title())
-        if isinstance(icon, (str, unicode)):
+        if is_text_string(icon):
             icon = get_icon(icon)
         self.setWindowIcon(icon)
         # Make the dialog act as a window
@@ -1308,7 +1309,7 @@ def get_test_data():
     foobar = Foobar()
     return {'object': foobar,
             'str': 'kjkj kj k j j kj k jkj',
-            'unicode': u'éù',
+            'unicode': u('éù'),
             'list': [1, 3, [sorted, 5, 6], 'kjkj', None],
             'tuple': ([1, testdate, testdict], 'kjkj', None),
             'dict': testdict,
@@ -1341,7 +1342,7 @@ def test():
     dialog.setup(get_test_data())
     dialog.show()
     app.exec_()
-    print "out:", dialog.get_value()
+    print("out:", dialog.get_value())
     
 def remote_editor_test():
     """Remote dictionary editor test"""
@@ -1355,7 +1356,7 @@ def remote_editor_test():
     dialog.show()
     app.exec_()
     if dialog.result():
-        print dialog.get_value()
+        print(dialog.get_value())
 
 if __name__ == "__main__":
     test()
\ No newline at end of file
diff --git a/spyderlib/widgets/dicteditorutils.py b/spyderlib/widgets/dicteditorutils.py
index 89c6ee4..47c33d8 100644
--- a/spyderlib/widgets/dicteditorutils.py
+++ b/spyderlib/widgets/dicteditorutils.py
@@ -8,8 +8,15 @@
 Utilities for the Dictionary Editor Widget and Dialog based on Qt
 """
 
+from __future__ import print_function
+
 import re
 
+# Local imports
+from spyderlib.py3compat import (NUMERIC_TYPES, TEXT_TYPES,
+                                 to_text_string, is_text_string)
+
+
 #----Numpy arrays support
 class FakeObject(object):
     """Fake class used in replacement of missing modules"""
@@ -29,13 +36,11 @@ def get_numpy_dtype(obj):
     if ndarray is not FakeObject:
         # NumPy is available
         import numpy as np
-        if isinstance(obj, np.object):
-            # Note: TTBOMK, there is no type associated to both NumPy arrays 
-            # and scalars, so we must handle the AttributeError exception.
-            # Thus, we could have skipped the `isinstance(obj, np.object)` 
-            # test, but keeping it is the only way to be sure that the object 
-            # is really a NumPy object instead of an object simply following 
-            # the same interface.
+        if isinstance(obj, np.generic) or isinstance(obj, np.ndarray):
+        # Numpy scalars all inherit from np.generic.
+        # Numpy arrays all inherit from np.ndarray.
+        # If we check that we are certain we have one of these
+        # types then we are less likely to generate an exception below.
             try:
                 return obj.dtype.type
             except (AttributeError, RuntimeError):
@@ -56,7 +61,7 @@ except ImportError:
 def address(obj):
     """Return object address as a string: '<classname @ address>'"""
     return "<%s @ %s>" % (obj.__class__.__name__,
-                          hex(id(obj)).upper().replace('X','x'))
+                          hex(id(obj)).upper().replace('X', 'x'))
 
 
 #----date and datetime objects support
@@ -66,11 +71,11 @@ try:
 except ImportError:
     def dateparse(datestr):  # analysis:ignore
         """Just for 'year, month, day' strings"""
-        return datetime.datetime( *map(int, datestr.split(',')) )
+        return datetime.datetime( *list(map(int, datestr.split(','))) )
 def datestr_to_datetime(value):
     rp = value.rfind('(')+1
     v = dateparse(value[rp:-1])
-    print value, "-->", v
+    print(value, "-->", v)
     return v
 
 
@@ -79,12 +84,11 @@ ARRAY_COLOR = "#00ff00"
 SCALAR_COLOR = "#0000ff"
 COLORS = {
           bool:               "#ff00ff",
-          (int, float,
-           complex, long):    SCALAR_COLOR,
+          NUMERIC_TYPES:      SCALAR_COLOR,
           list:               "#ffff00",
           dict:               "#00ffff",
           tuple:              "#c0c0c0",
-          (str, unicode):     "#800000",
+          TEXT_TYPES:         "#800000",
           (ndarray,
            MaskedArray):      ARRAY_COLOR,
           Image:              "#008000",
@@ -97,7 +101,7 @@ def get_color_name(value):
     """Return color name depending on value type"""
     if not is_known_type(value):
         return CUSTOM_TYPE_COLOR
-    for typ, name in COLORS.iteritems():
+    for typ, name in list(COLORS.items()):
         if isinstance(value, typ):
             return name
     else:
@@ -122,9 +126,7 @@ def sort_against(lista, listb, reverse=False):
 
 def unsorted_unique(lista):
     """Removes duplicates from lista neglecting its initial ordering"""
-    set = {}
-    map(set.__setitem__,lista,[])
-    return set.keys()
+    return list(set(lista))
 
 
 #----Display <--> Value
@@ -143,7 +145,7 @@ def value_to_display(value, truncate=False,
             pass
     if isinstance(value, Image):
         return '%s  Mode: %s' % (address(value), value.mode)
-    if not isinstance(value, (str, unicode)):
+    if not is_text_string(value):
         if isinstance(value, (list, tuple, dict, set)) and not collvalue:            
             value = address(value)
         else:
@@ -172,7 +174,7 @@ def get_size(item):
 
 def get_type_string(item):
     """Return type string of an object"""
-    found = re.findall(r"<type '([\S]*)'>", str(type(item)))
+    found = re.findall(r"<(?:type|class) '(\S*)'>", str(type(item)))
     if found:
         return found[0]
 
@@ -190,7 +192,7 @@ def get_human_readable_type(item):
     else:
         text = get_type_string(item)
         if text is None:
-            text = unicode('unknown')
+            text = to_text_string('unknown')
         else:
             return text[text.find('.')+1:]
 
@@ -211,7 +213,7 @@ def is_supported(value, check_all=False, filters=None, iterate=True):
                 if not check_all:
                     break
         elif isinstance(value, dict):
-            for key, val in value.iteritems():
+            for key, val in list(value.items()):
                 if not is_supported(key, filters=filters, iterate=check_all) \
                    or not is_supported(val, filters=filters,
                                        iterate=check_all):
@@ -226,7 +228,7 @@ def globalsfilter(input_dict, check_all=False, filters=None,
                   excluded_names=None):
     """Keep only objects that can be pickled"""
     output_dict = {}
-    for key, value in input_dict.items():
+    for key, value in list(input_dict.items()):
         excluded = (exclude_private and key.startswith('_')) or \
                    (exclude_capitalized and key[0].isupper()) or \
                    (exclude_uppercase and key.isupper()
diff --git a/spyderlib/widgets/editor.py b/spyderlib/widgets/editor.py
index 84244db..11e3457 100644
--- a/spyderlib/widgets/editor.py
+++ b/spyderlib/widgets/editor.py
@@ -11,6 +11,8 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
+from __future__ import print_function
+
 from spyderlib.qt import is_pyqt46
 from spyderlib.qt.QtGui import (QVBoxLayout, QMessageBox, QMenu, QFont,
                                 QAction, QApplication, QWidget, QHBoxLayout,
@@ -45,6 +47,7 @@ from spyderlib.widgets.sourcecode import syntaxhighlighters, codeeditor
 from spyderlib.widgets.sourcecode.base import TextEditBaseWidget  #analysis:ignore
 from spyderlib.widgets.sourcecode.codeeditor import Printer  #analysis:ignore
 from spyderlib.widgets.sourcecode.codeeditor import get_file_language
+from spyderlib.py3compat import to_text_string, qbytearray_to_str, u
 
 
 DEBUG_EDITOR = DEBUG >= 3
@@ -138,16 +141,16 @@ class FileListDialog(QDialog):
                                          else Qt.ElideRight)
         current_row = self.listwidget.currentRow()
         if current_row >= 0:
-            current_text = unicode(self.listwidget.currentItem().text())
+            current_text = to_text_string(self.listwidget.currentItem().text())
         else:
             current_text = ""
         self.listwidget.clear()
         self.indexes = []
         new_current_index = stack_index
-        filter_text = unicode(self.edit.text())
+        filter_text = to_text_string(self.edit.text())
         lw_index = 0
         for index in range(count):
-            text = unicode(self.tabs.tabText(index))
+            text = to_text_string(self.tabs.tabText(index))
             if len(filter_text) == 0 or filter_text in text:
                 if text == current_text:
                     new_current_index = lw_index
@@ -207,12 +210,12 @@ class ThreadManager(QObject):
     def close_threads(self, parent):
         """Close threads associated to parent_id"""
         if DEBUG_EDITOR:
-            print >>STDOUT, "Call to 'close_threads'"
+            print("Call to 'close_threads'", file=STDOUT)
         if parent is None:
             # Closing all threads
             self.pending_threads = []
             threadlist = []
-            for threads in self.started_threads.values():
+            for threads in list(self.started_threads.values()):
                 threadlist += threads
         else:
             parent_id = id(parent)
@@ -222,7 +225,7 @@ class ThreadManager(QObject):
             threadlist = self.started_threads.get(parent_id, [])
         for thread in threadlist:
             if DEBUG_EDITOR:
-                print >>STDOUT, "Waiting for thread %r to finish" % thread
+                print("Waiting for thread %r to finish" % thread, file=STDOUT)
             while thread.isRunning():
                 # We can't terminate thread safely, so we simply wait...
                 QApplication.processEvents()
@@ -230,7 +233,7 @@ class ThreadManager(QObject):
     def close_all_threads(self):
         """Close all threads"""
         if DEBUG_EDITOR:
-            print >>STDOUT, "Call to 'close_all_threads'"
+            print("Call to 'close_all_threads'", file=STDOUT)
         self.close_threads(None)
         
     def add_thread(self, checker, end_callback, source_code, parent):
@@ -240,13 +243,13 @@ class ThreadManager(QObject):
         self.end_callbacks[id(thread)] = end_callback
         self.pending_threads.append((thread, parent_id))
         if DEBUG_EDITOR:
-            print >>STDOUT, "Added thread %r to queue" % thread
+            print("Added thread %r to queue" % thread, file=STDOUT)
         QTimer.singleShot(50, self.update_queue)
     
     def update_queue(self):
         """Update queue"""
         started = 0
-        for parent_id, threadlist in self.started_threads.items():
+        for parent_id, threadlist in list(self.started_threads.items()):
             still_running = []
             for thread in threadlist:
                 if thread.isFinished():
@@ -265,16 +268,16 @@ class ThreadManager(QObject):
             else:
                 self.started_threads.pop(parent_id)
         if DEBUG_EDITOR:
-            print >>STDOUT, "Updating queue:"
-            print >>STDOUT, "    started:", started
-            print >>STDOUT, "    pending:", len(self.pending_threads)
+            print("Updating queue:", file=STDOUT)
+            print("    started:", started, file=STDOUT)
+            print("    pending:", len(self.pending_threads), file=STDOUT)
         if self.pending_threads and started < self.max_simultaneous_threads:
             thread, parent_id = self.pending_threads.pop(0)
             self.connect(thread, SIGNAL('finished()'), self.update_queue)
             threadlist = self.started_threads.get(parent_id, [])
             self.started_threads[parent_id] = threadlist+[thread]
             if DEBUG_EDITOR:
-                print >>STDOUT, "===>starting:", thread
+                print("===>starting:", thread, file=STDOUT)
             thread.start()
 
 
@@ -326,7 +329,7 @@ class FileInfo(QObject):
         
     def trigger_code_completion(self, automatic):
         """Trigger code completion"""
-        source_code = unicode(self.editor.toPlainText())
+        source_code = self.get_source_code()
         offset = self.editor.get_position('cursor')
         text = self.editor.get_text('sol', 'cursor')
         
@@ -369,7 +372,7 @@ class FileInfo(QObject):
         # i.e. the user has just entered an opening parenthesis -- in that 
         # case, we don't want to force the object inspector to be visible, 
         # to avoid polluting the window layout
-        source_code = unicode(self.editor.toPlainText())
+        source_code = self.get_source_code()
         offset = position
         
         helplist = self.rope_project.get_calltip_and_docs(source_code, offset,
@@ -422,7 +425,7 @@ class FileInfo(QObject):
                     
     def go_to_definition(self, position):
         """Go to definition"""
-        source_code = unicode(self.editor.toPlainText())
+        source_code = self.get_source_code()
         offset = position
         fname, lineno = self.rope_project.get_definition_location(source_code,
                                                     offset, self.filename)
@@ -432,7 +435,7 @@ class FileInfo(QObject):
     
     def get_source_code(self):
         """Return associated editor source code"""
-        return unicode(self.editor.toPlainText()).encode('utf-8')
+        return to_text_string(self.editor.toPlainText())
     
     def run_code_analysis(self, run_pyflakes, run_pep8):
         """Run code analysis"""
@@ -442,7 +445,8 @@ class FileInfo(QObject):
         self.pyflakes_results = []
         self.pep8_results = []
         if self.editor.is_python():
-            source_code = self.get_source_code()
+            enc = self.encoding.replace('-guessed', '').replace('-bom', '')
+            source_code = self.get_source_code().encode(enc)
             if run_pyflakes:
                 self.pyflakes_results = None
             if run_pep8:
@@ -1082,12 +1086,12 @@ class EditorStack(QWidget):
         if self.fullpath_sorting_enabled:
             text = filename
         else:
-            text = u"%s — %s"
+            text = u("%s — %s")
         text = self.__modified_readonly_title(text,
                                               is_modified, is_readonly)
         if self.tempfile_path is not None\
            and filename == encoding.to_unicode_from_fs(self.tempfile_path):
-            temp_file_str = unicode(_("Temporary file"))
+            temp_file_str = to_text_string(_("Temporary file"))
             if self.fullpath_sorting_enabled:
                 return "%s (%s)" % (text, temp_file_str)
             else:
@@ -1139,7 +1143,7 @@ class EditorStack(QWidget):
         finfo = self.data[index]
         if osp.splitext(finfo.filename)[1] != osp.splitext(new_filename)[1]:
             # File type has changed!
-            txt = unicode(finfo.editor.get_text_with_eol())
+            txt = to_text_string(finfo.editor.get_text_with_eol())
             language = get_file_language(new_filename, txt)
             finfo.editor.set_language(language)
         set_new_index = index == self.get_stack_index()
@@ -1304,7 +1308,7 @@ class EditorStack(QWidget):
     def save_if_changed(self, cancelable=False, index=None):
         """Ask user to save file if modified"""
         if index is None:
-            indexes = range(self.get_stack_count())
+            indexes = list(range(self.get_stack_count()))
         else:
             indexes = [index]
         buttons = QMessageBox.Yes | QMessageBox.No
@@ -1361,7 +1365,7 @@ class EditorStack(QWidget):
             return self.save_as(index=index)
         if self.always_remove_trailing_spaces:
             self.remove_trailing_spaces(index)
-        txt = unicode(finfo.editor.get_text_with_eol())
+        txt = to_text_string(finfo.editor.get_text_with_eol())
         try:
             finfo.encoding = encoding.write(txt, finfo.filename,
                                             finfo.encoding)
@@ -1390,7 +1394,7 @@ class EditorStack(QWidget):
             
             self._refresh_outlineexplorer(index)
             return True
-        except EnvironmentError, error:
+        except EnvironmentError as error:
             QMessageBox.critical(self, _("Save"),
                                  _("<b>Unable to save script '%s'</b>"
                                    "<br><br>Error message:<br>%s"
@@ -1407,7 +1411,7 @@ class EditorStack(QWidget):
         """
         finfo = self.data[index]
         finfo.newly_created = False
-        finfo.filename = unicode(filename)
+        finfo.filename = to_text_string(filename)
         finfo.lastmodified = QFileInfo(finfo.filename).lastModified()
     
     def select_savename(self, original_filename):
@@ -1508,7 +1512,7 @@ class EditorStack(QWidget):
         if index != -1:
             editor.setFocus()
             if DEBUG_EDITOR:
-                print >>STDOUT, "setfocusto:", editor
+                print("setfocusto:", editor, file=STDOUT)
         else:
             self.emit(SIGNAL('reset_statusbar()'))
         self.emit(SIGNAL('opened_files_list_changed()'))
@@ -1524,8 +1528,8 @@ class EditorStack(QWidget):
             self.stack_history.pop(self.stack_history.index(current_id))
         self.stack_history.append(current_id)
         if DEBUG_EDITOR:
-            print >>STDOUT, "current_changed:", index, self.data[index].editor,
-            print >>STDOUT, self.data[index].editor.get_document_id()
+            print("current_changed:", index, self.data[index].editor, end=' ', file=STDOUT)
+            print(self.data[index].editor.get_document_id(), file=STDOUT)
             
         self.emit(SIGNAL('update_plugin_title()'))
         if editor is not None:
@@ -1650,8 +1654,8 @@ class EditorStack(QWidget):
         else:
             # Else, testing if it has been modified elsewhere:
             lastm = QFileInfo(finfo.filename).lastModified()
-            if unicode(lastm.toString()) \
-               != unicode(finfo.lastmodified.toString()):
+            if to_text_string(lastm.toString()) \
+               != to_text_string(finfo.lastmodified.toString()):
                 if finfo.editor.document().isModified():
                     answer = QMessageBox.question(self,
                                 self.title,
@@ -1860,14 +1864,14 @@ class EditorStack(QWidget):
                 self.inspector.set_object_text(qstr1, ignore_unknown=True,
                                                force_refresh=force)
             else:
-                objtxt = unicode(qstr1)
+                objtxt = to_text_string(qstr1)
                 name = objtxt.split('.')[-1]
-                argspec = unicode(qstr2)
-                note = unicode(qstr3)
-                docstring = unicode(qstr4)
-                text = {'obj_text': objtxt, 'name': name, 'argspec': argspec,
-                        'note': note, 'docstring': docstring}
-                self.inspector.set_rope_doc(text, force_refresh=force)
+                argspec = to_text_string(qstr2)
+                note = to_text_string(qstr3)
+                docstring = to_text_string(qstr4)
+                doc = {'obj_text': objtxt, 'name': name, 'argspec': argspec,
+                       'note': note, 'docstring': docstring}
+                self.inspector.set_rope_doc(doc, force_refresh=force)
             editor = self.get_current_editor()
             editor.setFocus()
     
@@ -1888,7 +1892,7 @@ class EditorStack(QWidget):
         the source code analysis -- the analysis must be done by the editor
         plugin (in case multiple editorstack instances are handled)
         """
-        filename = osp.abspath(unicode(filename))
+        filename = osp.abspath(to_text_string(filename))
         self.emit(SIGNAL('starting_long_process(QString)'),
                   _("Loading %s...") % filename)
         text, enc = encoding.read(filename)
@@ -2025,8 +2029,8 @@ class EditorSplitter(QSplitter):
         
     def editorstack_closed(self):
         if DEBUG_EDITOR:
-            print >>STDOUT, "method 'editorstack_closed':"
-            print >>STDOUT, "    self  :", self
+            print("method 'editorstack_closed':", file=STDOUT)
+            print("    self  :", self, file=STDOUT)
 #            print >>STDOUT, "    sender:", self.sender()
         self.unregister_editorstack_cb(self.editorstack)
         self.editorstack = None
@@ -2044,8 +2048,8 @@ class EditorSplitter(QSplitter):
         
     def editorsplitter_closed(self):
         if DEBUG_EDITOR:
-            print >>STDOUT, "method 'editorsplitter_closed':"
-            print >>STDOUT, "    self  :", self
+            print("method 'editorsplitter_closed':", file=STDOUT)
+            print("    self  :", self, file=STDOUT)
 #            print >>STDOUT, "    sender:", self.sender()
         try:
             close_splitter = self.count() == 1 and self.editorstack is None
@@ -2092,7 +2096,7 @@ class EditorSplitter(QSplitter):
                       for finfo in editorstack.data]
             cfname = editorstack.get_current_filename()
             splitsettings.append((orientation == Qt.Vertical, cfname, clines))
-        return dict(hexstate=str(self.saveState().toHex()),
+        return dict(hexstate=qbytearray_to_str(self.saveState()),
                     sizes=self.sizes(), splitsettings=splitsettings)
     
     def set_layout_settings(self, settings):
@@ -2176,7 +2180,7 @@ class EditorWidget(QSplitter):
     def register_editorstack(self, editorstack):
         self.editorstacks.append(editorstack)
         if DEBUG_EDITOR:
-            print >>STDOUT, "EditorWidget.register_editorstack:", editorstack
+            print("EditorWidget.register_editorstack:", editorstack, file=STDOUT)
             self.__print_editorstacks()
         self.plugin.last_focus_editorstack[self.parent()] = editorstack
         editorstack.set_closable( len(self.editorstacks) > 1 )
@@ -2203,14 +2207,14 @@ class EditorWidget(QSplitter):
         editorstack.add_corner_widgets_to_tabbar([5, oe_btn])
         
     def __print_editorstacks(self):
-        print >>STDOUT, "%d editorstack(s) in editorwidget:" \
-                        % len(self.editorstacks)
+        print("%d editorstack(s) in editorwidget:" \
+                        % len(self.editorstacks), file=STDOUT)
         for edst in self.editorstacks:
-            print >>STDOUT, "    ", edst
+            print("    ", edst, file=STDOUT)
         
     def unregister_editorstack(self, editorstack):
         if DEBUG_EDITOR:
-            print >>STDOUT, "EditorWidget.unregister_editorstack:", editorstack
+            print("EditorWidget.unregister_editorstack:", editorstack, file=STDOUT)
         self.plugin.unregister_editorstack(editorstack)
         self.editorstacks.pop(self.editorstacks.index(editorstack))
         if DEBUG_EDITOR:
@@ -2275,7 +2279,7 @@ class EditorMainWindow(QMainWindow):
             self.emit(SIGNAL('destroyed()'))
             for editorstack in self.editorwidget.editorstacks[:]:
                 if DEBUG_EDITOR:
-                    print >>STDOUT, "--> destroy_editorstack:", editorstack
+                    print("--> destroy_editorstack:", editorstack, file=STDOUT)
                 editorstack.emit(SIGNAL('destroyed()'))
                                 
     def get_layout_settings(self):
@@ -2285,7 +2289,7 @@ class EditorMainWindow(QMainWindow):
                     pos=(self.pos().x(), self.pos().y()),
                     is_maximized=self.isMaximized(),
                     is_fullscreen=self.isFullScreen(),
-                    hexstate=str(self.saveState().toHex()),
+                    hexstate=qbytearray_to_str(self.saveState()),
                     splitsettings=splitsettings)
     
     def set_layout_settings(self, settings):
@@ -2349,7 +2353,7 @@ class EditorPluginExample(QSplitter):
         
     def go_to_file(self, fname, lineno, text):
         editorstack = self.editorstacks[0]
-        editorstack.set_current_filename(unicode(fname))
+        editorstack.set_current_filename(to_text_string(fname))
         editor = editorstack.get_current_editor()
         editor.go_to_line(lineno, word=text)
 
@@ -2357,8 +2361,8 @@ class EditorPluginExample(QSplitter):
         for win in self.editorwindows[:]:
             win.close()
         if DEBUG_EDITOR:
-            print >>STDOUT, len(self.editorwindows), ":", self.editorwindows
-            print >>STDOUT, len(self.editorstacks), ":", self.editorstacks
+            print(len(self.editorwindows), ":", self.editorwindows, file=STDOUT)
+            print(len(self.editorstacks), ":", self.editorstacks, file=STDOUT)
         
         event.accept()
         
@@ -2370,7 +2374,7 @@ class EditorPluginExample(QSplitter):
     
     def register_editorstack(self, editorstack):
         if DEBUG_EDITOR:
-            print >>STDOUT, "FakePlugin.register_editorstack:", editorstack
+            print("FakePlugin.register_editorstack:", editorstack, file=STDOUT)
         self.editorstacks.append(editorstack)
         if self.isAncestorOf(editorstack):
             # editorstack is a child of the Editor plugin
@@ -2403,7 +2407,7 @@ class EditorPluginExample(QSplitter):
                     
     def unregister_editorstack(self, editorstack):
         if DEBUG_EDITOR:
-            print >>STDOUT, "FakePlugin.unregister_editorstack:", editorstack
+            print("FakePlugin.unregister_editorstack:", editorstack, file=STDOUT)
         self.editorstacks.pop(self.editorstacks.index(editorstack))
         
     def clone_editorstack(self, editorstack):
@@ -2426,12 +2430,12 @@ class EditorPluginExample(QSplitter):
         
     def register_editorwindow(self, window):
         if DEBUG_EDITOR:
-            print >>STDOUT, "register_editorwindowQObject*:", window
+            print("register_editorwindowQObject*:", window, file=STDOUT)
         self.editorwindows.append(window)
         
     def unregister_editorwindow(self, window):
         if DEBUG_EDITOR:
-            print >>STDOUT, "unregister_editorwindow:", window
+            print("unregister_editorwindow:", window, file=STDOUT)
         self.editorwindows.pop(self.editorwindows.index(window))
     
     def get_focus_widget(self):
@@ -2481,7 +2485,7 @@ def test():
     test.load("dicteditor.py")
     test.load("sourcecode/codeeditor.py")
     test.load("../spyder.py")
-    print "Elapsed time: %.3f s" % (time.time()-t0)
+    print("Elapsed time: %.3f s" % (time.time()-t0))
     sys.exit(app.exec_())
     
 if __name__ == "__main__":
diff --git a/spyderlib/widgets/editortools.py b/spyderlib/widgets/editortools.py
index 49d97d8..16b70a8 100644
--- a/spyderlib/widgets/editortools.py
+++ b/spyderlib/widgets/editortools.py
@@ -6,6 +6,8 @@
 
 """Editor tools: outline explorer, etc."""
 
+from __future__ import print_function
+
 import re
 import os.path as osp
 
@@ -19,6 +21,7 @@ from spyderlib.baseconfig import _, STDOUT
 from spyderlib.utils.qthelpers import (get_icon, create_action,
                                        create_toolbutton, set_item_user_text)
 from spyderlib.widgets.onecolumntree import OneColumnTree
+from spyderlib.py3compat import to_text_string
 
 
 #===============================================================================
@@ -78,7 +81,8 @@ class TreeItem(QTreeWidgetItem):
                 QTreeWidgetItem.__init__(self, parent, preceding,
                                          QTreeWidgetItem.Type)
         self.setText(0, name)
-        parent_text = from_qvariant(parent.data(0, Qt.UserRole), unicode)
+        parent_text = from_qvariant(parent.data(0, Qt.UserRole),
+                                    to_text_string)
         set_item_user_text(self, parent_text+'/'+name)
         self.line = line
         
@@ -100,7 +104,7 @@ class FunctionItem(TreeItem):
     def setup(self):
         if self.is_method():
             self.setToolTip(0, _("Method defined at line %s") % str(self.line))
-            name = unicode(self.text(0))
+            name = to_text_string(self.text(0))
             if name.startswith('__'):
                 self.set_icon('private2.png')
             elif name.startswith('_'):
@@ -131,7 +135,7 @@ def item_at_line(root_item, line):
 
 def remove_from_tree_cache(tree_cache, line=None, item=None):
     if line is None:
-        for line, (_it, _level, _debug) in tree_cache.iteritems():
+        for line, (_it, _level, _debug) in list(tree_cache.items()):
             if _it is item:
                 break
     item, _level, debug = tree_cache.pop(line)
@@ -142,7 +146,7 @@ def remove_from_tree_cache(tree_cache, line=None, item=None):
     except RuntimeError:
         # Item has already been deleted
         #XXX: remove this debug-related fragment of code
-        print >>STDOUT, "unable to remove tree item: ", debug
+        print("unable to remove tree item: ", debug, file=STDOUT)
 
 class OutlineExplorerTreeWidget(OneColumnTree):
     def __init__(self, parent, show_fullpath=False, fullpath_sorting=True,
@@ -225,7 +229,7 @@ class OutlineExplorerTreeWidget(OneColumnTree):
     def set_current_editor(self, editor, fname, update):
         """Bind editor instance"""
         editor_id = editor.get_document_id()
-        if editor_id in self.editor_ids.values():
+        if editor_id in list(self.editor_ids.values()):
             item = self.editor_items[editor_id]
             if not self.freeze:
                 self.scrollToItem(item)
@@ -256,14 +260,14 @@ class OutlineExplorerTreeWidget(OneColumnTree):
     def file_renamed(self, editor, new_filename):
         """File was renamed, updating outline explorer tree"""
         editor_id = editor.get_document_id()
-        if editor_id in self.editor_ids.values():
+        if editor_id in list(self.editor_ids.values()):
             root_item = self.editor_items[editor_id]
             root_item.set_path(new_filename, fullpath=self.show_fullpath)
             self.__sort_toplevel_items()
         
     def update_all(self):
         self.save_expanded_state()
-        for editor, editor_id in self.editor_ids.iteritems():
+        for editor, editor_id in list(self.editor_ids.items()):
             item = self.editor_items[editor_id]
             tree_cache = self.editor_tree_cache[editor_id]
             self.populate_branch(editor, item, tree_cache)
@@ -274,7 +278,7 @@ class OutlineExplorerTreeWidget(OneColumnTree):
             if self.current_editor is editor:
                 self.current_editor = None
             editor_id = self.editor_ids.pop(editor)
-            if editor_id not in self.editor_ids.values():
+            if editor_id not in list(self.editor_ids.values()):
                 root_item = self.editor_items.pop(editor_id)
                 self.editor_tree_cache.pop(editor_id)
                 try:
@@ -295,7 +299,7 @@ class OutlineExplorerTreeWidget(OneColumnTree):
             tree_cache = {}
         
         # Removing cached items for which line is > total line nb
-        for _l in tree_cache.keys():
+        for _l in list(tree_cache.keys()):
             if _l >= editor.get_line_count():
                 # Checking if key is still in tree cache in case one of its 
                 # ancestors was deleted in the meantime (deleting all children):
@@ -348,7 +352,7 @@ class OutlineExplorerTreeWidget(OneColumnTree):
             parent, _level = ancestors[-1]
             
             if citem is not None:
-                cname = unicode(citem.text(0))
+                cname = to_text_string(citem.text(0))
                 
             preceding = root_item if previous_item is None else previous_item
             if not_class_nor_function:
@@ -385,8 +389,8 @@ class OutlineExplorerTreeWidget(OneColumnTree):
                 
             item.setup()
             debug = "%s -- %s/%s" % (str(item.line).rjust(6),
-                                     unicode(item.parent().text(0)),
-                                     unicode(item.text(0)))
+                                     to_text_string(item.parent().text(0)),
+                                     to_text_string(item.text(0)))
             tree_cache[line_nb] = (item, level, debug)
             previous_level = level
             previous_item = item
@@ -429,10 +433,10 @@ class OutlineExplorerTreeWidget(OneColumnTree):
             self.parent().emit(SIGNAL("edit(QString)"), root_item.path)
         self.freeze = False
         parent = self.current_editor.parent()
-        for editor_id, i_item in self.editor_items.iteritems():
+        for editor_id, i_item in list(self.editor_items.items()):
             if i_item is root_item:
                 #XXX: not working anymore!!!
-                for editor, _id in self.editor_ids.iteritems():
+                for editor, _id in list(self.editor_ids.items()):
                     if _id == editor_id and editor.parent() is parent:
                         self.current_editor = editor
                         break
@@ -470,14 +474,14 @@ class OutlineExplorerWidget(QWidget):
         self.visibility_action.setChecked(True)
         
         btn_layout = QHBoxLayout()
-        btn_layout.setAlignment(Qt.AlignRight)
+        btn_layout.setAlignment(Qt.AlignLeft)
         for btn in self.setup_buttons():
             btn_layout.addWidget(btn)
 
         layout = QVBoxLayout()
         layout.setContentsMargins(0, 0, 0, 0)
-        layout.addWidget(self.treewidget)
         layout.addLayout(btn_layout)
+        layout.addWidget(self.treewidget)
         self.setLayout(layout)
         
     def toggle_visibility(self, state):
diff --git a/spyderlib/widgets/explorer.py b/spyderlib/widgets/explorer.py
index 21b1bb3..11ce848 100644
--- a/spyderlib/widgets/explorer.py
+++ b/spyderlib/widgets/explorer.py
@@ -32,6 +32,7 @@ from spyderlib.utils.qthelpers import (get_icon, create_action, add_actions,
                                        file_uri)
 from spyderlib.utils import misc, encoding, programs, vcs
 from spyderlib.baseconfig import _
+from spyderlib.py3compat import to_text_string, getcwd, str_lower
 
 
 def fixpath(path):
@@ -43,15 +44,15 @@ def fixpath(path):
 def create_script(fname):
     """Create a new Python script"""
     text = os.linesep.join(["# -*- coding: utf-8 -*-", "", ""])
-    encoding.write(unicode(text), fname, 'utf-8')
+    encoding.write(to_text_string(text), fname, 'utf-8')
 
 
 def listdir(path, include='.', exclude=r'\.pyc$|^\.', show_all=False,
             folders_only=False):
     """List files and directories"""
     namelist = []
-    dirlist = [unicode(osp.pardir)]
-    for item in os.listdir(unicode(path)):
+    dirlist = [to_text_string(osp.pardir)]
+    for item in os.listdir(to_text_string(path)):
         if re.search(exclude, item) and not show_all:
             continue
         if osp.isdir(osp.join(path, item)):
@@ -60,8 +61,8 @@ def listdir(path, include='.', exclude=r'\.pyc$|^\.', show_all=False,
             continue
         elif re.search(include, item) or show_all:
             namelist.append(item)
-    return sorted(dirlist, key=unicode.lower) + \
-           sorted(namelist, key=unicode.lower)
+    return sorted(dirlist, key=str_lower) + \
+           sorted(namelist, key=str_lower)
 
 
 def has_subdirectories(path, include, exclude, show_all):
@@ -126,7 +127,7 @@ class DirView(QTreeView):
     def get_filename(self, index):
         """Return filename associated with *index*"""
         if index:
-            return osp.normpath(unicode(self.fsmodel.filePath(index)))
+            return osp.normpath(to_text_string(self.fsmodel.filePath(index)))
         
     def get_index(self, filename):
         """Return index associated with filename"""
@@ -184,7 +185,7 @@ class DirView(QTreeView):
                                               QLineEdit.Normal,
                                               ", ".join(self.name_filters))
         if valid:
-            filters = [f.strip() for f in unicode(filters).split(',')]
+            filters = [f.strip() for f in to_text_string(filters).split(',')]
             self.parent_widget.sig_option_changed.emit('name_filters', filters)
             self.set_name_filters(filters)
             
@@ -261,11 +262,11 @@ class DirView(QTreeView):
             vcs_ci = create_action(self, _("Commit"),
                                    icon="vcs_commit.png",
                                    triggered=lambda fnames=[dirname]:
-                                   self.vcs_command(fnames, tool='commit'))
+                                   self.vcs_command(fnames, 'commit'))
             vcs_log = create_action(self, _("Browse repository"),
                                     icon="vcs_browse.png",
                                     triggered=lambda fnames=[dirname]:
-                                    self.vcs_command(fnames, tool='browse'))
+                                    self.vcs_command(fnames, 'browse'))
             actions += [None, vcs_ci, vcs_log]
         
         return actions
@@ -469,12 +470,12 @@ class DirView(QTreeView):
                 self.parent_widget.emit(SIGNAL("removed_tree(QString)"),
                                         fname)
             return yes_to_all
-        except EnvironmentError, error:
+        except EnvironmentError as error:
             action_str = _('delete')
             QMessageBox.critical(self, _("Project Explorer"),
                             _("<b>Unable to %s <i>%s</i></b>"
                               "<br><br>Error message:<br>%s"
-                              ) % (action_str, fname, unicode(error)))
+                              ) % (action_str, fname, to_text_string(error)))
         return False
         
     def delete(self, fnames=None):
@@ -495,7 +496,7 @@ class DirView(QTreeView):
                               _('New name:'), QLineEdit.Normal,
                               osp.basename(fname))
         if valid:
-            path = osp.join(osp.dirname(fname), unicode(path))
+            path = osp.join(osp.dirname(fname), to_text_string(path))
             if path == fname:
                 return
             if osp.exists(path):
@@ -510,11 +511,11 @@ class DirView(QTreeView):
                 self.parent_widget.emit( \
                      SIGNAL("renamed(QString,QString)"), fname, path)
                 return path
-            except EnvironmentError, error:
+            except EnvironmentError as error:
                 QMessageBox.critical(self, _("Rename"),
                             _("<b>Unable to rename file <i>%s</i></b>"
                               "<br><br>Error message:<br>%s"
-                              ) % (osp.basename(fname), unicode(error)))
+                              ) % (osp.basename(fname), to_text_string(error)))
     
     def rename(self, fnames=None):
         """Rename files"""
@@ -544,11 +545,11 @@ class DirView(QTreeView):
             basename = osp.basename(fname)
             try:
                 misc.move_file(fname, osp.join(folder, basename))
-            except EnvironmentError, error:
+            except EnvironmentError as error:
                 QMessageBox.critical(self, _("Error"),
                                      _("<b>Unable to move <i>%s</i></b>"
                                        "<br><br>Error message:<br>%s"
-                                       ) % (basename, unicode(error)))
+                                       ) % (basename, to_text_string(error)))
         
     def create_new_folder(self, current_path, title, subtitle, is_package):
         """Create new folder"""
@@ -559,27 +560,28 @@ class DirView(QTreeView):
         name, valid = QInputDialog.getText(self, title, subtitle,
                                            QLineEdit.Normal, "")
         if valid:
-            dirname = osp.join(current_path, unicode(name))
+            dirname = osp.join(current_path, to_text_string(name))
             try:
                 os.mkdir(dirname)
-            except EnvironmentError, error:
+            except EnvironmentError as error:
                 QMessageBox.critical(self, title,
                                      _("<b>Unable "
                                        "to create folder <i>%s</i></b>"
                                        "<br><br>Error message:<br>%s"
-                                       ) % (dirname, unicode(error)))
+                                       ) % (dirname, to_text_string(error)))
             finally:
                 if is_package:
                     fname = osp.join(dirname, '__init__.py')
                     try:
-                        file(fname, 'wb').write('#')
+                        open(fname, 'wb').write('#')
                         return dirname
-                    except EnvironmentError, error:
+                    except EnvironmentError as error:
                         QMessageBox.critical(self, title,
                                              _("<b>Unable "
                                                "to create file <i>%s</i></b>"
                                                "<br><br>Error message:<br>%s"
-                                               ) % (fname, unicode(error)))
+                                               ) % (fname,
+                                                    to_text_string(error)))
 
     def new_folder(self, basedir):
         """New folder"""
@@ -607,11 +609,11 @@ class DirView(QTreeView):
             try:
                 create_func(fname)
                 return fname
-            except EnvironmentError, error:
+            except EnvironmentError as error:
                 QMessageBox.critical(self, _("New file"),
                                      _("<b>Unable to create file <i>%s</i>"
                                        "</b><br><br>Error message:<br>%s"
-                                       ) % (fname, unicode(error)))
+                                       ) % (fname, to_text_string(error)))
 
     def new_file(self, basedir):
         """New file"""
@@ -622,7 +624,7 @@ class DirView(QTreeView):
             if osp.splitext(fname)[1] in ('.py', '.pyw', '.ipy'):
                 create_script(fname)
             else:
-                file(fname, 'wb').write('')
+                open(fname, 'wb').write('')
         fname = self.create_new_file(basedir, title, filters, create_func)
         if fname is not None:
             self.open([fname])
@@ -636,15 +638,18 @@ class DirView(QTreeView):
         self.create_new_file(basedir, title, filters, create_func)
         
     #----- VCS actions
-    def vcs_command(self, fnames, tool):
-        """VCS command (Mercurial, git...)"""
+    def vcs_command(self, fnames, action):
+        """VCS action (commit, browse)"""
         try:
             for path in sorted(fnames):
-                vcs.run_vcs_tool(path, tool=tool)
-        except RuntimeError, error:
+                vcs.run_vcs_tool(path, action)
+        except vcs.ActionToolNotFound as error:
+            msg = _("For %s support, please install one of the<br/> "
+                    "following tools:<br/><br/>  %s")\
+                        % (error.vcsname, ', '.join(error.tools))
             QMessageBox.critical(self, _("Error"),
-                                 _("<b>Unable to find external program.</b>"
-                                   "<br><br>%s") % unicode(error))
+                _("""<b>Unable to find external program.</b><br><br>%s""")
+                    % to_text_string(msg))
         
     #----- Settings
     def get_scrollbar_position(self):
@@ -688,7 +693,7 @@ class DirView(QTreeView):
 
     def restore_directory_state(self, fname):
         """Restore directory expanded state"""
-        root = osp.normpath(unicode(fname))
+        root = osp.normpath(to_text_string(fname))
         if not osp.exists(root):
             # Directory has been (re)moved outside Spyder
             return
@@ -708,7 +713,7 @@ class DirView(QTreeView):
         """Follow directories loaded during startup"""
         if self._to_be_loaded is None:
             return
-        path = osp.normpath(unicode(fname))
+        path = osp.normpath(to_text_string(fname))
         if path in self._to_be_loaded:
             self._to_be_loaded.remove(path)
         if self._to_be_loaded is not None and len(self._to_be_loaded) == 0:
@@ -739,8 +744,8 @@ class ProxyModel(QSortFilterProxyModel):
         
     def setup_filter(self, root_path, path_list):
         """Setup proxy model filter parameters"""
-        self.root_path = osp.normpath(unicode(root_path))
-        self.path_list = [osp.normpath(unicode(p)) for p in path_list]
+        self.root_path = osp.normpath(to_text_string(root_path))
+        self.path_list = [osp.normpath(to_text_string(p)) for p in path_list]
         self.invalidateFilter()
 
     def sort(self, column, order=Qt.AscendingOrder):
@@ -752,7 +757,7 @@ class ProxyModel(QSortFilterProxyModel):
         if self.root_path is None:
             return True
         index = self.sourceModel().index(row, 0, parent_index)
-        path = osp.normpath(unicode(self.sourceModel().filePath(index)))
+        path = osp.normpath(to_text_string(self.sourceModel().filePath(index)))
         if self.root_path.startswith(path):
             # This is necessary because parent folders need to be scanned
             return True
@@ -808,7 +813,7 @@ class FilteredDirView(DirView):
         """Return filename from index"""
         if index:
             path = self.fsmodel.filePath(self.proxymodel.mapToSource(index))
-            return osp.normpath(unicode(path))
+            return osp.normpath(to_text_string(path))
 
 
 class ExplorerTreeWidget(DirView):
@@ -875,7 +880,7 @@ class ExplorerTreeWidget(DirView):
         """Refresh widget
         force=False: won't refresh widget if path has not changed"""
         if new_path is None:
-            new_path = os.getcwdu()
+            new_path = getcwd()
         if force_current:
             index = self.set_current_folder(new_path)
             self.expand(index)
@@ -894,7 +899,7 @@ class ExplorerTreeWidget(DirView):
     #---- Files/Directories Actions
     def go_to_parent_directory(self):
         """Go to parent directory"""
-        self.chdir( osp.abspath(osp.join(os.getcwdu(), os.pardir)) )
+        self.chdir( osp.abspath(osp.join(getcwd(), os.pardir)) )
         
     def go_to_previous_directory(self):
         """Back to previous directory"""
@@ -908,14 +913,14 @@ class ExplorerTreeWidget(DirView):
         
     def update_history(self, directory):
         """Update browse history"""
-        directory = osp.abspath(unicode(directory))
+        directory = osp.abspath(to_text_string(directory))
         if directory in self.history:
             self.histindex = self.history.index(directory)
         
     def chdir(self, directory=None, browsing_history=False):
         """Set directory as working directory"""
         if directory is not None:
-            directory = osp.abspath(unicode(directory))
+            directory = osp.abspath(to_text_string(directory))
         if browsing_history:
             directory = self.history[self.histindex]
         elif directory in self.history:
@@ -929,7 +934,7 @@ class ExplorerTreeWidget(DirView):
                (self.history and self.history[-1] != directory):
                 self.history.append(directory)
             self.histindex = len(self.history)-1
-        directory = unicode(directory)
+        directory = to_text_string(directory)
         os.chdir(directory)
         self.parent_widget.emit(SIGNAL("open_dir(QString)"), directory)
         self.refresh(new_path=directory, force_current=True)
@@ -948,7 +953,7 @@ class ExplorerWidget(QWidget):
         self.treewidget = ExplorerTreeWidget(self, show_cd_only=show_cd_only)
         self.treewidget.setup(name_filters=name_filters,
                               valid_types=valid_types, show_all=show_all)
-        self.treewidget.chdir(os.getcwdu())
+        self.treewidget.chdir(getcwd())
         
         toolbar_action = create_action(self, _("Show toolbar"),
                                        toggled=self.toggle_toolbar)
diff --git a/spyderlib/widgets/externalshell/baseshell.py b/spyderlib/widgets/externalshell/baseshell.py
index e6de3a0..4b3592a 100644
--- a/spyderlib/widgets/externalshell/baseshell.py
+++ b/spyderlib/widgets/externalshell/baseshell.py
@@ -19,18 +19,19 @@ from spyderlib.qt.QtGui import (QApplication, QWidget, QVBoxLayout,
                                 QLineEdit, QToolButton)
 from spyderlib.qt.QtCore import (QProcess, SIGNAL, QByteArray, QTimer, Qt,
                                  QTextCodec)
-locale_codec = QTextCodec.codecForLocale()
+LOCALE_CODEC = QTextCodec.codecForLocale()
 
 # Local imports
 from spyderlib.utils.qthelpers import (get_icon, create_toolbutton,
                                        create_action, add_actions)
 from spyderlib.baseconfig import get_conf_path, _
+from spyderlib.py3compat import is_text_string, to_text_string
 
 
 def add_pathlist_to_PYTHONPATH(env, pathlist):
     # PyQt API 1/2 compatibility-related tests:
     assert isinstance(env, list)
-    assert all([isinstance(path, basestring) for path in env])
+    assert all([is_text_string(path) for path in env])
     
     pypath = "PYTHONPATH"
     pathstr = os.pathsep.join(pathlist)
@@ -236,7 +237,7 @@ class ExternalShellBase(QWidget):
                                                 QLineEdit.Normal,
                                                 self.arguments)
         if valid:
-            self.arguments = unicode(arguments)
+            self.arguments = to_text_string(arguments)
         return valid
     
     def create_process(self):
@@ -253,22 +254,22 @@ class ExternalShellBase(QWidget):
 #===============================================================================
 #    Input/Output
 #===============================================================================
-    def transcode(self, bytes):
-        return unicode( locale_codec.toUnicode(bytes.data()) )
+    def transcode(self, qba):
+        return to_text_string( LOCALE_CODEC.toUnicode(qba.data()) )
     
     def get_stdout(self):
         self.process.setReadChannel(QProcess.StandardOutput)
-        bytes = QByteArray()
+        qba = QByteArray()
         while self.process.bytesAvailable():
-            bytes += self.process.readAllStandardOutput()
-        return self.transcode(bytes)
+            qba += self.process.readAllStandardOutput()
+        return self.transcode(qba)
     
     def get_stderr(self):
         self.process.setReadChannel(QProcess.StandardError)
-        bytes = QByteArray()
+        qba = QByteArray()
         while self.process.bytesAvailable():
-            bytes += self.process.readAllStandardError()
-        return self.transcode(bytes)
+            qba += self.process.readAllStandardError()
+        return self.transcode(qba)
     
     def write_output(self):
         self.shell.write(self.get_stdout(), flush=True)
@@ -283,7 +284,7 @@ class ExternalShellBase(QWidget):
         byte_array.append(char)
         self.process.write(byte_array)
         self.process.waitForBytesWritten(-1)
-        self.shell.write(locale_codec.toUnicode(byte_array), flush=True)
+        self.shell.write(LOCALE_CODEC.toUnicode(byte_array), flush=True)
         
     def keyboard_interrupt(self):
         raise NotImplementedError
diff --git a/spyderlib/widgets/externalshell/monitor.py b/spyderlib/widgets/externalshell/monitor.py
index f064e93..fbf3418 100644
--- a/spyderlib/widgets/externalshell/monitor.py
+++ b/spyderlib/widgets/externalshell/monitor.py
@@ -7,11 +7,9 @@
 #      remote views for all consoles...!
 
 import os
-import threading
 import socket
-import thread
 import struct
-import cPickle as pickle
+import threading
 
 # Local imports
 from spyderlib.utils.misc import fix_reference_name
@@ -22,6 +20,8 @@ from spyderlib.utils.bsdsocket import (communicate, read_packet, write_packet,
                                        PACKET_NOT_RECEIVED)
 from spyderlib.utils.module_completion import module_completion
 from spyderlib.baseconfig import get_conf_path, get_supported_types, DEBUG
+from spyderlib.py3compat import getcwd, is_text_string, pickle, _thread
+
 
 SUPPORTED_TYPES = get_supported_types()
 
@@ -48,7 +48,7 @@ def get_remote_data(data, settings, mode, more_excluded_names=None):
         * more_excluded_names: additional excluded names (list)
     """
     from spyderlib.widgets.dicteditorutils import globalsfilter
-    assert mode in SUPPORTED_TYPES.keys()
+    assert mode in list(SUPPORTED_TYPES.keys())
     excluded_names = settings['excluded_names']
     if more_excluded_names is not None:
         excluded_names += more_excluded_names
@@ -71,7 +71,7 @@ def make_remote_view(data, settings, more_excluded_names=None):
     data = get_remote_data(data, settings, mode='editable',
                            more_excluded_names=more_excluded_names)
     remote = {}
-    for key, value in data.iteritems():
+    for key, value in list(data.items()):
         view = value_to_display(value, truncate=settings['truncate'],
                                 minmax=settings['minmax'],
                                 collvalue=settings['collvalue'])
@@ -112,7 +112,7 @@ def monitor_copy_global(sock, orig_name, new_name):
 
 def _getcdlistdir():
     """Return current directory list dir"""
-    return os.listdir(os.getcwdu())
+    return os.listdir(getcwd())
 
 class Monitor(threading.Thread):
     """Monitor server"""
@@ -162,7 +162,7 @@ class Monitor(threading.Thread):
                        "getenv": self.getenv,
                        "setenv": self.setenv,
                        "isdefined": self.isdefined,
-                       "thread": thread,
+                       "thread": _thread,
                        "toggle_inputhook_flag": self.toggle_inputhook_flag,
                        "set_monitor_timeout": self.set_timeout,
                        "set_monitor_auto_refresh": self.set_auto_refresh,
@@ -268,7 +268,7 @@ class Monitor(threading.Thread):
     def get_globals_keys(self):
         """Return globals() keys or globals() and locals() keys if debugging"""
         ns = self.get_current_namespace()
-        return ns.keys()
+        return list(ns.keys())
     
     def isdefined(self, obj, force_import=False):
         """Return True if object is defined in current namespace"""
@@ -334,7 +334,7 @@ class Monitor(threading.Thread):
         where *obj* is the object represented by *text*
         and *valid* is True if object evaluation did not raise any exception
         """
-        assert isinstance(text, (str, unicode))
+        assert is_text_string(text)
         ns = self.get_current_namespace()
         try:
             return eval(text, ns), True
@@ -366,7 +366,7 @@ class Monitor(threading.Thread):
             return obj.__doc__
     
     def get_doc(self, objtxt):
-        """Get object documentation"""
+        """Get object documentation dictionary"""
         obj, valid = self._eval(objtxt)
         if valid:
             return getdoc(obj)
@@ -402,7 +402,7 @@ class Monitor(threading.Thread):
 
     def getcwd(self):
         """Return current working directory"""
-        return os.getcwdu()
+        return getcwd()
     
     def setcwd(self, dirname):
         """Set current working directory"""
@@ -474,13 +474,13 @@ class Monitor(threading.Thread):
         data, error_message = load_func(filename)
         if error_message:
             return error_message
-        for key in data.keys():
-            new_key = fix_reference_name(key, blacklist=glbs.keys())
+        for key in list(data.keys()):
+            new_key = fix_reference_name(key, blacklist=list(glbs.keys()))
             if new_key != key:
                 data[new_key] = data.pop(key)
         try:
             glbs.update(data)
-        except Exception, error:
+        except Exception as error:
             return str(error)
         self.refresh_after_eval = True
         
@@ -580,13 +580,13 @@ class Monitor(threading.Thread):
                         else:
                             write_packet(self.i_request, output,
                                          already_pickled=True)
-                except AttributeError, error:
+                except AttributeError as error:
                     if "'NoneType' object has no attribute" in str(error):
                         # This may happen during interpreter shutdown
                         break
                     else:
                         raise
-                except TypeError, error:
+                except TypeError as error:
                     if "'NoneType' object is not subscriptable" in str(error):
                         # This may happen during interpreter shutdown
                         break
diff --git a/spyderlib/widgets/externalshell/namespacebrowser.py b/spyderlib/widgets/externalshell/namespacebrowser.py
index afb9baa..d46c197 100644
--- a/spyderlib/widgets/externalshell/namespacebrowser.py
+++ b/spyderlib/widgets/externalshell/namespacebrowser.py
@@ -6,7 +6,6 @@
 
 """Namespace browser widget"""
 
-import os
 import os.path as osp
 import socket
 
@@ -32,6 +31,8 @@ from spyderlib.utils.qthelpers import (get_icon, create_toolbutton,
 from spyderlib.utils.iofuncs import iofunctions
 from spyderlib.widgets.importwizard import ImportWizard
 from spyderlib.baseconfig import _, get_supported_types
+from spyderlib.py3compat import is_text_string, to_text_string, getcwd
+
 
 SUPPORTED_TYPES = get_supported_types()
 
@@ -44,6 +45,7 @@ class NamespaceBrowser(QWidget):
         
         self.shellwidget = None
         self.is_internal_shell = None
+        self.ipyclient = None
         self.is_ipykernel = None
         
         self.is_visible = True # Do not modify: light mode won't work!
@@ -158,12 +160,13 @@ class NamespaceBrowser(QWidget):
         from spyderlib.widgets import internalshell
         self.is_internal_shell = isinstance(self.shellwidget,
                                             internalshell.InternalShell)
-        try:
-            self.is_ipykernel = self.shellwidget.is_ipykernel
-        except AttributeError:
-            pass
+        self.is_ipykernel = self.shellwidget.is_ipykernel
         if not self.is_internal_shell:
             shellwidget.set_namespacebrowser(self)
+    
+    def set_ipyclient(self, ipyclient):
+        """Bind ipyclient instance to namespace browser"""
+        self.ipyclient = ipyclient
         
     def setup_toolbar(self, exclude_private, exclude_uppercase,
                       exclude_capitalized, exclude_unsupported, autorefresh):
@@ -249,7 +252,7 @@ class NamespaceBrowser(QWidget):
 
     def option_changed(self, option, value):
         """Option has changed"""
-        setattr(self, unicode(option), value)
+        setattr(self, to_text_string(option), value)
         if not self.is_internal_shell:
             settings = self.get_view_settings()
             communicate(self._get_sock(),
@@ -280,7 +283,7 @@ class NamespaceBrowser(QWidget):
               (dict, list, tuple)
             * mode (string): 'editable' or 'picklable'
         """
-        assert mode in SUPPORTED_TYPES.keys()
+        assert mode in list(SUPPORTED_TYPES.keys())
         if check_all is None:
             check_all = self.check_all
         def wsfilter(input_dict, check_all=check_all,
@@ -335,7 +338,8 @@ class NamespaceBrowser(QWidget):
         if value is None:
             if communicate(self._get_sock(), '%s is not None' % name):
                 import pickle
-                msg = unicode(_("Object <b>%s</b> is not picklable") % name)
+                msg = to_text_string(_("Object <b>%s</b> is not picklable")
+                                     % name)
                 raise pickle.PicklingError(msg)
         return value
         
@@ -387,18 +391,28 @@ class NamespaceBrowser(QWidget):
                   "__items__ = getattr(spyderlib.pyplot, '%s')(%s); "\
                   "spyderlib.pyplot.show(); "\
                   "del __fig__, __items__;" % (funcname, name)
-        self.shellwidget.send_to_process(command)
+        if self.is_ipykernel:
+            self.ipyclient.ipywidget.execute("%%varexp --%s %s" % (funcname,
+                                                                   name))
+        else:
+            self.shellwidget.send_to_process(command)
         
     def imshow(self, name):
         command = "import spyderlib.pyplot; " \
                   "__fig__ = spyderlib.pyplot.figure(); " \
                   "__items__ = spyderlib.pyplot.imshow(%s); " \
                   "spyderlib.pyplot.show(); del __fig__, __items__;" % name
-        self.shellwidget.send_to_process(command)
+        if self.is_ipykernel:
+            self.ipyclient.ipywidget.execute("%%varexp --imshow %s" % name)
+        else:
+            self.shellwidget.send_to_process(command)
         
     def show_image(self, name):
         command = "%s.show()" % name
-        self.shellwidget.send_to_process(command)
+        if self.is_ipykernel:
+            self.ipyclient.ipywidget.execute(command)
+        else:
+            self.shellwidget.send_to_process(command)
         
     def oedit(self, name):
         command = "from spyderlib.widgets.objecteditor import oedit; " \
@@ -421,20 +435,20 @@ class NamespaceBrowser(QWidget):
         title = _("Import data")
         if filenames is None:
             if self.filename is None:
-                basedir = os.getcwdu()
+                basedir = getcwd()
             else:
                 basedir = osp.dirname(self.filename)
             filenames, _selfilter = getopenfilenames(self, title, basedir,
                                                      iofunctions.load_filters)
             if not filenames:
                 return
-        elif isinstance(filenames, basestring):
+        elif is_text_string(filenames):
             filenames = [filenames]
 
             
         for filename in filenames:
             
-            self.filename = unicode(filename)
+            self.filename = to_text_string(filename)
             ext = osp.splitext(self.filename)[1].lower()
             
             if ext not in iofunctions.load_funcs:
@@ -446,19 +460,19 @@ class NamespaceBrowser(QWidget):
                               ) % ext, buttons)
                 if answer == QMessageBox.Cancel:
                     return
-                formats = iofunctions.load_extensions.keys()
+                formats = list(iofunctions.load_extensions.keys())
                 item, ok = QInputDialog.getItem(self, title,
                                                 _('Open file as:'),
                                                 formats, 0, False)
                 if ok:
-                    ext = iofunctions.load_extensions[unicode(item)]
+                    ext = iofunctions.load_extensions[to_text_string(item)]
                 else:
                     return
 
             load_func = iofunctions.load_funcs[ext]
                 
             # 'import_wizard' (self.setup_io)
-            if isinstance(load_func, basestring):
+            if is_text_string(load_func):
                 # Import data with import wizard
                 error_message = None
                 try:
@@ -473,7 +487,7 @@ class NamespaceBrowser(QWidget):
                             var_name, clip_data = editor.get_data()
                             monitor_set_global(self._get_sock(),
                                                var_name, clip_data)
-                except Exception, error:
+                except Exception as error:
                     error_message = str(error)
             else:
                 QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
@@ -481,9 +495,9 @@ class NamespaceBrowser(QWidget):
                 if self.is_internal_shell:
                     namespace, error_message = load_func(self.filename)
                     interpreter = self.shellwidget.interpreter
-                    for key in namespace.keys():
+                    for key in list(namespace.keys()):
                         new_key = fix_reference_name(key,
-                                     blacklist=interpreter.namespace.keys())
+                                     blacklist=list(interpreter.namespace.keys()))
                         if new_key != key:
                             namespace[new_key] = namespace.pop(key)
                     if error_message is None:
@@ -507,7 +521,7 @@ class NamespaceBrowser(QWidget):
         if filename is None:
             filename = self.filename
             if filename is None:
-                filename = os.getcwdu()
+                filename = getcwd()
             filename, _selfilter = getsavefilename(self, _("Save data"),
                                                    filename,
                                                    iofunctions.save_filters)
diff --git a/spyderlib/widgets/externalshell/osx_app_site.py b/spyderlib/widgets/externalshell/osx_app_site.py
index 9c0f7e9..5c54f3d 100644
--- a/spyderlib/widgets/externalshell/osx_app_site.py
+++ b/spyderlib/widgets/externalshell/osx_app_site.py
@@ -10,7 +10,11 @@
 
 import sys
 import os
-import __builtin__
+try:
+    import __builtin__ as builtins
+except ImportError:
+    # Python 3
+    import builtins
 
 # for distutils.commands.install
 # These values are initialized by the getuserbase() and getusersitepackages()
@@ -46,7 +50,6 @@ def getusersitepackages():
         return USER_SITE
 
     from sysconfig import get_path
-    import os
 
     if sys.platform == 'darwin':
         from sysconfig import get_config_var
@@ -79,7 +82,7 @@ class _Printer(object):
             for filename in self.__files:
                 filename = os.path.join(dir, filename)
                 try:
-                    fp = file(filename, "rU")
+                    fp = open(filename, "rU")
                     data = fp.read()
                     fp.close()
                     break
@@ -106,32 +109,36 @@ class _Printer(object):
         while 1:
             try:
                 for i in range(lineno, lineno + self.MAXLINES):
-                    print self.__lines[i]
+                    print(self.__lines[i])
             except IndexError:
                 break
             else:
                 lineno += self.MAXLINES
                 key = None
                 while key is None:
-                    key = raw_input(prompt)
+                    try:
+                        key = raw_input(prompt)
+                    except NameError:
+                        # Python 3
+                        key = input(prompt)
                     if key not in ('', 'q'):
                         key = None
                 if key == 'q':
                     break
 
 def setcopyright():
-    """Set 'copyright' and 'credits' in __builtin__"""
-    __builtin__.copyright = _Printer("copyright", sys.copyright)
+    """Set 'copyright' and 'credits' in builtins"""
+    builtins.copyright = _Printer("copyright", sys.copyright)
     if sys.platform[:4] == 'java':
-        __builtin__.credits = _Printer(
+        builtins.credits = _Printer(
             "credits",
             "Jython is maintained by the Jython developers (www.jython.org).")
     else:
-        __builtin__.credits = _Printer("credits", """\
+        builtins.credits = _Printer("credits", """\
     Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
     for supporting Python development.  See www.python.org for more information.""")
     here = os.path.dirname(os.__file__)
-    __builtin__.license = _Printer(
+    builtins.license = _Printer(
         "license", "See http://www.python.org/%.3s/license.html" % sys.version,
         ["LICENSE.txt", "LICENSE"],
         [os.path.join(here, os.pardir), here, os.curdir])
@@ -151,4 +158,4 @@ class _Helper(object):
         return pydoc.help(*args, **kwds)
 
 def sethelper():
-    __builtin__.help = _Helper()
+    builtins.help = _Helper()
diff --git a/spyderlib/widgets/externalshell/pythonshell.py b/spyderlib/widgets/externalshell/pythonshell.py
index 1fd1cc7..dce5d43 100644
--- a/spyderlib/widgets/externalshell/pythonshell.py
+++ b/spyderlib/widgets/externalshell/pythonshell.py
@@ -13,7 +13,7 @@ import socket
 
 from spyderlib.qt.QtGui import QApplication, QMessageBox, QSplitter, QMenu
 from spyderlib.qt.QtCore import QProcess, SIGNAL, Qt, QTextCodec
-locale_codec = QTextCodec.codecForLocale()
+LOCALE_CODEC = QTextCodec.codecForLocale()
 from spyderlib.qt.compat import getexistingdirectory
 
 # Local imports
@@ -26,10 +26,11 @@ from spyderlib.utils.misc import get_python_executable
 from spyderlib.baseconfig import _, get_module_source_path, DEBUG
 from spyderlib.widgets.shell import PythonShellWidget
 from spyderlib.widgets.externalshell.namespacebrowser import NamespaceBrowser
-from spyderlib.widgets.externalshell.monitor import communicate, write_packet
+from spyderlib.utils.bsdsocket import communicate, write_packet
 from spyderlib.widgets.externalshell.baseshell import (ExternalShellBase,
                                                    add_pathlist_to_PYTHONPATH)
 from spyderlib.widgets.dicteditor import DictEditor
+from spyderlib.py3compat import is_text_string, to_text_string
 
 
 class ExtPythonShellWidget(PythonShellWidget):
@@ -107,7 +108,7 @@ class ExtPythonShellWidget(PythonShellWidget):
         return self.ask_monitor("__get__doc____('%s')" % objtxt)
     
     def get_doc(self, objtxt):
-        """Get object documentation"""
+        """Get object documentation dictionary"""
         return self.ask_monitor("__get_doc__('%s')" % objtxt)
     
     def get_source(self, objtxt):
@@ -199,7 +200,7 @@ class ExternalPythonShell(ExternalShellBase):
         self.notification_thread = None
         
         ExternalShellBase.__init__(self, parent=parent, fname=fname, wdir=wdir,
-                                   history_filename='.history.py',
+                                   history_filename='history.py',
                                    light_background=light_background,
                                    menu_actions=menu_actions,
                                    show_buttons_inside=show_buttons_inside,
@@ -210,10 +211,10 @@ class ExternalPythonShell(ExternalShellBase):
 
         self.python_args = None
         if python_args:
-            assert isinstance(python_args, basestring)
+            assert is_text_string(python_args)
             self.python_args = python_args
         
-        assert isinstance(arguments, basestring)
+        assert is_text_string(arguments)
         self.arguments = arguments
         
         self.connection_file = None
@@ -402,8 +403,8 @@ The process may not exit as a result of clicking this button
                                   self.debug_action.isChecked(),
                                   self.arguments)
         
-        env = [unicode(_path) for _path in self.process.systemEnvironment()]
-
+        env = [to_text_string(_path)
+               for _path in self.process.systemEnvironment()]
         if self.pythonstartup:
             env.append('PYTHONSTARTUP=%s' % self.pythonstartup)
         
@@ -517,16 +518,23 @@ The process may not exit as a result of clicking this button
         running = self.process.waitForStarted(3000)
         self.set_running_state(running)
         if not running:
-            QMessageBox.critical(self, _("Error"),
-                             _("A Python or IPython Console failed to start!"))
+            if self.is_ipykernel:
+                self.emit(SIGNAL("ipython_kernel_start_error(QString)"),
+                          _("The console failed to start! Please close it "
+                            "and open a new one."))
+            else:
+                QMessageBox.critical(self, _("Error"),
+                                     _("A Python console failed to start!"))
         else:
             self.shell.setFocus()
             self.emit(SIGNAL('started()'))
-            
         return self.process
 
     def finished(self, exit_code, exit_status):
         """Reimplement ExternalShellBase method"""
+        if self.is_ipykernel and exit_code == 1:
+            self.emit(SIGNAL("ipython_kernel_start_error(QString)"),
+                      self.shell.get_text_with_eol())
         ExternalShellBase.finished(self, exit_code, exit_status)
         self.introspection_socket = None
 
@@ -548,8 +556,8 @@ The process may not exit as a result of clicking this button
         if not self.is_running():
             return
             
-        if not isinstance(text, basestring):
-            text = unicode(text)
+        if not is_text_string(text):
+            text = to_text_string(text)
         if self.install_qt_inputhook and self.introspection_socket is not None:
             communicate(self.introspection_socket,
                         "toggle_inputhook_flag(True)")
@@ -560,7 +568,7 @@ The process may not exit as a result of clicking this button
             text = 'evalsc(r"%s")\n' % text
         if not text.endswith('\n'):
             text += '\n'
-        self.process.write(locale_codec.fromUnicode(text))
+        self.process.write(LOCALE_CODEC.fromUnicode(text))
         self.process.waitForBytesWritten(-1)
         
         # Eventually write prompt faster (when hitting Enter continuously)
diff --git a/spyderlib/widgets/externalshell/sitecustomize.py b/spyderlib/widgets/externalshell/sitecustomize.py
index d756dff..b153c60 100644
--- a/spyderlib/widgets/externalshell/sitecustomize.py
+++ b/spyderlib/widgets/externalshell/sitecustomize.py
@@ -6,7 +6,45 @@ import os
 import os.path as osp
 import pdb
 import bdb
-import __builtin__
+
+
+# sys.argv can be missing when Python is embedded, taking care of it.
+# Fixes Issue 1473 and other crazy crashes with IPython 0.13 trying to
+# access it.
+if not hasattr(sys, 'argv'):
+    sys.argv = ['']
+
+#==============================================================================
+# Important Note:
+#
+# We avoid importing spyderlib here, so we are handling Python 3 compatiblity
+# by hand.
+#==============================================================================
+def _print(*objects, **options):
+    end = options.get('end', '\n')
+    file = options.get('file', sys.stdout)
+    sep = options.get('sep', ' ')
+    string = sep.join([str(obj) for obj in objects])
+    if sys.version[0] == '3':
+        # Python 3
+        local_dict = {}
+        exec('printf = print', local_dict) # to avoid syntax error in Python 2
+        local_dict['printf'](string, file=file, end=end, sep=sep)
+    else:
+        # Python 2
+        if end:
+            print >>file, string
+        else:
+            print >>file, string,
+
+try:
+    import __builtin__ as builtins
+except ImportError:
+    # Python 3
+    import builtins
+    basestring = (str,)
+    def execfile(filename, namespace):
+        exec(compile(open(filename).read(), filename, 'exec'), namespace)
 
 
 # Colorization of sys.stderr (standard Python interpreter)
@@ -100,8 +138,7 @@ if sys.platform == 'darwin' and 'Spyder.app' in __file__:
         # Add a minimal library (with spyderlib) at the end of sys.path to
         # be able to connect our monitor to the external console
         app_pythonpath = 'Spyder.app/Contents/Resources/lib/python2.7'
-        full_pythonpath = filter(lambda p: p.endswith(app_pythonpath),
-                                 sys.path)
+        full_pythonpath = [p for p in sys.path if p.endswith(app_pythonpath)]
         if full_pythonpath:
             sys.path.remove(full_pythonpath[0])
             sys.path.append(full_pythonpath[0] + osp.sep + 'minimal-lib')
@@ -141,7 +178,7 @@ if os.environ.get("MATPLOTLIB_PATCH", "").lower() == "true":
 
 
 # Set standard outputs encoding:
-# (otherwise, for example, print u"é" will fail)
+# (otherwise, for example, print("é") will fail)
 encoding = None
 try:
     import locale
@@ -155,8 +192,12 @@ else:
 if encoding is None:
     encoding = "UTF-8"
 
-sys.setdefaultencoding(encoding)
-os.environ['SPYDER_ENCODING'] = encoding
+try:
+    sys.setdefaultencoding(encoding)
+    os.environ['SPYDER_ENCODING'] = encoding
+except AttributeError:
+    # Python 3
+    pass
     
 try:
     import sitecustomize  #analysis:ignore
@@ -192,16 +233,16 @@ else:
             try:
                 source = source.__file__
             except AttributeError:
-                print >>sys.stderr, "The argument must be either a string"\
-                                    "or a module object"
+                raise ValueError("source argument must be either "
+                                 "a string or a module object")
         if source.endswith('.pyc'):
             source = source[:-1]
         source = osp.abspath(source)
         if osp.exists(source):
             monitor.notify_open_file(source, lineno=lineno)
         else:
-            print >>sys.stderr, "Can't open file %s" % source
-    __builtin__.open_in_spyder = open_in_spyder
+            _print("Can't open file %s" % source, file=sys.stderr)
+    builtins.open_in_spyder = open_in_spyder
     
     # * PyQt4:
     #   * Removing PyQt4 input hook which is not working well on Windows since 
@@ -325,7 +366,7 @@ class SpyderPdb(pdb.Pdb):
         if CONF.get('run', 'breakpoints/enabled', True):
             breakpoints = CONF.get('run', 'breakpoints', {})
             i = 0
-            for fname, data in breakpoints.iteritems():
+            for fname, data in list(breakpoints.items()):
                 for linenumber, condition in data:
                     i += 1
                     self.set_break(self.canonic(fname), linenumber,
@@ -364,7 +405,7 @@ def monkeypatch_method(cls, patch_name):
         if old_func is not None:
             # Add the old func to a list of old funcs.
             old_ref = "_old_%s_%s" % (patch_name, fname)
-            #print old_ref, old_func
+            #print(old_ref, old_func)
             old_attr = getattr(cls, old_ref, None)
             if old_attr is None:
                 setattr(cls, old_ref, old_func)
@@ -429,8 +470,8 @@ if os.environ.get("IGNORE_SIP_SETAPI_ERRORS", "").lower() == "true":
         def patched_setapi(name, no):
             try:
                 original_setapi(name, no)
-            except ValueError, msg:
-                print >>sys.stderr, "Warning/PyQt4-Spyder (%s)" % str(msg)
+            except ValueError as msg:
+                _print("Warning/PyQt4-Spyder (%s)" % str(msg), file=sys.stderr)
         sip.setapi = patched_setapi
     except ImportError:
         pass
@@ -453,7 +494,7 @@ class UserModuleDeleter(object):
         if pathlist is None:
             pathlist = []
         self.pathlist = pathlist
-        self.previous_modules = sys.modules.keys()
+        self.previous_modules = list(sys.modules.keys())
 
     def is_module_blacklisted(self, modname, modpath):
         for path in [sys.prefix]+self.pathlist:
@@ -471,7 +512,7 @@ class UserModuleDeleter(object):
         Do not del C modules
         """
         log = []
-        for modname, module in sys.modules.items():
+        for modname, module in list(sys.modules.items()):
             if modname not in self.previous_modules:
                 modpath = getattr(module, '__file__', None)
                 if modpath is None:
@@ -483,8 +524,8 @@ class UserModuleDeleter(object):
                     log.append(modname)
                     del sys.modules[modname]
         if verbose and log:
-            print "\x1b[4;33m%s\x1b[24m%s\x1b[0m"\
-                  % ("UMD has deleted", ": "+", ".join(log))
+            _print("\x1b[4;33m%s\x1b[24m%s\x1b[0m"\
+                   % ("UMD has deleted", ": "+", ".join(log)))
 
 __umd__ = None
 
@@ -510,7 +551,9 @@ def runfile(filename, args=None, wdir=None, namespace=None):
     """
     try:
         filename = filename.decode('utf-8')
-    except (UnicodeError, TypeError):
+    except (UnicodeError, TypeError, AttributeError):
+        # UnicodeError, TypeError --> eventually raised in Python 2
+        # AttributeError --> systematically raised in Python 3
         pass
     global __umd__
     if os.environ.get("UMD_ENABLED", "").lower() == "true":
@@ -534,14 +577,16 @@ def runfile(filename, args=None, wdir=None, namespace=None):
     if wdir is not None:
         try:
             wdir = wdir.decode('utf-8')
-        except (UnicodeError, TypeError):
+        except (UnicodeError, TypeError, AttributeError):
+            # UnicodeError, TypeError --> eventually raised in Python 2
+            # AttributeError --> systematically raised in Python 3
             pass
         os.chdir(wdir)
     execfile(filename, namespace)
     sys.argv = ['']
     namespace.pop('__file__')
     
-__builtin__.runfile = runfile
+builtins.runfile = runfile
 
 
 def debugfile(filename, args=None, wdir=None):
@@ -559,7 +604,7 @@ def debugfile(filename, args=None, wdir=None):
         filename = filename.replace('\\', '/')
     debugger.run("runfile(%r, args=%r, wdir=%r)" % (filename, args, wdir))
 
-__builtin__.debugfile = debugfile
+builtins.debugfile = debugfile
 
 
 def evalsc(command):
@@ -575,7 +620,7 @@ def evalsc(command):
         else:
             from subprocess import Popen, PIPE
             Popen(command, shell=True, stdin=PIPE)
-            print '\n'
+            _print('\n')
     else:
         # General command
         namespace = _get_globals()
@@ -592,7 +637,10 @@ def evalsc(command):
                 except KeyError:
                     pass
         elif command in ('cd', 'pwd'):
-            print os.getcwdu()
+            try:
+                _print(os.getcwdu())
+            except AttributeError:
+                _print(os.getcwd())
         elif command == 'ls':
             if os.name == 'nt':
                 evalsc('!dir')
@@ -604,7 +652,7 @@ def evalsc(command):
         else:
             raise NotImplementedError("Unsupported command: '%s'" % command)
 
-__builtin__.evalsc = evalsc
+builtins.evalsc = evalsc
 
 
 # Restoring original PYTHONPATH
diff --git a/spyderlib/widgets/externalshell/start_ipython_kernel.py b/spyderlib/widgets/externalshell/start_ipython_kernel.py
index be301e8..d803e38 100644
--- a/spyderlib/widgets/externalshell/start_ipython_kernel.py
+++ b/spyderlib/widgets/externalshell/start_ipython_kernel.py
@@ -103,8 +103,7 @@ def kernel_config():
     # Run lines of code at startup
     run_lines_o = CONF.get('ipython_console', 'startup/run_lines')
     if run_lines_o:
-        spy_cfg.IPKernelApp.exec_lines = map(lambda x: x.strip(),
-                                         run_lines_o.split(','))
+        spy_cfg.IPKernelApp.exec_lines = [x.strip() for x in run_lines_o.split(',')]
     
     # Run a file at startup
     use_file_o = CONF.get('ipython_console', 'startup/use_run_file')
@@ -148,6 +147,20 @@ def change_edit_magic(shell):
     except:
         pass
 
+def varexp(line):
+    """
+    Spyder's variable explorer magic
+    
+    Used to generate plots, histograms and images of the variables displayed
+    on it.
+    """
+    ip = get_ipython()       #analysis:ignore
+    funcname, name = line.split()
+    import spyderlib.pyplot
+    __fig__ = spyderlib.pyplot.figure();
+    __items__ = getattr(spyderlib.pyplot, funcname[2:])(ip.user_ns[name])
+    spyderlib.pyplot.show()
+    del __fig__, __items__
 
 # Remove this module's path from sys.path:
 try:
@@ -166,7 +179,7 @@ sys.path.insert(0, '')
 # Fire up the kernel instance.
 try:
     from IPython.kernel.zmq.kernelapp import IPKernelApp  # 1.0
-except ImportError:
+except:
     from IPython.zmq.ipkernel import IPKernelApp  # 0.13  (analysis:ignore)
 
 ipk_temp = IPKernelApp.instance()
@@ -187,6 +200,7 @@ del ipk_temp
 # NOTE: Leave this and other magic modifications *after* setting
 # __ipythonkernel__ to not have problems while starting kernels
 change_edit_magic(__ipythonshell__)
+__ipythonshell__.register_magic_function(varexp)
 
 # To make %pylab load numpy and pylab even if the user has
 # set autoload_pylab_o to False *but* nevertheless use it in
diff --git a/spyderlib/widgets/externalshell/systemshell.py b/spyderlib/widgets/externalshell/systemshell.py
index d65eaa4..036e25b 100644
--- a/spyderlib/widgets/externalshell/systemshell.py
+++ b/spyderlib/widgets/externalshell/systemshell.py
@@ -10,16 +10,17 @@ import os
 
 from spyderlib.qt.QtGui import QMessageBox
 from spyderlib.qt.QtCore import QProcess, SIGNAL, QTextCodec
-locale_codec = QTextCodec.codecForLocale()
+LOCALE_CODEC = QTextCodec.codecForLocale()
+CP850_CODEC = QTextCodec.codecForName('cp850')
 
 # Local imports
-from spyderlib.utils import encoding
 from spyderlib.utils.programs import shell_split
 from spyderlib.baseconfig import _
 from spyderlib.utils.qthelpers import get_icon
 from spyderlib.widgets.externalshell.baseshell import (ExternalShellBase,
                                                    add_pathlist_to_PYTHONPATH)
 from spyderlib.widgets.shell import TerminalWidget
+from spyderlib.py3compat import to_text_string, is_text_string
 
 
 class ExternalSystemShell(ExternalShellBase):
@@ -53,7 +54,8 @@ class ExternalSystemShell(ExternalShellBase):
         self.process.setProcessChannelMode(QProcess.MergedChannels)
         
         # PYTHONPATH (in case we use Python in this terminal, e.g. py2exe)
-        env = [unicode(_path) for _path in self.process.systemEnvironment()]
+        env = [to_text_string(_path)
+               for _path in self.process.systemEnvironment()]
         add_pathlist_to_PYTHONPATH(env, self.path)
         self.process.setEnvironment(env)
         
@@ -83,7 +85,7 @@ class ExternalSystemShell(ExternalShellBase):
         else:
             # Using bash:
             self.process.start('bash', p_args)
-            self.send_to_process("""PS1="\u@\h:\w> "\n""")
+            self.send_to_process(r"""PS1="\u@\h:\w> "\n""")
             
         running = self.process.waitForStarted()
         self.set_running_state(running)
@@ -99,15 +101,15 @@ class ExternalSystemShell(ExternalShellBase):
 #===============================================================================
 #    Input/Output
 #===============================================================================
-    def transcode(self, bytes):
+    def transcode(self, qba):
         if os.name == 'nt':
-            return encoding.transcode(str(bytes.data()), 'cp850')
+            return to_text_string( CP850_CODEC.toUnicode(qba.data()) )
         else:
-            return ExternalShellBase.transcode(self, bytes)
+            return ExternalShellBase.transcode(self, qba)
     
     def send_to_process(self, text):
-        if not isinstance(text, basestring):
-            text = unicode(text)
+        if not is_text_string(text):
+            text = to_text_string(text)
         if text[:-1] in ["clear", "cls", "CLS"]:
             self.shell.clear()
             self.send_to_process(os.linesep)
@@ -117,7 +119,7 @@ class ExternalSystemShell(ExternalShellBase):
         if os.name == 'nt':
             self.process.write(text.encode('cp850'))
         else:
-            self.process.write(locale_codec.fromUnicode(text))
+            self.process.write(LOCALE_CODEC.fromUnicode(text))
         self.process.waitForBytesWritten(-1)
         
     def keyboard_interrupt(self):
diff --git a/spyderlib/widgets/figureoptions.py b/spyderlib/widgets/figureoptions.py
index 94a4877..795975c 100644
--- a/spyderlib/widgets/figureoptions.py
+++ b/spyderlib/widgets/figureoptions.py
@@ -13,8 +13,8 @@ import matplotlib.cm, matplotlib.image
 from matplotlib.colors import rgb2hex, is_color_like
 
 
-COLORMAPS = matplotlib.cm.datad.keys()
-INTERPOLATIONS = matplotlib.image.AxesImage._interpd.keys()
+COLORMAPS = list(matplotlib.cm.datad.keys())
+INTERPOLATIONS = list(matplotlib.image.AxesImage._interpd.keys())
 
 LINESTYLES = {
               '-': 'solid "-"',
@@ -33,17 +33,17 @@ LINESTYLES2 = {
               }
               
 LEG_locs  =  {
-             0  : 'best         0',
-             1  : 'upper right  1',
-             2  : 'upper left   2',
-             3  : 'lower left   3',
-             4  : 'lower right  4',
-             5  : 'right        5',
-             6  : 'center left  6',
-             7  : 'center right 7',
-             8  : 'lower center 8',
-             9  : 'upper center 9',
-             10 : 'center      10',
+             0: 'best         0',
+             1: 'upper right  1',
+             2: 'upper left   2',
+             3: 'lower left   3',
+             4: 'lower right  4',
+             5: 'right        5',
+             6: 'center left  6',
+             7: 'center right 7',
+             8: 'lower center 8',
+             9: 'upper center 9',
+             10: 'center      10',
              }
 MARKERS = {
            'none': 'None',
@@ -103,7 +103,7 @@ def figure_edit(axes, parent=None):
                ((0, 0), 'None'), ((1, 0), 'X only'), ((0, 1), 'Y only'), ((1, 1), 'All')]),
                ('Equal', axes.get_aspect()=='equal'),
                ('Legend', has_legend),
-               ('Loc', [loc] + LEG_locs.items()),
+               ('Loc', [loc] + list(LEG_locs.items())),
                sep,
                (None, "<b>X-Axis</b>"),
                ('Min', xmin), ('Max', xmax),
@@ -130,7 +130,7 @@ def figure_edit(axes, parent=None):
             linedict[label] = line
         curves = []
         linestyles = sorted(LINESTYLES.items())
-        markers = sorted(MARKERS.items(), key=lambda (k,v): (v,k))
+        markers = sorted(list(MARKERS.items()), key=lambda (k, v): (v, k))
         curvelabels = sorted(linedict.keys())
         for label in curvelabels:
             line = linedict[label]
@@ -162,8 +162,8 @@ def figure_edit(axes, parent=None):
                 continue
             imagedict[label] = image
         images = []
-        interpolations = zip(INTERPOLATIONS, INTERPOLATIONS)
-        colormaps = zip(COLORMAPS, COLORMAPS)
+        interpolations = list(zip(INTERPOLATIONS, INTERPOLATIONS))
+        colormaps = list(zip(COLORMAPS, COLORMAPS))
         imagelabels = sorted(imagedict.keys())
         for label in imagelabels:
             image = imagedict[label]
diff --git a/spyderlib/widgets/findinfiles.py b/spyderlib/widgets/findinfiles.py
index 3da9f04..31c8904 100644
--- a/spyderlib/widgets/findinfiles.py
+++ b/spyderlib/widgets/findinfiles.py
@@ -34,6 +34,7 @@ from spyderlib.utils.qthelpers import (get_icon, get_std_icon,
 from spyderlib.baseconfig import _
 from spyderlib.widgets.comboboxes import PathComboBox, PatternComboBox
 from spyderlib.widgets.onecolumntree import OneColumnTree
+from spyderlib.py3compat import to_text_string, getcwd
 
 
 #def find_files_in_hg_manifest(rootpath, include, exclude):
@@ -189,7 +190,7 @@ class SearchThread(QThread):
                   cwd=self.rootpath, shell=True)
         hgroot = get_vcs_root(self.rootpath)
         self.pathlist = [hgroot]
-        for path in p.stdout.read().splitlines():
+        for path in p.stdout.read().decode().splitlines():
             with QMutexLocker(self.mutex):
                 if self.stopped:
                     return False
@@ -240,7 +241,7 @@ class SearchThread(QThread):
                 if self.stopped:
                     return
             try:
-                for lineno, line in enumerate(open(fname)):
+                for lineno, line in enumerate(open(fname, 'rb')):
                     for text, enc in self.texts:
                         if self.text_re:
                             found = re.search(text, line)
@@ -270,7 +271,8 @@ class SearchThread(QThread):
                                 if found > -1:
                                     break
                             self.nb += 1
-            except IOError, (_errno, _strerror):
+            except IOError as xxx_todo_changeme:
+                (_errno, _strerror) = xxx_todo_changeme.args
                 self.error_flag = _("permission denied errors were encountered")
             except re.error:
                 self.error_flag = _("invalid regular expression")
@@ -289,7 +291,7 @@ class FindOptions(QWidget):
         QWidget.__init__(self, parent)
         
         if search_path is None:
-            search_path = os.getcwdu()
+            search_path = getcwd()
         
         if not isinstance(search_text, (list, tuple)):
             search_text = [search_text]
@@ -435,7 +437,7 @@ class FindOptions(QWidget):
         
     def detect_hg_repository(self, path=None):
         if path is None:
-            path = os.getcwdu()
+            path = getcwd()
         hg_repository = is_hg_installed() and get_vcs_root(path) is not None
         self.hg_manifest.setEnabled(hg_repository)
         if not hg_repository and self.hg_manifest.isChecked():
@@ -449,7 +451,7 @@ class FindOptions(QWidget):
         
     def get_options(self, all=False):
         # Getting options
-        utext = unicode(self.search_text.currentText())
+        utext = to_text_string(self.search_text.currentText())
         if not utext:
             return
         try:
@@ -462,13 +464,13 @@ class FindOptions(QWidget):
                 except UnicodeDecodeError:
                     pass
         text_re = self.edit_regexp.isChecked()
-        include = unicode(self.include_pattern.currentText())
+        include = to_text_string(self.include_pattern.currentText())
         include_re = self.include_regexp.isChecked()
-        exclude = unicode(self.exclude_pattern.currentText())
+        exclude = to_text_string(self.exclude_pattern.currentText())
         exclude_re = self.exclude_regexp.isChecked()
         python_path = self.python_path.isChecked()
         hg_manifest = self.hg_manifest.isChecked()
-        path = osp.abspath( unicode( self.dir_combo.currentText() ) )
+        path = osp.abspath( to_text_string( self.dir_combo.currentText() ) )
         
         # Finding text occurences
         if not include_re:
@@ -477,14 +479,14 @@ class FindOptions(QWidget):
             exclude = fnmatch.translate(exclude)
             
         if all:
-            search_text = [unicode(self.search_text.itemText(index)) \
+            search_text = [to_text_string(self.search_text.itemText(index)) \
                            for index in range(self.search_text.count())]
-            search_path = [unicode(self.dir_combo.itemText(index)) \
+            search_path = [to_text_string(self.dir_combo.itemText(index)) \
                            for index in range(self.dir_combo.count())]
-            include = [unicode(self.include_pattern.itemText(index)) \
+            include = [to_text_string(self.include_pattern.itemText(index)) \
                        for index in range(self.include_pattern.count())]
             include_idx = self.include_pattern.currentIndex()
-            exclude = [unicode(self.exclude_pattern.itemText(index)) \
+            exclude = [to_text_string(self.exclude_pattern.itemText(index)) \
                        for index in range(self.exclude_pattern.count())]
             exclude_idx = self.exclude_pattern.currentIndex()
             more_options = self.more_options.isChecked()
@@ -506,7 +508,7 @@ class FindOptions(QWidget):
         self.parent().emit(SIGNAL('redirect_stdio(bool)'), True)
         
     def set_directory(self, directory):
-        path = unicode(osp.abspath(unicode(directory)))
+        path = to_text_string(osp.abspath(to_text_string(directory)))
         self.dir_combo.setEditText(path)
         self.detect_hg_repository(path)
         
@@ -538,7 +540,7 @@ class ResultsBrowser(OneColumnTree):
         
     def activated(self, item):
         """Double-click event"""
-        itemdata = self.data.get(self.currentItem())
+        itemdata = self.data.get(id(self.currentItem()))
         if itemdata is not None:
             filename, lineno = itemdata
             self.parent().emit(SIGNAL("edit_goto(QString,int,QString)"),
@@ -663,7 +665,7 @@ class ResultsBrowser(OneColumnTree):
                            ["%d (%s): %s" % (lineno, colno_str, line.rstrip())],
                            QTreeWidgetItem.Type)
                 item.setIcon(0, get_icon('arrow.png'))
-                self.data[item] = (filename, lineno)
+                self.data[id(item)] = (filename, lineno)
         # Removing empty directories
         top_level_items = [self.topLevelItem(index)
                            for index in range(self.topLevelItemCount())]
@@ -780,7 +782,8 @@ class FindInFilesWidget(QWidget):
         self.stop_and_reset_thread()
         if found is not None:
             results, pathlist, nb, error_flag = found
-            search_text = unicode( self.find_options.search_text.currentText() )
+            search_text = to_text_string(
+                                self.find_options.search_text.currentText())
             self.result_browser.set_results(search_text, results, pathlist,
                                             nb, error_flag, completed)
             self.result_browser.show()
diff --git a/spyderlib/widgets/findreplace.py b/spyderlib/widgets/findreplace.py
index 01735cd..fe68092 100644
--- a/spyderlib/widgets/findreplace.py
+++ b/spyderlib/widgets/findreplace.py
@@ -23,6 +23,7 @@ from spyderlib.utils.qthelpers import (get_icon, get_std_icon,
                                        create_toolbutton)
 from spyderlib.widgets.comboboxes import PatternComboBox
 from spyderlib.baseconfig import _
+from spyderlib.py3compat import to_text_string
 
 
 def is_position_sup(pos1, pos2):
@@ -327,8 +328,8 @@ class FindReplace(QWidget):
     def replace_find(self):
         """Replace and find"""
         if (self.editor is not None):
-            replace_text = unicode(self.replace_text.currentText())
-            search_text = unicode(self.search_text.currentText())
+            replace_text = to_text_string(self.replace_text.currentText())
+            search_text = to_text_string(self.search_text.currentText())
             pattern = search_text if self.re_button.isChecked() else None
             case = self.case_button.isChecked()
             first = True
@@ -336,7 +337,7 @@ class FindReplace(QWidget):
             while True:
                 if first:
                     # First found
-                    seltxt = unicode(self.editor.get_selected_text())
+                    seltxt = to_text_string(self.editor.get_selected_text())
                     cmptxt1 = search_text if case else search_text.lower()
                     cmptxt2 = seltxt if case else seltxt.lower()
                     if self.editor.has_selected_text() and cmptxt1 == cmptxt2:
@@ -370,7 +371,7 @@ class FindReplace(QWidget):
                     cursor.removeSelectedText()
                     cursor.insertText(replace_text)
                 else:
-                    seltxt = unicode(cursor.selectedText())
+                    seltxt = to_text_string(cursor.selectedText())
                     cursor.removeSelectedText()
                     cursor.insertText(re.sub(pattern, replace_text, seltxt))
                 if self.find_next():
diff --git a/spyderlib/widgets/formlayout.py b/spyderlib/widgets/formlayout.py
index 933d473..4e6152f 100644
--- a/spyderlib/widgets/formlayout.py
+++ b/spyderlib/widgets/formlayout.py
@@ -33,15 +33,11 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 OTHER DEALINGS IN THE SOFTWARE.
 """
 
-# ----+- Python 3 compatibility -+----
 from __future__ import print_function
-try:
-    basestring
-except NameError:
-    # Python 3
-    basestring = unicode = str
 
 # History:
+# 1.0.15: added support for multiline strings
+# 1.0.14: fixed Python 3 support (regression in 1.0.13)
 # 1.0.13: replaced obsolete QColorDialog.getRgba function and fixed other 
 #         compatibility issues with PySide (see Issue 8 of formlayout website)
 # 1.0.12: added support for Python 3
@@ -50,7 +46,7 @@ except NameError:
 # 1.0.7: added support for "Apply" button
 # 1.0.6: code cleaning
 
-__version__ = '1.0.13'
+__version__ = '1.0.15'
 __license__ = __doc__
 
 
@@ -71,6 +67,7 @@ import datetime
 
 # Local imports
 from spyderlib.baseconfig import _, DEBUG, STDERR
+from spyderlib.py3compat import is_text_string, to_text_string, is_string, u
 
 DEBUG_FORMLAYOUT = DEBUG >= 2
 
@@ -114,9 +111,9 @@ def text_to_qcolor(text):
     Avoid warning from Qt when an invalid QColor is instantiated
     """
     color = QColor()
-    if not isinstance(text, basestring): # testing for QString (PyQt API#1)
+    if not is_string(text): # testing for QString (PyQt API#1)
         text = str(text)
-    if not isinstance(text, (unicode, str)):
+    if not is_text_string(text):
         return color
     if text.startswith('#') and len(text)==7:
         correct = '#0123456789abcdef'
@@ -158,7 +155,8 @@ class ColorLayout(QHBoxLayout):
     
 def font_is_installed(font):
     """Check if font is installed"""
-    return [fam for fam in QFontDatabase().families() if unicode(fam)==font]
+    return [fam for fam in QFontDatabase().families()
+            if to_text_string(fam) == font]
 
 def tuple_to_qfont(tup):
     """
@@ -180,7 +178,7 @@ def tuple_to_qfont(tup):
     return font
 
 def qfont_to_tuple(font):
-    return (unicode(font.family()), int(font.pointSize()),
+    return (to_text_string(font.family()), int(font.pointSize()),
             font.italic(), font.bold())
 
 class FontLayout(QGridLayout):
@@ -272,8 +270,14 @@ class FormWidget(QWidget):
                 field = FontLayout(value, self)
             elif text_to_qcolor(value).isValid():
                 field = ColorLayout(QColor(value), self)
-            elif isinstance(value, (str, unicode)):
-                field = QLineEdit(value, self)
+            elif is_text_string(value):
+                if '\n' in value:
+                    for linesep in (os.linesep, '\n'):
+                        if linesep in value:
+                            value = value.replace(linesep, u("\u2029"))
+                    field = QTextEdit(value, self)
+                else:
+                    field = QLineEdit(value, self)
             elif isinstance(value, (list, tuple)):
                 value = list(value)  # in case this is a tuple
                 selindex = value.pop(0)
@@ -328,8 +332,12 @@ class FormWidget(QWidget):
                 continue
             elif tuple_to_qfont(value) is not None:
                 value = field.get_font()
-            elif isinstance(value, (str, unicode)):
-                value = unicode(field.text())
+            elif is_text_string(value):
+                if isinstance(field, QTextEdit):
+                    value = to_text_string(field.toPlainText()
+                                           ).replace(u("\u2029"), os.linesep)
+                else:
+                    value = to_text_string(field.text())
             elif isinstance(value, (list, tuple)):
                 index = int(field.currentIndex())
                 if isinstance(value[0], int):
@@ -532,6 +540,9 @@ if __name__ == "__main__":
 
     def create_datalist_example():
         return [('str', 'this is a string'),
+                ('str', """this is a 
+                MULTILINE
+                string"""),
                 ('list', [0, '1', '3', '4']),
                 ('list2', ['--', ('none', 'None'), ('--', 'Dashed'),
                            ('-.', 'DashDot'), ('-', 'Solid'),
diff --git a/spyderlib/widgets/importwizard.py b/spyderlib/widgets/importwizard.py
index 199468b..ca0bb43 100644
--- a/spyderlib/widgets/importwizard.py
+++ b/spyderlib/widgets/importwizard.py
@@ -8,8 +8,10 @@
 Text data Importing Wizard based on Qt
 """
 
+from __future__ import print_function
+
 from spyderlib.qt.QtGui import (QTableView, QVBoxLayout, QHBoxLayout,
-                                QGridLayout, QWidget,QDialog, QTextEdit,
+                                QGridLayout, QWidget, QDialog, QTextEdit,
                                 QTabWidget, QPushButton, QLabel, QSpacerItem,
                                 QSizePolicy, QCheckBox, QColor, QRadioButton,
                                 QLineEdit, QFrame, QMenu, QIntValidator,
@@ -22,7 +24,10 @@ from functools import partial as ft_partial
 
 # Local import
 from spyderlib.baseconfig import _
+from spyderlib.utils import programs
 from spyderlib.utils.qthelpers import get_icon, add_actions, create_action
+from spyderlib.py3compat import (TEXT_TYPES, INT_TYPES, to_text_string, u,
+                                 zip_longest)
 
 def try_to_parse(value):
     _types = ('int', 'float')
@@ -58,7 +63,7 @@ try:
 except ImportError:
     def dateparse(datestr, dayfirst=True):  # analysis:ignore
         """Just for 'day/month/year' strings"""
-        _a, _b, _c = map(int, datestr.split('/'))
+        _a, _b, _c = list(map(int, datestr.split('/')))
         if dayfirst:
             return datetime.datetime(_c, _b, _a)
         return datetime.datetime(_c, _a, _b)
@@ -69,11 +74,11 @@ def datestr_to_datetime(value, dayfirst=True):
 #----Background colors for supported types 
 COLORS = {
           bool: Qt.magenta,
-          (int, float, long): Qt.blue,
+          tuple([float] + list(INT_TYPES)): Qt.blue,
           list: Qt.yellow,
           dict: Qt.cyan,
           tuple: Qt.lightGray,
-          (str, unicode): Qt.darkRed,
+          TEXT_TYPES: Qt.darkRed,
           ndarray: Qt.green,
           datetime.date: Qt.darkYellow,
           }
@@ -165,7 +170,7 @@ class ContentsWidget(QWidget):
         other_layout.addWidget(skiprows_label, 0, 0)
         self.skiprows_edt = QLineEdit('0')
         self.skiprows_edt.setMaximumWidth(30)
-        intvalid = QIntValidator(0, len(unicode(text).splitlines()),
+        intvalid = QIntValidator(0, len(to_text_string(text).splitlines()),
                                  self.skiprows_edt)
         self.skiprows_edt.setValidator(intvalid)
         other_layout.addWidget(self.skiprows_edt, 0, 1)
@@ -218,22 +223,22 @@ class ContentsWidget(QWidget):
     def get_col_sep(self):
         """Return the column separator"""
         if self.tab_btn.isChecked():
-            return u"\t"
-        return unicode(self.line_edt.text())
+            return u("\t")
+        return to_text_string(self.line_edt.text())
     
     def get_row_sep(self):
         """Return the row separator"""
         if self.eol_btn.isChecked():
-            return u"\n"
-        return unicode(self.line_edt_row.text())
+            return u("\n")
+        return to_text_string(self.line_edt_row.text())
     
     def get_skiprows(self):
         """Return number of lines to be skipped"""
-        return int(unicode(self.skiprows_edt.text()))
+        return int(to_text_string(self.skiprows_edt.text()))
     
     def get_comments(self):
         """Return comment string"""
-        return unicode(self.comments_edt.text())
+        return to_text_string(self.comments_edt.text())
 
     @Slot(bool)
     def set_as_data(self, as_data):
@@ -300,7 +305,7 @@ class PreviewTableModel(QAbstractTableModel):
                 _tmp = self._data[index.row()][index.column()].replace(",", "")
                 self._data[index.row()][index.column()] = eval(_tmp)
             elif kwargs['atype'] == "unicode":
-                self._data[index.row()][index.column()] = unicode(
+                self._data[index.row()][index.column()] = to_text_string(
                     self._data[index.row()][index.column()])
             elif kwargs['atype'] == "int":
                 self._data[index.row()][index.column()] = int(
@@ -309,8 +314,8 @@ class PreviewTableModel(QAbstractTableModel):
                 self._data[index.row()][index.column()] = float(
                     self._data[index.row()][index.column()])                
             self.emit(SIGNAL("dataChanged(QModelIndex,QModelIndex)"), index, index)
-        except Exception, instance:
-            print instance
+        except Exception as instance:
+            print(instance)
 
 class PreviewTable(QTableView):
     """Import wizard preview widget"""
@@ -321,7 +326,7 @@ class PreviewTable(QTableView):
         # Setting up actions
         self.date_dayfirst_action = create_action(self, "dayfirst",
             triggered=ft_partial(self.parse_to_type, atype="date", dayfirst=True))
-        self.date_monthfirst_action = create_action(self,"monthfirst",
+        self.date_monthfirst_action = create_action(self, "monthfirst",
             triggered=ft_partial(self.parse_to_type, atype="date", dayfirst=False))
         self.perc_action = create_action(self, "perc",
             triggered=ft_partial(self.parse_to_type, atype="perc"))
@@ -331,7 +336,7 @@ class PreviewTable(QTableView):
             triggered=ft_partial(self.parse_to_type, atype="unicode"))
         self.int_action = create_action(self, "int",
             triggered=ft_partial(self.parse_to_type, atype="int"))
-        self.float_action = create_action(self,"float",
+        self.float_action = create_action(self, "float",
             triggered=ft_partial(self.parse_to_type, atype="float"))
         
         # Setting up menus
@@ -348,19 +353,27 @@ class PreviewTable(QTableView):
         add_actions( self.opt_menu, (self.str_action, self.int_action,
                                      self.float_action))
 
-    def _shape_text(self, text, colsep=u"\t", rowsep=u"\n", transpose=False,
-                    skiprows=0, comments='#'):
+    def _shape_text(self, text, colsep=u("\t"), rowsep=u("\n"),
+                    transpose=False, skiprows=0, comments='#'):
         """Decode the shape of the given text"""
         assert colsep != rowsep
         out = []
-        text_rows = map(None, text.split(rowsep))[skiprows:]
+        text_rows = text.split(rowsep)[skiprows:]
         for row in text_rows:
-            stripped = unicode(row).strip()
+            stripped = to_text_string(row).strip()
             if len(stripped) == 0 or stripped.startswith(comments):
                 continue
-            line = unicode(row).split(colsep)
-            line = map(lambda x: try_to_parse(unicode(x)), line)
+            line = to_text_string(row).split(colsep)
+            line = [try_to_parse(to_text_string(x)) for x in line]
             out.append(line)
+        # Replace missing elements with np.nan's or None's
+        if programs.is_module_installed('numpy'):
+            from numpy import nan
+            out = list(zip_longest(*out, fillvalue=nan))
+        else:
+            out = list(zip_longest(*out, fillvalue=None))
+        # Tranpose the last result to get the expected one
+        out = [[r[col] for r in out] for col in range(len(out[0]))]
         if transpose:
             return [[r[col] for r in out] for col in range(len(out[0]))]
         return out
@@ -371,8 +384,8 @@ class PreviewTable(QTableView):
             return None
         return self._model.get_data()
 
-    def process_data(self, text, colsep=u"\t", rowsep=u"\n", transpose=False,
-                     skiprows=0, comments='#'):
+    def process_data(self, text, colsep=u("\t"), rowsep=u("\n"),
+                     transpose=False, skiprows=0, comments='#'):
         """Put data into table model"""
         data = self._shape_text(text, colsep, rowsep, transpose, skiprows,
                                 comments)
@@ -413,7 +426,7 @@ class PreviewWidget(QWidget):
         vert_layout.addWidget(self._table_view)
         self.setLayout(vert_layout)
 
-    def open_data(self, text, colsep=u"\t", rowsep=u"\n",
+    def open_data(self, text, colsep=u("\t"), rowsep=u("\n"),
                   transpose=False, skiprows=0, comments='#'):
         """Open clipboard text as table"""
         self._table_view.process_data(text, colsep, rowsep, transpose,
@@ -510,7 +523,7 @@ class ImportWizard(QDialog):
         self.tab_widget.setTabEnabled(tab_idx, True)
         self.tab_widget.setCurrentIndex(tab_idx)
         
-    def _set_step(self,step):
+    def _set_step(self, step):
         """Proceed to a given step"""
         new_tab = self.tab_widget.currentIndex() + step
         assert new_tab < self.tab_widget.count() and new_tab >= 0
@@ -526,7 +539,7 @@ class ImportWizard(QDialog):
                 self.done_btn.setDefault(True)
                 self.fwd_btn.setEnabled(False)
                 self.back_btn.setEnabled(True)
-            except (SyntaxError, AssertionError), error:
+            except (SyntaxError, AssertionError) as error:
                 QMessageBox.critical(self, _("Import wizard"),
                             _("<b>Unable to proceed to next step</b>"
                               "<br><br>Please check your entries."
@@ -552,7 +565,7 @@ class ImportWizard(QDialog):
             return alist
         if len(alist) == 1:
             return self._simplify_shape(alist[-1], 1)
-        return map(lambda al: self._simplify_shape(al, 1), alist)
+        return [self._simplify_shape(al, 1) for al in alist]
 
     def _get_table_data(self):
         """Return clipboard processed as data"""
@@ -573,14 +586,14 @@ class ImportWizard(QDialog):
         try:
             self.var_name = str(var_name)
         except UnicodeEncodeError:
-            self.var_name = unicode(var_name)
+            self.var_name = to_text_string(var_name)
         if self.text_widget.get_as_data():
             self.clip_data = self._get_table_data()
         elif self.text_widget.get_as_code():
             self.clip_data = try_to_eval(
-                unicode(self._get_plain_text()))
+                to_text_string(self._get_plain_text()))
         else:
-            self.clip_data = unicode(self._get_plain_text())
+            self.clip_data = to_text_string(self._get_plain_text())
         self.accept()
 
 
@@ -590,7 +603,7 @@ def test(text):
     _app = qapplication()  # analysis:ignore
     dialog = ImportWizard(None, text)
     if dialog.exec_():
-        print dialog.get_data()
+        print(dialog.get_data())
 
 if __name__ == "__main__":
-    test(u"17/11/1976\t1.34\n14/05/09\t3.14")
+    test(u("17/11/1976\t1.34\n14/05/09\t3.14"))
diff --git a/spyderlib/widgets/internalshell.py b/spyderlib/widgets/internalshell.py
index 42bde84..7f595cb 100644
--- a/spyderlib/widgets/internalshell.py
+++ b/spyderlib/widgets/internalshell.py
@@ -13,10 +13,10 @@
 
 #FIXME: Internal shell MT: for i in range(100000): print i -> bug
 
-#----Builtins
-import __builtin__
+#----Builtins*
+from spyderlib.py3compat import builtins
 from spyderlib.widgets.objecteditor import oedit
-__builtin__.oedit = oedit
+builtins.oedit = oedit
 
 import os
 import threading
@@ -38,6 +38,7 @@ from spyderlib.utils.misc import get_error_match
 from spyderlib.baseconfig import get_conf_path, _, DEBUG
 from spyderlib.config import CONF
 from spyderlib.widgets.shell import PythonShellWidget
+from spyderlib.py3compat import to_text_string, getcwd, to_binary_string, u
 
 
 def create_banner(message):
@@ -108,15 +109,16 @@ class InternalShell(PythonShellWidget):
                  max_line_count=300, font=None, exitfunc=None, profile=False,
                  multithreaded=True, light_background=True):
         PythonShellWidget.__init__(self, parent,
-                                   get_conf_path('.history_internal.py'),
+                                   get_conf_path('history_internal.py'),
                                    profile)
         
         self.set_light_background(light_background)
-        
         self.multithreaded = multithreaded
-        
         self.setMaximumBlockCount(max_line_count)
         
+        # For compatibility with ExtPythonShellWidget
+        self.is_ipykernel = False
+        
         if font is not None:
             self.set_font(font)
         
@@ -151,7 +153,7 @@ class InternalShell(PythonShellWidget):
         
         # Embedded shell -- requires the monitor (which installs the
         # 'open_in_spyder' function in builtins)
-        if hasattr(__builtin__, 'open_in_spyder'):
+        if hasattr(builtins, 'open_in_spyder'):
             self.connect(self, SIGNAL("go_to_error(QString)"),
                          self.open_with_external_spyder)
 
@@ -202,7 +204,7 @@ class InternalShell(PythonShellWidget):
         self.interpreter.restore_stds()
         
     def edit_script(self, filename, external_editor):
-        filename = unicode(filename)
+        filename = to_text_string(filename)
         if external_editor:
             self.external_editor(filename)
         else:
@@ -274,10 +276,10 @@ class InternalShell(PythonShellWidget):
         """Load file in external Spyder's editor, if available
         This method is used only for embedded consoles
         (could also be useful if we ever implement the magic %edit command)"""
-        match = get_error_match(unicode(text))
+        match = get_error_match(to_text_string(text))
         if match:
             fname, lnb = match.groups()
-            __builtin__.open_in_spyder(fname, int(lnb))
+            builtins.open_in_spyder(fname, int(lnb))
 
     def external_editor(self, filename, goto=-1):
         """Edit in an external editor
@@ -319,7 +321,7 @@ class InternalShell(PythonShellWidget):
             t0 = time()
             for _ in range(10):
                 self.execute_command(command)
-            self.insert_text(u"\n<Δt>=%dms\n" % (1e2*(time()-t0)))
+            self.insert_text(u("\n<Δt>=%dms\n") % (1e2*(time()-t0)))
             self.new_prompt(self.interpreter.p1)
         else:
             self.execute_command(command)
@@ -391,7 +393,7 @@ class InternalShell(PythonShellWidget):
         else:
             if history:
                 self.add_to_history(cmd)
-        self.interpreter.stdin_write.write(cmd.encode("utf-8") + '\n')
+        self.interpreter.stdin_write.write(to_binary_string(cmd + '\n'))
         if not self.multithreaded:
             self.interpreter.run_line()
             self.emit(SIGNAL("refresh()"))
@@ -410,11 +412,11 @@ class InternalShell(PythonShellWidget):
         
     def get_globals_keys(self):
         """Return shell globals() keys"""
-        return self.interpreter.namespace.keys()
+        return list(self.interpreter.namespace.keys())
         
     def get_cdlistdir(self):
         """Return shell current directory list dir"""
-        return os.listdir(os.getcwdu())
+        return os.listdir(getcwd())
                 
     def iscallable(self, objtxt):
         """Is object callable?"""
@@ -435,7 +437,7 @@ class InternalShell(PythonShellWidget):
             return obj.__doc__
     
     def get_doc(self, objtxt):
-        """Get object documentation"""
+        """Get object documentation dictionary"""
         obj, valid = self._eval(objtxt)
         if valid:
             return getdoc(obj)
diff --git a/spyderlib/widgets/ipython.py b/spyderlib/widgets/ipython.py
index 2466021..0056791 100644
--- a/spyderlib/widgets/ipython.py
+++ b/spyderlib/widgets/ipython.py
@@ -8,24 +8,83 @@
 IPython v0.13+ client's widget
 """
 
+# Stdlib imports
+import os
+import os.path as osp
+from string import Template
+import time
+
+# Qt imports
+from spyderlib.qt.QtGui import (QTextEdit, QKeySequence, QShortcut, QWidget,
+                                QMenu, QHBoxLayout, QToolButton, QVBoxLayout,
+                                QMessageBox)
+from spyderlib.qt.QtCore import SIGNAL, Qt
+from spyderlib.utils.qthelpers import restore_keyevent
+
 # IPython imports
 try:  # 1.0
     from IPython.qt.console.rich_ipython_widget import RichIPythonWidget
 except ImportError: # 0.13
     from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget
 
-# Qt imports
-from spyderlib.qt.QtGui import QTextEdit, QKeySequence, QShortcut
-from spyderlib.qt.QtCore import SIGNAL, Qt
-from spyderlib.utils.qthelpers import restore_keyevent
-
 # Local imports
+from spyderlib.baseconfig import (get_conf_path, get_image_path,
+                                  get_module_source_path, _)
 from spyderlib.config import CONF
+from spyderlib.utils.qthelpers import (get_std_icon, create_toolbutton,
+                                       add_actions, create_action, get_icon)
 from spyderlib.utils import programs
 from spyderlib.widgets.mixins import (BaseEditMixin, InspectObjectMixin,
-                                      TracebackLinksMixin)
+                                      SaveHistoryMixin, TracebackLinksMixin)
+from spyderlib.widgets.browser import WebView
 
+#-----------------------------------------------------------------------------
+# Templates
+#-----------------------------------------------------------------------------
+# Using the same css file from the Object Inspector (because we are
+# sharing the same rules)
+OI_UTILS_PATH = get_module_source_path('spyderlib', osp.join('utils',
+                                                             'inspector'))
+CSS_PATH = osp.join(OI_UTILS_PATH, 'static', 'css')
 
+BLANK = \
+r"""<html>
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
+</head>
+</html>
+"""
+
+LOADING = \
+r"""<html>
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
+  <link rel="stylesheet" href="file:///${css_path}/default.css" type="text/css"/>
+</head>
+<body>
+  <div class="loading">
+    <img src="file:///${loading_img}"/>  ${message}
+  </div>
+</body>
+</html>
+"""
+
+KERNEL_ERROR = \
+r"""<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+    <link rel="stylesheet" href="file:///${css_path}/default.css" type="text/css"/>
+</head>
+<body>
+  <div id="warning">${message}</div>
+  <div class="metadata"><p><tt>${error}</tt></p></div>
+</body>
+</html>
+"""
+
+#-----------------------------------------------------------------------------
+# Control widgets
+#-----------------------------------------------------------------------------
 class IPythonControlWidget(TracebackLinksMixin, InspectObjectMixin, QTextEdit,
                            BaseEditMixin):
     """
@@ -112,7 +171,9 @@ class IPythonPageControlWidget(QTextEdit, BaseEditMixin):
         self.emit(SIGNAL('focus_changed()'))
         return super(IPythonPageControlWidget, self).focusOutEvent(event)
 
-
+#-----------------------------------------------------------------------------
+# Shell widget
+#-----------------------------------------------------------------------------
 class SpyderIPythonWidget(RichIPythonWidget):
     """
     Spyder's IPython widget
@@ -234,3 +295,256 @@ These commands were executed:
         """Reimplement Qt method to send focus change notification"""
         self.emit(SIGNAL('focus_changed()'))
         return super(SpyderIPythonWidget, self).focusOutEvent(event)
+
+#-----------------------------------------------------------------------------
+# Client widget
+#-----------------------------------------------------------------------------
+class IPythonClient(QWidget, SaveHistoryMixin):
+    """
+    Spyder IPython client or frontend.
+
+    This is a layer on top of the IPython Qt widget (i.e. RichIPythonWidget +
+    our additions = SpyderIPythonWidget), which becomes the ipywidget attribute
+    of this class. We are doing this for several reasons:
+
+    1. To add more variables and methods needed to connect the widget to other
+       Spyder plugins and also increase its funcionality.
+    2. To make it clear what has been added by us to IPython widgets.
+    3. To avoid possible name conflicts between our widgets and theirs (e.g.
+       self.history and self._history, respectively)
+    """
+    
+    CONF_SECTION = 'ipython'
+    SEPARATOR = '%s##---(%s)---' % (os.linesep*2, time.ctime())
+    
+    def __init__(self, plugin, history_filename, connection_file=None,
+                 kernel_widget_id=None, menu_actions=None):
+        super(IPythonClient, self).__init__(plugin)
+        SaveHistoryMixin.__init__(self)
+        self.options_button = None
+
+        self.connection_file = connection_file
+        self.kernel_widget_id = kernel_widget_id
+        self.name = ''
+        self.ipywidget = SpyderIPythonWidget(config=plugin.ipywidget_config(),
+                                             local_kernel=False)
+        self.ipywidget.hide()
+        self.loading_widget = WebView(self)
+        self.menu_actions = menu_actions
+        self.history_filename = get_conf_path(history_filename)
+        self.history = []
+        self.namespacebrowser = None
+        
+        self.loading_page = self._create_loading_page()
+        self.loading_widget.setHtml(self.loading_page)
+        
+        vlayout = QVBoxLayout()
+        toolbar_buttons = self.get_toolbar_buttons()
+        hlayout = QHBoxLayout()
+        for button in toolbar_buttons:
+            hlayout.addWidget(button)
+        vlayout.addLayout(hlayout)
+        vlayout.setContentsMargins(0, 0, 0, 0)
+        vlayout.addWidget(self.ipywidget)
+        vlayout.addWidget(self.loading_widget)
+        self.setLayout(vlayout)
+        
+        self.exit_callback = lambda: plugin.close_console(client=self)
+        
+    #------ Public API --------------------------------------------------------
+    def show_ipywidget(self):
+        """Show ipywidget and configure it"""
+        self.loading_widget.hide()
+        self.ipywidget.show()
+        self.loading_widget.setHtml(BLANK)
+        self.get_control().setFocus()
+        
+        # Connect the IPython widget to this IPython client:
+        # (see spyderlib/widgets/ipython.py for more details about this)
+        self.ipywidget.set_ipyclient(self)
+        
+        # To save history
+        self.ipywidget.executing.connect(
+                                      lambda c: self.add_to_history(command=c))
+        
+        # To update history after execution
+        self.ipywidget.executed.connect(self.update_history)
+        
+        # To update the Variable Explorer after execution
+        self.ipywidget.executed.connect(self.auto_refresh_namespacebrowser)
+    
+    def show_kernel_error(self, error):
+        """Show kernel initialization errors in the client"""
+        # Remove explanation about how to kill the kernel
+        # (doesn't apply to us)
+        error = error.split('issues/2049')[-1]
+        error = error.replace('\n', '<br>')
+        # Remove unneeded blank lines at the beginning
+        while error.startswith('<br>'):
+            error = error[4:]
+        message = _("An error ocurred while starting the kernel!")
+        kernel_error_template = Template(KERNEL_ERROR)
+        page = kernel_error_template.substitute(css_path=CSS_PATH,
+                                                message=message,
+                                                error=error)
+        self.loading_widget.setHtml(page)
+    
+    def show_restart_animation(self):
+        self.ipywidget.hide()
+        self.loading_widget.setHtml(self.loading_page)
+        self.loading_widget.show()
+    
+    def get_name(self):
+        """Return client name"""
+        return _("Console") + " " + self.name
+    
+    def get_control(self):
+        """Return the text widget (or similar) to give focus to"""
+        # page_control is the widget used for paging
+        page_control = self.ipywidget._page_control
+        if page_control and page_control.isVisible():
+            return page_control
+        else:
+            return self.ipywidget._control
+
+    def get_options_menu(self):
+        """Return options menu"""
+        # Kernel
+        self.interrupt_action = create_action(self, _("Interrupt kernel"),
+                                              icon=get_icon('terminate.png'),
+                                              triggered=self.interrupt_kernel)
+        self.restart_action = create_action(self, _("Restart kernel"),
+                                            icon=get_icon('restart.png'),
+                                            triggered=self.restart_kernel)
+        # Main menu
+        if self.menu_actions is not None:
+            actions = [self.interrupt_action, self.restart_action, None] +\
+                      self.menu_actions
+        else:
+            actions = [self.interrupt_action, self.restart_action]
+        return actions
+    
+    def get_toolbar_buttons(self):
+        """Return toolbar buttons list"""
+        #TODO: Eventually add some buttons (Empty for now)
+        # (see for example: spyderlib/widgets/externalshell/baseshell.py)
+        buttons = []
+        if self.options_button is None:
+            options = self.get_options_menu()
+            if options:
+                self.options_button = create_toolbutton(self,
+                        text=_("Options"), icon=get_icon('tooloptions.png'))
+                self.options_button.setPopupMode(QToolButton.InstantPopup)
+                menu = QMenu(self)
+                add_actions(menu, options)
+                self.options_button.setMenu(menu)
+        if self.options_button is not None:
+            buttons.append(self.options_button)
+        return buttons
+    
+    def add_actions_to_context_menu(self, menu):
+        """Add actions to IPython widget context menu"""
+        # See spyderlib/widgets/ipython.py for more details on this method
+        inspect_action = create_action(self, _("Inspect current object"),
+                                    QKeySequence("Ctrl+I"),
+                                    icon=get_std_icon('MessageBoxInformation'),
+                                    triggered=self.inspect_object)
+        clear_line_action = create_action(self, _("Clear line or block"),
+                                          QKeySequence("Shift+Escape"),
+                                          icon=get_icon('eraser.png'),
+                                          triggered=self.clear_line)
+        clear_console_action = create_action(self, _("Clear console"),
+                                             QKeySequence("Ctrl+L"),
+                                             icon=get_icon('clear.png'),
+                                             triggered=self.clear_console)
+        quit_action = create_action(self, _("&Quit"), icon='exit.png',
+                                    triggered=self.exit_callback)
+        add_actions(menu, (None, inspect_action, clear_line_action,
+                           clear_console_action, None, quit_action))
+        return menu
+    
+    def set_font(self, font):
+        """Set IPython widget's font"""
+        self.ipywidget.font = font
+    
+    def interrupt_kernel(self):
+        """Interrupt the associanted Spyder kernel if it's running"""
+        self.ipywidget.request_interrupt_kernel()
+    
+    def restart_kernel(self):
+        """Restart the associanted Spyder kernel"""
+        self.ipywidget.request_restart_kernel()
+    
+    def inspect_object(self):
+        """Show how to inspect an object with our object inspector"""
+        self.ipywidget._control.inspect_current_object()
+    
+    def clear_line(self):
+        """Clear a console line"""
+        self.ipywidget._keyboard_quit()
+    
+    def clear_console(self):
+        """Clear the whole console"""
+        self.ipywidget.execute("%clear")
+    
+    def if_kernel_dies(self, t):
+        """
+        Show a message in the console if the kernel dies.
+        t is the time in seconds between the death and showing the message.
+        """
+        message = _("It seems the kernel died unexpectedly. Use "
+                    "'Restart kernel' to continue using this console.")
+        self.ipywidget._append_plain_text(message + '\n')
+    
+    def update_history(self):
+        self.history = self.ipywidget._history
+    
+    def interrupt_message(self):
+        """
+        Print an interrupt message when the client is connected to an external
+        kernel
+        """
+        message = _("Kernel process is either remote or unspecified. "
+                    "Cannot interrupt")
+        QMessageBox.information(self, "IPython", message)
+    
+    def restart_message(self):
+        """
+        Print a restart message when the client is connected to an external
+        kernel
+        """
+        message = _("Kernel process is either remote or unspecified. "
+                    "Cannot restart.")
+        QMessageBox.information(self, "IPython", message)
+
+    def set_namespacebrowser(self, namespacebrowser):
+        """Set namespace browser widget"""
+        self.namespacebrowser = namespacebrowser
+
+    def auto_refresh_namespacebrowser(self):
+        """Refresh namespace browser"""
+        if self.namespacebrowser:
+            self.namespacebrowser.refresh_table()
+    
+    #------ Private API -------------------------------------------------------
+    def _create_loading_page(self):
+        loading_template = Template(LOADING)
+        loading_img = get_image_path('loading.gif')
+        message = _("Connecting to kernel...")
+        page = loading_template.substitute(css_path=CSS_PATH,
+                                           loading_img=loading_img,
+                                           message=message)
+        return page
+    
+    #---- Qt methods ----------------------------------------------------------
+    def closeEvent(self, event):
+        """
+        Reimplement Qt method to stop sending the custom_restart_kernel_died
+        signal
+        """
+        if programs.is_module_installed('IPython', '>=1.0'):
+            kc = self.ipywidget.kernel_client
+            if kc is not None:
+                kc.hb_channel.pause()
+        else:
+            self.ipywidget.custom_restart = False
diff --git a/spyderlib/widgets/mixins.py b/spyderlib/widgets/mixins.py
index 3161ba2..ba3a4c8 100644
--- a/spyderlib/widgets/mixins.py
+++ b/spyderlib/widgets/mixins.py
@@ -24,6 +24,7 @@ from spyderlib.baseconfig import _
 from spyderlib.utils import encoding, sourcecode
 from spyderlib.utils.misc import get_error_match
 from spyderlib.utils.dochelpers import getobj
+from spyderlib.py3compat import is_text_string, to_text_string, u
 
 
 HISTORY_FILENAMES = []
@@ -36,8 +37,8 @@ class BaseEditMixin(object):
     #------EOL characters
     def set_eol_chars(self, text):
         """Set widget end-of-line (EOL) characters from text (analyzes text)"""
-        if not isinstance(text, basestring): # testing for QString (PyQt API#1)
-            text = unicode(text)
+        if not is_text_string(text): # testing for QString (PyQt API#1)
+            text = to_text_string(text)
         eol_chars = sourcecode.get_eol_chars(text)
         if eol_chars is not None and self.eol_chars is not None:
             self.document().setModified(True)
@@ -53,7 +54,7 @@ class BaseEditMixin(object):
     def get_text_with_eol(self):
         """Same as 'toPlainText', replace '\n' 
         by correct end-of-line characters"""
-        utext = unicode(self.toPlainText())
+        utext = to_text_string(self.toPlainText())
         lines = utext.splitlines()
         linesep = self.get_line_separator()
         txt = linesep.join(lines)
@@ -193,7 +194,7 @@ class BaseEditMixin(object):
         # since splitlines doesn't return that line as the last element
         # TODO: Make this function more efficient
         try:
-            return unicode(self.toPlainText()).splitlines()[line_nb]
+            return to_text_string(self.toPlainText()).splitlines()[line_nb]
         except IndexError:
             return self.get_line_separator()
     
@@ -203,11 +204,11 @@ class BaseEditMixin(object):
         Positions may be positions or 'sol', 'eol', 'sof', 'eof' or 'cursor'
         """
         cursor = self.__select_text(position_from, position_to)
-        text = unicode(cursor.selectedText())
+        text = to_text_string(cursor.selectedText())
         if text:
             while text.endswith("\n"):
                 text = text[:-1]
-            while text.endswith(u"\u2029"):
+            while text.endswith(u("\u2029")):
                 text = text[:-1]
         return text
     
@@ -220,7 +221,7 @@ class BaseEditMixin(object):
             cursor.setPosition(position)
             cursor.movePosition(QTextCursor.Right,
                                 QTextCursor.KeepAnchor)
-            return unicode(cursor.selectedText())
+            return to_text_string(cursor.selectedText())
         else:
             return ''
     
@@ -259,14 +260,14 @@ class BaseEditMixin(object):
             def is_space(move):
                 curs = self.textCursor()
                 curs.movePosition(move, QTextCursor.KeepAnchor)
-                return not unicode(curs.selectedText()).strip()
+                return not to_text_string(curs.selectedText()).strip()
             if is_space(QTextCursor.NextCharacter):
                 if is_space(QTextCursor.PreviousCharacter):
                     return
                 cursor.movePosition(QTextCursor.WordLeft)
 
         cursor.select(QTextCursor.WordUnderCursor)
-        text = unicode(cursor.selectedText())
+        text = to_text_string(cursor.selectedText())
         match = re.findall(r'([a-zA-Z\_]+[0-9a-zA-Z\_]*)', text)
         if match:
             return match[0]
@@ -275,7 +276,7 @@ class BaseEditMixin(object):
         """Return current line's text"""
         cursor = self.textCursor()
         cursor.select(QTextCursor.BlockUnderCursor)
-        return unicode(cursor.selectedText())
+        return to_text_string(cursor.selectedText())
     
     def get_current_line_to_cursor(self):
         """Return text from prompt to cursor"""
@@ -290,17 +291,17 @@ class BaseEditMixin(object):
         """Return line at *coordinates* (QPoint)"""
         cursor = self.cursorForPosition(coordinates)
         cursor.select(QTextCursor.BlockUnderCursor)
-        return unicode(cursor.selectedText()).replace(u'\u2029', '')
+        return to_text_string(cursor.selectedText()).replace(u('\u2029'), '')
     
     def get_word_at(self, coordinates):
         """Return word at *coordinates* (QPoint)"""
         cursor = self.cursorForPosition(coordinates)
         cursor.select(QTextCursor.WordUnderCursor)
-        return unicode(cursor.selectedText())
+        return to_text_string(cursor.selectedText())
     
     def get_block_indentation(self, block_nb):
         """Return line indentation (character number)"""
-        text = unicode(self.document().findBlockByNumber(block_nb).text())
+        text = to_text_string(self.document().findBlockByNumber(block_nb).text())
         return len(text)-len(text.lstrip())
     
     def get_selection_bounds(self):
@@ -315,7 +316,7 @@ class BaseEditMixin(object):
     #------Text selection
     def has_selected_text(self):
         """Returns True if some text is selected"""
-        return bool(unicode(self.textCursor().selectedText()))
+        return bool(to_text_string(self.textCursor().selectedText()))
 
     def get_selected_text(self):
         """
@@ -324,7 +325,7 @@ class BaseEditMixin(object):
         Replace the unicode line separator character \u2029 by 
         the line separator characters returned by get_line_separator
         """
-        return unicode(self.textCursor().selectedText()).replace(u"\u2029",
+        return to_text_string(self.textCursor().selectedText()).replace(u("\u2029"),
                                                      self.get_line_separator())
     
     def remove_selected_text(self):
@@ -338,10 +339,11 @@ class BaseEditMixin(object):
         cursor = self.textCursor()
         cursor.beginEditBlock()
         if pattern is not None:
-            seltxt = unicode(cursor.selectedText())
+            seltxt = to_text_string(cursor.selectedText())
         cursor.removeSelectedText()
         if pattern is not None:
-            text = re.sub(unicode(pattern), unicode(text), unicode(seltxt))
+            text = re.sub(to_text_string(pattern),
+                          to_text_string(text), to_text_string(seltxt))
         cursor.insertText(text)
         cursor.endEditBlock()
 
@@ -351,8 +353,8 @@ class BaseEditMixin(object):
         """Reimplement QTextDocument's find method
         
         Add support for *multiline* regular expressions"""
-        pattern = unicode(regexp.pattern())
-        text = unicode(self.toPlainText())
+        pattern = to_text_string(regexp.pattern())
+        text = to_text_string(self.toPlainText())
         try:
             regobj = re.compile(pattern)
         except sre_constants.error:
@@ -388,7 +390,7 @@ class BaseEditMixin(object):
         if forward:
             moves += [QTextCursor.NextWord, QTextCursor.Start]
             if changed:
-                if unicode(cursor.selectedText()):
+                if to_text_string(cursor.selectedText()):
                     new_position = min([cursor.selectionStart(),
                                         cursor.selectionEnd()])
                     cursor.setPosition(new_position)
@@ -397,7 +399,7 @@ class BaseEditMixin(object):
         else:
             moves += [QTextCursor.End]
         if not regexp:
-            text = re.escape(unicode(text))
+            text = re.escape(to_text_string(text))
         pattern = QRegExp(r"\b%s\b" % text if words else text,
                           Qt.CaseSensitive if case else Qt.CaseInsensitive,
                           QRegExp.RegExp2)
@@ -482,7 +484,7 @@ class InspectObjectMixin(object):
     
     def show_docstring(self, text, call=False, force=False):
         """Show docstring or arguments"""
-        text = unicode(text) # Useful only for ExternalShellBase
+        text = to_text_string(text) # Useful only for ExternalShellBase
         
         insp_enabled = self.inspector_enabled or force
         if force and self.inspector is not None:
@@ -530,7 +532,7 @@ class SaveHistoryMixin(object):
     
     def add_to_history(self, command):
         """Add command to history"""
-        command = unicode(command)
+        command = to_text_string(command)
         if command in ['', '\n'] or command.startswith('Traceback'):
             return
         if command.endswith('\n'):
diff --git a/spyderlib/widgets/objecteditor.py b/spyderlib/widgets/objecteditor.py
index f4f1137..5d3b043 100644
--- a/spyderlib/widgets/objecteditor.py
+++ b/spyderlib/widgets/objecteditor.py
@@ -8,8 +8,13 @@
 Object Editor Dialog based on Qt
 """
 
+from __future__ import print_function
+
 from spyderlib.qt.QtCore import QObject, SIGNAL
 
+# Local imports
+from spyderlib.py3compat import is_text_string
+
 
 class DialogKeeper(QObject):
     def __init__(self):
@@ -74,7 +79,7 @@ def create_dialog(obj, obj_name):
             return
         from spyderlib.pil_patch import Image
         conv_func = lambda data: Image.fromarray(data, mode=obj.mode)
-    elif isinstance(obj, (str, unicode)):
+    elif is_text_string(obj):
         dialog = TextEditor(obj, title=obj_name, readonly=readonly)
     else:
         dialog = DictEditor()
@@ -105,7 +110,7 @@ def oedit(obj, modal=True, namespace=None):
     if modal:
         obj_name = ''
     else:
-        assert isinstance(obj, basestring)
+        assert is_text_string(obj)
         obj_name = obj
         if namespace is None:
             namespace = globals()
@@ -150,11 +155,11 @@ def test():
         def __init__(self):
             self.text = "toto"
     foobar = Foobar()
-    print oedit(foobar)
-    print oedit(example)
-    print oedit(np.random.rand(10, 10))
-    print oedit(oedit.__doc__)
-    print example
+    print(oedit(foobar))
+    print(oedit(example))
+    print(oedit(np.random.rand(10, 10)))
+    print(oedit(oedit.__doc__))
+    print(example)
     
 if __name__ == "__main__":
     test()
diff --git a/spyderlib/widgets/outlineexplorer.py b/spyderlib/widgets/outlineexplorer.py
deleted file mode 100644
index e238814..0000000
--- a/spyderlib/widgets/outlineexplorer.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009-2010 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""
-Outline explorer widget
-
-******************************** WARNING ***************************************
-    This module is not used anymore in Spyder since v1.1.0.
-    However, it will still be part of spyderlib module for a little while -
-    we never know, it could be useful...
-    
-    See spyderlib.widgets.editortools.OutlineExplorerWidget for new version.
-********************************************************************************
-"""
-
-import os.path as osp
-import sys
-
-from spyderlib.qt.QtGui import QTreeWidgetItem
-from spyderlib.qt.QtCore import SIGNAL
-
-# Local imports
-from spyderlib.baseconfig import _
-from spyderlib.utils.qthelpers import get_icon
-from spyderlib.widgets.onecolumntree import OneColumnTree
-from spyderlib.utils.classparser import get_classes
-
-
-class OutlineExplorer(OneColumnTree):
-    def __init__(self, parent):
-        OneColumnTree.__init__(self, parent)
-        title = _("Outline")
-        self.setWindowTitle(title)
-        self.set_title(title)
-        self.fname = None
-        self.classes = None
-        self.lines = None
-        self.setWindowIcon(get_icon('outline_explorer.png'))
-        
-    def clear(self):
-        """Reimplemented Qt method"""
-        self.set_title('')
-        OneColumnTree.clear(self)
-        
-    def refresh(self, data=None, update=True):
-        """Refresh outline explorer"""
-        if data is not None:
-            fname, self.classes, self.lines = data
-            self.fname = osp.abspath(fname)
-        if data is None or self.classes is None or update:
-            try:
-                self.classes = get_classes(self.fname)
-            except (SyntaxError, IOError):
-                if self.classes is None:
-                    self.clear()
-                return (self.fname, self.classes, self.lines)
-        self.clear()
-        self.populate_classes()
-        self.resizeColumnToContents(0)
-        self.expandAll()
-        self.set_title(osp.basename(self.fname))
-        return (self.fname, self.classes, self.lines)
-
-    def activated(self, item):
-        """Double-click event"""
-        self.emit(SIGNAL('go_to_line(int)'), self.lines[item])
-
-    def clicked(self, item):
-        """Click event"""
-        self.activated(item)
-        
-    def populate_classes(self):
-        """Populate classes"""
-        self.lines = {}
-        for lineno, c_name, methods in self.classes:
-            item = QTreeWidgetItem(self, [c_name], QTreeWidgetItem.Type)
-            self.lines[item] = lineno
-            if methods is None:
-                item.setIcon(0, get_icon('function.png'))
-            else:
-                item.setIcon(0, get_icon('class.png'))
-            if methods:
-                self.populate_methods(item, c_name, methods)
-            
-    def populate_methods(self, parent, c_name, methods):
-        """Populate methods"""
-        for lineno, m_name in methods:
-            if m_name.startswith('@'):
-                m_name = m_name[1:]
-            item = QTreeWidgetItem(parent, [m_name], QTreeWidgetItem.Type)
-            self.lines[item] = lineno
-            if m_name.startswith('__'):
-                item.setIcon(0, get_icon('private2.png'))
-            elif m_name.startswith('_'):
-                item.setIcon(0, get_icon('private1.png'))
-            else:
-                item.setIcon(0, get_icon('method.png'))
-
-
-def test(fname):
-    """Show outline explorer for Python script *fname*"""
-    from spyderlib.utils.qthelpers import qapplication
-    app = qapplication()
-    widget = OutlineExplorer(None)
-    data = (fname, None, None)
-    widget.refresh(data)
-    widget.show()
-    sys.exit(app.exec_())
-    
-if __name__ == '__main__':
-    if len(sys.argv) > 1:
-        fname = sys.argv[1]
-    else:
-        fname = "outlineexplorer.py"
-    test(fname)
-    
\ No newline at end of file
diff --git a/spyderlib/widgets/pathmanager.py b/spyderlib/widgets/pathmanager.py
index 3cd3ce1..e96d853 100644
--- a/spyderlib/widgets/pathmanager.py
+++ b/spyderlib/widgets/pathmanager.py
@@ -6,7 +6,7 @@
 
 """Spyder path manager"""
 
-from __future__ import with_statement
+from __future__ import print_function
 
 from spyderlib.qt.QtGui import (QDialog, QListWidget, QDialogButtonBox,
                                 QVBoxLayout, QHBoxLayout, QMessageBox,
@@ -21,6 +21,7 @@ import os.path as osp
 # Local imports
 from spyderlib.utils.qthelpers import get_icon, get_std_icon, create_toolbutton
 from spyderlib.baseconfig import _
+from spyderlib.py3compat import getcwd
 
 
 class PathManager(QDialog):
@@ -39,7 +40,7 @@ class PathManager(QDialog):
             ro_pathlist = []
         self.ro_pathlist = ro_pathlist
         
-        self.last_path = os.getcwdu()
+        self.last_path = getcwd()
         
         self.setWindowTitle(_("PYTHONPATH manager"))
         self.setWindowIcon(get_icon('pythonpath.png'))
@@ -240,7 +241,7 @@ def test():
     _app = qapplication()  # analysis:ignore
     test = PathManager(None, sys.path[:-10], sys.path[-10:])
     test.exec_()
-    print test.get_path_list()
+    print(test.get_path_list())
 
 if __name__ == "__main__":
     test()
diff --git a/spyderlib/widgets/projectexplorer.py b/spyderlib/widgets/projectexplorer.py
index 76a5bbb..2db158c 100644
--- a/spyderlib/widgets/projectexplorer.py
+++ b/spyderlib/widgets/projectexplorer.py
@@ -8,7 +8,7 @@
 
 # pylint: disable=C0103
 
-from __future__ import with_statement
+from __future__ import print_function
 
 from spyderlib.qt.QtGui import (QVBoxLayout, QLabel, QHBoxLayout, QWidget,
                                 QFileIconProvider, QMessageBox, QInputDialog,
@@ -20,7 +20,6 @@ from spyderlib.qt.compat import getexistingdirectory
 import os
 import re
 import shutil
-import cPickle
 import os.path as osp
 import xml.etree.ElementTree as ElementTree
 
@@ -31,6 +30,7 @@ from spyderlib.baseconfig import _, STDERR, get_image_path
 from spyderlib.widgets.explorer import FilteredDirView, listdir, fixpath
 from spyderlib.widgets.formlayout import fedit
 from spyderlib.widgets.pathmanager import PathManager
+from spyderlib.py3compat import to_text_string, getcwd, pickle
 
 
 def has_children_files(path, include, exclude, show_all):
@@ -80,7 +80,7 @@ class Project(object):
         """Set workspace root path"""
         if self.name is None:
             self.name = osp.basename(root_path)
-        self.root_path = unicode(root_path)
+        self.root_path = to_text_string(root_path)
         config_path = self.__get_project_config_path()
         if osp.exists(config_path):
             self.load()
@@ -122,19 +122,19 @@ class Project(object):
         try:
             # Old format (Spyder 2.0-2.1 for Python 2)
             with open(fname, 'U') as fdesc:
-                data = cPickle.loads(fdesc.read())
-        except TypeError, cPickle.PickleError:
+                data = pickle.loads(fdesc.read())
+        except (pickle.PickleError, TypeError, UnicodeDecodeError):
             try:
                 # New format (Spyder >=2.2 for Python 2 and Python 3)
                 with open(fname, 'rb') as fdesc:
-                    data = cPickle.loads(fdesc.read())
-            except (IOError, OSError, cPickle.PickleError):
+                    data = pickle.loads(fdesc.read())
+            except (IOError, OSError, pickle.PickleError):
                 self.ioerror_flag = True
                 return
         # Compatibilty with old project explorer file format:
         if 'relative_pythonpath' not in data:
-            print >>STDERR, "Warning: converting old configuration file " \
-                            "for project '%s'" % data['name']
+            print("Warning: converting old configuration file " \
+                            "for project '%s'" % data['name'], file=STDERR)
             self.pythonpath = data['pythonpath']
             data['relative_pythonpath'] = self.relative_pythonpath
         for attr in self.CONFIG_ATTR:
@@ -148,7 +148,7 @@ class Project(object):
             data[attr] = getattr(self, attr)
         try:
             with open(self.__get_project_config_path(), 'wb') as fdesc:
-                cPickle.dump(data, fdesc, 2)
+                pickle.dump(data, fdesc, 2)
         except (IOError, OSError):
             self.ioerror_flag = True
         
@@ -272,7 +272,7 @@ class Workspace(object):
         """Set workspace root path"""
         if self.name is None:
             self.name = osp.basename(root_path)
-        self.root_path = unicode(osp.abspath(root_path))
+        self.root_path = to_text_string(osp.abspath(root_path))
         config_path = self.__get_workspace_config_path()
         if osp.exists(config_path):
             self.load()
@@ -294,13 +294,13 @@ class Workspace(object):
         try:
             # Old format (Spyder 2.0-2.1 for Python 2)
             with open(fname, 'U') as fdesc:
-                data = cPickle.loads(fdesc.read())
-        except cPickle.PickleError:
+                data = pickle.loads(fdesc.read())
+        except (pickle.PickleError, TypeError, UnicodeDecodeError):
             try:
                 # New format (Spyder >=2.2 for Python 2 and Python 3)
                 with open(fname, 'rb') as fdesc:
-                    data = cPickle.loads(fdesc.read())
-            except (IOError, OSError, cPickle.PickleError):
+                    data = pickle.loads(fdesc.read())
+            except (IOError, OSError, pickle.PickleError):
                 self.ioerror_flag = True
                 return
         for attr in self.CONFIG_ATTR:
@@ -314,7 +314,7 @@ class Workspace(object):
             data[attr] = getattr(self, attr)
         try:
             with open(self.__get_workspace_config_path(), 'wb') as fdesc:
-                cPickle.dump(data, fdesc, 2)
+                pickle.dump(data, fdesc, 2)
         except (IOError, OSError):
             self.ioerror_flag = True
         
@@ -488,7 +488,7 @@ class IconProvider(QFileIconProvider):
             return super(IconProvider, self).icon(icontype_or_qfileinfo)
         else:
             qfileinfo = icontype_or_qfileinfo
-            fname = osp.normpath(unicode(qfileinfo.absoluteFilePath()))
+            fname = osp.normpath(to_text_string(qfileinfo.absoluteFilePath()))
             if osp.isdir(fname):
                 project = self.treeview.get_source_project(fname)
                 if project is None:
@@ -567,7 +567,7 @@ class ExplorerTreeWidget(FilteredDirView):
         """Reimplement DirView method"""
         only_folders = all([osp.isdir(_fn) for _fn in fnames])
         projects = [self.get_source_project(fname) for fname in fnames]
-        pjfnames = zip(projects, fnames)
+        pjfnames = list(zip(projects, fnames))
         any_project = any([_pr.is_root_path(_fn) for _pr, _fn in pjfnames])
         any_folder_in_path = any([_proj.is_in_pythonpath(_fn)
                                   for _proj, _fn in pjfnames])
@@ -756,11 +756,12 @@ class ExplorerTreeWidget(FilteredDirView):
             dst = self.get_project_path_from_name(name)
             try:
                 shutil.copytree(folder, dst)
-            except EnvironmentError, error:
+            except EnvironmentError as error:
                 QMessageBox.critical(self, title,
                                      _("<b>Unable to %s <i>%s</i></b>"
                                        "<br><br>Error message:<br>%s"
-                                       ) % (_('copy'), folder, unicode(error)))
+                                       ) % (_('copy'), folder,
+                                            to_text_string(error)))
             folder = dst
         
         project = self.workspace.add_project(folder)
@@ -832,7 +833,7 @@ class ExplorerTreeWidget(FilteredDirView):
             name, valid = QInputDialog.getText(self, title, _('Project name:'),
                                                QLineEdit.Normal, name)
             if valid and name:
-                name = unicode(name)
+                name = to_text_string(name)
                 pattern = r'[a-zA-Z][a-zA-Z0-9\_\-]*$'
                 match = re.match(pattern, name)
                 path = self.get_project_path_from_name(name)
@@ -958,12 +959,13 @@ class ExplorerTreeWidget(FilteredDirView):
         for folder in folders:
             try:
                 name, related_projects, path = get_pydev_project_infos(folder)
-            except RuntimeError, error:
+            except RuntimeError as error:
                 QMessageBox.critical(self,
                             _('Import existing Pydev project'),
                             _("<b>Unable to read Pydev project <i>%s</i></b>"
                               "<br><br>Error message:<br>%s"
-                              ) % (osp.basename(folder), unicode(error)))
+                              ) % (osp.basename(folder),
+                                   to_text_string(error)))
             finally:
                 project = self.add_project(folder, silent=True)
                 if project is not None:
@@ -1115,7 +1117,8 @@ class ExplorerTreeWidget(FilteredDirView):
         
         dst = self.get_filename(self.indexAt(event.pos()))
         yes_to_all, no_to_all = None, None
-        src_list = [unicode(url.toString()) for url in event.mimeData().urls()]
+        src_list = [to_text_string(url.toString())
+                    for url in event.mimeData().urls()]
         if len(src_list) > 1:
             buttons = QMessageBox.Yes|QMessageBox.YesAll| \
                       QMessageBox.No|QMessageBox.NoAll|QMessageBox.Cancel
@@ -1161,7 +1164,7 @@ class ExplorerTreeWidget(FilteredDirView):
                     else:
                         shutil.move(src, dst)
                     self.parent_widget.emit(SIGNAL("removed(QString)"), src)
-            except EnvironmentError, error:
+            except EnvironmentError as error:
                 if action == Qt.CopyAction:
                     action_str = _('copy')
                 else:
@@ -1169,7 +1172,8 @@ class ExplorerTreeWidget(FilteredDirView):
                 QMessageBox.critical(self, _("Project Explorer"),
                                      _("<b>Unable to %s <i>%s</i></b>"
                                        "<br><br>Error message:<br>%s"
-                                       ) % (action_str, src, unicode(error)))
+                                       ) % (action_str, src,
+                                            to_text_string(error)))
 
 
 class WorkspaceSelector(QWidget):
@@ -1221,9 +1225,9 @@ class WorkspaceSelector(QWidget):
         if self.first_time:
             QMessageBox.information(self, self.TITLE, self.TIP)
             self.first_time = False
-        basedir = unicode(self.line_edit.text())
+        basedir = to_text_string(self.line_edit.text())
         if not osp.isdir(basedir):
-            basedir = os.getcwdu()
+            basedir = getcwd()
         while True:
             self.parent().emit(SIGNAL('redirect_stdio(bool)'), False)
             directory = getexistingdirectory(self, self.TITLE, basedir)
@@ -1291,7 +1295,7 @@ class ProjectExplorerWidget(QWidget):
         
     def set_workspace(self, path):
         """Set current workspace"""
-        path = osp.normpath(unicode(path))
+        path = osp.normpath(to_text_string(path))
         if path is not None and osp.isdir(path):
             self.treewidget.set_workspace(path)
             self.selector.set_workspace(path)
diff --git a/spyderlib/widgets/pydocgui.py b/spyderlib/widgets/pydocgui.py
index a7ae886..1388e1e 100644
--- a/spyderlib/widgets/pydocgui.py
+++ b/spyderlib/widgets/pydocgui.py
@@ -7,7 +7,7 @@
 """pydoc widget"""
 
 from spyderlib.qt.QtGui import QApplication, QCursor
-from spyderlib.qt.QtCore import QThread, QUrl, Qt
+from spyderlib.qt.QtCore import QThread, QUrl, Qt, SIGNAL
 
 import sys
 import os.path as osp
@@ -16,6 +16,7 @@ import os.path as osp
 from spyderlib.baseconfig import _
 from spyderlib.widgets.browser import WebBrowser
 from spyderlib.utils.misc import select_port
+from spyderlib.py3compat import to_text_string, PY3
 
 
 class PydocServer(QThread):
@@ -28,16 +29,28 @@ class PydocServer(QThread):
         
     def run(self):
         import pydoc
-        pydoc.serve(self.port, self.callback, self.completer)
-        
+        if PY3:
+            # Python 3
+            self.callback(pydoc._start_server(pydoc._url_handler, self.port))
+        else:
+            # Python 2
+            pydoc.serve(self.port, self.callback, self.completer)
+
     def callback(self, server):
         self.server = server
+        self.emit(SIGNAL('server_started()'))
         
     def completer(self):
         self.complete = True
         
     def quit_server(self):
-        self.server.quit = 1
+        if PY3:
+            # Python 3
+            if self.server.serving:
+                self.server.stop()
+        else:
+            # Python 2
+            self.server.quit = 1
 
 
 class PydocBrowser(WebBrowser):
@@ -52,10 +65,14 @@ class PydocBrowser(WebBrowser):
         self.port = None
         
     def initialize(self):
-        """Start pydoc server and load home page"""
+        """Start pydoc server"""
         QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
         QApplication.processEvents()
         self.start_server()
+        # Initializing continues in `initialize_continued` method...
+    
+    def initialize_continued(self):
+        """Load home page"""
         self.go_home()
         QApplication.restoreOverrideCursor()
         
@@ -76,8 +93,12 @@ class PydocBrowser(WebBrowser):
             self.port = select_port(default_port=self.DEFAULT_PORT)
             self.set_home_url('http://localhost:%d/' % self.port)
         elif self.server.isRunning():
+            self.disconnect(self.server, SIGNAL('server_started()'),
+                            self.initialize_continued)
             self.server.quit()
         self.server = PydocServer(port=self.port)
+        self.connect(self.server, SIGNAL('server_started()'),
+                     self.initialize_continued)
         self.server.start()
 
     #------ WebBrowser API -----------------------------------------------------
@@ -98,7 +119,7 @@ class PydocBrowser(WebBrowser):
     
     def url_to_text(self, url):
         """Convert QUrl object to displayed text in combo box"""
-        return osp.splitext(unicode(url.path()))[0][1:]
+        return osp.splitext(to_text_string(url.path()))[0][1:]
 
 
 def main():
diff --git a/spyderlib/widgets/shell.py b/spyderlib/widgets/shell.py
index f044d15..957548d 100644
--- a/spyderlib/widgets/shell.py
+++ b/spyderlib/widgets/shell.py
@@ -16,6 +16,7 @@ import time
 import os.path as osp
 import re
 import sys
+import keyword
 
 from spyderlib.qt.QtGui import (QMenu, QApplication, QToolTip, QKeySequence,
                                 QMessageBox, QTextCursor, QTextCharFormat,
@@ -33,6 +34,8 @@ from spyderlib.utils.qthelpers import (keybinding, create_action, add_actions,
 from spyderlib.widgets.sourcecode.base import ConsoleBaseWidget
 from spyderlib.widgets.mixins import (InspectObjectMixin, TracebackLinksMixin,
                                       SaveHistoryMixin)
+from spyderlib.py3compat import (is_text_string, to_text_string, builtins,
+                                 is_string)
 
 
 class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
@@ -54,7 +57,7 @@ class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
         # History
         self.histidx = None
         self.hist_wholeline = False
-        assert isinstance(history_filename, (str, unicode))
+        assert is_text_string(history_filename)
         self.history_filename = history_filename
         self.history = self.load_history()
         
@@ -253,15 +256,16 @@ class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
         if filename:
             filename = osp.normpath(filename)
             try:
-                encoding.write(unicode(self.get_text_with_eol()), filename)
+                encoding.write(to_text_string(self.get_text_with_eol()),
+                               filename)
                 self.historylog_filename = filename
                 CONF.set('main', 'historylog_filename', filename)
-            except EnvironmentError, error:
+            except EnvironmentError as error:
                 QMessageBox.critical(self, title,
                                      _("<b>Unable to save file '%s'</b>"
                                        "<br><br>Error message:<br>%s"
                                        ) % (osp.basename(filename),
-                                            unicode(error)))
+                                            to_text_string(error)))
         
         
     #------ Basic keypress event handler
@@ -542,7 +546,7 @@ class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
             self.hist_wholeline = True
             return self.history[idx], idx
         else:
-            for index in xrange(len(self.history)):
+            for index in range(len(self.history)):
                 idx = (start_idx+step*(index+1)) % len(self.history)
                 entry = self.history[idx]
                 if entry.startswith(tocursor):
@@ -563,9 +567,9 @@ class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
         """Simulate stdout and stderr"""
         if prompt:
             self.flush()
-        if not isinstance(text, basestring):
+        if not is_string(text):
             # This test is useful to discriminate QStrings from decoded str
-            text = unicode(text)
+            text = to_text_string(text)
         self.__buffer.append(text)
         ts = time.time()
         if flush or prompt:
@@ -627,7 +631,7 @@ class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
     def dropEvent(self, event):
         """Drag and Drop - Drop event"""
         if (event.mimeData().hasFormat("text/plain")):
-            text = unicode(event.mimeData().text())
+            text = to_text_string(event.mimeData().text())
             if self.new_input_line:
                 self.on_new_line()
             self.insert_text(text, at_end=True)
@@ -642,6 +646,11 @@ class ShellBaseWidget(ConsoleBaseWidget, SaveHistoryMixin):
         raise NotImplementedError
 
 
+# Example how to debug complex interclass call chains:
+#
+# from spyderlib.utils.debug import log_methods_calls
+# log_methods_calls('log.log', ShellBaseWidget)
+
 class PythonShellWidget(TracebackLinksMixin, ShellBaseWidget,
                         InspectObjectMixin):
     """Python shell widget"""
@@ -800,7 +809,7 @@ class PythonShellWidget(TracebackLinksMixin, ShellBaseWidget,
     #------ Paste
     def paste(self):
         """Reimplemented slot to handle multiline paste action"""
-        text = unicode(QApplication.clipboard().text())
+        text = to_text_string(QApplication.clipboard().text())
         if len(text.splitlines()) > 1:
             # Multiline paste
             if self.new_input_line:
@@ -841,7 +850,7 @@ class PythonShellWidget(TracebackLinksMixin, ShellBaseWidget,
         """Get object __doc__"""
         raise NotImplementedError
     def get_doc(self, objtxt):
-        """Get object documentation"""
+        """Get object documentation dictionary"""
         raise NotImplementedError
     def get_source(self, objtxt):
         """Get object source"""
@@ -853,7 +862,7 @@ class PythonShellWidget(TracebackLinksMixin, ShellBaseWidget,
     def show_code_completion(self, automatic):
         """Display a completion list based on the current line"""
         # Note: unicode conversion is needed only for ExternalShellBase
-        text = unicode(self.get_current_line_to_cursor())
+        text = to_text_string(self.get_current_line_to_cursor())
         last_obj = self.get_last_obj()
         
         if text.startswith('import '):
@@ -884,10 +893,9 @@ class PythonShellWidget(TracebackLinksMixin, ShellBaseWidget,
             return
         
         # Builtins and globals
-        import __builtin__, keyword
         if not text.endswith('.') and last_obj \
            and re.match(r'[a-zA-Z_0-9]*$', last_obj):
-            b_k_g = dir(__builtin__)+self.get_globals_keys()+keyword.kwlist
+            b_k_g = dir(builtins)+self.get_globals_keys()+keyword.kwlist
             for objname in b_k_g:
                 if objname.startswith(last_obj) and objname != last_obj:
                     self.show_completion_list(b_k_g, completion_text=last_obj,
diff --git a/spyderlib/widgets/sourcecode/base.py b/spyderlib/widgets/sourcecode/base.py
index 873ccf4..aec8a3d 100644
--- a/spyderlib/widgets/sourcecode/base.py
+++ b/spyderlib/widgets/sourcecode/base.py
@@ -13,19 +13,21 @@
 
 import os
 import re
-import string
 import sys
 
 from spyderlib.qt.QtGui import (QTextCursor, QColor, QFont, QApplication,
                                 QTextEdit, QTextCharFormat, QToolTip,
                                 QListWidget, QPlainTextEdit, QPalette,
-                                QMainWindow, QTextOption, QMouseEvent)
+                                QMainWindow, QTextOption, QMouseEvent,
+                                QTextFormat)
 from spyderlib.qt.QtCore import QPoint, SIGNAL, Qt, QEventLoop, QEvent
+from spyderlib.qt.compat import to_qvariant
 
 
 # Local imports
 from spyderlib.widgets.sourcecode.terminal import ANSIEscapeCodeHandler
 from spyderlib.widgets.mixins import BaseEditMixin
+from spyderlib.py3compat import to_text_string, str_lower
 
 
 class CompletionWidget(QListWidget):
@@ -105,7 +107,7 @@ class CompletionWidget(QListWidget):
             point = ancestor.mapFromGlobal(point)
         self.move(point)
         
-        if unicode(self.textedit.completion_text):
+        if to_text_string(self.textedit.completion_text):
             # When initialized, if completion text is not empty, we need 
             # to update the displayed list:
             self.update_current()
@@ -141,7 +143,7 @@ class CompletionWidget(QListWidget):
             QListWidget.keyPressEvent(self, event)
             
     def update_current(self):
-        completion_text = unicode(self.textedit.completion_text)
+        completion_text = to_text_string(self.textedit.completion_text)
         if completion_text:
             for row, completion in enumerate(self.completion_list):
                 if not self.case_sensitive:
@@ -169,7 +171,7 @@ class CompletionWidget(QListWidget):
     def item_selected(self, item=None):
         if item is None:
             item = self.currentItem()
-        self.textedit.insert_completion( unicode(item.text()) )
+        self.textedit.insert_completion( to_text_string(item.text()) )
         self.hide()
 
 
@@ -210,6 +212,9 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         self.calltip_size = 600
         self.calltip_font = QFont()
         self.completion_text = ""
+        
+        # Highlight current line color
+        self.currentline_color = QColor(Qt.red).lighter(190)
 
         # Brace matching
         self.bracepos = None
@@ -235,13 +240,15 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         palette.setColor(QPalette.Base, background)
         palette.setColor(QPalette.Text, foreground)
         self.setPalette(palette)
-        
+
+
     #------Line number area
     def get_linenumberarea_width(self):
         """Return line number area width"""
         # Implemented in CodeEditor, but needed here for completion widget
         return 0
-        
+
+
     #------Extra selections
     def get_extra_selections(self, key):
         return self.extra_selections_dict.get(key, [])
@@ -251,8 +258,13 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         
     def update_extra_selections(self):
         extra_selections = []
-        for _key, extra in self.extra_selections_dict.iteritems():
-            extra_selections.extend(extra)
+        for key, extra in list(self.extra_selections_dict.items()):
+            if key == 'current_line':
+                # Python 3 compatibility (weird): current line has to be 
+                # highlighted first
+                extra_selections = extra + extra_selections
+            else:
+                extra_selections += extra
         self.setExtraSelections(extra_selections)
         
     def clear_extra_selections(self, key):
@@ -266,6 +278,23 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
                   self.document().isModified())
 
 
+    #------Highlight current line
+    def highlight_current_line(self):
+        """Highlight current line"""
+        selection = QTextEdit.ExtraSelection()
+        selection.format.setProperty(QTextFormat.FullWidthSelection,
+                                     to_qvariant(True))
+        selection.format.setBackground(self.currentline_color)
+        selection.cursor = self.textCursor()
+        selection.cursor.clearSelection()
+        self.set_extra_selections('current_line', [selection])
+        self.update_extra_selections()
+
+    def unhighlight_current_line(self):
+        """Unhighlight current line"""
+        self.clear_extra_selections('current_line')
+
+
     #------Brace matching
     def find_brace_match(self, position, brace, forward):
         start_pos, end_pos = self.BRACE_MATCHING_SCOPE
@@ -336,7 +365,7 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
             return
         cursor.movePosition(QTextCursor.PreviousCharacter,
                             QTextCursor.KeepAnchor)
-        text = unicode(cursor.selectedText())
+        text = to_text_string(cursor.selectedText())
         pos1 = cursor.position()
         if text in (')', ']', '}'):
             pos2 = self.find_brace_match(pos1, text, forward=False)
@@ -425,7 +454,7 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         min_indent = 999
         current_indent = 0
         lines = text.split(ls)
-        for i in xrange(len(lines)-1, -1, -1):
+        for i in range(len(lines)-1, -1, -1):
             line = lines[i]
             if line.strip():
                 current_indent = _indent(line)
@@ -486,9 +515,9 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         if cursor is not None:
             cursor0 = QTextCursor(cursor)
             cursor0.select(QTextCursor.BlockUnderCursor)
-            text = unicode(cursor0.selectedText())
+            text = to_text_string(cursor0.selectedText())
         else:
-            text = unicode(block.text())
+            text = to_text_string(block.text())
         return text.lstrip().startswith(self.CELL_SEPARATORS)
 
     def select_current_cell(self):
@@ -570,13 +599,13 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         cursor = self.textCursor()
         cursor.beginEditBlock()
         start_pos, end_pos = self.__save_selection()
-        if unicode(cursor.selectedText()):
+        if to_text_string(cursor.selectedText()):
             cursor.setPosition(end_pos)
             # Check if end_pos is at the start of a block: if so, starting
             # changes from the previous block
             cursor.movePosition(QTextCursor.StartOfBlock,
                                 QTextCursor.KeepAnchor)
-            if not unicode(cursor.selectedText()):
+            if not to_text_string(cursor.selectedText()):
                 cursor.movePosition(QTextCursor.PreviousBlock)
                 end_pos = cursor.position()
             
@@ -624,7 +653,7 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         cursor = self.textCursor()
         cursor.beginEditBlock()
         start_pos, end_pos = self.__save_selection()
-        if unicode(cursor.selectedText()):
+        if to_text_string(cursor.selectedText()):
             # Check if start_pos is at the start of a block
             cursor.setPosition(start_pos)
             cursor.movePosition(QTextCursor.StartOfBlock)
@@ -635,7 +664,7 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
             # changes from the previous block
             cursor.movePosition(QTextCursor.StartOfBlock,
                                 QTextCursor.KeepAnchor)
-            if unicode(cursor.selectedText()):
+            if to_text_string(cursor.selectedText()):
                 cursor.movePosition(QTextCursor.NextBlock)
                 end_pos = cursor.position()
         else:
@@ -646,17 +675,17 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         cursor.setPosition(start_pos)
         cursor.setPosition(end_pos, QTextCursor.KeepAnchor)
         
-        sel_text = unicode(cursor.selectedText())
+        sel_text = to_text_string(cursor.selectedText())
         cursor.removeSelectedText()
         
         if after_current_line:
-            text = unicode(cursor.block().text())
+            text = to_text_string(cursor.block().text())
             start_pos += len(text)+1
             end_pos += len(text)+1
             cursor.movePosition(QTextCursor.NextBlock)
         else:
             cursor.movePosition(QTextCursor.PreviousBlock)
-            text = unicode(cursor.block().text())
+            text = to_text_string(cursor.block().text())
             start_pos -= len(text)+1
             end_pos -= len(text)+1
         cursor.insertText(sel_text)
@@ -748,7 +777,7 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
             before = self.is_cursor_before(self.calltip_position,
                                            char_offset=1)
             other = key in (Qt.Key_ParenRight, Qt.Key_Period, Qt.Key_Tab)
-            if calltip_char not in ('?','(') or before or other:
+            if calltip_char not in ('?', '(') or before or other:
                 QToolTip.hideText()
         except (IndexError, TypeError):
             QToolTip.hideText()
@@ -769,9 +798,10 @@ class TextEditBaseWidget(QPlainTextEdit, BaseEditMixin):
         self.completion_text = completion_text
         # Sorting completion list (entries starting with underscore are 
         # put at the end of the list):
-        underscore = set([comp for comp in completions if comp.startswith('_')])
-        completions = sorted(set(completions)-underscore, key=string.lower)+\
-                      sorted(underscore, key=string.lower)
+        underscore = set([comp for comp in completions
+                          if comp.startswith('_')])
+        completions = sorted(set(completions)-underscore, key=str_lower)+\
+                      sorted(underscore, key=str_lower)
         self.show_completion_widget(completions, automatic=automatic)
         
     def select_completion_list(self):
diff --git a/spyderlib/widgets/sourcecode/codeeditor.py b/spyderlib/widgets/sourcecode/codeeditor.py
index d918098..bf064db 100644
--- a/spyderlib/widgets/sourcecode/codeeditor.py
+++ b/spyderlib/widgets/sourcecode/codeeditor.py
@@ -30,7 +30,7 @@ from spyderlib.qt.QtGui import (QColor, QMenu, QApplication, QSplitter, QFont,
                                 QPixmap, QPrinter, QToolTip, QCursor, QLabel,
                                 QInputDialog, QTextBlockUserData, QLineEdit,
                                 QShortcut, QKeySequence, QWidget, QVBoxLayout,
-                                QKeyEvent, QHBoxLayout, QDialog, QIntValidator,
+                                QHBoxLayout, QDialog, QIntValidator,
                                 QDialogButtonBox, QGridLayout)
 from spyderlib.qt.QtCore import (Qt, SIGNAL, QTimer, QRect, QRegExp, QSize,
                                  SLOT, Slot)
@@ -51,6 +51,7 @@ from spyderlib.utils.debug import log_last_error, log_dt
 from spyderlib.widgets.editortools import PythonCFM
 from spyderlib.widgets.sourcecode.base import TextEditBaseWidget
 from spyderlib.widgets.sourcecode import syntaxhighlighters as sh
+from spyderlib.py3compat import to_text_string, PY2
 from spyderlib import dependencies
 
 #%% This line is for cell execution testing
@@ -96,10 +97,15 @@ class RopeProject(object):
 
     #------rope integration
     def create_rope_project(self, root_path):
+        if PY2:
+            root_path = encoding.to_fs_from_unicode(root_path)
+        else:
+            #TODO: test if this is working without any further change in 
+            # Python 3 with a user account containing unicode characters
+            pass
         try:
             import rope.base.project
-            self.project = rope.base.project.Project(
-                encoding.to_fs_from_unicode(root_path), **ROPE_PREFS)
+            self.project = rope.base.project.Project(root_path, **ROPE_PREFS)
         except ImportError:
             self.project = None
             if DEBUG_EDITOR:
@@ -129,10 +135,16 @@ class RopeProject(object):
     def get_completion_list(self, source_code, offset, filename):
         if self.project is None:
             return []
+        if PY2:
+            filename = filename.encode('utf-8')
+        else:
+            #TODO: test if this is working without any further change in 
+            # Python 3 with a user account containing unicode characters
+            pass
         try:
             resource = rope.base.libutils.path_to_resource(self.project,
-                                                   filename.encode('utf-8'))
-        except Exception, _error:
+                                                           filename)
+        except Exception as _error:
             if DEBUG_EDITOR:
                 log_last_error(LOG_FILENAME, "path_to_resource: %r" % filename)
             resource = None
@@ -145,7 +157,7 @@ class RopeProject(object):
             if DEBUG_EDITOR:
                 log_dt(LOG_FILENAME, "code_assist/sorted_proposals", t0)
             return [proposal.name for proposal in proposals]
-        except Exception, _error:  #analysis:ignore
+        except Exception as _error:  #analysis:ignore
             if DEBUG_EDITOR:
                 log_last_error(LOG_FILENAME, "get_completion_list")
             return []
@@ -153,10 +165,16 @@ class RopeProject(object):
     def get_calltip_and_docs(self, source_code, offset, filename):
         if self.project is None:
             return []
+        if PY2:
+            filename = filename.encode('utf-8')
+        else:
+            #TODO: test if this is working without any further change in 
+            # Python 3 with a user account containing unicode characters
+            pass
         try:
             resource = rope.base.libutils.path_to_resource(self.project,
-                                                   filename.encode('utf-8'))
-        except Exception, _error:
+                                                           filename)
+        except Exception as _error:
             if DEBUG_EDITOR:
                 log_last_error(LOG_FILENAME, "path_to_resource: %r" % filename)
             resource = None
@@ -178,12 +196,12 @@ class RopeProject(object):
                                      source_code, offset, resource, maxfixes=3)
                 if DEBUG_EDITOR:
                     log_dt(LOG_FILENAME, "get_doc", t0)
-            except Exception, _error:
+            except Exception as _error:
                 doc_text = ''
                 if DEBUG_EDITOR:
                     log_last_error(LOG_FILENAME, "get_doc")
             return [cts, doc_text]
-        except Exception, _error:  #analysis:ignore
+        except Exception as _error:  #analysis:ignore
             if DEBUG_EDITOR:
                 log_last_error(LOG_FILENAME, "get_calltip_text")
             return []
@@ -191,10 +209,16 @@ class RopeProject(object):
     def get_definition_location(self, source_code, offset, filename):
         if self.project is None:
             return (None, None)
+        if PY2:
+            filename = filename.encode('utf-8')
+        else:
+            #TODO: test if this is working without any further change in 
+            # Python 3 with a user account containing unicode characters
+            pass
         try:
             resource = rope.base.libutils.path_to_resource(self.project,
-                                                   filename.encode('utf-8'))
-        except Exception, _error:
+                                                           filename)
+        except Exception as _error:
             if DEBUG_EDITOR:
                 log_last_error(LOG_FILENAME, "path_to_resource: %r" % filename)
             resource = None
@@ -208,7 +232,7 @@ class RopeProject(object):
             if resource is not None:
                 filename = resource.real_path
             return filename, lineno
-        except Exception, _error:  #analysis:ignore
+        except Exception as _error:  #analysis:ignore
             if DEBUG_EDITOR:
                 log_last_error(LOG_FILENAME, "get_definition_location")
             return (None, None)
@@ -288,7 +312,7 @@ class GoToLineDialog(QDialog):
         
     def text_has_changed(self, text):
         """Line edit's text has changed"""
-        text = unicode(text)
+        text = to_text_string(text)
         if text:
             self.lineno = int(text)
         else:
@@ -488,7 +512,7 @@ class CodeEditor(TextEditBaseWidget):
         import pygments  # analysis:ignore
     except ImportError:
         # Removing all syntax highlighters requiring pygments to be installed
-        for key, (sh_class, comment_string, CFMatch) in LANGUAGES.items():
+        for key, (sh_class, comment_string, CFMatch) in list(LANGUAGES.items()):
             if issubclass(sh_class, sh.PygmentsSH):
                 LANGUAGES.pop(key)
     
@@ -557,10 +581,7 @@ class CodeEditor(TextEditBaseWidget):
             ccs = sh.COLOR_SCHEME_NAMES[0]
         self.color_scheme = ccs
 
-        #  Background colors: current line, occurences
-        self.currentline_color = QColor(Qt.red).lighter(190)
         self.highlight_current_line_enabled = False
-        
 
         # Scrollbar flag area
         self.scrollflagarea_enabled = None
@@ -816,7 +837,10 @@ class CodeEditor(TextEditBaseWidget):
     def set_highlight_current_line(self, enable):
         """Enable/disable current line highlighting"""
         self.highlight_current_line_enabled = enable
-        self.highlight_current_line()
+        if self.highlight_current_line_enabled:
+            self.highlight_current_line()
+        else:
+            self.unhighlight_current_line()
 
     def set_language(self, language):
         self.tab_indents = language in self.TAB_ALWAYS_INDENTS
@@ -861,7 +885,10 @@ class CodeEditor(TextEditBaseWidget):
         """
         if self.highlighter is not None:
             self.highlighter.rehighlight()
-        self.highlight_current_line()
+        if self.highlight_current_line_enabled:
+            self.highlight_current_line()
+        else:
+            self.unhighlight_current_line()
 
 
     def setup_margins(self, linenumbers=True, markers=True):
@@ -880,7 +907,7 @@ class CodeEditor(TextEditBaseWidget):
         cursor.movePosition(QTextCursor.Start)
         while True:
             cursor.movePosition(QTextCursor.EndOfBlock)
-            text = unicode(cursor.block().text())
+            text = to_text_string(cursor.block().text())
             length = len(text)-len(text.rstrip())
             if length > 0:
                 cursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor,
@@ -893,7 +920,7 @@ class CodeEditor(TextEditBaseWidget):
 
     def fix_indentation(self):
         """Replace tabs by spaces"""
-        text_before = unicode(self.toPlainText())
+        text_before = to_text_string(self.toPlainText())
         text_after = sourcecode.fix_indentation(text_before)
         if text_before != text_after:
             self.setPlainText(text_after)
@@ -901,7 +928,7 @@ class CodeEditor(TextEditBaseWidget):
 
     def get_current_object(self):
         """Return current object (string) -- requires 'rope'"""
-        source_code = unicode(self.toPlainText())
+        source_code = to_text_string(self.toPlainText())
         offset = self.get_position('cursor')
         return get_primary_at(source_code, offset)
 
@@ -929,7 +956,10 @@ class CodeEditor(TextEditBaseWidget):
         """Cursor position has changed"""
         line, column = self.get_cursor_line_column()
         self.emit(SIGNAL('cursorPositionChanged(int,int)'), line, column)
-        self.highlight_current_line()
+        if self.highlight_current_line_enabled:
+            self.highlight_current_line()
+        else:
+            self.unhighlight_current_line()
         if self.occurence_highlighting:
             self.occurence_timer.stop()
             self.occurence_timer.start()
@@ -977,7 +1007,8 @@ class CodeEditor(TextEditBaseWidget):
             return
             
         if (self.is_python() or self.is_cython()) and \
-           (sourcecode.is_keyword(unicode(text)) or unicode(text) == 'self'):
+           (sourcecode.is_keyword(to_text_string(text)) or \
+           to_text_string(text) == 'self'):
             return
 
         # Highlighting all occurences of word *text*
@@ -999,13 +1030,13 @@ class CodeEditor(TextEditBaseWidget):
     #-----highlight found results (find/replace widget)
     def highlight_found_results(self, pattern, words=False, regexp=False):
         """Highlight all found patterns"""
-        pattern = unicode(pattern)
+        pattern = to_text_string(pattern)
         if not pattern:
             return
         if not regexp:
-            pattern = re.escape(unicode(pattern))
+            pattern = re.escape(to_text_string(pattern))
         pattern = r"\b%s\b" % pattern if words else pattern
-        text = unicode(self.toPlainText())
+        text = to_text_string(self.toPlainText())
         try:
             regobj = re.compile(pattern)
         except sre_constants.error:
@@ -1111,7 +1142,7 @@ class CodeEditor(TextEditBaseWidget):
                 if self.linenumbers_margin:
                     painter.drawText(0, top, self.linenumberarea.width(),
                                      font_height, Qt.AlignRight|Qt.AlignBottom,
-                                     unicode(line_number))
+                                     to_text_string(line_number))
                 data = block.userData()
                 if self.markers_margin and data:
                     if data.code_analysis:
@@ -1201,7 +1232,7 @@ class CodeEditor(TextEditBaseWidget):
             else:
                 return
         if data.breakpoint:
-            text = unicode(block.text()).strip()
+            text = to_text_string(block.text()).strip()
             if len(text) == 0 or text.startswith('#') or text.startswith('"') \
                or text.startswith("'"):
                 data.breakpoint = False
@@ -1214,7 +1245,7 @@ class CodeEditor(TextEditBaseWidget):
         """Get breakpoints"""
         breakpoints = []
         block = self.document().firstBlock()
-        for line_number in xrange(1, self.document().blockCount()+1):
+        for line_number in range(1, self.document().blockCount()+1):
             data = block.userData()
             if data and data.breakpoint:
                 breakpoints.append((line_number, data.breakpoint_condition))
@@ -1288,7 +1319,7 @@ class CodeEditor(TextEditBaseWidget):
         block = self.document().firstBlock()
         
         # Painting warnings and todos
-        for line_number in xrange(1, self.document().blockCount()+1):
+        for line_number in range(1, self.document().blockCount()+1):
             data = block.userData()
             if data:
                 position = self.scrollflagarea.value_to_position(line_number)
@@ -1374,22 +1405,7 @@ class CodeEditor(TextEditBaseWidget):
         self.__set_scrollflagarea_geometry(cr)
         return TextEditBaseWidget.viewportEvent(self, event)
 
-    #-----highlight current line
-    def highlight_current_line(self):
-        """Highlight current line. Works without self.highlighter"""
-        if self.highlight_current_line_enabled:
-            selection = QTextEdit.ExtraSelection()
-            selection.format.setProperty(QTextFormat.FullWidthSelection,
-                                         to_qvariant(True))
-            selection.format.setBackground(self.currentline_color)
-            selection.cursor = self.textCursor()
-            selection.cursor.clearSelection()
-            self.set_extra_selections('current_line', [selection])
-            self.update_extra_selections()
-        else:
-            self.clear_extra_selections('current_line')
-
-
+    #-----Misc.
     def delete(self):
         """Remove selected text"""
         # Used by global callbacks in Spyder -> delete_action
@@ -1436,7 +1452,10 @@ class CodeEditor(TextEditBaseWidget):
             # this calls self.highlighter.rehighlight()
             self.highlighter.set_color_scheme(color_scheme)
             self._apply_highlighter_color_scheme()
-        self.highlight_current_line()
+        if self.highlight_current_line_enabled:
+            self.highlight_current_line()
+        else:
+            self.unhighlight_current_line()
 
     def set_text(self, text):
         """Set the text of the editor"""
@@ -1466,7 +1485,7 @@ class CodeEditor(TextEditBaseWidget):
         text has 'CRLF' EOL chars
         """
         clipboard = QApplication.clipboard()
-        text = unicode(clipboard.text())
+        text = to_text_string(clipboard.text())
         if len(text.splitlines()) > 1:
             eol_chars = self.get_line_separator()
             clipboard.setText( eol_chars.join((text+eol_chars).splitlines()) )
@@ -1505,7 +1524,7 @@ class CodeEditor(TextEditBaseWidget):
             self.connect(self, SIGNAL("focus_in()"),
                          self.center_cursor_on_next_focus)
         self.horizontalScrollBar().setValue(0)
-        if word and unicode(word) in unicode(block.text()):
+        if word and to_text_string(word) in to_text_string(block.text()):
             self.find(word, QTextDocument.FindCaseSensitively)
 
     def exec_gotolinedialog(self):
@@ -1554,7 +1573,8 @@ class CodeEditor(TextEditBaseWidget):
                 text = ref[1:-1]
                 # Scanning line number *line* and following lines if continued
                 def is_line_splitted(line_no):
-                    text = unicode(document.findBlockByNumber(line_no).text())
+                    text = to_text_string(
+                                document.findBlockByNumber(line_no).text())
                     stripped = text.strip()
                     return stripped.endswith('\\') or stripped.endswith(',') \
                            or len(stripped) == 0
@@ -1720,7 +1740,7 @@ class CodeEditor(TextEditBaseWidget):
         cursor = self.textCursor()
         cursor.setPosition(cursor.position()-len(suffix),
                            QTextCursor.KeepAnchor)
-        if unicode(cursor.selectedText()) == suffix:
+        if to_text_string(cursor.selectedText()) == suffix:
             cursor.removeSelectedText()
 
     def remove_prefix(self, prefix):
@@ -1751,7 +1771,7 @@ class CodeEditor(TextEditBaseWidget):
                     break
                 else:
                     old_pos = new_pos
-                line_text = unicode(cursor.block().text())
+                line_text = to_text_string(cursor.block().text())
                 if (prefix.strip() and line_text.lstrip().startswith(prefix)
                     or line_text.startswith(prefix)):
                     cursor.movePosition(QTextCursor.Right,
@@ -1765,7 +1785,7 @@ class CodeEditor(TextEditBaseWidget):
         else:
             # Remove prefix from current line
             cursor.movePosition(QTextCursor.StartOfBlock)
-            line_text = unicode(cursor.block().text())
+            line_text = to_text_string(cursor.block().text())
             if (prefix.strip() and line_text.lstrip().startswith(prefix)
                 or line_text.startswith(prefix)):
                 cursor.movePosition(QTextCursor.Right,
@@ -1789,9 +1809,9 @@ class CodeEditor(TextEditBaseWidget):
             return
         cursor = self.textCursor()
         block_nb = cursor.blockNumber()
-        for prevline in xrange(block_nb-1, -1, -1):
+        for prevline in range(block_nb-1, -1, -1):
             cursor.movePosition(QTextCursor.PreviousBlock)
-            prevtext = unicode(cursor.block().text()).rstrip()
+            prevtext = to_text_string(cursor.block().text()).rstrip()
             if not prevtext.strip().startswith('#'):
                 break
         indent = self.get_block_indentation(block_nb)
@@ -1866,7 +1886,8 @@ class CodeEditor(TextEditBaseWidget):
             self.indent()
         else:
             cursor = self.textCursor()
-            if self.get_selected_text() == unicode(cursor.block().text()):
+            if self.get_selected_text() == \
+               to_text_string(cursor.block().text()):
                 self.indent()
             else:
                 cursor1 = self.textCursor()
@@ -1914,7 +1935,7 @@ class CodeEditor(TextEditBaseWidget):
         is_comment_or_whitespace = True
         at_least_one_comment = False
         for _line_nb in range(first_line, last_line+1):
-            text = unicode(cursor.block().text()).lstrip()
+            text = to_text_string(cursor.block().text()).lstrip()
             is_comment = text.startswith(self.comment_string)
             is_whitespace = (text == '')
             is_comment_or_whitespace *= (is_comment or is_whitespace)
@@ -1971,7 +1992,7 @@ class CodeEditor(TextEditBaseWidget):
     def unblockcomment(self):
         """Un-block comment current line or selection"""
         def __is_comment_bar(cursor):
-            return unicode(cursor.block().text()
+            return to_text_string(cursor.block().text()
                            ).startswith(self.__blockcomment_bar())
         # Finding first comment bar
         cursor1 = self.textCursor()
@@ -1984,7 +2005,7 @@ class CodeEditor(TextEditBaseWidget):
         if not __is_comment_bar(cursor1):
             return
         def __in_block_comment(cursor):
-            return unicode(cursor.block().text()).startswith('#')
+            return to_text_string(cursor.block().text()).startswith('#')
         # Finding second comment bar
         cursor2 = QTextCursor(cursor1)
         cursor2.movePosition(QTextCursor.NextBlock)
@@ -2071,7 +2092,7 @@ class CodeEditor(TextEditBaseWidget):
     def __unmatched_braces_in_line(self, text):
         block = self.textCursor().block()
         line_pos = block.position()
-        for pos,char in enumerate(text):
+        for pos, char in enumerate(text):
             if char in ['(', '[', '{']:
                 match = self.find_brace_match(line_pos+pos, char, forward=True)
                 if (match is None) or (match > line_pos+len(text)):
@@ -2123,7 +2144,7 @@ class CodeEditor(TextEditBaseWidget):
         cursor = self.textCursor()
         cursor.movePosition(QTextCursor.NextCharacter, 
                             QTextCursor.KeepAnchor)
-        next_char = unicode(cursor.selectedText())
+        next_char = to_text_string(cursor.selectedText())
         return next_char
 
     def __in_comment(self):
@@ -2246,7 +2267,7 @@ class CodeEditor(TextEditBaseWidget):
         key = event.key()
         ctrl = event.modifiers() & Qt.ControlModifier
         shift = event.modifiers() & Qt.ShiftModifier
-        text = unicode(event.text())
+        text = to_text_string(event.text())
         if text:
             self.__clear_occurences()
         if QToolTip.isVisible():
@@ -2349,7 +2370,7 @@ class CodeEditor(TextEditBaseWidget):
             cursor = self.textCursor()
             cursor.movePosition(QTextCursor.NextCharacter,
                                 QTextCursor.KeepAnchor)
-            text = unicode(cursor.selectedText())
+            text = to_text_string(cursor.selectedText())
             if text == {Qt.Key_ParenRight: ')', Qt.Key_BraceRight: '}',
                         Qt.Key_BracketRight: ']'}[key]:
                 cursor.clearSelection()
@@ -2361,7 +2382,8 @@ class CodeEditor(TextEditBaseWidget):
             leading_text = self.get_text('sol', 'cursor')
             if leading_text.lstrip() in ('else', 'finally'):
                 ind = lambda txt: len(txt)-len(txt.lstrip())
-                prevtxt = unicode(self.textCursor().block().previous().text())
+                prevtxt = to_text_string(self.textCursor(
+                                                ).block().previous().text())
                 if ind(leading_text) == ind(prevtxt):
                     self.unindent(force=True)
             TextEditBaseWidget.keyPressEvent(self, event)
@@ -2370,7 +2392,8 @@ class CodeEditor(TextEditBaseWidget):
             leading_text = self.get_text('sol', 'cursor')
             if leading_text.lstrip() in ('elif', 'except'):
                 ind = lambda txt: len(txt)-len(txt.lstrip())
-                prevtxt = unicode(self.textCursor().block().previous().text())
+                prevtxt = to_text_string(self.textCursor(
+                                                ).block().previous().text())
                 if ind(leading_text) == ind(prevtxt):
                     self.unindent(force=True)
             TextEditBaseWidget.keyPressEvent(self, event)
@@ -2396,7 +2419,7 @@ class CodeEditor(TextEditBaseWidget):
            event.modifiers() & Qt.ControlModifier:
             text = self.get_word_at(event.pos())
             if text and (self.is_python() or self.is_cython())\
-               and not sourcecode.is_keyword(unicode(text)):
+               and not sourcecode.is_keyword(to_text_string(text)):
                 if not self.__cursor_changed:
                     QApplication.setOverrideCursor(
                                                 QCursor(Qt.PointingHandCursor))
@@ -2429,10 +2452,10 @@ class CodeEditor(TextEditBaseWidget):
         if cursor is None:
             cursor = self.textCursor()
         position = cursor.position()
-        text = unicode(cursor.selectedText())
+        text = to_text_string(cursor.selectedText())
         if len(text) == 0:
             cursor.select(QTextCursor.WordUnderCursor)
-            text = unicode(cursor.selectedText())
+            text = to_text_string(cursor.selectedText())
         if self.go_to_definition_enabled and text is not None\
            and (self.is_python() or self.is_cython())\
            and not sourcecode.is_keyword(text):
@@ -2548,7 +2571,7 @@ def test(fname):
 
     from spyderlib.utils.codeanalysis import (check_with_pyflakes,
                                               check_with_pep8)
-    source_code = unicode(win.editor.toPlainText()).encode('utf-8')
+    source_code = to_text_string(win.editor.toPlainText())
     res = check_with_pyflakes(source_code, fname)#+\
 #          check_with_pep8(source_code, fname)
     win.editor.process_code_analysis(res)
diff --git a/spyderlib/widgets/sourcecode/syntaxhighlighters.py b/spyderlib/widgets/sourcecode/syntaxhighlighters.py
index 18d22f3..b47b88c 100644
--- a/spyderlib/widgets/sourcecode/syntaxhighlighters.py
+++ b/spyderlib/widgets/sourcecode/syntaxhighlighters.py
@@ -1,963 +1,968 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2009-2010 Pierre Raybaut
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""
-Editor widget syntax highlighters based on QtGui.QSyntaxHighlighter
-(Python syntax highlighting rules are inspired from idlelib)
-"""
-
-import re
-import keyword
-import __builtin__
-
-from spyderlib.qt.QtGui import (QColor, QApplication, QFont,
-                                QSyntaxHighlighter, QCursor, QTextCharFormat)
-from spyderlib.qt.QtCore import Qt
-
-
-#==============================================================================
-# Syntax highlighting color schemes
-#==============================================================================
-COLOR_SCHEME_KEYS = ("background", "currentline", "occurence",
-                     "ctrlclick", "sideareas", "matched_p", "unmatched_p",
-                     "normal", "keyword", "builtin", "definition",
-                     "comment", "string", "number", "instance")
-COLORS = {
-          'IDLE':
-          {#  Name          Color    Bold   Italic
-           "background":  "#ffffff",
-           "currentline": "#eeffdd",
-           "occurence":   "#e8f2fe",
-           "ctrlclick":   "#0000ff",
-           "sideareas":   "#efefef",
-           "matched_p":   "#99ff99",
-           "unmatched_p": "#ff9999",
-           "normal":     ("#000000", False, False),
-           "keyword":    ("#ff7700", True,  False),
-           "builtin":    ("#900090", False, False),
-           "definition": ("#0000ff", False, False),
-           "comment":    ("#dd0000", False, True),
-           "string":     ("#00aa00", False, False),
-           "number":     ("#924900", False, False),
-           "instance":   ("#777777", True,  True),
-           },
-          'Pydev':
-          {#  Name          Color    Bold   Italic
-           "background":  "#ffffff",
-           "currentline": "#e8f2fe",
-           "occurence":   "#ffff99",
-           "ctrlclick":   "#0000ff",
-           "sideareas":   "#efefef",
-           "matched_p":   "#99ff99",
-           "unmatched_p": "#ff9999",
-           "normal":     ("#000000", False, False),
-           "keyword":    ("#0000ff", False, False),
-           "builtin":    ("#900090", False, False),
-           "definition": ("#000000", True,  False),
-           "comment":    ("#c0c0c0", False, False),
-           "string":     ("#00aa00", False, True),
-           "number":     ("#800000", False, False),
-           "instance":   ("#000000", False, True),
-           },
-          'Emacs':
-          {#  Name          Color    Bold   Italic
-           "background":  "#000000",
-           "currentline": "#2b2b43",
-           "occurence":   "#abab67",
-           "ctrlclick":   "#0000ff",
-           "sideareas":   "#555555",
-           "matched_p":   "#009800",
-           "unmatched_p": "#c80000",
-           "normal":     ("#ffffff", False, False),
-           "keyword":    ("#3c51e8", False, False),
-           "builtin":    ("#900090", False, False),
-           "definition": ("#ff8040", True,  False),
-           "comment":    ("#005100", False, False),
-           "string":     ("#00aa00", False, True),
-           "number":     ("#800000", False, False),
-           "instance":   ("#ffffff", False, True),
-           },
-          'Scintilla':
-          {#  Name          Color    Bold   Italic
-           "background":  "#ffffff",
-           "currentline": "#eeffdd",
-           "occurence":   "#ffff99",
-           "ctrlclick":   "#0000ff",
-           "sideareas":   "#efefef",
-           "matched_p":   "#99ff99",
-           "unmatched_p": "#ff9999",
-           "normal":     ("#000000", False, False),
-           "keyword":    ("#00007f", True,  False),
-           "builtin":    ("#000000", False, False),
-           "definition": ("#007f7f", True,  False),
-           "comment":    ("#007f00", False, False),
-           "string":     ("#7f007f", False, False),
-           "number":     ("#007f7f", False, False),
-           "instance":   ("#000000", False, True),
-           },
-          'Spyder':
-          {#  Name          Color    Bold   Italic
-           "background":  "#ffffff",
-           "currentline": "#feefff",
-           "occurence":   "#ffff99",
-           "ctrlclick":   "#0000ff",
-           "sideareas":   "#efefef",
-           "matched_p":   "#99ff99",
-           "unmatched_p": "#ff9999",
-           "normal":     ("#000000", False, False),
-           "keyword":    ("#0000ff", False, False),
-           "builtin":    ("#900090", False, False),
-           "definition": ("#000000", True,  False),
-           "comment":    ("#adadad", False, True),
-           "string":     ("#00aa00", False, False),
-           "number":     ("#800000", False, False),
-           "instance":   ("#924900", False, True),
-           },
-          'Spyder/Dark':
-          {#  Name          Color    Bold   Italic
-           "background":  "#131926",
-           "currentline": "#2b2b43",
-           "occurence":   "#abab67",
-           "ctrlclick":   "#0000ff",
-           "sideareas":   "#282828",
-           "matched_p":   "#009800",
-           "unmatched_p": "#c80000",
-           "normal":     ("#ffffff", False, False),
-           "keyword":    ("#558eff", False, False),
-           "builtin":    ("#aa00aa", False, False),
-           "definition": ("#ffffff", True,  False),
-           "comment":    ("#7f7f7f", False, False),
-           "string":     ("#11a642", False, True),
-           "number":     ("#c80000", False, False),
-           "instance":   ("#be5f00", False, True),
-           },
-           'Monokai':
-          {#  Name          Color    Bold   Italic
-           "background":  "#2a2b24",
-           "currentline": "#484848",
-           "occurence":   "#666666",
-           "ctrlclick":   "#0000ff",
-           "sideareas":   "#2a2b24",
-           "matched_p":   "#688060",
-           "unmatched_p": "#bd6e76",
-           "normal":     ("#ddddda", False, False),
-           "keyword":    ("#f92672", False, False),
-           "builtin":    ("#ae81ff", False, False),
-           "definition": ("#a6e22e", False, False),
-           "comment":    ("#75715e", False, True),
-           "string":     ("#e6db74", False, False),
-           "number":     ("#ae81ff", False, False),
-           "instance":   ("#ddddda", False, True),
-           },
-           'Zenburn':
-          {#  Name          Color    Bold   Italic
-           "background":  "#3f3f3f",
-           "currentline": "#333333",
-           "occurence":   "#7a738f",
-           "ctrlclick":   "#0000ff",
-           "sideareas":   "#3f3f3f",
-           "matched_p":   "#688060",
-           "unmatched_p": "#bd6e76",
-           "normal":     ("#dcdccc", False, False),
-           "keyword":    ("#dfaf8f", True,  False),
-           "builtin":    ("#efef8f", False, False),
-           "definition": ("#efef8f", False, False),
-           "comment":    ("#7f9f7f", False, True),
-           "string":     ("#cc9393", False, False),
-           "number":     ("#8cd0d3", False, False),
-           "instance":   ("#dcdccc", False, True),
-           },
-          }
-COLOR_SCHEME_NAMES = COLORS.keys()
-
-class BaseSH(QSyntaxHighlighter):
-    """Base Syntax Highlighter Class"""
-    # Syntax highlighting rules:
-    PROG = None
-    # Syntax highlighting states (from one text block to another):
-    NORMAL = 0
-    def __init__(self, parent, font=None, color_scheme='Spyder'):
-        QSyntaxHighlighter.__init__(self, parent)
-        
-        self.outlineexplorer_data = {}
-        
-        self.font = font
-        self._check_color_scheme(color_scheme)
-        if isinstance(color_scheme, basestring):
-            self.color_scheme = COLORS[color_scheme]
-        else:
-            self.color_scheme = color_scheme
-        
-        self.background_color = None
-        self.currentline_color = None
-        self.occurence_color = None
-        self.ctrlclick_color = None
-        self.sideareas_color = None
-        self.matched_p_color = None
-        self.unmatched_p_color = None
-
-        self.formats = None
-        self.setup_formats(font)
-        
-    def get_background_color(self):
-        return QColor(self.background_color)
-        
-    def get_foreground_color(self):
-        """Return foreground ('normal' text) color"""
-        return self.formats["normal"].foreground().color()
-        
-    def get_currentline_color(self):
-        return QColor(self.currentline_color)
-        
-    def get_occurence_color(self):
-        return QColor(self.occurence_color)
-    
-    def get_ctrlclick_color(self):
-        return QColor(self.ctrlclick_color)
-    
-    def get_sideareas_color(self):
-        return QColor(self.sideareas_color)
-    
-    def get_matched_p_color(self):
-        return QColor(self.matched_p_color)
-    
-    def get_unmatched_p_color(self):
-        return QColor(self.unmatched_p_color)
-    
-    def get_color_name(self, fmt):
-        """Return color name assigned to a given format"""
-        return self.formats[fmt].foreground().color().name()
-
-    def setup_formats(self, font=None):
-        base_format = QTextCharFormat()
-        if font is not None:
-            self.font = font
-        if self.font is not None:
-            base_format.setFont(self.font)
-        self.formats = {}
-        colors = self.color_scheme.copy()
-        self.background_color = colors.pop("background")
-        self.currentline_color = colors.pop("currentline")
-        self.occurence_color = colors.pop("occurence")
-        self.ctrlclick_color = colors.pop("ctrlclick")
-        self.sideareas_color = colors.pop("sideareas")
-        self.matched_p_color = colors.pop("matched_p")
-        self.unmatched_p_color = colors.pop("unmatched_p")
-        for name, (color, bold, italic) in colors.iteritems():
-            format = QTextCharFormat(base_format)
-            format.setForeground(QColor(color))
-            format.setBackground(QColor(self.background_color))
-            if bold:
-                format.setFontWeight(QFont.Bold)
-            format.setFontItalic(italic)
-            self.formats[name] = format
-
-    def _check_color_scheme(self, color_scheme):
-        if isinstance(color_scheme, basestring):
-            assert color_scheme in COLOR_SCHEME_NAMES
-        else:
-            assert all([key in color_scheme for key in COLOR_SCHEME_KEYS])
-
-    def set_color_scheme(self, color_scheme):
-        self._check_color_scheme(color_scheme)
-        if isinstance(color_scheme, basestring):
-            self.color_scheme = COLORS[color_scheme]
-        else:
-            self.color_scheme = color_scheme
-        self.setup_formats()
-        self.rehighlight()
-
-    def highlightBlock(self, text):
-        raise NotImplementedError
-            
-    def get_outlineexplorer_data(self):
-        return self.outlineexplorer_data
-
-    def rehighlight(self):
-        self.outlineexplorer_data = {}
-        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
-        QSyntaxHighlighter.rehighlight(self)
-        QApplication.restoreOverrideCursor()
-
-
-class TextSH(BaseSH):
-    """Simple Text Syntax Highlighter Class (do nothing)"""
-    def highlightBlock(self, text):
-        pass
-
-
-class GenericSH(BaseSH):
-    """Generic Syntax Highlighter"""
-    # Syntax highlighting rules:
-    PROG = None  # to be redefined in child classes
-    def highlightBlock(self, text):
-        text = unicode(text)
-        self.setFormat(0, len(text), self.formats["normal"])
-        
-        match = self.PROG.search(text)
-        index = 0
-        while match:
-            for key, value in match.groupdict().items():
-                if value:
-                    start, end = match.span(key)
-                    index += end-start
-                    self.setFormat(start, end-start, self.formats[key])
-                    
-            match = self.PROG.search(text, match.end())
-
-
-#==============================================================================
-# Python syntax highlighter
-#==============================================================================
-def any(name, alternates):
-    "Return a named group pattern matching list of alternates."
-    return "(?P<%s>" % name + "|".join(alternates) + ")"
-
-def make_python_patterns(additional_keywords=[], additional_builtins=[]):
-    "Strongly inspired from idlelib.ColorDelegator.make_pat"
-    kw = r"\b" + any("keyword", keyword.kwlist+additional_keywords) + r"\b"
-    builtinlist = [str(name) for name in dir(__builtin__)
-                   if not name.startswith('_')]+additional_builtins
-    builtin = r"([^.'\"\\#]\b|^)" + any("builtin", builtinlist) + r"\b"
-    comment = any("comment", [r"#[^\n]*"])
-    instance = any("instance", [r"\bself\b"])
-    number = any("number",
-                 [r"\b[+-]?[0-9]+[lLjJ]?\b",
-                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
-                  r"\b[+-]?0[oO][0-7]+[lL]?\b",
-                  r"\b[+-]?0[bB][01]+[lL]?\b",
-                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?[jJ]?\b"])
-    sqstring =     r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
-    dqstring =     r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
-    uf_sqstring =  r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*(\\)$(?!')$"
-    uf_dqstring =  r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*(\\)$(?!")$'
-    sq3string =    r"(\b[rRuU])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?"
-    dq3string =    r'(\b[rRuU])?"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?'
-    uf_sq3string = r"(\b[rRuU])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(\\)?(?!''')$"
-    uf_dq3string = r'(\b[rRuU])?"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(\\)?(?!""")$'
-    string = any("string", [sq3string, dq3string, sqstring, dqstring])
-    ufstring1 = any("uf_sqstring", [uf_sqstring])
-    ufstring2 = any("uf_dqstring", [uf_dqstring])
-    ufstring3 = any("uf_sq3string", [uf_sq3string])
-    ufstring4 = any("uf_dq3string", [uf_dq3string])
-    return "|".join([instance, kw, builtin, comment,
-                     ufstring1, ufstring2, ufstring3, ufstring4, string,
-                     number, any("SYNC", [r"\n"])])
-
-class OutlineExplorerData(object):
-    CLASS, FUNCTION, STATEMENT, COMMENT = range(4)
-    def __init__(self):
-        self.text = None
-        self.fold_level = None
-        self.def_type = None
-        self.def_name = None
-        
-    def is_not_class_nor_function(self):
-        return self.def_type not in (self.CLASS, self.FUNCTION)
-    
-    def is_comment(self):
-        return self.def_type == self.COMMENT
-        
-    def get_class_name(self):
-        if self.def_type == self.CLASS:
-            return self.def_name
-        
-    def get_function_name(self):
-        if self.def_type == self.FUNCTION:
-            return self.def_name
-    
-class PythonSH(BaseSH):
-    """Python Syntax Highlighter"""
-    # Syntax highlighting rules:
-    PROG = re.compile(make_python_patterns(), re.S)
-    IDPROG = re.compile(r"\s+(\w+)", re.S)
-    ASPROG = re.compile(r".*?\b(as)\b")
-    # Syntax highlighting states (from one text block to another):
-    (NORMAL, INSIDE_SQ3STRING, INSIDE_DQ3STRING,
-     INSIDE_SQSTRING, INSIDE_DQSTRING) = range(5)
-    DEF_TYPES = {"def": OutlineExplorerData.FUNCTION,
-                 "class": OutlineExplorerData.CLASS}
-    # Comments suitable for Outline Explorer
-    OECOMMENT = re.compile('^(# ?--[-]+|##[#]+ )[ -]*[^- ]+')
-    
-    def __init__(self, parent, font=None, color_scheme='Spyder'):
-        BaseSH.__init__(self, parent, font, color_scheme)
-        self.import_statements = {}
-
-    def highlightBlock(self, text):
-        text = unicode(text)
-        prev_state = self.previousBlockState()
-        if prev_state == self.INSIDE_DQ3STRING:
-            offset = -4
-            text = r'""" '+text
-        elif prev_state == self.INSIDE_SQ3STRING:
-            offset = -4
-            text = r"''' "+text
-        elif prev_state == self.INSIDE_DQSTRING:
-            offset = -2
-            text = r'" '+text
-        elif prev_state == self.INSIDE_SQSTRING:
-            offset = -2
-            text = r"' "+text
-        else:
-            offset = 0
-            prev_state = self.NORMAL
-        
-        oedata = None
-        import_stmt = None
-
-        self.setFormat(0, len(text), self.formats["normal"])
-        
-        state = self.NORMAL
-        match = self.PROG.search(text)
-        while match:
-            for key, value in match.groupdict().items():
-                if value:
-                    start, end = match.span(key)
-                    start = max([0, start+offset])
-                    end = max([0, end+offset])
-                    if key == "uf_sq3string":
-                        self.setFormat(start, end-start,
-                                       self.formats["string"])
-                        state = self.INSIDE_SQ3STRING
-                    elif key == "uf_dq3string":
-                        self.setFormat(start, end-start,
-                                       self.formats["string"])
-                        state = self.INSIDE_DQ3STRING
-                    elif key == "uf_sqstring":
-                        self.setFormat(start, end-start,
-                                       self.formats["string"])
-                        state = self.INSIDE_SQSTRING
-                    elif key == "uf_dqstring":
-                        self.setFormat(start, end-start,
-                                       self.formats["string"])
-                        state = self.INSIDE_DQSTRING
-                    else:
-                        self.setFormat(start, end-start, self.formats[key])
-                        if key == "comment":
-                            if self.OECOMMENT.match(text.lstrip()):
-                                oedata = OutlineExplorerData()
-                                oedata.text = unicode(text).strip()
-                                oedata.fold_level = start
-                                oedata.def_type = OutlineExplorerData.COMMENT
-                                oedata.def_name = text.strip()
-                        elif key == "keyword":
-                            if value in ("def", "class"):
-                                match1 = self.IDPROG.match(text, end)
-                                if match1:
-                                    start1, end1 = match1.span(1)
-                                    self.setFormat(start1, end1-start1,
-                                                   self.formats["definition"])
-                                    oedata = OutlineExplorerData()
-                                    oedata.text = unicode(text)
-                                    oedata.fold_level = start
-                                    oedata.def_type = self.DEF_TYPES[
-                                                                unicode(value)]
-                                    oedata.def_name = text[start1:end1]
-                            elif value in ("elif", "else", "except", "finally",
-                                           "for", "if", "try", "while",
-                                           "with"):
-                                if text.lstrip().startswith(value):
-                                    oedata = OutlineExplorerData()
-                                    oedata.text = unicode(text).strip()
-                                    oedata.fold_level = start
-                                    oedata.def_type = \
-                                        OutlineExplorerData.STATEMENT
-                                    oedata.def_name = text.strip()
-                            elif value == "import":
-                                import_stmt = text.strip()
-                                # color all the "as" words on same line, except
-                                # if in a comment; cheap approximation to the
-                                # truth
-                                if '#' in text:
-                                    endpos = text.index('#')
-                                else:
-                                    endpos = len(text)
-                                while True:
-                                    match1 = self.ASPROG.match(text, end,
-                                                               endpos)
-                                    if not match1:
-                                        break
-                                    start, end = match1.span(1)
-                                    self.setFormat(start, end-start,
-                                                   self.formats["keyword"])
-                    
-            match = self.PROG.search(text, match.end())
-
-        self.setCurrentBlockState(state)
-        
-        if oedata is not None:
-            block_nb = self.currentBlock().blockNumber()
-            self.outlineexplorer_data[block_nb] = oedata
-        if import_stmt is not None:
-            block_nb = self.currentBlock().blockNumber()
-            self.import_statements[block_nb] = import_stmt
-            
-    def get_import_statements(self):
-        return self.import_statements.values()
-            
-    def rehighlight(self):
-        self.import_statements = {}
-        BaseSH.rehighlight(self)
-
-
-#==============================================================================
-# Cython syntax highlighter
-#==============================================================================
-C_TYPES = 'bool char double enum float int long mutable short signed struct unsigned void'
-
-class CythonSH(PythonSH):
-    """Cython Syntax Highlighter"""
-    ADDITIONAL_KEYWORDS = ["cdef", "ctypedef", "cpdef", "inline", "cimport",
-                           "DEF"]
-    ADDITIONAL_BUILTINS = C_TYPES.split()
-    PROG = re.compile(make_python_patterns(ADDITIONAL_KEYWORDS,
-                                           ADDITIONAL_BUILTINS), re.S)
-    IDPROG = re.compile(r"\s+([\w\.]+)", re.S)
-
-
-#==============================================================================
-# C/C++ syntax highlighter
-#==============================================================================
-C_KEYWORDS1 = 'and and_eq bitand bitor break case catch const const_cast continue default delete do dynamic_cast else explicit export extern for friend goto if inline namespace new not not_eq operator or or_eq private protected public register reinterpret_cast return sizeof static static_cast switch template throw try typedef typeid typename union using virtual while xor xor_eq'
-C_KEYWORDS2 = 'a addindex addtogroup anchor arg attention author b brief bug c class code date def defgroup deprecated dontinclude e em endcode endhtmlonly ifdef endif endlatexonly endlink endverbatim enum example exception f$ file fn hideinitializer htmlinclude htmlonly if image include ingroup internal invariant interface latexonly li line link mainpage name namespace nosubgrouping note overload p page par param post pre ref relates remarks return retval sa section see showinitializer  [...]
-C_KEYWORDS3 = 'asm auto class compl false true volatile wchar_t'
-
-def make_generic_c_patterns(keywords, builtins,
-                            instance=None, define=None, comment=None):
-    "Strongly inspired from idlelib.ColorDelegator.make_pat"
-    kw = r"\b" + any("keyword", keywords.split()) + r"\b"
-    builtin = r"\b" + any("builtin", builtins.split()+C_TYPES.split()) + r"\b"
-    if comment is None:
-        comment = any("comment", [r"//[^\n]*",r"\/\*(.*?)\*\/"])
-    comment_start = any("comment_start", [r"\/\*"])
-    comment_end = any("comment_end", [r"\*\/"])
-    if instance is None:
-        instance = any("instance", [r"\bthis\b"])
-    number = any("number",
-                 [r"\b[+-]?[0-9]+[lL]?\b",
-                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
-                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"])
-    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
-    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
-    string = any("string", [sqstring, dqstring])
-    if define is None:
-        define = any("define", [r"#[^\n]*"])
-    return "|".join([instance, kw, comment, string, number,
-                     comment_start, comment_end, builtin,
-                     define, any("SYNC", [r"\n"])])
-
-def make_cpp_patterns():
-    return make_generic_c_patterns(C_KEYWORDS1+' '+C_KEYWORDS2, C_KEYWORDS3)
-
-class CppSH(BaseSH):
-    """C/C++ Syntax Highlighter"""
-    # Syntax highlighting rules:
-    PROG = re.compile(make_cpp_patterns(), re.S)
-    # Syntax highlighting states (from one text block to another):
-    NORMAL = 0
-    INSIDE_COMMENT = 1
-    def __init__(self, parent, font=None, color_scheme=None):
-        BaseSH.__init__(self, parent, font, color_scheme)
-
-    def highlightBlock(self, text):
-        text = unicode(text)
-        inside_comment = self.previousBlockState() == self.INSIDE_COMMENT
-        self.setFormat(0, len(text),
-                       self.formats["comment" if inside_comment else "normal"])
-        
-        match = self.PROG.search(text)
-        index = 0
-        while match:
-            for key, value in match.groupdict().items():
-                if value:
-                    start, end = match.span(key)
-                    index += end-start
-                    if key == "comment_start":
-                        inside_comment = True
-                        self.setFormat(start, len(text)-start,
-                                       self.formats["comment"])
-                    elif key == "comment_end":
-                        inside_comment = False
-                        self.setFormat(start, end-start,
-                                       self.formats["comment"])
-                    elif inside_comment:
-                        self.setFormat(start, end-start,
-                                       self.formats["comment"])
-                    elif key == "define":
-                        self.setFormat(start, end-start,
-                                       self.formats["number"])
-                    else:
-                        self.setFormat(start, end-start, self.formats[key])
-                    
-            match = self.PROG.search(text, match.end())
-
-        last_state = self.INSIDE_COMMENT if inside_comment else self.NORMAL
-        self.setCurrentBlockState(last_state)
-
-
-def make_opencl_patterns():
-    # Keywords:
-    kwstr1 = 'cl_char cl_uchar cl_short cl_ushort cl_int cl_uint cl_long cl_ulong cl_half cl_float cl_double cl_platform_id cl_device_id cl_context cl_command_queue cl_mem cl_program cl_kernel cl_event cl_sampler cl_bool cl_bitfield cl_device_type cl_platform_info cl_device_info cl_device_address_info cl_device_fp_config cl_device_mem_cache_type cl_device_local_mem_type cl_device_exec_capabilities cl_command_queue_properties cl_context_properties cl_context_info cl_command_queue_info cl_ [...]
-    # Constants:
-    kwstr2 = 'CL_FALSE, CL_TRUE, CL_PLATFORM_PROFILE, CL_PLATFORM_VERSION, CL_PLATFORM_NAME, CL_PLATFORM_VENDOR, CL_PLATFORM_EXTENSIONS, CL_DEVICE_TYPE_DEFAULT , CL_DEVICE_TYPE_CPU, CL_DEVICE_TYPE_GPU, CL_DEVICE_TYPE_ACCELERATOR, CL_DEVICE_TYPE_ALL, CL_DEVICE_TYPE, CL_DEVICE_VENDOR_ID, CL_DEVICE_MAX_COMPUTE_UNITS, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, CL_DEVICE_MAX_WORK_GROUP_SIZE, CL_DEVICE_MAX_WORK_ITEM_SIZES, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, [...]
-    # Functions:
-    builtins = 'clGetPlatformIDs, clGetPlatformInfo, clGetDeviceIDs, clGetDeviceInfo, clCreateContext, clCreateContextFromType, clReleaseContext, clGetContextInfo, clCreateCommandQueue, clRetainCommandQueue, clReleaseCommandQueue, clGetCommandQueueInfo, clSetCommandQueueProperty, clCreateBuffer, clCreateImage2D, clCreateImage3D, clRetainMemObject, clReleaseMemObject, clGetSupportedImageFormats, clGetMemObjectInfo, clGetImageInfo, clCreateSampler, clRetainSampler, clReleaseSampler, clGetS [...]
-    # Qualifiers:
-    qualifiers = '__global __local __constant __private __kernel'
-    keyword_list = C_KEYWORDS1+' '+C_KEYWORDS2+' '+kwstr1+' '+kwstr2
-    builtin_list = C_KEYWORDS3+' '+builtins+' '+qualifiers
-    return make_generic_c_patterns(keyword_list, builtin_list)
-
-class OpenCLSH(CppSH):
-    """OpenCL Syntax Highlighter"""
-    PROG = re.compile(make_opencl_patterns(), re.S)
-
-
-#==============================================================================
-# Fortran Syntax Highlighter
-#==============================================================================
-
-def make_fortran_patterns():
-    "Strongly inspired from idlelib.ColorDelegator.make_pat"
-    kwstr = 'access action advance allocatable allocate apostrophe assign assignment associate asynchronous backspace bind blank blockdata call case character class close common complex contains continue cycle data deallocate decimal delim default dimension direct do dowhile double doubleprecision else elseif elsewhere encoding end endassociate endblockdata enddo endfile endforall endfunction endif endinterface endmodule endprogram endselect endsubroutine endtype endwhere entry eor equiv [...]
-    bistr1 = 'abs achar acos acosd adjustl adjustr aimag aimax0 aimin0 aint ajmax0 ajmin0 akmax0 akmin0 all allocated alog alog10 amax0 amax1 amin0 amin1 amod anint any asin asind associated atan atan2 atan2d atand bitest bitl bitlr bitrl bjtest bit_size bktest break btest cabs ccos cdabs cdcos cdexp cdlog cdsin cdsqrt ceiling cexp char clog cmplx conjg cos cosd cosh count cpu_time cshift csin csqrt dabs dacos dacosd dasin dasind datan datan2 datan2d datand date date_and_time dble dcmplx [...]
-    bistr2 = 'cdabs cdcos cdexp cdlog cdsin cdsqrt cotan cotand dcmplx dconjg dcotan dcotand decode dimag dll_export dll_import doublecomplex dreal dvchk encode find flen flush getarg getcharqq getcl getdat getenv gettim hfix ibchng identifier imag int1 int2 int4 intc intrup invalop iostat_msg isha ishc ishl jfix lacfar locking locnear map nargs nbreak ndperr ndpexc offset ovefl peekcharqq precfill prompt qabs qacos qacosd qasin qasind qatan qatand qatan2 qcmplx qconjg qcos qcosd qcosh q [...]
-    kw = r"\b" + any("keyword", kwstr.split()) + r"\b"
-    builtin = r"\b" + any("builtin", bistr1.split()+bistr2.split()) + r"\b"
-    comment = any("comment", [r"\![^\n]*"])
-    number = any("number",
-                 [r"\b[+-]?[0-9]+[lL]?\b",
-                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
-                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"])
-    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
-    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
-    string = any("string", [sqstring, dqstring])
-    return "|".join([kw, comment, string, number, builtin,
-                     any("SYNC", [r"\n"])])
-
-class FortranSH(BaseSH):
-    """Fortran Syntax Highlighter"""
-    # Syntax highlighting rules:
-    PROG = re.compile(make_fortran_patterns(), re.S|re.I)
-    IDPROG = re.compile(r"\s+(\w+)", re.S)
-    # Syntax highlighting states (from one text block to another):
-    NORMAL = 0
-    def __init__(self, parent, font=None, color_scheme=None):
-        BaseSH.__init__(self, parent, font, color_scheme)
-
-    def highlightBlock(self, text):
-        text = unicode(text)
-        self.setFormat(0, len(text), self.formats["normal"])
-        
-        match = self.PROG.search(text)
-        index = 0
-        while match:
-            for key, value in match.groupdict().items():
-                if value:
-                    start, end = match.span(key)
-                    index += end-start
-                    self.setFormat(start, end-start, self.formats[key])
-                    if value.lower() in ("subroutine", "module", "function"):
-                        match1 = self.IDPROG.match(text, end)
-                        if match1:
-                            start1, end1 = match1.span(1)
-                            self.setFormat(start1, end1-start1,
-                                           self.formats["definition"])
-                    
-            match = self.PROG.search(text, match.end())
-
-class Fortran77SH(FortranSH):
-    """Fortran 77 Syntax Highlighter"""
-    def highlightBlock(self, text):
-        text = unicode(text)
-        if text.startswith(("c", "C")):
-            self.setFormat(0, len(text), self.formats["comment"])
-        else:
-            FortranSH.highlightBlock(self, text)
-            self.setFormat(0, 5, self.formats["comment"])
-            self.setFormat(73, max([73, len(text)]),
-                           self.formats["comment"])
-
-
-#==============================================================================
-# IDL highlighter
-#
-# Contribution from Stuart Mumford (Littlemumford) - 02/02/2012
-# See Issue #850: http://code.google.com/p/spyderlib/issues/detail?id=850
-#==============================================================================
-def make_idl_patterns():
-    "Strongly inspired from idlelib.ColorDelegator.make_pat"
-    kwstr = 'begin of pro function endfor endif endwhile endrep endcase endswitch end if then else for do while repeat until break case switch common continue exit return goto help message print read retall stop'
-    bistr1 = 'a_correlate abs acos adapt_hist_equal alog alog10 amoeba arg_present arra_equal array_indices ascii_template asin assoc atan beseli beselj besel k besely beta bilinear bin_date binary_template dinfgen dinomial blk_con broyden bytarr byte bytscl c_correlate call_external call_function ceil chebyshev check_math chisqr_cvf chisqr_pdf choldc cholsol cindgen clust_wts cluster color_quan colormap_applicable comfit complex complexarr complexround compute_mesh_normals cond congrid  [...]
-    bistr2 = 'annotate arrow axis bar_plot blas_axpy box_cursor breakpoint byteorder caldata calendar call_method call_procedure catch cd cir_3pnt close color_convert compile_opt constrained_min contour copy_lun cpu create_view cursor cw_animate_getp cw_animate_load cw_animate_run cw_light_editor_get cw_light_editor_set cw_palette_editor_get cw_palette_editor_set define_key define_msgblk define_msgblk_from_file defsysv delvar device dfpmin dissolve dlm_load doc_librar draw_roi efont empt [...]
-    kw = r"\b" + any("keyword", kwstr.split()) + r"\b"
-    builtin = r"\b" + any("builtin", bistr1.split()+bistr2.split()) + r"\b"
-    comment = any("comment", [r"\;[^\n]*"])
-    number = any("number",
-                 [r"\b[+-]?[0-9]+[lL]?\b",
-                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
-		  r"\b\.[0-9]d0|\.d0+[lL]?\b",
-                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"])
-    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
-    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
-    string = any("string", [sqstring, dqstring])
-    return "|".join([kw, comment, string, number, builtin,
-                     any("SYNC", [r"\n"])])
-
-class IdlSH(GenericSH):
-    """IDL Syntax Highlighter"""
-    PROG = re.compile(make_idl_patterns(), re.S|re.I)
-
-
-#==============================================================================
-# Diff/Patch highlighter
-#==============================================================================
-
-class DiffSH(BaseSH):
-    """Simple Diff/Patch Syntax Highlighter Class"""
-    def highlightBlock(self, text):
-        text = unicode(text)
-        if text.startswith("+++"):
-            self.setFormat(0, len(text), self.formats["keyword"])
-        elif text.startswith("---"):
-            self.setFormat(0, len(text), self.formats["keyword"])
-        elif text.startswith("+"):
-            self.setFormat(0, len(text), self.formats["string"])
-        elif text.startswith("-"):
-            self.setFormat(0, len(text), self.formats["number"])
-        elif text.startswith("@"):
-            self.setFormat(0, len(text), self.formats["builtin"])
-
-
-#==============================================================================
-# NSIS highlighter
-#==============================================================================
-
-def make_nsis_patterns():
-    "Strongly inspired from idlelib.ColorDelegator.make_pat"
-    kwstr1 = 'Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exec ExecShell ExecWait Exch ExpandEnvStrings File FileBufSize FileClose  [...]
-    kwstr2 = 'all alwaysoff ARCHIVE auto both bzip2 components current custom details directory false FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_HIDDEN FILE_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_READONLY FILE_ATTRIBUTE_SYSTEM FILE_ATTRIBUTE_TEMPORARY force grey HIDDEN hide IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES ifdiff ifnewer instfiles instfiles lastused leave left level license listonly lzma manual MB_ABORTRETRYIGNORE MB_DEFBUTTON1 MB_DEFBUTTON2 MB_DEFBUTTON3 MB_D [...]
-    kwstr3 = 'MUI_ABORTWARNING MUI_ABORTWARNING_CANCEL_DEFAULT MUI_ABORTWARNING_TEXT MUI_BGCOLOR MUI_COMPONENTSPAGE_CHECKBITMAP MUI_COMPONENTSPAGE_NODESC MUI_COMPONENTSPAGE_SMALLDESC MUI_COMPONENTSPAGE_TEXT_COMPLIST MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE MUI_COMPONENTSPAGE_TEXT_INSTTYPE MUI_COMPONENTSPAGE_TEXT_TOP MUI_CUSTOMFUNCTION_ABORT MUI_CUSTOMFUNCTION_GUIINIT MUI_CUSTOMFUNCTION_UNABORT MUI_CUSTOMFUNCTION_UNGUIINIT MUI_DESCRIPTION_TEXT MUI [...]
-    bistr = 'addincludedir addplugindir AndIf cd define echo else endif error execute If ifdef ifmacrodef ifmacrondef ifndef include insertmacro macro macroend onGUIEnd onGUIInit onInit onInstFailed onInstSuccess onMouseOverSection onRebootFailed onSelChange onUserAbort onVerifyInstDir OrIf packhdr system undef verbose warning'
-    instance = any("instance", [r'\$\{.*?\}', r'\$[A-Za-z0-9\_]*'])
-    define = any("define", [r"\![^\n]*"])
-    comment = any("comment", [r"\;[^\n]*", r"\#[^\n]*", r"\/\*(.*?)\*\/"])
-    return make_generic_c_patterns(kwstr1+' '+kwstr2+' '+kwstr3, bistr,
-                                   instance=instance, define=define,
-                                   comment=comment)
-
-class NsisSH(CppSH):
-    """NSIS Syntax Highlighter"""
-    # Syntax highlighting rules:
-    PROG = re.compile(make_nsis_patterns(), re.S)
-
-
-#==============================================================================
-# gettext highlighter
-#==============================================================================
-
-def make_gettext_patterns():
-    "Strongly inspired from idlelib.ColorDelegator.make_pat"
-    kwstr = 'msgid msgstr'
-    kw = r"\b" + any("keyword", kwstr.split()) + r"\b"
-    fuzzy = any("builtin", [r"#,[^\n]*"])
-    links = any("normal", [r"#:[^\n]*"])
-    comment = any("comment", [r"#[^\n]*"])
-    number = any("number",
-                 [r"\b[+-]?[0-9]+[lL]?\b",
-                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
-                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"])
-    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
-    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
-    string = any("string", [sqstring, dqstring])
-    return "|".join([kw, string, number, fuzzy, links, comment,
-                     any("SYNC", [r"\n"])])
-
-class GetTextSH(GenericSH):
-    """gettext Syntax Highlighter"""
-    # Syntax highlighting rules:
-    PROG = re.compile(make_gettext_patterns(), re.S)
-
-
-#==============================================================================
-# HTML highlighter
-#==============================================================================
-
-class BaseWebSH(BaseSH):
-    """Base class for CSS and HTML syntax highlighters"""
-    NORMAL  = 0
-    COMMENT = 1
-    
-    def __init__(self, parent, font=None, color_scheme=None):
-        BaseSH.__init__(self, parent, font, color_scheme)
-    
-    def highlightBlock(self, text):
-        text = unicode(text)
-        previous_state = self.previousBlockState()
-        
-        if previous_state == self.COMMENT:
-            self.setFormat(0, len(text), self.formats["comment"])
-        else:
-            previous_state = self.NORMAL
-            self.setFormat(0, len(text), self.formats["normal"])
-        
-        self.setCurrentBlockState(previous_state)
-        match = self.PROG.search(text)        
-
-        match_count = 0
-        n_characters = len(text)
-        # There should never be more matches than characters in the text.
-        while match and match_count < n_characters:
-            match_dict = match.groupdict()
-            for key, value in match_dict.items():
-                if value:
-                    start, end = match.span(key)
-                    if previous_state == self.COMMENT:
-                        if key == "multiline_comment_end":
-                            self.setCurrentBlockState(self.NORMAL)
-                            self.setFormat(end, len(text),
-                                           self.formats["normal"])
-                        else:
-                            self.setCurrentBlockState(self.COMMENT)
-                            self.setFormat(0, len(text),
-                                           self.formats["comment"])
-                    else:
-                        if key == "multiline_comment_start":
-                            self.setCurrentBlockState(self.COMMENT)
-                            self.setFormat(start, len(text),
-                                           self.formats["comment"])
-                        else:
-                            self.setCurrentBlockState(self.NORMAL)
-                            self.setFormat(start, end-start,
-                                           self.formats[key])
-            
-            match = self.PROG.search(text, match.end())
-            match_count += 1
-
-def make_html_patterns():
-    """Strongly inspired from idlelib.ColorDelegator.make_pat """
-    tags = any("builtin", [r"<",r"[\?/]?>", r"(?<=<).*?(?=[ >])"])
-    keywords = any("keyword", [r" [\w:-]*?(?==)"])
-    string = any("string", [r'".*?"'])
-    comment = any("comment", [r"<!--.*?-->"])
-    multiline_comment_start = any("multiline_comment_start", [r"<!--"])
-    multiline_comment_end = any("multiline_comment_end", [r"-->"])
-    return "|".join([comment, multiline_comment_start,
-                     multiline_comment_end, tags, keywords, string]) 
-    
-class HtmlSH(BaseWebSH):
-    """HTML Syntax Highlighter"""
-    PROG = re.compile(make_html_patterns(), re.S)
-
-
-#==============================================================================
-# Pygments based omni-parser
-#==============================================================================
-
-# IMPORTANT NOTE:
-# --------------
-# Do not be tempted to generalize the use of PygmentsSH (that is tempting 
-# because it would lead to more generic and compact code, and not only in 
-# this very module) because this generic syntax highlighter is far slower
-# than the native ones (all classes above). For example, a Python syntax
-# highlighter based on PygmentsSH would be 2 to 3 times slower than the 
-# current native PythonSH syntax highlighter.
-
-class PygmentsSH(BaseSH):
-    """ Generic Pygments syntax highlighter """
-    # Store the language name and a ref to the lexer
-    _lang_name = None
-    _lexer = None
-    # Syntax highlighting states (from one text block to another):
-    NORMAL = 0
-    def __init__(self, parent, font=None, color_scheme=None):
-        # Warning: do not move out those import statements
-        # (pygments is an optional dependency)
-        from pygments.lexers import get_lexer_by_name
-        from pygments.token import (Text, Other, Keyword, Name, String, Number,
-                                    Comment, Generic, Token)
-        # Map Pygments tokens to Spyder tokens
-        self._tokmap = {Text: "normal", 
-                        Generic: "normal", 
-                        Other: "normal",
-                        Keyword: "keyword",
-                        Token.Operator: "normal",
-                        Name.Builtin: "builtin",
-                        Name: "normal",
-                        Comment: "comment",
-                        String: "string",
-                        Number: "number"}
-        # Load Pygments' Lexer
-        if self._lang_name is not None:
-            self._lexer = get_lexer_by_name(self._lang_name)
-        BaseSH.__init__(self, parent, font, color_scheme)
-
-    def get_fmt(self,typ):
-        """ Get the format code for this type """
-        # Exact matches first
-        for key in self._tokmap:
-            if typ is key:
-                return self._tokmap[key]            
-        # Partial (parent-> child) matches
-        for key in self._tokmap:
-            if typ in key.subtypes:
-                return self._tokmap[key]
-        return 'normal'
-
-    def highlightBlock(self, text):
-        """ Actually highlight the block """        
-        text = unicode(text)                
-        lextree = self._lexer.get_tokens(text)        
-        ct = 0
-        for item in lextree:            
-            typ, val = item            
-            key = self.get_fmt(typ)
-            start = ct
-            ct += len(val)        
-            self.setFormat(start, ct-start, self.formats[key])
-
-class BatchSH(PygmentsSH):
-    """Batch highlighter"""
-    _lang_name = 'bat'
-
-class IniSH(PygmentsSH):
-    """INI highlighter"""
-    _lang_name = 'ini'
-
-class XmlSH(PygmentsSH):
-    """XML highlighter"""
-    _lang_name = 'xml'
-
-class JsSH(PygmentsSH):
-    """Javascript highlighter"""
-    _lang_name = 'js'
-    
-class CssSH(PygmentsSH):
-    """CSS Syntax Highlighter"""
-    _lang_name = 'css'
-
-class MatlabSH(PygmentsSH):
-    """Matlab highlighter"""
-    _lang_name = 'matlab'
-
-
-if __name__ == '__main__':
-    # Test Python Outline Explorer comment regexps
-    valid_comments = [
-      '# --- First variant',
-      '#------ 2nd variant',
-      '### 3rd variant'
-    ]
-    invalid_comments = [
-      '#---', '#--------', '#---   ', '# -------'
-    ]
-    for line in valid_comments:
-        if not PythonSH.OECOMMENT.match(line):
-            print "Error matching '%s' as outline comment" % line
-    for line in invalid_comments:
-        if PythonSH.OECOMMENT.match(line):
-            print "Error: '%s' is matched as outline comment" % line
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2009-2010 Pierre Raybaut
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+"""
+Editor widget syntax highlighters based on QtGui.QSyntaxHighlighter
+(Python syntax highlighting rules are inspired from idlelib)
+"""
+
+from __future__ import print_function
+
+import re
+import keyword
+
+from spyderlib.qt.QtGui import (QColor, QApplication, QFont,
+                                QSyntaxHighlighter, QCursor, QTextCharFormat)
+from spyderlib.qt.QtCore import Qt
+
+# Local imports
+from spyderlib.py3compat import builtins, is_text_string, to_text_string
+
+
+#==============================================================================
+# Syntax highlighting color schemes
+#==============================================================================
+COLOR_SCHEME_KEYS = ("background", "currentline", "occurence",
+                     "ctrlclick", "sideareas", "matched_p", "unmatched_p",
+                     "normal", "keyword", "builtin", "definition",
+                     "comment", "string", "number", "instance")
+COLORS = {
+          'IDLE':
+          {#  Name          Color    Bold   Italic
+           "background":  "#ffffff",
+           "currentline": "#eeffdd",
+           "occurence":   "#e8f2fe",
+           "ctrlclick":   "#0000ff",
+           "sideareas":   "#efefef",
+           "matched_p":   "#99ff99",
+           "unmatched_p": "#ff9999",
+           "normal":     ("#000000", False, False),
+           "keyword":    ("#ff7700", True,  False),
+           "builtin":    ("#900090", False, False),
+           "definition": ("#0000ff", False, False),
+           "comment":    ("#dd0000", False, True),
+           "string":     ("#00aa00", False, False),
+           "number":     ("#924900", False, False),
+           "instance":   ("#777777", True,  True),
+           },
+          'Pydev':
+          {#  Name          Color    Bold   Italic
+           "background":  "#ffffff",
+           "currentline": "#e8f2fe",
+           "occurence":   "#ffff99",
+           "ctrlclick":   "#0000ff",
+           "sideareas":   "#efefef",
+           "matched_p":   "#99ff99",
+           "unmatched_p": "#ff9999",
+           "normal":     ("#000000", False, False),
+           "keyword":    ("#0000ff", False, False),
+           "builtin":    ("#900090", False, False),
+           "definition": ("#000000", True,  False),
+           "comment":    ("#c0c0c0", False, False),
+           "string":     ("#00aa00", False, True),
+           "number":     ("#800000", False, False),
+           "instance":   ("#000000", False, True),
+           },
+          'Emacs':
+          {#  Name          Color    Bold   Italic
+           "background":  "#000000",
+           "currentline": "#2b2b43",
+           "occurence":   "#abab67",
+           "ctrlclick":   "#0000ff",
+           "sideareas":   "#555555",
+           "matched_p":   "#009800",
+           "unmatched_p": "#c80000",
+           "normal":     ("#ffffff", False, False),
+           "keyword":    ("#3c51e8", False, False),
+           "builtin":    ("#900090", False, False),
+           "definition": ("#ff8040", True,  False),
+           "comment":    ("#005100", False, False),
+           "string":     ("#00aa00", False, True),
+           "number":     ("#800000", False, False),
+           "instance":   ("#ffffff", False, True),
+           },
+          'Scintilla':
+          {#  Name          Color    Bold   Italic
+           "background":  "#ffffff",
+           "currentline": "#eeffdd",
+           "occurence":   "#ffff99",
+           "ctrlclick":   "#0000ff",
+           "sideareas":   "#efefef",
+           "matched_p":   "#99ff99",
+           "unmatched_p": "#ff9999",
+           "normal":     ("#000000", False, False),
+           "keyword":    ("#00007f", True,  False),
+           "builtin":    ("#000000", False, False),
+           "definition": ("#007f7f", True,  False),
+           "comment":    ("#007f00", False, False),
+           "string":     ("#7f007f", False, False),
+           "number":     ("#007f7f", False, False),
+           "instance":   ("#000000", False, True),
+           },
+          'Spyder':
+          {#  Name          Color    Bold   Italic
+           "background":  "#ffffff",
+           "currentline": "#feefff",
+           "occurence":   "#ffff99",
+           "ctrlclick":   "#0000ff",
+           "sideareas":   "#efefef",
+           "matched_p":   "#99ff99",
+           "unmatched_p": "#ff9999",
+           "normal":     ("#000000", False, False),
+           "keyword":    ("#0000ff", False, False),
+           "builtin":    ("#900090", False, False),
+           "definition": ("#000000", True,  False),
+           "comment":    ("#adadad", False, True),
+           "string":     ("#00aa00", False, False),
+           "number":     ("#800000", False, False),
+           "instance":   ("#924900", False, True),
+           },
+          'Spyder/Dark':
+          {#  Name          Color    Bold   Italic
+           "background":  "#131926",
+           "currentline": "#2b2b43",
+           "occurence":   "#abab67",
+           "ctrlclick":   "#0000ff",
+           "sideareas":   "#282828",
+           "matched_p":   "#009800",
+           "unmatched_p": "#c80000",
+           "normal":     ("#ffffff", False, False),
+           "keyword":    ("#558eff", False, False),
+           "builtin":    ("#aa00aa", False, False),
+           "definition": ("#ffffff", True,  False),
+           "comment":    ("#7f7f7f", False, False),
+           "string":     ("#11a642", False, True),
+           "number":     ("#c80000", False, False),
+           "instance":   ("#be5f00", False, True),
+           },
+           'Monokai':
+          {#  Name          Color    Bold   Italic
+           "background":  "#2a2b24",
+           "currentline": "#484848",
+           "occurence":   "#666666",
+           "ctrlclick":   "#0000ff",
+           "sideareas":   "#2a2b24",
+           "matched_p":   "#688060",
+           "unmatched_p": "#bd6e76",
+           "normal":     ("#ddddda", False, False),
+           "keyword":    ("#f92672", False, False),
+           "builtin":    ("#ae81ff", False, False),
+           "definition": ("#a6e22e", False, False),
+           "comment":    ("#75715e", False, True),
+           "string":     ("#e6db74", False, False),
+           "number":     ("#ae81ff", False, False),
+           "instance":   ("#ddddda", False, True),
+           },
+           'Zenburn':
+          {#  Name          Color    Bold   Italic
+           "background":  "#3f3f3f",
+           "currentline": "#333333",
+           "occurence":   "#7a738f",
+           "ctrlclick":   "#0000ff",
+           "sideareas":   "#3f3f3f",
+           "matched_p":   "#688060",
+           "unmatched_p": "#bd6e76",
+           "normal":     ("#dcdccc", False, False),
+           "keyword":    ("#dfaf8f", True,  False),
+           "builtin":    ("#efef8f", False, False),
+           "definition": ("#efef8f", False, False),
+           "comment":    ("#7f9f7f", False, True),
+           "string":     ("#cc9393", False, False),
+           "number":     ("#8cd0d3", False, False),
+           "instance":   ("#dcdccc", False, True),
+           },
+          }
+COLOR_SCHEME_NAMES = list(COLORS.keys())
+
+class BaseSH(QSyntaxHighlighter):
+    """Base Syntax Highlighter Class"""
+    # Syntax highlighting rules:
+    PROG = None
+    # Syntax highlighting states (from one text block to another):
+    NORMAL = 0
+    def __init__(self, parent, font=None, color_scheme='Spyder'):
+        QSyntaxHighlighter.__init__(self, parent)
+        
+        self.outlineexplorer_data = {}
+        
+        self.font = font
+        self._check_color_scheme(color_scheme)
+        if is_text_string(color_scheme):
+            self.color_scheme = COLORS[color_scheme]
+        else:
+            self.color_scheme = color_scheme
+        
+        self.background_color = None
+        self.currentline_color = None
+        self.occurence_color = None
+        self.ctrlclick_color = None
+        self.sideareas_color = None
+        self.matched_p_color = None
+        self.unmatched_p_color = None
+
+        self.formats = None
+        self.setup_formats(font)
+        
+    def get_background_color(self):
+        return QColor(self.background_color)
+        
+    def get_foreground_color(self):
+        """Return foreground ('normal' text) color"""
+        return self.formats["normal"].foreground().color()
+        
+    def get_currentline_color(self):
+        return QColor(self.currentline_color)
+        
+    def get_occurence_color(self):
+        return QColor(self.occurence_color)
+    
+    def get_ctrlclick_color(self):
+        return QColor(self.ctrlclick_color)
+    
+    def get_sideareas_color(self):
+        return QColor(self.sideareas_color)
+    
+    def get_matched_p_color(self):
+        return QColor(self.matched_p_color)
+    
+    def get_unmatched_p_color(self):
+        return QColor(self.unmatched_p_color)
+    
+    def get_color_name(self, fmt):
+        """Return color name assigned to a given format"""
+        return self.formats[fmt].foreground().color().name()
+
+    def setup_formats(self, font=None):
+        base_format = QTextCharFormat()
+        if font is not None:
+            self.font = font
+        if self.font is not None:
+            base_format.setFont(self.font)
+        self.formats = {}
+        colors = self.color_scheme.copy()
+        self.background_color = colors.pop("background")
+        self.currentline_color = colors.pop("currentline")
+        self.occurence_color = colors.pop("occurence")
+        self.ctrlclick_color = colors.pop("ctrlclick")
+        self.sideareas_color = colors.pop("sideareas")
+        self.matched_p_color = colors.pop("matched_p")
+        self.unmatched_p_color = colors.pop("unmatched_p")
+        for name, (color, bold, italic) in list(colors.items()):
+            format = QTextCharFormat(base_format)
+            format.setForeground(QColor(color))
+            format.setBackground(QColor(self.background_color))
+            if bold:
+                format.setFontWeight(QFont.Bold)
+            format.setFontItalic(italic)
+            self.formats[name] = format
+
+    def _check_color_scheme(self, color_scheme):
+        if is_text_string(color_scheme):
+            assert color_scheme in COLOR_SCHEME_NAMES
+        else:
+            assert all([key in color_scheme for key in COLOR_SCHEME_KEYS])
+
+    def set_color_scheme(self, color_scheme):
+        self._check_color_scheme(color_scheme)
+        if is_text_string(color_scheme):
+            self.color_scheme = COLORS[color_scheme]
+        else:
+            self.color_scheme = color_scheme
+        self.setup_formats()
+        self.rehighlight()
+
+    def highlightBlock(self, text):
+        raise NotImplementedError
+            
+    def get_outlineexplorer_data(self):
+        return self.outlineexplorer_data
+
+    def rehighlight(self):
+        self.outlineexplorer_data = {}
+        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
+        QSyntaxHighlighter.rehighlight(self)
+        QApplication.restoreOverrideCursor()
+
+
+class TextSH(BaseSH):
+    """Simple Text Syntax Highlighter Class (do nothing)"""
+    def highlightBlock(self, text):
+        pass
+
+
+class GenericSH(BaseSH):
+    """Generic Syntax Highlighter"""
+    # Syntax highlighting rules:
+    PROG = None  # to be redefined in child classes
+    def highlightBlock(self, text):
+        text = to_text_string(text)
+        self.setFormat(0, len(text), self.formats["normal"])
+        
+        match = self.PROG.search(text)
+        index = 0
+        while match:
+            for key, value in list(match.groupdict().items()):
+                if value:
+                    start, end = match.span(key)
+                    index += end-start
+                    self.setFormat(start, end-start, self.formats[key])
+                    
+            match = self.PROG.search(text, match.end())
+
+
+#==============================================================================
+# Python syntax highlighter
+#==============================================================================
+def any(name, alternates):
+    "Return a named group pattern matching list of alternates."
+    return "(?P<%s>" % name + "|".join(alternates) + ")"
+
+def make_python_patterns(additional_keywords=[], additional_builtins=[]):
+    "Strongly inspired from idlelib.ColorDelegator.make_pat"
+    kw = r"\b" + any("keyword", keyword.kwlist+additional_keywords) + r"\b"
+    builtinlist = [str(name) for name in dir(builtins)
+                   if not name.startswith('_')]+additional_builtins
+    builtin = r"([^.'\"\\#]\b|^)" + any("builtin", builtinlist) + r"\b"
+    comment = any("comment", [r"#[^\n]*"])
+    instance = any("instance", [r"\bself\b"])
+    number = any("number",
+                 [r"\b[+-]?[0-9]+[lLjJ]?\b",
+                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
+                  r"\b[+-]?0[oO][0-7]+[lL]?\b",
+                  r"\b[+-]?0[bB][01]+[lL]?\b",
+                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?[jJ]?\b"])
+    sqstring =     r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
+    dqstring =     r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
+    uf_sqstring =  r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*(\\)$(?!')$"
+    uf_dqstring =  r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*(\\)$(?!")$'
+    sq3string =    r"(\b[rRuU])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(''')?"
+    dq3string =    r'(\b[rRuU])?"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(""")?'
+    uf_sq3string = r"(\b[rRuU])?'''[^'\\]*((\\.|'(?!''))[^'\\]*)*(\\)?(?!''')$"
+    uf_dq3string = r'(\b[rRuU])?"""[^"\\]*((\\.|"(?!""))[^"\\]*)*(\\)?(?!""")$'
+    string = any("string", [sq3string, dq3string, sqstring, dqstring])
+    ufstring1 = any("uf_sqstring", [uf_sqstring])
+    ufstring2 = any("uf_dqstring", [uf_dqstring])
+    ufstring3 = any("uf_sq3string", [uf_sq3string])
+    ufstring4 = any("uf_dq3string", [uf_dq3string])
+    return "|".join([instance, kw, builtin, comment,
+                     ufstring1, ufstring2, ufstring3, ufstring4, string,
+                     number, any("SYNC", [r"\n"])])
+
+class OutlineExplorerData(object):
+    CLASS, FUNCTION, STATEMENT, COMMENT = list(range(4))
+    def __init__(self):
+        self.text = None
+        self.fold_level = None
+        self.def_type = None
+        self.def_name = None
+        
+    def is_not_class_nor_function(self):
+        return self.def_type not in (self.CLASS, self.FUNCTION)
+    
+    def is_comment(self):
+        return self.def_type == self.COMMENT
+        
+    def get_class_name(self):
+        if self.def_type == self.CLASS:
+            return self.def_name
+        
+    def get_function_name(self):
+        if self.def_type == self.FUNCTION:
+            return self.def_name
+    
+class PythonSH(BaseSH):
+    """Python Syntax Highlighter"""
+    # Syntax highlighting rules:
+    PROG = re.compile(make_python_patterns(), re.S)
+    IDPROG = re.compile(r"\s+(\w+)", re.S)
+    ASPROG = re.compile(r".*?\b(as)\b")
+    # Syntax highlighting states (from one text block to another):
+    (NORMAL, INSIDE_SQ3STRING, INSIDE_DQ3STRING,
+     INSIDE_SQSTRING, INSIDE_DQSTRING) = list(range(5))
+    DEF_TYPES = {"def": OutlineExplorerData.FUNCTION,
+                 "class": OutlineExplorerData.CLASS}
+    # Comments suitable for Outline Explorer
+    OECOMMENT = re.compile('^(# ?--[-]+|##[#]+ )[ -]*[^- ]+')
+    
+    def __init__(self, parent, font=None, color_scheme='Spyder'):
+        BaseSH.__init__(self, parent, font, color_scheme)
+        self.import_statements = {}
+
+    def highlightBlock(self, text):
+        text = to_text_string(text)
+        prev_state = self.previousBlockState()
+        if prev_state == self.INSIDE_DQ3STRING:
+            offset = -4
+            text = r'""" '+text
+        elif prev_state == self.INSIDE_SQ3STRING:
+            offset = -4
+            text = r"''' "+text
+        elif prev_state == self.INSIDE_DQSTRING:
+            offset = -2
+            text = r'" '+text
+        elif prev_state == self.INSIDE_SQSTRING:
+            offset = -2
+            text = r"' "+text
+        else:
+            offset = 0
+            prev_state = self.NORMAL
+        
+        oedata = None
+        import_stmt = None
+
+        self.setFormat(0, len(text), self.formats["normal"])
+        
+        state = self.NORMAL
+        match = self.PROG.search(text)
+        while match:
+            for key, value in list(match.groupdict().items()):
+                if value:
+                    start, end = match.span(key)
+                    start = max([0, start+offset])
+                    end = max([0, end+offset])
+                    if key == "uf_sq3string":
+                        self.setFormat(start, end-start,
+                                       self.formats["string"])
+                        state = self.INSIDE_SQ3STRING
+                    elif key == "uf_dq3string":
+                        self.setFormat(start, end-start,
+                                       self.formats["string"])
+                        state = self.INSIDE_DQ3STRING
+                    elif key == "uf_sqstring":
+                        self.setFormat(start, end-start,
+                                       self.formats["string"])
+                        state = self.INSIDE_SQSTRING
+                    elif key == "uf_dqstring":
+                        self.setFormat(start, end-start,
+                                       self.formats["string"])
+                        state = self.INSIDE_DQSTRING
+                    else:
+                        self.setFormat(start, end-start, self.formats[key])
+                        if key == "comment":
+                            if self.OECOMMENT.match(text.lstrip()):
+                                oedata = OutlineExplorerData()
+                                oedata.text = to_text_string(text).strip()
+                                oedata.fold_level = start
+                                oedata.def_type = OutlineExplorerData.COMMENT
+                                oedata.def_name = text.strip()
+                        elif key == "keyword":
+                            if value in ("def", "class"):
+                                match1 = self.IDPROG.match(text, end)
+                                if match1:
+                                    start1, end1 = match1.span(1)
+                                    self.setFormat(start1, end1-start1,
+                                                   self.formats["definition"])
+                                    oedata = OutlineExplorerData()
+                                    oedata.text = to_text_string(text)
+                                    oedata.fold_level = start
+                                    oedata.def_type = self.DEF_TYPES[
+                                                        to_text_string(value)]
+                                    oedata.def_name = text[start1:end1]
+                            elif value in ("elif", "else", "except", "finally",
+                                           "for", "if", "try", "while",
+                                           "with"):
+                                if text.lstrip().startswith(value):
+                                    oedata = OutlineExplorerData()
+                                    oedata.text = to_text_string(text).strip()
+                                    oedata.fold_level = start
+                                    oedata.def_type = \
+                                        OutlineExplorerData.STATEMENT
+                                    oedata.def_name = text.strip()
+                            elif value == "import":
+                                import_stmt = text.strip()
+                                # color all the "as" words on same line, except
+                                # if in a comment; cheap approximation to the
+                                # truth
+                                if '#' in text:
+                                    endpos = text.index('#')
+                                else:
+                                    endpos = len(text)
+                                while True:
+                                    match1 = self.ASPROG.match(text, end,
+                                                               endpos)
+                                    if not match1:
+                                        break
+                                    start, end = match1.span(1)
+                                    self.setFormat(start, end-start,
+                                                   self.formats["keyword"])
+                    
+            match = self.PROG.search(text, match.end())
+
+        self.setCurrentBlockState(state)
+        
+        if oedata is not None:
+            block_nb = self.currentBlock().blockNumber()
+            self.outlineexplorer_data[block_nb] = oedata
+        if import_stmt is not None:
+            block_nb = self.currentBlock().blockNumber()
+            self.import_statements[block_nb] = import_stmt
+            
+    def get_import_statements(self):
+        return list(self.import_statements.values())
+            
+    def rehighlight(self):
+        self.import_statements = {}
+        BaseSH.rehighlight(self)
+
+
+#==============================================================================
+# Cython syntax highlighter
+#==============================================================================
+C_TYPES = 'bool char double enum float int long mutable short signed struct unsigned void'
+
+class CythonSH(PythonSH):
+    """Cython Syntax Highlighter"""
+    ADDITIONAL_KEYWORDS = ["cdef", "ctypedef", "cpdef", "inline", "cimport",
+                           "DEF"]
+    ADDITIONAL_BUILTINS = C_TYPES.split()
+    PROG = re.compile(make_python_patterns(ADDITIONAL_KEYWORDS,
+                                           ADDITIONAL_BUILTINS), re.S)
+    IDPROG = re.compile(r"\s+([\w\.]+)", re.S)
+
+
+#==============================================================================
+# C/C++ syntax highlighter
+#==============================================================================
+C_KEYWORDS1 = 'and and_eq bitand bitor break case catch const const_cast continue default delete do dynamic_cast else explicit export extern for friend goto if inline namespace new not not_eq operator or or_eq private protected public register reinterpret_cast return sizeof static static_cast switch template throw try typedef typeid typename union using virtual while xor xor_eq'
+C_KEYWORDS2 = 'a addindex addtogroup anchor arg attention author b brief bug c class code date def defgroup deprecated dontinclude e em endcode endhtmlonly ifdef endif endlatexonly endlink endverbatim enum example exception f$ file fn hideinitializer htmlinclude htmlonly if image include ingroup internal invariant interface latexonly li line link mainpage name namespace nosubgrouping note overload p page par param post pre ref relates remarks return retval sa section see showinitializer  [...]
+C_KEYWORDS3 = 'asm auto class compl false true volatile wchar_t'
+
+def make_generic_c_patterns(keywords, builtins,
+                            instance=None, define=None, comment=None):
+    "Strongly inspired from idlelib.ColorDelegator.make_pat"
+    kw = r"\b" + any("keyword", keywords.split()) + r"\b"
+    builtin = r"\b" + any("builtin", builtins.split()+C_TYPES.split()) + r"\b"
+    if comment is None:
+        comment = any("comment", [r"//[^\n]*", r"\/\*(.*?)\*\/"])
+    comment_start = any("comment_start", [r"\/\*"])
+    comment_end = any("comment_end", [r"\*\/"])
+    if instance is None:
+        instance = any("instance", [r"\bthis\b"])
+    number = any("number",
+                 [r"\b[+-]?[0-9]+[lL]?\b",
+                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
+                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"])
+    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
+    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
+    string = any("string", [sqstring, dqstring])
+    if define is None:
+        define = any("define", [r"#[^\n]*"])
+    return "|".join([instance, kw, comment, string, number,
+                     comment_start, comment_end, builtin,
+                     define, any("SYNC", [r"\n"])])
+
+def make_cpp_patterns():
+    return make_generic_c_patterns(C_KEYWORDS1+' '+C_KEYWORDS2, C_KEYWORDS3)
+
+class CppSH(BaseSH):
+    """C/C++ Syntax Highlighter"""
+    # Syntax highlighting rules:
+    PROG = re.compile(make_cpp_patterns(), re.S)
+    # Syntax highlighting states (from one text block to another):
+    NORMAL = 0
+    INSIDE_COMMENT = 1
+    def __init__(self, parent, font=None, color_scheme=None):
+        BaseSH.__init__(self, parent, font, color_scheme)
+
+    def highlightBlock(self, text):
+        text = to_text_string(text)
+        inside_comment = self.previousBlockState() == self.INSIDE_COMMENT
+        self.setFormat(0, len(text),
+                       self.formats["comment" if inside_comment else "normal"])
+        
+        match = self.PROG.search(text)
+        index = 0
+        while match:
+            for key, value in list(match.groupdict().items()):
+                if value:
+                    start, end = match.span(key)
+                    index += end-start
+                    if key == "comment_start":
+                        inside_comment = True
+                        self.setFormat(start, len(text)-start,
+                                       self.formats["comment"])
+                    elif key == "comment_end":
+                        inside_comment = False
+                        self.setFormat(start, end-start,
+                                       self.formats["comment"])
+                    elif inside_comment:
+                        self.setFormat(start, end-start,
+                                       self.formats["comment"])
+                    elif key == "define":
+                        self.setFormat(start, end-start,
+                                       self.formats["number"])
+                    else:
+                        self.setFormat(start, end-start, self.formats[key])
+                    
+            match = self.PROG.search(text, match.end())
+
+        last_state = self.INSIDE_COMMENT if inside_comment else self.NORMAL
+        self.setCurrentBlockState(last_state)
+
+
+def make_opencl_patterns():
+    # Keywords:
+    kwstr1 = 'cl_char cl_uchar cl_short cl_ushort cl_int cl_uint cl_long cl_ulong cl_half cl_float cl_double cl_platform_id cl_device_id cl_context cl_command_queue cl_mem cl_program cl_kernel cl_event cl_sampler cl_bool cl_bitfield cl_device_type cl_platform_info cl_device_info cl_device_address_info cl_device_fp_config cl_device_mem_cache_type cl_device_local_mem_type cl_device_exec_capabilities cl_command_queue_properties cl_context_properties cl_context_info cl_command_queue_info cl_ [...]
+    # Constants:
+    kwstr2 = 'CL_FALSE, CL_TRUE, CL_PLATFORM_PROFILE, CL_PLATFORM_VERSION, CL_PLATFORM_NAME, CL_PLATFORM_VENDOR, CL_PLATFORM_EXTENSIONS, CL_DEVICE_TYPE_DEFAULT , CL_DEVICE_TYPE_CPU, CL_DEVICE_TYPE_GPU, CL_DEVICE_TYPE_ACCELERATOR, CL_DEVICE_TYPE_ALL, CL_DEVICE_TYPE, CL_DEVICE_VENDOR_ID, CL_DEVICE_MAX_COMPUTE_UNITS, CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS, CL_DEVICE_MAX_WORK_GROUP_SIZE, CL_DEVICE_MAX_WORK_ITEM_SIZES, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT, [...]
+    # Functions:
+    builtins = 'clGetPlatformIDs, clGetPlatformInfo, clGetDeviceIDs, clGetDeviceInfo, clCreateContext, clCreateContextFromType, clReleaseContext, clGetContextInfo, clCreateCommandQueue, clRetainCommandQueue, clReleaseCommandQueue, clGetCommandQueueInfo, clSetCommandQueueProperty, clCreateBuffer, clCreateImage2D, clCreateImage3D, clRetainMemObject, clReleaseMemObject, clGetSupportedImageFormats, clGetMemObjectInfo, clGetImageInfo, clCreateSampler, clRetainSampler, clReleaseSampler, clGetS [...]
+    # Qualifiers:
+    qualifiers = '__global __local __constant __private __kernel'
+    keyword_list = C_KEYWORDS1+' '+C_KEYWORDS2+' '+kwstr1+' '+kwstr2
+    builtin_list = C_KEYWORDS3+' '+builtins+' '+qualifiers
+    return make_generic_c_patterns(keyword_list, builtin_list)
+
+class OpenCLSH(CppSH):
+    """OpenCL Syntax Highlighter"""
+    PROG = re.compile(make_opencl_patterns(), re.S)
+
+
+#==============================================================================
+# Fortran Syntax Highlighter
+#==============================================================================
+
+def make_fortran_patterns():
+    "Strongly inspired from idlelib.ColorDelegator.make_pat"
+    kwstr = 'access action advance allocatable allocate apostrophe assign assignment associate asynchronous backspace bind blank blockdata call case character class close common complex contains continue cycle data deallocate decimal delim default dimension direct do dowhile double doubleprecision else elseif elsewhere encoding end endassociate endblockdata enddo endfile endforall endfunction endif endinterface endmodule endprogram endselect endsubroutine endtype endwhere entry eor equiv [...]
+    bistr1 = 'abs achar acos acosd adjustl adjustr aimag aimax0 aimin0 aint ajmax0 ajmin0 akmax0 akmin0 all allocated alog alog10 amax0 amax1 amin0 amin1 amod anint any asin asind associated atan atan2 atan2d atand bitest bitl bitlr bitrl bjtest bit_size bktest break btest cabs ccos cdabs cdcos cdexp cdlog cdsin cdsqrt ceiling cexp char clog cmplx conjg cos cosd cosh count cpu_time cshift csin csqrt dabs dacos dacosd dasin dasind datan datan2 datan2d datand date date_and_time dble dcmplx [...]
+    bistr2 = 'cdabs cdcos cdexp cdlog cdsin cdsqrt cotan cotand dcmplx dconjg dcotan dcotand decode dimag dll_export dll_import doublecomplex dreal dvchk encode find flen flush getarg getcharqq getcl getdat getenv gettim hfix ibchng identifier imag int1 int2 int4 intc intrup invalop iostat_msg isha ishc ishl jfix lacfar locking locnear map nargs nbreak ndperr ndpexc offset ovefl peekcharqq precfill prompt qabs qacos qacosd qasin qasind qatan qatand qatan2 qcmplx qconjg qcos qcosd qcosh q [...]
+    kw = r"\b" + any("keyword", kwstr.split()) + r"\b"
+    builtin = r"\b" + any("builtin", bistr1.split()+bistr2.split()) + r"\b"
+    comment = any("comment", [r"\![^\n]*"])
+    number = any("number",
+                 [r"\b[+-]?[0-9]+[lL]?\b",
+                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
+                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"])
+    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
+    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
+    string = any("string", [sqstring, dqstring])
+    return "|".join([kw, comment, string, number, builtin,
+                     any("SYNC", [r"\n"])])
+
+class FortranSH(BaseSH):
+    """Fortran Syntax Highlighter"""
+    # Syntax highlighting rules:
+    PROG = re.compile(make_fortran_patterns(), re.S|re.I)
+    IDPROG = re.compile(r"\s+(\w+)", re.S)
+    # Syntax highlighting states (from one text block to another):
+    NORMAL = 0
+    def __init__(self, parent, font=None, color_scheme=None):
+        BaseSH.__init__(self, parent, font, color_scheme)
+
+    def highlightBlock(self, text):
+        text = to_text_string(text)
+        self.setFormat(0, len(text), self.formats["normal"])
+        
+        match = self.PROG.search(text)
+        index = 0
+        while match:
+            for key, value in list(match.groupdict().items()):
+                if value:
+                    start, end = match.span(key)
+                    index += end-start
+                    self.setFormat(start, end-start, self.formats[key])
+                    if value.lower() in ("subroutine", "module", "function"):
+                        match1 = self.IDPROG.match(text, end)
+                        if match1:
+                            start1, end1 = match1.span(1)
+                            self.setFormat(start1, end1-start1,
+                                           self.formats["definition"])
+                    
+            match = self.PROG.search(text, match.end())
+
+class Fortran77SH(FortranSH):
+    """Fortran 77 Syntax Highlighter"""
+    def highlightBlock(self, text):
+        text = to_text_string(text)
+        if text.startswith(("c", "C")):
+            self.setFormat(0, len(text), self.formats["comment"])
+        else:
+            FortranSH.highlightBlock(self, text)
+            self.setFormat(0, 5, self.formats["comment"])
+            self.setFormat(73, max([73, len(text)]),
+                           self.formats["comment"])
+
+
+#==============================================================================
+# IDL highlighter
+#
+# Contribution from Stuart Mumford (Littlemumford) - 02/02/2012
+# See Issue #850: http://code.google.com/p/spyderlib/issues/detail?id=850
+#==============================================================================
+def make_idl_patterns():
+    "Strongly inspired from idlelib.ColorDelegator.make_pat"
+    kwstr = 'begin of pro function endfor endif endwhile endrep endcase endswitch end if then else for do while repeat until break case switch common continue exit return goto help message print read retall stop'
+    bistr1 = 'a_correlate abs acos adapt_hist_equal alog alog10 amoeba arg_present arra_equal array_indices ascii_template asin assoc atan beseli beselj besel k besely beta bilinear bin_date binary_template dinfgen dinomial blk_con broyden bytarr byte bytscl c_correlate call_external call_function ceil chebyshev check_math chisqr_cvf chisqr_pdf choldc cholsol cindgen clust_wts cluster color_quan colormap_applicable comfit complex complexarr complexround compute_mesh_normals cond congrid  [...]
+    bistr2 = 'annotate arrow axis bar_plot blas_axpy box_cursor breakpoint byteorder caldata calendar call_method call_procedure catch cd cir_3pnt close color_convert compile_opt constrained_min contour copy_lun cpu create_view cursor cw_animate_getp cw_animate_load cw_animate_run cw_light_editor_get cw_light_editor_set cw_palette_editor_get cw_palette_editor_set define_key define_msgblk define_msgblk_from_file defsysv delvar device dfpmin dissolve dlm_load doc_librar draw_roi efont empt [...]
+    kw = r"\b" + any("keyword", kwstr.split()) + r"\b"
+    builtin = r"\b" + any("builtin", bistr1.split()+bistr2.split()) + r"\b"
+    comment = any("comment", [r"\;[^\n]*"])
+    number = any("number",
+                 [r"\b[+-]?[0-9]+[lL]?\b",
+                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
+		  r"\b\.[0-9]d0|\.d0+[lL]?\b",
+                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"])
+    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
+    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
+    string = any("string", [sqstring, dqstring])
+    return "|".join([kw, comment, string, number, builtin,
+                     any("SYNC", [r"\n"])])
+
+class IdlSH(GenericSH):
+    """IDL Syntax Highlighter"""
+    PROG = re.compile(make_idl_patterns(), re.S|re.I)
+
+
+#==============================================================================
+# Diff/Patch highlighter
+#==============================================================================
+
+class DiffSH(BaseSH):
+    """Simple Diff/Patch Syntax Highlighter Class"""
+    def highlightBlock(self, text):
+        text = to_text_string(text)
+        if text.startswith("+++"):
+            self.setFormat(0, len(text), self.formats["keyword"])
+        elif text.startswith("---"):
+            self.setFormat(0, len(text), self.formats["keyword"])
+        elif text.startswith("+"):
+            self.setFormat(0, len(text), self.formats["string"])
+        elif text.startswith("-"):
+            self.setFormat(0, len(text), self.formats["number"])
+        elif text.startswith("@"):
+            self.setFormat(0, len(text), self.formats["builtin"])
+
+
+#==============================================================================
+# NSIS highlighter
+#==============================================================================
+
+def make_nsis_patterns():
+    "Strongly inspired from idlelib.ColorDelegator.make_pat"
+    kwstr1 = 'Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirText DirVar DirVerify EnableWindow EnumRegKey EnumRegValue Exec ExecShell ExecWait Exch ExpandEnvStrings File FileBufSize FileClose  [...]
+    kwstr2 = 'all alwaysoff ARCHIVE auto both bzip2 components current custom details directory false FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_HIDDEN FILE_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_READONLY FILE_ATTRIBUTE_SYSTEM FILE_ATTRIBUTE_TEMPORARY force grey HIDDEN hide IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES ifdiff ifnewer instfiles instfiles lastused leave left level license listonly lzma manual MB_ABORTRETRYIGNORE MB_DEFBUTTON1 MB_DEFBUTTON2 MB_DEFBUTTON3 MB_D [...]
+    kwstr3 = 'MUI_ABORTWARNING MUI_ABORTWARNING_CANCEL_DEFAULT MUI_ABORTWARNING_TEXT MUI_BGCOLOR MUI_COMPONENTSPAGE_CHECKBITMAP MUI_COMPONENTSPAGE_NODESC MUI_COMPONENTSPAGE_SMALLDESC MUI_COMPONENTSPAGE_TEXT_COMPLIST MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE MUI_COMPONENTSPAGE_TEXT_INSTTYPE MUI_COMPONENTSPAGE_TEXT_TOP MUI_CUSTOMFUNCTION_ABORT MUI_CUSTOMFUNCTION_GUIINIT MUI_CUSTOMFUNCTION_UNABORT MUI_CUSTOMFUNCTION_UNGUIINIT MUI_DESCRIPTION_TEXT MUI [...]
+    bistr = 'addincludedir addplugindir AndIf cd define echo else endif error execute If ifdef ifmacrodef ifmacrondef ifndef include insertmacro macro macroend onGUIEnd onGUIInit onInit onInstFailed onInstSuccess onMouseOverSection onRebootFailed onSelChange onUserAbort onVerifyInstDir OrIf packhdr system undef verbose warning'
+    instance = any("instance", [r'\$\{.*?\}', r'\$[A-Za-z0-9\_]*'])
+    define = any("define", [r"\![^\n]*"])
+    comment = any("comment", [r"\;[^\n]*", r"\#[^\n]*", r"\/\*(.*?)\*\/"])
+    return make_generic_c_patterns(kwstr1+' '+kwstr2+' '+kwstr3, bistr,
+                                   instance=instance, define=define,
+                                   comment=comment)
+
+class NsisSH(CppSH):
+    """NSIS Syntax Highlighter"""
+    # Syntax highlighting rules:
+    PROG = re.compile(make_nsis_patterns(), re.S)
+
+
+#==============================================================================
+# gettext highlighter
+#==============================================================================
+
+def make_gettext_patterns():
+    "Strongly inspired from idlelib.ColorDelegator.make_pat"
+    kwstr = 'msgid msgstr'
+    kw = r"\b" + any("keyword", kwstr.split()) + r"\b"
+    fuzzy = any("builtin", [r"#,[^\n]*"])
+    links = any("normal", [r"#:[^\n]*"])
+    comment = any("comment", [r"#[^\n]*"])
+    number = any("number",
+                 [r"\b[+-]?[0-9]+[lL]?\b",
+                  r"\b[+-]?0[xX][0-9A-Fa-f]+[lL]?\b",
+                  r"\b[+-]?[0-9]+(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b"])
+    sqstring = r"(\b[rRuU])?'[^'\\\n]*(\\.[^'\\\n]*)*'?"
+    dqstring = r'(\b[rRuU])?"[^"\\\n]*(\\.[^"\\\n]*)*"?'
+    string = any("string", [sqstring, dqstring])
+    return "|".join([kw, string, number, fuzzy, links, comment,
+                     any("SYNC", [r"\n"])])
+
+class GetTextSH(GenericSH):
+    """gettext Syntax Highlighter"""
+    # Syntax highlighting rules:
+    PROG = re.compile(make_gettext_patterns(), re.S)
+
+
+#==============================================================================
+# HTML highlighter
+#==============================================================================
+
+class BaseWebSH(BaseSH):
+    """Base class for CSS and HTML syntax highlighters"""
+    NORMAL  = 0
+    COMMENT = 1
+    
+    def __init__(self, parent, font=None, color_scheme=None):
+        BaseSH.__init__(self, parent, font, color_scheme)
+    
+    def highlightBlock(self, text):
+        text = to_text_string(text)
+        previous_state = self.previousBlockState()
+        
+        if previous_state == self.COMMENT:
+            self.setFormat(0, len(text), self.formats["comment"])
+        else:
+            previous_state = self.NORMAL
+            self.setFormat(0, len(text), self.formats["normal"])
+        
+        self.setCurrentBlockState(previous_state)
+        match = self.PROG.search(text)        
+
+        match_count = 0
+        n_characters = len(text)
+        # There should never be more matches than characters in the text.
+        while match and match_count < n_characters:
+            match_dict = match.groupdict()
+            for key, value in list(match_dict.items()):
+                if value:
+                    start, end = match.span(key)
+                    if previous_state == self.COMMENT:
+                        if key == "multiline_comment_end":
+                            self.setCurrentBlockState(self.NORMAL)
+                            self.setFormat(end, len(text),
+                                           self.formats["normal"])
+                        else:
+                            self.setCurrentBlockState(self.COMMENT)
+                            self.setFormat(0, len(text),
+                                           self.formats["comment"])
+                    else:
+                        if key == "multiline_comment_start":
+                            self.setCurrentBlockState(self.COMMENT)
+                            self.setFormat(start, len(text),
+                                           self.formats["comment"])
+                        else:
+                            self.setCurrentBlockState(self.NORMAL)
+                            self.setFormat(start, end-start,
+                                           self.formats[key])
+            
+            match = self.PROG.search(text, match.end())
+            match_count += 1
+
+def make_html_patterns():
+    """Strongly inspired from idlelib.ColorDelegator.make_pat """
+    tags = any("builtin", [r"<", r"[\?/]?>", r"(?<=<).*?(?=[ >])"])
+    keywords = any("keyword", [r" [\w:-]*?(?==)"])
+    string = any("string", [r'".*?"'])
+    comment = any("comment", [r"<!--.*?-->"])
+    multiline_comment_start = any("multiline_comment_start", [r"<!--"])
+    multiline_comment_end = any("multiline_comment_end", [r"-->"])
+    return "|".join([comment, multiline_comment_start,
+                     multiline_comment_end, tags, keywords, string]) 
+    
+class HtmlSH(BaseWebSH):
+    """HTML Syntax Highlighter"""
+    PROG = re.compile(make_html_patterns(), re.S)
+
+
+#==============================================================================
+# Pygments based omni-parser
+#==============================================================================
+
+# IMPORTANT NOTE:
+# --------------
+# Do not be tempted to generalize the use of PygmentsSH (that is tempting 
+# because it would lead to more generic and compact code, and not only in 
+# this very module) because this generic syntax highlighter is far slower
+# than the native ones (all classes above). For example, a Python syntax
+# highlighter based on PygmentsSH would be 2 to 3 times slower than the 
+# current native PythonSH syntax highlighter.
+
+class PygmentsSH(BaseSH):
+    """ Generic Pygments syntax highlighter """
+    # Store the language name and a ref to the lexer
+    _lang_name = None
+    _lexer = None
+    # Syntax highlighting states (from one text block to another):
+    NORMAL = 0
+    def __init__(self, parent, font=None, color_scheme=None):
+        # Warning: do not move out those import statements
+        # (pygments is an optional dependency)
+        from pygments.lexers import get_lexer_by_name
+        from pygments.token import (Text, Other, Keyword, Name, String, Number,
+                                    Comment, Generic, Token)
+        # Map Pygments tokens to Spyder tokens
+        self._tokmap = {Text: "normal", 
+                        Generic: "normal", 
+                        Other: "normal",
+                        Keyword: "keyword",
+                        Token.Operator: "normal",
+                        Name.Builtin: "builtin",
+                        Name: "normal",
+                        Comment: "comment",
+                        String: "string",
+                        Number: "number"}
+        # Load Pygments' Lexer
+        if self._lang_name is not None:
+            self._lexer = get_lexer_by_name(self._lang_name)
+        BaseSH.__init__(self, parent, font, color_scheme)
+
+    def get_fmt(self, typ):
+        """ Get the format code for this type """
+        # Exact matches first
+        for key in self._tokmap:
+            if typ is key:
+                return self._tokmap[key]            
+        # Partial (parent-> child) matches
+        for key in self._tokmap:
+            if typ in key.subtypes:
+                return self._tokmap[key]
+        return 'normal'
+
+    def highlightBlock(self, text):
+        """ Actually highlight the block """        
+        text = to_text_string(text)                
+        lextree = self._lexer.get_tokens(text)        
+        ct = 0
+        for item in lextree:            
+            typ, val = item            
+            key = self.get_fmt(typ)
+            start = ct
+            ct += len(val)        
+            self.setFormat(start, ct-start, self.formats[key])
+
+class BatchSH(PygmentsSH):
+    """Batch highlighter"""
+    _lang_name = 'bat'
+
+class IniSH(PygmentsSH):
+    """INI highlighter"""
+    _lang_name = 'ini'
+
+class XmlSH(PygmentsSH):
+    """XML highlighter"""
+    _lang_name = 'xml'
+
+class JsSH(PygmentsSH):
+    """Javascript highlighter"""
+    _lang_name = 'js'
+    
+class CssSH(PygmentsSH):
+    """CSS Syntax Highlighter"""
+    _lang_name = 'css'
+
+class MatlabSH(PygmentsSH):
+    """Matlab highlighter"""
+    _lang_name = 'matlab'
+
+
+if __name__ == '__main__':
+    # Test Python Outline Explorer comment regexps
+    valid_comments = [
+      '# --- First variant',
+      '#------ 2nd variant',
+      '### 3rd variant'
+    ]
+    invalid_comments = [
+      '#---', '#--------', '#---   ', '# -------'
+    ]
+    for line in valid_comments:
+        if not PythonSH.OECOMMENT.match(line):
+            print("Error matching '%s' as outline comment" % line)
+    for line in invalid_comments:
+        if PythonSH.OECOMMENT.match(line):
+            print("Error: '%s' is matched as outline comment" % line)
+        
diff --git a/spyderlib/widgets/status.py b/spyderlib/widgets/status.py
index 8658fe6..ae48a0a 100644
--- a/spyderlib/widgets/status.py
+++ b/spyderlib/widgets/status.py
@@ -12,6 +12,7 @@ from spyderlib.qt.QtCore import QTimer, SIGNAL
 # Local import
 from spyderlib.baseconfig import _
 from spyderlib.guiconfig import get_font
+from spyderlib.py3compat import to_text_string
 
 
 class StatusBarWidget(QWidget):
@@ -136,7 +137,7 @@ class EOLStatus(StatusBarWidget):
         layout.addSpacing(20)
         
     def eol_changed(self, os_name):
-        os_name = unicode(os_name)
+        os_name = to_text_string(os_name)
         self.eol.setText({"nt": "CRLF", "posix": "LF"}.get(os_name, "CR"))
 
 class EncodingStatus(StatusBarWidget):
diff --git a/spyderlib/widgets/tabs.py b/spyderlib/widgets/tabs.py
index 30ec05a..48b4941 100644
--- a/spyderlib/widgets/tabs.py
+++ b/spyderlib/widgets/tabs.py
@@ -23,6 +23,7 @@ from spyderlib.baseconfig import _
 from spyderlib.utils.misc import get_common_path
 from spyderlib.utils.qthelpers import (add_actions, create_toolbutton,
                                        create_action, get_icon)
+from spyderlib.py3compat import PY2, to_text_string
 
 
 class TabBar(QTabBar):
@@ -49,9 +50,14 @@ class TabBar(QTabBar):
             drag = QDrag(self)
             mimeData = QMimeData()
             # Converting id's to long to avoid an OverflowError with PySide
-            ancestor_id = long(id(self.ancestor))
-            parent_widget_id = long(id(self.parentWidget()))
-            self_id = long(id(self))
+            if PY2:
+                ancestor_id = long(id(self.ancestor))
+                parent_widget_id = long(id(self.parentWidget()))
+                self_id = long(id(self))
+            else:
+                ancestor_id = id(self.ancestor)
+                parent_widget_id = id(self.parentWidget())
+                self_id = id(self)
             mimeData.setData("parent-id", QByteArray.number(ancestor_id))
             mimeData.setData("tabwidget-id",
                              QByteArray.number(parent_widget_id))
@@ -137,9 +143,9 @@ class BaseTabs(QTabWidget):
         dirnames = []
         for index in range(self.count()):
             if self.menu_use_tooltips:
-                text = unicode(self.tabToolTip(index))
+                text = to_text_string(self.tabToolTip(index))
             else:
-                text = unicode(self.tabText(index))
+                text = to_text_string(self.tabText(index))
             names.append(text)
             if osp.isfile(text):
                 # Testing if tab names are filenames
@@ -177,7 +183,7 @@ class BaseTabs(QTabWidget):
         assert all(key in (Qt.TopLeftCorner, Qt.TopRightCorner)
                    for key in corner_widgets)
         self.corner_widgets.update(corner_widgets)
-        for corner, widgets in self.corner_widgets.iteritems():
+        for corner, widgets in list(self.corner_widgets.items()):
             cwidget = QWidget()
             cwidget.hide()
             prev_widget = self.cornerWidget(corner)
diff --git a/spyderlib/widgets/texteditor.py b/spyderlib/widgets/texteditor.py
index 16905e6..3a026d8 100644
--- a/spyderlib/widgets/texteditor.py
+++ b/spyderlib/widgets/texteditor.py
@@ -8,6 +8,8 @@
 Text Editor Dialog based on Qt
 """
 
+from __future__ import print_function
+
 from spyderlib.qt.QtCore import Qt, SIGNAL, SLOT
 from spyderlib.qt.QtGui import QVBoxLayout, QTextEdit, QDialog, QDialogButtonBox
 
@@ -15,6 +17,7 @@ from spyderlib.qt.QtGui import QVBoxLayout, QTextEdit, QDialog, QDialogButtonBox
 from spyderlib.baseconfig import _
 from spyderlib.guiconfig import get_font
 from spyderlib.utils.qthelpers import get_icon
+from spyderlib.py3compat import to_text_string
 
 
 class TextEditor(QDialog):
@@ -31,7 +34,7 @@ class TextEditor(QDialog):
         
         self.text = None
         
-        self._conv = str if isinstance(text, str) else unicode
+        self._conv = str if isinstance(text, str) else to_text_string
         
         self.layout = QVBoxLayout()
         self.setLayout(self.layout)
@@ -85,11 +88,11 @@ def test():
     dialog.show()
     if dialog.exec_():
         text = dialog.get_value()
-        print "Accepted:", text
+        print("Accepted:", text)
         dialog = TextEditor(text)
         dialog.exec_()
     else:
-        print "Canceled"
+        print("Canceled")
 
 if __name__ == "__main__":
     test()
\ No newline at end of file
diff --git a/spyderplugins/io_dicom.py b/spyderplugins/io_dicom.py
index 4508458..af4499a 100644
--- a/spyderplugins/io_dicom.py
+++ b/spyderplugins/io_dicom.py
@@ -9,7 +9,7 @@ try:
         try:
             name = osp.splitext(osp.basename(filename))[0]
             return {name: dicom.ReadFile(filename).PixelArray}, None
-        except Exception, error:
+        except Exception as error:
             return None, str(error)
 except ImportError:
     load_dicom = None
diff --git a/spyderplugins/io_hdf5.py b/spyderplugins/io_hdf5.py
index 4454e9e..be19ed6 100644
--- a/spyderplugins/io_hdf5.py
+++ b/spyderplugins/io_hdf5.py
@@ -28,6 +28,8 @@ TODO: Look for the pytables library if h5py is not found??
 TODO: Check issues with valid python names vs valid h5f5 names
 """
 
+from __future__ import print_function
+
 try:
     # Do not import h5py here because it will try to import IPython,
     # and this is freezing the Spyder GUI
@@ -39,7 +41,7 @@ try:
         import h5py
         def get_group(group):
             contents = {}
-            for name, obj in group.iteritems():
+            for name, obj in list(group.items()):
                 if isinstance(obj, h5py.Dataset):
                     contents[name] = np.array(obj)
                 elif isinstance(obj, h5py.Group):
@@ -53,17 +55,17 @@ try:
             contents = get_group(f)
             f.close()
             return contents, None
-        except Exception, error:
+        except Exception as error:
             return None, str(error)
             
     def save_hdf5(data, filename):
         import h5py
         try:
             f = h5py.File(filename, 'w')
-            for key, value in data.iteritems():
+            for key, value in list(data.items()):
                 f[key] = np.array(value)
             f.close()
-        except Exception, error:
+        except Exception as error:
             return str(error)            
 except ImportError:
     load_hdf5 = None
@@ -79,5 +81,5 @@ FORMAT_SAVE = save_hdf5
 
 if __name__ == "__main__":
     data = {'a' : [1, 2, 3, 4], 'b' : 4.5}
-    print save_hdf5(data, "test.h5")
-    print load_hdf5("test.h5")
+    print(save_hdf5(data, "test.h5"))
+    print(load_hdf5("test.h5"))
diff --git a/spyderplugins/p_breakpoints.py b/spyderplugins/p_breakpoints.py
index bc8bff7..bcc7e89 100644
--- a/spyderplugins/p_breakpoints.py
+++ b/spyderplugins/p_breakpoints.py
@@ -19,8 +19,9 @@ from spyderlib.baseconfig import get_translation
 _ = get_translation("p_breakpoints", dirname="spyderplugins")
 from spyderlib.utils.qthelpers import get_icon, create_action
 from spyderlib.plugins import SpyderPluginMixin
-
 from spyderplugins.widgets.breakpointsgui import BreakpointWidget
+from spyderlib.py3compat import to_text_string, is_text_string
+
 
 class Breakpoints(BreakpointWidget, SpyderPluginMixin):
     """Breakpoint list"""
@@ -88,10 +89,10 @@ class Breakpoints(BreakpointWidget, SpyderPluginMixin):
             except AttributeError:
                 pass
             else:
-                # Depending on Qt API version, could get a QString or
+                # Depending on Qt API version, could get a QString or 
                 # unicode from title()
-                if not isinstance(menu_title, unicode): # string is a QString
-                    menu_title = unicode(menu_title.toUtf8(), 'utf-8')
+                if not is_text_string(menu_title): # string is a QString
+                    menu_title = to_text_string(menu_title.toUtf8)
                 item.addAction(list_action)
                 # If we've reached this point it means we've located the 
                 # first QMenu in the run_menu. Since there might be other
diff --git a/spyderplugins/widgets/breakpointsgui.py b/spyderplugins/widgets/breakpointsgui.py
index a346352..3ae9092 100644
--- a/spyderplugins/widgets/breakpointsgui.py
+++ b/spyderplugins/widgets/breakpointsgui.py
@@ -12,8 +12,6 @@
 # pylint: disable=R0911
 # pylint: disable=R0201
 
-from __future__ import with_statement
-
 from spyderlib.qt.QtGui import (QWidget, QTableView, QItemDelegate,
                                 QVBoxLayout, QMenu)
 from spyderlib.qt.QtCore import (Qt, SIGNAL, QTextCodec,
@@ -46,7 +44,7 @@ class BreakpointTableModel(QAbstractTableModel):
     def set_data(self, data):
         """Set model data"""
         self._data = data
-        keys = data.keys()
+        keys = list(data.keys())
         self.breakpoints = []
         for key in keys:
             bp_list = data[key]
@@ -197,7 +195,7 @@ class BreakpointWidget(QWidget):
     
     def _load_all_breakpoints(self):
         bp_dict = CONF.get('run', 'breakpoints', {})
-        for filename in bp_dict.keys():
+        for filename in list(bp_dict.keys()):
             if not osp.isfile(filename):
                 bp_dict.pop(filename)
         return bp_dict    
diff --git a/spyderplugins/widgets/profilergui.py b/spyderplugins/widgets/profilergui.py
index d4fa06a..75b9023 100644
--- a/spyderplugins/widgets/profilergui.py
+++ b/spyderplugins/widgets/profilergui.py
@@ -1,535 +1,537 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright © 2011 Santiago Jaramillo
-# based on pylintgui.py by Pierre Raybaut
-#
-# Licensed under the terms of the MIT License
-# (see spyderlib/__init__.py for details)
-
-"""
-Profiler widget
-
-See the official documentation on python profiling:
-http://docs.python.org/library/profile.html
-
-Questions for Pierre and others:
-    - Where in the menu should profiler go?  Run > Profile code ?
-"""
-
-from __future__ import with_statement
-
-from spyderlib.qt.QtGui import (QHBoxLayout, QWidget, QMessageBox, QVBoxLayout,
-                                QLabel, QTreeWidget, QTreeWidgetItem,
-                                QApplication)
-from spyderlib.qt.QtCore import SIGNAL, QProcess, QByteArray, Qt, QTextCodec
-locale_codec = QTextCodec.codecForLocale()
-from spyderlib.qt.compat import getopenfilename
-
-import sys
-import os
-import os.path as osp
-import time
-
-# Local imports
-from spyderlib.utils.qthelpers import (create_toolbutton, get_item_user_text,
-                                       set_item_user_text, get_icon)
-from spyderlib.utils.programs import shell_split
-from spyderlib.baseconfig import get_conf_path, get_translation
-from spyderlib.widgets.texteditor import TextEditor
-from spyderlib.widgets.comboboxes import PythonModulesComboBox
-from spyderlib.widgets.externalshell import baseshell
-_ = get_translation("p_profiler", dirname="spyderplugins")
-
-
-def is_profiler_installed():
-    from spyderlib.utils.programs import is_module_installed
-    return is_module_installed('cProfile') and is_module_installed('pstats')
-
-
-class ProfilerWidget(QWidget):
-    """
-    Profiler widget
-    """
-    DATAPATH = get_conf_path('.profiler.results')
-    VERSION = '0.0.1'
-    
-    def __init__(self, parent, max_entries=100):
-        QWidget.__init__(self, parent)
-        
-        self.setWindowTitle("Profiler")
-        
-        self.output = None
-        self.error_output = None
-        
-        self._last_wdir = None
-        self._last_args = None
-        self._last_pythonpath = None
-        
-        self.filecombo = PythonModulesComboBox(self)
-        
-        self.start_button = create_toolbutton(self, icon=get_icon('run.png'),
-                                    text=_("Profile"),
-                                    tip=_("Run profiler"),
-                                    triggered=self.start, text_beside_icon=True)
-        self.stop_button = create_toolbutton(self,
-                                    icon=get_icon('terminate.png'),
-                                    text=_("Stop"),
-                                    tip=_(
-                                                  "Stop current profiling"),
-                                    text_beside_icon=True)
-        self.connect(self.filecombo, SIGNAL('valid(bool)'),
-                     self.start_button.setEnabled)
-        #self.connect(self.filecombo, SIGNAL('valid(bool)'), self.show_data)
-        # FIXME: The combobox emits this signal on almost any event
-        #        triggering show_data() too early, too often. 
-
-        browse_button = create_toolbutton(self, icon=get_icon('fileopen.png'),
-                               tip=_('Select Python script'),
-                               triggered=self.select_file)
-
-        self.datelabel = QLabel()
-
-        self.log_button = create_toolbutton(self, icon=get_icon('log.png'),
-                                            text=_("Output"),
-                                            text_beside_icon=True,
-                                            tip=_("Show program's output"),
-                                            triggered=self.show_log)
-
-        self.datatree = ProfilerDataTree(self)
-
-        self.collapse_button = create_toolbutton(self,
-                                                 icon=get_icon('collapse.png'),
-                                                 triggered=lambda dD=-1:
-                                                 self.datatree.change_view(dD),
-                                                 tip=_('Collapse one level up'))
-        self.expand_button = create_toolbutton(self,
-                                               icon=get_icon('expand.png'),
-                                               triggered=lambda dD=1:
-                                               self.datatree.change_view(dD),
-                                               tip=_('Expand one level down'))
-
-        hlayout1 = QHBoxLayout()
-        hlayout1.addWidget(self.filecombo)
-        hlayout1.addWidget(browse_button)
-        hlayout1.addWidget(self.start_button)
-        hlayout1.addWidget(self.stop_button)
-
-        hlayout2 = QHBoxLayout()
-        hlayout2.addWidget(self.collapse_button)
-        hlayout2.addWidget(self.expand_button)
-        hlayout2.addStretch()
-        hlayout2.addWidget(self.datelabel)
-        hlayout2.addStretch()
-        hlayout2.addWidget(self.log_button)
-        
-        layout = QVBoxLayout()
-        layout.addLayout(hlayout1)
-        layout.addLayout(hlayout2)
-        layout.addWidget(self.datatree)
-        self.setLayout(layout)
-        
-        self.process = None
-        self.set_running_state(False)
-        self.start_button.setEnabled(False)
-        
-        if not is_profiler_installed():
-            # This should happen only on certain GNU/Linux distributions 
-            # or when this a home-made Python build because the Python 
-            # profilers are included in the Python standard library
-            for widget in (self.datatree, self.filecombo,
-                           self.start_button, self.stop_button):
-                widget.setDisabled(True)
-            url = 'http://docs.python.org/library/profile.html'
-            text = '%s <a href=%s>%s</a>' % (_('Please install'), url,
-                                             _("the Python profiler modules"))
-            self.datelabel.setText(text)
-        else:
-            pass # self.show_data()
-        
-    def analyze(self, filename, wdir=None, args=None, pythonpath=None):
-        if not is_profiler_installed():
-            return
-        self.kill_if_running()
-        #index, _data = self.get_data(filename)
-        index = None # FIXME: storing data is not implemented yet
-        if index is None:
-            self.filecombo.addItem(filename)
-            self.filecombo.setCurrentIndex(self.filecombo.count()-1)
-        else:
-            self.filecombo.setCurrentIndex(self.filecombo.findText(filename))
-        self.filecombo.selected()
-        if self.filecombo.is_valid():
-            if wdir is None:
-                wdir = osp.dirname(filename)
-            self.start(wdir, args, pythonpath)
-            
-    def select_file(self):
-        self.emit(SIGNAL('redirect_stdio(bool)'), False)
-        filename, _selfilter = getopenfilename(self, _("Select Python script"),
-                           os.getcwdu(), _("Python scripts")+" (*.py ; *.pyw)")
-        self.emit(SIGNAL('redirect_stdio(bool)'), False)
-        if filename:
-            self.analyze(filename)
-        
-    def show_log(self):
-        if self.output:
-            TextEditor(self.output, title=_("Profiler output"),
-                       readonly=True, size=(700, 500)).exec_()
-    
-    def show_errorlog(self):
-        if self.error_output:
-            TextEditor(self.error_output, title=_("Profiler output"),
-                       readonly=True, size=(700, 500)).exec_()
-
-    def start(self, wdir=None, args=None, pythonpath=None):
-        filename = unicode(self.filecombo.currentText())
-        if wdir is None:
-            wdir = self._last_wdir
-            if wdir is None:
-                wdir = osp.basename(filename)
-        if args is None:
-            args = self._last_args
-            if args is None:
-                args = []
-        if pythonpath is None:
-            pythonpath = self._last_pythonpath
-        self._last_wdir = wdir
-        self._last_args = args
-        self._last_pythonpath = pythonpath
-        
-        self.datelabel.setText(_('Profiling, please wait...'))
-        
-        self.process = QProcess(self)
-        self.process.setProcessChannelMode(QProcess.SeparateChannels)
-        self.process.setWorkingDirectory(wdir)
-        self.connect(self.process, SIGNAL("readyReadStandardOutput()"),
-                     self.read_output)
-        self.connect(self.process, SIGNAL("readyReadStandardError()"),
-                     lambda: self.read_output(error=True))
-        self.connect(self.process,
-                     SIGNAL("finished(int,QProcess::ExitStatus)"),
-                     self.finished)
-        self.connect(self.stop_button, SIGNAL("clicked()"), self.process.kill)
-
-        if pythonpath is not None:
-            env = [unicode(_pth) for _pth in self.process.systemEnvironment()]
-            baseshell.add_pathlist_to_PYTHONPATH(env, pythonpath)
-            self.process.setEnvironment(env)
-        
-        self.output = ''
-        self.error_output = ''
-        
-        p_args = ['-m', 'cProfile', '-o', self.DATAPATH]
-        if os.name == 'nt':
-            # On Windows, one has to replace backslashes by slashes to avoid 
-            # confusion with escape characters (otherwise, for example, '\t' 
-            # will be interpreted as a tabulation):
-            p_args.append(osp.normpath(filename).replace(os.sep, '/'))
-        else:
-            p_args.append(filename)
-        if args:
-            p_args.extend(shell_split(args))
-        executable = sys.executable
-        if executable.endswith("spyder.exe"):
-            # py2exe distribution
-            executable = "python.exe"
-        self.process.start(executable, p_args)
-        
-        running = self.process.waitForStarted()
-        self.set_running_state(running)
-        if not running:
-            QMessageBox.critical(self, _("Error"),
-                                 _("Process failed to start"))
-    
-    def set_running_state(self, state=True):
-        self.start_button.setEnabled(not state)
-        self.stop_button.setEnabled(state)
-        
-    def read_output(self, error=False):
-        if error:
-            self.process.setReadChannel(QProcess.StandardError)
-        else:
-            self.process.setReadChannel(QProcess.StandardOutput)
-        bytes = QByteArray()
-        while self.process.bytesAvailable():
-            if error:
-                bytes += self.process.readAllStandardError()
-            else:
-                bytes += self.process.readAllStandardOutput()
-        text = unicode( locale_codec.toUnicode(bytes.data()) )
-        if error:
-            self.error_output += text
-        else:
-            self.output += text
-        
-    def finished(self):
-        self.set_running_state(False)
-        self.show_errorlog()  # If errors occurred, show them.
-        self.output = self.error_output + self.output
-        # FIXME: figure out if show_data should be called here or
-        #        as a signal from the combobox
-        self.show_data(justanalyzed=True)
-                
-    def kill_if_running(self):
-        if self.process is not None:
-            if self.process.state() == QProcess.Running:
-                self.process.kill()
-                self.process.waitForFinished()
-        
-    def show_data(self, justanalyzed=False):
-        if not justanalyzed:
-            self.output = None
-        self.log_button.setEnabled(self.output is not None \
-                                   and len(self.output) > 0)
-        self.kill_if_running()
-        filename = unicode(self.filecombo.currentText())
-        if not filename:
-            return
-
-        self.datatree.load_data(self.DATAPATH)
-        self.datelabel.setText(_('Sorting data, please wait...'))
-        QApplication.processEvents()
-        self.datatree.show_tree()
-            
-        text_style = "<span style=\'color: #444444\'><b>%s </b></span>"
-        date_text = text_style % time.strftime("%d %b %Y %H:%M",
-                                               time.localtime())
-        self.datelabel.setText(date_text)
-
-
-class ProfilerDataTree(QTreeWidget):
-    """
-    Convenience tree widget (with built-in model) 
-    to store and view profiler data.
-
-    The quantities calculated by the profiler are as follows 
-    (from profile.Profile):
-    [0] = The number of times this function was called, not counting direct
-          or indirect recursion,
-    [1] = Number of times this function appears on the stack, minus one
-    [2] = Total time spent internal to this function
-    [3] = Cumulative time that this function was present on the stack.  In
-          non-recursive functions, this is the total execution time from start
-          to finish of each invocation of a function, including time spent in
-          all subfunctions.
-    [4] = A dictionary indicating for each function name, the number of times
-          it was called by us.
-    """
-    SEP = r"<[=]>"  # separator between filename and linenumber
-    # (must be improbable as a filename to avoid splitting the filename itself)
-    def __init__(self, parent=None):
-        QTreeWidget.__init__(self, parent)
-        self.header_list = [_('Function/Module'), _('Total Time'),
-                            _('Local Time'), _('Calls'), _('File:line')]
-        self.icon_list = {'module':      'python.png',
-                         'function':    'function.png',
-                         'builtin':     'python_t.png',
-                         'constructor': 'class.png'}
-        self.profdata = None   # To be filled by self.load_data()
-        self.stats = None      # To be filled by self.load_data()
-        self.item_depth = None
-        self.item_list = None
-        self.items_to_be_shown = None
-        self.current_view_depth = None
-        self.setColumnCount(len(self.header_list))
-        self.setHeaderLabels(self.header_list)
-        self.initialize_view()
-        self.connect(self, SIGNAL('itemActivated(QTreeWidgetItem*,int)'),
-                     self.item_activated)
-        self.connect(self, SIGNAL('itemExpanded(QTreeWidgetItem*)'),
-                     self.item_expanded)
-
-    def set_item_data(self, item, filename, line_number):
-        """Set tree item user data: filename (string) and line_number (int)"""
-        set_item_user_text(item, '%s%s%d' % (filename, self.SEP, line_number))
-    
-    def get_item_data(self, item):
-        """Get tree item user data: (filename, line_number)"""
-        filename, line_number_str = get_item_user_text(item).split(self.SEP)
-        return filename, int(line_number_str)
-
-    def initialize_view(self):
-        """Clean the tree and view parameters"""
-        self.clear()
-        self.item_depth = 0   # To be use for collapsing/expanding one level
-        self.item_list = []  # To be use for collapsing/expanding one level
-        self.items_to_be_shown = {}
-        self.current_view_depth = 0
-
-    def load_data(self, profdatafile):
-        """Load profiler data saved by profile/cProfile module"""
-        import pstats
-        self.profdata = pstats.Stats(profdatafile)
-        self.profdata.calc_callees()
-        self.stats = self.profdata.stats
-
-    def find_root(self):
-        """Find a function without a caller"""
-        for func, (cc, nc, tt, ct, callers) in self.stats.iteritems():
-            if not callers and self.find_callees(func):
-                return func
-    
-    def find_root_skip_profilerfuns(self):
-        """Define root ignoring profiler-specific functions."""
-        # FIXME: this is specific to module 'profile' and has to be
-        #        changed for cProfile
-        #return ('', 0, 'execfile')     # For 'profile' module   
-        return ('~', 0, '<execfile>')     # For 'cProfile' module   
-    
-    def find_callees(self, parent):
-        """Find all functions called by (parent) function."""
-        # FIXME: This implementation is very inneficient, because it
-        #        traverses all the data to find children nodes (callees)
-        return self.profdata.all_callees[parent]
-
-    def show_tree(self):
-        """Populate the tree with profiler data and display it."""
-        self.initialize_view() # Clear before re-populating
-        self.setItemsExpandable(True)
-        self.setSortingEnabled(False)
-        rootkey = self.find_root()  # This root contains profiler overhead
-#        rootkey = self.find_root_skip_profilerfuns()
-        if rootkey:
-            self.populate_tree(self, self.find_callees(rootkey))
-            self.resizeColumnToContents(0)
-            self.setSortingEnabled(True)
-            self.sortItems(1, Qt.DescendingOrder) # FIXME: hardcoded index
-            self.change_view(1)
-
-    def function_info(self, functionKey):
-        """Returns processed information about the function's name and file."""
-        node_type = 'function'
-        filename, line_number, function_name = functionKey
-        if function_name == '<module>':
-            modulePath, moduleName = osp.split(filename)
-            node_type = 'module'
-            if moduleName == '__init__.py':
-                modulePath, moduleName = osp.split(modulePath)
-            function_name = '<' + moduleName + '>'
-        if not filename or filename == '~':
-            file_and_line = '(built-in)'
-            node_type = 'builtin'
-        else:
-            if function_name == '__init__':
-                node_type = 'constructor'                
-            file_and_line = '%s : %d' % (filename, line_number)
-        return filename, line_number, function_name, file_and_line, node_type
-    
-    def populate_tree(self, parentItem, children_list):
-        """Recursive method to create each item (and associated data) in the tree."""
-        for child_key in children_list:
-            self.item_depth += 1
-            (filename, line_number, function_name, file_and_line, node_type
-             ) = self.function_info(child_key)
-            (primcalls, total_calls, loc_time, cum_time, callers
-             ) = self.stats[child_key]
-            child_item = QTreeWidgetItem(parentItem)
-            self.item_list.append(child_item)
-            self.set_item_data(child_item, filename, line_number)
-
-            # FIXME: indexes to data should be defined by a dictionary on init
-            child_item.setToolTip(0, 'Function or module name')
-            child_item.setData(0, Qt.DisplayRole, function_name)
-            child_item.setIcon(0, get_icon(self.icon_list[node_type]))
-
-            child_item.setToolTip(1, _('Time in function '\
-                                       '(including sub-functions)'))
-            #child_item.setData(1, Qt.DisplayRole, cum_time)
-            child_item.setData(1, Qt.DisplayRole, '%.3f' % cum_time)
-            child_item.setTextAlignment(1, Qt.AlignCenter)
-
-            child_item.setToolTip(2,_('Local time in function '\
-                                      '(not in sub-functions)'))
-            #child_item.setData(2, Qt.DisplayRole, loc_time)
-            child_item.setData(2, Qt.DisplayRole, '%.3f' % loc_time)
-            child_item.setTextAlignment(2,Qt.AlignCenter)
-
-            child_item.setToolTip(3, _('Total number of calls '\
-                                       '(including recursion)'))
-            child_item.setData(3, Qt.DisplayRole, total_calls)
-            child_item.setTextAlignment(3, Qt.AlignCenter)
-
-            child_item.setToolTip(4, _('File:line '\
-                                       'where function is defined'))
-            child_item.setData(4, Qt.DisplayRole, file_and_line)
-            #child_item.setExpanded(True)
-            if self.is_recursive(child_item):
-                child_item.setData(4, Qt.DisplayRole, '(%s)' % _('recursion'))
-                child_item.setDisabled(True)
-            else:
-                callees = self.find_callees(child_key)
-                if self.item_depth < 3:
-                    self.populate_tree(child_item, callees)
-                elif callees:
-                    child_item.setChildIndicatorPolicy(child_item.ShowIndicator)
-                    self.items_to_be_shown[child_item] = callees
-            self.item_depth -= 1
-        
-    def item_activated(self, item):
-        filename, line_number = self.get_item_data(item)
-        self.parent().emit(SIGNAL("edit_goto(QString,int,QString)"),
-                           filename, line_number, '')
-            
-    def item_expanded(self, item):
-        if item.childCount() == 0 and item in self.items_to_be_shown:
-            callees = self.items_to_be_shown[item]
-            self.populate_tree(item, callees)
-    
-    def is_recursive(self, child_item):
-        """Returns True is a function is a descendant of itself."""
-        ancestor = child_item.parent()
-        # FIXME: indexes to data should be defined by a dictionary on init
-        while ancestor:
-            if (child_item.data(0, Qt.DisplayRole
-                                ) == ancestor.data(0, Qt.DisplayRole) and
-                child_item.data(4, Qt.DisplayRole
-                                ) == ancestor.data(4, Qt.DisplayRole)):
-                return True
-            else:
-                ancestor = ancestor.parent()
-        return False
-    
-    def get_top_level_items(self):
-        """Iterate over top level items"""
-        return [self.topLevelItem(_i) for _i in range(self.topLevelItemCount())]
-    
-    def get_items(self, maxlevel):
-        """Return items (excluding top level items)"""
-        itemlist = []
-        def add_to_itemlist(item, maxlevel, level=1):
-            level += 1
-            for index in range(item.childCount()):
-                citem = item.child(index)
-                itemlist.append(citem)
-                if level <= maxlevel:
-                    add_to_itemlist(citem, maxlevel, level)
-        for tlitem in self.get_top_level_items():
-            itemlist.append(tlitem)
-            if maxlevel > 1:
-                add_to_itemlist(tlitem, maxlevel=maxlevel)
-        return itemlist
-            
-    def change_view(self, change_in_depth):
-        """Change the view depth by expand or collapsing all same-level nodes"""
-        self.current_view_depth += change_in_depth
-        if self.current_view_depth < 1:
-            self.current_view_depth = 1
-        self.collapseAll()
-        for item in self.get_items(maxlevel=self.current_view_depth):
-            item.setExpanded(True)
-    
-
-def test():
-    """Run widget test"""
-    from spyderlib.utils.qthelpers import qapplication
-    app = qapplication()
-    widget = ProfilerWidget(None)
-    widget.resize(800, 600)
-    widget.show()
-    #widget.analyze(__file__)
-    widget.analyze(osp.join(osp.dirname(__file__), os.pardir, os.pardir,
-                            'rope_profiling', 'test.py'))
-    sys.exit(app.exec_())
-    
-if __name__ == '__main__':
-    test()
+# -*- coding: utf-8 -*-
+#
+# Copyright © 2011 Santiago Jaramillo
+# based on pylintgui.py by Pierre Raybaut
+#
+# Licensed under the terms of the MIT License
+# (see spyderlib/__init__.py for details)
+
+"""
+Profiler widget
+
+See the official documentation on python profiling:
+http://docs.python.org/library/profile.html
+
+Questions for Pierre and others:
+    - Where in the menu should profiler go?  Run > Profile code ?
+"""
+
+from __future__ import with_statement
+
+from spyderlib.qt.QtGui import (QHBoxLayout, QWidget, QMessageBox, QVBoxLayout,
+                                QLabel, QTreeWidget, QTreeWidgetItem,
+                                QApplication)
+from spyderlib.qt.QtCore import SIGNAL, QProcess, QByteArray, Qt, QTextCodec
+locale_codec = QTextCodec.codecForLocale()
+from spyderlib.qt.compat import getopenfilename
+
+import sys
+import os
+import os.path as osp
+import time
+
+# Local imports
+from spyderlib.utils.qthelpers import (create_toolbutton, get_item_user_text,
+                                       set_item_user_text, get_icon)
+from spyderlib.utils.programs import shell_split
+from spyderlib.baseconfig import get_conf_path, get_translation
+from spyderlib.widgets.texteditor import TextEditor
+from spyderlib.widgets.comboboxes import PythonModulesComboBox
+from spyderlib.widgets.externalshell import baseshell
+from spyderlib.py3compat import to_text_string, getcwd
+_ = get_translation("p_profiler", dirname="spyderplugins")
+
+
+def is_profiler_installed():
+    from spyderlib.utils.programs import is_module_installed
+    return is_module_installed('cProfile') and is_module_installed('pstats')
+
+
+class ProfilerWidget(QWidget):
+    """
+    Profiler widget
+    """
+    DATAPATH = get_conf_path('profiler.results')
+    VERSION = '0.0.1'
+    
+    def __init__(self, parent, max_entries=100):
+        QWidget.__init__(self, parent)
+        
+        self.setWindowTitle("Profiler")
+        
+        self.output = None
+        self.error_output = None
+        
+        self._last_wdir = None
+        self._last_args = None
+        self._last_pythonpath = None
+        
+        self.filecombo = PythonModulesComboBox(self)
+        
+        self.start_button = create_toolbutton(self, icon=get_icon('run.png'),
+                                    text=_("Profile"),
+                                    tip=_("Run profiler"),
+                                    triggered=self.start, text_beside_icon=True)
+        self.stop_button = create_toolbutton(self,
+                                    icon=get_icon('terminate.png'),
+                                    text=_("Stop"),
+                                    tip=_(
+                                                  "Stop current profiling"),
+                                    text_beside_icon=True)
+        self.connect(self.filecombo, SIGNAL('valid(bool)'),
+                     self.start_button.setEnabled)
+        #self.connect(self.filecombo, SIGNAL('valid(bool)'), self.show_data)
+        # FIXME: The combobox emits this signal on almost any event
+        #        triggering show_data() too early, too often. 
+
+        browse_button = create_toolbutton(self, icon=get_icon('fileopen.png'),
+                               tip=_('Select Python script'),
+                               triggered=self.select_file)
+
+        self.datelabel = QLabel()
+
+        self.log_button = create_toolbutton(self, icon=get_icon('log.png'),
+                                            text=_("Output"),
+                                            text_beside_icon=True,
+                                            tip=_("Show program's output"),
+                                            triggered=self.show_log)
+
+        self.datatree = ProfilerDataTree(self)
+
+        self.collapse_button = create_toolbutton(self,
+                                                 icon=get_icon('collapse.png'),
+                                                 triggered=lambda dD=-1:
+                                                 self.datatree.change_view(dD),
+                                                 tip=_('Collapse one level up'))
+        self.expand_button = create_toolbutton(self,
+                                               icon=get_icon('expand.png'),
+                                               triggered=lambda dD=1:
+                                               self.datatree.change_view(dD),
+                                               tip=_('Expand one level down'))
+
+        hlayout1 = QHBoxLayout()
+        hlayout1.addWidget(self.filecombo)
+        hlayout1.addWidget(browse_button)
+        hlayout1.addWidget(self.start_button)
+        hlayout1.addWidget(self.stop_button)
+
+        hlayout2 = QHBoxLayout()
+        hlayout2.addWidget(self.collapse_button)
+        hlayout2.addWidget(self.expand_button)
+        hlayout2.addStretch()
+        hlayout2.addWidget(self.datelabel)
+        hlayout2.addStretch()
+        hlayout2.addWidget(self.log_button)
+        
+        layout = QVBoxLayout()
+        layout.addLayout(hlayout1)
+        layout.addLayout(hlayout2)
+        layout.addWidget(self.datatree)
+        self.setLayout(layout)
+        
+        self.process = None
+        self.set_running_state(False)
+        self.start_button.setEnabled(False)
+        
+        if not is_profiler_installed():
+            # This should happen only on certain GNU/Linux distributions 
+            # or when this a home-made Python build because the Python 
+            # profilers are included in the Python standard library
+            for widget in (self.datatree, self.filecombo,
+                           self.start_button, self.stop_button):
+                widget.setDisabled(True)
+            url = 'http://docs.python.org/library/profile.html'
+            text = '%s <a href=%s>%s</a>' % (_('Please install'), url,
+                                             _("the Python profiler modules"))
+            self.datelabel.setText(text)
+        else:
+            pass # self.show_data()
+        
+    def analyze(self, filename, wdir=None, args=None, pythonpath=None):
+        if not is_profiler_installed():
+            return
+        self.kill_if_running()
+        #index, _data = self.get_data(filename)
+        index = None # FIXME: storing data is not implemented yet
+        if index is None:
+            self.filecombo.addItem(filename)
+            self.filecombo.setCurrentIndex(self.filecombo.count()-1)
+        else:
+            self.filecombo.setCurrentIndex(self.filecombo.findText(filename))
+        self.filecombo.selected()
+        if self.filecombo.is_valid():
+            if wdir is None:
+                wdir = osp.dirname(filename)
+            self.start(wdir, args, pythonpath)
+            
+    def select_file(self):
+        self.emit(SIGNAL('redirect_stdio(bool)'), False)
+        filename, _selfilter = getopenfilename(self, _("Select Python script"),
+                           getcwd(), _("Python scripts")+" (*.py ; *.pyw)")
+        self.emit(SIGNAL('redirect_stdio(bool)'), False)
+        if filename:
+            self.analyze(filename)
+        
+    def show_log(self):
+        if self.output:
+            TextEditor(self.output, title=_("Profiler output"),
+                       readonly=True, size=(700, 500)).exec_()
+    
+    def show_errorlog(self):
+        if self.error_output:
+            TextEditor(self.error_output, title=_("Profiler output"),
+                       readonly=True, size=(700, 500)).exec_()
+
+    def start(self, wdir=None, args=None, pythonpath=None):
+        filename = to_text_string(self.filecombo.currentText())
+        if wdir is None:
+            wdir = self._last_wdir
+            if wdir is None:
+                wdir = osp.basename(filename)
+        if args is None:
+            args = self._last_args
+            if args is None:
+                args = []
+        if pythonpath is None:
+            pythonpath = self._last_pythonpath
+        self._last_wdir = wdir
+        self._last_args = args
+        self._last_pythonpath = pythonpath
+        
+        self.datelabel.setText(_('Profiling, please wait...'))
+        
+        self.process = QProcess(self)
+        self.process.setProcessChannelMode(QProcess.SeparateChannels)
+        self.process.setWorkingDirectory(wdir)
+        self.connect(self.process, SIGNAL("readyReadStandardOutput()"),
+                     self.read_output)
+        self.connect(self.process, SIGNAL("readyReadStandardError()"),
+                     lambda: self.read_output(error=True))
+        self.connect(self.process,
+                     SIGNAL("finished(int,QProcess::ExitStatus)"),
+                     self.finished)
+        self.connect(self.stop_button, SIGNAL("clicked()"), self.process.kill)
+
+        if pythonpath is not None:
+            env = [to_text_string(_pth)
+                   for _pth in self.process.systemEnvironment()]
+            baseshell.add_pathlist_to_PYTHONPATH(env, pythonpath)
+            self.process.setEnvironment(env)
+        
+        self.output = ''
+        self.error_output = ''
+        
+        p_args = ['-m', 'cProfile', '-o', self.DATAPATH]
+        if os.name == 'nt':
+            # On Windows, one has to replace backslashes by slashes to avoid 
+            # confusion with escape characters (otherwise, for example, '\t' 
+            # will be interpreted as a tabulation):
+            p_args.append(osp.normpath(filename).replace(os.sep, '/'))
+        else:
+            p_args.append(filename)
+        if args:
+            p_args.extend(shell_split(args))
+        executable = sys.executable
+        if executable.endswith("spyder.exe"):
+            # py2exe distribution
+            executable = "python.exe"
+        self.process.start(executable, p_args)
+        
+        running = self.process.waitForStarted()
+        self.set_running_state(running)
+        if not running:
+            QMessageBox.critical(self, _("Error"),
+                                 _("Process failed to start"))
+    
+    def set_running_state(self, state=True):
+        self.start_button.setEnabled(not state)
+        self.stop_button.setEnabled(state)
+        
+    def read_output(self, error=False):
+        if error:
+            self.process.setReadChannel(QProcess.StandardError)
+        else:
+            self.process.setReadChannel(QProcess.StandardOutput)
+        qba = QByteArray()
+        while self.process.bytesAvailable():
+            if error:
+                qba += self.process.readAllStandardError()
+            else:
+                qba += self.process.readAllStandardOutput()
+        text = to_text_string( locale_codec.toUnicode(qba.data()) )
+        if error:
+            self.error_output += text
+        else:
+            self.output += text
+        
+    def finished(self):
+        self.set_running_state(False)
+        self.show_errorlog()  # If errors occurred, show them.
+        self.output = self.error_output + self.output
+        # FIXME: figure out if show_data should be called here or
+        #        as a signal from the combobox
+        self.show_data(justanalyzed=True)
+                
+    def kill_if_running(self):
+        if self.process is not None:
+            if self.process.state() == QProcess.Running:
+                self.process.kill()
+                self.process.waitForFinished()
+        
+    def show_data(self, justanalyzed=False):
+        if not justanalyzed:
+            self.output = None
+        self.log_button.setEnabled(self.output is not None \
+                                   and len(self.output) > 0)
+        self.kill_if_running()
+        filename = to_text_string(self.filecombo.currentText())
+        if not filename:
+            return
+
+        self.datatree.load_data(self.DATAPATH)
+        self.datelabel.setText(_('Sorting data, please wait...'))
+        QApplication.processEvents()
+        self.datatree.show_tree()
+            
+        text_style = "<span style=\'color: #444444\'><b>%s </b></span>"
+        date_text = text_style % time.strftime("%d %b %Y %H:%M",
+                                               time.localtime())
+        self.datelabel.setText(date_text)
+
+
+class ProfilerDataTree(QTreeWidget):
+    """
+    Convenience tree widget (with built-in model) 
+    to store and view profiler data.
+
+    The quantities calculated by the profiler are as follows 
+    (from profile.Profile):
+    [0] = The number of times this function was called, not counting direct
+          or indirect recursion,
+    [1] = Number of times this function appears on the stack, minus one
+    [2] = Total time spent internal to this function
+    [3] = Cumulative time that this function was present on the stack.  In
+          non-recursive functions, this is the total execution time from start
+          to finish of each invocation of a function, including time spent in
+          all subfunctions.
+    [4] = A dictionary indicating for each function name, the number of times
+          it was called by us.
+    """
+    SEP = r"<[=]>"  # separator between filename and linenumber
+    # (must be improbable as a filename to avoid splitting the filename itself)
+    def __init__(self, parent=None):
+        QTreeWidget.__init__(self, parent)
+        self.header_list = [_('Function/Module'), _('Total Time'),
+                            _('Local Time'), _('Calls'), _('File:line')]
+        self.icon_list = {'module':      'python.png',
+                         'function':    'function.png',
+                         'builtin':     'python_t.png',
+                         'constructor': 'class.png'}
+        self.profdata = None   # To be filled by self.load_data()
+        self.stats = None      # To be filled by self.load_data()
+        self.item_depth = None
+        self.item_list = None
+        self.items_to_be_shown = None
+        self.current_view_depth = None
+        self.setColumnCount(len(self.header_list))
+        self.setHeaderLabels(self.header_list)
+        self.initialize_view()
+        self.connect(self, SIGNAL('itemActivated(QTreeWidgetItem*,int)'),
+                     self.item_activated)
+        self.connect(self, SIGNAL('itemExpanded(QTreeWidgetItem*)'),
+                     self.item_expanded)
+
+    def set_item_data(self, item, filename, line_number):
+        """Set tree item user data: filename (string) and line_number (int)"""
+        set_item_user_text(item, '%s%s%d' % (filename, self.SEP, line_number))
+    
+    def get_item_data(self, item):
+        """Get tree item user data: (filename, line_number)"""
+        filename, line_number_str = get_item_user_text(item).split(self.SEP)
+        return filename, int(line_number_str)
+
+    def initialize_view(self):
+        """Clean the tree and view parameters"""
+        self.clear()
+        self.item_depth = 0   # To be use for collapsing/expanding one level
+        self.item_list = []  # To be use for collapsing/expanding one level
+        self.items_to_be_shown = {}
+        self.current_view_depth = 0
+
+    def load_data(self, profdatafile):
+        """Load profiler data saved by profile/cProfile module"""
+        import pstats
+        self.profdata = pstats.Stats(profdatafile)
+        self.profdata.calc_callees()
+        self.stats = self.profdata.stats
+
+    def find_root(self):
+        """Find a function without a caller"""
+        for func, (cc, nc, tt, ct, callers) in list(self.stats.items()):
+            if not callers and self.find_callees(func):
+                return func
+    
+    def find_root_skip_profilerfuns(self):
+        """Define root ignoring profiler-specific functions."""
+        # FIXME: this is specific to module 'profile' and has to be
+        #        changed for cProfile
+        #return ('', 0, 'execfile')     # For 'profile' module   
+        return ('~', 0, '<execfile>')     # For 'cProfile' module   
+    
+    def find_callees(self, parent):
+        """Find all functions called by (parent) function."""
+        # FIXME: This implementation is very inneficient, because it
+        #        traverses all the data to find children nodes (callees)
+        return self.profdata.all_callees[parent]
+
+    def show_tree(self):
+        """Populate the tree with profiler data and display it."""
+        self.initialize_view() # Clear before re-populating
+        self.setItemsExpandable(True)
+        self.setSortingEnabled(False)
+        rootkey = self.find_root()  # This root contains profiler overhead
+#        rootkey = self.find_root_skip_profilerfuns()
+        if rootkey:
+            self.populate_tree(self, self.find_callees(rootkey))
+            self.resizeColumnToContents(0)
+            self.setSortingEnabled(True)
+            self.sortItems(1, Qt.DescendingOrder) # FIXME: hardcoded index
+            self.change_view(1)
+
+    def function_info(self, functionKey):
+        """Returns processed information about the function's name and file."""
+        node_type = 'function'
+        filename, line_number, function_name = functionKey
+        if function_name == '<module>':
+            modulePath, moduleName = osp.split(filename)
+            node_type = 'module'
+            if moduleName == '__init__.py':
+                modulePath, moduleName = osp.split(modulePath)
+            function_name = '<' + moduleName + '>'
+        if not filename or filename == '~':
+            file_and_line = '(built-in)'
+            node_type = 'builtin'
+        else:
+            if function_name == '__init__':
+                node_type = 'constructor'                
+            file_and_line = '%s : %d' % (filename, line_number)
+        return filename, line_number, function_name, file_and_line, node_type
+    
+    def populate_tree(self, parentItem, children_list):
+        """Recursive method to create each item (and associated data) in the tree."""
+        for child_key in children_list:
+            self.item_depth += 1
+            (filename, line_number, function_name, file_and_line, node_type
+             ) = self.function_info(child_key)
+            (primcalls, total_calls, loc_time, cum_time, callers
+             ) = self.stats[child_key]
+            child_item = QTreeWidgetItem(parentItem)
+            self.item_list.append(child_item)
+            self.set_item_data(child_item, filename, line_number)
+
+            # FIXME: indexes to data should be defined by a dictionary on init
+            child_item.setToolTip(0, 'Function or module name')
+            child_item.setData(0, Qt.DisplayRole, function_name)
+            child_item.setIcon(0, get_icon(self.icon_list[node_type]))
+
+            child_item.setToolTip(1, _('Time in function '\
+                                       '(including sub-functions)'))
+            #child_item.setData(1, Qt.DisplayRole, cum_time)
+            child_item.setData(1, Qt.DisplayRole, '%.3f' % cum_time)
+            child_item.setTextAlignment(1, Qt.AlignCenter)
+
+            child_item.setToolTip(2, _('Local time in function '\
+                                      '(not in sub-functions)'))
+            #child_item.setData(2, Qt.DisplayRole, loc_time)
+            child_item.setData(2, Qt.DisplayRole, '%.3f' % loc_time)
+            child_item.setTextAlignment(2, Qt.AlignCenter)
+
+            child_item.setToolTip(3, _('Total number of calls '\
+                                       '(including recursion)'))
+            child_item.setData(3, Qt.DisplayRole, total_calls)
+            child_item.setTextAlignment(3, Qt.AlignCenter)
+
+            child_item.setToolTip(4, _('File:line '\
+                                       'where function is defined'))
+            child_item.setData(4, Qt.DisplayRole, file_and_line)
+            #child_item.setExpanded(True)
+            if self.is_recursive(child_item):
+                child_item.setData(4, Qt.DisplayRole, '(%s)' % _('recursion'))
+                child_item.setDisabled(True)
+            else:
+                callees = self.find_callees(child_key)
+                if self.item_depth < 3:
+                    self.populate_tree(child_item, callees)
+                elif callees:
+                    child_item.setChildIndicatorPolicy(child_item.ShowIndicator)
+                    self.items_to_be_shown[id(child_item)] = callees
+            self.item_depth -= 1
+        
+    def item_activated(self, item):
+        filename, line_number = self.get_item_data(item)
+        self.parent().emit(SIGNAL("edit_goto(QString,int,QString)"),
+                           filename, line_number, '')
+            
+    def item_expanded(self, item):
+        if item.childCount() == 0 and id(item) in self.items_to_be_shown:
+            callees = self.items_to_be_shown[id(item)]
+            self.populate_tree(item, callees)
+    
+    def is_recursive(self, child_item):
+        """Returns True is a function is a descendant of itself."""
+        ancestor = child_item.parent()
+        # FIXME: indexes to data should be defined by a dictionary on init
+        while ancestor:
+            if (child_item.data(0, Qt.DisplayRole
+                                ) == ancestor.data(0, Qt.DisplayRole) and
+                child_item.data(4, Qt.DisplayRole
+                                ) == ancestor.data(4, Qt.DisplayRole)):
+                return True
+            else:
+                ancestor = ancestor.parent()
+        return False
+    
+    def get_top_level_items(self):
+        """Iterate over top level items"""
+        return [self.topLevelItem(_i) for _i in range(self.topLevelItemCount())]
+    
+    def get_items(self, maxlevel):
+        """Return items (excluding top level items)"""
+        itemlist = []
+        def add_to_itemlist(item, maxlevel, level=1):
+            level += 1
+            for index in range(item.childCount()):
+                citem = item.child(index)
+                itemlist.append(citem)
+                if level <= maxlevel:
+                    add_to_itemlist(citem, maxlevel, level)
+        for tlitem in self.get_top_level_items():
+            itemlist.append(tlitem)
+            if maxlevel > 1:
+                add_to_itemlist(tlitem, maxlevel=maxlevel)
+        return itemlist
+            
+    def change_view(self, change_in_depth):
+        """Change the view depth by expand or collapsing all same-level nodes"""
+        self.current_view_depth += change_in_depth
+        if self.current_view_depth < 1:
+            self.current_view_depth = 1
+        self.collapseAll()
+        for item in self.get_items(maxlevel=self.current_view_depth):
+            item.setExpanded(True)
+    
+
+def test():
+    """Run widget test"""
+    from spyderlib.utils.qthelpers import qapplication
+    app = qapplication()
+    widget = ProfilerWidget(None)
+    widget.resize(800, 600)
+    widget.show()
+    #widget.analyze(__file__)
+    widget.analyze(osp.join(osp.dirname(__file__), os.pardir, os.pardir,
+                            'rope_profiling', 'test.py'))
+    sys.exit(app.exec_())
+    
+if __name__ == '__main__':
+    test()
diff --git a/spyderplugins/widgets/pylintgui.py b/spyderplugins/widgets/pylintgui.py
index 4260700..a69c7c3 100644
--- a/spyderplugins/widgets/pylintgui.py
+++ b/spyderplugins/widgets/pylintgui.py
@@ -23,7 +23,6 @@ import sys
 import os
 import os.path as osp
 import time
-import cPickle
 import re
 import subprocess
 
@@ -37,6 +36,7 @@ from spyderlib.widgets.onecolumntree import OneColumnTree
 from spyderlib.widgets.texteditor import TextEditor
 from spyderlib.widgets.comboboxes import (PythonModulesComboBox,
                                           is_module_or_package)
+from spyderlib.py3compat import to_text_string, getcwd, pickle
 _ = get_translation("p_pylint", dirname="spyderplugins")
 
 
@@ -76,7 +76,7 @@ class ResultsTree(OneColumnTree):
         
     def activated(self, item):
         """Double-click event"""
-        data = self.data.get(item)
+        data = self.data.get(id(item))
         if data is not None:
             fname, lineno = data
             self.parent().emit(SIGNAL("edit_goto(QString,int,QString)"),
@@ -150,14 +150,14 @@ class ResultsTree(OneColumnTree):
                     text = "%d : %s" % (lineno, message)
                 msg_item = QTreeWidgetItem(parent, [text], QTreeWidgetItem.Type)
                 msg_item.setIcon(0, get_icon('arrow.png'))
-                self.data[msg_item] = (modname, lineno)
+                self.data[id(msg_item)] = (modname, lineno)
 
 
 class PylintWidget(QWidget):
     """
     Pylint widget
     """
-    DATAPATH = get_conf_path('.pylint.results')
+    DATAPATH = get_conf_path('pylint.results')
     VERSION = '1.1.0'
     
     def __init__(self, parent, max_entries=100):
@@ -172,10 +172,10 @@ class PylintWidget(QWidget):
         self.rdata = []
         if osp.isfile(self.DATAPATH):
             try:
-                data = cPickle.loads(file(self.DATAPATH, 'U').read())
+                data = pickle.loads(open(self.DATAPATH, 'rb').read())
                 if data[0] == self.VERSION:
                     self.rdata = data[1:]
-            except EOFError:
+            except (EOFError, ImportError):
                 pass
 
         self.filecombo = PythonModulesComboBox(self)
@@ -241,7 +241,7 @@ class PylintWidget(QWidget):
                 # Pylint is installed but pylint script is not in PATH
                 # (AFAIK, could happen only on Windows)
                 text = _('Pylint script was not found. Please add "%s" to PATH.')
-                text = unicode(text) % osp.join(sys.prefix, "Scripts")
+                text = to_text_string(text) % osp.join(sys.prefix, "Scripts")
             else:
                 text = _('Please install <b>pylint</b>:')
                 url = 'http://www.logilab.fr'
@@ -253,7 +253,7 @@ class PylintWidget(QWidget):
     def analyze(self, filename):
         if PYLINT_PATH is None:
             return
-        filename = unicode(filename) # filename is a QString instance
+        filename = to_text_string(filename) # filename is a QString instance
         self.kill_if_running()
         index, _data = self.get_data(filename)
         if index is None:
@@ -268,7 +268,7 @@ class PylintWidget(QWidget):
     def select_file(self):
         self.emit(SIGNAL('redirect_stdio(bool)'), False)
         filename, _selfilter = getopenfilename(self, _("Select Python script"),
-                           os.getcwdu(), _("Python scripts")+" (*.py ; *.pyw)")
+                           getcwd(), _("Python scripts")+" (*.py ; *.pyw)")
         self.emit(SIGNAL('redirect_stdio(bool)'), False)
         if filename:
             self.analyze(filename)
@@ -300,7 +300,7 @@ class PylintWidget(QWidget):
     def save(self):
         while len(self.rdata) > self.max_entries:
             self.rdata.pop(-1)
-        cPickle.dump([self.VERSION]+self.rdata, file(self.DATAPATH, 'w'))
+        pickle.dump([self.VERSION]+self.rdata, open(self.DATAPATH, 'wb'), 2)
         
     def show_log(self):
         if self.output:
@@ -308,7 +308,7 @@ class PylintWidget(QWidget):
                        readonly=True, size=(700, 500)).exec_()
         
     def start(self):
-        filename = unicode(self.filecombo.currentText())
+        filename = to_text_string(self.filecombo.currentText())
         
         self.process = QProcess(self)
         self.process.setProcessChannelMode(QProcess.SeparateChannels)
@@ -354,13 +354,13 @@ class PylintWidget(QWidget):
             self.process.setReadChannel(QProcess.StandardError)
         else:
             self.process.setReadChannel(QProcess.StandardOutput)
-        bytes = QByteArray()
+        qba = QByteArray()
         while self.process.bytesAvailable():
             if error:
-                bytes += self.process.readAllStandardError()
+                qba += self.process.readAllStandardError()
             else:
-                bytes += self.process.readAllStandardOutput()
-        text = unicode( locale_codec.toUnicode(bytes.data()) )
+                qba += self.process.readAllStandardOutput()
+        text = to_text_string( locale_codec.toUnicode(qba.data()) )
         if error:
             self.error_output += text
         else:
@@ -421,7 +421,7 @@ class PylintWidget(QWidget):
                 previous = self.output[i_prun+len(txt_prun):i_prun_end]
             
         
-        filename = unicode(self.filecombo.currentText())
+        filename = to_text_string(self.filecombo.currentText())
         self.set_data(filename, (time.localtime(), rate, previous, results))
         self.output = self.error_output + self.output
         self.show_data(justanalyzed=True)
@@ -438,7 +438,7 @@ class PylintWidget(QWidget):
         self.log_button.setEnabled(self.output is not None \
                                    and len(self.output) > 0)
         self.kill_if_running()
-        filename = unicode(self.filecombo.currentText())
+        filename = to_text_string(self.filecombo.currentText())
         if not filename:
             return
         

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/spyder.git



More information about the debian-science-commits mailing list