summaryrefslogtreecommitdiff
path: root/docs/_locale/fr
diff options
context:
space:
mode:
Diffstat (limited to 'docs/_locale/fr')
-rw-r--r--docs/_locale/fr/LC_MESSAGES/api.po1488
-rw-r--r--docs/_locale/fr/LC_MESSAGES/async.po208
-rw-r--r--docs/_locale/fr/LC_MESSAGES/changelog.po1014
-rw-r--r--docs/_locale/fr/LC_MESSAGES/configuration.po313
-rw-r--r--docs/_locale/fr/LC_MESSAGES/contact.po88
-rw-r--r--docs/_locale/fr/LC_MESSAGES/deployment.po434
-rw-r--r--docs/_locale/fr/LC_MESSAGES/development.po435
-rw-r--r--docs/_locale/fr/LC_MESSAGES/faq.po89
-rw-r--r--docs/_locale/fr/LC_MESSAGES/index.po134
-rw-r--r--docs/_locale/fr/LC_MESSAGES/plugindev.po396
-rw-r--r--docs/_locale/fr/LC_MESSAGES/plugins/index.po241
-rw-r--r--docs/_locale/fr/LC_MESSAGES/recipes.po308
-rw-r--r--docs/_locale/fr/LC_MESSAGES/routing.po233
-rw-r--r--docs/_locale/fr/LC_MESSAGES/stpl.po271
-rw-r--r--docs/_locale/fr/LC_MESSAGES/tutorial.po1460
-rw-r--r--docs/_locale/fr/LC_MESSAGES/tutorial_app.po901
16 files changed, 8013 insertions, 0 deletions
diff --git a/docs/_locale/fr/LC_MESSAGES/api.po b/docs/_locale/fr/LC_MESSAGES/api.po
new file mode 100644
index 0000000..851a68b
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/api.po
@@ -0,0 +1,1488 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../api.rst:3
+msgid "API Reference"
+msgstr ""
+
+#: ../../api.rst:10
+msgid ""
+"This is a mostly auto-generated API. If you are new to bottle, you might "
+"find the narrative :doc:`tutorial` more helpful."
+msgstr ""
+
+#: ../../api.rst:17
+msgid "Module Contents"
+msgstr ""
+
+#: ../../api.rst:19
+msgid "The module defines several functions, constants, and an exception."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.debug:1
+msgid ""
+"Change the debug level. There is only one debug level supported at the "
+"moment."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:1
+msgid ""
+"Start a server instance. This method blocks until the server terminates."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:0 ../../../bottle.pydocstring of
+#: bottle.path_shift:0 ../../../bottle.pydocstring of bottle.MultiDict.get:0
+#: ../../../bottle.pydocstring of bottle.HeaderDict.get:0
+#: ../../../bottle.pydocstring of bottle.ResourceManager:0
+#: ../../../bottle.pydocstring of bottle.ResourceManager.add_path:0
+#: ../../../bottle.pydocstring of bottle.FileUpload.save:0
+#: ../../../bottle.pydocstring of bottle.Bottle:0 ../../../bottle.pydocstring
+#: of bottle.Bottle.mount:0 ../../../bottle.pydocstring of
+#: bottle.Bottle.route:0 ../../../bottle.pydocstring of
+#: bottle.BaseRequest.path_shift:0 ../../../bottle.pydocstring of
+#: bottle.BaseResponse:0 ../../../bottle.pydocstring of
+#: bottle.BaseResponse.set_cookie:0 ../../../bottle.pydocstring of
+#: bottle.BaseResponse.set_cookie:0
+msgid "Parameters"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:3
+msgid ""
+"WSGI application or target string supported by :func:`load_app`. (default: "
+":func:`default_app`)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:5
+msgid ""
+"Server adapter to use. See :data:`server_names` keys for valid names or pass"
+" a :class:`ServerAdapter` subclass. (default: `wsgiref`)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:8
+msgid ""
+"Server address to bind to. Pass ``0.0.0.0`` to listens on all interfaces "
+"including the external one. (default: 127.0.0.1)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:10
+msgid ""
+"Server port to bind to. Values below 1024 require root privileges. (default:"
+" 8080)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:12
+msgid "Start auto-reloading server? (default: False)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:13
+msgid "Auto-reloader interval in seconds (default: 1)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:14
+msgid "Suppress output to stdout and stderr? (default: False)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.run:15
+msgid "Options passed to the server adapter."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.load:1
+msgid "Import a module or fetch an object from a module."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.load:3
+msgid "``package.module`` returns `module` as a module object."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.load:4
+msgid "``pack.mod:name`` returns the module variable `name` from `pack.mod`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.load:5
+msgid "``pack.mod:func()`` calls `pack.mod.func()` and returns the result."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.load:7
+msgid ""
+"The last form accepts not only function calls, but any type of expression. "
+"Keyword arguments passed to this function are available as local variables. "
+"Example: ``import_string('re:compile(x)', x='[a-z]')``"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.load_app:1
+msgid ""
+"Load a bottle application from a module and make sure that the import does "
+"not affect the current default application, but returns a separate "
+"application object. See :func:`load` for the target parameter."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.request:1 ../../../bottle.pydocstring
+#: of bottle.request:1
+msgid ""
+"A thread-safe instance of :class:`LocalRequest`. If accessed from within a "
+"request callback, this instance always refers to the *current* request (even"
+" on a multi-threaded server)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.response:1
+msgid ""
+"A thread-safe instance of :class:`LocalResponse`. It is used to change the "
+"HTTP response for the *current* request."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.HTTP_CODES:1
+msgid ""
+"A dict to map HTTP status codes (e.g. 404) to phrases (e.g. 'Not Found')"
+msgstr ""
+
+#: ../../api.rst:38
+msgid ""
+"Return the current :ref:`default-app`. Actually, these are callable "
+"instances of :class:`AppStack` and implement a stack-like API."
+msgstr ""
+
+#: ../../api.rst:42
+msgid "Routing"
+msgstr ""
+
+#: ../../api.rst:44
+msgid ""
+"Bottle maintains a stack of :class:`Bottle` instances (see :func:`app` and "
+":class:`AppStack`) and uses the top of the stack as a *default application* "
+"for some of the module-level functions and decorators."
+msgstr ""
+
+#: ../../api.rst:54
+msgid ""
+"Decorator to install a route to the current default application. See "
+":meth:`Bottle.route` for details."
+msgstr ""
+
+#: ../../api.rst:59
+msgid ""
+"Decorator to install an error handler to the current default application. "
+"See :meth:`Bottle.error` for details."
+msgstr ""
+
+#: ../../api.rst:63
+msgid "WSGI and HTTP Utilities"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.parse_date:1
+msgid "Parse rfc1123, rfc850 and asctime timestamps and return UTC epoch."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.parse_auth:1
+msgid ""
+"Parse rfc2617 HTTP authentication header string (basic) and return "
+"(user,pass) tuple or None"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.cookie_encode:1
+msgid "Encode and sign a pickle-able object. Return a (byte) string"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.cookie_decode:1
+msgid "Verify and decode an encoded string. Return an object or None."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.cookie_is_encoded:1
+msgid "Return True if the argument looks like a encoded cookie."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.yieldroutes:1
+msgid ""
+"Return a generator for routes that match the signature (name, args) of the "
+"func parameter. This may yield more than one route if the function takes "
+"optional keyword arguments. The output is best described by example::"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.path_shift:1
+msgid "Shift path fragments from PATH_INFO to SCRIPT_NAME and vice versa."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.path_shift:0
+msgid "Returns"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.path_shift:3
+msgid "The modified paths."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.path_shift:4
+msgid "The SCRIPT_NAME path."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.path_shift:5
+msgid "The PATH_INFO path."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.path_shift:6
+msgid ""
+"The number of path fragments to shift. May be negative to change the shift "
+"direction. (default: 1)"
+msgstr ""
+
+#: ../../api.rst:81
+msgid "Data Structures"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict:1
+msgid ""
+"This dict stores multiple values per key, but behaves exactly like a normal "
+"dict in that it returns only the newest value for any given key. There are "
+"special methods available to access the full list of values."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.keys:1
+msgid "D.keys() -> a set-like object providing a view on D's keys"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.values:1
+msgid "D.values() -> an object providing a view on D's values"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.items:1
+msgid "D.items() -> a set-like object providing a view on D's items"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.get:1
+#: ../../../bottle.pydocstring of bottle.HeaderDict.get:1
+msgid "Return the most recent value for a key."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.get:3
+#: ../../../bottle.pydocstring of bottle.HeaderDict.get:3
+msgid ""
+"The default value to be returned if the key is not present or the type "
+"conversion fails."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.get:5
+#: ../../../bottle.pydocstring of bottle.HeaderDict.get:5
+msgid "An index for the list of available values."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.get:6
+#: ../../../bottle.pydocstring of bottle.HeaderDict.get:6
+msgid ""
+"If defined, this callable is used to cast the value into a specific type. "
+"Exception are suppressed and result in the default value to be returned."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.append:1
+#: ../../../bottle.pydocstring of bottle.HeaderDict.append:1
+msgid "Add a new value to the list of values for this key."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.replace:1
+#: ../../../bottle.pydocstring of bottle.HeaderDict.replace:1
+msgid "Replace the list of values with a single value."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.getall:1
+#: ../../../bottle.pydocstring of bottle.MultiDict.getall:1
+#: ../../../bottle.pydocstring of bottle.HeaderDict.getall:1
+msgid "Return a (possibly empty) list of values for a key."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.MultiDict.get:1
+msgid "Aliases for WTForms to mimic other multi-dict APIs (Django)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.HeaderDict:1
+msgid ""
+"A case-insensitive version of :class:`MultiDict` that defaults to replace "
+"the old value instead of appending it."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FormsDict:1
+msgid ""
+"This :class:`MultiDict` subclass is used to store request form data. "
+"Additionally to the normal dict-like item access methods (which return "
+"unmodified data as native strings), this container also supports attribute-"
+"like access to its values. Attributes are automatically de- or recoded to "
+"match :attr:`input_encoding` (default: 'utf8'). Missing attributes default "
+"to an empty string."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FormsDict.input_encoding:1
+msgid "Encoding used for attribute values."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FormsDict.recode_unicode:1
+msgid ""
+"If true (default), unicode strings are first encoded with `latin1` and then "
+"decoded to match :attr:`input_encoding`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FormsDict.decode:1
+msgid ""
+"Returns a copy with all keys and values de- or recoded to match "
+":attr:`input_encoding`. Some libraries (e.g. WTForms) want a unicode "
+"dictionary."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FormsDict.getunicode:1
+msgid "Return the value as a unicode string, or the default."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.WSGIHeaderDict:1
+msgid ""
+"This dict-like class wraps a WSGI environ dict and provides convenient "
+"access to HTTP_* fields. Keys and values are native strings (2.x bytes or "
+"3.x unicode) and keys are case-insensitive. If the WSGI environment contains"
+" non-native string values, these are de- or encoded using a lossless "
+"'latin1' character set."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.WSGIHeaderDict:7
+msgid ""
+"The API will remain stable even on changes to the relevant PEPs. Currently "
+"PEP 333, 444 and 3333 are supported. (PEP 444 is the only one that uses non-"
+"native strings.)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.WSGIHeaderDict.cgikeys:1
+msgid "List of keys that do not have a ``HTTP_`` prefix."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.WSGIHeaderDict.raw:1
+msgid "Return the header value as is (may be bytes or unicode)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.AppStack:1
+msgid "A stack-like list. Calling it returns the head of the stack."
+msgstr ""
+
+#: ../../api.rst:100
+msgid "Return the current default application and remove it from the stack."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.AppStack.push:1
+#: ../../../bottle.pydocstring of bottle.AppStack.push:1
+msgid "Add a new :class:`Bottle` instance to the stack"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager:1
+msgid ""
+"This class manages a list of search paths and helps to find and open "
+"application-bound resources (files)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager:4
+msgid "default value for :meth:`add_path` calls."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager:5
+msgid "callable used to open resources."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager:6
+msgid "controls which lookups are cached. One of 'all', 'found' or 'none'."
+msgstr ""
+
+#: ../docstring of bottle.ResourceManager.path:1
+msgid "A list of search paths. See :meth:`add_path` for details."
+msgstr ""
+
+#: ../docstring of bottle.ResourceManager.cache:1
+msgid "A cache for resolved paths. ``res.cache.clear()`` clears the cache."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager.add_path:1
+msgid ""
+"Add a new path to the list of search paths. Return False if the path does "
+"not exist."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager.add_path:4
+msgid ""
+"The new search path. Relative paths are turned into an absolute and "
+"normalized form. If the path looks like a file (not ending in `/`), the "
+"filename is stripped off."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager.add_path:7
+msgid ""
+"Path used to absolutize relative search paths. Defaults to :attr:`base` "
+"which defaults to ``os.getcwd()``."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager.add_path:9
+msgid ""
+"Position within the list of search paths. Defaults to last index (appends to"
+" the list)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager.add_path:12
+msgid ""
+"The `base` parameter makes it easy to reference files installed along with a"
+" python module or package::"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager.lookup:1
+msgid "Search for a resource and return an absolute file path, or `None`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager.lookup:3
+msgid ""
+"The :attr:`path` list is searched in order. The first match is returned. "
+"Symlinks are followed. The result is cached to speed up future lookups."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ResourceManager.open:1
+msgid "Find a resource and return a file object, or raise IOError."
+msgstr ""
+
+#: ../docstring of bottle.FileUpload.file:1
+msgid "Open file(-like) object (BytesIO buffer or temporary file)"
+msgstr ""
+
+#: ../docstring of bottle.FileUpload.name:1
+msgid "Name of the upload form field"
+msgstr ""
+
+#: ../docstring of bottle.FileUpload.raw_filename:1
+msgid "Raw filename as sent by the client (may contain unsafe characters)"
+msgstr ""
+
+#: ../docstring of bottle.FileUpload.headers:1
+msgid "A :class:`HeaderDict` with additional headers (e.g. content-type)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.content_type:1
+#: ../../../bottle.pydocstring of bottle.BaseResponse.content_type:1
+msgid "Current value of the 'Content-Type' header."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.content_length:1
+#: ../../../bottle.pydocstring of bottle.BaseResponse.content_length:1
+msgid "Current value of the 'Content-Length' header."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.get_header:1
+msgid "Return the value of a header within the mulripart part."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.filename:1
+msgid ""
+"Name of the file on the client file system, but normalized to ensure file "
+"system compatibility. An empty filename is returned as 'empty'."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.filename:4
+msgid ""
+"Only ASCII letters, digits, dashes, underscores and dots are allowed in the "
+"final filename. Accents are removed, if possible. Whitespace is replaced by "
+"a single dash. Leading or tailing dots or dashes are removed. The filename "
+"is limited to 255 characters."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.save:1
+msgid ""
+"Save file to disk or copy its content to an open file(-like) object. If "
+"*destination* is a directory, :attr:`filename` is added to the path. "
+"Existing files are not overwritten by default (IOError)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.save:5
+msgid "File path, directory or file(-like) object."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.save:6
+msgid "If True, replace existing files. (default: False)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.FileUpload.save:7
+msgid "Bytes to read at a time. (default: 64kb)"
+msgstr ""
+
+#: ../../api.rst:109
+msgid "Exceptions"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BottleException:1
+msgid "A base class for exceptions used by bottle."
+msgstr ""
+
+#: ../../api.rst:117
+msgid "The :class:`Bottle` Class"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle:1
+msgid ""
+"Each Bottle object represents a single, distinct web application and "
+"consists of routes, callbacks, plugins, resources and configuration. "
+"Instances are callable WSGI applications."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle:5
+msgid ""
+"If true (default), handle all exceptions. Turn off to let debugging "
+"middleware handle exceptions."
+msgstr ""
+
+#: ../docstring of bottle.Bottle.config:1
+msgid "A :class:`ConfigDict` for app specific configuration."
+msgstr ""
+
+#: ../docstring of bottle.Bottle.resources:1
+msgid "A :class:`ResourceManager` for application files"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.catchall:1
+msgid "If true, most exceptions are caught and returned as :exc:`HTTPError`"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.add_hook:1
+msgid "Attach a callback to a hook. Three hooks are currently implemented:"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.add_hook:4
+msgid "before_request"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.add_hook:4
+msgid ""
+"Executed once before each request. The request context is available, but no "
+"routing has happened yet."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.add_hook:6
+msgid "after_request"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.add_hook:7
+msgid "Executed once after each request regardless of its outcome."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.add_hook:8
+msgid "app_reset"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.add_hook:9
+msgid "Called whenever :meth:`Bottle.reset` is called."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.remove_hook:1
+msgid "Remove a callback from a hook."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.trigger_hook:1
+msgid "Trigger a hook and return a list of results."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.hook:1
+msgid ""
+"Return a decorator that attaches a callback to a hook. See :meth:`add_hook` "
+"for details."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.mount:1
+msgid ""
+"Mount an application (:class:`Bottle` or plain WSGI) to a specific URL "
+"prefix. Example::"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.mount:6
+msgid "path prefix or `mount-point`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.mount:7
+msgid "an instance of :class:`Bottle` or a WSGI application."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.mount:9
+msgid ""
+"Plugins from the parent application are not applied to the routes of the "
+"mounted child application. If you need plugins in the child application, "
+"install them separately."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.mount:13
+msgid ""
+"While it is possible to use path wildcards within the prefix path "
+"(:class:`Bottle` childs only), it is highly discouraged."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.mount:16
+msgid ""
+"The prefix path must end with a slash. If you want to access the root of the"
+" child application via `/prefix` in addition to `/prefix/`, consider adding "
+"a route with a 307 redirect to the parent application."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.merge:1
+msgid ""
+"Merge the routes of another :class:`Bottle` application or a list of "
+":class:`Route` objects into this application. The routes keep their 'owner',"
+" meaning that the :data:`Route.app` attribute is not changed."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.install:1
+msgid ""
+"Add a plugin to the list of plugins and prepare it for being applied to all "
+"routes of this application. A plugin may be a simple decorator or an object "
+"that implements the :class:`Plugin` API."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.uninstall:1
+msgid ""
+"Uninstall plugins. Pass an instance to remove a specific plugin, a type "
+"object to remove all plugins that match that type, a string to remove all "
+"plugins with a matching ``name`` attribute or ``True`` to remove all "
+"plugins. Return the list of removed plugins."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.reset:1
+msgid ""
+"Reset all routes (force plugins to be re-applied) and clear all caches. If "
+"an ID or route object is given, only that specific route is affected."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.close:1
+msgid "Close the application and all installed plugins."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.run:1
+msgid "Calls :func:`run` with the same parameters."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.match:1
+msgid ""
+"Search for a matching route and return a (:class:`Route`, urlargs) tuple. "
+"The second value is a dictionary with parameters extracted from the URL. "
+"Raise :exc:`HTTPError` (404/405) on a non-match."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.get_url:1
+msgid "Return a string that matches a named route"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.add_route:1
+msgid "Add a route object, but do not change the :data:`Route.app` attribute."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:1
+msgid "A decorator to bind a function to a request URL. Example::"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:7
+msgid ""
+"The ``<name>`` part is a wildcard. See :class:`Router` for syntax details."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:10
+msgid ""
+"Request path or a list of paths to listen to. If no path is specified, it is"
+" automatically generated from the signature of the function."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:13
+msgid ""
+"HTTP method (`GET`, `POST`, `PUT`, ...) or a list of methods to listen to. "
+"(default: `GET`)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:15
+msgid ""
+"An optional shortcut to avoid the decorator syntax. ``route(..., "
+"callback=func)`` equals ``route(...)(func)``"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:17
+msgid "The name for this route. (default: None)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:18
+msgid ""
+"A decorator or plugin or a list of plugins. These are applied to the route "
+"callback in addition to installed plugins."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:20
+msgid ""
+"A list of plugins, plugin classes or names. Matching plugins are not "
+"installed to this route. ``True`` skips all."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.route:23
+msgid ""
+"Any additional keyword arguments are stored as route-specific configuration "
+"and passed to plugins (see :meth:`Plugin.apply`)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.get:1
+msgid "Equals :meth:`route`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.post:1
+msgid "Equals :meth:`route` with a ``POST`` method parameter."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.put:1
+msgid "Equals :meth:`route` with a ``PUT`` method parameter."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.delete:1
+msgid "Equals :meth:`route` with a ``DELETE`` method parameter."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.patch:1
+msgid "Equals :meth:`route` with a ``PATCH`` method parameter."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.error:1
+msgid ""
+"Register an output handler for a HTTP error code. Can be used as a decorator"
+" or called directly ::"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Bottle.wsgi:1
+msgid "The bottle WSGI-interface."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Route:1
+msgid ""
+"This class wraps a route callback along with route specific metadata and "
+"configuration and applies Plugins on demand. It is also responsible for "
+"turning an URL path rule into a regular expression usable by the Router."
+msgstr ""
+
+#: ../docstring of bottle.Route.app:1
+msgid "The application this route is installed to."
+msgstr ""
+
+#: ../docstring of bottle.Route.rule:1
+msgid "The path-rule string (e.g. ``/wiki/<page>``)."
+msgstr ""
+
+#: ../docstring of bottle.Route.method:1
+msgid "The HTTP method as a string (e.g. ``GET``)."
+msgstr ""
+
+#: ../docstring of bottle.Route.callback:1
+msgid ""
+"The original callback with no plugins applied. Useful for introspection."
+msgstr ""
+
+#: ../docstring of bottle.Route.name:1
+msgid "The name of the route (if specified) or ``None``."
+msgstr ""
+
+#: ../docstring of bottle.Route.plugins:1
+msgid "A list of route-specific plugins (see :meth:`Bottle.route`)."
+msgstr ""
+
+#: ../docstring of bottle.Route.skiplist:1
+msgid ""
+"A list of plugins to not apply to this route (see :meth:`Bottle.route`)."
+msgstr ""
+
+#: ../docstring of bottle.Route.config:1
+msgid ""
+"Additional keyword arguments passed to the :meth:`Bottle.route` decorator "
+"are stored in this dictionary. Used for route-specific plugin configuration "
+"and meta-data."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Route.call:1
+msgid ""
+"The route callback with all plugins applied. This property is created on "
+"demand and then cached to speed up subsequent requests."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Route.reset:1
+msgid ""
+"Forget any cached values. The next time :attr:`call` is accessed, all "
+"plugins are re-applied."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Route.prepare:1
+msgid "Do all on-demand work immediately (useful for debugging)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Route.all_plugins:1
+msgid "Yield all Plugins affecting this route."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Route.get_undecorated_callback:1
+msgid ""
+"Return the callback. If the callback is a decorated function, try to recover"
+" the original function."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Route.get_callback_args:1
+msgid ""
+"Return a list of argument names the callback (most likely) accepts as "
+"keyword arguments. If the callback is a decorated function, try to recover "
+"the original function before inspection."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.Route.get_config:1
+msgid ""
+"Lookup a config field and return its value, first checking the route.config,"
+" then route.app.config."
+msgstr ""
+
+#: ../../api.rst:127
+msgid "The :class:`Request` Object"
+msgstr ""
+
+#: ../../api.rst:129
+msgid ""
+"The :class:`Request` class wraps a WSGI environment and provides helpful "
+"methods to parse and access form data, cookies, file uploads and other "
+"metadata. Most of the attributes are read-only."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest:1
+msgid ""
+"A wrapper for WSGI environment dictionaries that adds a lot of convenient "
+"access methods and properties. Most of them are read-only."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest:4
+msgid ""
+"Adding new attributes to a request actually adds them to the environ "
+"dictionary (as 'bottle.request.ext.<name>'). This is the recommended way to "
+"store and access request-specific data."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.MEMFILE_MAX:1
+msgid "Maximum size of memory buffer for :attr:`body` in bytes."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.environ:1
+msgid ""
+"The wrapped WSGI environ dictionary. This is the only real attribute. All "
+"other attributes actually are read-only properties."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.app:1
+msgid "Bottle application handling this request."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.route:1
+msgid "The bottle :class:`Route` object that matches this request."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.url_args:1
+msgid "The arguments extracted from the URL."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.path:1
+msgid ""
+"The value of ``PATH_INFO`` with exactly one prefixed slash (to fix broken "
+"clients and avoid the \"empty path\" edge case)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.method:1
+msgid "The ``REQUEST_METHOD`` value as an uppercase string."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.headers:1
+msgid ""
+"A :class:`WSGIHeaderDict` that provides case-insensitive access to HTTP "
+"request headers."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.get_header:1
+msgid "Return the value of a request header, or a given default value."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.cookies:1
+msgid ""
+"Cookies parsed into a :class:`FormsDict`. Signed cookies are NOT decoded. "
+"Use :meth:`get_cookie` if you expect signed cookies."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.get_cookie:1
+msgid ""
+"Return the content of a cookie. To read a `Signed Cookie`, the `secret` must"
+" match the one used to create the cookie (see "
+":meth:`BaseResponse.set_cookie`). If anything goes wrong (missing cookie or "
+"wrong signature), return a default value."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.query:1
+msgid ""
+"The :attr:`query_string` parsed into a :class:`FormsDict`. These values are "
+"sometimes called \"URL arguments\" or \"GET parameters\", but not to be "
+"confused with \"URL wildcards\" as they are provided by the :class:`Router`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.forms:1
+msgid ""
+"Form values parsed from an `url-encoded` or `multipart/form-data` encoded "
+"POST or PUT request body. The result is returned as a :class:`FormsDict`. "
+"All keys and values are strings. File uploads are stored separately in "
+":attr:`files`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.params:1
+msgid ""
+"A :class:`FormsDict` with the combined values of :attr:`query` and "
+":attr:`forms`. File uploads are stored in :attr:`files`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.files:1
+msgid ""
+"File uploads parsed from `multipart/form-data` encoded POST or PUT request "
+"body. The values are instances of :class:`FileUpload`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.json:1
+msgid ""
+"If the ``Content-Type`` header is ``application/json`` or ``application"
+"/json-rpc``, this property holds the parsed content of the request body. "
+"Only requests smaller than :attr:`MEMFILE_MAX` are processed to avoid memory"
+" exhaustion. Invalid JSON raises a 400 error response."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.body:1
+msgid ""
+"The HTTP request body as a seek-able file-like object. Depending on "
+":attr:`MEMFILE_MAX`, this is either a temporary file or a "
+":class:`io.BytesIO` instance. Accessing this property for the first time "
+"reads and replaces the ``wsgi.input`` environ variable. Subsequent accesses "
+"just do a `seek(0)` on the file object."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.chunked:1
+msgid "True if Chunked transfer encoding was."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.query:1
+msgid "An alias for :attr:`query`."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.POST:1
+msgid ""
+"The values of :attr:`forms` and :attr:`files` combined into a single "
+":class:`FormsDict`. Values are either strings (form values) or instances of "
+":class:`cgi.FieldStorage` (file uploads)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.url:1
+msgid ""
+"The full request URI including hostname and scheme. If your app lives behind"
+" a reverse proxy or load balancer and you get confusing results, make sure "
+"that the ``X-Forwarded-Host`` header is set correctly."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.urlparts:1
+msgid ""
+"The :attr:`url` string as an :class:`urlparse.SplitResult` tuple. The tuple "
+"contains (scheme, host, path, query_string and fragment), but the fragment "
+"is always empty because it is not visible to the server."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.fullpath:1
+msgid "Request path including :attr:`script_name` (if present)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.query_string:1
+msgid ""
+"The raw :attr:`query` part of the URL (everything in between ``?`` and "
+"``#``) as a string."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.script_name:1
+msgid ""
+"The initial portion of the URL's `path` that was removed by a higher level "
+"(server or routing middleware) before the application was called. This "
+"script path is returned with leading and tailing slashes."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.path_shift:2
+msgid "Shift path segments from :attr:`path` to :attr:`script_name` and"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.path_shift:2
+msgid "vice versa."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.path_shift:4
+msgid ""
+"The number of path segments to shift. May be negative to change the shift "
+"direction. (default: 1)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.content_length:1
+msgid ""
+"The request body length as an integer. The client is responsible to set this"
+" header. Otherwise, the real length of the body is unknown and -1 is "
+"returned. In this case, :attr:`body` will be empty."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.content_type:1
+msgid "The Content-Type header as a lowercase-string (default: empty)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.is_xhr:1
+msgid ""
+"True if the request was triggered by a XMLHttpRequest. This only works with "
+"JavaScript libraries that support the `X-Requested-With` header (most of the"
+" popular libraries do)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.is_ajax:1
+msgid "Alias for :attr:`is_xhr`. \"Ajax\" is not the right term."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.auth:1
+msgid ""
+"HTTP authentication data as a (user, password) tuple. This implementation "
+"currently supports basic (not digest) authentication only. If the "
+"authentication happened at a higher level (e.g. in the front web-server or a"
+" middleware), the password field is None, but the user field is looked up "
+"from the ``REMOTE_USER`` environ variable. On any errors, None is returned."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.remote_route:1
+msgid ""
+"A list of all IPs that were involved in this request, starting with the "
+"client IP and followed by zero or more proxies. This does only work if all "
+"proxies support the ```X-Forwarded-For`` header. Note that this information "
+"can be forged by malicious clients."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.remote_addr:1
+msgid ""
+"The client IP as a string. Note that this information can be forged by "
+"malicious clients."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.copy:1
+msgid "Return a new :class:`Request` with a shallow :attr:`environ` copy."
+msgstr ""
+
+#: ../../api.rst:137
+msgid ""
+"The module-level :data:`bottle.request` is a proxy object (implemented in "
+":class:`LocalRequest`) and always refers to the `current` request, or in "
+"other words, the request that is currently processed by the request handler "
+"in the current thread. This `thread locality` ensures that you can safely "
+"use a global instance in a multi-threaded environment."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.LocalRequest:1
+msgid ""
+"A thread-local subclass of :class:`BaseRequest` with a different set of "
+"attributes for each thread. There is usually only one global instance of "
+"this class (:data:`request`). If accessed during a request/response cycle, "
+"this instance always refers to the *current* request (even on a "
+"multithreaded server)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseRequest.__init__:1
+msgid "Wrap a WSGI environ dictionary."
+msgstr ""
+
+#: ../../api.rst:146
+msgid "The :class:`Response` Object"
+msgstr ""
+
+#: ../../api.rst:148
+msgid ""
+"The :class:`Response` class stores the HTTP status code as well as headers "
+"and cookies that are to be sent to the client. Similar to "
+":data:`bottle.request` there is a thread-local :data:`bottle.response` "
+"instance that can be used to adjust the `current` response. Moreover, you "
+"can instantiate :class:`Response` and return it from your request handler. "
+"In this case, the custom instance overrules the headers and cookies defined "
+"in the global one."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse:1
+msgid "Storage class for a response body as well as headers and cookies."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse:3
+msgid ""
+"This class does support dict-like case-insensitive item-access to headers, "
+"but is NOT a dict. Most notably, iterating over a response yields parts of "
+"the body and not the headers."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse:7
+msgid "The response body as one of the supported types."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse:8
+msgid ""
+"Either an HTTP status code (e.g. 200) or a status line including the reason "
+"phrase (e.g. '200 OK')."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse:10
+msgid "A dictionary or a list of name-value pairs."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse:12
+msgid ""
+"Additional keyword arguments are added to the list of headers. Underscores "
+"in the header name are replaced with dashes."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.copy:1
+msgid "Returns a copy of self."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.status_line:1
+msgid "The HTTP status line as a string (e.g. ``404 Not Found``)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.status_code:1
+msgid "The HTTP status code as an integer (e.g. 404)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.status:1
+msgid ""
+"A writeable property to change the HTTP response status. It accepts either a"
+" numeric code (100-999) or a string with a custom reason phrase (e.g. \"404 "
+"Brain not found\"). Both :data:`status_line` and :data:`status_code` are "
+"updated accordingly. The return value is always a status string."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.headers:1
+msgid ""
+"An instance of :class:`HeaderDict`, a case-insensitive dict-like view on the"
+" response headers."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.get_header:1
+msgid ""
+"Return the value of a previously defined header. If there is no header with "
+"that name, return a default value."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_header:1
+msgid ""
+"Create a new response header, replacing any previously defined headers with "
+"the same name."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.add_header:1
+msgid "Add an additional response header, not removing duplicates."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.iter_headers:1
+msgid ""
+"Yield (header, value) tuples, skipping headers that are not allowed with the"
+" current response status code."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.headerlist:1
+msgid "WSGI conform list of (header, value) tuples."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.expires:1
+msgid "Current value of the 'Expires' header."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.charset:1
+msgid ""
+"Return the charset specified in the content-type header (default: utf8)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:1
+msgid ""
+"Create a new cookie or replace an old one. If the `secret` parameter is set,"
+" create a `Signed Cookie` (described below)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:4
+msgid "the name of the cookie."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:5
+msgid "the value of the cookie."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:6
+msgid "a signature key required for signed cookies."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:8
+msgid ""
+"Additionally, this method accepts all RFC 2109 attributes that are supported"
+" by :class:`cookie.Morsel`, including:"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:11
+msgid "maximum age in seconds. (default: None)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:12
+msgid "a datetime object or UNIX timestamp. (default: None)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:13
+msgid ""
+"the domain that is allowed to read the cookie. (default: current domain)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:15
+msgid "limits the cookie to a given path (default: current path)"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:16
+msgid "limit the cookie to HTTPS connections (default: off)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:17
+msgid ""
+"prevents client-side javascript to read this cookie (default: off, requires "
+"Python 2.6 or newer)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:19
+msgid ""
+"Control or disable third-party use for this cookie. Possible values: `lax`, "
+"`strict` or `none` (default)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:22
+msgid ""
+"If neither `expires` nor `maxage` is set (default), the cookie will expire "
+"at the end of the browser session (as soon as the browser window is closed)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:26
+msgid ""
+"Signed cookies may store any pickle-able object and are cryptographically "
+"signed to prevent manipulation. Keep in mind that cookies are limited to 4kb"
+" in most browsers."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:30
+msgid ""
+"Warning: Pickle is a potentially dangerous format. If an attacker gains "
+"access to the secret key, he could forge cookies that execute code on server"
+" side if unpickled. Using pickle is discouraged and support for it will be "
+"removed in later versions of bottle."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.set_cookie:35
+msgid ""
+"Warning: Signed cookies are not encrypted (the client can still see the "
+"content) and not copy-protected (the client can restore an old cookie). The "
+"main intention is to make pickling and unpickling save, not to store secret "
+"information at client side."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.delete_cookie:1
+msgid ""
+"Delete a cookie. Be sure to use the same `domain` and `path` settings as "
+"used to create the cookie."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.LocalResponse:1
+msgid ""
+"A thread-local subclass of :class:`BaseResponse` with a different set of "
+"attributes for each thread. There is usually only one global instance of "
+"this class (:data:`response`). Its attributes are used to build the HTTP "
+"response at the end of the request/response cycle."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseResponse.__init__:1
+msgid "Initialize self. See help(type(self)) for accurate signature."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.LocalResponse.body:1
+msgid "Thread-local property"
+msgstr ""
+
+#: ../../api.rst:160
+msgid ""
+"The following two classes can be raised as an exception. The most noticeable"
+" difference is that bottle invokes error handlers for :class:`HTTPError`, "
+"but not for :class:`HTTPResponse` or other response types."
+msgstr ""
+
+#: ../../api.rst:172
+msgid "Templates"
+msgstr ""
+
+#: ../../api.rst:174
+msgid ""
+"All template engines supported by :mod:`bottle` implement the "
+":class:`BaseTemplate` API. This way it is possible to switch and mix "
+"template engines without changing the application code at all."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseTemplate:1
+msgid "Base class and minimal API for template adapters"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseTemplate.__init__:1
+msgid ""
+"Create a new template. If the source parameter (str or buffer) is missing, "
+"the name argument is used to guess a template filename. Subclasses can "
+"assume that self.source and/or self.filename are set. Both are strings. The "
+"lookup, encoding and settings parameters are stored as instance variables. "
+"The lookup parameter stores a list containing directory paths. The encoding "
+"parameter should be used to decode byte strings or files. The settings "
+"parameter contains a dict for engine-specific settings."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseTemplate.search:1
+msgid ""
+"Search name in all directories specified in lookup. First without, then with"
+" common extensions. Return first hit."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseTemplate.global_config:1
+msgid "This reads or sets the global settings stored in class.settings."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseTemplate.prepare:1
+msgid ""
+"Run preparations (parsing, caching, ...). It should be possible to call this"
+" again to refresh a template or to update settings."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.BaseTemplate.render:1
+msgid ""
+"Render the template with the specified local variables and return a single "
+"byte or unicode string. If it is a byte string, the encoding must match "
+"self.encoding. This method must be thread-safe! Local variables may be "
+"provided in dictionaries (args) or directly, as keywords (kwargs)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.view:1
+msgid ""
+"Decorator: renders a template for a handler. The handler can control its "
+"behavior like that:"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.view:4
+msgid "return a dict of template vars to fill out the template"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.view:5
+msgid ""
+"return something other than a dict and the view decorator will not process "
+"the template, but return the handler result as is. This includes returning a"
+" HTTPResponse(dict) to get, for instance, JSON with autojson or other "
+"castfilters."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.template:1
+msgid ""
+"Get a rendered template as a string iterator. You can use a name, a filename"
+" or a template string as first parameter. Template rendering arguments can "
+"be passed as dictionaries or directly (as keyword arguments)."
+msgstr ""
+
+#: ../../api.rst:185
+msgid ""
+"You can write your own adapter for your favourite template engine or use one"
+" of the predefined adapters. Currently there are four fully supported "
+"template engines:"
+msgstr ""
+
+#: ../../api.rst:188
+msgid "Class"
+msgstr ""
+
+#: ../../api.rst:188
+msgid "URL"
+msgstr ""
+
+#: ../../api.rst:188
+msgid "Decorator"
+msgstr ""
+
+#: ../../api.rst:188
+msgid "Render function"
+msgstr ""
+
+#: ../../api.rst:190
+msgid ":class:`SimpleTemplate`"
+msgstr ""
+
+#: ../../api.rst:190
+msgid ":doc:`stpl`"
+msgstr ""
+
+#: ../../api.rst:190
+msgid ":func:`view`"
+msgstr ""
+
+#: ../../api.rst:190
+msgid ":func:`template`"
+msgstr ""
+
+#: ../../api.rst:191
+msgid ":class:`MakoTemplate`"
+msgstr ""
+
+#: ../../api.rst:191
+msgid "http://www.makotemplates.org"
+msgstr ""
+
+#: ../../api.rst:191
+msgid ":func:`mako_view`"
+msgstr ""
+
+#: ../../api.rst:191
+msgid ":func:`mako_template`"
+msgstr ""
+
+#: ../../api.rst:192
+msgid ":class:`CheetahTemplate`"
+msgstr ""
+
+#: ../../api.rst:192
+msgid "http://www.cheetahtemplate.org/"
+msgstr ""
+
+#: ../../api.rst:192
+msgid ":func:`cheetah_view`"
+msgstr ""
+
+#: ../../api.rst:192
+msgid ":func:`cheetah_template`"
+msgstr ""
+
+#: ../../api.rst:193
+msgid ":class:`Jinja2Template`"
+msgstr ""
+
+#: ../../api.rst:193
+msgid "http://jinja.pocoo.org/"
+msgstr ""
+
+#: ../../api.rst:193
+msgid ":func:`jinja2_view`"
+msgstr ""
+
+#: ../../api.rst:193
+msgid ":func:`jinja2_template`"
+msgstr ""
+
+#: ../../api.rst:196
+msgid ""
+"To use :class:`MakoTemplate` as your default template engine, just import "
+"its specialised decorator and render function::"
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/async.po b/docs/_locale/fr/LC_MESSAGES/async.po
new file mode 100644
index 0000000..f09b12e
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/async.po
@@ -0,0 +1,208 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2015-01-22 19:17+0000\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../async.rst:2
+msgid "Primer to Asynchronous Applications"
+msgstr ""
+
+#: ../../async.rst:4
+msgid ""
+"Asynchronous design patterns don't mix well with the synchronous nature of "
+"`WSGI <http://www.python.org/dev/peps/pep-3333/>`_. This is why most "
+"asynchronous frameworks (tornado, twisted, ...) implement a specialized API "
+"to expose their asynchronous features. Bottle is a WSGI framework and shares"
+" the synchronous nature of WSGI, but thanks to the awesome `gevent project "
+"<http://www.gevent.org/>`_, it is still possible to write asynchronous "
+"applications with bottle. This article documents the usage of Bottle with "
+"Asynchronous WSGI."
+msgstr ""
+
+#: ../../async.rst:7
+msgid "The Limits of Synchronous WSGI"
+msgstr ""
+
+#: ../../async.rst:9
+msgid ""
+"Briefly worded, the `WSGI specification (pep 3333) "
+"<http://www.python.org/dev/peps/pep-3333/>`_ defines a request/response "
+"circle as follows: The application callable is invoked once for each request"
+" and must return a body iterator. The server then iterates over the body and"
+" writes each chunk to the socket. As soon as the body iterator is exhausted,"
+" the client connection is closed."
+msgstr ""
+
+#: ../../async.rst:11
+msgid ""
+"Simple enough, but there is a snag: All this happens synchronously. If your "
+"application needs to wait for data (IO, sockets, databases, ...), it must "
+"either yield empty strings (busy wait) or block the current thread. Both "
+"solutions occupy the handling thread and prevent it from answering new "
+"requests. There is consequently only one ongoing request per thread."
+msgstr ""
+
+#: ../../async.rst:13
+msgid ""
+"Most servers limit the number of threads to avoid their relatively high "
+"overhead. Pools of 20 or less threads are common. As soon as all threads are"
+" occupied, any new connection is stalled. The server is effectively dead for"
+" everyone else. If you want to implement a chat that uses long-polling ajax "
+"requests to get real-time updates, you'd reach the limited at 20 concurrent "
+"connections. That's a pretty small chat."
+msgstr ""
+
+#: ../../async.rst:16
+msgid "Greenlets to the rescue"
+msgstr ""
+
+#: ../../async.rst:18
+msgid ""
+"Most servers limit the size of their worker pools to a relatively low number"
+" of concurrent threads, due to the high overhead involved in switching "
+"between and creating new threads. While threads are cheap compared to "
+"processes (forks), they are still expensive to create for each new "
+"connection."
+msgstr ""
+
+#: ../../async.rst:20
+msgid ""
+"The `gevent <http://www.gevent.org/>`_ module adds *greenlets* to the mix. "
+"Greenlets behave similar to traditional threads, but are very cheap to "
+"create. A gevent-based server can spawn thousands of greenlets (one for each"
+" connection) with almost no overhead. Blocking individual greenlets has no "
+"impact on the servers ability to accept new requests. The number of "
+"concurrent connections is virtually unlimited."
+msgstr ""
+
+#: ../../async.rst:22
+msgid ""
+"This makes creating asynchronous applications incredibly easy, because they "
+"look and feel like synchronous applications. A gevent-based server is "
+"actually not asynchronous, but massively multi-threaded. Here is an "
+"example::"
+msgstr ""
+
+#: ../../async.rst:39
+msgid ""
+"The first line is important. It causes gevent to monkey-patch most of "
+"Python's blocking APIs to not block the current thread, but pass the CPU to "
+"the next greenlet instead. It actually replaces Python's threading with "
+"gevent-based pseudo-threads. This is why you can still use ``time.sleep()`` "
+"which would normally block the whole thread. If you don't feel comfortable "
+"with monkey-patching python built-ins, you can use the corresponding gevent "
+"functions (``gevent.sleep()`` in this case)."
+msgstr ""
+
+#: ../../async.rst:41
+msgid ""
+"If you run this script and point your browser to "
+"``http://localhost:8080/stream``, you should see `START`, `MIDDLE`, and "
+"`END` show up one by one (rather than waiting 8 seconds to see them all at "
+"once). It works exactly as with normal threads, but now your server can "
+"handle thousands of concurrent requests without any problems."
+msgstr ""
+
+#: ../../async.rst:45
+msgid ""
+"Some browsers buffer a certain amount of data before they start rendering a "
+"page. You might need to yield more than a few bytes to see an effect in "
+"these browsers. Additionally, many browsers have a limit of one concurrent "
+"connection per URL. If this is the case, you can use a second browser or a "
+"benchmark tool (e.g. `ab` or `httperf`) to measure performance."
+msgstr ""
+
+#: ../../async.rst:52
+msgid "Event Callbacks"
+msgstr ""
+
+#: ../../async.rst:54
+msgid ""
+"A very common design pattern in asynchronous frameworks (including tornado, "
+"twisted, node.js and friends) is to use non-blocking APIs and bind callbacks"
+" to asynchronous events. The socket object is kept open until it is closed "
+"explicitly to allow callbacks to write to the socket at a later point. Here "
+"is an example based on the `tornado library "
+"<http://www.tornadoweb.org/documentation#non-blocking-asynchronous-"
+"requests>`_::"
+msgstr ""
+
+#: ../../async.rst:63
+msgid ""
+"The main benefit is that the request handler terminates early. The handling "
+"thread can move on and accept new requests while the callbacks continue to "
+"write to sockets of previous requests. This is how these frameworks manage "
+"to process a lot of concurrent requests with only a small number of OS "
+"threads."
+msgstr ""
+
+#: ../../async.rst:65
+msgid ""
+"With Gevent+WSGI, things are different: First, terminating early has no "
+"benefit because we have an unlimited pool of (pseudo)threads to accept new "
+"connections. Second, we cannot terminate early because that would close the "
+"socket (as required by WSGI). Third, we must return an iterable to conform "
+"to WSGI."
+msgstr ""
+
+#: ../../async.rst:67
+msgid ""
+"In order to conform to the WSGI standard, all we have to do is to return a "
+"body iterable that we can write to asynchronously. With the help of "
+"`gevent.queue <http://www.gevent.org/gevent.queue.html>`_, we can *simulate*"
+" a detached socket and rewrite the previous example as follows::"
+msgstr ""
+
+#: ../../async.rst:78
+msgid ""
+"From the server perspective, the queue object is iterable. It blocks if "
+"empty and stops as soon as it reaches ``StopIteration``. This conforms to "
+"WSGI. On the application side, the queue object behaves like a non-blocking "
+"socket. You can write to it at any time, pass it around and even start a new"
+" (pseudo)thread that writes to it asynchronously. This is how long-polling "
+"is implemented most of the time."
+msgstr ""
+
+#: ../../async.rst:82
+msgid "Finally: WebSockets"
+msgstr ""
+
+#: ../../async.rst:84
+msgid ""
+"Lets forget about the low-level details for a while and speak about "
+"WebSockets. Since you are reading this article, you probably know what "
+"WebSockets are: A bidirectional communication channel between a browser "
+"(client) and a web application (server)."
+msgstr ""
+
+#: ../../async.rst:86
+msgid ""
+"Thankfully the `gevent-websocket <http://pypi.python.org/pypi/gevent-"
+"websocket/>`_ package does all the hard work for us. Here is a simple "
+"WebSocket endpoint that receives messages and just sends them back to the "
+"client::"
+msgstr ""
+
+#: ../../async.rst:111
+msgid ""
+"The while-loop runs until the client closes the connection. You get the idea"
+" :)"
+msgstr ""
+
+#: ../../async.rst:113
+msgid "The client-site JavaScript API is really straight forward, too::"
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/changelog.po b/docs/_locale/fr/LC_MESSAGES/changelog.po
new file mode 100644
index 0000000..f831354
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/changelog.po
@@ -0,0 +1,1014 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../changelog.rst:6
+msgid "Release Notes and Changelog"
+msgstr ""
+
+#: ../../changelog.rst:9
+msgid "Release 0.13"
+msgstr ""
+
+#: ../../changelog.rst:11
+msgid "Not released yet."
+msgstr ""
+
+#: ../../changelog.rst:14
+msgid "Dropped support for Python versions that reached their end-of-life."
+msgstr ""
+
+#: ../../changelog.rst:15
+msgid ""
+"Keeping up support for ancient Python versions hinders adaptation of new "
+"features and serves no real purpose. If you need support for older Python "
+"versions, you can stay on bottle-0.12. The updated list of tested and "
+"supported python releases is as follows:"
+msgstr ""
+
+#: ../../changelog.rst:20
+msgid "Python 2.7 (>= 2.7.3)"
+msgstr ""
+
+#: ../../changelog.rst:21
+msgid "Python 3.6"
+msgstr ""
+
+#: ../../changelog.rst:22
+msgid "Python 3.7"
+msgstr ""
+
+#: ../../changelog.rst:23
+msgid "Python 3.8"
+msgstr ""
+
+#: ../../changelog.rst:24
+msgid "Python 3.9"
+msgstr ""
+
+#: ../../changelog.rst:25
+msgid "PyPy 2.7"
+msgstr ""
+
+#: ../../changelog.rst:26
+msgid "PyPy 3.6"
+msgstr ""
+
+#: ../../changelog.rst:27
+msgid "PyPy 3.7"
+msgstr ""
+
+#: ../../changelog.rst:29
+msgid ""
+"Support for Python 2.5 was marked as deprecated since 0.12. We decided to go"
+" a step further and also remove support for 2.6 and 3.1 to 3.5 even if it "
+"was never deprecated explicitly in bottle. This means that this release is "
+"*not* backwards compatible in Python <2.7.3 or <3.6 environments. "
+"Maintainers for distributions or systems that still use these old python "
+"versions should not update to Bottle 0.13 and stick with 0.12 instead."
+msgstr ""
+
+#: ../../changelog.rst:35
+msgid "Stabilized APIs"
+msgstr ""
+
+#: ../../changelog.rst:36
+msgid ""
+"The documented API of the :class:`ConfigDict` class is now considered stable"
+" and ready to use."
+msgstr ""
+
+#: ../../changelog.rst:38
+msgid "Deprecated APIs"
+msgstr ""
+
+#: ../../changelog.rst:39
+msgid ""
+"The old route syntax (``/hello/:name``) is deprecated in favor of the more "
+"readable and flexible ``/hello/<name>`` syntax."
+msgstr ""
+
+#: ../../changelog.rst:40
+msgid ""
+":meth:`Bottle.mount` now recognizes Bottle instance and will warn about "
+"parameters that are not compatible with the new mounting behavior. The old "
+"behavior (mount applications as WSGI callable) still works and is used as a "
+"fallback automatically."
+msgstr ""
+
+#: ../../changelog.rst:41
+msgid "The undocumented :func:`local_property` helper is now deprecated."
+msgstr ""
+
+#: ../../changelog.rst:42
+msgid ""
+"The server adapter for google app engine is not useful anymore and marked as"
+" deprecated."
+msgstr ""
+
+#: ../../changelog.rst:43
+msgid ""
+"Bottle uses pickle to store arbitrary objects into signed cookies. This is "
+"safe, as long as the signature key remains a secret. Unfortunately, people "
+"tend to push code with signature keys to github all the time, so we decided "
+"to remove pickle-support from bottle. Signed cookies will now issue a "
+"deprecation warning if the value is not a string, and support for non-string"
+" values will be removed in 0.14. The global :func:`cookie_encode`, "
+":func:`cookie_decode` and :func:`is_cookie_encoded` are now also deprecated."
+" If you are using this feature, think about using json to serialize your "
+"objects before storing them into cookies, or switch to a session system that"
+" stores data server-side instead of client-side."
+msgstr ""
+
+#: ../../changelog.rst:45
+msgid "Removed APIs (deprecated since 0.12)"
+msgstr ""
+
+#: ../../changelog.rst:46
+msgid ""
+"Plugins with the old API (``api=1`` or no api attribute) will no longer "
+"work."
+msgstr ""
+
+#: ../../changelog.rst:47
+msgid ""
+"Parameter order of :meth:`Bottle.mount` changed in 0.10. The old order will "
+"now result in an error instead of a warning."
+msgstr ""
+
+#: ../../changelog.rst:48
+msgid ""
+"The :class:`ConfigDict` class was introduced in 0.11 and changed during "
+"0.12. These changes are now final."
+msgstr ""
+
+#: ../../changelog.rst:50
+msgid ""
+"Attribute access and assignment was removed due to high overhead and limited"
+" usability."
+msgstr ""
+
+#: ../../changelog.rst:51
+msgid ""
+"Namespaced sub-instance creation was removed. ``config[\"a\"][\"b\"]`` has a"
+" high overhead and little benefit over ``config[\"a.b\"]``."
+msgstr ""
+
+#: ../../changelog.rst:52
+msgid ""
+":class:`ConfigDict` instances are no longer callable. This was a shortcut "
+"for :meth:`ConfigDict.update`."
+msgstr ""
+
+#: ../../changelog.rst:53
+msgid ""
+":class:`ConfigDict` constructor no longer accepts any parameters. Use the "
+"`load_*` methods instead."
+msgstr ""
+
+#: ../../changelog.rst:55
+msgid ""
+"Bottle 0.12 changed some aspects of the Simple Template Engine. These "
+"changes are now final and the old syntax will now longer work."
+msgstr ""
+
+#: ../../changelog.rst:57
+msgid ""
+"The magic ``{{rebase()}}`` call was replaced by a ``base`` variable. "
+"Example: ``{{base}}``"
+msgstr ""
+
+#: ../../changelog.rst:58
+msgid ""
+"In STPL Templates, the 'rebase' and 'include' keywords were replaced with "
+"functions in 0.12."
+msgstr ""
+
+#: ../../changelog.rst:59
+msgid ""
+"PEP-263 encoding strings are no longer recognized. Templates are always "
+"utf-8."
+msgstr ""
+
+#: ../../changelog.rst:61
+msgid ""
+"The 'geventSocketIO' server adapter was removed without notice. It did not "
+"work anyway."
+msgstr ""
+
+#: ../../changelog.rst:63
+msgid "Changes"
+msgstr ""
+
+#: ../../changelog.rst:64
+msgid "These changes might require special care when updating."
+msgstr ""
+
+#: ../../changelog.rst:66
+msgid ""
+"Signed cookies now use a stronger HMAC algorithm by default. This will "
+"result in old cookies to appear invalid after the update. Pass an explicit "
+"``digestmod=hashlib.md5`` to :meth:`Request.get_cookie` and "
+":meth:`Response.set_cookie` to get the old behavior."
+msgstr ""
+
+#: ../../changelog.rst:68
+msgid "Other Improvements"
+msgstr ""
+
+#: ../../changelog.rst:69
+msgid ""
+"Bottle() instances are now context managers. If used in a with-statement, "
+"the default application changes to the specific instance and the shortcuts "
+"for many instance methods can be used."
+msgstr ""
+
+#: ../../changelog.rst:70
+msgid ""
+"Added support for ``PATCH`` requests and the :meth:`Bottle.patch` decorator."
+msgstr ""
+
+#: ../../changelog.rst:71
+msgid ""
+"Added `aiohttp <http://aiohttp.readthedocs.io/en/stable/>`_ and `uvloop "
+"<https://github.com/MagicStack/uvloop>`_ server adapters."
+msgstr ""
+
+#: ../../changelog.rst:72
+msgid "Added command-line arguments for config from json or ini files."
+msgstr ""
+
+#: ../../changelog.rst:73
+msgid ""
+":meth:`Bottle.mount` now recognizes instances of :class:`Bottle` and mounts "
+"them with significantly less overhead than other WSGI applications."
+msgstr ""
+
+#: ../../changelog.rst:74
+msgid ""
+"The :attr:`Request.json` property now accepts ``application/json-rpc`` "
+"requests."
+msgstr ""
+
+#: ../../changelog.rst:75
+msgid ""
+":func:`static_file` gained support for ``ETag`` headers. It will generate "
+"ETags and recognizes ``If-None-Match`` headers."
+msgstr ""
+
+#: ../../changelog.rst:76
+msgid "Jinja2 templates will produce better error messages than before."
+msgstr ""
+
+#: ../../changelog.rst:82
+msgid "Release 0.12"
+msgstr ""
+
+#: ../../changelog.rst:84
+msgid "New SimpleTemplate parser implementation"
+msgstr ""
+
+#: ../../changelog.rst:86
+msgid "Support for multi-line code blocks (`<% ... %>`)."
+msgstr ""
+
+#: ../../changelog.rst:87
+msgid ""
+"The keywords `include` and `rebase` are functions now and can accept "
+"variable template names."
+msgstr ""
+
+#: ../../changelog.rst:89
+msgid ""
+"The new :attr:`BaseRequest.route` property returns the :class:`Route` that "
+"originally matched the request."
+msgstr ""
+
+#: ../../changelog.rst:90
+msgid ""
+"Removed the ``BaseRequest.MAX_PARAMS`` limit. The hash collision bug in "
+"CPythons dict() implementation was fixed over a year ago. If you are still "
+"using Python 2.5 in production, consider upgrading or at least make sure "
+"that you get security fixed from your distributor."
+msgstr ""
+
+#: ../../changelog.rst:91
+msgid "New :class:`ConfigDict` API (see :doc:`configuration`)"
+msgstr ""
+
+#: ../../changelog.rst:93
+msgid ""
+"More information can be found in this `development blog post "
+"<http://blog.bottlepy.org/2013/07/19/preview-bottle-012.html>`_."
+msgstr ""
+
+#: ../../changelog.rst:97
+msgid "Release 0.11"
+msgstr ""
+
+#: ../../changelog.rst:99
+msgid ""
+"Native support for Python 2.x and 3.x syntax. No need to run 2to3 anymore."
+msgstr ""
+
+#: ../../changelog.rst:100
+msgid ""
+"Support for partial downloads (``Range`` header) in :func:`static_file`."
+msgstr ""
+
+#: ../../changelog.rst:101
+msgid ""
+"The new :class:`ResourceManager` interface helps locating files bundled with"
+" an application."
+msgstr ""
+
+#: ../../changelog.rst:102
+msgid ""
+"Added a server adapter for `waitress "
+"<http://docs.pylonsproject.org/projects/waitress/en/latest/>`_."
+msgstr ""
+
+#: ../../changelog.rst:103
+msgid ""
+"New :meth:`Bottle.merge` method to install all routes from one application "
+"into another."
+msgstr ""
+
+#: ../../changelog.rst:104
+msgid ""
+"New :attr:`BaseRequest.app` property to get the application object that "
+"handles a request."
+msgstr ""
+
+#: ../../changelog.rst:105
+msgid ""
+"Added :meth:`FormsDict.decode()` to get an all-unicode version (needed by "
+"WTForms)."
+msgstr ""
+
+#: ../../changelog.rst:106
+msgid ":class:`MultiDict` and subclasses are now pickle-able."
+msgstr ""
+
+#: ../../changelog.rst:109
+msgid "API Changes"
+msgstr ""
+
+#: ../../changelog.rst:110
+msgid ""
+":attr:`Response.status` is a read-write property that can be assigned either"
+" a numeric status code or a status string with a reason phrase (``200 OK``)."
+" The return value is now a string to better match existing APIs (WebOb, "
+"werkzeug). To be absolutely clear, you can use the read-only properties "
+":attr:`BaseResponse.status_code` and :attr:`BaseResponse.status_line`."
+msgstr ""
+
+#: ../../changelog.rst:113
+msgid "API Deprecations"
+msgstr ""
+
+#: ../../changelog.rst:114
+msgid ""
+":class:`SimpleTALTemplate` is now deprecating. There seems to be no demand."
+msgstr ""
+
+#: ../../changelog.rst:117
+msgid "Release 0.10"
+msgstr ""
+
+#: ../../changelog.rst:119
+msgid "Plugin API v2"
+msgstr ""
+
+#: ../../changelog.rst:121
+msgid "To use the new API, set :attr:`Plugin.api` to ``2``."
+msgstr ""
+
+#: ../../changelog.rst:122
+msgid ""
+":meth:`Plugin.apply` receives a :class:`Route` object instead of a context "
+"dictionary as second parameter. The new object offers some additional "
+"information and may be extended in the future."
+msgstr ""
+
+#: ../../changelog.rst:123
+msgid ""
+"Plugin names are considered unique now. The topmost plugin with a given name"
+" on a given route is installed, all other plugins with the same name are "
+"silently ignored."
+msgstr ""
+
+#: ../../changelog.rst:125
+msgid "The Request/Response Objects"
+msgstr ""
+
+#: ../../changelog.rst:127
+msgid ""
+"Added :attr:`BaseRequest.json`, :attr:`BaseRequest.remote_route`, "
+":attr:`BaseRequest.remote_addr`, :attr:`BaseRequest.query` and "
+":attr:`BaseRequest.script_name`."
+msgstr ""
+
+#: ../../changelog.rst:128
+msgid ""
+"Added :attr:`BaseResponse.status_line` and :attr:`BaseResponse.status_code` "
+"attributes. In future releases, :attr:`BaseResponse.status` will return a "
+"string (e.g. ``200 OK``) instead of an integer to match the API of other "
+"common frameworks. To make the transition as smooth as possible, you should "
+"use the verbose attributes from now on."
+msgstr ""
+
+#: ../../changelog.rst:129
+msgid ""
+"Replaced :class:`MultiDict` with a specialized :class:`FormsDict` in many "
+"places. The new dict implementation allows attribute access and handles "
+"unicode form values transparently."
+msgstr ""
+
+#: ../../changelog.rst:131
+msgid "Templates"
+msgstr ""
+
+#: ../../changelog.rst:133
+msgid ""
+"Added three new functions to the SimpleTemplate default namespace that "
+"handle undefined variables: :func:`stpl.defined`, :func:`stpl.get` and "
+":func:`stpl.setdefault`."
+msgstr ""
+
+#: ../../changelog.rst:134
+msgid ""
+"The default escape function for SimpleTemplate now additionally escapes "
+"single and double quotes."
+msgstr ""
+
+#: ../../changelog.rst:136
+msgid "Routing"
+msgstr ""
+
+#: ../../changelog.rst:138
+msgid ""
+"A new route syntax (e.g. ``/object/<id:int>``) and support for route "
+"wildcard filters."
+msgstr ""
+
+#: ../../changelog.rst:139
+msgid "Four new wildcard filters: `int`, `float`, `path` and `re`."
+msgstr ""
+
+#: ../../changelog.rst:141
+msgid "Other changes"
+msgstr ""
+
+#: ../../changelog.rst:143
+msgid "Added command line interface to load applications and start servers."
+msgstr ""
+
+#: ../../changelog.rst:144
+msgid ""
+"Introduced a :class:`ConfigDict` that makes accessing configuration a lot "
+"easier (attribute access and auto-expanding namespaces)."
+msgstr ""
+
+#: ../../changelog.rst:145
+msgid "Added support for raw WSGI applications to :meth:`Bottle.mount`."
+msgstr ""
+
+#: ../../changelog.rst:146
+msgid ":meth:`Bottle.mount` parameter order changed."
+msgstr ""
+
+#: ../../changelog.rst:147
+msgid ""
+":meth:`Bottle.route` now accpets an import string for the ``callback`` "
+"parameter."
+msgstr ""
+
+#: ../../changelog.rst:148
+msgid "Dropped Gunicorn 0.8 support. Current supported version is 0.13."
+msgstr ""
+
+#: ../../changelog.rst:149
+msgid "Added custom options to Gunicorn server."
+msgstr ""
+
+#: ../../changelog.rst:150
+msgid ""
+"Finally dropped support for type filters. Replace with a custom plugin of "
+"needed."
+msgstr ""
+
+#: ../../changelog.rst:154
+msgid "Release 0.9"
+msgstr ""
+
+#: ../../changelog.rst:157
+msgid "Whats new?"
+msgstr ""
+
+#: ../../changelog.rst:158
+msgid ""
+"A brand new plugin-API. See :ref:`plugins` and :doc:`plugindev` for details."
+msgstr ""
+
+#: ../../changelog.rst:159
+msgid ""
+"The :func:`route` decorator got a lot of new features. See "
+":meth:`Bottle.route` for details."
+msgstr ""
+
+#: ../../changelog.rst:160
+msgid ""
+"New server adapters for `gevent <http://www.gevent.org/>`_, `meinheld "
+"<http://meinheld.org/>`_ and `bjoern "
+"<https://github.com/jonashaag/bjoern>`_."
+msgstr ""
+
+#: ../../changelog.rst:161
+msgid "Support for SimpleTAL templates."
+msgstr ""
+
+#: ../../changelog.rst:162
+msgid "Better runtime exception handling for mako templates in debug mode."
+msgstr ""
+
+#: ../../changelog.rst:163
+msgid "Lots of documentation, fixes and small improvements."
+msgstr ""
+
+#: ../../changelog.rst:164
+msgid "A new :data:`Request.urlparts` property."
+msgstr ""
+
+#: ../../changelog.rst:167
+msgid "Performance improvements"
+msgstr ""
+
+#: ../../changelog.rst:168
+msgid ""
+"The :class:`Router` now special-cases ``wsgi.run_once`` environments to "
+"speed up CGI."
+msgstr ""
+
+#: ../../changelog.rst:169
+msgid ""
+"Reduced module load time by ~30% and optimized template parser. See `8ccb2d "
+"</commit/8ccb2d>`_, `f72a7c </commit/f72a7c>`_ and `b14b9a "
+"</commit/b14b9a>`_ for details."
+msgstr ""
+
+#: ../../changelog.rst:170
+msgid ""
+"Support for \"App Caching\" on Google App Engine. See `af93ec "
+"</commit/af93ec>`_."
+msgstr ""
+
+#: ../../changelog.rst:171
+msgid ""
+"Some of the rarely used or deprecated features are now plugins that avoid "
+"overhead if the feature is not used."
+msgstr ""
+
+#: ../../changelog.rst:174 ../../changelog.rst:185
+msgid "API changes"
+msgstr ""
+
+#: ../../changelog.rst:175
+msgid ""
+"This release is mostly backward compatible, but some APIs are marked "
+"deprecated now and will be removed for the next release. Most noteworthy:"
+msgstr ""
+
+#: ../../changelog.rst:177
+msgid ""
+"The ``static`` route parameter is deprecated. You can escape wild-cards with"
+" a backslash."
+msgstr ""
+
+#: ../../changelog.rst:178
+msgid ""
+"Type-based output filters are deprecated. They can easily be replaced with "
+"plugins."
+msgstr ""
+
+#: ../../changelog.rst:182
+msgid "Release 0.8"
+msgstr ""
+
+#: ../../changelog.rst:186
+msgid "These changes may break compatibility with previous versions."
+msgstr ""
+
+#: ../../changelog.rst:188
+msgid ""
+"The built-in Key/Value database is not available anymore. It is marked "
+"deprecated since 0.6.4"
+msgstr ""
+
+#: ../../changelog.rst:189
+msgid "The Route syntax and behaviour changed."
+msgstr ""
+
+#: ../../changelog.rst:191
+msgid ""
+"Regular expressions must be encapsulated with ``#``. In 0.6 all non-"
+"alphanumeric characters not present in the regular expression were allowed."
+msgstr ""
+
+#: ../../changelog.rst:192
+msgid ""
+"Regular expressions not part of a route wildcard are escaped automatically. "
+"You don't have to escape dots or other regular control characters anymore. "
+"In 0.6 the whole URL was interpreted as a regular expression. You can use "
+"anonymous wildcards (``/index:#(\\.html)?#``) to achieve a similar "
+"behaviour."
+msgstr ""
+
+#: ../../changelog.rst:194
+msgid ""
+"The ``BreakTheBottle`` exception is gone. Use :class:`HTTPResponse` instead."
+msgstr ""
+
+#: ../../changelog.rst:195
+msgid ""
+"The :class:`SimpleTemplate` engine escapes HTML special characters in "
+"``{{bad_html}}`` expressions automatically. Use the new ``{{!good_html}}`` "
+"syntax to get old behaviour (no escaping)."
+msgstr ""
+
+#: ../../changelog.rst:196
+msgid ""
+"The :class:`SimpleTemplate` engine returns unicode strings instead of lists "
+"of byte strings."
+msgstr ""
+
+#: ../../changelog.rst:197
+msgid ""
+"``bottle.optimize()`` and the automatic route optimization is obsolete."
+msgstr ""
+
+#: ../../changelog.rst:198
+msgid "Some functions and attributes were renamed:"
+msgstr ""
+
+#: ../../changelog.rst:200
+msgid ":attr:`Request._environ` is now :attr:`Request.environ`"
+msgstr ""
+
+#: ../../changelog.rst:201
+msgid ":attr:`Response.header` is now :attr:`Response.headers`"
+msgstr ""
+
+#: ../../changelog.rst:202
+msgid ":func:`default_app` is obsolete. Use :func:`app` instead."
+msgstr ""
+
+#: ../../changelog.rst:204
+msgid "The default :func:`redirect` code changed from 307 to 303."
+msgstr ""
+
+#: ../../changelog.rst:205
+msgid "Removed support for ``@default``. Use ``@error(404)`` instead."
+msgstr ""
+
+#: ../../changelog.rst:209
+msgid "New features"
+msgstr ""
+
+#: ../../changelog.rst:210
+msgid "This is an incomplete list of new features and improved functionality."
+msgstr ""
+
+#: ../../changelog.rst:212
+msgid ""
+"The :class:`Request` object got new properties: :attr:`Request.body`, "
+":attr:`Request.auth`, :attr:`Request.url`, :attr:`Request.header`, "
+":attr:`Request.forms`, :attr:`Request.files`."
+msgstr ""
+
+#: ../../changelog.rst:213
+msgid ""
+"The :meth:`Response.set_cookie` and :meth:`Request.get_cookie` methods are "
+"now able to encode and decode python objects. This is called a *secure "
+"cookie* because the encoded values are signed and protected from changes on "
+"client side. All pickle-able data structures are allowed."
+msgstr ""
+
+#: ../../changelog.rst:214
+msgid ""
+"The new :class:`Router` class drastically improves performance for setups "
+"with lots of dynamic routes and supports named routes (named route + dict = "
+"URL string)."
+msgstr ""
+
+#: ../../changelog.rst:215
+msgid ""
+"It is now possible (and recommended) to return :exc:`HTTPError` and "
+":exc:`HTTPResponse` instances or other exception objects instead of raising "
+"them."
+msgstr ""
+
+#: ../../changelog.rst:216
+msgid ""
+"The new function :func:`static_file` equals :func:`send_file` but returns a "
+":exc:`HTTPResponse` or :exc:`HTTPError` instead of raising it. "
+":func:`send_file` is deprecated."
+msgstr ""
+
+#: ../../changelog.rst:217
+msgid ""
+"New :func:`get`, :func:`post`, :func:`put` and :func:`delete` decorators."
+msgstr ""
+
+#: ../../changelog.rst:218
+msgid "The :class:`SimpleTemplate` engine got full unicode support."
+msgstr ""
+
+#: ../../changelog.rst:219
+msgid "Lots of non-critical bugfixes."
+msgstr ""
+
+#: ../../changelog.rst:225
+msgid "Contributors"
+msgstr ""
+
+#: ../../../AUTHORS:1
+msgid ""
+"Bottle is written and maintained by Marcel Hellkamp <marc@bottlepy.org>."
+msgstr ""
+
+#: ../../../AUTHORS:3
+msgid ""
+"Thanks to all the people who found bugs, sent patches, spread the word, "
+"helped each other on the mailing-list and made this project possible. I hope"
+" the following (alphabetically sorted) list is complete. If you miss your "
+"name on that list (or want your name removed) please :doc:`tell me "
+"<contact>` or add it yourself."
+msgstr ""
+
+#: ../../../AUTHORS:5
+msgid "acasajus"
+msgstr ""
+
+#: ../../../AUTHORS:6
+msgid "Adam R. Smith"
+msgstr ""
+
+#: ../../../AUTHORS:7
+msgid "Alexey Borzenkov"
+msgstr ""
+
+#: ../../../AUTHORS:8
+msgid "Alexis Daboville"
+msgstr ""
+
+#: ../../../AUTHORS:9
+msgid "Anton I. Sipos"
+msgstr ""
+
+#: ../../../AUTHORS:10
+msgid "Anton Kolechkin"
+msgstr ""
+
+#: ../../../AUTHORS:11
+msgid "apexi200sx"
+msgstr ""
+
+#: ../../../AUTHORS:12
+msgid "apheage"
+msgstr ""
+
+#: ../../../AUTHORS:13
+msgid "BillMa"
+msgstr ""
+
+#: ../../../AUTHORS:14
+msgid "Brad Greenlee"
+msgstr ""
+
+#: ../../../AUTHORS:15
+msgid "Brandon Gilmore"
+msgstr ""
+
+#: ../../../AUTHORS:16
+msgid "Branko Vukelic"
+msgstr ""
+
+#: ../../../AUTHORS:17
+msgid "Brian Sierakowski"
+msgstr ""
+
+#: ../../../AUTHORS:18
+msgid "Brian Wickman"
+msgstr ""
+
+#: ../../../AUTHORS:19
+msgid "Carl Scharenberg"
+msgstr ""
+
+#: ../../../AUTHORS:20
+msgid "Damien Degois"
+msgstr ""
+
+#: ../../../AUTHORS:21
+msgid "David Buxton"
+msgstr ""
+
+#: ../../../AUTHORS:22
+msgid "Duane Johnson"
+msgstr ""
+
+#: ../../../AUTHORS:23
+msgid "fcamel"
+msgstr ""
+
+#: ../../../AUTHORS:24
+msgid "Frank Murphy"
+msgstr ""
+
+#: ../../../AUTHORS:25
+msgid "Frederic Junod"
+msgstr ""
+
+#: ../../../AUTHORS:26
+msgid "goldfaber3012"
+msgstr ""
+
+#: ../../../AUTHORS:27
+msgid "Greg Milby"
+msgstr ""
+
+#: ../../../AUTHORS:28
+msgid "gstein"
+msgstr ""
+
+#: ../../../AUTHORS:29
+msgid "Ian Davis"
+msgstr ""
+
+#: ../../../AUTHORS:30
+msgid "Itamar Nabriski"
+msgstr ""
+
+#: ../../../AUTHORS:31
+msgid "Iuri de Silvio"
+msgstr ""
+
+#: ../../../AUTHORS:32
+msgid "Jaimie Murdock"
+msgstr ""
+
+#: ../../../AUTHORS:33
+msgid "Jeff Nichols"
+msgstr ""
+
+#: ../../../AUTHORS:34
+msgid "Jeremy Kelley"
+msgstr ""
+
+#: ../../../AUTHORS:35
+msgid "joegester"
+msgstr ""
+
+#: ../../../AUTHORS:36
+msgid "Johannes Krampf"
+msgstr ""
+
+#: ../../../AUTHORS:37
+msgid "Jonas Haag"
+msgstr ""
+
+#: ../../../AUTHORS:38
+msgid "Joshua Roesslein"
+msgstr ""
+
+#: ../../../AUTHORS:39
+msgid "Judson Neer"
+msgstr ""
+
+#: ../../../AUTHORS:40
+msgid "Karl"
+msgstr ""
+
+#: ../../../AUTHORS:41
+msgid "Kevin Zuber"
+msgstr ""
+
+#: ../../../AUTHORS:42
+msgid "Kraken"
+msgstr ""
+
+#: ../../../AUTHORS:43
+msgid "Kyle Fritz"
+msgstr ""
+
+#: ../../../AUTHORS:44
+msgid "m35"
+msgstr ""
+
+#: ../../../AUTHORS:45
+msgid "Marcos Neves"
+msgstr ""
+
+#: ../../../AUTHORS:46
+msgid "masklinn"
+msgstr ""
+
+#: ../../../AUTHORS:47
+msgid "Michael Labbe"
+msgstr ""
+
+#: ../../../AUTHORS:48
+msgid "Michael Soulier"
+msgstr ""
+
+#: ../../../AUTHORS:49
+msgid "`reddit <http://reddit.com/r/python>`_"
+msgstr ""
+
+#: ../../../AUTHORS:50
+msgid "Nicolas Vanhoren"
+msgstr ""
+
+#: ../../../AUTHORS:51
+msgid "Oz N Tiram"
+msgstr ""
+
+#: ../../../AUTHORS:52
+msgid "Robert Rollins"
+msgstr ""
+
+#: ../../../AUTHORS:53
+msgid "rogererens"
+msgstr ""
+
+#: ../../../AUTHORS:54
+msgid "rwxrwx"
+msgstr ""
+
+#: ../../../AUTHORS:55
+msgid "Santiago Gala"
+msgstr ""
+
+#: ../../../AUTHORS:56
+msgid "Sean M. Collins"
+msgstr ""
+
+#: ../../../AUTHORS:57
+msgid "Sebastian Wollrath"
+msgstr ""
+
+#: ../../../AUTHORS:58
+msgid "Seth"
+msgstr ""
+
+#: ../../../AUTHORS:59
+msgid "Sigurd Høgsbro"
+msgstr ""
+
+#: ../../../AUTHORS:60
+msgid "Stuart Rackham"
+msgstr ""
+
+#: ../../../AUTHORS:61
+msgid "Sun Ning"
+msgstr ""
+
+#: ../../../AUTHORS:62
+msgid "Tomás A. Schertel"
+msgstr ""
+
+#: ../../../AUTHORS:63
+msgid "Tristan Zajonc"
+msgstr ""
+
+#: ../../../AUTHORS:64
+msgid "voltron"
+msgstr ""
+
+#: ../../../AUTHORS:65
+msgid "Wieland Hoffmann"
+msgstr ""
+
+#: ../../../AUTHORS:66
+msgid "zombat"
+msgstr ""
+
+#: ../../../AUTHORS:67
+msgid "Thiago Avelino"
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/configuration.po b/docs/_locale/fr/LC_MESSAGES/configuration.po
new file mode 100644
index 0000000..829984a
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/configuration.po
@@ -0,0 +1,313 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../configuration.rst:3
+msgid "Configuration (DRAFT)"
+msgstr ""
+
+#: ../../configuration.rst:8
+msgid ""
+"This is a draft for a new API. `Tell us <mailto:bottlepy@googlegroups.com>`_"
+" what you think."
+msgstr ""
+
+#: ../../configuration.rst:10
+msgid ""
+"Bottle applications can store their configuration in :attr:`Bottle.config`, "
+"a dict-like object and central place for application specific settings. This"
+" dictionary controls many aspects of the framework, tells (newer) plugins "
+"what to do, and can be used to store your own configuration as well."
+msgstr ""
+
+#: ../../configuration.rst:13
+msgid "Configuration Basics"
+msgstr ""
+
+#: ../../configuration.rst:15
+msgid ""
+"The :attr:`Bottle.config` object behaves a lot like an ordinary dictionary. "
+"All the common dict methods work as expected. Let us start with some "
+"examples::"
+msgstr ""
+
+#: ../../configuration.rst:44
+msgid ""
+"The app object is not always available, but as long as you are within a "
+"request context, you can use the `request` object to get the current "
+"application and its configuration::"
+msgstr ""
+
+#: ../../configuration.rst:51
+msgid "Naming Convention"
+msgstr ""
+
+#: ../../configuration.rst:53
+msgid ""
+"To make life easier, plugins and applications should follow some simple "
+"rules when it comes to config parameter names:"
+msgstr ""
+
+#: ../../configuration.rst:55
+msgid ""
+"All keys should be lowercase strings and follow the rules for python "
+"identifiers (no special characters but the underscore)."
+msgstr ""
+
+#: ../../configuration.rst:56
+msgid ""
+"Namespaces are separated by dots (e.g. ``namespace.field`` or "
+"``namespace.subnamespace.field``)."
+msgstr ""
+
+#: ../../configuration.rst:57
+msgid ""
+"Bottle uses the root namespace for its own configuration. Plugins should "
+"store all their variables in their own namespace (e.g. ``sqlite.db`` or "
+"``werkzeug.use_debugger``)."
+msgstr ""
+
+#: ../../configuration.rst:58
+msgid ""
+"Your own application should use a separate namespace (e.g. ``myapp.*``)."
+msgstr ""
+
+#: ../../configuration.rst:62
+msgid "Loading Configuration from a File"
+msgstr ""
+
+#: ../../configuration.rst:66
+msgid ""
+"Configuration files are useful if you want to enable non-programmers to "
+"configure your application, or just don't want to hack python module files "
+"just to change the database port. A very common syntax for configuration "
+"files is shown here:"
+msgstr ""
+
+#: ../../configuration.rst:78
+msgid ""
+"With :meth:`ConfigDict.load_config` you can load these ``*.ini`` style "
+"configuration files from disk and import their values into your existing "
+"configuration::"
+msgstr ""
+
+#: ../../configuration.rst:85
+msgid "Loading Configuration from a python module"
+msgstr ""
+
+#: ../../configuration.rst:89
+msgid ""
+"Loading configuration from a Python module is a common pattern for Python "
+"programs and frameworks. Bottle assumes that configuration keys are all "
+"upper case:"
+msgstr ""
+
+#: ../../configuration.rst:98
+msgid ""
+"You can load the this Python module with :met:`ConfigDict.load_module`::"
+msgstr ""
+
+#: ../../configuration.rst:107
+msgid ""
+"Note the second parameter to disable loading as namespaced items as in "
+":meth:`ConfigDict.load_dict`. By default, loading from a Python module will "
+"call this method, unless you specifically call this method with `False` as "
+"the second argument."
+msgstr ""
+
+#: ../../configuration.rst:110
+msgid "Loading Configuration from a nested :class:`dict`"
+msgstr ""
+
+#: ../../configuration.rst:114
+msgid ""
+"Another useful method is :meth:`ConfigDict.load_dict`. This method takes an "
+"entire structure of nested dictionaries and turns it into a flat list of "
+"keys and values with namespaced keys::"
+msgstr ""
+
+#: ../../configuration.rst:135
+msgid "Listening to configuration changes"
+msgstr ""
+
+#: ../../configuration.rst:139
+msgid ""
+"The ``config`` hook on the application object is triggered each time a value"
+" in :attr:`Bottle.config` is changed. This hook can be used to react on "
+"configuration changes at runtime, for example reconnect to a new database, "
+"change the debug settings on a background service or resize worker thread "
+"pools. The hook callback receives two arguments (key, new_value) and is "
+"called before the value is actually changed in the dictionary. Raising an "
+"exception from a hook callback cancels the change and the old value is "
+"preserved."
+msgstr ""
+
+#: ../../configuration.rst:148
+msgid ""
+"The hook callbacks cannot *change* the value that is to be stored to the "
+"dictionary. That is what filters are for."
+msgstr ""
+
+#: ../../configuration.rst:154
+msgid "Filters and other Meta Data"
+msgstr ""
+
+#: ../../configuration.rst:158
+msgid ""
+":class:`ConfigDict` allows you to store meta data along with configuration "
+"keys. Two meta fields are currently defined:"
+msgstr ""
+
+#: ../../configuration.rst:162
+msgid "help"
+msgstr ""
+
+#: ../../configuration.rst:161
+msgid ""
+"A help or description string. May be used by debugging, introspection or "
+"admin tools to help the site maintainer configuring their application."
+msgstr ""
+
+#: ../../configuration.rst:165
+msgid "filter"
+msgstr ""
+
+#: ../../configuration.rst:165
+msgid ""
+"A callable that accepts and returns a single value. If a filter is defined "
+"for a key, any new value stored to that key is first passed through the "
+"filter callback. The filter can be used to cast the value to a different "
+"type, check for invalid values (throw a ValueError) or trigger side effects."
+msgstr ""
+
+#: ../../configuration.rst:167
+msgid ""
+"This feature is most useful for plugins. They can validate their config "
+"parameters or trigger side effects using filters and document their "
+"configuration via ``help`` fields::"
+msgstr ""
+
+#: ../../configuration.rst:189
+msgid "API Documentation"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict:1
+msgid ""
+"A dict-like configuration storage with additional support for namespaces, "
+"validators, meta-data, overlays and more."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict:4
+msgid ""
+"This dict-like class is heavily optimized for read access. All read-only "
+"methods as well as item access should be as fast as the built-in dict."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_module:1
+msgid "Load values from a Python module."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_module:3
+msgid "Example modue ``config.py``::"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_module:0
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_config:0
+msgid "Parameters"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_module:17
+msgid ""
+"If true (default), dictionary values are assumed to represent namespaces "
+"(see :meth:`load_dict`)."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_config:1
+msgid "Load values from an ``*.ini`` style config file."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_config:3
+msgid ""
+"A configuration file consists of sections, each led by a ``[section]`` "
+"header, followed by key/value entries separated by either ``=`` or ``:``. "
+"Section names and keys are case-insensitive. Leading and trailing whitespace"
+" is removed from keys and values. Values can be omitted, in which case the "
+"key/value delimiter may also be left out. Values can also span multiple "
+"lines, as long as they are indented deeper than the first line of the value."
+" Commands are prefixed by ``#`` or ``;`` and may only appear on their own on"
+" an otherwise empty line."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_config:13
+msgid ""
+"Both section and key names may contain dots (``.``) as namespace separators."
+" The actual configuration parameter name is constructed by joining section "
+"name and key name together and converting to lower case."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_config:18
+msgid ""
+"The special sections ``bottle`` and ``ROOT`` refer to the root namespace and"
+" the ``DEFAULT`` section defines default values for all other sections."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_config:22
+msgid "With Python 3, extended string interpolation is enabled."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_config:24
+msgid "The path of a config file, or a list of paths."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_config:25
+msgid ""
+"All keyword parameters are passed to the underlying "
+":class:`python:configparser.ConfigParser` constructor call."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.load_dict:1
+msgid ""
+"Load values from a dictionary structure. Nesting can be used to represent "
+"namespaces."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.update:1
+msgid ""
+"If the first parameter is a string, all keys are prefixed with this "
+"namespace. Apart from that it works just as the usual dict.update()."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.setdefault:1
+msgid "Insert key with a value of default if key is not in the dictionary."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.setdefault:3
+msgid "Return the value for key if key is in the dictionary, else default."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.meta_get:1
+msgid "Return the value of a meta field for a key."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.meta_set:1
+msgid "Set the meta field for a key to a new value."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.ConfigDict.meta_list:1
+msgid "Return an iterable of meta field names defined for a key."
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/contact.po b/docs/_locale/fr/LC_MESSAGES/contact.po
new file mode 100644
index 0000000..e116cbf
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/contact.po
@@ -0,0 +1,88 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+# Ibrahim DERRAZ <ibrahim@derraz.fr>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../contact.rst:3
+msgid "Contact"
+msgstr "Contact"
+
+#: ../../contact.rst:6
+msgid "About the Author"
+msgstr ""
+
+#: ../../contact.rst:7
+msgid ""
+"Hi, I'm *Marcel Hellkamp* (aka *defnull*), author of Bottle and the guy "
+"behind this website. I'm 27 years old and studying computer science at the "
+"Georg-August-University in Göttingen, Germany. Python is my favorite "
+"language, but I also code in ruby and JavaScript a lot. Watch me on `twitter"
+" <http://twitter.com/bottlepy>`_ or visit my profile at `GitHub "
+"<http://github.com/defnull>`_ to get in contact. A `mailinglist "
+"<http://groups.google.de/group/bottlepy>`_ is open for Bottle related "
+"questions, too."
+msgstr "Bonjour, je suis *Marcel Hellkamp* (alias *defnull*), développeur de Bottle, et la personne derrière ce site. J'ans 27 ans et j’étudie l’informatique à l’université Georg-August-University à Göttingen en Allemagne. Python est mon langage préféré, mais je code aussi en Ruby et JavaScript. Suivez moi sur `twitter <http://twitter.com/bottlepy>`_ ou visitez mon profil sur `GitHub <http://github.com/defnull>`_ . Une `mailinglist <http://groups.google.de/group/bottlepy>`_ est disponible pour toutes les questions liés à Bottle"
+
+#: ../../contact.rst:10
+msgid "About Bottle"
+msgstr "À propos de Bottle"
+
+#: ../../contact.rst:11
+msgid ""
+"This is my first open source project so far. It started and a small "
+"experiment but soon got so much positive feedback I decided to make "
+"something real out of it. Here it is."
+msgstr "Il s'agit de mon premier projet open-source. Il s’agissait d'un projet d'expérimentation, mais grâce à tout vos retours positifs, j'ai décidé d'en faire un projet sérieux. Et le voilà."
+
+#: ../../contact.rst:14
+msgid "Impressum und Kontaktdaten"
+msgstr "Impressum und Kontaktdaten"
+
+#: ../../contact.rst:15
+msgid ""
+"(This is required by `German law "
+"<http://bundesrecht.juris.de/tmg/__5.html>`_)"
+msgstr "(Requis par la `loi Allemande <http://bundesrecht.juris.de/tmg/__5.html>`_)"
+
+#: ../../contact.rst:17
+msgid ""
+"Die Nutzung der folgenden Kontaktdaten ist ausschließlich für die "
+"Kontaktaufnahme mit dem Betreiber dieser Webseite bei rechtlichen Problemen "
+"vorgesehen. Insbesondere die Nutzung zu Werbe- oder ähnlichen Zwecken ist "
+"ausdrücklich untersagt."
+msgstr "Die Nutzung der folgenden Kontaktdaten ist ausschließlich für die Kontaktaufnahme mit dem Betreiber dieser Webseite bei rechtlichen Problemen vorgesehen. Insbesondere die Nutzung zu Werbe- oder ähnlichen Zwecken ist ausdrücklich untersagt."
+
+#: ../../contact.rst:22
+msgid "**Betreiber**: Marcel Hellkamp"
+msgstr "**Betreiber**: Marcel Hellkamp"
+
+#: ../../contact.rst:23
+msgid "**Ort**: D - 37075 Göttingen"
+msgstr "**Ort**: D - 37075 Göttingen"
+
+#: ../../contact.rst:24
+msgid "**Strasse**: Theodor-Heuss Strasse 13"
+msgstr "**Strasse**: Theodor-Heuss Strasse 13"
+
+#: ../../contact.rst:25
+msgid "**Telefon**: +49 (0) 551 20005915"
+msgstr "**Telefon**: +49 (0) 551 20005915"
+
+#: ../../contact.rst:26
+msgid "**E-Mail**: marc at gsites dot de"
+msgstr "**E-Mail**: marc at gsites dot de"
diff --git a/docs/_locale/fr/LC_MESSAGES/deployment.po b/docs/_locale/fr/LC_MESSAGES/deployment.po
new file mode 100644
index 0000000..13adf2f
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/deployment.po
@@ -0,0 +1,434 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+# Ibrahim DERRAZ <ibrahim@derraz.fr>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../deployment.rst:27
+msgid "Deployment"
+msgstr "Déploiement "
+
+#: ../../deployment.rst:29
+msgid ""
+"The bottle :func:`run` function, when called without any parameters, starts "
+"a local development server on port 8080. You can access and test your "
+"application via http://localhost:8080/ if you are on the same host."
+msgstr ""
+
+#: ../../deployment.rst:31
+msgid ""
+"To get your application available to the outside world, specify the IP the "
+"server should listen to (e.g. ``run(host='192.168.0.1')``) or let the server"
+" listen to all interfaces at once (e.g. ``run(host='0.0.0.0')``). The "
+"listening port can be changed in a similar way, but you need root or admin "
+"rights to choose a port below 1024. Port 80 is the standard for HTTP "
+"servers::"
+msgstr ""
+
+#: ../../deployment.rst:37
+msgid "Server Options"
+msgstr ""
+
+#: ../../deployment.rst:39
+msgid ""
+"The built-in default server is based on `wsgiref WSGIServer "
+"<http://docs.python.org/library/wsgiref.html#module-"
+"wsgiref.simple_server>`_. This non-threading HTTP server is perfectly fine "
+"for development, but may become a performance bottleneck when server load "
+"increases. There are three ways to eliminate this bottleneck:"
+msgstr ""
+
+#: ../../deployment.rst:41
+msgid ""
+"Use a different server that is either multi-threaded or supports "
+"asynchronous IO."
+msgstr ""
+
+#: ../../deployment.rst:42
+msgid ""
+"Start multiple server processes and spread the load with a load-balancer."
+msgstr ""
+
+#: ../../deployment.rst:43
+msgid "Do both."
+msgstr ""
+
+#: ../../deployment.rst:45
+msgid ""
+"**Multi-threaded** servers are the 'classic' way to do it. They are very "
+"robust, reasonably fast and easy to manage. As a drawback, they can only "
+"handle a limited number of connections at the same time and utilize only one"
+" CPU core due to the \"Global Interpreter Lock\" (GIL) of the Python "
+"runtime. This does not hurt most applications, they are waiting for network "
+"IO most of the time anyway, but may slow down CPU intensive tasks (e.g. "
+"image processing)."
+msgstr ""
+
+#: ../../deployment.rst:47
+msgid ""
+"**Asynchronous IO** servers are very fast, can handle a virtually unlimited "
+"number of concurrent connections and are easy to manage. To take full "
+"advantage of their potential, you need to design your application "
+"accordingly and understand the concepts of the specific server."
+msgstr ""
+
+#: ../../deployment.rst:49
+msgid ""
+"**Multi-processing** (forking) servers are not limited by the GIL and "
+"utilize more than one CPU core, but make communication between server "
+"instances more expensive. You need a database or external message query to "
+"share state between processes, or design your application so that it does "
+"not need any shared state. The setup is also a bit more complicated, but "
+"there are good tutorials available."
+msgstr ""
+
+#: ../../deployment.rst:52
+msgid "Switching the Server Backend"
+msgstr ""
+
+#: ../../deployment.rst:54
+msgid ""
+"The easiest way to increase performance is to install a multi-threaded "
+"server library like paste_ or cherrypy_ and tell Bottle to use that instead "
+"of the single-threaded default server::"
+msgstr ""
+
+#: ../../deployment.rst:58
+msgid ""
+"Bottle ships with a lot of ready-to-use adapters for the most common WSGI "
+"servers and automates the setup process. Here is an incomplete list:"
+msgstr ""
+
+#: ../../deployment.rst:61
+msgid "Name"
+msgstr ""
+
+#: ../../deployment.rst:61
+msgid "Homepage"
+msgstr ""
+
+#: ../../deployment.rst:61
+msgid "Description"
+msgstr ""
+
+#: ../../deployment.rst:63
+msgid "cgi"
+msgstr ""
+
+#: ../../deployment.rst:63
+msgid "Run as CGI script"
+msgstr ""
+
+#: ../../deployment.rst:64
+msgid "flup"
+msgstr ""
+
+#: ../../deployment.rst:64
+msgid "flup_"
+msgstr ""
+
+#: ../../deployment.rst:64
+msgid "Run as FastCGI process"
+msgstr ""
+
+#: ../../deployment.rst:65
+msgid "gae"
+msgstr ""
+
+#: ../../deployment.rst:65
+msgid "gae_"
+msgstr ""
+
+#: ../../deployment.rst:65
+msgid "Helper for Google App Engine deployments"
+msgstr ""
+
+#: ../../deployment.rst:66
+msgid "wsgiref"
+msgstr ""
+
+#: ../../deployment.rst:66
+msgid "wsgiref_"
+msgstr ""
+
+#: ../../deployment.rst:66
+msgid "Single-threaded default server"
+msgstr ""
+
+#: ../../deployment.rst:67
+msgid "cherrypy"
+msgstr ""
+
+#: ../../deployment.rst:67
+msgid "cherrypy_"
+msgstr ""
+
+#: ../../deployment.rst:67
+msgid "Multi-threaded and very stable"
+msgstr ""
+
+#: ../../deployment.rst:68
+msgid "paste"
+msgstr ""
+
+#: ../../deployment.rst:68
+msgid "paste_"
+msgstr ""
+
+#: ../../deployment.rst:68
+msgid "Multi-threaded, stable, tried and tested"
+msgstr ""
+
+#: ../../deployment.rst:69
+msgid "waitress"
+msgstr ""
+
+#: ../../deployment.rst:69
+msgid "waitress_"
+msgstr ""
+
+#: ../../deployment.rst:69
+msgid "Multi-threaded, poweres Pyramid"
+msgstr ""
+
+#: ../../deployment.rst:70
+msgid "gunicorn"
+msgstr ""
+
+#: ../../deployment.rst:70
+msgid "gunicorn_"
+msgstr ""
+
+#: ../../deployment.rst:70
+msgid "Pre-forked, partly written in C"
+msgstr ""
+
+#: ../../deployment.rst:71
+msgid "eventlet"
+msgstr ""
+
+#: ../../deployment.rst:71
+msgid "eventlet_"
+msgstr ""
+
+#: ../../deployment.rst:71
+msgid "Asynchronous framework with WSGI support."
+msgstr ""
+
+#: ../../deployment.rst:72
+msgid "gevent"
+msgstr ""
+
+#: ../../deployment.rst:72
+msgid "gevent_"
+msgstr ""
+
+#: ../../deployment.rst:72 ../../deployment.rst:73
+msgid "Asynchronous (greenlets)"
+msgstr ""
+
+#: ../../deployment.rst:73
+msgid "diesel"
+msgstr ""
+
+#: ../../deployment.rst:73
+msgid "diesel_"
+msgstr ""
+
+#: ../../deployment.rst:74
+msgid "tornado"
+msgstr ""
+
+#: ../../deployment.rst:74
+msgid "tornado_"
+msgstr ""
+
+#: ../../deployment.rst:74
+msgid "Asynchronous, powers some parts of Facebook"
+msgstr ""
+
+#: ../../deployment.rst:75
+msgid "twisted"
+msgstr ""
+
+#: ../../deployment.rst:75
+msgid "twisted_"
+msgstr ""
+
+#: ../../deployment.rst:75
+msgid "Asynchronous, well tested but... twisted"
+msgstr ""
+
+#: ../../deployment.rst:76
+msgid "meinheld"
+msgstr ""
+
+#: ../../deployment.rst:76
+msgid "meinheld_"
+msgstr ""
+
+#: ../../deployment.rst:76
+msgid "Asynchronous, partly written in C"
+msgstr ""
+
+#: ../../deployment.rst:77
+msgid "bjoern"
+msgstr ""
+
+#: ../../deployment.rst:77
+msgid "bjoern_"
+msgstr ""
+
+#: ../../deployment.rst:77
+msgid "Asynchronous, very fast and written in C"
+msgstr ""
+
+#: ../../deployment.rst:78
+msgid "auto"
+msgstr ""
+
+#: ../../deployment.rst:78
+msgid "Automatically selects an available server adapter"
+msgstr ""
+
+#: ../../deployment.rst:81
+msgid "The full list is available through :data:`server_names`."
+msgstr ""
+
+#: ../../deployment.rst:83
+msgid ""
+"If there is no adapter for your favorite server or if you need more control "
+"over the server setup, you may want to start the server manually. Refer to "
+"the server documentation on how to run WSGI applications. Here is an example"
+" for paste_::"
+msgstr ""
+
+#: ../../deployment.rst:91
+msgid "Apache mod_wsgi"
+msgstr ""
+
+#: ../../deployment.rst:93
+msgid ""
+"Instead of running your own HTTP server from within Bottle, you can attach "
+"Bottle applications to an `Apache server <apache>`_ using mod_wsgi_."
+msgstr ""
+
+#: ../../deployment.rst:95
+msgid ""
+"All you need is an ``app.wsgi`` file that provides an ``application`` "
+"object. This object is used by mod_wsgi to start your application and should"
+" be a WSGI-compatible Python callable."
+msgstr ""
+
+#: ../../deployment.rst:97
+msgid "File ``/var/www/yourapp/app.wsgi``::"
+msgstr ""
+
+#: ../../deployment.rst:108
+msgid "The Apache configuration may look like this::"
+msgstr ""
+
+#: ../../deployment.rst:126
+msgid "uWSGI"
+msgstr ""
+
+#: ../../deployment.rst:128
+msgid ""
+"uWSGI_ is a modern alternative to FastCGI and the recommended deployment "
+"option on servers like nginx_, lighttpd_, and cherokee_. The uWSGI project "
+"provides an application server that runs your application, and defines a "
+"protocol that frontend webservers can speak to. Have a look at the excellent"
+" `Quickstart for Python/WSGI applications <https://uwsgi-"
+"docs.readthedocs.io/en/latest/WSGIquickstart.html>`_."
+msgstr ""
+
+#: ../../deployment.rst:132
+msgid "Google AppEngine"
+msgstr ""
+
+#: ../../deployment.rst:136
+msgid ""
+"New App Engine applications using the Python 2.7 runtime environment support"
+" any WSGI application and should be configured to use the Bottle application"
+" object directly. For example suppose your application's main module is "
+"``myapp.py``::"
+msgstr ""
+
+#: ../../deployment.rst:146
+msgid ""
+"Then you can configure App Engine's ``app.yaml`` to use the ``app`` object "
+"like so::"
+msgstr ""
+
+#: ../../deployment.rst:158
+msgid ""
+"It is always a good idea to let GAE serve static files directly. Here is "
+"example for a working ``app.yaml`` (using the legacy Python 2.5 runtime "
+"environment)::"
+msgstr ""
+
+#: ../../deployment.rst:175
+msgid "Load Balancer (Manual Setup)"
+msgstr ""
+
+#: ../../deployment.rst:177
+msgid ""
+"A single Python process can utilize only one CPU at a time, even if there "
+"are more CPU cores available. The trick is to balance the load between "
+"multiple independent Python processes to utilize all of your CPU cores."
+msgstr ""
+
+#: ../../deployment.rst:179
+msgid ""
+"Instead of a single Bottle application server, you start one instance for "
+"each CPU core available using different local port (localhost:8080, 8081, "
+"8082, ...). You can choose any server adapter you want, even asynchronous "
+"ones. Then a high performance load balancer acts as a reverse proxy and "
+"forwards each new requests to a random port, spreading the load between all "
+"available back-ends. This way you can use all of your CPU cores and even "
+"spread out the load between different physical servers."
+msgstr ""
+
+#: ../../deployment.rst:181
+msgid ""
+"One of the fastest load balancers available is Pound_ but most common web "
+"servers have a proxy-module that can do the work just fine."
+msgstr ""
+
+#: ../../deployment.rst:183
+msgid "Pound example::"
+msgstr ""
+
+#: ../../deployment.rst:201
+msgid "Apache example::"
+msgstr ""
+
+#: ../../deployment.rst:209
+msgid "Lighttpd example::"
+msgstr ""
+
+#: ../../deployment.rst:221
+msgid "Good old CGI"
+msgstr ""
+
+#: ../../deployment.rst:223
+msgid ""
+"A CGI server starts a new process for each request. This adds a lot of "
+"overhead but is sometimes the only option, especially on cheap hosting "
+"packages. The `cgi` server adapter does not actually start a CGI server, but"
+" transforms your bottle application into a valid CGI application::"
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/development.po b/docs/_locale/fr/LC_MESSAGES/development.po
new file mode 100644
index 0000000..99431ef
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/development.po
@@ -0,0 +1,435 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../development.rst:2
+msgid "Developer Notes"
+msgstr ""
+
+#: ../../development.rst:4
+msgid ""
+"This document is intended for developers and package maintainers interested "
+"in the bottle development and release workflow. If you want to contribute, "
+"you are just right!"
+msgstr ""
+
+#: ../../development.rst:8
+msgid "Get involved"
+msgstr ""
+
+#: ../../development.rst:10
+msgid ""
+"There are several ways to join the community and stay up to date. Here are "
+"some of them:"
+msgstr ""
+
+#: ../../development.rst:12
+msgid ""
+"**Mailing list**: Join our mailing list by sending an email to "
+"`bottlepy+subscribe@googlegroups.com "
+"<mailto:bottlepy+subscribe@googlegroups.com>`_ (no google account required)."
+msgstr ""
+
+#: ../../development.rst:13
+msgid ""
+"**Twitter**: `Follow us on Twitter <https://twitter.com/bottlepy>`_ or "
+"search for the `#bottlepy <https://twitter.com/#!/search/%23bottlepy>`_ tag."
+msgstr ""
+
+#: ../../development.rst:14
+msgid ""
+"**IRC**: Join `#bottlepy on irc.freenode.net "
+"<irc://irc.freenode.net/bottlepy>`_ or use the `web chat interface "
+"<http://webchat.freenode.net/?channels=bottlepy>`_."
+msgstr ""
+
+#: ../../development.rst:15
+msgid ""
+"**Google plus**: We sometimes `blog about Bottle, releases and technical "
+"stuff "
+"<https://plus.google.com/b/104025895326575643538/104025895326575643538/posts>`_"
+" on our Google+ page."
+msgstr ""
+
+#: ../../development.rst:19
+msgid "Get the Sources"
+msgstr ""
+
+#: ../../development.rst:21
+msgid ""
+"The bottle `development repository <https://github.com/bottlepy/bottle>`_ "
+"and the `issue tracker <https://github.com/bottlepy/bottle/issues>`_ are "
+"both hosted at `github <https://github.com/bottlepy/bottle>`_. If you plan "
+"to contribute, it is a good idea to create an account there and fork the "
+"main repository. This way your changes and ideas are visible to other "
+"developers and can be discussed openly. Even without an account, you can "
+"clone the repository or just download the latest development version as a "
+"source archive."
+msgstr ""
+
+#: ../../development.rst:23
+msgid "**git:** ``git clone git://github.com/bottlepy/bottle.git``"
+msgstr ""
+
+#: ../../development.rst:24
+msgid "**git/https:** ``git clone https://github.com/bottlepy/bottle.git``"
+msgstr ""
+
+#: ../../development.rst:25
+msgid ""
+"**Download:** Development branch as `tar archive "
+"<http://github.com/bottlepy/bottle/tarball/master>`_ or `zip file "
+"<http://github.com/bottlepy/bottle/zipball/master>`_."
+msgstr ""
+
+#: ../../development.rst:26
+msgid ""
+"**Translations:** `transifex.com/projects/p/bottle "
+"<https://www.transifex.com/projects/p/bottle/>`_"
+msgstr ""
+
+#: ../../development.rst:30
+msgid "Releases and Updates"
+msgstr ""
+
+#: ../../development.rst:32
+msgid ""
+"Bottle is released at irregular intervals and distributed through `PyPI "
+"<http://pypi.python.org/pypi/bottle>`_. Release candidates and bugfix-"
+"revisions of outdated releases are only available from the git repository "
+"mentioned above. Some Linux distributions may offer packages for outdated "
+"releases, though."
+msgstr ""
+
+#: ../../development.rst:34
+msgid ""
+"The Bottle version number splits into three parts "
+"(**major.minor.revision**). These are *not* used to promote new features but"
+" to indicate important bug-fixes and/or API changes. Critical bugs are fixed"
+" in at least the two latest minor releases and announced in all available "
+"channels (mailinglist, twitter, github). Non-critical bugs or features are "
+"not guaranteed to be backported. This may change in the future, through."
+msgstr ""
+
+#: ../../development.rst:37
+msgid "Major Release (x.0)"
+msgstr ""
+
+#: ../../development.rst:37
+msgid ""
+"The major release number is increased on important milestones or updates "
+"that completely break backward compatibility. You probably have to work over"
+" your entire application to use a new release. These releases are very rare,"
+" through."
+msgstr ""
+
+#: ../../development.rst:40
+msgid "Minor Release (x.y)"
+msgstr ""
+
+#: ../../development.rst:40
+msgid ""
+"The minor release number is increased on updates that change the API or "
+"behaviour in some way. You might get some depreciation warnings any may have"
+" to tweak some configuration settings to restore the old behaviour, but in "
+"most cases these changes are designed to be backward compatible for at least"
+" one minor release. You should update to stay up do date, but don't have to."
+" An exception is 0.8, which *will* break backward compatibility hard. (This "
+"is why 0.7 was skipped). Sorry about that."
+msgstr ""
+
+#: ../../development.rst:43
+msgid "Revision (x.y.z)"
+msgstr ""
+
+#: ../../development.rst:43
+msgid ""
+"The revision number is increased on bug-fixes and other patches that do not "
+"change the API or behaviour. You can safely update without editing your "
+"application code. In fact, you really should as soon as possible, because "
+"important security fixes are released this way."
+msgstr ""
+
+#: ../../development.rst:47
+msgid "Pre-Release Versions"
+msgstr ""
+
+#: ../../development.rst:46
+msgid ""
+"Release candidates are marked by an ``rc`` in their revision number. These "
+"are API stable most of the time and open for testing, but not officially "
+"released yet. You should not use these for production."
+msgstr ""
+
+#: ../../development.rst:50
+msgid "Repository Structure"
+msgstr ""
+
+#: ../../development.rst:52
+msgid "The source repository is structured as follows:"
+msgstr ""
+
+#: ../../development.rst:55
+msgid "``master`` branch"
+msgstr ""
+
+#: ../../development.rst:55
+msgid ""
+"This is the integration, testing and development branch. All changes that "
+"are planned to be part of the next release are merged and tested here."
+msgstr ""
+
+#: ../../development.rst:58
+msgid "``release-x.y`` branches"
+msgstr ""
+
+#: ../../development.rst:58
+msgid ""
+"As soon as the master branch is (almost) ready for a new release, it is "
+"branched into a new release branch. This \"release candidate\" is feature-"
+"frozen but may receive bug-fixes and last-minute changes until it is "
+"considered production ready and officially released. From that point on it "
+"is called a \"support branch\" and still receives bug-fixes, but only "
+"important ones. The revision number is increased on each push to these "
+"branches, so you can keep up with important changes."
+msgstr ""
+
+#: ../../development.rst:62
+msgid "Feature branches"
+msgstr ""
+
+#: ../../development.rst:61
+msgid ""
+"All other branches are feature branches. These are based on the master "
+"branch and only live as long as they are still active and not merged back "
+"into ``master``."
+msgstr ""
+
+#: ../../development.rst:65
+msgid "What does this mean for a developer?"
+msgstr ""
+
+#: ../../development.rst:66
+msgid ""
+"If you want to add a feature, create a new branch from ``master``. If you "
+"want to fix a bug, branch ``release-x.y`` for each affected release. Please "
+"use a separate branch for each feature or bug to make integration as easy as"
+" possible. Thats all. There are git workflow examples at the bottom of this "
+"page."
+msgstr ""
+
+#: ../../development.rst:68
+msgid ""
+"Oh, and never ever change the release number. We'll do that on integration. "
+"You never know in which order we pull pending requests anyway :)"
+msgstr ""
+
+#: ../../development.rst:72
+msgid "What does this mean for a maintainer ?"
+msgstr ""
+
+#: ../../development.rst:73
+msgid ""
+"Watch the tags (and the mailing list) for bug-fixes and new releases. If you"
+" want to fetch a specific release from the git repository, trust the tags, "
+"not the branches. A branch may contain changes that are not released yet, "
+"but a tag marks the exact commit which changed the version number."
+msgstr ""
+
+#: ../../development.rst:77
+msgid "Submitting Patches"
+msgstr ""
+
+#: ../../development.rst:79
+msgid ""
+"The best way to get your changes integrated into the main development branch"
+" is to fork the main repository at github, create a new feature-branch, "
+"apply your changes and send a pull-request. Further down this page is a "
+"small collection of git workflow examples that may guide you. Submitting "
+"git-compatible patches to the mailing list is fine too. In any case, please "
+"follow some basic rules:"
+msgstr ""
+
+#: ../../development.rst:81
+msgid ""
+"**Documentation:** Tell us what your patch does. Comment your code. If you "
+"introduced a new feature, add to the documentation so others can learn about"
+" it."
+msgstr ""
+
+#: ../../development.rst:82
+msgid ""
+"**Test:** Write tests to prove that your code works as expected and does not"
+" break anything. If you fixed a bug, write at least one test-case that "
+"triggers the bug. Make sure that all tests pass before you submit a patch."
+msgstr ""
+
+#: ../../development.rst:83
+msgid ""
+"**One patch at a time:** Only fix one bug or add one feature at a time. "
+"Design your patches so that they can be applyed as a whole. Keep your "
+"patches clean, small and focused."
+msgstr ""
+
+#: ../../development.rst:84
+msgid ""
+"**Sync with upstream:** If the ``upstream/master`` branch changed while you "
+"were working on your patch, rebase or pull to make sure that your patch "
+"still applies without conflicts."
+msgstr ""
+
+#: ../../development.rst:88
+msgid "Building the Documentation"
+msgstr ""
+
+#: ../../development.rst:90
+msgid ""
+"You need a recent version of Sphinx to build the documentation. The "
+"recommended way is to install :command:`virtualenv` using your distribution "
+"package repository and install sphinx manually to get an up-to-date version."
+msgstr ""
+
+#: ../../development.rst:121
+msgid "GIT Workflow Examples"
+msgstr ""
+
+#: ../../development.rst:123
+msgid ""
+"The following examples assume that you have an (free) `github account "
+"<https://github.com>`_. This is not mandatory, but makes things a lot "
+"easier."
+msgstr ""
+
+#: ../../development.rst:125
+msgid ""
+"First of all you need to create a fork (a personal clone) of the official "
+"repository. To do this, you simply click the \"fork\" button on the `bottle "
+"project page <https://github.com/bottlepy/bottle>`_. When the fork is done, "
+"you will be presented with a short introduction to your new repository."
+msgstr ""
+
+#: ../../development.rst:127
+msgid ""
+"The fork you just created is hosted at github and read-able by everyone, but"
+" write-able only by you. Now you need to clone the fork locally to actually "
+"make changes to it. Make sure you use the private (read-write) URL and *not*"
+" the public (read-only) one::"
+msgstr ""
+
+#: ../../development.rst:131
+msgid ""
+"Once the clone is complete your repository will have a remote named "
+"\"origin\" that points to your fork on github. Don’t let the name confuse "
+"you, this does not point to the original bottle repository, but to your own "
+"fork. To keep track of the official repository, add another remote named "
+"\"upstream\"::"
+msgstr ""
+
+#: ../../development.rst:137
+msgid ""
+"Note that \"upstream\" is a public clone URL, which is read-only. You cannot"
+" push changes directly to it. Instead, we will pull from your public "
+"repository. This is described later."
+msgstr ""
+
+#: ../../development.rst:140
+msgid "Submit a Feature"
+msgstr ""
+
+#: ../../development.rst:141
+msgid ""
+"New features are developed in separate feature-branches to make integration "
+"easy. Because they are going to be integrated into the ``master`` branch, "
+"they must be based on ``upstream/master``. To create a new feature-branch, "
+"type the following::"
+msgstr ""
+
+#: ../../development.rst:145
+msgid ""
+"Now implement your feature, write tests, update the documentation, make sure"
+" that all tests pass and commit your changes::"
+msgstr ""
+
+#: ../../development.rst:149
+msgid ""
+"If the ``upstream/master`` branch changed in the meantime, there may be "
+"conflicts with your changes. To solve these, 'rebase' your feature-branch "
+"onto the top of the updated ``upstream/master`` branch::"
+msgstr ""
+
+#: ../../development.rst:154
+msgid ""
+"This is equivalent to undoing all your changes, updating your branch to the "
+"latest version and reapplying all your patches again. If you released your "
+"branch already (see next step), this is not an option because it rewrites "
+"your history. You can do a normal pull instead. Resolve any conflicts, run "
+"the tests again and commit."
+msgstr ""
+
+#: ../../development.rst:156
+msgid ""
+"Now you are almost ready to send a pull request. But first you need to make "
+"your feature-branch public by pushing it to your github fork::"
+msgstr ""
+
+#: ../../development.rst:160
+msgid ""
+"After you’ve pushed your commit(s) you need to inform us about the new "
+"feature. One way is to send a pull-request using github. Another way would "
+"be to start a thread in the mailing-list, which is recommended. It allows "
+"other developers to see and discuss your patches and you get some feedback "
+"for free :)"
+msgstr ""
+
+#: ../../development.rst:162
+msgid ""
+"If we accept your patch, we will integrate it into the official development "
+"branch and make it part of the next release."
+msgstr ""
+
+#: ../../development.rst:165
+msgid "Fix a Bug"
+msgstr ""
+
+#: ../../development.rst:166
+msgid ""
+"The workflow for bug-fixes is very similar to the one for features, but "
+"there are some differences:"
+msgstr ""
+
+#: ../../development.rst:168
+msgid ""
+"Branch off of the affected release branches instead of just the development "
+"branch."
+msgstr ""
+
+#: ../../development.rst:169
+msgid "Write at least one test-case that triggers the bug."
+msgstr ""
+
+#: ../../development.rst:170
+msgid ""
+"Do this for each affected branch including ``upstream/master`` if it is "
+"affected. ``git cherry-pick`` may help you reducing repetitive work."
+msgstr ""
+
+#: ../../development.rst:171
+msgid ""
+"Name your branch after the release it is based on to avoid confusion. "
+"Examples: ``my_bugfix-x.y`` or ``my_bugfix-dev``."
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/faq.po b/docs/_locale/fr/LC_MESSAGES/faq.po
new file mode 100644
index 0000000..0b4edb4
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/faq.po
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../faq.rst:10
+msgid "Frequently Asked Questions"
+msgstr ""
+
+#: ../../faq.rst:13
+msgid "About Bottle"
+msgstr "À propos de Bottle"
+
+#: ../../faq.rst:16
+msgid "Is bottle suitable for complex applications?"
+msgstr ""
+
+#: ../../faq.rst:18
+msgid ""
+"Bottle is a *micro* framework designed for prototyping and building small "
+"web applications and services. It stays out of your way and allows you to "
+"get things done fast, but misses some advanced features and ready-to-use "
+"solutions found in other frameworks (MVC, ORM, form validation, scaffolding,"
+" XML-RPC). Although it *is* possible to add these features and build complex"
+" applications with Bottle, you should consider using a full-stack Web "
+"framework like pylons_ or paste_ instead."
+msgstr ""
+
+#: ../../faq.rst:22
+msgid "Common Problems and Pitfalls"
+msgstr ""
+
+#: ../../faq.rst:29
+msgid "\"Template Not Found\" in mod_wsgi/mod_python"
+msgstr ""
+
+#: ../../faq.rst:31
+msgid ""
+"Bottle searches in ``./`` and ``./views/`` for templates. In a mod_python_ "
+"or mod_wsgi_ environment, the working directory (``./``) depends on your "
+"Apache settings. You should add an absolute path to the template search "
+"path::"
+msgstr ""
+
+#: ../../faq.rst:35
+msgid "so bottle searches the right paths."
+msgstr ""
+
+#: ../../faq.rst:38
+msgid "Dynamic Routes and Slashes"
+msgstr ""
+
+#: ../../faq.rst:40
+msgid ""
+"In :ref:`dynamic route syntax <tutorial-dynamic-routes>`, a placeholder "
+"token (``<name>``) matches everything up to the next slash. This equals to "
+"``[^/]+`` in regular expression syntax. To accept slashes too, you have to "
+"add a custom regular pattern to the placeholder. An example: "
+"``/images/<filepath:path>`` would match ``/images/icons/error.png`` but "
+"``/images/<filename>`` won't."
+msgstr ""
+
+#: ../../faq.rst:43
+msgid "Problems with reverse proxies"
+msgstr ""
+
+#: ../../faq.rst:45
+msgid ""
+"Redirects and url-building only works if bottle knows the public address and"
+" location of your application. If you run bottle locally behind a reverse "
+"proxy or load balancer, some information might get lost along the way. For "
+"example, the ``wsgi.url_scheme`` value or the ``Host`` header might reflect "
+"the local request by your proxy, not the real request by the client. Here is"
+" a small WSGI middleware snippet that helps to fix these values::"
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/index.po b/docs/_locale/fr/LC_MESSAGES/index.po
new file mode 100644
index 0000000..27a1c28
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/index.po
@@ -0,0 +1,134 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+# Ibrahim DERRAZ <ibrahim@derraz.fr>, 2017
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../index.rst:20
+msgid "Bottle: Python Web Framework"
+msgstr ""
+
+#: ../../index.rst:22
+msgid ""
+"Bottle is a fast, simple and lightweight WSGI_ micro web-framework for "
+"Python_. It is distributed as a single file module and has no dependencies "
+"other than the `Python Standard Library <http://docs.python.org/library/>`_."
+msgstr ""
+
+#: ../../index.rst:25
+msgid ""
+"**Routing:** Requests to function-call mapping with support for clean and "
+"dynamic URLs."
+msgstr ""
+
+#: ../../index.rst:26
+msgid ""
+"**Templates:** Fast and pythonic :ref:`built-in template engine <tutorial-"
+"templates>` and support for mako_, jinja2_ and cheetah_ templates."
+msgstr ""
+
+#: ../../index.rst:27
+msgid ""
+"**Utilities:** Convenient access to form data, file uploads, cookies, "
+"headers and other HTTP-related metadata."
+msgstr ""
+
+#: ../../index.rst:28
+msgid ""
+"**Server:** Built-in HTTP development server and support for paste_, "
+"bjoern_, gae_, cherrypy_ or any other WSGI_ capable HTTP server."
+msgstr ""
+
+#: ../../index.rst:31
+msgid "Example: \"Hello World\" in a bottle"
+msgstr "Exemple: \"Hello World\" dans une bottle"
+
+#: ../../index.rst:42
+msgid ""
+"Run this script or paste it into a Python console, then point your browser "
+"to `<http://localhost:8080/hello/world>`_. That's it."
+msgstr "Executez ce script ou coller le dans une console Python, puis rendez vous sur `<http://localhost:8080/hello/world>`_ dans votre navigateur. Et voilà."
+
+#: ../../index.rst:45
+msgid "Download and Install"
+msgstr "Téléchargement et installation"
+
+#: ../../index.rst:48
+msgid ""
+"Install the latest stable release with ``pip install bottle`` or download "
+"`bottle.py`__ (unstable) into your project directory. There are no hard [1]_"
+" dependencies other than the Python standard library. Bottle supports "
+"**Python 2.7 and Python 3**."
+msgstr ""
+
+#: ../../index.rst:50
+msgid "Support for Python 2.5 and 2.6 was dropped with this release."
+msgstr ""
+
+#: ../../index.rst:55
+msgid "User's Guide"
+msgstr "Guide de l'utilisateur"
+
+#: ../../index.rst:56
+msgid ""
+"Start here if you want to learn how to use the bottle framework for web "
+"development. If you have any questions not answered here, feel free to ask "
+"the `mailing list <mailto:bottlepy@googlegroups.com>`_."
+msgstr ""
+
+#: ../../index.rst:71
+msgid "Knowledge Base"
+msgstr ""
+
+#: ../../index.rst:72
+msgid "A collection of articles, guides and HOWTOs."
+msgstr ""
+
+#: ../../index.rst:84
+msgid "Development and Contribution"
+msgstr ""
+
+#: ../../index.rst:86
+msgid ""
+"These chapters are intended for developers interested in the bottle "
+"development and release workflow."
+msgstr ""
+
+#: ../../index.rst:103
+msgid "License"
+msgstr "Licence"
+
+#: ../../index.rst:105
+msgid "Code and documentation are available according to the MIT License:"
+msgstr "Le code et la documentation sont disponibles conformément à la licence MIT:"
+
+#: ../../index.rst:110
+msgid ""
+"The Bottle logo however is *NOT* covered by that license. It is allowed to "
+"use the logo as a link to the bottle homepage or in direct context with the "
+"unmodified library. In all other cases please ask first."
+msgstr ""
+
+#: ../../index.rst:115
+msgid "Footnotes"
+msgstr ""
+
+#: ../../index.rst:116
+msgid ""
+"Usage of the template or server adapter classes requires the corresponding "
+"template or server modules."
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/plugindev.po b/docs/_locale/fr/LC_MESSAGES/plugindev.po
new file mode 100644
index 0000000..8212c62
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/plugindev.po
@@ -0,0 +1,396 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../plugindev.rst:6
+msgid "Plugin Development Guide"
+msgstr ""
+
+#: ../../plugindev.rst:8
+msgid ""
+"This guide explains the plugin API and how to write custom plugins. I "
+"suggest reading :ref:`plugins` first if you have not done that already. You "
+"might also want to have a look at the :doc:`/plugins/index` for some "
+"practical examples."
+msgstr ""
+
+#: ../../plugindev.rst:12
+msgid ""
+"This is a draft. If you see any errors or find that a specific part is not "
+"explained clear enough, please tell the `mailing-list "
+"<mailto:bottlepy@googlegroups.com>`_ or file a `bug report "
+"<https://github.com/bottlepy/bottle/issues>`_."
+msgstr ""
+
+#: ../../plugindev.rst:16
+msgid "How Plugins Work: The Basics"
+msgstr ""
+
+#: ../../plugindev.rst:18
+msgid ""
+"The plugin API builds on the concept of `decorators "
+"<http://docs.python.org/glossary.html#term-decorator>`_. To put it briefly, "
+"a plugin is a decorator applied to every single route callback of an "
+"application."
+msgstr ""
+
+#: ../../plugindev.rst:20
+msgid ""
+"This is just a simplification. Plugins can do a lot more than just "
+"decorating route callbacks, but it is a good starting point. Lets have a "
+"look at some code::"
+msgstr ""
+
+#: ../../plugindev.rst:36
+msgid ""
+"This plugin measures the execution time for each request and adds an "
+"appropriate ``X-Exec-Time`` header to the response. As you can see, the "
+"plugin returns a wrapper and the wrapper calls the original callback "
+"recursively. This is how decorators usually work."
+msgstr ""
+
+#: ../../plugindev.rst:38
+msgid ""
+"The last line tells Bottle to install the plugin to the default application."
+" This causes the plugin to be automatically applied to all routes of that "
+"application. In other words, ``stopwatch()`` is called once for each route "
+"callback and the return value is used as a replacement for the original "
+"callback."
+msgstr ""
+
+#: ../../plugindev.rst:40
+msgid ""
+"Plugins are applied on demand, that is, as soon as a route is requested for "
+"the first time. For this to work properly in multi-threaded environments, "
+"the plugin should be thread-safe. This is not a problem most of the time, "
+"but keep it in mind."
+msgstr ""
+
+#: ../../plugindev.rst:42
+msgid ""
+"Once all plugins are applied to a route, the wrapped callback is cached and "
+"subsequent requests are handled by the cached version directly. This means "
+"that a plugin is usually applied only once to a specific route. That cache, "
+"however, is cleared every time the list of installed plugins changes. Your "
+"plugin should be able to decorate the same route more than once."
+msgstr ""
+
+#: ../../plugindev.rst:44
+msgid ""
+"The decorator API is quite limited, though. You don't know anything about "
+"the route being decorated or the associated application object and have no "
+"way to efficiently store data that is shared among all routes. But fear not!"
+" Plugins are not limited to just decorator functions. Bottle accepts "
+"anything as a plugin as long as it is callable or implements an extended "
+"API. This API is described below and gives you a lot of control over the "
+"whole process."
+msgstr ""
+
+#: ../../plugindev.rst:48
+msgid "Plugin API"
+msgstr ""
+
+#: ../../plugindev.rst:50
+msgid ""
+":class:`Plugin` is not a real class (you cannot import it from "
+":mod:`bottle`) but an interface that plugins are expected to implement. "
+"Bottle accepts any object of any type as a plugin, as long as it conforms to"
+" the following API."
+msgstr ""
+
+#: ../../plugindev.rst:54
+msgid ""
+"Plugins must be callable or implement :meth:`apply`. If :meth:`apply` is "
+"defined, it is always preferred over calling the plugin directly. All other "
+"methods and attributes are optional."
+msgstr ""
+
+#: ../../plugindev.rst:58
+msgid ""
+"Both :meth:`Bottle.uninstall` and the `skip` parameter of "
+":meth:`Bottle.route()` accept a name string to refer to a plugin or plugin "
+"type. This works only for plugins that have a name attribute."
+msgstr ""
+
+#: ../../plugindev.rst:62
+msgid ""
+"The Plugin API is still evolving. This integer attribute tells bottle which "
+"version to use. If it is missing, bottle defaults to the first version. The "
+"current version is ``2``. See :ref:`plugin-changelog` for details."
+msgstr ""
+
+#: ../../plugindev.rst:66
+msgid ""
+"Called as soon as the plugin is installed to an application (see "
+":meth:`Bottle.install`). The only parameter is the associated application "
+"object."
+msgstr ""
+
+#: ../../plugindev.rst:70
+msgid ""
+"As long as :meth:`apply` is not defined, the plugin itself is used as a "
+"decorator and applied directly to each route callback. The only parameter is"
+" the callback to decorate. Whatever is returned by this method replaces the "
+"original callback. If there is no need to wrap or replace a given callback, "
+"just return the unmodified callback parameter."
+msgstr ""
+
+#: ../../plugindev.rst:74
+msgid ""
+"If defined, this method is used in favor of :meth:`__call__` to decorate "
+"route callbacks. The additional `route` parameter is an instance of "
+":class:`Route` and provides a lot of meta-information and context for that "
+"route. See :ref:`route-context` for details."
+msgstr ""
+
+#: ../../plugindev.rst:78
+msgid ""
+"Called immediately before the plugin is uninstalled or the application is "
+"closed (see :meth:`Bottle.uninstall` or :meth:`Bottle.close`)."
+msgstr ""
+
+#: ../../plugindev.rst:81
+msgid ""
+"Both :meth:`Plugin.setup` and :meth:`Plugin.close` are *not* called for "
+"plugins that are applied directly to a route via the :meth:`Bottle.route()` "
+"decorator, but only for plugins installed to an application."
+msgstr ""
+
+#: ../../plugindev.rst:87
+msgid "Plugin API changes"
+msgstr ""
+
+#: ../../plugindev.rst:89
+msgid ""
+"The Plugin API is still evolving and changed with Bottle 0.10 to address "
+"certain issues with the route context dictionary. To ensure backwards "
+"compatibility with 0.9 Plugins, we added an optional :attr:`Plugin.api` "
+"attribute to tell bottle which API to use. The API differences are "
+"summarized here."
+msgstr ""
+
+#: ../../plugindev.rst:91
+msgid "**Bottle 0.9 API 1** (:attr:`Plugin.api` not present)"
+msgstr ""
+
+#: ../../plugindev.rst:93
+msgid "Original Plugin API as described in the 0.9 docs."
+msgstr ""
+
+#: ../../plugindev.rst:95
+msgid "**Bottle 0.10 API 2** (:attr:`Plugin.api` equals 2)"
+msgstr ""
+
+#: ../../plugindev.rst:97
+msgid ""
+"The `context` parameter of the :meth:`Plugin.apply` method is now an "
+"instance of :class:`Route` instead of a context dictionary."
+msgstr ""
+
+#: ../../plugindev.rst:103
+msgid "The Route Context"
+msgstr ""
+
+#: ../../plugindev.rst:105
+msgid ""
+"The :class:`Route` instance passed to :meth:`Plugin.apply` provides detailed"
+" informations about the associated route. The most important attributes are "
+"summarized here:"
+msgstr ""
+
+#: ../../plugindev.rst:108
+msgid "Attribute"
+msgstr ""
+
+#: ../../plugindev.rst:108
+msgid "Description"
+msgstr ""
+
+#: ../../plugindev.rst:110
+msgid "app"
+msgstr ""
+
+#: ../../plugindev.rst:110
+msgid "The application object this route is installed to."
+msgstr ""
+
+#: ../../plugindev.rst:111
+msgid "rule"
+msgstr ""
+
+#: ../../plugindev.rst:111
+msgid "The rule string (e.g. ``/wiki/<page>``)."
+msgstr ""
+
+#: ../../plugindev.rst:112
+msgid "method"
+msgstr ""
+
+#: ../../plugindev.rst:112
+msgid "The HTTP method as a string (e.g. ``GET``)."
+msgstr ""
+
+#: ../../plugindev.rst:113
+msgid "callback"
+msgstr ""
+
+#: ../../plugindev.rst:113
+msgid ""
+"The original callback with no plugins applied. Useful for introspection."
+msgstr ""
+
+#: ../../plugindev.rst:115
+msgid "name"
+msgstr ""
+
+#: ../../plugindev.rst:115
+msgid "The name of the route (if specified) or ``None``."
+msgstr ""
+
+#: ../../plugindev.rst:116
+msgid "plugins"
+msgstr ""
+
+#: ../../plugindev.rst:116
+msgid ""
+"A list of route-specific plugins. These are applied in addition to "
+"application-wide plugins. (see :meth:`Bottle.route`)."
+msgstr ""
+
+#: ../../plugindev.rst:118
+msgid "skiplist"
+msgstr ""
+
+#: ../../plugindev.rst:118
+msgid ""
+"A list of plugins to not apply to this route (again, see "
+":meth:`Bottle.route`)."
+msgstr ""
+
+#: ../../plugindev.rst:120
+msgid "config"
+msgstr ""
+
+#: ../../plugindev.rst:120
+msgid ""
+"Additional keyword arguments passed to the :meth:`Bottle.route` decorator "
+"are stored in this dictionary. Used for route-specific configuration and "
+"meta-data."
+msgstr ""
+
+#: ../../plugindev.rst:125
+msgid ""
+"For your plugin, :attr:`Route.config` is probably the most important "
+"attribute. Keep in mind that this dictionary is local to the route, but "
+"shared between all plugins. It is always a good idea to add a unique prefix "
+"or, if your plugin needs a lot of configuration, store it in a separate "
+"namespace within the `config` dictionary. This helps to avoid naming "
+"collisions between plugins."
+msgstr ""
+
+#: ../../plugindev.rst:129
+msgid "Changing the :class:`Route` object"
+msgstr ""
+
+#: ../../plugindev.rst:131
+msgid ""
+"While some :class:`Route` attributes are mutable, changes may have unwanted "
+"effects on other plugins. It is most likely a bad idea to monkey-patch a "
+"broken route instead of providing a helpful error message and let the user "
+"fix the problem."
+msgstr ""
+
+#: ../../plugindev.rst:133
+msgid ""
+"In some rare cases, however, it might be justifiable to break this rule. "
+"After you made your changes to the :class:`Route` instance, raise "
+":exc:`RouteReset` as an exception. This removes the current route from the "
+"cache and causes all plugins to be re-applied. The router is not updated, "
+"however. Changes to `rule` or `method` values have no effect on the router, "
+"but only on plugins. This may change in the future, though."
+msgstr ""
+
+#: ../../plugindev.rst:137
+msgid "Runtime optimizations"
+msgstr ""
+
+#: ../../plugindev.rst:139
+msgid ""
+"Once all plugins are applied to a route, the wrapped route callback is "
+"cached to speed up subsequent requests. If the behavior of your plugin "
+"depends on configuration, and you want to be able to change that "
+"configuration at runtime, you need to read the configuration on each "
+"request. Easy enough."
+msgstr ""
+
+#: ../../plugindev.rst:141
+msgid ""
+"For performance reasons, however, it might be worthwhile to choose a "
+"different wrapper based on current needs, work with closures, or enable or "
+"disable a plugin at runtime. Let's take the built-in HooksPlugin as an "
+"example: If no hooks are installed, the plugin removes itself from all "
+"affected routes and has virtually no overhead. As soon as you install the "
+"first hook, the plugin activates itself and takes effect again."
+msgstr ""
+
+#: ../../plugindev.rst:143
+msgid ""
+"To achieve this, you need control over the callback cache: "
+":meth:`Route.reset` clears the cache for a single route and "
+":meth:`Bottle.reset` clears all caches for all routes of an application at "
+"once. On the next request, all plugins are re-applied to the route as if it "
+"were requested for the first time."
+msgstr ""
+
+#: ../../plugindev.rst:145
+msgid ""
+"Both methods won't affect the current request if called from within a route "
+"callback, of cause. To force a restart of the current request, raise "
+":exc:`RouteReset` as an exception."
+msgstr ""
+
+#: ../../plugindev.rst:149
+msgid "Plugin Example: SQLitePlugin"
+msgstr ""
+
+#: ../../plugindev.rst:151
+msgid ""
+"This plugin provides an sqlite3 database connection handle as an additional "
+"keyword argument to wrapped callbacks, but only if the callback expects it. "
+"If not, the route is ignored and no overhead is added. The wrapper does not "
+"affect the return value, but handles plugin-related exceptions properly. "
+":meth:`Plugin.setup` is used to inspect the application and search for "
+"conflicting plugins."
+msgstr ""
+
+#: ../../plugindev.rst:218
+msgid ""
+"This plugin is actually useful and very similar to the version bundled with "
+"Bottle. Not bad for less than 60 lines of code, don't you think? Here is a "
+"usage example::"
+msgstr ""
+
+#: ../../plugindev.rst:239
+msgid ""
+"The first route needs a database connection and tells the plugin to create a"
+" handle by requesting a ``db`` keyword argument. The second route does not "
+"need a database and is therefore ignored by the plugin. The third route does"
+" expect a 'db' keyword argument, but explicitly skips the sqlite plugin. "
+"This way the argument is not overruled by the plugin and still contains the "
+"value of the same-named url argument."
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/plugins/index.po b/docs/_locale/fr/LC_MESSAGES/plugins/index.po
new file mode 100644
index 0000000..a0dc626
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/plugins/index.po
@@ -0,0 +1,241 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../plugins/index.rst:5
+msgid "List of available Plugins"
+msgstr ""
+
+#: ../../plugins/index.rst:7
+msgid ""
+"This is a list of third-party plugins that add extend Bottles core "
+"functionality or integrate other libraries with the Bottle framework."
+msgstr ""
+
+#: ../../plugins/index.rst:9
+msgid ""
+"Have a look at :ref:`plugins` for general questions about plugins "
+"(installation, usage). If you plan to develop a new plugin, the "
+":doc:`/plugindev` may help you."
+msgstr ""
+
+#: ../../plugins/index.rst:12
+msgid "`Bottle-Beaker <http://pypi.python.org/pypi/bottle-beaker/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:12
+msgid "Beaker to session and caching library with WSGI Middleware"
+msgstr ""
+
+#: ../../plugins/index.rst:15
+msgid "`Bottle-Cork <http://cork.firelet.net/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:15
+msgid ""
+"Cork provides a simple set of methods to implement Authentication and "
+"Authorization in web applications based on Bottle."
+msgstr ""
+
+#: ../../plugins/index.rst:18
+msgid "`Bottle-Cors-plugin <http://pypi.org/project/bottle-cors-plugin/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:18
+msgid ""
+"Cors-plugin is the easiest way to implement cors on your bottle web "
+"application"
+msgstr ""
+
+#: ../../plugins/index.rst:21
+msgid "`Bottle-Extras <http://pypi.python.org/pypi/bottle-extras/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:21
+msgid "Meta package to install the bottle plugin collection."
+msgstr ""
+
+#: ../../plugins/index.rst:24
+msgid "`Bottle-Flash <http://pypi.python.org/pypi/bottle-flash/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:24
+msgid "flash plugin for bottle"
+msgstr ""
+
+#: ../../plugins/index.rst:27
+msgid "`Bottle-Hotqueue <http://pypi.python.org/pypi/bottle-hotqueue/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:27
+msgid "FIFO Queue for Bottle built upon redis"
+msgstr ""
+
+#: ../../plugins/index.rst:30
+msgid "`Macaron <http://nobrin.github.com/macaron/webapp.html>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:30
+msgid "Macaron is an object-relational mapper (ORM) for SQLite."
+msgstr ""
+
+#: ../../plugins/index.rst:33
+msgid "`Bottle-Memcache <http://pypi.python.org/pypi/bottle-memcache/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:33
+msgid "Memcache integration for Bottle."
+msgstr ""
+
+#: ../../plugins/index.rst:36
+msgid "`Bottle-Mongo <http://pypi.python.org/pypi/bottle-mongo/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:36
+msgid "MongoDB integration for Bottle"
+msgstr ""
+
+#: ../../plugins/index.rst:39
+msgid "`Bottle-OAuthlib <http://pypi.python.org/pypi/bottle-oauthlib/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:39
+msgid "Adapter for oauthlib - create your own OAuth2.0 implementation"
+msgstr ""
+
+#: ../../plugins/index.rst:42
+msgid "`Bottle-Redis <http://pypi.python.org/pypi/bottle-redis/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:42
+msgid "Redis integration for Bottle."
+msgstr ""
+
+#: ../../plugins/index.rst:45
+msgid "`Bottle-Renderer <http://pypi.python.org/pypi/bottle-renderer/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:45
+msgid "Renderer plugin for bottle"
+msgstr ""
+
+#: ../../plugins/index.rst:48
+msgid "`Bottle-Servefiles <http://pypi.python.org/pypi/bottle-servefiles/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:48
+msgid "A reusable app that serves static files for bottle apps"
+msgstr ""
+
+#: ../../plugins/index.rst:51
+msgid "`Bottle-Sqlalchemy <http://pypi.python.org/pypi/bottle-sqlalchemy/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:51
+msgid "SQLAlchemy integration for Bottle."
+msgstr ""
+
+#: ../../plugins/index.rst:54
+msgid "`Bottle-Sqlite <http://pypi.python.org/pypi/bottle-sqlite/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:54
+msgid "SQLite3 database integration for Bottle."
+msgstr ""
+
+#: ../../plugins/index.rst:57
+msgid "`Bottle-Web2pydal <http://pypi.python.org/pypi/bottle-web2pydal/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:57
+msgid "Web2py Dal integration for Bottle."
+msgstr ""
+
+#: ../../plugins/index.rst:60
+msgid "`Bottle-Werkzeug <http://pypi.python.org/pypi/bottle-werkzeug/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:60
+msgid ""
+"Integrates the `werkzeug` library (alternative request and response objects,"
+" advanced debugging middleware and more)."
+msgstr ""
+
+#: ../../plugins/index.rst:63
+msgid ""
+"`bottle-smart-filters <https://github.com/agile4you/bottle-smart-filters/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:63
+msgid "Bottle Querystring smart guessing."
+msgstr ""
+
+#: ../../plugins/index.rst:66
+msgid "`bottle-jwt <https://github.com/agile4you/bottle-jwt/>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:66
+msgid "JSON Web Token authentication plugin for bottle.py"
+msgstr ""
+
+#: ../../plugins/index.rst:69
+msgid "`Bottle-jwt <https://github.com/agalera/bottlejwt>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:69
+msgid "JWT integration for bottle"
+msgstr ""
+
+#: ../../plugins/index.rst:72
+msgid "`canister <https://github.com/dagnelies/canister>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:72
+msgid "a bottle wrapper to provide logging, sessions and authentication"
+msgstr ""
+
+#: ../../plugins/index.rst:75
+msgid "`bottle-cerberus <https://github.com/agalera/bottle-cerberus>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:75
+msgid "Cerberus integration for bottle"
+msgstr ""
+
+#: ../../plugins/index.rst:78
+msgid "`Bottle-errorsrest <https://github.com/agalera/bottle-errorsrest>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:78
+msgid "All errors generated from bottle are returned in json"
+msgstr ""
+
+#: ../../plugins/index.rst:82
+msgid "`Bottle-tools <https://github.com/theSage21/bottle-tools>`_"
+msgstr ""
+
+#: ../../plugins/index.rst:81
+msgid ""
+"Decorators that auto-supply function arguments using POST/query string data."
+msgstr ""
+
+#: ../../plugins/index.rst:84
+msgid ""
+"Plugins listed here are not part of Bottle or the Bottle project, but "
+"developed and maintained by third parties."
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/recipes.po b/docs/_locale/fr/LC_MESSAGES/recipes.po
new file mode 100644
index 0000000..2d5a1d6
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/recipes.po
@@ -0,0 +1,308 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../recipes.rst:16
+msgid "Recipes"
+msgstr ""
+
+#: ../../recipes.rst:18
+msgid ""
+"This is a collection of code snippets and examples for common use cases."
+msgstr ""
+
+#: ../../recipes.rst:21
+msgid "Keeping track of Sessions"
+msgstr ""
+
+#: ../../recipes.rst:23
+msgid ""
+"There is no built-in support for sessions because there is no *right* way to"
+" do it (in a micro framework). Depending on requirements and environment you"
+" could use beaker_ middleware with a fitting backend or implement it "
+"yourself. Here is an example for beaker sessions with a file-based backend::"
+msgstr ""
+
+#: ../../recipes.rst:45
+msgid ""
+"WARNING: Beaker's SessionMiddleware is not thread safe. If two concurrent "
+"requests modify the same session at the same time, one of the updates might "
+"get lost. For this reason, sessions should only be populated once and "
+"treated as a read-only store after that. If you find yourself updating "
+"sessions regularly, and don't want to risk losing any updates, think about "
+"using a real database instead or seek alternative session middleware "
+"libraries."
+msgstr ""
+
+#: ../../recipes.rst:49
+msgid "Debugging with Style: Debugging Middleware"
+msgstr ""
+
+#: ../../recipes.rst:51
+msgid ""
+"Bottle catches all Exceptions raised in your app code to prevent your WSGI "
+"server from crashing. If the built-in :func:`debug` mode is not enough and "
+"you need exceptions to propagate to a debugging middleware, you can turn off"
+" this behaviour::"
+msgstr ""
+
+#: ../../recipes.rst:59
+msgid ""
+"Now, bottle only catches its own exceptions (:exc:`HTTPError`, "
+":exc:`HTTPResponse` and :exc:`BottleException`) and your middleware can "
+"handle the rest."
+msgstr ""
+
+#: ../../recipes.rst:61
+msgid ""
+"The werkzeug_ and paste_ libraries both ship with very powerful debugging "
+"WSGI middleware. Look at :class:`werkzeug.debug.DebuggedApplication` for "
+"werkzeug_ and :class:`paste.evalexception.middleware.EvalException` for "
+"paste_. They both allow you do inspect the stack and even execute python "
+"code within the stack context, so **do not use them in production**."
+msgstr ""
+
+#: ../../recipes.rst:65
+msgid "Unit-Testing Bottle Applications"
+msgstr ""
+
+#: ../../recipes.rst:67
+msgid ""
+"Unit-testing is usually performed against methods defined in your web "
+"application without running a WSGI environment."
+msgstr ""
+
+#: ../../recipes.rst:69
+msgid "A simple example using `Nose <http://readthedocs.org/docs/nose>`_::"
+msgstr ""
+
+#: ../../recipes.rst:80 ../../recipes.rst:97
+msgid "Test script::"
+msgstr ""
+
+#: ../../recipes.rst:87
+msgid ""
+"In the example the Bottle route() method is never executed - only index() is"
+" tested."
+msgstr ""
+
+#: ../../recipes.rst:89
+msgid ""
+"If the code being tested requires access to ``bottle.request`` you can mock "
+"it using `Boddle <https://github.com/keredson/boddle>`_::"
+msgstr ""
+
+#: ../../recipes.rst:108
+msgid "Functional Testing Bottle Applications"
+msgstr ""
+
+#: ../../recipes.rst:110
+msgid ""
+"Any HTTP-based testing system can be used with a running WSGI server, but "
+"some testing frameworks work more intimately with WSGI, and provide the "
+"ability the call WSGI applications in a controlled environment, with "
+"tracebacks and full use of debugging tools. `Testing tools for WSGI "
+"<http://www.wsgi.org/en/latest/testing.html>`_ is a good starting point."
+msgstr ""
+
+#: ../../recipes.rst:112
+msgid ""
+"Example using `WebTest <http://webtest.pythonpaste.org/>`_ and `Nose "
+"<http://readthedocs.org/docs/nose>`_::"
+msgstr ""
+
+#: ../../recipes.rst:132
+msgid "Embedding other WSGI Apps"
+msgstr ""
+
+#: ../../recipes.rst:134
+msgid ""
+"This is not the recommend way (you should use a middleware in front of "
+"bottle to do this) but you can call other WSGI applications from within your"
+" bottle app and let bottle act as a pseudo-middleware. Here is an example::"
+msgstr ""
+
+#: ../../recipes.rst:150
+msgid ""
+"Again, this is not the recommend way to implement subprojects. It is only "
+"here because many people asked for this and to show how bottle maps to WSGI."
+msgstr ""
+
+#: ../../recipes.rst:154
+msgid "Ignore trailing slashes"
+msgstr ""
+
+#: ../../recipes.rst:156
+msgid ""
+"For Bottle, ``/example`` and ``/example/`` are two different routes [1]_. To"
+" treat both URLs the same you can add two ``@route`` decorators::"
+msgstr ""
+
+#: ../../recipes.rst:162
+msgid "add a WSGI middleware that strips trailing slashes from all URLs::"
+msgstr ""
+
+#: ../../recipes.rst:175
+msgid "or add a ``before_request`` hook to strip the trailing slashes::"
+msgstr ""
+
+#: ../../recipes.rst:182
+msgid "Footnotes"
+msgstr ""
+
+#: ../../recipes.rst:183
+msgid "Because they are. See <http://www.ietf.org/rfc/rfc3986.txt>"
+msgstr ""
+
+#: ../../recipes.rst:187
+msgid "Keep-alive requests"
+msgstr ""
+
+#: ../../recipes.rst:191
+msgid "For a more detailed explanation, see :doc:`async`."
+msgstr ""
+
+#: ../../recipes.rst:193
+msgid ""
+"Several \"push\" mechanisms like XHR multipart need the ability to write "
+"response data without closing the connection in conjunction with the "
+"response header \"Connection: keep-alive\". WSGI does not easily lend itself"
+" to this behavior, but it is still possible to do so in Bottle by using the "
+"gevent_ async framework. Here is a sample that works with either the gevent_"
+" HTTP server or the paste_ HTTP server (it may work with others, but I have "
+"not tried). Just change ``server='gevent'`` to ``server='paste'`` to use the"
+" paste_ server::"
+msgstr ""
+
+#: ../../recipes.rst:210
+msgid ""
+"If you browse to ``http://localhost:8080/stream``, you should see 'START', "
+"'MIDDLE', and 'END' show up one at a time (rather than waiting 8 seconds to "
+"see them all at once)."
+msgstr ""
+
+#: ../../recipes.rst:213
+msgid "Gzip Compression in Bottle"
+msgstr ""
+
+#: ../../recipes.rst:216
+msgid "For a detailed discussion, see compression_"
+msgstr ""
+
+#: ../../recipes.rst:218
+msgid ""
+"A common feature request is for Bottle to support Gzip compression, which "
+"speeds up sites by compressing static resources (like CSS and JS files) "
+"during a request."
+msgstr ""
+
+#: ../../recipes.rst:220
+msgid ""
+"Supporting Gzip compression is not a straightforward proposition, due to a "
+"number of corner cases that crop up frequently. A proper Gzip implementation"
+" must:"
+msgstr ""
+
+#: ../../recipes.rst:222
+msgid "Compress on the fly and be fast doing so."
+msgstr ""
+
+#: ../../recipes.rst:223
+msgid "Do not compress for browsers that don't support it."
+msgstr ""
+
+#: ../../recipes.rst:224
+msgid "Do not compress files that are compressed already (images, videos)."
+msgstr ""
+
+#: ../../recipes.rst:225
+msgid "Do not compress dynamic files."
+msgstr ""
+
+#: ../../recipes.rst:226
+msgid "Support two differed compression algorithms (gzip and deflate)."
+msgstr ""
+
+#: ../../recipes.rst:227
+msgid "Cache compressed files that don't change often."
+msgstr ""
+
+#: ../../recipes.rst:228
+msgid "De-validate the cache if one of the files changed anyway."
+msgstr ""
+
+#: ../../recipes.rst:229
+msgid "Make sure the cache does not get to big."
+msgstr ""
+
+#: ../../recipes.rst:230
+msgid ""
+"Do not cache small files because a disk seek would take longer than on-the-"
+"fly compression."
+msgstr ""
+
+#: ../../recipes.rst:232
+msgid ""
+"Because of these requirements, it is the recommendation of the Bottle "
+"project that Gzip compression is best handled by the WSGI server Bottle runs"
+" on top of. WSGI servers such as cherrypy_ provide a GzipFilter_ middleware "
+"that can be used to accomplish this."
+msgstr ""
+
+#: ../../recipes.rst:236
+msgid "Using the hooks plugin"
+msgstr ""
+
+#: ../../recipes.rst:238
+msgid ""
+"For example, if you want to allow Cross-Origin Resource Sharing for the "
+"content returned by all of your URL, you can use the hook decorator and "
+"setup a callback function::"
+msgstr ""
+
+#: ../../recipes.rst:256
+msgid ""
+"You can also use the ``before_request`` to take an action before every "
+"function gets called."
+msgstr ""
+
+#: ../../recipes.rst:261
+msgid "Using Bottle with Heroku"
+msgstr ""
+
+#: ../../recipes.rst:263
+msgid ""
+"Heroku_, a popular cloud application platform now provides support for "
+"running Python applications on their infastructure."
+msgstr ""
+
+#: ../../recipes.rst:266
+msgid ""
+"This recipe is based upon the `Heroku Quickstart "
+"<http://devcenter.heroku.com/articles/quickstart>`_, with Bottle specific "
+"code replacing the `Write Your App "
+"<http://devcenter.heroku.com/articles/python#write_your_app>`_ section of "
+"the `Getting Started with Python on Heroku/Cedar "
+"<http://devcenter.heroku.com/articles/python>`_ guide::"
+msgstr ""
+
+#: ../../recipes.rst:282
+msgid ""
+"Heroku's app stack passes the port that the application needs to listen on "
+"for requests, using the `os.environ` dictionary."
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/routing.po b/docs/_locale/fr/LC_MESSAGES/routing.po
new file mode 100644
index 0000000..5f2766e
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/routing.po
@@ -0,0 +1,233 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../routing.rst:3
+msgid "Request Routing"
+msgstr ""
+
+#: ../../routing.rst:5
+msgid ""
+"Bottle uses a powerful routing engine to find the right callback for each "
+"request. The :ref:`tutorial <tutorial-routing>` shows you the basics. This "
+"document covers advanced techniques and rule mechanics in detail."
+msgstr ""
+
+#: ../../routing.rst:8
+msgid "Rule Syntax"
+msgstr ""
+
+#: ../../routing.rst:10
+msgid ""
+"The :class:`Router` distinguishes between two basic types of routes: "
+"**static routes** (e.g. ``/contact``) and **dynamic routes** (e.g. "
+"``/hello/<name>``). A route that contains one or more *wildcards* it is "
+"considered dynamic. All other routes are static."
+msgstr ""
+
+#: ../../routing.rst:14
+msgid ""
+"The simplest form of a wildcard consists of a name enclosed in angle "
+"brackets (e.g. ``<name>``). The name should be unique for a given route and "
+"form a valid python identifier (alphanumeric, starting with a letter). This "
+"is because wildcards are used as keyword arguments for the request callback "
+"later."
+msgstr ""
+
+#: ../../routing.rst:16
+msgid ""
+"Each wildcard matches one or more characters, but stops at the first slash "
+"(``/``). This equals a regular expression of ``[^/]+`` and ensures that only"
+" one path segment is matched and routes with more than one wildcard stay "
+"unambiguous."
+msgstr ""
+
+#: ../../routing.rst:18
+msgid "The rule ``/<action>/<item>`` matches as follows:"
+msgstr ""
+
+#: ../../routing.rst:21
+msgid "Path"
+msgstr ""
+
+#: ../../routing.rst:21
+msgid "Result"
+msgstr ""
+
+#: ../../routing.rst:23
+msgid "/save/123"
+msgstr ""
+
+#: ../../routing.rst:23
+msgid "``{'action': 'save', 'item': '123'}``"
+msgstr ""
+
+#: ../../routing.rst:24
+msgid "/save/123/"
+msgstr ""
+
+#: ../../routing.rst:24 ../../routing.rst:25 ../../routing.rst:26
+msgid "`No Match`"
+msgstr ""
+
+#: ../../routing.rst:25
+msgid "/save/"
+msgstr ""
+
+#: ../../routing.rst:26
+msgid "//123"
+msgstr ""
+
+#: ../../routing.rst:29
+msgid ""
+"Is it possible to escape characters like colon ``:`` with a backslash "
+"``\\``. This will prevent to trigger the old syntax in case you need to use "
+"``:``. For example: the rule ``/<action>/item:<id>`` triggers the old "
+"syntax, (see below) but ``/action/item\\:<id>`` works as intended with the "
+"new syntax."
+msgstr ""
+
+#: ../../routing.rst:33
+msgid ""
+"You can change the exact behaviour in many ways using filters. This is "
+"described in the next section."
+msgstr ""
+
+#: ../../routing.rst:36
+msgid "Wildcard Filters"
+msgstr ""
+
+#: ../../routing.rst:40
+msgid ""
+"Filters are used to define more specific wildcards, and/or transform the "
+"matched part of the URL before it is passed to the callback. A filtered "
+"wildcard is declared as ``<name:filter>`` or ``<name:filter:config>``. The "
+"syntax for the optional config part depends on the filter used."
+msgstr ""
+
+#: ../../routing.rst:42
+msgid "The following standard filters are implemented:"
+msgstr ""
+
+#: ../../routing.rst:44
+msgid "**:int** matches (signed) digits and converts the value to integer."
+msgstr ""
+
+#: ../../routing.rst:45
+msgid "**:float** similar to :int but for decimal numbers."
+msgstr ""
+
+#: ../../routing.rst:46
+msgid ""
+"**:path** matches all characters including the slash character in a non-"
+"greedy way and may be used to match more than one path segment."
+msgstr ""
+
+#: ../../routing.rst:47
+msgid ""
+"**:re[:exp]** allows you to specify a custom regular expression in the "
+"config field. The matched value is not modified."
+msgstr ""
+
+#: ../../routing.rst:49
+msgid ""
+"You can add your own filters to the router. All you need is a function that "
+"returns three elements: A regular expression string, a callable to convert "
+"the URL fragment to a python value, and a callable that does the opposite. "
+"The filter function is called with the configuration string as the only "
+"parameter and may parse it as needed::"
+msgstr ""
+
+#: ../../routing.rst:75
+msgid "Legacy Syntax"
+msgstr ""
+
+#: ../../routing.rst:79
+msgid ""
+"The new rule syntax was introduce in **Bottle 0.10** to simplify some common"
+" use cases, but the old syntax still works and you can find lot code "
+"examples still using it. The differences are best described by example:"
+msgstr ""
+
+#: ../../routing.rst:82
+msgid "Old Syntax"
+msgstr ""
+
+#: ../../routing.rst:82
+msgid "New Syntax"
+msgstr ""
+
+#: ../../routing.rst:84
+msgid "``:name``"
+msgstr ""
+
+#: ../../routing.rst:84
+msgid "``<name>``"
+msgstr ""
+
+#: ../../routing.rst:85
+msgid "``:name#regexp#``"
+msgstr ""
+
+#: ../../routing.rst:85
+msgid "``<name:re:regexp>``"
+msgstr ""
+
+#: ../../routing.rst:86
+msgid "``:#regexp#``"
+msgstr ""
+
+#: ../../routing.rst:86
+msgid "``<:re:regexp>``"
+msgstr ""
+
+#: ../../routing.rst:87
+msgid "``:##``"
+msgstr ""
+
+#: ../../routing.rst:87
+msgid "``<:re>``"
+msgstr ""
+
+#: ../../routing.rst:90
+msgid ""
+"Try to avoid the old syntax in future projects if you can. It is not "
+"currently deprecated, but will be eventually."
+msgstr ""
+
+#: ../../routing.rst:95
+msgid "Explicit routing configuration"
+msgstr ""
+
+#: ../../routing.rst:97
+msgid ""
+"Route decorator can also be directly called as method. This way provides "
+"flexibility in complex setups, allowing you to directly control, when and "
+"how routing configuration done."
+msgstr ""
+
+#: ../../routing.rst:99
+msgid ""
+"Here is a basic example of explicit routing configuration for default bottle"
+" application::"
+msgstr ""
+
+#: ../../routing.rst:105
+msgid ""
+"In fact, any :class:`Bottle` instance routing can be configured same way::"
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/stpl.po b/docs/_locale/fr/LC_MESSAGES/stpl.po
new file mode 100644
index 0000000..4608907
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/stpl.po
@@ -0,0 +1,271 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../stpl.rst:3
+msgid "SimpleTemplate Engine"
+msgstr ""
+
+#: ../../stpl.rst:7
+msgid ""
+"Bottle comes with a fast, powerful and easy to learn built-in template "
+"engine called *SimpleTemplate* or *stpl* for short. It is the default engine"
+" used by the :func:`view` and :func:`template` helpers but can be used as a "
+"stand-alone general purpose template engine too. This document explains the "
+"template syntax and shows examples for common use cases."
+msgstr ""
+
+#: ../../stpl.rst:10
+msgid "Basic API Usage:"
+msgstr ""
+
+#: ../../stpl.rst:11
+msgid ":class:`SimpleTemplate` implements the :class:`BaseTemplate` API::"
+msgstr ""
+
+#: ../../stpl.rst:18
+msgid ""
+"In this document we use the :func:`template` helper in examples for the sake"
+" of simplicity::"
+msgstr ""
+
+#: ../../stpl.rst:24
+msgid ""
+"You can also pass a dictionary into the template using keyword arguments::"
+msgstr ""
+
+#: ../../stpl.rst:31
+msgid ""
+"Just keep in mind that compiling and rendering templates are two different "
+"actions, even if the :func:`template` helper hides this fact. Templates are "
+"usually compiled only once and cached internally, but rendered many times "
+"with different keyword arguments."
+msgstr ""
+
+#: ../../stpl.rst:34
+msgid ":class:`SimpleTemplate` Syntax"
+msgstr ""
+
+#: ../../stpl.rst:36
+msgid ""
+"Python is a very powerful language but its whitespace-aware syntax makes it "
+"difficult to use as a template language. SimpleTemplate removes some of "
+"these restrictions and allows you to write clean, readable and maintainable "
+"templates while preserving full access to the features, libraries and speed "
+"of the Python language."
+msgstr ""
+
+#: ../../stpl.rst:40
+msgid ""
+"The :class:`SimpleTemplate` syntax compiles directly to python bytecode and "
+"is executed on each :meth:`SimpleTemplate.render` call. Do not render "
+"untrusted templates! They may contain and execute harmful python code."
+msgstr ""
+
+#: ../../stpl.rst:43
+msgid "Inline Expressions"
+msgstr ""
+
+#: ../../stpl.rst:45
+msgid ""
+"You already learned the use of the ``{{...}}`` syntax from the \"Hello "
+"World!\" example above, but there is more: any python expression is allowed "
+"within the curly brackets as long as it evaluates to a string or something "
+"that has a string representation::"
+msgstr ""
+
+#: ../../stpl.rst:54
+msgid ""
+"The contained python expression is executed at render-time and has access to"
+" all keyword arguments passed to the :meth:`SimpleTemplate.render` method. "
+"HTML special characters are escaped automatically to prevent `XSS "
+"<http://en.wikipedia.org/wiki/Cross-Site_Scripting>`_ attacks. You can start"
+" the expression with an exclamation mark to disable escaping for that "
+"expression::"
+msgstr ""
+
+#: ../../stpl.rst:62
+msgid "Embedded python code"
+msgstr ""
+
+#: ../../stpl.rst:66
+msgid ""
+"The template engine allows you to embed lines or blocks of python code "
+"within your template. Code lines start with ``%`` and code blocks are "
+"surrounded by ``<%`` and ``%>`` tokens::"
+msgstr ""
+
+#: ../../stpl.rst:76
+msgid ""
+"Embedded python code follows regular python syntax, but with two additional "
+"syntax rules:"
+msgstr ""
+
+#: ../../stpl.rst:78
+msgid ""
+"**Indentation is ignored.** You can put as much whitespace in front of "
+"statements as you want. This allows you to align your code with the "
+"surrounding markup and can greatly improve readability."
+msgstr ""
+
+#: ../../stpl.rst:79
+msgid ""
+"Blocks that are normally indented now have to be closed explicitly with an "
+"``end`` keyword."
+msgstr ""
+
+#: ../../stpl.rst:89
+msgid ""
+"Both the ``%`` and the ``<%`` tokens are only recognized if they are the "
+"first non-whitespace characters in a line. You don't have to escape them if "
+"they appear mid-text in your template markup. Only if a line of text starts "
+"with one of these tokens, you have to escape it with a backslash. In the "
+"rare case where the backslash + token combination appears in your markup at "
+"the beginning of a line, you can always help yourself with a string literal "
+"in an inline expression::"
+msgstr ""
+
+#: ../../stpl.rst:96
+msgid ""
+"If you find yourself needing to escape a lot, consider using :ref:`custom "
+"tokens <stpl-custom-tokens>`."
+msgstr ""
+
+#: ../../stpl.rst:98
+msgid ""
+"Note that ``%`` and ``<% %>`` work in *exactly* the same way. The latter is "
+"only a convenient way to type less and avoid clutter for longer code "
+"segments. This means that in ``<% %>`` blocks, all indented code must be "
+"terminated with an ``end``, as in the following example::"
+msgstr ""
+
+#: ../../stpl.rst:114
+msgid "Whitespace Control"
+msgstr ""
+
+#: ../../stpl.rst:116
+msgid ""
+"Code blocks and code lines always span the whole line. Whitespace in front "
+"of after a code segment is stripped away. You won't see empty lines or "
+"dangling whitespace in your template because of embedded code::"
+msgstr ""
+
+#: ../../stpl.rst:124
+msgid "This snippet renders to clean and compact html::"
+msgstr ""
+
+#: ../../stpl.rst:130
+msgid ""
+"But embedding code still requires you to start a new line, which may not "
+"what you want to see in your rendered template. To skip the newline in front"
+" of a code segment, end the text line with a double-backslash::"
+msgstr ""
+
+#: ../../stpl.rst:138
+msgid "This time the rendered template looks like this::"
+msgstr ""
+
+#: ../../stpl.rst:142
+msgid ""
+"This only works directly in front of code segments. In all other places you "
+"can control the whitespace yourself and don't need any special syntax."
+msgstr ""
+
+#: ../../stpl.rst:145
+msgid "Template Functions"
+msgstr ""
+
+#: ../../stpl.rst:147
+msgid ""
+"Each template is preloaded with a bunch of functions that help with the most"
+" common use cases. These functions are always available. You don't have to "
+"import or provide them yourself. For everything not covered here there are "
+"probably good python libraries available. Remember that you can ``import`` "
+"anything you want within your templates. They are python programs after all."
+msgstr ""
+
+#: ../../stpl.rst:151
+msgid ""
+"Prior to this release, :func:`include` and :func:`rebase` were syntax "
+"keywords, not functions."
+msgstr ""
+
+#: ../../stpl.rst:156
+msgid ""
+"Render a sub-template with the specified variables and insert the resulting "
+"text into the current template. The function returns a dictionary containing"
+" the local variables passed to or defined within the sub-template::"
+msgstr ""
+
+#: ../../stpl.rst:164
+msgid ""
+"Mark the current template to be later included into a different template. "
+"After the current template is rendered, its resulting text is stored in a "
+"variable named ``base`` and passed to the base-template, which is then "
+"rendered. This can be used to `wrap` a template with surrounding text, or "
+"simulate the inheritance feature found in other template engines::"
+msgstr ""
+
+#: ../../stpl.rst:169
+msgid "This can be combined with the following ``base.tpl``::"
+msgstr ""
+
+#: ../../stpl.rst:181
+msgid ""
+"Accessing undefined variables in a template raises :exc:`NameError` and "
+"stops rendering immediately. This is standard python behavior and nothing "
+"new, but vanilla python lacks an easy way to check the availability of a "
+"variable. This quickly gets annoying if you want to support flexible inputs "
+"or use the same template in different situations. These functions may help:"
+msgstr ""
+
+#: ../../stpl.rst:189
+msgid ""
+"Return True if the variable is defined in the current template namespace, "
+"False otherwise."
+msgstr ""
+
+#: ../../stpl.rst:194
+msgid "Return the variable, or a default value."
+msgstr ""
+
+#: ../../stpl.rst:198
+msgid ""
+"If the variable is not defined, create it with the given default value. "
+"Return the variable."
+msgstr ""
+
+#: ../../stpl.rst:201
+msgid ""
+"Here is an example that uses all three functions to implement optional "
+"template variables in different ways::"
+msgstr ""
+
+#: ../../stpl.rst:215
+msgid ":class:`SimpleTemplate` API"
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.SimpleTemplate.prepare:1
+msgid ""
+"Run preparations (parsing, caching, ...). It should be possible to call this"
+" again to refresh a template or to update settings."
+msgstr ""
+
+#: ../../../bottle.pydocstring of bottle.SimpleTemplate.render:1
+msgid "Render the template using keyword arguments as local variables."
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/tutorial.po b/docs/_locale/fr/LC_MESSAGES/tutorial.po
new file mode 100644
index 0000000..211b0fb
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/tutorial.po
@@ -0,0 +1,1460 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../tutorial.rst:24
+msgid "Tutorial"
+msgstr ""
+
+#: ../../tutorial.rst:26
+msgid ""
+"This tutorial introduces you to the concepts and features of the Bottle web "
+"framework and covers basic and advanced topics alike. You can read it from "
+"start to end, or use it as a reference later on. The automatically generated"
+" :doc:`api` may be interesting for you, too. It covers more details, but "
+"explains less than this tutorial. Solutions for the most common questions "
+"can be found in our :doc:`recipes` collection or on the :doc:`faq` page. If "
+"you need any help, join our `mailing list "
+"<mailto:bottlepy@googlegroups.com>`_ or visit us in our `IRC channel "
+"<http://webchat.freenode.net/?channels=bottlepy>`_."
+msgstr ""
+
+#: ../../tutorial.rst:31
+msgid "Installation"
+msgstr ""
+
+#: ../../tutorial.rst:33
+msgid ""
+"Bottle does not depend on any external libraries. You can just download "
+"`bottle.py </bottle.py>`_ into your project directory and start coding:"
+msgstr ""
+
+#: ../../tutorial.rst:39
+msgid ""
+"This will get you the latest development snapshot that includes all the new "
+"features. If you prefer a more stable environment, you should stick with the"
+" stable releases. These are available on `PyPI "
+"<http://pypi.python.org/pypi/bottle>`_ and can be installed via "
+":command:`pip` (recommended), :command:`easy_install` or your package "
+"manager:"
+msgstr ""
+
+#: ../../tutorial.rst:47
+msgid ""
+"Either way, you'll need Python 2.7 or newer (including 3.4+) to run bottle "
+"applications. If you do not have permissions to install packages system-wide"
+" or simply don't want to, create a `virtualenv "
+"<http://pypi.python.org/pypi/virtualenv>`_ first:"
+msgstr ""
+
+#: ../../tutorial.rst:55
+msgid "Or, if virtualenv is not installed on your system:"
+msgstr ""
+
+#: ../../tutorial.rst:67
+msgid "Quickstart: \"Hello World\""
+msgstr ""
+
+#: ../../tutorial.rst:69
+msgid ""
+"This tutorial assumes you have Bottle either :ref:`installed <installation>`"
+" or copied into your project directory. Let's start with a very basic "
+"\"Hello World\" example::"
+msgstr ""
+
+#: ../../tutorial.rst:79
+msgid ""
+"This is it. Run this script, visit http://localhost:8080/hello and you will "
+"see \"Hello World!\" in your browser. Here is how it works:"
+msgstr ""
+
+#: ../../tutorial.rst:81
+msgid ""
+"The :func:`route` decorator binds a piece of code to an URL path. In this "
+"case, we link the ``/hello`` path to the ``hello()`` function. This is "
+"called a `route` (hence the decorator name) and is the most important "
+"concept of this framework. You can define as many routes as you want. "
+"Whenever a browser requests a URL, the associated function is called and the"
+" return value is sent back to the browser. It's as simple as that."
+msgstr ""
+
+#: ../../tutorial.rst:83
+msgid ""
+"The :func:`run` call in the last line starts a built-in development server. "
+"It runs on ``localhost`` port ``8080`` and serves requests until you hit "
+":kbd:`Control-c`. You can switch the server backend later, but for now a "
+"development server is all we need. It requires no setup at all and is an "
+"incredibly painless way to get your application up and running for local "
+"tests."
+msgstr ""
+
+#: ../../tutorial.rst:85
+msgid ""
+"The :ref:`tutorial-debugging` is very helpful during early development, but "
+"should be switched off for public applications. Keep that in mind."
+msgstr ""
+
+#: ../../tutorial.rst:87
+msgid ""
+"This is just a demonstration of the basic concept of how applications are "
+"built with Bottle. Continue reading and you'll see what else is possible."
+msgstr ""
+
+#: ../../tutorial.rst:92
+msgid "The Default Application"
+msgstr ""
+
+#: ../../tutorial.rst:94
+msgid ""
+"For the sake of simplicity, most examples in this tutorial use a module-"
+"level :func:`route` decorator to define routes. This adds routes to a global"
+" \"default application\", an instance of :class:`Bottle` that is "
+"automatically created the first time you call :func:`route`. Several other "
+"module-level decorators and functions relate to this default application, "
+"but if you prefer a more object oriented approach and don't mind the extra "
+"typing, you can create a separate application object and use that instead of"
+" the global one::"
+msgstr ""
+
+#: ../../tutorial.rst:106
+msgid ""
+"The object-oriented approach is further described in the :ref:`default-app` "
+"section. Just keep in mind that you have a choice."
+msgstr ""
+
+#: ../../tutorial.rst:114
+msgid "Request Routing"
+msgstr ""
+
+#: ../../tutorial.rst:116
+msgid ""
+"In the last chapter we built a very simple web application with only a "
+"single route. Here is the routing part of the \"Hello World\" example "
+"again::"
+msgstr ""
+
+#: ../../tutorial.rst:122
+msgid ""
+"The :func:`route` decorator links an URL path to a callback function, and "
+"adds a new route to the :ref:`default application <tutorial-default>`. An "
+"application with just one route is kind of boring, though. Let's add some "
+"more (don't forget ``from bottle import template``)::"
+msgstr ""
+
+#: ../../tutorial.rst:129
+msgid ""
+"This example demonstrates two things: You can bind more than one route to a "
+"single callback, and you can add wildcards to URLs and access them via "
+"keyword arguments."
+msgstr ""
+
+#: ../../tutorial.rst:136
+msgid "Dynamic Routes"
+msgstr ""
+
+#: ../../tutorial.rst:138
+msgid ""
+"Routes that contain wildcards are called `dynamic routes` (as opposed to "
+"`static routes`) and match more than one URL at the same time. A simple "
+"wildcard consists of a name enclosed in angle brackets (e.g. ``<name>``) and"
+" accepts one or more characters up to the next slash (``/``). For example, "
+"the route ``/hello/<name>`` accepts requests for ``/hello/alice`` as well as"
+" ``/hello/bob``, but not for ``/hello``, ``/hello/`` or ``/hello/mr/smith``."
+msgstr ""
+
+#: ../../tutorial.rst:140
+msgid ""
+"Each wildcard passes the covered part of the URL as a keyword argument to "
+"the request callback. You can use them right away and implement RESTful, "
+"nice-looking and meaningful URLs with ease. Here are some other examples "
+"along with the URLs they'd match::"
+msgstr ""
+
+#: ../../tutorial.rst:150
+msgid ""
+"Filters can be used to define more specific wildcards, and/or transform the "
+"covered part of the URL before it is passed to the callback. A filtered "
+"wildcard is declared as ``<name:filter>`` or ``<name:filter:config>``. The "
+"syntax for the optional config part depends on the filter used."
+msgstr ""
+
+#: ../../tutorial.rst:152
+msgid ""
+"The following filters are implemented by default and more may be added:"
+msgstr ""
+
+#: ../../tutorial.rst:154
+msgid ""
+"**:int** matches (signed) digits only and converts the value to integer."
+msgstr ""
+
+#: ../../tutorial.rst:155
+msgid "**:float** similar to :int but for decimal numbers."
+msgstr ""
+
+#: ../../tutorial.rst:156
+msgid ""
+"**:path** matches all characters including the slash character in a non-"
+"greedy way and can be used to match more than one path segment."
+msgstr ""
+
+#: ../../tutorial.rst:157
+msgid ""
+"**:re** allows you to specify a custom regular expression in the config "
+"field. The matched value is not modified."
+msgstr ""
+
+#: ../../tutorial.rst:159
+msgid "Let's have a look at some practical examples::"
+msgstr ""
+
+#: ../../tutorial.rst:173
+msgid "You can add your own filters as well. See :doc:`routing` for details."
+msgstr ""
+
+#: ../../tutorial.rst:177
+msgid "HTTP Request Methods"
+msgstr ""
+
+#: ../../tutorial.rst:181
+msgid ""
+"The HTTP protocol defines several `request methods`__ (sometimes referred to"
+" as \"verbs\") for different tasks. GET is the default for all routes with "
+"no other method specified. These routes will match GET requests only. To "
+"handle other methods such as POST, PUT, DELETE or PATCH, add a ``method`` "
+"keyword argument to the :func:`route` decorator or use one of the five "
+"alternative decorators: :func:`get`, :func:`post`, :func:`put`, "
+":func:`delete` or :func:`patch`."
+msgstr ""
+
+#: ../../tutorial.rst:183
+msgid ""
+"The POST method is commonly used for HTML form submission. This example "
+"shows how to handle a login form using POST::"
+msgstr ""
+
+#: ../../tutorial.rst:206
+msgid ""
+"In this example the ``/login`` URL is linked to two distinct callbacks, one "
+"for GET requests and another for POST requests. The first one displays a "
+"HTML form to the user. The second callback is invoked on a form submission "
+"and checks the login credentials the user entered into the form. The use of "
+":attr:`Request.forms` is further described in the :ref:`tutorial-request` "
+"section."
+msgstr ""
+
+#: ../../tutorial.rst:209
+msgid "Special Methods: HEAD and ANY"
+msgstr ""
+
+#: ../../tutorial.rst:210
+msgid ""
+"The HEAD method is used to ask for the response identical to the one that "
+"would correspond to a GET request, but without the response body. This is "
+"useful for retrieving meta-information about a resource without having to "
+"download the entire document. Bottle handles these requests automatically by"
+" falling back to the corresponding GET route and cutting off the request "
+"body, if present. You don't have to specify any HEAD routes yourself."
+msgstr ""
+
+#: ../../tutorial.rst:212
+msgid ""
+"Additionally, the non-standard ANY method works as a low priority fallback: "
+"Routes that listen to ANY will match requests regardless of their HTTP "
+"method but only if no other more specific route is defined. This is helpful "
+"for *proxy-routes* that redirect requests to more specific sub-applications."
+msgstr ""
+
+#: ../../tutorial.rst:214
+msgid ""
+"To sum it up: HEAD requests fall back to GET routes and all requests fall "
+"back to ANY routes, but only if there is no matching route for the original "
+"request method. It's as simple as that."
+msgstr ""
+
+#: ../../tutorial.rst:219
+msgid "Routing Static Files"
+msgstr ""
+
+#: ../../tutorial.rst:221
+msgid ""
+"Static files such as images or CSS files are not served automatically. You "
+"have to add a route and a callback to control which files get served and "
+"where to find them::"
+msgstr ""
+
+#: ../../tutorial.rst:228
+msgid ""
+"The :func:`static_file` function is a helper to serve files in a safe and "
+"convenient way (see :ref:`tutorial-static-files`). This example is limited "
+"to files directly within the ``/path/to/your/static/files`` directory "
+"because the ``<filename>`` wildcard won't match a path with a slash in it. "
+"To serve files in subdirectories, change the wildcard to use the `path` "
+"filter::"
+msgstr ""
+
+#: ../../tutorial.rst:234
+msgid ""
+"Be careful when specifying a relative root-path such as "
+"``root='./static/files'``. The working directory (``./``) and the project "
+"directory are not always the same."
+msgstr ""
+
+#: ../../tutorial.rst:242
+msgid "Error Pages"
+msgstr ""
+
+#: ../../tutorial.rst:244
+msgid ""
+"If anything goes wrong, Bottle displays an informative but fairly plain "
+"error page. You can override the default for a specific HTTP status code "
+"with the :func:`error` decorator::"
+msgstr ""
+
+#: ../../tutorial.rst:251
+msgid ""
+"From now on, `404 File not Found` errors will display a custom error page to"
+" the user. The only parameter passed to the error-handler is an instance of "
+":exc:`HTTPError`. Apart from that, an error-handler is quite similar to a "
+"regular request callback. You can read from :data:`request`, write to "
+":data:`response` and return any supported data-type except for "
+":exc:`HTTPError` instances."
+msgstr ""
+
+#: ../../tutorial.rst:253
+msgid ""
+"Error handlers are used only if your application returns or raises an "
+":exc:`HTTPError` exception (:func:`abort` does just that). Changing "
+":attr:`Request.status` or returning :exc:`HTTPResponse` won't trigger the "
+"error handler."
+msgstr ""
+
+#: ../../tutorial.rst:263
+msgid "Generating content"
+msgstr ""
+
+#: ../../tutorial.rst:265
+msgid ""
+"In pure WSGI, the range of types you may return from your application is "
+"very limited. Applications must return an iterable yielding byte strings. "
+"You may return a string (because strings are iterable) but this causes most "
+"servers to transmit your content char by char. Unicode strings are not "
+"allowed at all. This is not very practical."
+msgstr ""
+
+#: ../../tutorial.rst:267
+msgid ""
+"Bottle is much more flexible and supports a wide range of types. It even "
+"adds a ``Content-Length`` header if possible and encodes unicode "
+"automatically, so you don't have to. What follows is a list of data types "
+"you may return from your application callbacks and a short description of "
+"how these are handled by the framework:"
+msgstr ""
+
+#: ../../tutorial.rst:270
+msgid "Dictionaries"
+msgstr ""
+
+#: ../../tutorial.rst:270
+msgid ""
+"As mentioned above, Python dictionaries (or subclasses thereof) are "
+"automatically transformed into JSON strings and returned to the browser with"
+" the ``Content-Type`` header set to ``application/json``. This makes it easy"
+" to implement json-based APIs. Data formats other than json are supported "
+"too. See the :ref:`tutorial-output-filter` to learn more."
+msgstr ""
+
+#: ../../tutorial.rst:273
+msgid "Empty Strings, ``False``, ``None`` or other non-true values:"
+msgstr ""
+
+#: ../../tutorial.rst:273
+msgid ""
+"These produce an empty output with the ``Content-Length`` header set to 0."
+msgstr ""
+
+#: ../../tutorial.rst:276
+msgid "Unicode strings"
+msgstr ""
+
+#: ../../tutorial.rst:276
+msgid ""
+"Unicode strings (or iterables yielding unicode strings) are automatically "
+"encoded with the codec specified in the ``Content-Type`` header (utf8 by "
+"default) and then treated as normal byte strings (see below)."
+msgstr ""
+
+#: ../../tutorial.rst:279
+msgid "Byte strings"
+msgstr ""
+
+#: ../../tutorial.rst:279
+msgid ""
+"Bottle returns strings as a whole (instead of iterating over each char) and "
+"adds a ``Content-Length`` header based on the string length. Lists of byte "
+"strings are joined first. Other iterables yielding byte strings are not "
+"joined because they may grow too big to fit into memory. The ``Content-"
+"Length`` header is not set in this case."
+msgstr ""
+
+#: ../../tutorial.rst:282
+msgid "Instances of :exc:`HTTPError` or :exc:`HTTPResponse`"
+msgstr ""
+
+#: ../../tutorial.rst:282
+msgid ""
+"Returning these has the same effect as when raising them as an exception. In"
+" case of an :exc:`HTTPError`, the error handler is applied. See :ref"
+":`tutorial-errorhandling` for details."
+msgstr ""
+
+#: ../../tutorial.rst:285
+msgid "File objects"
+msgstr ""
+
+#: ../../tutorial.rst:285
+msgid ""
+"Everything that has a ``.read()`` method is treated as a file or file-like "
+"object and passed to the ``wsgi.file_wrapper`` callable defined by the WSGI "
+"server framework. Some WSGI server implementations can make use of optimized"
+" system calls (sendfile) to transmit files more efficiently. In other cases "
+"this just iterates over chunks that fit into memory. Optional headers such "
+"as ``Content-Length`` or ``Content-Type`` are *not* set automatically. Use "
+":func:`send_file` if possible. See :ref:`tutorial-static-files` for details."
+msgstr ""
+
+#: ../../tutorial.rst:288
+msgid "Iterables and generators"
+msgstr ""
+
+#: ../../tutorial.rst:288
+msgid ""
+"You are allowed to use ``yield`` within your callbacks or return an "
+"iterable, as long as the iterable yields byte strings, unicode strings, "
+":exc:`HTTPError` or :exc:`HTTPResponse` instances. Nested iterables are not "
+"supported, sorry. Please note that the HTTP status code and the headers are "
+"sent to the browser as soon as the iterable yields its first non-empty "
+"value. Changing these later has no effect."
+msgstr ""
+
+#: ../../tutorial.rst:290
+msgid ""
+"The ordering of this list is significant. You may for example return a "
+"subclass of :class:`str` with a ``read()`` method. It is still treated as a "
+"string instead of a file, because strings are handled first."
+msgstr ""
+
+#: ../../tutorial.rst:293
+msgid "Changing the Default Encoding"
+msgstr ""
+
+#: ../../tutorial.rst:294
+msgid ""
+"Bottle uses the `charset` parameter of the ``Content-Type`` header to decide"
+" how to encode unicode strings. This header defaults to ``text/html; "
+"charset=UTF8`` and can be changed using the :attr:`Response.content_type` "
+"attribute or by setting the :attr:`Response.charset` attribute directly. "
+"(The :class:`Response` object is described in the section :ref:`tutorial-"
+"response`.)"
+msgstr ""
+
+#: ../../tutorial.rst:309
+msgid ""
+"In some rare cases the Python encoding names differ from the names supported"
+" by the HTTP specification. Then, you have to do both: first set the "
+":attr:`Response.content_type` header (which is sent to the client unchanged)"
+" and then set the :attr:`Response.charset` attribute (which is used to "
+"encode unicode)."
+msgstr ""
+
+#: ../../tutorial.rst:314
+msgid "Static Files"
+msgstr ""
+
+#: ../../tutorial.rst:316
+msgid ""
+"You can directly return file objects, but :func:`static_file` is the "
+"recommended way to serve static files. It automatically guesses a mime-type,"
+" adds a ``Last-Modified`` header, restricts paths to a ``root`` directory "
+"for security reasons and generates appropriate error responses (403 on "
+"permission errors, 404 on missing files). It even supports the ``If-"
+"Modified-Since`` header and eventually generates a ``304 Not Modified`` "
+"response. You can pass a custom MIME type to disable guessing."
+msgstr ""
+
+#: ../../tutorial.rst:329
+msgid ""
+"You can raise the return value of :func:`static_file` as an exception if you"
+" really need to."
+msgstr ""
+
+#: ../../tutorial.rst:332
+msgid "Forced Download"
+msgstr ""
+
+#: ../../tutorial.rst:333
+msgid ""
+"Most browsers try to open downloaded files if the MIME type is known and "
+"assigned to an application (e.g. PDF files). If this is not what you want, "
+"you can force a download dialog and even suggest a filename to the user::"
+msgstr ""
+
+#: ../../tutorial.rst:339
+msgid ""
+"If the ``download`` parameter is just ``True``, the original filename is "
+"used."
+msgstr ""
+
+#: ../../tutorial.rst:344
+msgid "HTTP Errors and Redirects"
+msgstr ""
+
+#: ../../tutorial.rst:346
+msgid ""
+"The :func:`abort` function is a shortcut for generating HTTP error pages."
+msgstr ""
+
+#: ../../tutorial.rst:355
+msgid ""
+"To redirect a client to a different URL, you can send a ``303 See Other`` "
+"response with the ``Location`` header set to the new URL. :func:`redirect` "
+"does that for you::"
+msgstr ""
+
+#: ../../tutorial.rst:362
+msgid "You may provide a different HTTP status code as a second parameter."
+msgstr ""
+
+#: ../../tutorial.rst:365
+msgid ""
+"Both functions will interrupt your callback code by raising an "
+":exc:`HTTPResponse` exception."
+msgstr ""
+
+#: ../../tutorial.rst:368
+msgid "Other Exceptions"
+msgstr ""
+
+#: ../../tutorial.rst:369
+msgid ""
+"All exceptions other than :exc:`HTTPResponse` or :exc:`HTTPError` will "
+"result in a ``500 Internal Server Error`` response, so they won't crash your"
+" WSGI server. You can turn off this behavior to handle exceptions in your "
+"middleware by setting ``bottle.app().catchall`` to ``False``."
+msgstr ""
+
+#: ../../tutorial.rst:375
+msgid "The :class:`Response` Object"
+msgstr ""
+
+#: ../../tutorial.rst:377
+msgid ""
+"Response metadata such as the HTTP status code, response headers and cookies"
+" are stored in an object called :data:`response` up to the point where they "
+"are transmitted to the browser. You can manipulate these metadata directly "
+"or use the predefined helper methods to do so. The full API and feature list"
+" is described in the API section (see :class:`Response`), but the most "
+"common use cases and features are covered here, too."
+msgstr ""
+
+#: ../../tutorial.rst:380
+msgid "Status Code"
+msgstr ""
+
+#: ../../tutorial.rst:381
+msgid ""
+"The `HTTP status code <http_code>`_ controls the behavior of the browser and"
+" defaults to ``200 OK``. In most scenarios you won't need to set the "
+":attr:`Response.status` attribute manually, but use the :func:`abort` helper"
+" or return an :exc:`HTTPResponse` instance with the appropriate status code."
+" Any integer is allowed, but codes other than the ones defined by the `HTTP "
+"specification <http_code>`_ will only confuse the browser and break "
+"standards."
+msgstr ""
+
+#: ../../tutorial.rst:384
+msgid "Response Header"
+msgstr ""
+
+#: ../../tutorial.rst:385
+msgid ""
+"Response headers such as ``Cache-Control`` or ``Location`` are defined via "
+":meth:`Response.set_header`. This method takes two parameters, a header name"
+" and a value. The name part is case-insensitive::"
+msgstr ""
+
+#: ../../tutorial.rst:392
+msgid ""
+"Most headers are unique, meaning that only one header per name is send to "
+"the client. Some special headers however are allowed to appear more than "
+"once in a response. To add an additional header, use "
+":meth:`Response.add_header` instead of :meth:`Response.set_header`::"
+msgstr ""
+
+#: ../../tutorial.rst:397
+msgid ""
+"Please note that this is just an example. If you want to work with cookies, "
+"read :ref:`ahead <tutorial-cookies>`."
+msgstr ""
+
+#: ../../tutorial.rst:403 ../../tutorial.rst:533
+msgid "Cookies"
+msgstr ""
+
+#: ../../tutorial.rst:405
+msgid ""
+"A cookie is a named piece of text stored in the user's browser profile. You "
+"can access previously defined cookies via :meth:`Request.get_cookie` and set"
+" new cookies with :meth:`Response.set_cookie`::"
+msgstr ""
+
+#: ../../tutorial.rst:415
+msgid ""
+"The :meth:`Response.set_cookie` method accepts a number of additional "
+"keyword arguments that control the cookies lifetime and behavior. Some of "
+"the most common settings are described here:"
+msgstr ""
+
+#: ../../tutorial.rst:417
+msgid "**max_age:** Maximum age in seconds. (default: ``None``)"
+msgstr ""
+
+#: ../../tutorial.rst:418
+msgid ""
+"**expires:** A datetime object or UNIX timestamp. (default: ``None``)"
+msgstr ""
+
+#: ../../tutorial.rst:419
+msgid ""
+"**domain:** The domain that is allowed to read the cookie. (default: "
+"current domain)"
+msgstr ""
+
+#: ../../tutorial.rst:420
+msgid "**path:** Limit the cookie to a given path (default: ``/``)"
+msgstr ""
+
+#: ../../tutorial.rst:421
+msgid "**secure:** Limit the cookie to HTTPS connections (default: off)."
+msgstr ""
+
+#: ../../tutorial.rst:422
+msgid ""
+"**httponly:** Prevent client-side javascript to read this cookie (default:"
+" off, requires Python 2.7 or newer)."
+msgstr ""
+
+#: ../../tutorial.rst:423
+msgid ""
+"**same_site:** Disables third-party use for a cookie. Allowed attributes: "
+"`lax` and `strict`. In strict mode the cookie will never be sent. In lax "
+"mode the cookie is only sent with a top-level GET request."
+msgstr ""
+
+#: ../../tutorial.rst:425
+msgid ""
+"If neither `expires` nor `max_age` is set, the cookie expires at the end of "
+"the browser session or as soon as the browser window is closed. There are "
+"some other gotchas you should consider when using cookies:"
+msgstr ""
+
+#: ../../tutorial.rst:427
+msgid "Cookies are limited to 4 KB of text in most browsers."
+msgstr ""
+
+#: ../../tutorial.rst:428
+msgid ""
+"Some users configure their browsers to not accept cookies at all. Most "
+"search engines ignore cookies too. Make sure that your application still "
+"works without cookies."
+msgstr ""
+
+#: ../../tutorial.rst:429
+msgid ""
+"Cookies are stored at client side and are not encrypted in any way. Whatever"
+" you store in a cookie, the user can read it. Worse than that, an attacker "
+"might be able to steal a user's cookies through `XSS "
+"<http://en.wikipedia.org/wiki/HTTP_cookie#Cookie_theft_and_session_hijacking>`_"
+" vulnerabilities on your side. Some viruses are known to read the browser "
+"cookies, too. Thus, never store confidential information in cookies."
+msgstr ""
+
+#: ../../tutorial.rst:430
+msgid "Cookies are easily forged by malicious clients. Do not trust cookies."
+msgstr ""
+
+#: ../../tutorial.rst:435
+msgid "Signed Cookies"
+msgstr ""
+
+#: ../../tutorial.rst:436
+msgid ""
+"As mentioned above, cookies are easily forged by malicious clients. Bottle "
+"can cryptographically sign your cookies to prevent this kind of "
+"manipulation. All you have to do is to provide a signature key via the "
+"`secret` keyword argument whenever you read or set a cookie and keep that "
+"key a secret. As a result, :meth:`Request.get_cookie` will return ``None`` "
+"if the cookie is not signed or the signature keys don't match::"
+msgstr ""
+
+#: ../../tutorial.rst:456
+msgid ""
+"In addition, Bottle automatically pickles and unpickles any data stored to "
+"signed cookies. This allows you to store any pickle-able object (not only "
+"strings) to cookies, as long as the pickled data does not exceed the 4 KB "
+"limit."
+msgstr ""
+
+#: ../../tutorial.rst:458
+msgid ""
+"Signed cookies are not encrypted (the client can still see the content) and "
+"not copy-protected (the client can restore an old cookie). The main "
+"intention is to make pickling and unpickling safe and prevent manipulation, "
+"not to store secret information at client side."
+msgstr ""
+
+#: ../../tutorial.rst:471
+msgid "Request Data"
+msgstr ""
+
+#: ../../tutorial.rst:473
+msgid ""
+"Cookies, HTTP header, HTML ``<form>`` fields and other request data is "
+"available through the global :data:`request` object. This special object "
+"always refers to the *current* request, even in multi-threaded environments "
+"where multiple client connections are handled at the same time::"
+msgstr ""
+
+#: ../../tutorial.rst:482
+msgid ""
+"The :data:`request` object is a subclass of :class:`BaseRequest` and has a "
+"very rich API to access data. We only cover the most commonly used features "
+"here, but it should be enough to get started."
+msgstr ""
+
+#: ../../tutorial.rst:487
+msgid "Introducing :class:`FormsDict`"
+msgstr ""
+
+#: ../../tutorial.rst:489
+msgid ""
+"Bottle uses a special type of dictionary to store form data and cookies. "
+":class:`FormsDict` behaves like a normal dictionary, but has some additional"
+" features to make your life easier."
+msgstr ""
+
+#: ../../tutorial.rst:491
+msgid ""
+"**Attribute access**: All values in the dictionary are also accessible as "
+"attributes. These virtual attributes return unicode strings, even if the "
+"value is missing or unicode decoding fails. In that case, the string is "
+"empty, but still present::"
+msgstr ""
+
+#: ../../tutorial.rst:506
+msgid ""
+"**Multiple values per key:** :class:`FormsDict` is a subclass of "
+":class:`MultiDict` and can store more than one value per key. The standard "
+"dictionary access methods will only return a single value, but the "
+":meth:`~MultiDict.getall` method returns a (possibly empty) list of all "
+"values for a specific key::"
+msgstr ""
+
+#: ../../tutorial.rst:511
+msgid ""
+"**WTForms support:** Some libraries (e.g. `WTForms "
+"<http://wtforms.simplecodes.com/>`_) want all-unicode dictionaries as input."
+" :meth:`FormsDict.decode` does that for you. It decodes all values and "
+"returns a copy of itself, while preserving multiple values per key and all "
+"the other features."
+msgstr ""
+
+#: ../../tutorial.rst:515
+msgid ""
+"In **Python 2** all keys and values are byte-strings. If you need unicode, "
+"you can call :meth:`FormsDict.getunicode` or fetch values via attribute "
+"access. Both methods try to decode the string (default: utf8) and return an "
+"empty string if that fails. No need to catch :exc:`UnicodeError`::"
+msgstr ""
+
+#: ../../tutorial.rst:522
+msgid ""
+"In **Python 3** all strings are unicode, but HTTP is a byte-based wire "
+"protocol. The server has to decode the byte strings somehow before they are "
+"passed to the application. To be on the safe side, WSGI suggests ISO-8859-1 "
+"(aka latin1), a reversible single-byte codec that can be re-encoded with a "
+"different encoding later. Bottle does that for :meth:`FormsDict.getunicode` "
+"and attribute access, but not for the dict-access methods. These return the "
+"unchanged values as provided by the server implementation, which is probably"
+" not what you want."
+msgstr ""
+
+#: ../../tutorial.rst:529
+msgid ""
+"If you need the whole dictionary with correctly decoded values (e.g. for "
+"WTForms), you can call :meth:`FormsDict.decode` to get a re-encoded copy."
+msgstr ""
+
+#: ../../tutorial.rst:535
+msgid ""
+"Cookies are small pieces of text stored in the clients browser and sent back"
+" to the server with each request. They are useful to keep some state around "
+"for more than one request (HTTP itself is stateless), but should not be used"
+" for security related stuff. They can be easily forged by the client."
+msgstr ""
+
+#: ../../tutorial.rst:537
+msgid ""
+"All cookies sent by the client are available through "
+":attr:`BaseRequest.cookies` (a :class:`FormsDict`). This example shows a "
+"simple cookie-based view counter::"
+msgstr ""
+
+#: ../../tutorial.rst:547
+msgid ""
+"The :meth:`BaseRequest.get_cookie` method is a different way do access "
+"cookies. It supports decoding :ref:`signed cookies <tutorial-signed-"
+"cookies>` as described in a separate section."
+msgstr ""
+
+#: ../../tutorial.rst:550
+msgid "HTTP Headers"
+msgstr ""
+
+#: ../../tutorial.rst:552
+msgid ""
+"All HTTP headers sent by the client (e.g. ``Referer``, ``Agent`` or "
+"``Accept-Language``) are stored in a :class:`WSGIHeaderDict` and accessible "
+"through the :attr:`BaseRequest.headers` attribute. A :class:`WSGIHeaderDict`"
+" is basically a dictionary with case-insensitive keys::"
+msgstr ""
+
+#: ../../tutorial.rst:564
+msgid "Query Variables"
+msgstr ""
+
+#: ../../tutorial.rst:566
+msgid ""
+"The query string (as in ``/forum?id=1&page=5``) is commonly used to transmit"
+" a small number of key/value pairs to the server. You can use the "
+":attr:`BaseRequest.query` attribute (a :class:`FormsDict`) to access these "
+"values and the :attr:`BaseRequest.query_string` attribute to get the whole "
+"string."
+msgstr ""
+
+#: ../../tutorial.rst:579
+msgid "HTML `<form>` Handling"
+msgstr ""
+
+#: ../../tutorial.rst:581
+msgid ""
+"Let us start from the beginning. In HTML, a typical ``<form>`` looks "
+"something like this:"
+msgstr ""
+
+#: ../../tutorial.rst:591
+msgid ""
+"The ``action`` attribute specifies the URL that will receive the form data. "
+"``method`` defines the HTTP method to use (``GET`` or ``POST``). With "
+"``method=\"get\"`` the form values are appended to the URL and available "
+"through :attr:`BaseRequest.query` as described above. This is considered "
+"insecure and has other limitations, so we use ``method=\"post\"`` here. If "
+"in doubt, use ``POST`` forms."
+msgstr ""
+
+#: ../../tutorial.rst:593
+msgid ""
+"Form fields transmitted via ``POST`` are stored in :attr:`BaseRequest.forms`"
+" as a :class:`FormsDict`. The server side code may look like this::"
+msgstr ""
+
+#: ../../tutorial.rst:616
+msgid ""
+"There are several other attributes used to access form data. Some of them "
+"combine values from different sources for easier access. The following table"
+" should give you a decent overview."
+msgstr ""
+
+#: ../../tutorial.rst:619
+msgid "Attribute"
+msgstr ""
+
+#: ../../tutorial.rst:619
+msgid "GET Form fields"
+msgstr ""
+
+#: ../../tutorial.rst:619
+msgid "POST Form fields"
+msgstr ""
+
+#: ../../tutorial.rst:619
+msgid "File Uploads"
+msgstr ""
+
+#: ../../tutorial.rst:621
+msgid ":attr:`BaseRequest.query`"
+msgstr ""
+
+#: ../../tutorial.rst:621 ../../tutorial.rst:622 ../../tutorial.rst:623
+#: ../../tutorial.rst:624 ../../tutorial.rst:624 ../../tutorial.rst:625
+#: ../../tutorial.rst:626 ../../tutorial.rst:626
+msgid "yes"
+msgstr ""
+
+#: ../../tutorial.rst:621 ../../tutorial.rst:621 ../../tutorial.rst:622
+#: ../../tutorial.rst:622 ../../tutorial.rst:623 ../../tutorial.rst:623
+#: ../../tutorial.rst:624 ../../tutorial.rst:625 ../../tutorial.rst:625
+#: ../../tutorial.rst:626
+msgid "no"
+msgstr ""
+
+#: ../../tutorial.rst:622
+msgid ":attr:`BaseRequest.forms`"
+msgstr ""
+
+#: ../../tutorial.rst:623
+msgid ":attr:`BaseRequest.files`"
+msgstr ""
+
+#: ../../tutorial.rst:624
+msgid ":attr:`BaseRequest.params`"
+msgstr ""
+
+#: ../../tutorial.rst:625
+msgid ":attr:`BaseRequest.GET`"
+msgstr ""
+
+#: ../../tutorial.rst:626
+msgid ":attr:`BaseRequest.POST`"
+msgstr ""
+
+#: ../../tutorial.rst:631
+msgid "File uploads"
+msgstr ""
+
+#: ../../tutorial.rst:633
+msgid ""
+"To support file uploads, we have to change the ``<form>`` tag a bit. First, "
+"we tell the browser to encode the form data in a different way by adding an "
+"``enctype=\"multipart/form-data\"`` attribute to the ``<form>`` tag. Then, "
+"we add ``<input type=\"file\" />`` tags to allow the user to select a file. "
+"Here is an example:"
+msgstr ""
+
+#: ../../tutorial.rst:643
+msgid ""
+"Bottle stores file uploads in :attr:`BaseRequest.files` as "
+":class:`FileUpload` instances, along with some metadata about the upload. "
+"Let us assume you just want to save the file to disk::"
+msgstr ""
+
+#: ../../tutorial.rst:657
+msgid ""
+":attr:`FileUpload.filename` contains the name of the file on the clients "
+"file system, but is cleaned up and normalized to prevent bugs caused by "
+"unsupported characters or path segments in the filename. If you need the "
+"unmodified name as sent by the client, have a look at "
+":attr:`FileUpload.raw_filename`."
+msgstr ""
+
+#: ../../tutorial.rst:659
+msgid ""
+"The :attr:`FileUpload.save` method is highly recommended if you want to "
+"store the file to disk. It prevents some common errors (e.g. it does not "
+"overwrite existing files unless you tell it to) and stores the file in a "
+"memory efficient way. You can access the file object directly via "
+":attr:`FileUpload.file`. Just be careful."
+msgstr ""
+
+#: ../../tutorial.rst:663
+msgid "JSON Content"
+msgstr ""
+
+#: ../../tutorial.rst:665
+msgid ""
+"Some JavaScript or REST clients send ``application/json`` content to the "
+"server. The :attr:`BaseRequest.json` attribute contains the parsed data "
+"structure, if available."
+msgstr ""
+
+#: ../../tutorial.rst:669
+msgid "The raw request body"
+msgstr ""
+
+#: ../../tutorial.rst:671
+msgid ""
+"You can access the raw body data as a file-like object via "
+":attr:`BaseRequest.body`. This is a :class:`BytesIO` buffer or a temporary "
+"file depending on the content length and :attr:`BaseRequest.MEMFILE_MAX` "
+"setting. In both cases the body is completely buffered before you can access"
+" the attribute. If you expect huge amounts of data and want to get direct "
+"unbuffered access to the stream, have a look at ``request['wsgi.input']``."
+msgstr ""
+
+#: ../../tutorial.rst:676
+msgid "WSGI Environment"
+msgstr ""
+
+#: ../../tutorial.rst:678
+msgid ""
+"Each :class:`BaseRequest` instance wraps a WSGI environment dictionary. The "
+"original is stored in :attr:`BaseRequest.environ`, but the request object "
+"itself behaves like a dictionary, too. Most of the interesting data is "
+"exposed through special methods or attributes, but if you want to access "
+"`WSGI environ variables <WSGI_Specification>`_ directly, you can do so::"
+msgstr ""
+
+#: ../../tutorial.rst:696
+msgid "Templates"
+msgstr ""
+
+#: ../../tutorial.rst:698
+msgid ""
+"Bottle comes with a fast and powerful built-in template engine called "
+":doc:`stpl`. To render a template you can use the :func:`template` function "
+"or the :func:`view` decorator. All you have to do is to provide the name of "
+"the template and the variables you want to pass to the template as keyword "
+"arguments. Here’s a simple example of how to render a template::"
+msgstr ""
+
+#: ../../tutorial.rst:705
+msgid ""
+"This will load the template file ``hello_template.tpl`` and render it with "
+"the ``name`` variable set. Bottle will look for templates in the "
+"``./views/`` folder or any folder specified in the ``bottle.TEMPLATE_PATH`` "
+"list."
+msgstr ""
+
+#: ../../tutorial.rst:707
+msgid ""
+"The :func:`view` decorator allows you to return a dictionary with the "
+"template variables instead of calling :func:`template`::"
+msgstr ""
+
+#: ../../tutorial.rst:716
+msgid "Syntax"
+msgstr ""
+
+#: ../../tutorial.rst:719
+msgid ""
+"The template syntax is a very thin layer around the Python language. Its "
+"main purpose is to ensure correct indentation of blocks, so you can format "
+"your template without worrying about indentation. Follow the link for a full"
+" syntax description: :doc:`stpl`"
+msgstr ""
+
+#: ../../tutorial.rst:721
+msgid "Here is an example template::"
+msgstr ""
+
+#: ../../tutorial.rst:732
+msgid "Caching"
+msgstr ""
+
+#: ../../tutorial.rst:733
+msgid ""
+"Templates are cached in memory after compilation. Modifications made to the "
+"template files will have no affect until you clear the template cache. Call "
+"``bottle.TEMPLATES.clear()`` to do so. Caching is disabled in debug mode."
+msgstr ""
+
+#: ../../tutorial.rst:743
+msgid "Plugins"
+msgstr ""
+
+#: ../../tutorial.rst:747
+msgid ""
+"Bottle's core features cover most common use-cases, but as a micro-framework"
+" it has its limits. This is where \"Plugins\" come into play. Plugins add "
+"missing functionality to the framework, integrate third party libraries, or "
+"just automate some repetitive work."
+msgstr ""
+
+#: ../../tutorial.rst:749
+msgid ""
+"We have a growing :doc:`/plugins/index` and most plugins are designed to be "
+"portable and re-usable across applications. The chances are high that your "
+"problem has already been solved and a ready-to-use plugin exists. If not, "
+"the :doc:`/plugindev` may help you."
+msgstr ""
+
+#: ../../tutorial.rst:751
+msgid ""
+"The effects and APIs of plugins are manifold and depend on the specific "
+"plugin. The ``SQLitePlugin`` plugin for example detects callbacks that "
+"require a ``db`` keyword argument and creates a fresh database connection "
+"object every time the callback is called. This makes it very convenient to "
+"use a database::"
+msgstr ""
+
+#: ../../tutorial.rst:771
+msgid ""
+"Other plugin may populate the thread-safe :data:`local` object, change "
+"details of the :data:`request` object, filter the data returned by the "
+"callback or bypass the callback completely. An \"auth\" plugin for example "
+"could check for a valid session and return a login page instead of calling "
+"the original callback. What happens exactly depends on the plugin."
+msgstr ""
+
+#: ../../tutorial.rst:775
+msgid "Application-wide Installation"
+msgstr ""
+
+#: ../../tutorial.rst:777
+msgid ""
+"Plugins can be installed application-wide or just to some specific routes "
+"that need additional functionality. Most plugins can safely be installed to "
+"all routes and are smart enough to not add overhead to callbacks that do not"
+" need their functionality."
+msgstr ""
+
+#: ../../tutorial.rst:779
+msgid ""
+"Let us take the ``SQLitePlugin`` plugin for example. It only affects route "
+"callbacks that need a database connection. Other routes are left alone. "
+"Because of this, we can install the plugin application-wide with no "
+"additional overhead."
+msgstr ""
+
+#: ../../tutorial.rst:781
+msgid ""
+"To install a plugin, just call :func:`install` with the plugin as first "
+"argument::"
+msgstr ""
+
+#: ../../tutorial.rst:786
+msgid ""
+"The plugin is not applied to the route callbacks yet. This is delayed to "
+"make sure no routes are missed. You can install plugins first and add routes"
+" later, if you want to. The order of installed plugins is significant, "
+"though. If a plugin requires a database connection, you need to install the "
+"database plugin first."
+msgstr ""
+
+#: ../../tutorial.rst:790
+msgid "Uninstall Plugins"
+msgstr ""
+
+#: ../../tutorial.rst:791
+msgid ""
+"You can use a name, class or instance to :func:`uninstall` a previously "
+"installed plugin::"
+msgstr ""
+
+#: ../../tutorial.rst:801
+msgid ""
+"Plugins can be installed and removed at any time, even at runtime while "
+"serving requests. This enables some neat tricks (installing slow debugging "
+"or profiling plugins only when needed) but should not be overused. Each time"
+" the list of plugins changes, the route cache is flushed and all plugins are"
+" re-applied."
+msgstr ""
+
+#: ../../tutorial.rst:804
+msgid ""
+"The module-level :func:`install` and :func:`uninstall` functions affect the "
+":ref:`default-app`. To manage plugins for a specific application, use the "
+"corresponding methods on the :class:`Bottle` application object."
+msgstr ""
+
+#: ../../tutorial.rst:808
+msgid "Route-specific Installation"
+msgstr ""
+
+#: ../../tutorial.rst:810
+msgid ""
+"The ``apply`` parameter of the :func:`route` decorator comes in handy if you"
+" want to install plugins to only a small number of routes::"
+msgstr ""
+
+#: ../../tutorial.rst:820
+msgid "Blacklisting Plugins"
+msgstr ""
+
+#: ../../tutorial.rst:822
+msgid ""
+"You may want to explicitly disable a plugin for a number of routes. The "
+":func:`route` decorator has a ``skip`` parameter for this purpose::"
+msgstr ""
+
+#: ../../tutorial.rst:844
+msgid ""
+"The ``skip`` parameter accepts a single value or a list of values. You can "
+"use a name, class or instance to identify the plugin that is to be skipped. "
+"Set ``skip=True`` to skip all plugins at once."
+msgstr ""
+
+#: ../../tutorial.rst:847
+msgid "Plugins and Sub-Applications"
+msgstr ""
+
+#: ../../tutorial.rst:849
+msgid ""
+"Most plugins are specific to the application they were installed to. "
+"Consequently, they should not affect sub-applications mounted with "
+":meth:`Bottle.mount`. Here is an example::"
+msgstr ""
+
+#: ../../tutorial.rst:860
+msgid ""
+"Whenever you mount an application, Bottle creates a proxy-route on the main-"
+"application that forwards all requests to the sub-application. Plugins are "
+"disabled for this kind of proxy-route by default. As a result, our "
+"(fictional) `WTForms` plugin affects the ``/contact`` route, but does not "
+"affect the routes of the ``/blog`` sub-application."
+msgstr ""
+
+#: ../../tutorial.rst:862
+msgid ""
+"This behavior is intended as a sane default, but can be overridden. The "
+"following example re-activates all plugins for a specific proxy-route::"
+msgstr ""
+
+#: ../../tutorial.rst:866
+msgid ""
+"But there is a snag: The plugin sees the whole sub-application as a single "
+"route, namely the proxy-route mentioned above. In order to affect each "
+"individual route of the sub-application, you have to install the plugin to "
+"the mounted application explicitly."
+msgstr ""
+
+#: ../../tutorial.rst:871
+msgid "Development"
+msgstr ""
+
+#: ../../tutorial.rst:873
+msgid ""
+"So you have learned the basics and want to write your own application? Here "
+"are some tips that might help you being more productive."
+msgstr ""
+
+#: ../../tutorial.rst:879
+msgid "Default Application"
+msgstr ""
+
+#: ../../tutorial.rst:881
+msgid ""
+"Bottle maintains a global stack of :class:`Bottle` instances and uses the "
+"top of the stack as a default for some of the module-level functions and "
+"decorators. The :func:`route` decorator, for example, is a shortcut for "
+"calling :meth:`Bottle.route` on the default application::"
+msgstr ""
+
+#: ../../tutorial.rst:889
+msgid ""
+"This is very convenient for small applications and saves you some typing, "
+"but also means that, as soon as your module is imported, routes are "
+"installed to the global default application. To avoid this kind of import "
+"side-effects, Bottle offers a second, more explicit way to build "
+"applications::"
+msgstr ""
+
+#: ../../tutorial.rst:899
+msgid ""
+"Separating the application object improves re-usability a lot, too. Other "
+"developers can safely import the ``app`` object from your module and use "
+":meth:`Bottle.mount` to merge applications together."
+msgstr ""
+
+#: ../../tutorial.rst:904
+msgid ""
+"Starting with bottle-0.13 you can use :class:`Bottle` instances as context "
+"managers::"
+msgstr ""
+
+#: ../../tutorial.rst:929
+msgid "Debug Mode"
+msgstr ""
+
+#: ../../tutorial.rst:931
+msgid "During early development, the debug mode can be very helpful."
+msgstr ""
+
+#: ../../tutorial.rst:939
+msgid ""
+"In this mode, Bottle is much more verbose and provides helpful debugging "
+"information whenever an error occurs. It also disables some optimisations "
+"that might get in your way and adds some checks that warn you about possible"
+" misconfiguration."
+msgstr ""
+
+#: ../../tutorial.rst:941
+msgid "Here is an incomplete list of things that change in debug mode:"
+msgstr ""
+
+#: ../../tutorial.rst:943
+msgid "The default error page shows a traceback."
+msgstr ""
+
+#: ../../tutorial.rst:944
+msgid "Templates are not cached."
+msgstr ""
+
+#: ../../tutorial.rst:945
+msgid "Plugins are applied immediately."
+msgstr ""
+
+#: ../../tutorial.rst:947
+msgid "Just make sure not to use the debug mode on a production server."
+msgstr ""
+
+#: ../../tutorial.rst:950
+msgid "Auto Reloading"
+msgstr ""
+
+#: ../../tutorial.rst:952
+msgid ""
+"During development, you have to restart the server a lot to test your recent"
+" changes. The auto reloader can do this for you. Every time you edit a "
+"module file, the reloader restarts the server process and loads the newest "
+"version of your code."
+msgstr ""
+
+#: ../../tutorial.rst:962
+msgid ""
+"How it works: the main process will not start a server, but spawn a new "
+"child process using the same command line arguments used to start the main "
+"process. All module-level code is executed at least twice! Be careful."
+msgstr ""
+
+#: ../../tutorial.rst:967
+msgid ""
+"The child process will have ``os.environ['BOTTLE_CHILD']`` set to ``True`` "
+"and start as a normal non-reloading app server. As soon as any of the loaded"
+" modules changes, the child process is terminated and re-spawned by the main"
+" process. Changes in template files will not trigger a reload. Please use "
+"debug mode to deactivate template caching."
+msgstr ""
+
+#: ../../tutorial.rst:973
+msgid ""
+"The reloading depends on the ability to stop the child process. If you are "
+"running on Windows or any other operating system not supporting "
+"``signal.SIGINT`` (which raises ``KeyboardInterrupt`` in Python), "
+"``signal.SIGTERM`` is used to kill the child. Note that exit handlers and "
+"finally clauses, etc., are not executed after a ``SIGTERM``."
+msgstr ""
+
+#: ../../tutorial.rst:981
+msgid "Command Line Interface"
+msgstr ""
+
+#: ../../tutorial.rst:985
+msgid "Starting with version 0.10 you can use bottle as a command-line tool:"
+msgstr ""
+
+#: ../../tutorial.rst:1009
+msgid ""
+"The `ADDRESS` field takes an IP address or an IP:PORT pair and defaults to "
+"``localhost:8080``. The other parameters should be self-explanatory."
+msgstr ""
+
+#: ../../tutorial.rst:1011
+msgid ""
+"Both plugins and applications are specified via import expressions. These "
+"consist of an import path (e.g. ``package.module``) and an expression to be "
+"evaluated in the namespace of that module, separated by a colon. See "
+":func:`load` for details. Here are some examples:"
+msgstr ""
+
+#: ../../tutorial.rst:1032
+msgid "Deployment"
+msgstr "Déploiement "
+
+#: ../../tutorial.rst:1034
+msgid ""
+"Bottle runs on the built-in `wsgiref WSGIServer "
+"<http://docs.python.org/library/wsgiref.html#module-wsgiref.simple_server>`_"
+" by default. This non-threading HTTP server is perfectly fine for "
+"development, but may become a performance bottleneck when server load "
+"increases."
+msgstr ""
+
+#: ../../tutorial.rst:1036
+msgid ""
+"The easiest way to increase performance is to install a multi-threaded "
+"server library like paste_ or cherrypy_ and tell Bottle to use that instead "
+"of the single-threaded server::"
+msgstr ""
+
+#: ../../tutorial.rst:1040
+msgid ""
+"This, and many other deployment options are described in a separate article:"
+" :doc:`deployment`"
+msgstr ""
+
+#: ../../tutorial.rst:1048
+msgid "Glossary"
+msgstr ""
+
+#: ../../tutorial.rst:1051
+msgid "callback"
+msgstr ""
+
+#: ../../tutorial.rst:1053
+msgid ""
+"Programmer code that is to be called when some external action happens. In "
+"the context of web frameworks, the mapping between URL paths and application"
+" code is often achieved by specifying a callback function for each URL."
+msgstr ""
+
+#: ../../tutorial.rst:1057
+msgid "decorator"
+msgstr ""
+
+#: ../../tutorial.rst:1059
+msgid ""
+"A function returning another function, usually applied as a function "
+"transformation using the ``@decorator`` syntax. See `python documentation "
+"for function definition "
+"<http://docs.python.org/reference/compound_stmts.html#function>`_ for more "
+"about decorators."
+msgstr ""
+
+#: ../../tutorial.rst:1060
+msgid "environ"
+msgstr ""
+
+#: ../../tutorial.rst:1062
+msgid ""
+"A structure where information about all documents under the root is saved, "
+"and used for cross-referencing. The environment is pickled after the "
+"parsing stage, so that successive runs only need to read and parse new and "
+"changed documents."
+msgstr ""
+
+#: ../../tutorial.rst:1066
+msgid "handler function"
+msgstr ""
+
+#: ../../tutorial.rst:1068
+msgid ""
+"A function to handle some specific event or situation. In a web framework, "
+"the application is developed by attaching a handler function as callback for"
+" each specific URL comprising the application."
+msgstr ""
+
+#: ../../tutorial.rst:1071
+msgid "source directory"
+msgstr ""
+
+#: ../../tutorial.rst:1073
+msgid ""
+"The directory which, including its subdirectories, contains all source files"
+" for one Sphinx project."
+msgstr ""
diff --git a/docs/_locale/fr/LC_MESSAGES/tutorial_app.po b/docs/_locale/fr/LC_MESSAGES/tutorial_app.po
new file mode 100644
index 0000000..ac418c1
--- /dev/null
+++ b/docs/_locale/fr/LC_MESSAGES/tutorial_app.po
@@ -0,0 +1,901 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2009-2020, Marcel Hellkamp
+# This file is distributed under the same license as the Bottle package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: bottle\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-31 18:35+0100\n"
+"PO-Revision-Date: 2020-12-31 17:35+0000\n"
+"Last-Translator: defnull <marc@gsites.de>\n"
+"Language-Team: French (http://www.transifex.com/bottle/bottle/language/fr/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: fr\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: ../../tutorial_app.rst:19
+msgid "Tutorial: Todo-List Application"
+msgstr ""
+
+#: ../../tutorial_app.rst:23
+msgid ""
+"This tutorial is a work in progress and written by `noisefloor "
+"<http://github.com/noisefloor>`_."
+msgstr ""
+
+#: ../../tutorial_app.rst:26
+msgid ""
+"This tutorial should give a brief introduction to the Bottle_ WSGI "
+"Framework. The main goal is to be able, after reading through this tutorial,"
+" to create a project using Bottle. Within this document, not all abilities "
+"will be shown, but at least the main and important ones like routing, "
+"utilizing the Bottle template abilities to format output and handling GET / "
+"POST parameters."
+msgstr ""
+
+#: ../../tutorial_app.rst:28
+msgid ""
+"To understand the content here, it is not necessary to have a basic "
+"knowledge of WSGI, as Bottle tries to keep WSGI away from the user anyway. "
+"You should have a fair understanding of the Python_ programming language. "
+"Furthermore, the example used in the tutorial retrieves and stores data in a"
+" SQL database, so a basic idea about SQL helps, but is not a must to "
+"understand the concepts of Bottle. Right here, SQLite_ is used. The output "
+"of Bottle sent to the browser is formatted in some examples by the help of "
+"HTML. Thus, a basic idea about the common HTML tags does help as well."
+msgstr ""
+
+#: ../../tutorial_app.rst:30
+msgid ""
+"For the sake of introducing Bottle, the Python code \"in between\" is kept "
+"short, in order to keep the focus. Also all code within the tutorial is "
+"working fine, but you may not necessarily use it \"in the wild\", e.g. on a "
+"public web server. In order to do so, you may add e.g. more error handling, "
+"protect the database with a password, test and escape the input etc."
+msgstr ""
+
+#: ../../tutorial_app.rst:32
+msgid "Table of Contents"
+msgstr ""
+
+#: ../../tutorial_app.rst:35
+msgid "Goals"
+msgstr ""
+
+#: ../../tutorial_app.rst:37
+msgid ""
+"At the end of this tutorial, we will have a simple, web-based ToDo list. The"
+" list contains a text (with max 100 characters) and a status (0 for closed, "
+"1 for open) for each item. Through the web-based user interface, open items "
+"can be view and edited and new items can be added."
+msgstr ""
+
+#: ../../tutorial_app.rst:39
+msgid ""
+"During development, all pages will be available on ``localhost`` only, but "
+"later on it will be shown how to adapt the application for a \"real\" "
+"server, including how to use with Apache's mod_wsgi."
+msgstr ""
+
+#: ../../tutorial_app.rst:41
+msgid ""
+"Bottle will do the routing and format the output, with the help of "
+"templates. The items of the list will be stored inside a SQLite database. "
+"Reading and writing the database will be done by Python code."
+msgstr ""
+
+#: ../../tutorial_app.rst:43
+msgid ""
+"We will end up with an application with the following pages and "
+"functionality:"
+msgstr ""
+
+#: ../../tutorial_app.rst:45
+msgid "start page ``http://localhost:8080/todo``"
+msgstr ""
+
+#: ../../tutorial_app.rst:46
+msgid "adding new items to the list: ``http://localhost:8080/new``"
+msgstr ""
+
+#: ../../tutorial_app.rst:47
+msgid "page for editing items: ``http://localhost:8080/edit/<no:int>``"
+msgstr ""
+
+#: ../../tutorial_app.rst:48
+msgid "catching errors"
+msgstr ""
+
+#: ../../tutorial_app.rst:51
+msgid "Before We Start..."
+msgstr ""
+
+#: ../../tutorial_app.rst:55
+msgid "Install Bottle"
+msgstr ""
+
+#: ../../tutorial_app.rst:56
+msgid ""
+"Assuming that you have a fairly new installation of Python (version 2.5 or "
+"higher), you only need to install Bottle in addition to that. Bottle has no "
+"other dependencies than Python itself."
+msgstr ""
+
+#: ../../tutorial_app.rst:58
+msgid ""
+"You can either manually install Bottle or use Python's easy_install: "
+"``easy_install bottle``"
+msgstr ""
+
+#: ../../tutorial_app.rst:62
+msgid "Further Software Necessities"
+msgstr ""
+
+#: ../../tutorial_app.rst:63
+msgid ""
+"As we use SQLite3 as a database, make sure it is installed. On Linux "
+"systems, most distributions have SQLite3 installed by default. SQLite is "
+"available for Windows and MacOS X as well and the `sqlite3` module is part "
+"of the python standard library."
+msgstr ""
+
+#: ../../tutorial_app.rst:66
+msgid "Create An SQL Database"
+msgstr ""
+
+#: ../../tutorial_app.rst:67
+msgid ""
+"First, we need to create the database we use later on. To do so, save the "
+"following script in your project directory and run it with python. You can "
+"use the interactive interpreter too::"
+msgstr ""
+
+#: ../../tutorial_app.rst:78
+msgid ""
+"This generates a database-file `todo.db` with tables called ``todo`` and "
+"three columns ``id``, ``task``, and ``status``. ``id`` is a unique id for "
+"each row, which is used later on to reference the rows. The column ``task`` "
+"holds the text which describes the task, it can be max 100 characters long. "
+"Finally, the column ``status`` is used to mark a task as open (value 1) or "
+"closed (value 0)."
+msgstr ""
+
+#: ../../tutorial_app.rst:81
+msgid "Using Bottle for a Web-Based ToDo List"
+msgstr ""
+
+#: ../../tutorial_app.rst:83
+msgid ""
+"Now it is time to introduce Bottle in order to create a web-based "
+"application. But first, we need to look into a basic concept of Bottle: "
+"routes."
+msgstr ""
+
+#: ../../tutorial_app.rst:87
+msgid "Understanding routes"
+msgstr ""
+
+#: ../../tutorial_app.rst:88
+msgid ""
+"Basically, each page visible in the browser is dynamically generated when "
+"the page address is called. Thus, there is no static content. That is "
+"exactly what is called a \"route\" within Bottle: a certain address on the "
+"server. So, for example, when the page ``http://localhost:8080/todo`` is "
+"called from the browser, Bottle \"grabs\" the call and checks if there is "
+"any (Python) function defined for the route \"todo\". If so, Bottle will "
+"execute the corresponding Python code and return its result."
+msgstr ""
+
+#: ../../tutorial_app.rst:92
+msgid "First Step - Showing All Open Items"
+msgstr ""
+
+#: ../../tutorial_app.rst:93
+msgid ""
+"So, after understanding the concept of routes, let's create the first one. "
+"The goal is to see all open items from the ToDo list::"
+msgstr ""
+
+#: ../../tutorial_app.rst:108
+msgid ""
+"Save the code a ``todo.py``, preferably in the same directory as the file "
+"``todo.db``. Otherwise, you need to add the path to ``todo.db`` in the "
+"``sqlite3.connect()`` statement."
+msgstr ""
+
+#: ../../tutorial_app.rst:110
+msgid ""
+"Let's have a look what we just did: We imported the necessary module "
+"``sqlite3`` to access to SQLite database and from Bottle we imported "
+"``route`` and ``run``. The ``run()`` statement simply starts the web server "
+"included in Bottle. By default, the web server serves the pages on localhost"
+" and port 8080. Furthermore, we imported ``route``, which is the function "
+"responsible for Bottle's routing. As you can see, we defined one function, "
+"``todo_list()``, with a few lines of code reading from the database. The "
+"important point is the `decorator statement`_ ``@route('/todo')`` right "
+"before the ``def todo_list()`` statement. By doing this, we bind this "
+"function to the route ``/todo``, so every time the browsers calls "
+"``http://localhost:8080/todo``, Bottle returns the result of the function "
+"``todo_list()``. That is how routing within bottle works."
+msgstr ""
+
+#: ../../tutorial_app.rst:112
+msgid ""
+"Actually you can bind more than one route to a function. So the following "
+"code::"
+msgstr ""
+
+#: ../../tutorial_app.rst:119
+msgid ""
+"will work fine, too. What will not work is to bind one route to more than "
+"one function."
+msgstr ""
+
+#: ../../tutorial_app.rst:121
+msgid ""
+"What you will see in the browser is what is returned, thus the value given "
+"by the ``return`` statement. In this example, we need to convert ``result`` "
+"in to a string by ``str()``, as Bottle expects a string or a list of strings"
+" from the return statement. But here, the result of the database query is a "
+"list of tuples, which is the standard defined by the `Python DB API`_."
+msgstr ""
+
+#: ../../tutorial_app.rst:123
+msgid ""
+"Now, after understanding the little script above, it is time to execute it "
+"and watch the result yourself. Remember that on Linux- / Unix-based systems "
+"the file ``todo.py`` needs to be executable first. Then, just run ``python "
+"todo.py`` and call the page ``http://localhost:8080/todo`` in your browser. "
+"In case you made no mistake writing the script, the output should look like "
+"this::"
+msgstr ""
+
+#: ../../tutorial_app.rst:127
+msgid ""
+"If so - congratulations! You are now a successful user of Bottle. In case it"
+" did not work and you need to make some changes to the script, remember to "
+"stop Bottle serving the page, otherwise the revised version will not be "
+"loaded."
+msgstr ""
+
+#: ../../tutorial_app.rst:129
+msgid ""
+"Actually, the output is not really exciting nor nice to read. It is the raw "
+"result returned from the SQL query."
+msgstr ""
+
+#: ../../tutorial_app.rst:131
+msgid ""
+"So, in the next step we format the output in a nicer way. But before we do "
+"that, we make our life easier."
+msgstr ""
+
+#: ../../tutorial_app.rst:135
+msgid "Debugging and Auto-Reload"
+msgstr ""
+
+#: ../../tutorial_app.rst:136
+msgid ""
+"Maybe you already noticed that Bottle sends a short error message to the "
+"browser in case something within the script is wrong, e.g. the connection to"
+" the database is not working. For debugging purposes it is quite helpful to "
+"get more details. This can be easily achieved by adding the following "
+"statement to the script::"
+msgstr ""
+
+#: ../../tutorial_app.rst:144
+msgid ""
+"By enabling \"debug\", you will get a full stacktrace of the Python "
+"interpreter, which usually contains useful information for finding bugs. "
+"Furthermore, templates (see below) are not cached, thus changes to templates"
+" will take effect without stopping the server."
+msgstr ""
+
+#: ../../tutorial_app.rst:148
+msgid ""
+"That ``debug(True)`` is supposed to be used for development only, it should "
+"*not* be used in production environments."
+msgstr ""
+
+#: ../../tutorial_app.rst:152
+msgid ""
+"Another quite nice feature is auto-reloading, which is enabled by modifying "
+"the ``run()`` statement to"
+msgstr ""
+
+#: ../../tutorial_app.rst:158
+msgid ""
+"This will automatically detect changes to the script and reload the new "
+"version once it is called again, without the need to stop and start the "
+"server."
+msgstr ""
+
+#: ../../tutorial_app.rst:160
+msgid ""
+"Again, the feature is mainly supposed to be used while developing, not on "
+"production systems."
+msgstr ""
+
+#: ../../tutorial_app.rst:164
+msgid "Bottle Template To Format The Output"
+msgstr ""
+
+#: ../../tutorial_app.rst:165
+msgid ""
+"Now let's have a look at casting the output of the script into a proper "
+"format."
+msgstr ""
+
+#: ../../tutorial_app.rst:167
+msgid ""
+"Actually Bottle expects to receive a string or a list of strings from a "
+"function and returns them by the help of the built-in server to the browser."
+" Bottle does not bother about the content of the string itself, so it can be"
+" text formatted with HTML markup, too."
+msgstr ""
+
+#: ../../tutorial_app.rst:169
+msgid ""
+"Bottle brings its own easy-to-use template engine with it. Templates are "
+"stored as separate files having a ``.tpl`` extension. The template can be "
+"called then from within a function. Templates can contain any type of text "
+"(which will be most likely HTML-markup mixed with Python statements). "
+"Furthermore, templates can take arguments, e.g. the result set of a database"
+" query, which will be then formatted nicely within the template."
+msgstr ""
+
+#: ../../tutorial_app.rst:171
+msgid ""
+"Right here, we are going to cast the result of our query showing the open "
+"ToDo items into a simple table with two columns: the first column will "
+"contain the ID of the item, the second column the text. The result set is, "
+"as seen above, a list of tuples, each tuple contains one set of results."
+msgstr ""
+
+#: ../../tutorial_app.rst:173
+msgid "To include the template in our example, just add the following lines::"
+msgstr ""
+
+#: ../../tutorial_app.rst:183
+msgid ""
+"So we do here two things: first, we import ``template`` from Bottle in order"
+" to be able to use templates. Second, we assign the output of the template "
+"``make_table`` to the variable ``output``, which is then returned. In "
+"addition to calling the template, we assign ``result``, which we received "
+"from the database query, to the variable ``rows``, which is later on used "
+"within the template. If necessary, you can assign more than one variable / "
+"value to a template."
+msgstr ""
+
+#: ../../tutorial_app.rst:185
+msgid ""
+"Templates always return a list of strings, thus there is no need to convert "
+"anything. We can save one line of code by writing ``return "
+"template('make_table', rows=result)``, which gives exactly the same result "
+"as above."
+msgstr ""
+
+#: ../../tutorial_app.rst:187
+msgid ""
+"Now it is time to write the corresponding template, which looks like this::"
+msgstr ""
+
+#: ../../tutorial_app.rst:201
+msgid ""
+"Save the code as ``make_table.tpl`` in the same directory where ``todo.py`` "
+"is stored."
+msgstr ""
+
+#: ../../tutorial_app.rst:203
+msgid ""
+"Let's have a look at the code: every line starting with % is interpreted as "
+"Python code. Because it is effectively Python, only valid Python statements "
+"are allowed. The template will raise exceptions, just as any other Python "
+"code would. The other lines are plain HTML markup."
+msgstr ""
+
+#: ../../tutorial_app.rst:205
+msgid ""
+"As you can see, we use Python's ``for`` statement two times, in order to go "
+"through ``rows``. As seen above, ``rows`` is a variable which holds the "
+"result of the database query, so it is a list of tuples. The first ``for`` "
+"statement accesses the tuples within the list, the second one the items "
+"within the tuple, which are put each into a cell of the table. It is "
+"important that you close all ``for``, ``if``, ``while`` etc. statements with"
+" ``%end``, otherwise the output may not be what you expect."
+msgstr ""
+
+#: ../../tutorial_app.rst:207
+msgid ""
+"If you need to access a variable within a non-Python code line inside the "
+"template, you need to put it into double curly braces. This tells the "
+"template to insert the actual value of the variable right in place."
+msgstr ""
+
+#: ../../tutorial_app.rst:209
+msgid ""
+"Run the script again and look at the output. Still not really nice, but at "
+"least more readable than the list of tuples. You can spice-up the very "
+"simple HTML markup above, e.g. by using in-line styles to get a better "
+"looking output."
+msgstr ""
+
+#: ../../tutorial_app.rst:213
+msgid "Using GET and POST Values"
+msgstr ""
+
+#: ../../tutorial_app.rst:214
+msgid ""
+"As we can review all open items properly, we move to the next step, which is"
+" adding new items to the ToDo list. The new item should be received from a "
+"regular HTML-based form, which sends its data by the GET method."
+msgstr ""
+
+#: ../../tutorial_app.rst:216
+msgid ""
+"To do so, we first add a new route to our script and tell the route that it "
+"should get GET data::"
+msgstr ""
+
+#: ../../tutorial_app.rst:239
+msgid ""
+"To access GET (or POST) data, we need to import ``request`` from Bottle. To "
+"assign the actual data to a variable, we use the statement "
+"``request.GET.task.strip()`` statement, where ``task`` is the name of the "
+"GET data we want to access. That's all. If your GET data has more than one "
+"variable, multiple ``request.GET.get()`` statements can be used and assigned"
+" to other variables."
+msgstr ""
+
+#: ../../tutorial_app.rst:241
+msgid ""
+"The rest of this piece of code is just processing of the gained data: "
+"writing to the database, retrieve the corresponding id from the database and"
+" generate the output."
+msgstr ""
+
+#: ../../tutorial_app.rst:243
+msgid ""
+"But where do we get the GET data from? Well, we can use a static HTML page "
+"holding the form. Or, what we do right now, is to use a template which is "
+"output when the route ``/new`` is called without GET data."
+msgstr ""
+
+#: ../../tutorial_app.rst:245
+msgid "The code needs to be extended to::"
+msgstr ""
+
+#: ../../tutorial_app.rst:268
+msgid "``new_task.tpl`` looks like this::"
+msgstr ""
+
+#: ../../tutorial_app.rst:276
+msgid "That's all. As you can see, the template is plain HTML this time."
+msgstr ""
+
+#: ../../tutorial_app.rst:278
+msgid "Now we are able to extend our to do list."
+msgstr ""
+
+#: ../../tutorial_app.rst:280
+msgid ""
+"By the way, if you prefer to use POST data: this works exactly the same way,"
+" just use ``request.POST.get()`` instead."
+msgstr ""
+
+#: ../../tutorial_app.rst:284
+msgid "Editing Existing Items"
+msgstr ""
+
+#: ../../tutorial_app.rst:285
+msgid "The last point to do is to enable editing of existing items."
+msgstr ""
+
+#: ../../tutorial_app.rst:287
+msgid ""
+"By using only the routes we know so far it is possible, but may be quite "
+"tricky. But Bottle knows something called \"dynamic routes\", which makes "
+"this task quite easy."
+msgstr ""
+
+#: ../../tutorial_app.rst:289
+msgid "The basic statement for a dynamic route looks like this::"
+msgstr ""
+
+#: ../../tutorial_app.rst:293
+msgid ""
+"This tells Bottle to accept for ``<something>`` any string up to the next "
+"slash. Furthermore, the value of ``something`` will be passed to the "
+"function assigned to that route, so the data can be processed within the "
+"function, like this::"
+msgstr ""
+
+#: ../../tutorial_app.rst:321
+msgid ""
+"It is basically pretty much the same what we already did above when adding "
+"new items, like using ``GET`` data etc. The main addition here is using the "
+"dynamic route ``<no:int>``, which here passes the number to the "
+"corresponding function. As you can see, ``no`` is integer ID and used within"
+" the function to access the right row of data within the database."
+msgstr ""
+
+#: ../../tutorial_app.rst:324
+msgid ""
+"The template ``edit_task.tpl`` called within the function looks like this::"
+msgstr ""
+
+#: ../../tutorial_app.rst:339
+msgid ""
+"Again, this template is a mix of Python statements and HTML, as already "
+"explained above."
+msgstr ""
+
+#: ../../tutorial_app.rst:341
+msgid ""
+"A last word on dynamic routes: you can even use a regular expression for a "
+"dynamic route, as demonstrated later."
+msgstr ""
+
+#: ../../tutorial_app.rst:345
+msgid "Validating Dynamic Routes"
+msgstr ""
+
+#: ../../tutorial_app.rst:346
+msgid ""
+"Using dynamic routes is fine, but for many cases it makes sense to validate "
+"the dynamic part of the route. For example, we expect an integer number in "
+"our route for editing above. But if a float, characters or so are received, "
+"the Python interpreter throws an exception, which is not what we want."
+msgstr ""
+
+#: ../../tutorial_app.rst:348
+msgid ""
+"For those cases, Bottle offers the ``<name:int>`` wildcard filter, which "
+"matches (signed) digits and converts the value to integer. In order to apply"
+" the wildcard filter, extend the code as follows::"
+msgstr ""
+
+#: ../../tutorial_app.rst:356
+msgid ""
+"Save the code and call the page again using incorrect value for "
+"``<no:int>``, e.g. a float. You will receive not an exception, but a \"404 "
+"Not Found\" error."
+msgstr ""
+
+#: ../../tutorial_app.rst:360
+msgid "Dynamic Routes Using Regular Expressions"
+msgstr ""
+
+#: ../../tutorial_app.rst:361
+msgid ""
+"Bottle can also handle dynamic routes, where the \"dynamic part\" of the "
+"route can be a regular expression."
+msgstr ""
+
+#: ../../tutorial_app.rst:363
+msgid ""
+"So, just to demonstrate that, let's assume that all single items in our ToDo"
+" list should be accessible by their plain number, by a term like e.g. "
+"\"item1\". For obvious reasons, you do not want to create a route for every "
+"item. Furthermore, the simple dynamic routes do not work either, as part of "
+"the route, the term \"item\" is static."
+msgstr ""
+
+#: ../../tutorial_app.rst:365
+msgid "As said above, the solution is a regular expression::"
+msgstr ""
+
+#: ../../tutorial_app.rst:380
+msgid ""
+"The line ``@route(/item<item:re:[0-9]+>)`` starts like a normal route, but "
+"the third part of the wildcard is interpreted as a regular expression, which"
+" is the dynamic part of the route. So in this case, we want to match any "
+"digit between 0 and 9. The following function \"show_item\" just checks "
+"whether the given item is present in the database or not. In case it is "
+"present, the corresponding text of the task is returned. As you can see, "
+"only the regular expression part of the route is passed forward. "
+"Furthermore, it is always forwarded as a string, even if it is a plain "
+"integer number, like in this case."
+msgstr ""
+
+#: ../../tutorial_app.rst:384
+msgid "Returning Static Files"
+msgstr ""
+
+#: ../../tutorial_app.rst:385
+msgid ""
+"Sometimes it may become necessary to associate a route not to a Python "
+"function, but just return a static file. So if you have for example a help "
+"page for your application, you may want to return this page as plain HTML. "
+"This works as follows::"
+msgstr ""
+
+#: ../../tutorial_app.rst:393
+msgid ""
+"At first, we need to import the ``static_file`` function from Bottle. As you"
+" can see, the ``return static_file`` statement replaces the ``return`` "
+"statement. It takes at least two arguments: the name of the file to be "
+"returned and the path to the file. Even if the file is in the same directory"
+" as your application, the path needs to be stated. But in this case, you can"
+" use ``'.'`` as a path, too. Bottle guesses the MIME-type of the file "
+"automatically, but in case you like to state it explicitly, add a third "
+"argument to ``static_file``, which would be here ``mimetype='text/html'``. "
+"``static_file`` works with any type of route, including the dynamic ones."
+msgstr ""
+
+#: ../../tutorial_app.rst:397
+msgid "Returning JSON Data"
+msgstr ""
+
+#: ../../tutorial_app.rst:398
+msgid ""
+"There may be cases where you do not want your application to generate the "
+"output directly, but return data to be processed further on, e.g. by "
+"JavaScript. For those cases, Bottle offers the possibility to return JSON "
+"objects, which is sort of standard for exchanging data between web "
+"applications. Furthermore, JSON can be processed by many programming "
+"languages, including Python"
+msgstr ""
+
+#: ../../tutorial_app.rst:400
+msgid ""
+"So, let's assume we want to return the data generated in the regular "
+"expression route example as a JSON object. The code looks like this::"
+msgstr ""
+
+#: ../../tutorial_app.rst:415
+msgid ""
+"As you can, that is fairly simple: just return a regular Python dictionary "
+"and Bottle will convert it automatically into a JSON object prior to "
+"sending. So if you e.g. call \"http://localhost/json1\" Bottle should in "
+"this case return the JSON object ``{\"task\": [\"Read A-byte-of-python to "
+"get a good introduction into Python\"]}``."
+msgstr ""
+
+#: ../../tutorial_app.rst:420
+msgid "Catching Errors"
+msgstr ""
+
+#: ../../tutorial_app.rst:421
+msgid ""
+"The next step may is to catch the error with Bottle itself, to keep away any"
+" type of error message from the user of your application. To do that, Bottle"
+" has an \"error-route\", which can be a assigned to a HTML-error."
+msgstr ""
+
+#: ../../tutorial_app.rst:423
+msgid "In our case, we want to catch a 403 error. The code is as follows::"
+msgstr ""
+
+#: ../../tutorial_app.rst:431
+msgid ""
+"So, at first we need to import ``error`` from Bottle and define a route by "
+"``error(403)``, which catches all \"403 forbidden\" errors. The function "
+"\"mistake\" is assigned to that. Please note that ``error()`` always passes "
+"the error-code to the function - even if you do not need it. Thus, the "
+"function always needs to accept one argument, otherwise it will not work."
+msgstr ""
+
+#: ../../tutorial_app.rst:433
+msgid ""
+"Again, you can assign more than one error-route to a function, or catch "
+"various errors with one function each. So this code::"
+msgstr ""
+
+#: ../../tutorial_app.rst:440
+msgid "works fine, the following one as well::"
+msgstr ""
+
+#: ../../tutorial_app.rst:452
+msgid "Summary"
+msgstr ""
+
+#: ../../tutorial_app.rst:453
+msgid ""
+"After going through all the sections above, you should have a brief "
+"understanding how the Bottle WSGI framework works. Furthermore you have all "
+"the knowledge necessary to use Bottle for your applications."
+msgstr ""
+
+#: ../../tutorial_app.rst:455
+msgid ""
+"The following chapter give a short introduction how to adapt Bottle for "
+"larger projects. Furthermore, we will show how to operate Bottle with web "
+"servers which perform better on a higher load / more web traffic than the "
+"one we used so far."
+msgstr ""
+
+#: ../../tutorial_app.rst:458
+msgid "Server Setup"
+msgstr ""
+
+#: ../../tutorial_app.rst:460
+msgid ""
+"So far, we used the standard server used by Bottle, which is the `WSGI "
+"reference Server`_ shipped along with Python. Although this server is "
+"perfectly suitable for development purposes, it is not really suitable for "
+"larger applications. But before we have a look at the alternatives, let's "
+"have a look how to tweak the settings of the standard server first."
+msgstr ""
+
+#: ../../tutorial_app.rst:464
+msgid "Running Bottle on a different port and IP"
+msgstr ""
+
+#: ../../tutorial_app.rst:465
+msgid ""
+"As standard, Bottle serves the pages on the IP address 127.0.0.1, also known"
+" as ``localhost``, and on port ``8080``. To modify the setting is pretty "
+"simple, as additional parameters can be passed to Bottle's ``run()`` "
+"function to change the port and the address."
+msgstr ""
+
+#: ../../tutorial_app.rst:467
+msgid ""
+"To change the port, just add ``port=portnumber`` to the run command. So, for"
+" example::"
+msgstr ""
+
+#: ../../tutorial_app.rst:471
+msgid "would make Bottle listen to port 80."
+msgstr ""
+
+#: ../../tutorial_app.rst:473
+msgid "To change the IP address where Bottle is listening::"
+msgstr ""
+
+#: ../../tutorial_app.rst:477
+msgid "If needed, both parameters can be combined, like::"
+msgstr ""
+
+#: ../../tutorial_app.rst:481
+msgid ""
+"The ``port`` and ``host`` parameter can also be applied when Bottle is "
+"running with a different server, as shown in the following section."
+msgstr ""
+
+#: ../../tutorial_app.rst:485
+msgid "Running Bottle with a different server"
+msgstr ""
+
+#: ../../tutorial_app.rst:486
+msgid ""
+"As said above, the standard server is perfectly suitable for development, "
+"personal use or a small group of people only using your application based on"
+" Bottle. For larger tasks, the standard server may become a bottleneck, as "
+"it is single-threaded, thus it can only serve one request at a time."
+msgstr ""
+
+#: ../../tutorial_app.rst:488
+msgid ""
+"But Bottle has already various adapters to multi-threaded servers on board, "
+"which perform better on higher load. Bottle supports Cherrypy_, Flup_ and "
+"Paste_."
+msgstr ""
+
+#: ../../tutorial_app.rst:490
+msgid ""
+"If you want to run for example Bottle with the Paste server, use the "
+"following code::"
+msgstr ""
+
+#: ../../tutorial_app.rst:496
+msgid ""
+"This works exactly the same way with ``FlupServer``, ``CherryPyServer`` and "
+"``FapwsServer``."
+msgstr ""
+
+#: ../../tutorial_app.rst:500
+msgid "Running Bottle on Apache with mod_wsgi"
+msgstr ""
+
+#: ../../tutorial_app.rst:501
+msgid ""
+"Maybe you already have an Apache_ or you want to run a Bottle-based "
+"application large scale - then it is time to think about Apache with "
+"mod_wsgi_."
+msgstr ""
+
+#: ../../tutorial_app.rst:503
+msgid ""
+"We assume that your Apache server is up and running and mod_wsgi is working "
+"fine as well. On a lot of Linux distributions, mod_wsgi can be easily "
+"installed via whatever package management system is in use."
+msgstr ""
+
+#: ../../tutorial_app.rst:505
+msgid ""
+"Bottle brings an adapter for mod_wsgi with it, so serving your application "
+"is an easy task."
+msgstr ""
+
+#: ../../tutorial_app.rst:507
+msgid ""
+"In the following example, we assume that you want to make your application "
+"\"ToDo list\" accessible through ``http://www.mypage.com/todo`` and your "
+"code, templates and SQLite database are stored in the path "
+"``/var/www/todo``."
+msgstr ""
+
+#: ../../tutorial_app.rst:509
+msgid ""
+"When you run your application via mod_wsgi, it is imperative to remove the "
+"``run()`` statement from your code, otherwise it won't work here."
+msgstr ""
+
+#: ../../tutorial_app.rst:511
+msgid ""
+"After that, create a file called ``adapter.wsgi`` with the following "
+"content::"
+msgstr ""
+
+#: ../../tutorial_app.rst:522
+msgid ""
+"and save it in the same path, ``/var/www/todo``. Actually the name of the "
+"file can be anything, as long as the extension is ``.wsgi``. The name is "
+"only used to reference the file from your virtual host."
+msgstr ""
+
+#: ../../tutorial_app.rst:524
+msgid ""
+"Finally, we need to add a virtual host to the Apache configuration, which "
+"looks like this::"
+msgstr ""
+
+#: ../../tutorial_app.rst:540
+msgid ""
+"After restarting the server, your ToDo list should be accessible at "
+"``http://www.mypage.com/todo``"
+msgstr ""
+
+#: ../../tutorial_app.rst:543
+msgid "Final Words"
+msgstr ""
+
+#: ../../tutorial_app.rst:545
+msgid ""
+"Now we are at the end of this introduction and tutorial to Bottle. We "
+"learned about the basic concepts of Bottle and wrote a first application "
+"using the Bottle framework. In addition to that, we saw how to adapt Bottle "
+"for large tasks and serve Bottle through an Apache web server with mod_wsgi."
+msgstr ""
+
+#: ../../tutorial_app.rst:547
+msgid ""
+"As said in the introduction, this tutorial is not showing all shades and "
+"possibilities of Bottle. What we skipped here is e.g. receiving file objects"
+" and streams and how to handle authentication data. Furthermore, we did not "
+"show how templates can be called from within another template. For an "
+"introduction into those points, please refer to the full `Bottle "
+"documentation`_ ."
+msgstr ""
+
+#: ../../tutorial_app.rst:550
+msgid "Complete Example Listing"
+msgstr ""
+
+#: ../../tutorial_app.rst:552
+msgid ""
+"As the ToDo list example was developed piece by piece, here is the complete "
+"listing:"
+msgstr ""
+
+#: ../../tutorial_app.rst:554
+msgid "Main code for the application ``todo.py``::"
+msgstr ""
+
+#: ../../tutorial_app.rst:675
+msgid "Template ``make_table.tpl``::"
+msgstr ""
+
+#: ../../tutorial_app.rst:689
+msgid "Template ``edit_task.tpl``::"
+msgstr ""
+
+#: ../../tutorial_app.rst:704
+msgid "Template ``new_task.tpl``::"
+msgstr ""