Revert "Internationalize plain commitdiff"
Revert "Internationalize plain commitdiff"

This reverts commit c6fda61c9cb5e3b4a5c6610b0f2e0d972798e980.

--- a/config/gitphp.conf.php.example
+++ b/config/gitphp.conf.php.example
@@ -169,6 +169,20 @@
 $gitphp_conf['filesearch'] = TRUE;
 
 /*
+ * debug
+ * Turns on extra warning messages and benchmarking.
+ * Not recommended for production systems
+ */
+$gitphp_conf['debug'] = FALSE;
+
+/*
+ * lang
+ * Sets the language of the interface
+ * Must be a valid translation in include/locale/
+ */
+$gitphp_conf['lang'] = "en_US";
+
+/*
  * git_projects
  * Two-dimensional array list of projects
  * First array index is the name of the category the projects

--- a/include/defs.constants.php
+++ b/include/defs.constants.php
@@ -15,5 +15,7 @@
 define("GITPHP_COMPRESS_GZ", 2);
 define("GITPHP_COMPRESS_ZIP", 3);
 
+define("GITPHP_LOCALE_DIR", "include/locale/");
+
 ?>
 

--- a/include/display.git_blob.php
+++ b/include/display.git_blob.php
@@ -18,15 +18,15 @@
 function git_blob($projectroot, $project, $hash, $file, $hashbase)
 {
 	global $gitphp_conf,$tpl;
+	$head = git_read_head($projectroot . $project);
 	if (!isset($hashbase))
-		$hashbase = git_read_head($projectroot . $project);
+		$hashbase = $head;
 	if (!isset($hash) && isset($file))
 		$hash = git_get_hash_by_path($projectroot . $project, $hashbase,$file,"blob");
 	$catout = git_cat_file($projectroot . $project, $hash);
-	$tpl->clear_all_assign();
 	$tpl->assign("hash",$hash);
-	$tpl->assign("project",$project);
 	$tpl->assign("hashbase",$hashbase);
+	$tpl->assign("head", $head);
 	if ($co = git_read_commit($projectroot . $project, $hashbase)) {
 		$tpl->assign("fullnav",TRUE);
 		$refs = read_info_ref($projectroot . $project);
@@ -34,8 +34,13 @@
 		$tpl->assign("title",$co['title']);
 		if (isset($file))
 			$tpl->assign("file",$file);
-		if (isset($refs[$hashbase]))
-			$tpl->assign("hashbaseref",$refs[$hashbase]);
+		if ($hashbase == "HEAD") {
+			if (isset($refs[$head]))
+				$tpl->assign("hashbaseref",$refs[$head]);
+		} else {
+			if (isset($refs[$hashbase]))
+				$tpl->assign("hashbaseref", $refs[$hashbase]);
+		}
 	}
 	$paths = git_path_trees($projectroot . $project, $hashbase, $file);
 	$tpl->assign("paths",$paths);

--- a/include/display.git_blobdiff.php
+++ b/include/display.git_blobdiff.php
@@ -21,11 +21,9 @@
 		echo $ret;
 		return;
 	}
-	$tpl->clear_all_assign();
 	$tpl->assign("hash",$hash);
 	$tpl->assign("hashparent",$hashparent);
 	$tpl->assign("hashbase",$hashbase);
-	$tpl->assign("project",$project);
 	if (isset($file))
 		$tpl->assign("file",$file);
 	if ($co = git_read_commit($projectroot . $project, $hashbase)) {

--- a/include/display.git_commit.php
+++ b/include/display.git_commit.php
@@ -28,8 +28,6 @@
 	}
 	$diffout = git_diff_tree($projectroot . $project, $root . " " . $parent . " " . $hash, TRUE);
 	$difftree = explode("\n",$diffout);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("hash",$hash);
 	$tpl->assign("tree",$co['tree']);
 	if (isset($co['parent']))
@@ -67,24 +65,23 @@
 			$difftreeline["file"] = $regs[7];
 			$difftreeline["from_file"] = strtok($regs[7],"\t");
 			$difftreeline["from_filetype"] = file_type($regs[1]);
+			$difftreeline["from_filetype_localized"] = lookupstring($difftreeline["from_filetype"]);
 			$difftreeline["to_file"] = strtok("\t");
 			$difftreeline["to_filetype"] = file_type($regs[2]);
+			$difftreeline["to_filetype_localized"] = lookupstring($difftreeline["to_filetype"]);
 			if ((octdec($regs[2]) & 0x8000) == 0x8000)
 				$difftreeline["isreg"] = TRUE;
 			$modestr = "";
 			if ((octdec($regs[1]) & 0x17000) != (octdec($regs[2]) & 0x17000))
-				$modestr .= " from " . file_type($regs[1]) . " to " . file_type($regs[2]);
+				$difftreeline["typechange"] = TRUE;
 			if ((octdec($regs[1]) & 0777) != (octdec($regs[2]) & 0777)) {
 				if ((octdec($regs[1]) & 0x8000) && (octdec($regs[2]) & 0x8000))
-					$modestr .= " mode: " . (octdec($regs[1]) & 0777) . "->" . (octdec($regs[2]) & 0777);
+					$difftreeline["modechange"] = (octdec($regs[1]) & 0777) . "->" . (octdec($regs[2]) & 0777);
 				else if (octdec($regs[2]) & 0x8000)
-					$modestr .= " mode: " . (octdec($regs[2]) & 0777);
+					$difftreeline["modechange"] = (octdec($regs[2]) & 0777);
 			}
-			$difftreeline["modechange"] = $modestr;
-			$simmodechg = "";
 			if ($regs[1] != $regs[2])
-				$simmodechg .= ", mode: " . (octdec($regs[2]) & 0777);
-			$difftreeline["simmodechg"] = $simmodechg;
+				$difftreeline["simmodechg"] = (octdec($regs[2]) & 0777);
 			$difftreelines[] = $difftreeline;
 		}
 	}

--- a/include/display.git_commitdiff.php
+++ b/include/display.git_commitdiff.php
@@ -13,6 +13,7 @@
  require_once('gitutil.git_diff_tree.php');
  require_once('gitutil.read_info_ref.php');
  require_once('gitutil.git_diff.php');
+ require_once('i18n.lookupstring.php');
 
 function git_commitdiff($projectroot,$project,$hash,$hash_parent)
 {
@@ -28,8 +29,6 @@
 	$diffout = git_diff_tree($projectroot . $project, $hash_parent . " " . $hash);
 	$difftree = explode("\n",$diffout);
 	$refs = read_info_ref($projectroot . $project);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("hash",$hash);
 	$tpl->assign("tree",$co['tree']);
 	$tpl->assign("hashparent",$hash_parent);
@@ -49,6 +48,8 @@
 			$difftreeline["file"] = $regs[6];
 			$difftreeline["from_type"] = file_type($regs[1]);
 			$difftreeline["to_type"] = file_type($regs[2]);
+			$difftreeline["from_type_localized"] = lookupstring($difftreeline["from_type"]);
+			$difftreeline["to_type_localized"] = lookupstring($difftreeline["to_type"]);
 			if ($regs[5] == "A")
 				$difftreeline['diffout'] = explode("\n",git_diff($projectroot . $project, null,"/dev/null",$regs[4],"b/" . $regs[6]));
 			else if ($regs[5] == "D")

--- a/include/display.git_commitdiff_plain.php
+++ b/include/display.git_commitdiff_plain.php
@@ -42,7 +42,6 @@
 	header("Content-type: text/plain; charset=UTF-8");
 	header("Content-disposition: inline; filename=\"git-" . $hash . ".patch\"");
 	$ad = date_str($co['author_epoch'],$co['author_tz']);
-	$tpl->clear_all_assign();
 	$tpl->assign("from",$co['author']);
 	$tpl->assign("date",$ad['rfc2822']);
 	$tpl->assign("subject",$co['title']);

--- a/include/display.git_heads.php
+++ b/include/display.git_heads.php
@@ -14,8 +14,6 @@
 {
 	global $tpl;
 	$head = git_read_head($projectroot . $project);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("head",$head);
 	$headlist = git_read_refs($projectroot, $project, "refs/heads");
 	$tpl->assign("headlist",$headlist);

--- a/include/display.git_history.php
+++ b/include/display.git_history.php
@@ -21,8 +21,6 @@
 		$hash = git_read_head($projectroot . $project);
 	$co = git_read_commit($projectroot . $project, $hash);
 	$refs = read_info_ref($projectroot . $project);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("hash",$hash);
 	if (isset($refs[$hash]))
 		$tpl->assign("hashbaseref",$refs[$hash]);

--- a/include/display.git_log.php
+++ b/include/display.git_log.php
@@ -22,8 +22,6 @@
 	if (!isset($page))
 		$page = 0;
 	$refs = read_info_ref($projectroot . $project);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("hash",$hash);
 	$tpl->assign("head",$head);
 

--- /dev/null
+++ b/include/display.git_message.php
@@ -1,1 +1,22 @@
+<?php
+/*
+ *  display.git_message.php
+ *  gitphp: A PHP git repository browser
+ *  Component: Display - message
+ *
+ *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
+ */
 
+function git_message($message, $error = FALSE, $standalone = TRUE)
+{
+	global $tpl;
+	$tpl->assign("message",$message);
+	if ($error)
+		$tpl->assign("error", TRUE);
+	if ($standalone)
+		$tpl->assign("standalone", TRUE);
+	$tpl->display("message.tpl");
+}
+
+?>
+

--- a/include/display.git_opml.php
+++ b/include/display.git_opml.php
@@ -15,7 +15,6 @@
 	global $tpl,$gitphp_conf;
 	$projlist = git_read_projects($projectroot,$projectlist);
 	header("Content-type: text/xml; charset=UTF-8");
-	$tpl->clear_all_assign();
 	$tpl->assign("title",$gitphp_conf['title']);
 	$tpl->assign("self",script_url());
 	$opmllist = array();

--- a/include/display.git_project_list.php
+++ b/include/display.git_project_list.php
@@ -11,6 +11,7 @@
  require_once('util.descrcmp.php');
  require_once('util.ownercmp.php');
  require_once('util.agecmp.php');
+ require_once('i18n.lookupstring.php');
  require_once('gitutil.git_read_projects.php');
 
 function git_project_list($projectroot,$projectlist,$order = "project")
@@ -19,7 +20,6 @@
 	$projects = git_read_projects($projectroot,$projectlist, TRUE);
 	if (is_array($projects)) {
 		if (count($projects) > 0) {
-			$tpl->clear_all_assign();
 			if ($order)
 				$tpl->assign("order",$order);
 			if (!isset($git_projects)) {
@@ -57,10 +57,15 @@
 				}
 				$tpl->assign("categorizedprojects",$projects);
 			}
-		} else
-			$tpl->assign("errmsg","No projects found");
-	} else
-		$tpl->assign("errmsg",$projects);
+		} else {
+			$tpl->assign("message",lookupstring("noprojectsfound"));
+			//$tpl->assign("message",lookupstring("No projects found"));
+			$tpl->assign("error",TRUE);
+		}
+	} else {
+		$tpl->assign("message",$projects);
+		$tpl->assign("error",TRUE);
+	}
 	$tpl->display("projectlist.tpl");
 }
 

--- a/include/display.git_rss.php
+++ b/include/display.git_rss.php
@@ -21,9 +21,7 @@
 	$head = git_read_head($projectroot . $project);
 	$revlist = git_read_revlist($projectroot . $project, $head, GITPHP_RSS_ITEMS);
 	header("Content-type: text/xml; charset=UTF-8");
-	$tpl->clear_all_assign();
 	$tpl->assign("self",script_url());
-	$tpl->assign("project",$project);
 
 	$commitlines = array();
 	for ($i = 0; $i <= count($revlist); $i++) {

--- a/include/display.git_search.php
+++ b/include/display.git_search.php
@@ -9,24 +9,24 @@
 
 require_once('defs.constants.php');
 require_once('util.highlight.php');
+require_once('i18n.lookupstring.php');
 require_once('gitutil.git_read_commit.php');
 require_once('gitutil.git_rev_list.php');
+require_once('display.git_message.php');
 
 function git_search($projectroot, $project, $hash, $search, $searchtype, $page = 0)
 {
 	global $tpl,$gitphp_conf;
 
-	$tpl->clear_all_assign();
 	if (!$gitphp_conf['search']) {
-		$tpl->assign("message","Search has been disabled");
-		$tpl->display("message.tpl");
+		git_message(lookupstring('searchhasbeendisabled'), TRUE, TRUE);
+		//git_message(lookupstring('Search has been disabled'), TRUE, TRUE);
 		return;
 	}
 
 	if (!isset($search) || (strlen($search) < 2)) {
-		$tpl->assign("error",TRUE);
-		$tpl->assign("message","You must enter search text of at least 2 characters");
-		$tpl->display("message.tpl");
+		git_message(lookupstring('searchtooshort'), TRUE, TRUE);
+		//git_message(lookupstring('You must enter search text of at least 2 characters'), TRUE, TRUE);
 		return;
 	}
 	if (!isset($hash)) {
@@ -38,12 +38,11 @@
 
 	$revlist = explode("\n",trim(git_rev_list($projectroot . $project, $hash, 101, ($page * 100), FALSE, FALSE, $searchtype, $search)));
 	if (count($revlist) < 1 || (strlen($revlist[0]) < 1)) {
-		$tpl->assign("message","No matches for '" . $search . "'.");
-		$tpl->display("message.tpl");
+		git_message(sprintf(lookupstring('nomatches'), $search), FALSE, TRUE);
+		//git_message(sprintf(lookupstring('No matches for \'%1$s\'.'), $search), FALSE, TRUE);
 		return;
 	}
 
-	$tpl->assign("project",$project);
 	$tpl->assign("hash",$hash);
 	$tpl->assign("treehash",$co['tree']);
 

--- a/include/display.git_search_files.php
+++ b/include/display.git_search_files.php
@@ -9,24 +9,24 @@
 
 require_once('defs.constants.php');
 require_once('util.highlight.php');
+require_once('i18n.lookupstring.php');
 require_once('gitutil.git_filesearch.php');
 require_once('gitutil.git_read_commit.php');
+require_once('display.git_message.php');
 
 function git_search_files($projectroot, $project, $hash, $search, $page = 0)
 {
 	global $tpl,$gitphp_conf;
 
-	$tpl->clear_all_assign();
 	if (!($gitphp_conf['search'] && $gitphp_conf['filesearch'])) {
-		$tpl->assign("message","File search has been disabled");
-		$tpl->display("message.tpl");
+		git_message(lookupstring('filesearchhasbeendisabled'), TRUE, TRUE);
+		//git_message(lookupstring('File search has been disabled'), TRUE, TRUE);
 		return;
 	}
 
 	if (!isset($search) || (strlen($search) < 2)) {
-		$tpl->assign("error",TRUE);
-		$tpl->assign("message","You must enter search text of at least 2 characters");
-		$tpl->display("message.tpl");
+		git_message(lookupstring('searchtooshort'), TRUE, TRUE);
+		//git_message(lookupstring('You must enter search text of at least 2 characters'), TRUE, TRUE);
 		return;
 	}
 	if (!isset($hash)) {
@@ -39,12 +39,11 @@
 	$filesearch = git_filesearch($projectroot . $project, $hash, $search, false, ($page * 100), 101);
 
 	if (count($filesearch) < 1) {
-		$tpl->assign("message","No matches for '" . $search . "'.");
-		$tpl->display("message.tpl");
+		git_message(sprintf(lookupstring('nomatches'), $search), FALSE, TRUE);
+		//git_message(sprintf(lookupstring('No matches for \'%1$s\'.'), $search), FALSE, TRUE);
 		return;
 	}
 
-	$tpl->assign("project",$project);
 	$tpl->assign("hash",$hash);
 	$tpl->assign("treehash",$co['tree']);
 

--- a/include/display.git_shortlog.php
+++ b/include/display.git_shortlog.php
@@ -22,8 +22,6 @@
 	if (!isset($page))
 		$page = 0;
 	$refs = read_info_ref($projectroot . $project);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("hash",$hash);
 	$tpl->assign("head",$head);
 

--- a/include/display.git_summary.php
+++ b/include/display.git_summary.php
@@ -25,8 +25,6 @@
 	$commitdate = date_str($commit['committer_epoch'],$commit['committer_tz']);
 	$owner = git_project_owner($projectroot,$project);
 	$refs = read_info_ref($projectroot . $project);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("head",$head);
 	$tpl->assign("description",$descr);
 	$tpl->assign("owner",$owner);

--- a/include/display.git_tag.php
+++ b/include/display.git_tag.php
@@ -16,8 +16,6 @@
 	global $tpl;
 
 	$head = git_read_head($projectroot . $project);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("head",$head);
 	$tpl->assign("hash", $hash);
 

--- a/include/display.git_tags.php
+++ b/include/display.git_tags.php
@@ -14,8 +14,6 @@
 {
 	global $tpl;
 	$head = git_read_head($projectroot . $project);
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
 	$tpl->assign("head",$head);
 	$taglist = git_read_refs($projectroot, $project, "refs/tags");
 	if (isset($taglist) && (count($taglist) > 0)) {

--- a/include/display.git_tree.php
+++ b/include/display.git_tree.php
@@ -27,52 +27,37 @@
 	}
 	$lsout = git_ls_tree($projectroot . $project, $hash, TRUE);
 	$refs = read_info_ref($projectroot . $project);
-	$tpl->clear_all_assign();
+	$tpl->assign("hash",$hash);
+	if (isset($hashbase))
+		$tpl->assign("hashbase",$hashbase);
 	if (isset($hashbase) && ($co = git_read_commit($projectroot . $project, $hashbase))) {
 		$basekey = $hashbase;
-		$tpl->assign("hashbase",$hashbase);
-		$tpl->assign("project",$project);
+		$tpl->assign("fullnav",TRUE);
 		$tpl->assign("title",$co['title']);
 		if (isset($refs[$hashbase]))
 			$tpl->assign("hashbaseref",$refs[$hashbase]);
-		$tpl->display("tree_nav.tpl");
-	} else {
-		$tpl->assign("hash",$hash);
-		$tpl->display("tree_emptynav.tpl");
 	}
-	$tpl->clear_all_assign();
-	$tpl->assign("project",$project);
-	$tpl->assign("hashbase",$hashbase);
 	$paths = git_path_trees($projectroot . $project, $hashbase, $file);
 	$tpl->assign("paths",$paths);
-	$tpl->display("tree_filelist_header.tpl");
 
+	if (isset($file))
+		$tpl->assign("base",$file . "/");
+
+	$treelines = array();
 	$tok = strtok($lsout,"\0");
-	$alternate = FALSE;
 	while ($tok !== false) {
 		if (ereg("^([0-9]+) (.+) ([0-9a-fA-F]{40})\t(.+)$",$tok,$regs)) {
-			$tpl->clear_all_assign();
-			if ($alternate)
-				$tpl->assign("class","dark");
-			else
-				$tpl->assign("class","light");
-			$alternate = !$alternate;
-			$tpl->assign("filemode",mode_str($regs[1]));
-			$tpl->assign("type",$regs[2]);
-			$tpl->assign("hash",$regs[3]);
-			$tpl->assign("name",$regs[4]);
-			$tpl->assign("project",$project);
-			if (isset($file))
-				$tpl->assign("base",$file . "/");
-			if (isset($basekey))
-				$tpl->assign("hashbase",$basekey);
-			$tpl->display("tree_filelist_item.tpl");
+			$treeline = array();
+			$treeline["filemode"] = mode_str($regs[1]);
+			$treeline["type"] = $regs[2];
+			$treeline["hash"] = $regs[3];
+			$treeline["name"] = $regs[4];
+			$treelines[] = $treeline;
 		}
 		$tok = strtok("\0");
 	}
-
-	$tpl->clear_all_assign();
-	$tpl->display("tree_filelist_footer.tpl");
+	$tpl->assign("treelines",$treelines);
+	$tpl->display("tree.tpl");
 }
 
 ?>

--- a/include/gitutil.git_read_projects.php
+++ b/include/gitutil.git_read_projects.php
@@ -7,6 +7,7 @@
  *  Copyright (C) 2008 Christopher Han <xiphux@gmail.com>
  */
 
+ require_once('i18n.lookupstring.php');
  require_once('gitutil.git_recurse_projects.php');
  require_once('gitutil.git_project_info.php');
 
@@ -45,10 +46,12 @@
 						$projects[$i] = $p;
 				}
 			}
-		} else
-			return "Projectroot is not a directory";
+		} else {
+			return lookupstring("projectrootisnotadirectory");
+			//return lookupstring("Projectroot is not a directory");
+		}
 	} else
-		return "No projectroot set";
+		return lookupstring("noprojectrootset");
 	return $projects;
 }
 

--- a/include/gitutil.git_read_refs.php
+++ b/include/gitutil.git_read_refs.php
@@ -13,6 +13,7 @@
  require_once('gitutil.git_read_hash.php');
  require_once('gitutil.git_read_tag.php');
  require_once('gitutil.git_read_commit.php');
+ require_once('i18n.lookupstring.php');
 
 function git_read_refs($projectroot,$project,$refdir)
 {
@@ -44,6 +45,7 @@
 		if ($type) {
 			$ref_item = array();
 			$ref_item['type'] = $type;
+			$ref_item['type_localized'] = lookupstring($type);
 			$ref_item['id'] = $ref_id;
 			$ref_item['epoch'] = 0;
 			$ref_item['age'] = "unknown";
@@ -72,6 +74,7 @@
 				$ref_item['epoch'] = $co['committer_epoch'];
 				$ref_item['age'] = $co['age_string'];
 			}
+			$ref_item['reftype_localized'] = lookupstring($ref_item['reftype']);
 			$reflist[] = $ref_item;
 		}
 	}

--- a/include/gitutil.git_read_tag.php
+++ b/include/gitutil.git_read_tag.php
@@ -8,6 +8,7 @@
  */
 
  require_once('gitutil.git_cat_file.php');
+ require_once('i18n.lookupstring.php');
 
 function git_read_tag($project, $tag_id)
 {
@@ -19,9 +20,10 @@
 	while ($tok !== false) {
 		if (ereg("^object ([0-9a-fA-F]{40})$",$tok,$regs))
 			$tag['object'] = $regs[1];
-		else if (ereg("^type (.+)$",$tok,$regs))
+		else if (ereg("^type (.+)$",$tok,$regs)) {
 			$tag['type'] = $regs[1];
-		else if (ereg("^tag (.+)$",$tok,$regs))
+			$tag['type_localized'] = lookupstring($tag['type']);
+		} else if (ereg("^tag (.+)$",$tok,$regs))
 			$tag['name'] = $regs[1];
 		else if (ereg("^tagger (.*) ([0-9]+) (.*)$",$tok,$regs)) {
 			$tag['author'] = $regs[1];

--- /dev/null
+++ b/include/i18n.initlocale.php
@@ -1,1 +1,27 @@
+<?php
+/*
+ *  i18n.initlocale.php
+ *  gitphp: A PHP git repository browser
+ *  Component: i18n - load locale
+ *
+ *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
+ */
 
+require_once('i18n.lookupstring.php');
+
+function initlocale($locale = "en_US")
+{
+	global $tpl;
+
+	if (!include(GITPHP_LOCALE_DIR . $locale . ".php"))
+		include(GITPHP_LOCALE_DIR . "en_US.php");
+
+	if (isset($strings)) {
+		$tpl->assign("localize",$strings);
+	}
+
+	return $strings;
+}
+
+?>
+

--- /dev/null
+++ b/include/i18n.lookupstring.php
@@ -1,1 +1,29 @@
+<?php
+/*
+ *  i18n.lookupstring.php
+ *  gitphp: A PHP git repository browser
+ *  Component: i18n - look up a string
+ *
+ *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
+ */
 
+function lookupstring($str, $strings = null)
+{
+	global $localestrings;
+
+	if (!$str)
+		return null;
+
+	if (isset($strings) && (count($strings) > 0)) {
+		if (isset($strings[$str]))
+			return $strings[$str];
+	} else {
+		if (isset($localestrings[$str]))
+			return $localestrings[$str];
+	}
+
+	return $str;
+}
+
+?>
+

--- /dev/null
+++ b/include/locale/en_US.php
@@ -1,1 +1,366 @@
-
+<?php
+/*
+ *  en_US.php
+ *  gitphp: A PHP git repository browser
+ *  Component: i18n - en_US
+ */
+
+$strings = array(
+	/*
+	 * Error message that tells the user that
+	 * there were no projects found in the projectroot
+	 */
+	'noprojectsfound' => 'No projects found',
+
+	/*
+	 * Error message that tells the user that the projectroot
+	 * they have set up is not a directory
+	 */
+	'projectrootisnotadirectory' => 'Projectroot is not a directory',
+
+	/*
+	 * Error message that tells the user that they have not set
+	 * a projectroot
+	 */
+	'noprojectrootset' => 'No projectroot set',
+
+	/*
+	 * Tells the user that all searching has been disabled
+	 */
+	'searchhasbeendisabled' => 'Search has been disabled',
+
+	/*
+	 * Tells the user that searching with files has been disabled
+	 */
+	'filesearchhasbeendisabled' => 'File search has been disabled',
+
+	/*
+	 * Tells the user that their search string must be a minimum of 2 characters
+	 */
+	'searchtooshort' => 'You must enter search text of at least 2 characters',
+
+	/*
+	 * Tells the user that no matches were found for their search, where
+	 * %1$s is the search string
+	 */
+	'nomatches' => 'No matches for \'%1$s\'.',
+
+	/*
+	 * Used to indicate multiple projects - links back to the project
+	 * listing page
+	 */
+	'projects' => 'projects',
+
+	/*
+	 * Used as the header for the project name column on the project list
+	 */
+	'headerproject' => 'Project',
+
+	/*
+	 * Used as the header for the description column on the project list
+	 */
+	'headerdescription' => 'Description',
+
+	/*
+	 * Used as the header for the owner column on the project list
+	 */
+	'headerowner' => 'Owner',
+
+	/*
+	 * Used as the header for the age (last time project was changed) column in the
+	 * project list
+	 */
+	'headerlastchange' => 'Last Change',
+
+	/*
+	 * Used as the header for the actions column (links to various other pages for
+	 * that project)
+	 */
+	'headeractions' => 'Actions',
+
+	/*
+	 * Used as the name for the main project summary page
+	 */
+	'summary' => 'summary',
+
+	/*
+	 * Used as the name for the shortlog (abbreviated commit log) page
+	 */
+	'shortlog' => 'shortlog',
+
+	/*
+	 * Used as the name for the log (full commit log) page
+	 */
+	'log' => 'log',
+
+	/*
+	 * Used as the name for a single "commit" to the repository - 
+	 * for the commit page, as well as on other pages when referencing
+	 * a single commit object
+	 */
+	'commit' => 'commit',
+
+	/*
+	 * Used as the name for the commitdiff page, which shows all changes
+	 * in a single commit
+	 */
+	'commitdiff' => 'commitdiff',
+
+	/*
+	 * Used as the name for the tree page and to reference tree objects - 
+	 * "trees" being a particular project's directory of files (or subdirectory)
+	 * at a given revision
+	 */
+	'tree' => 'tree',
+
+	/*
+	 * Used as the name for the snapshot action, which sends a tarball of the
+	 * project at a given revision
+	 */
+	'snapshot' => 'snapshot',
+
+	/*
+	 * Used as the name for the tags page/section, which lists all tags for a project
+	 */
+	'tags' => 'tags',
+
+	/*
+	 * Used as the name for the single tag page, which shows all info on a single
+	 * tag object
+	 */
+	'tag' => 'tag',
+
+	/*
+	 * Used as the name for the heads page/section, which lists all heads for a project
+	 */
+	'heads' => 'heads',
+
+	/*
+	 * Used as the name for the history page, which lists all commits where a particular
+	 * file was changed
+	 */
+	'history' => 'history',
+
+	/*
+	 * Used as the name for the blob page, which shows the content of a file at a given
+	 * revision (its 'blob' data)
+	 */
+	'blob' => 'blob',
+
+	/*
+	 * Used as a link to show the differences in a file for a commit
+	 */
+	'diff' => 'diff',
+
+	/*
+	 * Used as a link to diff a particular revision of a file to the current version
+	 */
+	'difftocurrent' => 'diff to current',
+
+	/*
+	 * Used as the name for the search action, and to caption the search box
+	 */
+	'search' => 'search',
+
+	/*
+	 * Used as the caption on the 'RSS' button, which gets a feed of the most recent
+	 * commits to a project
+	 */
+	'RSS' => 'RSS',
+
+	/*
+	 * Used as the caption for the 'OPML' button, which gets a list of projects in OPML format
+	 */
+	'OPML' => 'OPML',
+
+	/*
+	 * Used as the caption for the 'TXT' button, which gets a list of projects in plaintext
+	 */
+	'TXT' => 'TXT',
+
+	/*
+	 * Used as a link on various actions (blob, blobdiff, commitdiff, etc) to get the plaintext
+	 * version of it
+	 */
+	'plain' => 'plain',
+
+	/*
+	 * Used as an indicator that something was added
+	 */
+	'new' => 'new',
+
+	/*
+	 * Used as an indicator that something was deleted
+	 */
+	'deleted' => 'deleted',
+
+	/*
+	 * Used as an indicator that something is a file - for example, that we are diffing a
+	 * file or searching within files
+	 */
+	'file' => 'file',
+
+	/*
+	 * Used to denote the author of a particular commit, or that we want to search
+	 * authors
+	 */
+	'author' => 'author',
+
+	/*
+	 * Used to denote the committer of a particular commit, or that we want to search
+	 * committers
+	 */
+	'committer' => 'committer',
+
+	/*
+	 * Used as the link to the previous page, when paginating through log entries
+	 * or search results
+	 */
+	'prev' => 'prev',
+
+	/*
+	 * Used as the link to the next page, when paginating through log entries
+	 * or search results
+	 */
+	'next' => 'next',
+
+	/*
+	 * Used as the link to the first page, when paginating through search results
+	 */
+	'first' => 'first',
+
+	/*
+	 * Used as the link to the HEAD, when paginating through log entries
+	 */
+	'HEAD' => 'HEAD',
+
+	/*
+	 * Used to indicate the description of the project, on the project summary page
+	 */
+	'description' => 'description',
+
+	/*
+	 * Used to indicate the owner of the project, on the project summary page
+	 */
+	'owner' => 'owner',
+
+	/*
+	 * Used to indicate the age (last change) of the project, on the project summary page
+	 */
+	'lastchange' => 'last change',
+
+	/*
+	 * Used to indicate the object that is the parent of this one (eg the commit that
+	 * came right before this one)
+	 */
+	'parent' => 'parent',
+
+	/*
+	 * Used to indicate the object (commit, etc) that is attached to a tag
+	 */
+	'object' => 'object',
+
+	/*
+	 * Used to indicate a new object was added, where
+	 * %1$s is the type of object (file or tree)
+	 */
+	'newobject' => 'new %1$s',
+
+	/*
+	 * Used to indicate a new object was added, where
+	 * %1$s is the type of object (file or tree) and
+	 * %2$s is the new mode
+	 */
+	'newobjectwithmode' => 'new %1$s with mode: %2$s',
+
+	/*
+	 * Used to indicate an object was deleted, where
+	 * %1$s is the type of object (file or tree)
+	 */
+	'deletedobject' => 'deleted %1$s',
+
+	/*
+	 * Used to indicate an object's type was changed, where
+	 * %1$s is the old type and %2$s is the new type
+	 */
+	'changedobjecttype' => 'changed from %1$s to %2$s',
+
+	/*
+	 * Used to indicate an object's mode was changed, where
+	 * %1$s is the mode change (either just one mode or
+	 * mode1->mode2)
+	 */
+	'changedobjectmode' => 'changed mode: %1$s',
+
+	/*
+	 * Used to indicate that an object was moved/renamed,
+	 * where %1$s is the original name, and
+	 * %2$d is the percentage similarity
+	 */
+	'movedobjectwithsimilarity' => 'moved from %1$s with %2$d%% similarity',
+
+	/*
+	 * Used to indicate that an object was moved/renamed,
+	 * where %1$s is the original name,
+	 * %2$d is the percentage similarity, and
+	 * %3$s is the mode
+	 */
+	'movedobjectwithsimilaritymodechange' => 'moved from %1$s with %2$d%% similarity, mode: $3$s',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * years ago, where %1$d is the number of years
+	 */
+	'ageyearsago' => '%1$d years ago',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * years ago, where %1$d is the number of years
+	 */
+	'agemonthsago' => '%1$d months ago',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * weeks ago, where %1$d is the number of weeks
+	 */
+	'ageweeksago' => '%1$d weeks ago',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * days ago, where %1$d is the number of days
+	 */
+	'agedaysago' => '%1$d days ago',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * hours ago, where %1$d is the number of hours
+	 */
+	'agehoursago' => '%1$d hours ago',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * minutes ago, where %1$d is the number of minutes
+	 */
+	'ageminago' => '%1$d min ago',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * seconds ago, where %1$d is the number of seconds
+	 */
+	'agesecago' => '%1$d sec ago',
+
+	/*
+	 * Used to indicate something is happening right now
+	 * (less than 3 seconds ago)
+	 */
+	'agerightnow' => 'right now',
+
+	/*
+	 * Used to indicate a certain number of files were changed in a commit
+	 * where %1$d is the numebr of files changed
+	 */
+	'fileschanged' => '%1$d files changed',
+);
+
+?>
+

--- /dev/null
+++ b/include/locale/zz_DEBUG.php
@@ -1,1 +1,366 @@
-
+<?php
+/*
+ *  zz_DEBUG.php
+ *  gitphp: A PHP git repository browser
+ *  Component: i18n - zz_DEBUG
+ */
+
+$strings = array(
+	/*
+	 * Error message that tells the user that
+	 * there were no projects found in the projectroot
+	 */
+	'noprojectsfound' => '{Nő prōjěcts fŏůnd•••••}',
+
+	/*
+	 * Error message that tells the user that the projectroot
+	 * they have set up is not a directory
+	 */
+	'projectrootisnotadirectory' => '{Prŏjĕctrőőt ĩs nōt ā dĩrėctōry•••••••••}',
+
+	/*
+	 * Error message that tells the user that they have not set
+	 * a projectroot
+	 */
+	'noprojectrootset' => '{Nŏ prőjēctrōŏt sėt•••••}',
+
+	/*
+	 * Tells the user that all searching has been disabled
+	 */
+	'searchhasbeendisabled' => '{Séãrch hås bêën dîsáblëd•••••••}',
+
+	/*
+	 * Tells the user that searching with files has been disabled
+	 */
+	'filesearchhasbeendisabled' => '{Fïle sëärch hås béèn dïsåbléd••••••••}',
+
+	/*
+	 * Tells the user that their search string must be a minimum of 2 characters
+	 */
+	'searchtooshort' => '{Yōu můst ėntěr sēărch tĕxt ōf āt lėåst 2 chãräctérs•••••••••••••••}',
+
+	/*
+	 * Tells the user that no matches were found for their search, where
+	 * %1$s is the search string
+	 */
+	'nomatches' => '{‹%1$s› mătĉh nōt fŏůnd•••••}',
+
+	/*
+	 * Used to indicate multiple projects - links back to the project
+	 * listing page
+	 */
+	'projects' => '{prőjėčts••}',
+
+	/*
+	 * Used as the header for the project name column on the project list
+	 */
+	'headerproject' => '{Pröjèct••}',
+
+	/*
+	 * Used as the header for the description column on the project list
+	 */
+	'headerdescription' => '{Dèscrîptîön•••}',
+
+	/*
+	 * Used as the header for the owner column on the project list
+	 */
+	'headerowner' => '{Öwnèr•}',
+
+	/*
+	 * Used as the header for the age (last time project was changed) column in the
+	 * project list
+	 */
+	'headerlastchange' => '{Låst Chångè•••}',
+
+	/*
+	 * Used as the header for the actions column (links to various other pages for
+	 * that project)
+	 */
+	'headeractions' => '{Åctîöns••}',
+
+	/*
+	 * Used as the name for the main project summary page
+	 */
+	'summary' => '{sûmmäry••}',
+
+	/*
+	 * Used as the name for the shortlog (abbreviated commit log) page
+	 */
+	'shortlog' => '{shõrtlög••}',
+
+	/*
+	 * Used as the name for the log (full commit log) page
+	 */
+	'log' => '{lõg•}',
+
+	/*
+	 * Used as the name for a single "commit" to the repository - 
+	 * for the commit page, as well as on other pages when referencing
+	 * a single commit object
+	 */
+	'commit' => '{cömmït•}',
+
+	/*
+	 * Used as the name for the commitdiff page, which shows all changes
+	 * in a single commit
+	 */
+	'commitdiff' => '{cõmmïtdîff•••}',
+
+	/*
+	 * Used as the name for the tree page and to reference tree objects - 
+	 * "trees" being a particular project's directory of files (or subdirectory)
+	 * at a given revision
+	 */
+	'tree' => '{tréè•}',
+
+	/*
+	 * Used as the name for the snapshot action, which sends a tarball of the
+	 * project at a given revision
+	 */
+	'snapshot' => '{snãpshöt••}',
+
+	/*
+	 * Used as the name for the tags page/section, which lists all tags for a project
+	 */
+	'tags' => '{tágs•}',
+
+	/*
+	 * Used as the name for the single tag page, which shows all info on a single
+	 * tag object
+	 */
+	'tag' => '{tàg•}',
+
+	/*
+	 * Used as the name for the heads page/section, which lists all heads for a project
+	 */
+	'heads' => '{hèáds•}',
+
+	/*
+	 * Used as the name for the history page, which lists all commits where a particular
+	 * file was changed
+	 */
+	'history' => '{hîstöry••}',
+
+	/*
+	 * Used as the name for the blob page, which shows the content of a file at a given
+	 * revision (its 'blob' data)
+	 */
+	'blob' => '{blôb•}',
+	
+	/*
+	 * Used as a link to show the differences in a file for a commit
+	 */
+	'diff' => '{dîff•}',
+
+	/*
+	 * Used as a link to diff a particular revision of a file to the current version
+	 */
+	'difftocurrent' => '{dîff tò cürrênt••••}',
+
+	/*
+	 * Used as the name for the search action, and to caption the search box
+	 */
+	'search' => '{sêàrch••}',
+
+	/*
+	 * Used as the caption on the 'RSS' button, which gets a feed of the most recent
+	 * commits to a project
+	 */
+	'RSS' => '{RSS•}',
+
+	/*
+	 * Used as the caption for the 'OPML' button, which gets a list of projects in OPML format
+	 */
+	'OPML' => '{ÖPML•}',
+
+	/*
+	 * Used as the caption for the 'TXT' button, which gets a list of projects in plaintext
+	 */
+	'TXT' => '{TXT•}',
+
+	/*
+	 * Used as a link on various actions (blob, blobdiff, commitdiff, etc) to get the plaintext
+	 * version of it
+	 */
+	'plain' => '{plåïn•}',
+
+    /*
+     * Used as an indicator that something was added
+     */
+    'new' => '{ñêw•}',
+
+	/*
+	 * Used as an indicator that something was deleted
+	 */
+	'deleted' => '{délètëd••}',
+
+	/*
+	 * Used as an indicator that something is a file - for example, that we are diffing a
+	 * file or searching within files
+	 */
+	'file' => '{fílĕ•}',
+
+	/*
+	 * Used to denote the author of a particular commit, or that we want to search
+	 * authors
+	 */
+	'author' => '{åûthōr••}',
+
+	/*
+	 * Used to denote the committer of a particular commit, or that we want to search
+	 * committers
+	 */
+	'committer' => '{cōmmĩttęr••}',
+
+	/*
+	 * Used as the link to the previous page, when paginating through log entries
+	 * or search results
+	 */
+	'prev' => '{prěv•}',
+
+	/*
+	 * Used as the link to the next page, when paginating through log entries
+	 * or search results
+	 */
+	'next' => '{ńėxt•}',
+
+	/*
+	 * Used as the link to the first page, when paginating through search results
+	 */
+	'first' => '{fĩrst•}',
+
+	/*
+	 * Used as the link to the HEAD, when paginating through log entries
+	 */
+	'HEAD' => '{HĚĂD•}',
+	
+	/*
+     * Used to indicate the description of the project, on the project summary page
+     */
+    'description' => '{dêscrïptìõn•••}',
+
+    /*
+     * Used to indicate the owner of the project, on the project summary page
+     */
+    'owner' => '{öwnêr•}',
+
+    /*
+     * Used to indicate the age (last change) of the project, on the project summary page
+     */
+    'lastchange' => '{låst chãngë•••}',
+
+	/*
+	 * Used to indicate the object that is the parent of this one (eg the commit that
+	 * came right before this one)
+	 */
+	'parent' => '{pārėnt••}',
+
+	/*
+	 * Used to indicate the object (commit, etc) that is attached to a tag
+	 */
+	'object' => '{őbjěct••}',
+
+	/*
+	 * Used to indicate a new object was added, where
+	 * %1$s is the type of object (file or tree)
+	 */
+	'newobject' => '{‹%1$s› ñėw•}',
+
+	/*
+	 * Used to indicate a new object was added, where
+	 * %1$s is the type of object (file or tree) and
+	 * %2$s is the new mode
+	 */
+	'newobjectwithmode' => '{mõdę ‹%2$s› ñėw ‹%1$s›•••••}',
+
+	/*
+	 * Used to indicate an object was deleted, where
+	 * %1$s is the type of object (file or tree)
+	 */
+	'deletedobject' => '{‹%1$s› dėlětē••}',
+	
+	/*
+	 * Used to indicate an object's type was changed, where
+	 * %1$s is the old type and %2$s is the new type
+	 */
+	'changedobjecttype' => '{‹%1$s› tö ‹%2$s› chăngěd•••••}',
+	
+	/*
+	 * Used to indicate an object's mode was changed, where
+	 * %1$s is the mode change (either just one mode or
+	 * mode1->mode2)
+	 */
+    'changedobjectmode' => '{‹%1$s› mõdêchångè••••}',
+
+	/*
+	 * Used to indicate that an object was moved/renamed,
+	 * where %1$s is the original name, ande
+	 * %2$d is the percentage similarity,
+	 */
+	'movedobjectwithsimilarity' => '{%%‹%2$d› sĩmīląrĭtŷ, mővɛd frŏm ‹%1$s›•••••••••}',
+	
+    /*
+     * Used to indicate that an object was moved/renamed,
+     * where %1$s is the original name,
+     * %2$d is the percentage similarity, and
+     * %3$s is the mode
+     */
+    'movedobjectwithsimilaritymodechange' => '{%%‹%2$d› sĩmīląrĭtŷ, mővɛd frŏm ‹%1$s› mode ‹%3$s›•••••••••}',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * years ago, where %1$d is the number of years
+	 */
+	'ageyearsago' => '{ŷrs ‹%1$d› ăgő•••}',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * years ago, where %1$d is the number of years
+	 */
+	'agemonthsago' => '{mős ‹%1$d› ăgő•••}',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * weeks ago, where %1$d is the number of weeks
+	 */
+	'ageweeksago' => '{wks ‹%1$d› ăgő•••}',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * days ago, where %1$d is the number of days
+	 */
+	'agedaysago' => '{dŷs ‹%1$d› ăgő•••}',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * hours ago, where %1$d is the number of hours
+	 */
+	'agehoursago' => '{hrs ‹%1$d› ăgő•••}',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * minutes ago, where %1$d is the number of minutes
+	 */
+	'ageminago' => '{mñs ‹%1$d› ăgő••}',
+
+	/*
+	 * Used to indicate something happened a certain number of
+	 * seconds ago, where %1$d is the number of seconds
+	 */
+	'agesecago' => '{scs ‹%1$d› ăgő••}',
+
+	/*
+	 * Used to indicate something is happening right now
+	 * (less than 3 seconds ago)
+	 */
+	'agerightnow' => '{rĩght nøw•••}',
+	
+     /*
+      * Used to indicate a certain number of files were changed in a commit
+      * where %1$d is the numebr of files changed
+      */
+     'fileschanged' => '{chângëd ‹%1$d› fĭlēs••••}',
+);
+
+?>
+

--- a/include/util.age_string.php
+++ b/include/util.age_string.php
@@ -7,23 +7,34 @@
  *  Copyright (C) 2008 Christopher Han <xiphux@gmail.com>
  */
 
+include('i18n.lookupstring.php');
+
 function age_string($age)
 {
-	if ($age > 60*60*24*365*2)
-		return (int)($age/60/60/24/365) . " years ago";
-	else if ($age > 60*60*24*(365/12)*2)
-		return (int)($age/60/60/24/(365/12)) . " months ago";
-	else if ($age > 60*60*24*7*2)
-		return (int)($age/60/60/24/7) . " weeks ago";
-	else if ($age > 60*60*24*2)
-		return (int)($age/60/60/24) . " days ago";
-	else if ($age > 60*60*2)
-		return (int)($age/60/60) . " hours ago";
-	else if ($age > 60*2)
-		return (int)($age/60) . " min ago";
-	else if ($age > 2)
-		return (int)$age . " sec ago";
-	return "right now";
+	if ($age > 60*60*24*365*2) {
+		return sprintf(lookupstring('ageyearsago'), (int)($age/60/60/24/365));
+		//i18n: return sprintf(lookupstring('%1$d years ago'), (int)($age/60/60/24/365));
+	} else if ($age > 60*60*24*(365/12)*2) {
+		return sprintf(lookupstring('agemonthsago'), (int)($age/60/60/24/(365/12)));
+		//i18n: return sprintf(lookupstring('%1$d months ago'), (int)($age/60/60/24/(365/12)));
+	} else if ($age > 60*60*24*7*2) {
+		return sprintf(lookupstring('ageweeksago'), (int)($age/60/60/24/7));
+		//i18n: return sprintf(lookupstring('%1$d weeks ago'), (int)($age/60/60/24/7));
+	} else if ($age > 60*60*24*2) {
+		return sprintf(lookupstring('agedaysago'), (int)($age/60/60/24));
+		//i18n: return sprintf(lookupstring('%1$d days ago'), (int)($age/60/60/24));
+	} else if ($age > 60*60*2) {
+		return sprintf(lookupstring('agehoursago'), (int)($age/60/60));
+		//i18n: return sprintf(lookupstring('%1$d hours ago'), (int)($age/60/60));
+	} else if ($age > 60*2) {
+		return sprintf(lookupstring('ageminago'), (int)($age/60));
+		//i18n: return sprintf(lookupstring('%1$d min ago'), (int)($age/60));
+	} else if ($age > 2) {
+		return sprintf(lookupstring('agesecago'), (int)$age);
+		//i18n: return sprintf(lookupstring('%1$d sec ago'), (int)$age);
+	}
+	return lookupstring('agerightnow');
+	//i18n: return lookupstring("right now");
 }
 
 ?>

file:a/index.php -> file:b/index.php
--- a/index.php
+++ b/index.php
@@ -6,7 +6,6 @@
  *
  *  Copyright (C) 2006 Christopher Han <xiphux@gmail.com>
  */
- ob_start();
 
  /*
   * Version
@@ -22,6 +21,14 @@
   * Configuration
   */
  require_once('config/gitphp.conf.php');
+
+ /*
+  * Debug
+  */
+ if ($gitphp_conf['debug']) {
+ 	define('GITPHP_START_TIME', microtime(true));
+	error_reporting(E_ALL|E_STRICT);
+ }
 
  /*
   * Instantiate Smarty
@@ -32,30 +39,65 @@
      ($_GET['a'] != "commitdiff_plain") &&
      ($_GET['a'] != "blob_plain") &&
      ($_GET['a'] != "blobdiff_plain") &&
+     ($_GET['a'] != "rss") &&
      ($_GET['a'] != "opml")) {
 	$tpl->load_filter('output','trimwhitespace');
 }
 
-
- $rss_link = FALSE;
- $suppress_headers = FALSE;
-
- ob_start();
+ /*
+  * Init i18n
+  */
+ require_once('include/i18n.initlocale.php');
+ $localestrings = initlocale($gitphp_conf['lang']);
+
+/*
+ * Setup global assigns used everywhere (such as header/footer)
+ */
+ $tpl->assign("stylesheet",$gitphp_conf['stylesheet']);
+ $tpl->assign("version",$gitphp_version);
+ $tpl->assign("pagetitle",$gitphp_conf['title']);
+ if (isset($_GET['p'])) {
+	$tpl->assign("validproject",TRUE);
+	$tpl->assign("project",$_GET['p']);
+	require_once('include/gitutil.git_project_descr.php');
+	$tpl->assign("projectdescription",git_project_descr($gitphp_conf['projectroot'],$_GET['p']));
+	if (isset($_GET['a'])) {
+		$tpl->assign("action",$_GET['a']);
+		$tpl->assign("validaction", TRUE);
+	}
+ }
+ if (isset($_GET['st']))
+ 	$tpl->assign("currentsearchtype",$_GET['st']);
+ else
+	$tpl->assign("currentsearchtype","commit");
+if (isset($_GET['s']))
+	$tpl->assign("currentsearch",$_GET['s']);
+if (isset($_GET['hb']))
+	$tpl->assign("currentsearchhash",$_GET['hb']);
+else if (isset($_GET['h']))
+	$tpl->assign("currentsearchhash",$_GET['h']);
+if ($gitphp_conf['search'])
+	$tpl->assign("enablesearch",TRUE);
+if ($gitphp_conf['filesearch'])
+	$tpl->assign("filesearch",TRUE);
+
+
  if (isset($_GET['a']) && $_GET['a'] == "opml") {
-	$suppress_headers = TRUE;
 	require_once('include/display.git_opml.php');
 	git_opml($gitphp_conf['projectroot'],$git_projects);
  } else if (isset($_GET['a']) && $_GET['a'] == "project_index") {
-	$suppress_headers = TRUE;
 	require_once('include/display.git_project_index.php');
 	git_project_index($gitphp_conf['projectroot'],$git_projects);
  } else if (isset($_GET['p'])) {
- 	if (!is_dir($gitphp_conf['projectroot'] . $_GET['p']))
-		echo "No such directory";
-	else if (!is_file($gitphp_conf['projectroot'] . $_GET['p'] . "/HEAD"))
-		echo "No such project";
-	else {
-		$rss_link = TRUE;
+ 	if (!is_dir($gitphp_conf['projectroot'] . $_GET['p'])) {
+		$tpl->assign("validproject",FALSE);
+		require_once('include/display.git_message.php');
+		git_message("No such directory",TRUE);
+	} else if (!is_file($gitphp_conf['projectroot'] . $_GET['p'] . "/HEAD")) {
+		$tpl->assign("validproject",FALSE);
+		require_once('include/display.git_message.php');
+		git_message("No such project",TRUE);
+	} else {
 		if (!isset($_GET['a'])) {
 			require_once('include/display.git_summary.php');
 			git_summary($gitphp_conf['projectroot'],$_GET['p']);
@@ -86,7 +128,6 @@
 					git_commitdiff($gitphp_conf['projectroot'],$_GET['p'],$_GET['h'], (isset($_GET['hp']) ? $_GET['hp'] : NULL));
 					break;
 				case "commitdiff_plain":
-					$suppress_headers = TRUE;
 					require_once('include/display.git_commitdiff_plain.php');
 					git_commitdiff_plain($gitphp_conf['projectroot'],$_GET['p'],$_GET['h'],(isset($_GET['hp']) ? $_GET['hp'] : NULL));
 					break;
@@ -99,7 +140,6 @@
 					git_tags($gitphp_conf['projectroot'],$_GET['p']);
 					break;
 				case "rss":
-					$suppress_headers = TRUE;
 					require_once('include/display.git_rss.php');
 					git_rss($gitphp_conf['projectroot'],$_GET['p']);
 					break;
@@ -108,7 +148,6 @@
 					git_blob($gitphp_conf['projectroot'],$_GET['p'], (isset($_GET['h']) ? $_GET['h'] : NULL), (isset($_GET['f']) ? $_GET['f'] : NULL), (isset($_GET['hb']) ? $_GET['hb'] : NULL));
 					break;
 				case "blob_plain":
-					$suppress_headers = TRUE;
 					require_once('include/display.git_blob_plain.php');
 					git_blob_plain($gitphp_conf['projectroot'],$_GET['p'],$_GET['h'],(isset($_GET['f']) ? $_GET['f'] : NULL));
 					break;
@@ -117,12 +156,10 @@
 					git_blobdiff($gitphp_conf['projectroot'],$_GET['p'],$_GET['h'],$_GET['hb'],$_GET['hp'],(isset($_GET['f']) ? $_GET['f'] : NULL));
 					break;
 				case "blobdiff_plain":
-					$suppress_headers = TRUE;
 					require_once('include/display.git_blobdiff_plain.php');
 					git_blobdiff_plain($gitphp_conf['projectroot'],$_GET['p'],$_GET['h'],$_GET['hb'],$_GET['hp'], (isset($_GET['f']) ? $_GET['f'] : NULL));
 					break;
 				case "snapshot":
-					$suppress_headers = TRUE;
 					require_once('include/display.git_snapshot.php');
 					git_snapshot($gitphp_conf['projectroot'],$_GET['p'], (isset($_GET['h']) ? $_GET['h'] : NULL));
 					break;
@@ -144,63 +181,20 @@
 					git_tag($gitphp_conf['projectroot'],$_GET['p'],$_GET['h']);
 					break;
 				default:
-					echo "Unknown action";
+					$tpl->assign("validaction", FALSE);
+					require_once('include/display.git_message.php');
+					git_message("Unknown action", TRUE);
 					break;
 			}
 		}
 	}
  } else {
- 	$tpl->display("hometext.tpl");
 	require_once('include/display.git_project_list.php');
  	git_project_list($gitphp_conf['projectroot'],$git_projects,(isset($_GET['o']) ? $_GET['o'] : "project"));
  }
- $main = ob_get_contents();
- ob_end_clean();
-
- if (!$suppress_headers) {
-	 $tpl->clear_all_assign();
-	 $tpl->assign("stylesheet",$gitphp_conf['stylesheet']);
-	 $tpl->assign("version",$gitphp_version);
-	 $title = $gitphp_conf['title'];
-	 if ($rss_link) {
-		$tpl->assign("rss_link",TRUE);
-		$tpl->assign("project",$_GET['p']);
-		$title .= " :: " . $_GET['p'];
-		if (isset($_GET['a'])) {
-			$tpl->assign("action",$_GET['a']);
-			$title .= "/" . $_GET['a'];
-		}
-	 }
-	 $tpl->assign("title",$title);
-	 if (isset($_GET['st']))
-	 	$tpl->assign("searchtype",$_GET['st']);
-	else
-		$tpl->assign("searchtype","commit");
-	if (isset($_GET['s']))
-		$tpl->assign("search",$_GET['s']);
-	if (isset($_GET['hb']))
-		$tpl->assign("hash",$_GET['hb']);
-	else if (isset($_GET['h']))
-		$tpl->assign("hash",$_GET['h']);
-	if ($gitphp_conf['search'])
-		$tpl->assign("enablesearch",TRUE);
-	if ($gitphp_conf['filesearch'])
-		$tpl->assign("filesearch",TRUE);
-	 $tpl->display("header.tpl");
- }
-
- echo $main;
-
- if (!$suppress_headers) {
-	 if ($rss_link) {
-		$tpl->assign("project",$_GET['p']);
-		require_once('include/gitutil.git_project_descr.php');
-		$tpl->assign("descr",git_project_descr($gitphp_conf['projectroot'],$_GET['p']));
-	 }
-	 $tpl->display("footer.tpl");
- }
-
- ob_end_flush();
+
+ if ($gitphp_conf['debug'])
+ 	echo "Execution time: " . round(microtime(true) - GITPHP_START_TIME, 8) . " sec";
 
 ?>
 

--- a/templates/blob.tpl
+++ b/templates/blob.tpl
@@ -5,14 +5,31 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* If we managed to look up commit info, we have enough info to display the full header - othewise just use a simple header *}
  <div class="page_nav">
    {if $fullnav}
-     <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hashbase}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hashbase}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hashbase}">tree</a><br />
+     {* i18n: summary = summary *}
+     {* i18n: shortlog = shortlog *}
+     {* i18n: log = log *}
+     {* i18n: commit = commit *}
+     {* i18n: comitdiff = commitdiff *}
+     {* i18n: tree = tree *}
+     <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hashbase}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hashbase}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hashbase}">{$localize.tree}</a><br />
+     {* i18n: plain = plain *}
      {if $file}
-       <a href="{$SCRIPT_NAME}?p={$project}&a=blob_plain&h={$hash}&f={$file}">plain</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=blob&hb=HEAD&f={$file}">head</a><br />
+       <a href="{$SCRIPT_NAME}?p={$project}&a=blob_plain&h={$hash}&f={$file}">{$localize.plain}</a> | 
+       {* i18n: HEAD = HEAD *}
+       {if ($hashbase != "HEAD") && ($hashbase != $head)}
+         <a href="{$SCRIPT_NAME}?p={$project}&a=blob&hb=HEAD&f={$file}">{$localize.HEAD}</a>
+       {else}
+         {$localize.HEAD}
+       {/if}
+       <br />
      {else}
-       <a href="{$SCRIPT_NAME}?p={$project}&a=blob_plain&h={$hash}">plain</a><br />
+       <a href="{$SCRIPT_NAME}?p={$project}&a=blob_plain&h={$hash}">{$localize.plain}</a><br />
      {/if}
    {else}
      <br /><br />
@@ -63,3 +80,5 @@
    {/if}
  </div>
 
+ {include file='footer.tpl'}
+

--- a/templates/blobdiff.tpl
+++ b/templates/blobdiff.tpl
@@ -5,12 +5,22 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* If we managed to look up commit info, we have enough info to display the full header - othewise just use a simple header *}
  <div class="page_nav">
    {if $fullnav}
-     <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hashbase}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hashbase}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hashbase}">tree</a>
+     {* i18n: summary = summary *}
+     {* i18n: shortlog = shortlog *}
+     {* i18n: log = log *}
+     {* i18n: commit = commit *}
+     {* i18n: commitdiff = commitdiff *}
+     {* i18n: tree = tree *}
+     <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hashbase}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hashbase}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hashbase}">{$localize.tree}</a>
      <br />
-     <a href="{$SCRIPT_NAME}?p={$project}&a=blobdiff_plain&h={$hash}&hp={$hashparent}&f={$file}">plain</a>
+     {* i18n: plain = plain *}
+     <a href="{$SCRIPT_NAME}?p={$project}&a=blobdiff_plain&h={$hash}&hp={$hashparent}&f={$file}">{$localize.plain}</a>
    {else}
      <br /><br />
    {/if}
@@ -42,9 +52,13 @@
  <div class="page_body">
    <div class="diff_info">
      {* Display the from -> to diff header *}
-     blob:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$hashparent}&hb={$hashbase}&f={$file}">{if $file}a/{$file}{else}{$hashparent}{/if}</a> -&gt; blob:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$hash}&hb={$hashbase}&f={$file}">{if $file}b/{$file}{else}{$hash}{/if}</a>
+     {* i18n: blob = blob *}
+     {$localize.blob}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$hashparent}&hb={$hashbase}&f={$file}">{if $file}a/{$file}{else}{$hashparent}{/if}</a> -&gt; {$localize.blob}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$hash}&hb={$hashbase}&f={$file}">{if $file}b/{$file}{else}{$hash}{/if}</a>
    </div>
    {* Display the diff *}
    {include file='filediff.tpl'}
  </div>
 
+ {include file='footer.tpl'}
+
+

--- a/templates/commit.tpl
+++ b/templates/commit.tpl
@@ -5,9 +5,18 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  <div class="page_nav">
    {* Nav *}
-   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">log</a> | commit | {if $parent}<a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">commitdiff</a> | {/if}<a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}">tree</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: tree = tree *}
+   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">{$localize.log}</a> | {$localize.commit} | {if $parent}<a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">{$localize.commitdiff}</a> | {/if}<a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}">{$localize.tree}</a>
    <br /><br />
  </div>
  <div>
@@ -26,7 +35,8 @@
    {* Commit data *}
    <table cellspacing="0">
      <tr>
-       <td>author</td>
+       {* i18n: author = author *}
+       <td>{$localize.author}</td>
        <td>{$author}</td>
      </tr>
      <tr>
@@ -34,7 +44,8 @@
        <td> {$adrfc2822} ({if $adhourlocal < 6}<span class="latenight">{/if}{$adhourlocal}:{$adminutelocal}{if $adhourlocal < 6}</span>{/if} {$adtzlocal})</td>
      </tr>
      <tr>
-       <td>committer</td>
+       {* i18n: committer = committer *}
+       <td>{$localize.committer}</td>
        <td>{$committer}</td>
      </tr>
      <tr>
@@ -42,19 +53,26 @@
        <td> {$cdrfc2822} ({$cdhourlocal}:{$cdminutelocal} {$cdtzlocal})</td>
      </tr>
      <tr>
-       <td>commit</td>
+       {* i18n: commit = commit *}
+       <td>{$localize.commit}</td>
        <td class="monospace">{$id}</td>
      <tr>
      <tr>
-       <td>tree</td>
+       {* i18n: tree = tree *}
+       <td>{$localize.tree}</td>
        <td class="monospace"><a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}" class="list">{$tree}</a></td>
-       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}">tree</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$hash}">snapshot</a></td>
+       {* i18n: snapshot = snapshot *}
+       {* i18n: tree = tree *}
+       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}">{$localize.tree}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$hash}">{$localize.snapshot}</a></td>
      </tr>
      {foreach from=$parents item=par}
        <tr>
-         <td>parent</td>
+         {* i18n: parent = parent *}
+         <td>{$localize.parent}</td>
 	 <td class="monospace"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$par}" class="list">{$par}</a></td>
-         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$par}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}&hp={$par}">commitdiff</a></td>
+	 {* i18n: commit = commit *}
+	 {* i18n: commitdiff = commitdiff *}
+         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$par}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}&hp={$par}">{$localize.commitdiff}</a></td>
        </tr>
      {/foreach}
    </table>
@@ -66,7 +84,8 @@
  </div>
  <div class="list_head">
    {if $difftreesize > 11}
-     {$difftreesize} files changed:
+     {* i18n: fileschanged = %1$d files changed *}
+     {$localize.fileschanged|sprintf:$difftreesize}:
    {/if}
  </div>
  <table cellspacing="0">
@@ -76,12 +95,22 @@
 	 
        {if $difftreelines[difftree].status == "A"}
          <td><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}" class="list">{$difftreelines[difftree].file}</a></td>
-         <td><span class="newfile">[new {$difftreelines[difftree].to_filetype}{if $difftreelines[difftree].isreg} with mode: {$difftreelines[difftree].to_mode_cut}{/if}]</span></td>
-         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}">blob</a></td>
+	 {if $difftreelines[difftree].isreg}
+	   {* i18n: newobjectwithmode = new %1$s with mode: %2$s *}
+           <td><span class="newfile">[{$localize.newobjectwithmode|sprintf:$difftreelines[difftree].to_filetype_localized:$difftreelines[difftree].to_mode_cut}]</span></td>
+	 {else}
+	   {* i18n: newobject = new %1$s *}
+           <td><span class="newfile">[{$localize.newobject|sprintf:$difftreelines[difftree].to_filetype_localized}]</span></td>
+	 {/if}
+	 {* i18n: blob = blob *}
+         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}">{$localize.blob}</a></td>
        {elseif $difftreelines[difftree].status == "D"}
          <td><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}" class="list">{$difftreelines[difftree].file}</a></td>
-         <td><span class="deletedfile">[deleted {$difftreelines[difftree].from_filetype}]</span></td>
-         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}">blob</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=history&h={$hash}&f={$difftreelines[difftree].file}">history</a></td>
+	 {* i18n: deletedobject = deleted %1$s *}
+         <td><span class="deletedfile">[{$localize.deletedobject|sprintf:$difftreelines[difftree].from_filetype_localized}]</span></td>
+	 {* i18n: blob = blob *}
+	 {* i18n: history = history *}
+         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}">{$localize.blob}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=history&h={$hash}&f={$difftreelines[difftree].file}">{$localize.history}</a></td>
        {elseif $difftreelines[difftree].status == "M" || $difftreelines[difftree].status == "T"}
          <td>
            {if $difftreelines[difftree].to_id != $difftreelines[difftree].from_id}
@@ -90,16 +119,44 @@
              <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}" class="list">{$difftreelines[difftree].file}</a>
            {/if}
          </td>
-         <td>{if $difftreelines[difftree].from_mode != $difftreelines[difftree].to_mode} <span class="changedfile">[changed{$difftreelines[difftree].modechange}]</span>{/if}</td>
+         <td>
+	   {if $difftreelines[difftree].from_mode != $difftreelines[difftree].to_mode}
+	     <span class="changedfile">
+	       {if $difftreelines[difftree].typechange}
+	         {* i18n: changedobjecttype = changed from %1$s to %2$s *}
+	         [{$localize.changedobjecttype|sprintf:$difftreelines[difftree].from_filetype_localized:$difftreelines[difftree].to_filetype_localized}]
+	       {/if}
+	       {if $difftreelines[difftree].modechange}
+	         {* i18n: changedobjectmode = changed mode: %1$s *}
+	         [{$localize.changedobjectmode|sprintf:$difftreelines[difftree].modechange}]
+	       {/if}
+	     </span>
+	   {/if}
+	 </td>
          <td class="link">
-           <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}">blob</a>{if $difftreelines[difftree].to_id != $difftreelines[difftree].from_id} | <a href="{$SCRIPT_NAME}?p={$project}&a=blobdiff&h={$difftreelines[difftree].to_id}&hp={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}">diff</a>{/if} | <a href="{$SCRIPT_NAME}?p={$project}&a=history&h={$hash}&f={$difftreelines[difftree].file}">history</a></td>
+	   {* i18n: blob = blob *}
+	   {* i18n: diff = diff *}
+	   {* i18n: history = history *}
+           <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}">{$localize.blob}</a>{if $difftreelines[difftree].to_id != $difftreelines[difftree].from_id} | <a href="{$SCRIPT_NAME}?p={$project}&a=blobdiff&h={$difftreelines[difftree].to_id}&hp={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}">{$localize.diff}</a>{/if} | <a href="{$SCRIPT_NAME}?p={$project}&a=history&h={$hash}&f={$difftreelines[difftree].file}">{$localize.history}</a></td>
        {elseif $difftreelines[difftree].status == "R"}
          <td><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].to_file}" class="list">{$difftreelines[difftree].to_file}</a></td>
-         <td><span class="movedfile">[moved from <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].from_file}" class="list">{$difftreelines[difftree].from_file}</a> with {$difftreelines[difftree].similarity}% similarity{$difftreelines[difftree].simmodechg}]</span></td>
-         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].to_file}">blob</a>{if $difftreelines[difftree].to_id != $difftreelines[difftree].from_id} | <a href="{$SCRIPT_NAME}?p={$project}&a=blobdiff&h={$difftreelines[difftree].to_id}&hp={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].to_file}">diff</a>{/if}</td>
+	 {capture name='oldfile' assign='oldfile'}<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].from_file}" class="list">{$difftreelines[difftree].from_file}</a>{/capture}
+         {if $difftreelines[difftree].simmodechg}
+           {* i18n: movedobjectwithsimilaritymodechange = moved from %1$s with %2$d%% similarity, mode: %3$s *}
+           <td><span class="movedfile">[{$localize.movedobjectwithsimilaritymodechange|sprintf:$oldfile:$difftreelines[difftree].similarity:$difftreelines[difftree].simmodechg}]</span></td>
+	 {else}
+           {* i18n: movedobjectwithsimilarity = moved from %1$s with %2$d%% similarity *}
+           <td><span class="movedfile">[{$localize.movedobjectwithsimilarity|sprintf:$oldfile:$difftreelines[difftree].similarity}]</span></td>
+	 {/if}
+	 {* i18n: blob = blob *}
+	 {* i18n: diff = diff *}
+         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].to_file}">{$localize.blob}</a>{if $difftreelines[difftree].to_id != $difftreelines[difftree].from_id} | <a href="{$SCRIPT_NAME}?p={$project}&a=blobdiff&h={$difftreelines[difftree].to_id}&hp={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].to_file}">{$localize.diff}</a>{/if}</td>
        {/if}
 
      </tr>
    {/section}
  </table>
 
+ {include file='footer.tpl'}
+
+

--- a/templates/commitdiff.tpl
+++ b/templates/commitdiff.tpl
@@ -5,9 +5,19 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* Nav *}
  <div class="page_nav">
-   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">commit</a> | commitdiff | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}">tree</a><br /><a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff_plain&h={$hash}&hp={$hashparent}">plain</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: plain = plain *}
+   {* i18n: tree = tree *}
+   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">{$localize.commit}</a> | {$localize.commitdiff} | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}">{$localize.tree}</a><br /><a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff_plain&h={$hash}&hp={$hashparent}">{$localize.plain}</a>
  </div>
  <div>
    <br /><br />
@@ -24,16 +34,18 @@
    {section name=difftree loop=$difftreelines}
      {if $difftreelines[difftree].status == "A"}
        <div class="diff_info">
-         {$difftreelines[difftree].to_type}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}">{if $difftreelines[difftree].file}{$difftreelines[difftree].file}{else}{$difftreelines[difftree].to_id}{/if}</a>(new)
+         {* i18n: deleted = deleted *}
+         {$difftreelines[difftree].to_type_localized}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}">{if $difftreelines[difftree].file}{$difftreelines[difftree].file}{else}{$difftreelines[difftree].to_id}{/if}</a>({$localize.new})
        </div>
      {elseif $difftreelines[difftree].status == "D"}
        <div class="diff_info">
-         {$difftreelines[difftree].from_type}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}">{if $difftreelines[difftree].file}{$difftreelines[difftree].file}{else}{$difftreelines[difftree].from_id}{/if}</a>(deleted)
+         {* i18n: deleted = deleted *}
+         {$difftreelines[difftree].from_type_localized}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}">{if $difftreelines[difftree].file}{$difftreelines[difftree].file}{else}{$difftreelines[difftree].from_id}{/if}</a>({$localize.deleted})
        </div>
      {elseif $difftreelines[difftree].status == "M"}
        {if $difftreelines[difftree].from_id != $difftreelines[difftree].to_id}
          <div class="diff_info">
-	   {$difftreelines[difftree].from_type}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}">{if $difftreelines[difftree].file}a/{$difftreelines[difftree].file}{else}{$difftreelines[difftree].from_id}{/if}</a> -&gt; {$difftreelines[difftree].to_type}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}">{if $difftreelines[difftree].file}b/{$difftreelines[difftree].file}{else}{$difftreelines[difftree].to_id}{/if}</a>
+	   {$difftreelines[difftree].from_type_localized}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].from_id}&hb={$hash}&f={$difftreelines[difftree].file}">{if $difftreelines[difftree].file}a/{$difftreelines[difftree].file}{else}{$difftreelines[difftree].from_id}{/if}</a> -&gt; {$difftreelines[difftree].to_type_localized}:<a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$difftreelines[difftree].to_id}&hb={$hash}&f={$difftreelines[difftree].file}">{if $difftreelines[difftree].file}b/{$difftreelines[difftree].file}{else}{$difftreelines[difftree].to_id}{/if}</a>
 	 </div>
        {/if}
      {/if}
@@ -41,3 +53,6 @@
    {/section}
  </div>
 
+ {include file='footer.tpl'}
+
+

--- a/templates/footer.tpl
+++ b/templates/footer.tpl
@@ -5,17 +5,22 @@
  *
  *  Copyright (C) 2006 Christopher Han <xiphux@gmail.com>
  *}
-<div class="page_footer">
-{if $project}
-  {if $descr}
-    <div class="page_footer_text">{$descr}</div>
-  {/if}
-  <a href="{$SCRIPT_NAME}?p={$project}&a=rss" class="rss_logo">RSS</a>
-{else}
-  <a href="{$SCRIPT_NAME}?a=opml" class="rss_logo">OPML</a>
-  <a href="{$SCRIPT_NAME}?a=project_index" class="rss_logo">TXT</a>
-{/if}
-</div>
-</body>
+    <div class="page_footer">
+      {if $project}
+        {if $projectdescription}
+          <div class="page_footer_text">{$projectdescription}</div>
+        {/if}
+	{if $validproject}
+	  {* i18n: RSS = RSS *}
+          <a href="{$SCRIPT_NAME}?p={$project}&a=rss" class="rss_logo">{$localize.RSS}</a>
+	{/if}
+      {else}
+        {* i18n: OPML = OPML *}
+        <a href="{$SCRIPT_NAME}?a=opml" class="rss_logo">{$localize.OPML}</a>
+	{* i18n: TXT = TXT *}
+        <a href="{$SCRIPT_NAME}?a=project_index" class="rss_logo">{$localize.TXT}</a>
+      {/if}
+    </div>
+  </body>
 </html>
 

--- a/templates/header.tpl
+++ b/templates/header.tpl
@@ -5,48 +5,53 @@
  *
  *  Copyright (C) 2006 Christopher Han <xiphux@gmail.com>
  *}
-{* $contentType = strpos($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml') === false ? 'text/html' : 'application/xhtml+xml';
-header("Content-Type: $contentType; charset=utf-8"); *}
 <?xml version="1.0" encoding="utf-8"?>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-<!-- gitphp web interface {$version}, (C) 2006 Christopher Han <xiphux@gmail.com> -->
-<head>
-<title>{$title}</title>
-{if $rss_link}
-<link rel="alternate" title="{$project} log" href="{$SCRIPT_NAME}?p={$project}&a=rss" type="application/rss+xml" />
-{/if}
-<link rel="stylesheet" href="{$stylesheet}" type="text/css" />
-{$smarty.capture.header}
-</head>
-<body>
-<div class="page_header">
-<a href="http://www.kernel.org/pub/software/scm/git/docs/" title="git documentation">
-<img src="git-logo.png" width="72" height="27" alt="git" class="logo" />
-</a>
-<a href="index.php">projects</a> / 
-{if $project}
-  <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$project}</a>
-  {if $action}
-    / {$action}
-  {/if}
-  {if $enablesearch}
-<form method="get" action="index.php" enctype="application/x-www-form-urlencoded">
-<div class="search">
-<input type="hidden" name="p" value="{$project}" />
-<input type="hidden" name="a" value="search" />
-<input type="hidden" name="h" value="{if $hash}{$hash}{else}HEAD{/if}" />
-<select name="st">
-<option {if $searchtype == 'commit'}selected="selected"{/if} value="commit">commit</option>
-<option {if $searchtype == 'author'}selected="selected"{/if} value="author">author</option>
-<option {if $searchtype == 'committer'}selected="selected"{/if} value="committer">committer</option>
-{if $filesearch}
-<option {if $searchtype == 'file'}selected="selected"{/if} value="file">file</option>
-{/if}
-</select> search: <input type="text" name="s" {if $search}value="{$search}"{/if} />
-</div>
-</form>
-  {/if}
-{/if}
-</div>
+  <!-- gitphp web interface {$version}, (C) 2006 Christopher Han <xiphux@gmail.com> -->
+  <head>
+    <title>{$pagetitle}{if $project && $validproject} :: {$project}{if $action && $validaction}/{$localize.$action}{/if}{/if}</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+    {if $validproject}
+      <link rel="alternate" title="{$project} log" href="{$SCRIPT_NAME}?p={$project}&a=rss" type="application/rss+xml" />
+    {/if}
+    <link rel="stylesheet" href="{$stylesheet}" type="text/css" />
+    {$smarty.capture.header}
+  </head>
+  <body>
+    <div class="page_header">
+      <a href="http://www.kernel.org/pub/software/scm/git/docs/" title="git documentation">
+        <img src="git-logo.png" width="72" height="27" alt="git" class="logo" />
+      </a>
+      {* i18n: projects = projects *}
+      <a href="index.php">{$localize.projects}</a> / 
+      {if $project && $validproject}
+        <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$project}</a>
+        {if $action && $validaction}
+           / {$localize.$action}
+        {/if}
+        {if $enablesearch}
+          <form method="get" action="index.php" enctype="application/x-www-form-urlencoded">
+            <div class="search">
+              <input type="hidden" name="p" value="{$project}" />
+              <input type="hidden" name="a" value="search" />
+              <input type ="hidden" name="h" value="{if $currentsearchhash}{$currentsearchhash}{else}HEAD{/if}" />
+              <select name="st">
+	        {* i18n: commit = commit *}
+                <option {if $currentsearchtype == 'commit'}selected="selected"{/if} value="commit">{$localize.commit}</option>
+                {* i18n: author = author *}
+                <option {if $currentsearchtype == 'author'}selected="selected"{/if} value="author">{$localize.author}</option>
+                {* i18n: committer = committer *}
+                <option {if $currentsearchtype == 'committer'}selected="selected"{/if} value="committer">{$localize.committer}</option>
+                {if $filesearch}
+		  {* i18n: file = file *}
+                  <option {if $currentsearchtype == 'file'}selected="selected"{/if} value="file">{$localize.file}</option>
+                {/if}
+		{* i18n: search = search *}
+              </select> {$localize.search}: <input type="text" name="s" {if $currentsearch}value="{$currentsearch}"{/if} />
+            </div>
+          </form>
+        {/if}
+      {/if}
+    </div>
 

--- a/templates/heads.tpl
+++ b/templates/heads.tpl
@@ -1,13 +1,22 @@
 {*
- *  heads_nav.tpl
+ *  heads.tpl
  *  gitphp: A PHP git repository browser
  *  Component: Head view template
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* Nav *}
  <div class="page_nav">
-   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$head}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$head}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$head}">tree</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: tree = tree *}
+   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$head}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$head}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$head}">{$localize.tree}</a>
    <br /><br />
  </div>
  <div>
@@ -19,8 +28,14 @@
      <tr class="{cycle values="light,dark"}">
        <td><i>{$head.age}</i></td>
        <td><a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/heads/{$head.name}" class="list"><b>{$head.name}</b></a></td>
-       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/heads/{$head.name}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h=refs/heads/{$head.name}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h=refs/heads/{$head.name}&hb={$head.name}">tree</a></td>
+       {* i18n: shortlog = shortlog *}
+       {* i18n: log = log *}
+       {* i18n: tree = tree *}
+       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/heads/{$head.name}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h=refs/heads/{$head.name}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h=refs/heads/{$head.name}&hb={$head.name}">{$localize.tree}</a></td>
      </tr>
    {/foreach}
  </table>
 
+ {include file='footer.tpl'}
+
+

--- a/templates/history.tpl
+++ b/templates/history.tpl
@@ -5,9 +5,18 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* Page header *}
  <div class="page_nav">
-   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}">tree</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: tree = tree *}
+   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$tree}&hb={$hash}">{$localize.tree}</a>
    <br /><br />
  </div>
  <div>
@@ -37,9 +46,16 @@
        <td title="{$historylines[history].agestringage}"><i>{$historylines[history].agestringdate}</i></td>
        <td><i>{$historylines[history].authorname}</i></td>
        <td><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$historylines[history].commit}" class="list"><b>{$historylines[history].title}{if $historylines[history].commitref} <span class="tag">{$historylines[history].commitref}</span>{/if}</b></a></td>
-       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$historylines[history].commit}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$historylines[history].commit}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=blob&hb={$historylines[history].commit}&f={$historylines[history].file}">blob</a>{if $historylines[history].blob && $historylines[history].blobparent} | <a href="{$SCRIPT_NAME}?p={$project}&a=blobdiff&h={$historylines[history].blob}&hp={$historylines[history].blobparent}&hb={$historylines[history].commit}&f={$historylines[history].file}">diff to current</a>{/if}
+       {* i18n: difftocurrent = diff to current *}
+       {* i18n: blob = blob *}
+       {* i18n: commit = commit *}
+       {* i18n: commitdiff = commitdiff *}
+       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$historylines[history].commit}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$historylines[history].commit}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=blob&hb={$historylines[history].commit}&f={$historylines[history].file}">{$localize.blob}</a>{if $historylines[history].blob && $historylines[history].blobparent} | <a href="{$SCRIPT_NAME}?p={$project}&a=blobdiff&h={$historylines[history].blob}&hp={$historylines[history].blobparent}&hb={$historylines[history].commit}&f={$historylines[history].file}">{$localize.difftocurrent}</a>{/if}
        </td>
      </tr>
    {/section}
  </table>
 
+ {include file='footer.tpl'}
+
+

--- a/templates/log.tpl
+++ b/templates/log.tpl
@@ -5,26 +5,38 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* Nav *}
  <div class="page_nav">
-   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">shortlog</a> | log | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$hash}&hb={$hash}">tree</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: tree = tree *}
+   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">{$localize.shortlog}</a> | {$localize.log} | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$hash}&hb={$hash}">{$localize.tree}</a>
    <br />
+   {* i18n: HEAD = HEAD *}
    {if ($hash != $head) || $page}
-     <a href="{$SCRIPT_NAME}?p={$project}&a=log">HEAD</a>
+     <a href="{$SCRIPT_NAME}?p={$project}&a=log">{$localize.HEAD}</a>
    {else}
-     HEAD
+     {$localize.HEAD}
    {/if}
    &sdot; 
+   {* i18n: prev = prev *}
    {if $page > 0}
-     <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}&pg={$page-1}" accesskey="p" title="Alt-p">prev</a>
+     <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}&pg={$page-1}" accesskey="p" title="Alt-p">{$localize.prev}</a>
    {else}
-     prev
+     {$localize.prev}
    {/if}
    &sdot; 
+   {* i18n: next = next *}
    {if $revlistcount > 100}
-     <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}&pg={$page+1}" accesskey="n" title="Alt-n">next</a>
+     <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}&pg={$page+1}" accesskey="n" title="Alt-n">{$localize.next}</a>
    {else}
-     next
+     {$localize.next}
    {/if}
    <br />
  </div>
@@ -48,7 +60,10 @@
    </div>
    <div class="title_text">
      <div class="log_link">
-       <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$commitlines[log].commit}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$commitlines[log].commit}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$commitlines[log].commit}&hb={$commitlines[log].commit}">tree</a>
+       {* i18n: tree = tree *}
+       {* i18n: commit = commit *}
+       {* i18n: commitdiff = commitdiff *}
+       <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$commitlines[log].commit}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$commitlines[log].commit}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$commitlines[log].commit}&hb={$commitlines[log].commit}">{$localize.tree}</a>
        <br />
      </div>
      <i>{$commitlines[log].authorname} [{$commitlines[log].rfc2822}]</i><br />
@@ -63,3 +78,6 @@
    </div>
  {/section}
 
+ {include file='footer.tpl'}
+
+

--- a/templates/message.tpl
+++ b/templates/message.tpl
@@ -1,9 +1,18 @@
 {*
- *  error.tpl
+ *  message.tpl
  *  gitphp: A PHP git repository browser
- *  Component: Error message template
+ *  Component: Warning/error message template
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+{if $standalone}
+  {include file='header.tpl'}
+{/if}
+
 <div class="message {if $error}error{/if}">{$message}</div>
 
+{if $standalone}
+  {include file='footer.tpl'}
+{/if}
+

--- a/templates/project.tpl
+++ b/templates/project.tpl
@@ -5,20 +5,33 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* Nav *}
  <div class="page_nav">
-   summary | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$head}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$head}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree">tree</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: tree = tree *}
+   {$localize.summary} | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$head}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$head}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree">{$localize.tree}</a>
    <br /><br />
  </div>
  <div class="title">&nbsp;</div>
  {* Project brief *}
  <table cellspacing="0">
-   <tr><td>description</td><td>{$description}</td></tr>
-   <tr><td>owner</td><td>{$owner}</td></tr>
-   <tr><td>last change</td><td>{$lastchange}</td></tr>
+   {* i18n: description = description *}
+   {* i18n: owner = owner *}
+   {* i18n: lastchange = last change *}
+   <tr><td>{$localize.description}</td><td>{$description}</td></tr>
+   <tr><td>{$localize.owner}</td><td>{$owner}</td></tr>
+   <tr><td>{$localize.lastchange}</td><td>{$lastchange}</td></tr>
  </table>
  <div>
-   <a class="title" href="{$SCRIPT_NAME}?p={$project}&a=shortlog">shortlog</a>
+   {* i18n: shortlog = shortlog *}
+   <a class="title" href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.shortlog}</a>
  </div>
  <table cellspacing="0">
    {* Recent revisions *}
@@ -36,9 +49,13 @@
              {if $revlist[rev].commitref}
                <span class="tag">{$revlist[rev].commitref}</span>
              {/if}
-           </b>
+           </b></a>
          </td>
-         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$revlist[rev].commit}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$revlist[rev].commit}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$revlist[rev].commit}&hb={$revlist[rev].commit}">tree</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$revlist[rev].commit}">snapshot</a></td>
+	 {* i18n: snapshot = snapshot *}
+	 {* i18n: tree = tree *}
+	 {* i18n: commit = commit *}
+	 {* i18n: commitdiff = commitdiff *}
+         <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$revlist[rev].commit}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$revlist[rev].commit}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$revlist[rev].commit}&hb={$revlist[rev].commit}">{$localize.tree}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$revlist[rev].commit}">{$localize.snapshot}</a></td>
        </tr>
      {/if}
    {/section}
@@ -46,7 +63,8 @@
  {if $taglist}
    {* Tags *}
    <div>
-     <a href="{$SCRIPT_NAME}?p={$project}&a=tags" class="title">tags</a>
+     {* i18n: tags = tags *}
+     <a href="{$SCRIPT_NAME}?p={$project}&a=tags" class="title">{$localize.tags}</a>
    </div>
    <table cellspacing="0">
      {section name=tag max=17 loop=$taglist}
@@ -63,9 +81,13 @@
            </td>
            <td class="link">
              {if $taglist[tag].type == "tag"}
-   	       <a href="{$SCRIPT_NAME}?p={$project}&a=tag&h={$taglist[tag].id}">tag</a> | 
+	       {* i18n: tag = tag *}
+   	       <a href="{$SCRIPT_NAME}?p={$project}&a=tag&h={$taglist[tag].id}">{$localize.tag}</a> | 
              {/if}
-             <a href="{$SCRIPT_NAME}?p={$project}&a={$taglist[tag].reftype}&h={$taglist[tag].refid}">{$taglist[tag].reftype}</a>{if $taglist[tag].reftype == "commit"} | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/tags/{$taglist[tag].name}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h=refs/tags/{$taglist[tag].name}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$taglist[tag].refid}">snapshot</a>{/if}
+	     {* i18n: shortlog = shortlog *}
+	     {* i18n: log = log *}
+	     {* i18n: snapshot = snapshot *}
+             <a href="{$SCRIPT_NAME}?p={$project}&a={$taglist[tag].reftype}&h={$taglist[tag].refid}">{$taglist[tag].reftype_localized}</a>{if $taglist[tag].reftype == "commit"} | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/tags/{$taglist[tag].name}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h=refs/tags/{$taglist[tag].name}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$taglist[tag].refid}">{$localize.snapshot}</a>{/if}
            </td>
          {/if}
        </tr>
@@ -75,7 +97,8 @@
  {if $headlist}
    {* Heads *}
    <div>
-     <a href="{$SCRIPT_NAME}?p={$project}&a=heads" class="title">heads</a>
+     {* i18n: heads = heads *}
+     <a href="{$SCRIPT_NAME}?p={$project}&a=heads" class="title">{$localize.heads}</a>
    </div>
    <table cellspacing="0">
      {section name=head max=17 loop=$headlist}
@@ -85,10 +108,16 @@
          {else}
            <td><i>{$headlist[head].age}</i></td>
            <td><a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/heads/{$headlist[head].name}" class="list"><b>{$headlist[head].name}</b></td>
-           <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/heads/{$headlist[head].name}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h=refs/heads/{$headlist[head].name}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h=refs/heads/{$headlist[head].name}&hb={$headlist[head].name}">tree</a></td>
+	   {* i18n: shortlog = shortlog *}
+	   {* i18n: log = log *}
+	   {* i18n: tree = tree *}
+           <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/heads/{$headlist[head].name}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h=refs/heads/{$headlist[head].name}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h=refs/heads/{$headlist[head].name}&hb={$headlist[head].name}">{$localize.tree}</a></td>
          {/if}
        </tr>
      {/section}
    </table>
  {/if}
 
+ {include file='footer.tpl'}
+
+

--- a/templates/projectlist.tpl
+++ b/templates/projectlist.tpl
@@ -5,34 +5,44 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
-{if $errmsg}
+
+{include file='header.tpl'}
+
+{include file='hometext.tpl'}
+
+{if $message}
   {* Something is wrong; display an error message instead of trying to list *}
-  {$errmsg}
+  {include file='message.tpl'}
 {else}
   <table cellspacing="0">
     {* Header *}
     <tr>
+      {* i18n: headerproject = Project *}
       {if $order == "project"}
-        <th>Project</th>
+        <th>{$localize.headerproject}</th>
       {else}
-        <th><a class="header" href="{$SCRIPT_NAME}?o=project">Project</a></th>
+        <th><a class="header" href="{$SCRIPT_NAME}?o=project">{$localize.headerproject}</a></th>
       {/if}
+      {* i18n: headerdescription = Description *}
       {if $order == "descr"}
-        <th>Description</th>
+        <th>{$localize.headerdescription}</th>
       {else}
-        <th><a class="header" href="{$SCRIPT_NAME}?o=descr">Description</a></th>
+        <th><a class="header" href="{$SCRIPT_NAME}?o=descr">{$localize.headerdescription}</a></th>
       {/if}
+      {* i18n: headerowner = Owner *}
       {if $order == "owner"}
-        <th>Owner</th>
+        <th>{$localize.headerowner}</th>
       {else}
-        <th><a class="header" href="{$SCRIPT_NAME}?o=owner">Owner</a></th>
+        <th><a class="header" href="{$SCRIPT_NAME}?o=owner">{$localize.headerowner}</a></th>
       {/if}
+      {* i18n: headerlastchange = Last Change *}
       {if $order == "age"}
-        <th>Last Change</th>
+        <th>{$localize.headerlastchange}</th>
       {else}
-        <th><a class="header" href="{$SCRIPT_NAME}?o=age">Last Change</a></th>
+        <th><a class="header" href="{$SCRIPT_NAME}?o=age">{$localize.headerlastchange}</a></th>
       {/if}
-      <th>Actions</th>
+      {* i18n: headeractions = Actions *}
+      <th>{$localize.headeractions}</th>
     </tr>
 
     {if $categorizedprojects}
@@ -64,7 +74,12 @@
                 <i>{$plist[proj].age_string}</i>
               {/if}
             </td>
-            <td class="link"><a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=tree">tree</a> | <a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=snapshot&h=HEAD">snapshot</a></td>
+	    {* i18n: summary = summary *}
+	    {* i18n: shortlog = shortlog *}
+	    {* i18n: log = log *}
+	    {* i18n: snapshot = snapshot *}
+	    {* i18n: tree = tree *}
+            <td class="link"><a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=tree">{$localize.tree}</a> | <a href="{$SCRIPT_NAME}?p={$plist[proj].project}&a=snapshot&h=HEAD">{$localize.snapshot}</a></td>
           </tr>
         {/section}
       {/foreach}
@@ -88,7 +103,12 @@
               <i>{$projects[proj].age_string}</i>
             {/if}
           </td>
-          <td class="link"><a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=tree">tree</a> | <a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=snapshot&h=HEAD">snapshot</a></td>
+	  {* i18n: summary = summary *}
+	  {* i18n: shortlog = shortlog *}
+	  {* i18n: log = log *}
+	  {* i18n: snapshot = snapshot *}
+	  {* i18n: tree = tree *}
+          <td class="link"><a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=tree">{$localize.tree}</a> | <a href="{$SCRIPT_NAME}?p={$projects[proj].project}&a=snapshot&h=HEAD">{$localize.snapshot}</a></td>
         </tr>
       {/section}
 
@@ -97,3 +117,6 @@
   </table>
 {/if}
 
+{include file='footer.tpl'}
+
+

--- a/templates/search.tpl
+++ b/templates/search.tpl
@@ -5,26 +5,38 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+{include file='header.tpl'}
+
 {* Nav *}
 <div class="page_nav">
-  <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$treehash}&hb={$hash}">tree</a>
+  {* i18n: summary = summary *}
+  {* i18n: shortlog = shortlog *}
+  {* i18n: log = log *}
+  {* i18n: commit = commit *}
+  {* i18n: commitdiff = commitdiff *}
+  {* i18n: tree = tree *}
+  <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$treehash}&hb={$hash}">{$localize.tree}</a>
   <br />
+  {* i18n: first = first *}
   {if $page > 0}
-    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}">first</a>
+    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}">{$localize.first}</a>
   {else}
-    first
+    {$localize.first}
   {/if}
     &sdot; 
+  {* i18n: prev = prev *}
   {if $page > 0}
-    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}{if $page > 1}&pg={$page-1}{/if}" accesskey="p" title="Alt-p">prev</a>
+    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}{if $page > 1}&pg={$page-1}{/if}" accesskey="p" title="Alt-p">{$localize.prev}</a>
   {else}
-    prev
+    {$localize.prev}
   {/if}
     &sdot; 
+  {* i18n: next = next *}
   {if $revlistcount > 100}
-    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}&pg={$page+1}" accesskey="n" title="Alt-n">next</a>
+    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}&pg={$page+1}" accesskey="n" title="Alt-n">{$localize.next}</a>
   {else}
-    next
+    {$localize.next}
   {/if}
   <br />
 </div>
@@ -37,20 +49,28 @@
     <tr class="{cycle values="light,dark"}">
       <td title="{$commitlines[match].agestringage}"><i>{$commitlines[match].agestringdate}</i></td>
       <td><i>{$commitlines[match].authorname}</i></td>
-      <td><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$commitlines[match].commit}" class="list" {if $title}title="{$commitlines[match].title}"{/if}><b>{$commitlines[match].title_short}</b>
+      <td><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$commitlines[match].commit}" class="list" {if $title}title="{$commitlines[match].title}"{/if}><b>{$commitlines[match].title_short}</b></a>
         {foreach from=$commitlines[match].matches item=line name=match}
           {if $smarty.foreach.match.first}<br />{/if}{$line}<br />
         {/foreach}
       </td>
-      <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$commitlines[match].commit}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$commitlines[match].commit}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$commitlines[match].committree}&hb={$commitlines[match].commit}">tree</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$commitlines[match].commit}">snapshot</a>
+      {* i18n: snapshot = snapshot *}
+      {* i18n: tree = tree *}
+      {* i18n: commit = commit *}
+      {* i18n: commitdiff = commitdiff *}
+      <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$commitlines[match].commit}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$commitlines[match].commit}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$commitlines[match].committree}&hb={$commitlines[match].commit}">{$localize.tree}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$commitlines[match].commit}">{$localize.snapshot}</a>
       </td>
     </tr>
   {/section}
 
   {if $revlistcount > 100}
     <tr>
-      <td><a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}&pg={$page+1}" title="Alt-n">next</a></td>
+      {* i18n: next = next *}
+      <td><a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}&pg={$page+1}" title="Alt-n">{$localize.next}</a></td>
     </tr>
   {/if}
 </table>
 
+{include file='footer.tpl'}
+
+

--- a/templates/searchfiles.tpl
+++ b/templates/searchfiles.tpl
@@ -5,26 +5,38 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+{include file='header.tpl'}
+
 {* Nav *}
 <div class="page_nav">
-  <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$treehash}&hb={$hash}">tree</a>
+  {* i18n: summary = summary *}
+  {* i18n: shortlog = shortlog *}
+  {* i18n: log = log *}
+  {* i18n: commit = commit *}
+  {* i18n: commitdiff = commitdiff *}
+  {* i18n: tree = tree *}
+  <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$treehash}&hb={$hash}">{$localize.tree}</a>
   <br />
+  {* i18n: first = first *}
   {if $page > 0}
-    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}">first</a>
+    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}">{$localize.first}</a>
   {else}
-    first
+    {$localize.first}
   {/if}
     &sdot; 
+  {* i18n: prev = prev *}
   {if $page > 0}
-    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}{if $page > 1}&pg={$page-1}{/if}" accesskey="p" title="Alt-p">prev</a>
+    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}{if $page > 1}&pg={$page-1}{/if}" accesskey="p" title="Alt-p">{$localize.prev}</a>
   {else}
-    prev
+    {$localize.prev}
   {/if}
     &sdot; 
+  {* i18n: next = next *}
   {if $filesearchcount > 100}
-    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}&pg={$page+1}" accesskey="n" title="Alt-n">next</a>
+    <a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}&pg={$page+1}" accesskey="n" title="Alt-n">{$localize.next}</a>
   {else}
-    next
+    {$localize.next}
   {/if}
   <br />
 </div>
@@ -47,9 +59,12 @@
       </td>
       <td class="link">
         {if $filesearchlines[match].tree}
-          <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$filesearchlines[match].hash}&hb={$hash}&f={$filesearchlines[match].file}">tree</a>
+	  {* i18n: tree = tree *}
+          <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$filesearchlines[match].hash}&hb={$hash}&f={$filesearchlines[match].file}">{$localize.tree}</a>
         {else}
-          <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$filesearchlines[match].hash}&hb={$hash}&f={$filesearchlines[match].file}">blob</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=history&h={$hash}&f={$filesearchlines[match].file}">history</a>
+	  {* i18n: blob = blob *}
+	  {* i18n: history = history *}
+          <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$filesearchlines[match].hash}&hb={$hash}&f={$filesearchlines[match].file}">{$localize.blob}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=history&h={$hash}&f={$filesearchlines[match].file}">{$localize.history}</a>
         {/if}
       </td>
     </tr>
@@ -57,8 +72,12 @@
 
   {if $filesearchcount > 100}
     <tr>
-      <td><a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}&pg={$page+1}" title="Alt-n">next</a></td>
+      {* i18n: next = next *}
+      <td><a href="{$SCRIPT_NAME}?p={$project}&a=search&h={$hash}&s={$search}&st={$searchtype}&pg={$page+1}" title="Alt-n">{$localize.next}</a></td>
     </tr>
   {/if}
 </table>
 
+{include file='footer.tpl'}
+
+

--- a/templates/shortlog.tpl
+++ b/templates/shortlog.tpl
@@ -5,26 +5,38 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* Nav *}
  <div class="page_nav">
-   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | shortlog | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$hash}&hb={$hash}">tree</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: tree = tree *}
+   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | {$localize.shortlog} | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hash}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hash}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hash}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$hash}&hb={$hash}">{$localize.tree}</a>
    <br />
+   {* i18n: HEAD = HEAD *}
    {if ($hash != $head) || $page}
-     <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">HEAD</a>
+     <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.HEAD}</a>
    {else}
-     HEAD
+     {$localize.HEAD}
    {/if}
      &sdot; 
+   {* i18n: prev = prev *}
    {if $page > 0}
-     <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}&pg={$page-1}" accesskey="p" title="Alt-p">prev</a>
+     <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}&pg={$page-1}" accesskey="p" title="Alt-p">{$localize.prev}</a>
    {else}
-     prev
+     {$localize.prev}
    {/if}
      &sdot; 
+   {* i18n: next = next *}
    {if $revlistcount > 100}
-     <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}&pg={$page+1}" accesskey="n" title="Alt-n">next</a>
+     <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}&pg={$page+1}" accesskey="n" title="Alt-n">{$localize.next}</a>
    {else}
-     next
+     {$localize.next}
    {/if}
    <br />
  </div>
@@ -42,17 +54,25 @@
          {if $commitlines[log].commitref}
            <span class="tag">{$commitlines[log].commitref}</span>
          {/if}
-         </b>
+         </b></a>
        </td>
-       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$commitlines[log].commit}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$commitlines[log].commit}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$commitlines[log].commit}&hb={$commitlines[log].commit}">tree</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$commitlines[log].commit}">snapshot</a>
+       {* i18n: snapshot = snapshot *}
+       {* i18n: commit = commit *}
+       {* i18n: commitdiff = commitdiff *}
+       {* i18n: tree = tree *}
+       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$commitlines[log].commit}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$commitlines[log].commit}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$commitlines[log].commit}&hb={$commitlines[log].commit}">{$localize.tree}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$commitlines[log].commit}">{$localize.snapshot}</a>
        </td>
      </tr>
    {/section}
 
    {if $revlistcount > 100}
      <tr>
-       <td><a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}&pg={$page+1}" title="Alt-n">next</a></td>
+       {* i18n: next = next *}
+       <td><a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hash}&pg={$page+1}" title="Alt-n">{$localize.next}</a></td>
      </tr>
    {/if}
  </table>
 
+ {include file='footer.tpl'}
+
+

--- a/templates/tag.tpl
+++ b/templates/tag.tpl
@@ -5,9 +5,18 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* Nav *}
  <div class="page_nav">
-   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$head}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$head}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$head}">tree</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: tree = tree *}
+   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$head}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$head}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$head}">{$localize.tree}</a>
    <br /><br />
  </div>
  {* Tag data *}
@@ -17,13 +26,15 @@
  <div class="title_text">
    <table cellspacing="0">
      <tr>
-       <td>object</td>
+       {* i18n: object = object *}
+       <td>{$localize.object}</td>
        <td class="monospace"><a href="{$SCRIPT_NAME}?p={$project}&a={$tag.type}&h={$tag.object}" class="list">{$tag.object}</a></td>
-       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a={$tag.type}&h={$tag.object}">{$tag.type}</a></td>
+       <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a={$tag.type}&h={$tag.object}">{$tag.type_localized}</a></td>
      </tr>
      {if $tag.author}
        <tr>
-         <td>author</td>
+         {* i18n: author = author *}
+         <td>{$localize.author}</td>
 	 <td>{$tag.author}</td>
        </tr>
        <tr>
@@ -40,3 +51,6 @@
    {/foreach}
  </div>
 
+ {include file='footer.tpl'}
+
+

--- a/templates/tags.tpl
+++ b/templates/tags.tpl
@@ -5,9 +5,18 @@
  *
  *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
  *}
+
+ {include file='header.tpl'}
+
  {* Nav *}
  <div class="page_nav">
-   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$head}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$head}">commitdiff</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$head}">tree</a>
+   {* i18n: summary = summary *}
+   {* i18n: shortlog = shortlog *}
+   {* i18n: log = log *}
+   {* i18n: commit = commit *}
+   {* i18n: commitdiff = commitdiff *}
+   {* i18n: tree = tree *}
+   <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$head}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$head}">{$localize.commitdiff}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$head}">{$localize.tree}</a>
    <br /><br />
  </div>
  <div>
@@ -26,14 +35,21 @@
        </td>
        <td class="link">
          {if $taglist[tag].type == "tag"}
-	   <a href="{$SCRIPT_NAME}?p={$project}&a=tag&h={$taglist[tag].id}">tag</a> | 
+	   {* i18n: tag = tag *}
+	   <a href="{$SCRIPT_NAME}?p={$project}&a=tag&h={$taglist[tag].id}">{$localize.tag}</a> | 
 	 {/if}
-	 <a href="{$SCRIPT_NAME}?p={$project}&a={$taglist[tag].reftype}&h={$taglist[tag].refid}">{$taglist[tag].reftype}</a>
+	 <a href="{$SCRIPT_NAME}?p={$project}&a={$taglist[tag].reftype}&h={$taglist[tag].refid}">{$taglist[tag].reftype_localized}</a>
 	 {if $taglist[tag].reftype == "commit"}
-	   | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/tags/{$taglist[tag].name}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h=refs/tags/{$taglist[tag].name}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$taglist[tag].refid}">snapshot</a>
+	   {* i18n: shortlog = shortlog *}
+	   {* i18n: log = log *}
+	   {* i18n: snapshot = snapshot *}
+	   | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h=refs/tags/{$taglist[tag].name}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h=refs/tags/{$taglist[tag].name}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=snapshot&h={$taglist[tag].refid}">{$localize.snapshot}</a>
 	 {/if}
        </td>
      </tr>
    {/section}
  </table>
 
+ {include file='footer.tpl'}
+
+

--- /dev/null
+++ b/templates/tree.tpl
@@ -1,1 +1,73 @@
+{*
+ *  tree.tpl
+ *  gitphp: A PHP git repository browser
+ *  Component: Tree view template
+ *
+ *  Copyright (C) 2009 Christopher Han <xiphux@gmail.com>
+ *}
 
+ {include file='header.tpl'}
+
+ {* Nav *}
+ {if $fullnav}
+   <div class="page_nav">
+     {* i18n: summary = summary *}
+     {* i18n: shortlog = shortlog *}
+     {* i18n: log = log *}
+     {* i18n: commit = commit *}
+     {* i18n: commitdiff = commitdiff *}
+     {* i18n: tree = tree *}
+     <a href="{$SCRIPT_NAME}?p={$project}&a=summary">{$localize.summary}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hashbase}">{$localize.shortlog}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hashbase}">{$localize.log}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hashbase}">{$localize.commit}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hashbase}">{$localize.commitdiff}</a> | {$localize.tree}<br /><br />
+   </div>
+   <div>
+     <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hashbase}" class="title">{$title}
+       {if $hashbaseref}
+         <span class="tag">{$hashbaseref}</span>
+       {/if}
+     </a>
+   </div>
+ {else}
+   <div class="page_nav"><br /><br /></div>
+   <div class="title">{$hash}</div>
+ {/if}
+ {* Path *}
+ <div class="page_path">
+   <b>
+     <a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$hashbase}&h={$hashbase}">[{$project}]</a> / 
+     {foreach from=$paths item=path}
+       <a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$hashbase}&h={$path.tree}&f={$path.full}">{$path.short}</a> / 
+     {/foreach}
+   </b>
+ </div>
+ <div class="page_body">
+   {* List files *}
+   <table cellspacing="0">
+     {section name=tree loop=$treelines}
+       <tr class="{cycle values="light,dark"}">
+         <td class="monospace">{$treelines[tree].filemode}</td>
+         {if $treelines[tree].type == "blob"}
+           <td class="list">
+             <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$treelines[tree].hash}{if $hashbase}&hb={$hashbase}{/if}&f={if $base}{$base}{/if}{$treelines[tree].name}" class="list">{$treelines[tree].name}</a>
+	   </td>
+           <td class="link">
+	     {* i18n: blob = blob *}
+	     {* i18n: history = history *}
+	     <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$treelines[tree].hash}{if $hashbase}&hb={$hashbase}{/if}&f={if $base}{$base}{/if}{$treelines[tree].name}">{$localize.blob}</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=history&h={$hashbase}&f={if $base}{$base}{/if}{$treelines[tree].name}">{$localize.history}</a>
+	   </td>
+         {elseif $treelines[tree].type == "tree"}
+           <td class="list">
+             <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$treelines[tree].hash}{if $hashbase}&hb={$hashbase}{/if}&f={if $base}{$base}{/if}{$treelines[tree].name}">{$treelines[tree].name}</a>
+	   </td>
+           <td class="link">
+	     {* i18n: tree = tree *}
+	     <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$treelines[tree].hash}{if $hashbase}&hb={$hashbase}{/if}&f={if $base}{$base}{/if}{$treelines[tree].name}">{$localize.tree}</a>
+	   </td>
+         {/if}
+       </tr>
+     {/section}
+   </table>
+ </div>
+
+ {include file='footer.tpl'}
+
+

--- a/templates/tree_emptynav.tpl
+++ /dev/null
@@ -1,10 +1,1 @@
-{*
- *  tree_emptynav.tpl
- *  gitphp: A PHP git repository browser
- *  Component: Tree view emptynav template
- *
- *  Copyright (C) 2006 Christopher Han <xiphux@gmail.com>
- *}
- <div class="page_nav"><br /><br /></div>
- <div class="title">{$hash}</div>
 

--- a/templates/tree_filelist_footer.tpl
+++ /dev/null
@@ -1,10 +1,1 @@
-{*
- *  tree_filelist_footer.tpl
- *  gitphp: A PHP git repository browser
- *  Component: Tree view filelist footer template
- *
- *  Copyright (C) 2006 Christopher Han <xiphux@gmail.com>
- *}
- </table>
- </div>
 

--- a/templates/tree_filelist_header.tpl
+++ /dev/null
@@ -1,11 +1,1 @@
-{*
- *  tree_filelist_header.tpl
- *  gitphp: A PHP git repository browser
- *  Component: Tree view filelist header template
- *
- *  Copyright (C) 2006 Christopher Han <xiphux@gmail.com>
- *}
- <div class="page_path"><b><a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$hashbase}&h={$hashbase}">[{$project}]</a> / {foreach from=$paths item=path}<a href="{$SCRIPT_NAME}?p={$project}&a=tree&hb={$hashbase}&h={$path.tree}&f={$path.full}">{$path.short}</a> / {/foreach}</b></div>
- <div class="page_body">
- <table cellspacing="0">
 

--- a/templates/tree_filelist_item.tpl
+++ /dev/null
@@ -1,20 +1,1 @@
-{*
- *  tree_filelist_item.tpl
- *  gitphp: A PHP git repository browser
- *  Component: Tree view filelist item template
- *
- *  Copyright (C) 2006 Christopher Han <xiphux@gmail.com>
- *}
- <tr class="{$class}">
- <td class="monospace">{$filemode}</td>
- <td class="list">
- {if $type == "blob"}
- <a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$hash}{if $hashbase}&hb={$hashbase}{/if}&f={if $base}{$base}{/if}{$name}" class="list">{$name}</a></td>
- <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=blob&h={$hash}{if $hashbase}&hb={$hashbase}{/if}&f={if $base}{$base}{/if}{$name}">blob</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=history&h={$hashbase}&f={if $base}{$base}{/if}{$name}">history</a>
- {elseif $type == "tree"}
-   <a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$hash}{if $hashbase}&hb={$hashbase}{/if}&f={if $base}{$base}{/if}{$name}">{$name}</a></td>
-   <td class="link"><a href="{$SCRIPT_NAME}?p={$project}&a=tree&h={$hash}{if $hashbase}&hb={$hashbase}{/if}&f={if $base}{$base}{/if}{$name}">tree</a>
- {/if}
- </td>
- </tr>
 

file:a/templates/tree_nav.tpl (deleted)
--- a/templates/tree_nav.tpl
+++ /dev/null
@@ -1,15 +1,1 @@
-{*
- *  tree_nav.tpl
- *  gitphp: A PHP git repository browser
- *  Component: Tree view nav template
- *
- *  Copyright (C) 2006 Christopher Han <xiphux@gmail.com>
- *}
- <div class="page_nav"><a href="{$SCRIPT_NAME}?p={$project}&a=summary">summary</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=shortlog&h={$hashbase}">shortlog</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=log&h={$hashbase}">log</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hashbase}">commit</a> | <a href="{$SCRIPT_NAME}?p={$project}&a=commitdiff&h={$hashbase}">commitdiff</a> | tree<br /><br />
- </div>
- <div><a href="{$SCRIPT_NAME}?p={$project}&a=commit&h={$hashbase}" class="title">{$title}
- {if $hashbaseref}
- <span class="tag">{$hashbaseref}</span>
- {/if}
- </a></div>
 

comments