Index: build-tools/po_update.sh
===================================================================
--- build-tools/po_update.sh	(revision 2739)
+++ build-tools/po_update.sh	(revision 3009)
@@ -26,4 +26,5 @@
 blogroll
 blowupConfig
+breadcrumb
 dclegacy
 fairTrackbacks
Index: inc/public/default-templates/currywurst/__layout.html
===================================================================
--- inc/public/default-templates/currywurst/__layout.html	(revision 2936)
+++ inc/public/default-templates/currywurst/__layout.html	(revision 3009)
@@ -79,4 +79,7 @@
 						<div id="main" role="main">
 							<tpl:Block name="wrapper-main">
+								<tpl:Block name="main-breadcrumb">
+									{{tpl:Breadcrumb}}
+								</tpl:Block>
 								<div id="content">
 									<tpl:Block name="main-content">
Index: inc/public/default-templates/mustek/404.html
===================================================================
--- inc/public/default-templates/mustek/404.html	(revision 2603)
+++ inc/public/default-templates/mustek/404.html	(revision 3009)
@@ -31,4 +31,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
Index: inc/public/default-templates/mustek/archive.html
===================================================================
--- inc/public/default-templates/mustek/archive.html	(revision 2603)
+++ inc/public/default-templates/mustek/archive.html	(revision 3009)
@@ -37,4 +37,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
Index: inc/public/default-templates/mustek/archive_month.html
===================================================================
--- inc/public/default-templates/mustek/archive_month.html	(revision 2604)
+++ inc/public/default-templates/mustek/archive_month.html	(revision 3009)
@@ -43,4 +43,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
Index: inc/public/default-templates/mustek/category.html
===================================================================
--- inc/public/default-templates/mustek/category.html	(revision 3004)
+++ inc/public/default-templates/mustek/category.html	(revision 3009)
@@ -52,4 +52,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
Index: inc/public/default-templates/mustek/home.html
===================================================================
--- inc/public/default-templates/mustek/home.html	(revision 3004)
+++ inc/public/default-templates/mustek/home.html	(revision 3009)
@@ -56,4 +56,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
   <tpl:Entries>
Index: inc/public/default-templates/mustek/post.html
===================================================================
--- inc/public/default-templates/mustek/post.html	(revision 2935)
+++ inc/public/default-templates/mustek/post.html	(revision 3009)
@@ -53,4 +53,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
Index: inc/public/default-templates/mustek/search.html
===================================================================
--- inc/public/default-templates/mustek/search.html	(revision 3004)
+++ inc/public/default-templates/mustek/search.html	(revision 3009)
@@ -50,4 +50,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
Index: locales/fr/plugins.po
===================================================================
--- locales/fr/plugins.po	(revision 2930)
+++ locales/fr/plugins.po	(revision 3009)
@@ -2606,2 +2606,24 @@
 #~ msgid "Blog settings"
 #~ msgstr "Paramètres du blog"
+
+msgid "Breadcrumb"
+msgstr "Fil d'Ariane"
+
+msgid "Breadcrumb for Dotclear"
+msgstr "Fil d'Ariane pour Dotclear"
+
+#, php-format
+msgid "page %d"
+msgstr "page %d"
+
+msgid "404"
+msgstr "404"
+
+msgid "Enable breadcrumb for this blog"
+msgstr "Activer l'affichage du fil d'Ariane pour ce blog"
+
+msgid "The {{tpl:Breadcrumb [separator=" &amp;rsaquo; "]}} tag should be present (or inserted if not) in the template."
+msgstr "La balise {{tpl:Breadcrumb [separator=" &amp;rsaquo; "]}} doit être présente (ou insérée dans le cas contraire) dans le ou les fichiers template du thème."
+
+msgid "Do not encapsulate breadcrumb in a &lt;p id="breadcrumb"&gt;...&lt;/p&gt; tag."
+msgstr "Ne pas encadrer le fil d'Ariane avec une balise &lt;p id="breadcrumb"&gt;...&lt;/p&gt;."
Index: plugins/breadcrumb/_admin.php
===================================================================
--- plugins/breadcrumb/_admin.php	(revision 3009)
+++ plugins/breadcrumb/_admin.php	(revision 3009)
@@ -0,0 +1,43 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of breadcrumb, a plugin for Dotclear 2.
+#
+# Copyright (c) Franck Paul and contributors
+# carnet.franck.paul@gmail.com
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+if (!defined('DC_CONTEXT_ADMIN')) { return; }
+
+// dead but useful code, in order to have translations
+__('Breadcrumb').__('Breadcrumb for Dotclear');
+
+$core->addBehavior('adminBlogPreferencesForm',array('breadcrumbBehaviors','adminBlogPreferencesForm'));
+$core->addBehavior('adminBeforeBlogSettingsUpdate',array('breadcrumbBehaviors','adminBeforeBlogSettingsUpdate'));
+
+class breadcrumbBehaviors
+{
+	public static function adminBlogPreferencesForm($core,$settings)
+	{
+		$settings->addNameSpace('breadcrumb');
+		echo
+		'<div class="fieldset"><h4>'.__('Breadcrumb').'</h4>'.
+		'<p><label class="classic">'.
+		form::checkbox('breadcrumb_enabled','1',$settings->breadcrumb->breadcrumb_enabled).
+		__('Enable breadcrumb for this blog').'</label></p>'.
+		'<p class="form-note">'.__('The {{tpl:Breadcrumb [separator=" &amp;rsaquo; "]}} tag should be present (or inserted if not) in the template.').'</p>'.
+		form::checkbox('breadcrumb_alone','1',$settings->breadcrumb->breadcrumb_alone).
+		__('Do not encapsulate breadcrumb in a &lt;p id="breadcrumb"&gt;...&lt;/p&gt; tag.').'</label></p>'.
+		'</div>';
+	}
+
+	public static function adminBeforeBlogSettingsUpdate($settings)
+	{
+		$settings->addNameSpace('breadcrumb');
+		$settings->breadcrumb->put('breadcrumb_enabled',!empty($_POST['breadcrumb_enabled']),'boolean');
+		$settings->breadcrumb->put('breadcrumb_alone',!empty($_POST['breadcrumb_alone']),'boolean');
+	}
+}
Index: plugins/breadcrumb/_define.php
===================================================================
--- plugins/breadcrumb/_define.php	(revision 3009)
+++ plugins/breadcrumb/_define.php	(revision 3009)
@@ -0,0 +1,24 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of breadcrumb, a plugin for Dotclear 2.
+#
+# Copyright (c) Franck Paul and contributors
+# carnet.franck.paul@gmail.com
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+if (!defined('DC_RC_PATH')) { return; }
+
+$this->registerModule(
+	/* Name */			"Breadcrumb",
+	/* Description*/		"Breadcrumb for Dotclear",
+	/* Author */			"Franck Paul",
+	/* Version */			'0.6',
+	array(
+		/* Permissions */	'permissions' =>	'usage,contentadmin',
+		/* Type */			'type' =>			'plugin'
+	)
+);
Index: plugins/breadcrumb/_public.php
===================================================================
--- plugins/breadcrumb/_public.php	(revision 3009)
+++ plugins/breadcrumb/_public.php	(revision 3009)
@@ -0,0 +1,170 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of breadcrumb, a plugin for Dotclear 2.
+#
+# Copyright (c) Franck Paul and contributors
+# carnet.franck.paul@gmail.com
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+if (!defined('DC_RC_PATH')) { return; }
+
+# Breadcrumb template functions
+$core->tpl->addValue('Breadcrumb',array('tplBreadcrumb','breadcrumb'));
+
+class tplBreadcrumb
+{
+	# Template function
+	public static function breadcrumb($attr)
+	{
+		$separator = isset($attr['separator']) ? $attr['separator'] : '';
+
+		return '<?php echo tplBreadcrumb::displayBreadcrumb('.
+				"'".addslashes($separator)."'".
+			'); ?>';
+	}
+
+	public static function displayBreadcrumb($separator)
+	{
+		global $core,$_ctx;
+
+		$ret = '';
+
+		# Check if breadcrumb enabled for the current blog
+		$core->blog->settings->addNameSpace('breadcrumb');
+		if (!$core->blog->settings->breadcrumb->breadcrumb_enabled) {
+			return $ret;
+		}
+
+		if ($separator == '') $separator = ' &rsaquo; ';
+
+		// Get current page if set
+		$page = isset($GLOBALS['_page_number']) ? (integer) $GLOBALS['_page_number'] : 0;
+
+		switch ($core->url->type) {
+
+			case 'default':
+				// Home (first page only)
+				$ret = '<span id="bc-home">'.__('Home').'</span>';
+				break;
+
+			case 'default-page':
+				// Home`(page 2 to n)
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				$ret .= $separator.sprintf(__('page %d'),$page);
+				break;
+
+			case 'category':
+				// Category
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				$categories = $core->blog->getCategoryParents($_ctx->categories->cat_id);
+				while ($categories->fetch()) {
+					$ret .= $separator.'<a href="'.$core->blog->url.$core->url->getBase('category')."/".$categories->cat_url.'">'.$categories->cat_title.'</a>';
+				}
+				if ($page == 0) {
+					$ret .= $separator.$_ctx->categories->cat_title;
+				} else {
+					$ret .= $separator.'<a href="'.$core->blog->url.$core->url->getBase('category')."/".$_ctx->categories->cat_url.'">'.$_ctx->categories->cat_title.'</a>';
+					$ret .= $separator.sprintf(__('page %d'),$page);
+				}
+				break;
+
+			case 'post':
+				// Post
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				if ($_ctx->posts->cat_id) {
+					// Parents cats of post's cat
+					$categories = $core->blog->getCategoryParents($_ctx->posts->cat_id);
+					while ($categories->fetch()) {
+						$ret .= $separator.'<a href="'.$core->blog->url.$core->url->getBase('category')."/".$categories->cat_url.'">'.$categories->cat_title.'</a>';
+					}
+					// Post's cat
+					$categories = $core->blog->getCategory($_ctx->posts->cat_id);
+					$ret .= $separator.'<a href="'.$core->blog->url.$core->url->getBase('category')."/".$categories->cat_url.'">'.$categories->cat_title.'</a>';
+				}
+				$ret .= $separator.$_ctx->posts->post_title;
+				break;
+
+			case 'lang':
+				// Lang
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				$langs = l10n::getISOCodes();
+				$ret .= $separator.(isset($langs[$_ctx->cur_lang]) ? $langs[$_ctx->cur_lang] : $_ctx->cur_lang);
+				break;
+
+			case 'archive':
+				// Archives
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				if (!$_ctx->archives) {
+					// Global archives
+					$ret .= $separator.__('Archives');
+				} else {
+					// Month archive
+					$ret .= $separator.'<a href="'.$core->blog->url.$core->url->getBase("archive").'">'.__('Archives').'</a>';
+					$ret .= $separator.dt::dt2str('%B %Y',$_ctx->archives->dt);
+				}
+				break;
+
+			case 'pages':
+				// Page
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				$ret .= $separator.$_ctx->posts->post_title;
+				break;
+
+			case 'tags':
+				// All tags
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				$ret .= $separator.__('All tags');
+				break;
+
+			case 'tag':
+				// Tag
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				$ret .= $separator.'<a href="'.$core->blog->url.$core->url->getBase("tags").'">'.__('All tags').'</a>';
+				if ($page == 0) {
+					$ret .= $separator.$_ctx->meta->meta_id;
+				} else {
+					$ret .= $separator.'<a href="'.$core->blog->url.$core->url->getBase("tag").'/'.rawurlencode($_ctx->meta->meta_id).'">'.$_ctx->meta->meta_id.'</a>';
+					$ret .= $separator.sprintf(__('page %d'),$page);
+				}
+				break;
+
+			case 'search':
+				// Search
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				if ($page == 0) {
+					$ret .= $separator.__('Search:').' '.$GLOBALS['_search'];
+				} else {
+					$ret .= $separator.'<a href="'.$core->blog->url.'?q='.rawurlencode($GLOBALS['_search']).'">'.__('Search:').' '.$GLOBALS['_search'].'</a>';
+					$ret .= $separator.sprintf(__('page %d'),$page);
+				}
+				break;
+
+			case '404':
+				// 404
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				$ret .= $separator.__('404');
+				break;
+
+			default:
+				$ret = '<a id="bc-home" href="'.$core->blog->url.'">'.__('Home').'</a>';
+				# --BEHAVIOR-- publicBreadcrumb
+				# Should specific breadcrumb if any, will be added after home page url
+				$special = $core->callBehavior('publicBreadcrumb',$core->url->type,$separator);
+				if ($special) {
+					$ret .= $separator.$special;
+				}
+				break;
+		}
+
+		# Encapsulate breadcrumb in <p>…</p>
+		if (!$core->blog->settings->breadcrumb->breadcrumb_alone) {
+			$ret = '<p id="breadcrumb">'.$ret.'</p>';
+		}
+
+		return $ret;
+	}
+}
Index: plugins/pages/default-templates/mustek/page.html
===================================================================
--- plugins/pages/default-templates/mustek/page.html	(revision 2963)
+++ plugins/pages/default-templates/mustek/page.html	(revision 3009)
@@ -47,4 +47,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
Index: plugins/tags/default-templates/mustek/tag.html
===================================================================
--- plugins/tags/default-templates/mustek/tag.html	(revision 2604)
+++ plugins/tags/default-templates/mustek/tag.html	(revision 3009)
@@ -51,4 +51,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
Index: plugins/tags/default-templates/mustek/tags.html
===================================================================
--- plugins/tags/default-templates/mustek/tags.html	(revision 2603)
+++ plugins/tags/default-templates/mustek/tags.html	(revision 3009)
@@ -34,4 +34,5 @@
 
 <div id="main" role="main">
+  {{tpl:Breadcrumb}}
   <div id="content">
 
