[217261]  and [219091]
diff --git a/babel-setup.sql b/babel-setup.sql
index 73f7c3c..b01d0f4 100644
--- a/babel-setup.sql
+++ b/babel-setup.sql
@@ -27,6 +27,16 @@
   PRIMARY KEY  (`event_id`)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
+DROP TABLE IF EXISTS `file_progress`;
+CREATE TABLE `file_progress` (
+  `file_id` int(10) unsigned NOT NULL,
+  `language_id` smallint(5) unsigned NOT NULL,
+  `pct_complete` float NOT NULL,
+  PRIMARY KEY  (`file_id`, `language_id`),
+  CONSTRAINT `file_progress_ibfk_1` FOREIGN KEY (`file_id`) REFERENCES `files` (`file_id`) ON UPDATE CASCADE ON DELETE CASCADE,
+    CONSTRAINT `file_progress_ibfk_2` FOREIGN KEY (`language_id`) REFERENCES `languages` (`language_id`) ON UPDATE CASCADE ON DELETE CASCADE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
 DROP TABLE IF EXISTS `files`;
 CREATE TABLE `files` (
   `file_id` int(10) unsigned NOT NULL auto_increment,
@@ -38,7 +48,6 @@
   KEY `project_id` (`project_id`),
   CONSTRAINT `files_ibfk_1` FOREIGN KEY (`project_id`,`version`) REFERENCES `project_versions` (`project_id`,`version`) ON UPDATE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-
 --
 -- Table structure for table `languages`
 --
@@ -228,13 +237,34 @@
   CONSTRAINT `translations_ibfk_3` FOREIGN KEY (`userid`) REFERENCES `users` (`userid`) ON UPDATE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-/*!50003 SET @OLD_SQL_MODE=@@SQL_MODE*/;
+SET @OLD_SQL_MODE=@@SQL_MODE;
 DELIMITER ;;
 /*!50003 SET SESSION SQL_MODE="" */;;
-/*!50003 CREATE TRIGGER `ins_version` BEFORE INSERT ON `translations` FOR EACH ROW SET NEW.version = 
-    (SELECT IFNULL(MAX(version),0)+1 FROM translations 
-        WHERE string_id = NEW.string_id and language_id = NEW.language_id) */;;
+DROP TRIGGER `ins_version`;;
 
+/* This trigger sets the version to max(version) + 1.  It also updates the file_progress table  */
+/* (COUNT(t.string_id) + 1) because it's a BEFORE INSERT trigger, the translated str is not in the DB yet  */
+/* and without the +1 the percent would always be "one behind"  */   
+CREATE TRIGGER `ins_version` BEFORE INSERT ON `translations` FOR EACH ROW BEGIN
+  SET NEW.version = 
+    (SELECT IFNULL(MAX(version),0)+1 FROM translations 
+        WHERE string_id = NEW.string_id and language_id = NEW.language_id);
+        
+  DELETE FROM file_progress where file_id = (SELECT file_id FROM strings WHERE string_id = NEW.string_id)
+   AND language_id = NEW.language_id;
+ 
+ INSERT INTO file_progress SET file_id = (SELECT file_id FROM strings WHERE string_id = NEW.string_id),
+   language_id = NEW.language_id,
+   pct_complete = (
+     SELECT IF(COUNT(s.string_id) > 0, (COUNT(t.string_id) + 1)/COUNT(s.string_id)*100,0) AS translate_percent
+       FROM files AS f
+         LEFT JOIN strings AS s ON s.file_id = f.file_id
+         LEFT JOIN translations AS t ON (s.string_id = t.string_id 
+           AND t.language_id = NEW.language_id AND t.is_active = 1)
+       WHERE f.file_id = (SELECT file_id FROM strings WHERE string_id = NEW.string_id)
+    ); 
+END;
+;;
 DELIMITER ;
 /*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE */;
 
@@ -342,4 +372,4 @@
 insert into map_files values ("eclipse", "3.4", "text.map", "http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.releng/maps/text.map?view=co", 1);
 insert into map_files values ("eclipse", "3.4", "ui.map", "http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.releng/maps/ui.map?view=co", 1);
 insert into map_files values ("eclipse", "3.4", "update.map", "http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.releng/maps/update.map?view=co", 1);
-insert into map_files values ("eclipse", "3.4", "userassist.map", "http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.releng/maps/userassist.map?view=co", 1);
\ No newline at end of file
+insert into map_files values ("eclipse", "3.4", "userassist.map", "http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.releng/maps/userassist.map?view=co", 1);
diff --git a/html/callback/getFilesForProject.php b/html/callback/getFilesForProject.php
index 84b1eb7..f24ad31 100644
--- a/html/callback/getFilesForProject.php
+++ b/html/callback/getFilesForProject.php
@@ -19,33 +19,37 @@
 	return $return; 
 }
 
-$query = "select 
-			DISTINCT files.name
-		  from 
-		  	project_versions,
-		  	files
-		  where 
-		  	files.project_id = project_versions.project_id
-		  and
-		  	files.version = project_versions.version
-		  and
-		  	project_versions.is_active = 1 
-		  and 
-		  	project_versions.project_id = '".addslashes($_SESSION['project'])."'
-		  and
-		  	files.version = '".addslashes($_SESSION['version'])."'
-		  order by
-		  	files.name
-		  	";
+if(isset($_SESSION['language'])) {
+		$language =  $_SESSION['language'];
+}
 
-//print $query."\n";
+$query = "SELECT 
+        f.name, 
+        IF(ISNULL(pct_complete),0,pct_complete) AS pct_complete
+FROM
+        files AS f
+        LEFT JOIN project_versions AS v ON v.project_id = f.project_id 
+        AND v.version = f.version
+        LEFT JOIN file_progress as p ON p.file_id = f.file_id
+          AND p.language_id = '" . addslashes($language) . "'
+WHERE
+        v.is_active = 1 
+        AND v.project_id = '".addslashes($_SESSION['project'])."'
+        AND f.version = '".addslashes($_SESSION['version'])."'
+        GROUP BY f.name
+        ORDER BY pct_complete, f.name";
+
+# print $query."\n";
 
 $res = mysql_query($query,$dbh);
 
 
 while($line = mysql_fetch_array($res, MYSQL_ASSOC)){
 	$ret = Array();
+	
 	$ret['name'] = $line['name'];
+	$ret['pct'] = $line['pct_complete'];
+	
 	
 	if(isset($_SESSION['file']) and $line['name'] == $_SESSION['file']){
 		$ret['current'] = true;
diff --git a/html/js/files.js b/html/js/files.js
index b9a737c..1630052 100644
--- a/html/js/files.js
+++ b/html/js/files.js
@@ -62,6 +62,7 @@
 
 function afile(dataIn){
 	this.filename = dataIn['name'];
+	this.pct = dataIn['pct'];
 	afile.superclass.constructor.call();
 	this.initSelectable();
 }
@@ -90,7 +91,11 @@
 }
 afile.prototype.createHTML = function(){
 	this.domElem = document.createElement("li");
-	this.domElem.innerHTML = this.filename;
+	var filename_display = this.filename;
+	if(filename_display.length > 100) {
+		filename_display = filename_display.substr(0,35) + "(...)" + filename_display.substr(filename_display.length - 50); 
+	}
+	this.domElem.innerHTML = filename_display + " (" + (this.pct > 0 ? new Number(this.pct).toFixed(1) : 0) + "%)";
 	this.addEvents();
 	return this.domElem;
 }