[Pkg-mozext-commits] [perspectives-extension] 03/72: added some localizations. Fixes #58.

David Prévot taffit at moszumanska.debian.org
Thu Dec 11 02:12:44 UTC 2014


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

taffit pushed a commit to branch master
in repository perspectives-extension.

commit 885b6e74efd008baebb87a165b9a0427248cb26e
Author: Gerold Meisinger <gerold.meisinger at gmail.com>
Date:   Sun Jun 15 15:55:56 2014 +0100

    added some localizations. Fixes #58.
    
    added in localizations: updateDefaultListFileError, updateDefaultListWebError, loadingCreditsError, removeFromWhitelistQuestion, trustedButInsecureEmbedded, trustedWeaklyButInsecureEmbedded, trustedMultipleByBrowser, untrustedMultipleNotSeen, untrustedMultipleNotVerifiable
    changed in de localization: translated new localizations, fix some grammar
    changed in en localization: added some periods
---
 plugin/chrome/content/about.js                 |  12 +-
 plugin/chrome/content/common.js                | 179 +++++++++++++------------
 plugin/chrome/content/notaries.js              | 145 ++++++++++----------
 plugin/chrome/content/results_dialog.js        |  55 ++++----
 plugin/chrome/content/whitelist_dialog.js      | 165 ++++++++++++-----------
 plugin/chrome/content/xml_notary_client.js     | 140 +++++++++----------
 plugin/chrome/locale/de/notaries.properties    |  48 ++++---
 plugin/chrome/locale/en-US/notaries.properties |  61 +++++----
 plugin/chrome/locale/es-MX/notaries.properties |  17 ++-
 plugin/chrome/locale/fi/notaries.properties    |  17 ++-
 plugin/chrome/locale/fr/notaries.properties    |  15 +++
 plugin/chrome/locale/nl/notaries.properties    |  15 +++
 plugin/chrome/locale/pl/notaries.properties    |  15 +++
 plugin/chrome/locale/zh-CN/notaries.properties |  17 ++-
 14 files changed, 512 insertions(+), 389 deletions(-)

diff --git a/plugin/chrome/content/about.js b/plugin/chrome/content/about.js
index 6f8fbc0..0034480 100644
--- a/plugin/chrome/content/about.js
+++ b/plugin/chrome/content/about.js
@@ -28,9 +28,7 @@ var Pers_about = {
 	},
 
 	load_about_dialog: function() {
-
 		try {
-
 			var version = "?";
 
 			try {
@@ -48,13 +46,17 @@ var Pers_about = {
 			}
 
 			var contributors = Pers_util.readFileFromURI("chrome://perspectives/content/credits/contributors.txt");
-			var translators = Pers_util.readFileFromURI("chrome://perspectives/content/credits/translators.txt");
+			var translators  = Pers_util.readFileFromURI("chrome://perspectives/content/credits/translators.txt");
 
 			document.getElementById("contributors-list").value = contributors;
 			document.getElementById("translators-list").value = translators;
 		} catch(e) {
-			Pers_util.pers_alert("Error loading credits:" + e); //TODO: extract for localization
+			if(Perspectives.strbundle == null) {
+				Perspectives.strbundle = document.getElementById("notary_strings");
+			}
+
+			Pers_util.pers_alert(Perspectives.strbundle.
+				getFormattedString("loadingCreditsError", [e]));
 		}
 	}
 }
-
diff --git a/plugin/chrome/content/common.js b/plugin/chrome/content/common.js
index 340e4d7..22d0fb3 100644
--- a/plugin/chrome/content/common.js
+++ b/plugin/chrome/content/common.js
@@ -20,41 +20,41 @@
 var Pers_debug = {
 	d_print_all : false,
 
-	d_print_flags : { 
-		"policy" : false, 
+	d_print_flags : {
+		"policy" : false,
 		"query" : false,
 		"querylarge": false, //big response strings and XML; separating this from query lines makes for easier debugging
-		"main" : false,  
-		"error" :  false 
+		"main" : false,
+		"error" :  false
 	},
 
 	d_print: function(flag,line) {
-		if(!Pers_debug.d_print_flags[flag] && !Pers_debug.d_print_all) { 
-			return; 
-		} 
+		if(!Pers_debug.d_print_flags[flag] && !Pers_debug.d_print_all) {
+			return;
+		}
 		line = "Perspectives: " + line;
-		dump(line); 
-		try { 
+		dump(line);
+		try {
 			Firebug.Console.log(line); // this line works in extensions
-		} catch(e) { 
-			/* ignore, this will blow up if Firebug is not installed */  
+		} catch(e) {
+			/* ignore, this will blow up if Firebug is not installed */
 		}
-		try { 
+		try {
 			console.log(line); // this line works in HTML files
-		} catch(e) { 
-			/* ignore, this will blow up if Firebug is not installed */  
+		} catch(e) {
+			/* ignore, this will blow up if Firebug is not installed */
 		}
 	}
 }
 
 var Pers_util = {
-	get_unix_time: function() { 
+	get_unix_time: function() {
 		var unixtime_ms = (new Date()).getTime(); // Returns milliseconds since the epoch
 		return parseInt(unixtime_ms / 1000);
 	},
 
 	SEC2DAY: function(sec) { return sec / (3600 * 24); },
-	DAY2SEC: function(day) { return day * (3600 * 24); }, 
+	DAY2SEC: function(day) { return day * (3600 * 24); },
 
 	// stolen from: http://forums.mozillazine.org/viewtopic.php?p=921150
 	readFileFromURI: function(uri){
@@ -72,20 +72,20 @@ var Pers_util = {
   		return str;
 	},
 
-	loadNotaryListFromURI: function(uri) { 
+	loadNotaryListFromURI: function(uri) {
 		return this.loadNotaryListFromString(this.readFileFromURI(uri));
-	}, 
- 
-	loadNotaryListFromString: function(str_data) { 
-		var start_arr = str_data.split("\n"); 
-		var filtered_arr = []; 
+	},
+
+	loadNotaryListFromString: function(str_data) {
+		var start_arr = str_data.split("\n");
+		var filtered_arr = [];
 		// the Perspectives object isn't always loaded here, so use our own
 		// to make sure it exists.
 		if(Pers_util.notarystr == null) {
 			Pers_util.notarystr = document.getElementById("notary_strings");
 		}
 
-		for(var i = 0; i < start_arr.length; i++) { 
+		for(var i = 0; i < start_arr.length; i++) {
         		if (start_arr[i].length > 0 && start_arr[i][0] != "#") {
         			// ignore lines that contain only whitespace -
         			// makes the file easier to parse cross-platform
@@ -93,12 +93,12 @@ var Pers_util = {
         				filtered_arr.push(start_arr[i]);
         			}
         		}
-		} 
+		}
        		var i = 0;
-		var notary_list = [];  
-        	while (i < filtered_arr.length) {  
-			var host = filtered_arr[i]; 
-            		var notary_server = { "host" : host }; 
+		var notary_list = [];
+        	while (i < filtered_arr.length) {
+			var host = filtered_arr[i];
+            		var notary_server = { "host" : host };
             		i += 1;
 
             		var begin_string = "BEGIN PUBLIC KEY";
@@ -108,47 +108,47 @@ var Pers_util = {
             		}
             		i += 1;
 
-            		var key = ""; 
+            		var key = "";
             		var end_string = "END PUBLIC KEY";
             		while (i < filtered_arr.length && filtered_arr[i].indexOf(end_string) === -1) {
-                		key += filtered_arr[i]; 
+                		key += filtered_arr[i];
                 		i += 1;
-				if(i == filtered_arr.length) { 
+				if(i == filtered_arr.length) {
 					throw(Pers_util.notarystr.getFormattedString("errorParsingNotaryEntry", [ host ]) +
 						' - ' +  Pers_util.notarystr.getFormattedString("couldNotFindLine", [ end_string ]));
 				}
             		}
 
             		i += 1; // consume the 'END PUBLIC KEY' line
-            		notary_server.public_key = key; 
-            		notary_list.push(notary_server);  
-        	} 
-		return notary_list; 
-	},  
+            		notary_server.public_key = key;
+            		notary_list.push(notary_server);
+        	}
+		return notary_list;
+	},
 
 	// stolen from: http://stackoverflow.com/questions/130404/javascript-data-formatting-pretty-printer
 	pretty_print_json : function(obj, indent) {
- 
-		function IsArray(array) { return !( !array || (!array.length || array.length == 0) || typeof array !== 'object' || !array.constructor || array.nodeType || array.item ); } 
+
+		function IsArray(array) { return !( !array || (!array.length || array.length == 0) || typeof array !== 'object' || !array.constructor || array.nodeType || array.item ); }
 
   		var result = "";
   		if (indent == null) indent = "";
 
   		for (var property in obj){
     			var value = obj[property];
-			var txt = "<unknown type>"; 
-			var t = typeof value; 
+			var txt = "<unknown type>";
+			var t = typeof value;
     			if (t == 'string' || t == 'boolean' || t == 'number')
       				txt = "'" + value + "'";
     			else if (t == 'object'){
       			/*	if (IsArray(value)){
         				txt = "[ \n";
-					//alert("array " + property + " has length " + obj[property].length);  
-					for(i = 0; i < obj[property].length; i++) { 
-					     //txt = txt + this.pretty_print_json(obj[property][i],indent) + ",\n"; 
-					     txt = txt + obj[property][i] + ",\n"; 
-					} 
-					txt = txt + "]\n"; 
+					//alert("array " + property + " has length " + obj[property].length);
+					for(i = 0; i < obj[property].length; i++) {
+					     //txt = txt + this.pretty_print_json(obj[property][i],indent) + ",\n";
+					     txt = txt + obj[property][i] + ",\n";
+					}
+					txt = txt + "]\n";
       				} else */ if(true) {
         				// Recursive dump
         				// (replace "  " by "\t" or something else if you prefer)
@@ -162,61 +162,68 @@ var Pers_util = {
     			result += indent + "'" + property + "' : " + txt + ",\n";
   		}
   		return result.replace(/,\n$/, "");
-	}, 
-	
-	// Mozilla's verification API assumes a DER header describing the 
-	// signature's cryptographic parameters.  The openssl-generated signatures 
+	},
+
+	// Mozilla's verification API assumes a DER header describing the
+	// signature's cryptographic parameters.  The openssl-generated signatures
 	// returned by the notary server do not have this.  Since the header is the
-	// same for all notary responses, we just statically prepend the data 
-	// here, and re-encode the signature in base64.  
+	// same for all notary responses, we just statically prepend the data
+	// here, and re-encode the signature in base64.
 	// see firefox-v2/xp_src/moz_crypto.cpp for details of header format
-	add_der_signature_header: function(sig_base64) { 
+	add_der_signature_header: function(sig_base64) {
 
-		var base_str = Pers_Base64.decode(sig_base64); 
-		var der_header_md5 = [ "0x30", "0x81", "0xbf", "0x30", "0x0d", "0x06", 
-							"0x09", "0x2a", "0x86", "0x48", "0x86", "0xf7", 
-							"0x0d", "0x01", "0x01", "0x04", "0x05", "0x00", 
+		var base_str = Pers_Base64.decode(sig_base64);
+		var der_header_md5 = [ "0x30", "0x81", "0xbf", "0x30", "0x0d", "0x06",
+							"0x09", "0x2a", "0x86", "0x48", "0x86", "0xf7",
+							"0x0d", "0x01", "0x01", "0x04", "0x05", "0x00",
 							"0x03", "0x81", "0xad", "0x00"];
 		var header_str = '';
 		for (var i = 0; i < der_header_md5.length; i++) {
 			header_str += String.fromCharCode(parseInt(der_header_md5[i],16));
 		}
-		return Pers_Base64.encode(header_str + base_str) ; 
-	}, 
+		return Pers_Base64.encode(header_str + base_str) ;
+	},
 
-	
-	update_public_key : "MIHKMA0GCSqGSIb3DQEBAQUAA4G4ADCBtAKBrAF16BJZAsESZnEq6MeCYsntL1233FVdz/6dNXptTwoKACOcnoae+/S5d9Ms2kmQMTMWkW5NdRV2/iKIdQx14Y7GZojPYvL85ZjwlTXRblqwoxnwdE+Vd2V5itxV0Okcu2+E66tvtr6aeBVt7hwtowyQPgiWz2rDgV6RsohbetiaHUMZKDdoQFzu/5CAW+7QtbFoJjNMqez6pz80xFWrIJzRC+fXlues1Af37+cCAwEAAQ==", 
-	update_list_uri : "http://update.networknotary.org/http_notary_list.txt", 
-	update_sig_uri : "http://update.networknotary.org/http_notary_list.sig", 
+
+	update_public_key : "MIHKMA0GCSqGSIb3DQEBAQUAA4G4ADCBtAKBrAF16BJZAsESZnEq6MeCYsntL1233FVdz/6dNXptTwoKACOcnoae+/S5d9Ms2kmQMTMWkW5NdRV2/iKIdQx14Y7GZojPYvL85ZjwlTXRblqwoxnwdE+Vd2V5itxV0Okcu2+E66tvtr6aeBVt7hwtowyQPgiWz2rDgV6RsohbetiaHUMZKDdoQFzu/5CAW+7QtbFoJjNMqez6pz80xFWrIJzRC+fXlues1Af37+cCAwEAAQ==",
+	update_list_uri : "http://update.networknotary.org/http_notary_list.txt",
+	update_sig_uri : "http://update.networknotary.org/http_notary_list.sig",
 	update_default_notary_list_from_web: function(root_prefs) {
-		try { 
-		 
-			var notary_list_data = Pers_util.readFileFromURI(this.update_list_uri); 
-			var sig_no_header = Pers_util.readFileFromURI(this.update_sig_uri); 
-			var sig = this.add_der_signature_header(sig_no_header); 
+		try {
+			var notary_list_data = Pers_util.readFileFromURI(this.update_list_uri);
+			var sig_no_header = Pers_util.readFileFromURI(this.update_sig_uri);
+			var sig = this.add_der_signature_header(sig_no_header);
 			var verifier = Components.classes["@mozilla.org/security/datasignatureverifier;1"].
 							createInstance(Components.interfaces.nsIDataSignatureVerifier);
-			var result = verifier.verifyData(notary_list_data, sig, this.update_public_key);  
-			if(!result) { 
+			var result = verifier.verifyData(notary_list_data, sig, this.update_public_key);
+			if(!result) {
         			Pers_debug.d_print("error", "Signature verification failed on notary list update");
-				return; 	
+				return;
 			}
 			root_prefs.setCharPref("perspectives.default_notary_list",notary_list_data);
-		} catch(e) { 
-			//Note: localize this message if we ever expose this preference
-			alert("Unexpected error updating default notary_list from web: " + e); 
-		} 
+		} catch(e) {
+			if(Perspectives.strbundle == null) {
+				Perspectives.strbundle = document.getElementById("notary_strings");
+			}
+
+			Pers_util.pers_alert(Perspectives.strbundle.
+				getFormattedString("updateDefaultListWebError", [e]));
+		}
 
-	}, 
+	},
 
-	update_default_notary_list_from_file : function(root_prefs) { 
-		try { 
-			var notary_list_data = this.readFileFromURI("chrome://perspectives/content/http_notary_list.txt");  
+	update_default_notary_list_from_file : function(root_prefs) {
+		try {
+			var notary_list_data = this.readFileFromURI("chrome://perspectives/content/http_notary_list.txt");
 			root_prefs.setCharPref("perspectives.default_notary_list",notary_list_data);
-		} catch(e) { 
-			//Note: localize this message if we ever expose this preference
-			alert("Unexpected error updating default notary_list from web: " + e); 
-		} 
+		} catch(e) {
+			if(Perspectives.strbundle == null) {
+				Perspectives.strbundle = document.getElementById("notary_strings");
+			}
+
+			Pers_util.pers_alert(Perspectives.strbundle.
+				getFormattedString("updateDefaultListFileError", [e]));
+		}
 	},
 
 	// Wrap all calls to alert() so we show a common title.
@@ -228,8 +235,8 @@ var Pers_util = {
 	// taken from dialogs.dtd or notaries.properties files, not hard-coded.
 	// FIXME - existing alerts should be changed to use this. Make sure to test them!
 	pers_alert: function(msg) {
-	       alert("Perspectives: " + msg);
-	// TODO we could include contact info here too
+		alert("Perspectives: " + msg);
+		// TODO we could include contact info here too
 	},
 
 	// Make opening a link nicer by opening in a new tab if possible
@@ -249,7 +256,7 @@ var Pers_util = {
 		    wnd.focus();
 		}
 		catch (e) {
-		    this.pers_alert("error opening link: " + e);
+			Pers_util.pers_alert("error opening link: " + e);
 		}
 	}
 }
diff --git a/plugin/chrome/content/notaries.js b/plugin/chrome/content/notaries.js
index 6591a8a..eaa9ccb 100644
--- a/plugin/chrome/content/notaries.js
+++ b/plugin/chrome/content/notaries.js
@@ -581,17 +581,17 @@ var Perspectives = {
 		ti.already_trusted = !(ti.state & Perspectives.state.STATE_IS_INSECURE) && !(ti.is_override_cert);
 
 		if(Perspectives.is_whitelisted_by_user(ti.uri.host)) {
+			var text = Perspectives.strbundle.
+				getFormattedString("configuredToWhitelistWithHost", [ti.uri.host]);
 			if(! (ti.already_trusted || ti.is_override_cert)) {
 				var isTemp = !Perspectives.root_prefs.getBoolPref("perspectives.exceptions.permanent");
 				setTimeout(function() {
 					if(Perspectives.do_override(ti.browser, ti.cert, isTemp)) {
-						Perspectives.setFaviconText("Certificate trusted based on Perspectives whitelist"); //TODO: localize; can we use configuredToWhitelist to save a string?
+						Perspectives.setFaviconText(text);
 						Pers_notify.do_notify(ti, Pers_notify.TYPE_WHITELIST);
 					}
 				}, 1000);
 			}
-			var text = Perspectives.strbundle.
-				getFormattedString("configuredToWhitelistWithHost", [ ti.uri.host ]);
 			Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_SEC, text);
 			ti.reason_str = text;
 			return;
@@ -669,7 +669,7 @@ var Perspectives = {
 				Perspectives.getFaviconText().indexOf("Perspectives") < 0){
 				ti.query_results.identityText =
 					Perspectives.setFaviconText(Perspectives.getFaviconText() +
-					"\n\n" + "Perspectives has validated this site"); //TODO: localize
+					"\n\n" + Perspectives.strbundle.getString("verificationSuccess"));
 			}
 			var required_duration   =
 				Perspectives.root_prefs.
@@ -714,9 +714,8 @@ var Perspectives = {
 					// from applying the resuts and can add better tests for these,
 					// wrap setting the status and the tooltip in their own function
 					// so no steps are forgotten
-					ti.query_results.tooltip =
-						"HTTPS Certificate is trusted, but site contains insecure embedded content.";
-					Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_NEUT, ti.query_results.tooltip); //TODO: localize
+					ti.query_results.tooltip = Perspectives.strbundle.getString("trustedButInsecureEmbedded");
+					Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_NEUT, ti.query_results.tooltip);
 					// this will flicker, as we can't rely on just doing it on 'firstLook'
 					// due to Firefox oddness
 					if(ti.override_used) {
@@ -725,21 +724,18 @@ var Perspectives = {
 				}  else {
 
 					ti.query_results.tooltip = Perspectives.strbundle.
-						getFormattedString("verifiedMessage",
-						[ ti.query_results.duration, required_duration]);
+						getFormattedString("verifiedMessage", [ti.query_results.duration, required_duration]);
 					Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_SEC,
 						ti.query_results.tooltip);
 				}
 			} else if(ti.already_trusted && weak_trust && pref_https_weak) {
 				// FIXME: need to clear any contrary banners
 				if(ti.state & Perspectives.state.STATE_IS_BROKEN) {
-					ti.query_results.tooltip =
-						"HTTPS Certificate is weakly trusted, but site contains insecure embedded content." //TODO: localize
+					ti.query_results.tooltip = Perspectives.strbundle.getString("trustedWeaklyButInsecureEmbedded");
 					Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_NEUT,
 						ti.query_results.tooltip);
 				}  else {
-					ti.query_results.tooltip =
-						"This site uses multiple certificates, including the certificate received and trusted by your browser." //TODO: localize
+					ti.query_results.tooltip = Perspectives.strbundle.getString("trustedMultipleByBrowser");
 					Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_SEC,
 						ti.query_results.tooltip);
 
@@ -755,17 +751,15 @@ var Perspectives = {
 				}
 			} else if(ti.query_results.inconsistent_results && !ti.query_results.weakly_seen) {
 				// FIXME: need to clear any contrary banners
-				ti.query_results.tooltip = "This site regularly uses multiples certificates, and most Notaries have not recently seen the certificate received by the browser";
-				Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_NSEC, //TODO: localize
-					ti.query_results.tooltip);
+				ti.query_results.tooltip = Perspectives.strbundle.getString("untrustedMultipleNotSeen");
+				Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_NSEC, ti.query_results.tooltip);
 				if(!ti.already_trusted){
 					Pers_notify.do_notify(ti, Pers_notify.TYPE_FAILED);
 				}
 			} else if(ti.query_results.inconsistent_results) {
 				// FIXME: need to clear any contrary banners
-				ti.query_results.tooltip = "Perspectives is unable to validate this site, because the site regularly uses multiples certificates";
-				Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_NSEC, //TODO: localize
-					ti.query_results.tooltip);
+				ti.query_results.tooltip = Perspectives.strbundle.getString("untrustedMultipleNotVerifiable");
+				Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_NSEC, ti.query_results.tooltip);
 				if(!ti.already_trusted){
 					Pers_notify.do_notify(ti, Pers_notify.TYPE_FAILED);
 				}
@@ -792,7 +786,8 @@ var Perspectives = {
 				}
 			} else {
 				// FIXME: need to clear any contrary banners
-				ti.query_results.tooltip = "An unknown Error occurred processing Notary results"; //TODO: localize
+				ti.query_results.tooltip = Perspectives.strbundle.
+					getFormattedString("errorParsingNotaryEntry", [ti.uri.host]);
 				Pers_statusbar.setStatus(ti.uri, Pers_statusbar.STATE_ERROR,
 					ti.query_results.tooltip);
 
@@ -829,8 +824,6 @@ var Perspectives = {
 		return false;
 	},
 
-
-
 	// See Documentation for nsIWebProgressListener at:
 	// https://developer.mozilla.org/en/nsIWebProgressListener
 
@@ -853,72 +846,76 @@ var Perspectives = {
 			if(Perspectives.strbundle == null) {
 				Perspectives.strbundle = document.getElementById("notary_strings");
 			}
-      			try{
-        			Pers_debug.d_print("main", "Location change " + aURI.spec);
-        			var state = Pers_statusbar.STATE_NEUT;
-        			var tooltip = "Perspectives";
-
-        			if (aURI !== null && aURI.scheme === 'https') {
-        				// we'll actually send a query for https connections, so update the UI.
-        				state = Pers_statusbar.STATE_QUERY;
-        				// use the asciiHost: sometimes the host contains invalid characters, or is unset.
-        				// in those cases getFormattedString() will throw an exception,
-        				// which causes the error icon to be displayed.
-        				tooltip = Perspectives.strbundle.getFormattedString("contactingNotariesAbout",
-        					[ aURI.asciiHost ])
-        				// TODO: can we start sending the query from right here, to begin sooner?
-        			}
-        			Pers_statusbar.setStatus(aURI, state, tooltip);
-      			} catch(err){
-        			Pers_debug.d_print("error", "Perspectives had an internal exception: " + err);
-        			Pers_statusbar.setStatus(aURI, Pers_statusbar.STATE_ERROR,
-					"Perspectives: an error occurred when attempting to change location: " + err); //TODO: localize
-      			}
 
+			try {
+				Pers_debug.d_print("main", "Location change " + aURI.spec);
+				var state = Pers_statusbar.STATE_NEUT;
+				var tooltip = "Perspectives";
+
+				if (aURI !== null && aURI.scheme === 'https') {
+					// we'll actually send a query for https connections, so update the UI.
+					state = Pers_statusbar.STATE_QUERY;
+					// use the asciiHost: sometimes the host contains invalid characters, or is unset.
+					// in those cases getFormattedString() will throw an exception,
+					// which causes the error icon to be displayed.
+					tooltip = Perspectives.strbundle.getFormattedString("contactingNotariesAbout",
+						[ aURI.asciiHost ])
+					// TODO: can we start sending the query from right here, to begin sooner?
+				}
+				Pers_statusbar.setStatus(aURI, state, tooltip);
+			} catch(err){
+				Pers_debug.d_print("error", "Perspectives had an internal exception: " + err);
+				Pers_statusbar.setStatus(aURI, Pers_statusbar.STATE_ERROR,
+					Perspectives.strbundle.getFormattedString("internalError", ["onLocationChange - " + err]));
+			}
    		},
 
    		// we only call updateStatus on STATE_STOP, as a catch all in case
    		// onSecurityChange was never called.
    		onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) {
-
 			if(aFlag & Components.interfaces.nsIWebProgressListener.STATE_STOP){
-       			  try {
-     				var uri = window.gBrowser.currentURI;
-    				Pers_debug.d_print("main", "State change " + uri.spec);
-         			Perspectives.updateStatus(window,false);
-       			  } catch (err) {
-         			Pers_debug.d_print("error", "Perspectives had an internal exception: " + err);
-         			Pers_statusbar.setStatus(Pers_statusbar.STATE_ERROR,
-					"Perspectives: an internal state change error occurred: " + err); //TODO: localize
-       			  }
-     			}
+				try {
+					var uri = window.gBrowser.currentURI;
+					Pers_debug.d_print("main", "State change " + uri.spec);
+					Perspectives.updateStatus(window,false);
+				} catch (err) {
+					if(Perspectives.strbundle == null) {
+						Perspectives.strbundle = document.getElementById("notary_strings");
+					}
+
+					Pers_debug.d_print("error", "Perspectives had an internal exception: " + err);
+					Pers_statusbar.setStatus(Pers_statusbar.STATE_ERROR,
+						Perspectives.strbundle.getFormattedString("internalError", ["onStateChange - " + err]));
+				  }
+				}
   		},
 
   		// this is the main function we key off of.  It seems to work well, even though
   		// the docs do not explicitly say when it will be called.
-  		onSecurityChange:    function() {
-       			var uri = null;
-       			try{
-         			uri = window.gBrowser.currentURI;
-         			Pers_debug.d_print("main", "Security change " + uri.spec);
-         			Perspectives.updateStatus(window,false);
-       			} catch(err){
-         			Pers_debug.d_print("error", "Perspectives had an internal exception: " + err);
-         			if(uri) {
-          				Pers_statusbar.setStatus(uri, Pers_statusbar.STATE_ERROR,
-						"Perspectives: an internal security change error occurred: " + err); //TODO: localize
-         			}
-       			}
+  		onSecurityChange: function() {
+			var uri = null;
+			try{
+				uri = window.gBrowser.currentURI;
+				Pers_debug.d_print("main", "Security change " + uri.spec);
+				Perspectives.updateStatus(window,false);
+			} catch(err){
+				Pers_debug.d_print("error", "Perspectives had an internal exception: " + err);
+				if(uri) {
+					if(Perspectives.strbundle == null) {
+						Perspectives.strbundle = document.getElementById("notary_strings");
+					}
 
+					Pers_statusbar.setStatus(uri, Pers_statusbar.STATE_ERROR,
+						Perspectives.strbundle.getFormattedString("internalError", ["onSecurityChange - " + err]));
+				}
+			}
   		},
 
-		onStatusChange:      function() { },
-		onProgressChange:    function() { },
+		onStatusChange     : function() { },
+		onProgressChange   : function() { },
 		onLinkIconAvailable: function() { }
 	},
 
-
-
 	requeryAllTabs: function(b){
 		/*
 		alert("requeryAllTabs is disabled");
@@ -947,7 +944,11 @@ var Perspectives = {
 			setTimeout(function (){ Perspectives.requeryAllTabs(gBrowser); }, 4000);
 			Pers_debug.d_print("main", "Perspectives Finished Initialization\n\n");
 		} catch(e) {
-			Pers_util.pers_alert("Error in initNotaries: " + e);
+			if(Perspectives.strbundle == null) {
+				Perspectives.strbundle = document.getElementById("notary_strings");
+			}
+
+			Pers_util.pers_alert(Perspectives.strbundle.getFormattedString("internalError", ["initNotaries - " + e]));
 		}
 	},
 
diff --git a/plugin/chrome/content/results_dialog.js b/plugin/chrome/content/results_dialog.js
index e383c64..149bea1 100644
--- a/plugin/chrome/content/results_dialog.js
+++ b/plugin/chrome/content/results_dialog.js
@@ -35,26 +35,26 @@ var Pers_results = {
 		after.appendChild(svg);
 	},
 
-	// returns a string that describes whether Perspectives installed a 
-	// security exception 
+	// returns a string that describes whether Perspectives installed a
+	// security exception
 	getActionStr: function(ti) {
 		if(Pers_results.strbundle == null) {
  			Pers_results.strbundle = document.getElementById("results_strings");
  		}
 
-		if(ti.uri.scheme != "https") {  
+		if(ti.uri.scheme != "https") {
 			return Pers_results.strbundle.getFormattedString("notHTTPS", [ ti.uri.scheme ]);
-		} else if(ti.is_override_cert && ti.already_trusted) { 
+		} else if(ti.is_override_cert && ti.already_trusted) {
 			return Pers_results.strbundle.getString("previouslyInstalledCert");
-		} else if(ti.already_trusted) { 
+		} else if(ti.already_trusted) {
 			return Pers_results.strbundle.getString("browserTrusts");
-		} else if(ti.is_override_cert && ti.notary_valid && ti.exceptions_enabled && ti.isTemp) { 
+		} else if(ti.is_override_cert && ti.notary_valid && ti.exceptions_enabled && ti.isTemp) {
 			return Pers_results.strbundle.getString("tempSecurityException");
-		} else if(ti.is_override_cert && ti.notary_valid && ti.exceptions_enabled && !ti.isTemp){ 
+		} else if(ti.is_override_cert && ti.notary_valid && ti.exceptions_enabled && !ti.isTemp){
 			return Pers_results.strbundle.getString("permanentSecurityException");
-		} else { 
+		} else {
 			return Pers_results.strbundle.getString("noException");
-		} 
+		}
 	},
 
 	load_results_dialog: function(){
@@ -71,20 +71,20 @@ var Pers_results = {
 			var info  = document.getElementById("perspective-description");
 			var liner = document.getElementById("perspective-quorum-duration");
 			var host  = document.getElementById("perspective-information-caption");
-		
-			var win = window.opener; 
-			var error_text = win.Perspectives.detectInvalidURI(win);  
-			if(error_text) { 
+
+			var win = window.opener;
+			var error_text = win.Perspectives.detectInvalidURI(win);
+			if(error_text) {
 				info.value = "Perspectives: " +
 					Pers_results.notaryStrings.getString("invalidURI") + " (" + error_text + ")";
-				return; 
-			} 
+				return;
+			}
 			var ti = win.Perspectives.getCurrentTabInfo(win);
-			var cert  = ti.query_results; 
+			var cert  = ti.query_results;
 			host.label = ti.uri.host;
-			if(ti) { 
-				host.label += ": " + Pers_results.getActionStr(ti); 
-			} 
+			if(ti) {
+				host.label += ": " + Pers_results.getActionStr(ti);
+			}
 			if(cert){
 				info.value  = cert.summary;
 				liner.value = cert.tooltip;
@@ -96,20 +96,19 @@ var Pers_results = {
 					radio.selectedIndex = 0;
 				}
 			} else if (ti.reason_str) {
-				info.value = ti.reason_str; 
-			} 
+				info.value = ti.reason_str;
+			}
 
-		} catch(e) { 
-			Pers_debug.d_print("error", "Error loading results dialog"); 
-			Pers_debug.d_print("error", e); 
+		} catch(e) {
+			Pers_debug.d_print("error", "Error loading results dialog");
+			Pers_debug.d_print("error", e);
 			var errmsg = "";
 			if (Pers_results.strbundle != null) {
 				errmsg = Pers_results.strbundle.getString("errorLoadingResultsDialog") + ": ";
 			}
 			Pers_util.pers_alert(errmsg + e);
-		}  
-  
-		return true;
-	},
+		}
 
+		return true;
+	}
 }
diff --git a/plugin/chrome/content/whitelist_dialog.js b/plugin/chrome/content/whitelist_dialog.js
index 52b3a86..fba185e 100644
--- a/plugin/chrome/content/whitelist_dialog.js
+++ b/plugin/chrome/content/whitelist_dialog.js
@@ -21,7 +21,7 @@ var Pers_whitelist_dialog = {
 	root_prefs : Components.classes["@mozilla.org/preferences-service;1"].
 				getService(Components.interfaces.nsIPrefBranch),
 
-	add_to_whitelist : function() { 	
+	add_to_whitelist : function() {
 		try {
 			// use Perspectives.strbundle because whitelist_dialog.xul isn't loaded yet
 			if(Perspectives.strbundle == null) {
@@ -40,124 +40,129 @@ var Pers_whitelist_dialog = {
 	},
 
 	confirm_add : function() {
-		try {  
+		try {
 		var host = window.arguments[0];
-		var is_domain = document.getElementById("whitelist-radio-2").selected; 
-		var is_ip = this.is_ip_address(host); 
-	
-		window.close(); 
-	
-		if(is_domain) { 
-			if(is_ip) { 
-				var regex = this.get_ip_domain_regex(host); 
-			} else { 
-				var regex = this.get_dns_domain_regex(host); 
-			} 	
-		} else { 
-			var regex = "^" + host.replace(".","\\.","g") + "$"; 
-		}  
+		var is_domain = document.getElementById("whitelist-radio-2").selected;
+		var is_ip = this.is_ip_address(host);
+
+		window.close();
+
+		if(is_domain) {
+			if(is_ip) {
+				var regex = this.get_ip_domain_regex(host);
+			} else {
+				var regex = this.get_dns_domain_regex(host);
+			}
+		} else {
+			var regex = "^" + host.replace(".","\\.","g") + "$";
+		}
 		var whitelist = this.root_prefs.getCharPref("perspectives.whitelist");
-		if(whitelist.length == 0) { 
-			whitelist = regex; 
-		} else { 
-			whitelist = whitelist + "," + regex; 
-		} 	
+		if(whitelist.length == 0) {
+			whitelist = regex;
+		} else {
+			whitelist = whitelist + "," + regex;
+		}
 		this.root_prefs.setCharPref("perspectives.whitelist",whitelist);
-		window.opener.Perspectives.forceStatusUpdate(window.opener); 
+		window.opener.Perspectives.forceStatusUpdate(window.opener);
 		} catch(e) { Pers_util.pers_alert("confirm_add: " + e); }
-	}, 
+	},
 
-	is_ip_address: function(host) { 
-		var host_arr = host.split("\.");   
-		return host_arr[host_arr.length - 1].match(RegExp("[0-9]+")); 
-	}, 
+	is_ip_address: function(host) {
+		var host_arr = host.split("\.");
+		return host_arr[host_arr.length - 1].match(RegExp("[0-9]+"));
+	},
 
 	// 'host' could be a domain name or an ip address
-	get_dns_domain_text: function(host) { 
-		var host_arr = host.split("\.");   
+	get_dns_domain_text: function(host) {
+		var host_arr = host.split("\.");
 		var l = host_arr.length;
 		if(host_arr.length > 1) {
-			return  host_arr[l - 2] + "." + host_arr[l - 1]; 
+			return  host_arr[l - 2] + "." + host_arr[l - 1];
 		}
-		return null; 
+		return null;
 	},
 
 	get_dns_domain_regex: function(host) {
-		return ".*\\." + this.get_dns_domain_text(host).replace(".","\\.","g") + "$"; 
-	},  
-	
-	get_ip_domain_text: function(host) { 
-		var host_arr = host.split("\.");   
+		return ".*\\." + this.get_dns_domain_text(host).replace(".","\\.","g") + "$";
+	},
+
+	get_ip_domain_text: function(host) {
+		var host_arr = host.split("\.");
 		var l = host_arr.length;
-		var prefix =  host_arr[0] + "." + host_arr[1] + "." + host_arr[2] + ".";  
+		var prefix =  host_arr[0] + "." + host_arr[1] + "." + host_arr[2] + ".";
 		if(host_arr.length == 4) {
-			return prefix + "0" + " - " + prefix + "255"; 
+			return prefix + "0" + " - " + prefix + "255";
 		}
-		return null; 
-	}, 
+		return null;
+	},
 
-	get_ip_domain_regex: function(host) { 
-		var host_arr = host.split("\.");   
+	get_ip_domain_regex: function(host) {
+		var host_arr = host.split("\.");
 		var l = host_arr.length;
-		var prefix =  host_arr[0] + "." + host_arr[1] + "." + host_arr[2] + ".";  
-		return "^" + prefix.replace(".","\\.","g") + "[0-9]+$"; 
-	}, 
+		var prefix =  host_arr[0] + "." + host_arr[1] + "." + host_arr[2] + ".";
+		return "^" + prefix.replace(".","\\.","g") + "[0-9]+$";
+	},
 
 	fill_dialog: function(){
 		try {
 			if(Pers_whitelist_dialog.strbundle == null) {
 					Pers_whitelist_dialog.strbundle = document.getElementById("whitelist_strings");
-				}
+			}
 
 			var host = window.arguments[0];
 			document.getElementById("whitelist-radio-1").label =
 				Pers_whitelist_dialog.strbundle.getString("whitelistWebsite") + " '" + host + "'";
-				
-			document.getElementById("whitelist-radio-2").hidden = true; 
-			if(this.is_ip_address(host)) { 
-				var host_text = this.get_ip_domain_text(host); 
-				if(host_text) { 
+
+			document.getElementById("whitelist-radio-2").hidden = true;
+			if(this.is_ip_address(host)) {
+				var host_text = this.get_ip_domain_text(host);
+				if(host_text) {
 					document.getElementById("whitelist-radio-2").label =
 						Pers_whitelist_dialog.strbundle.getString("whitelistAllWebsitesInIP") + " '" + host_text + "'";
-					document.getElementById("whitelist-radio-2").hidden = false; 
-				} 
-			} else {  
-				var dns_text = this.get_dns_domain_text(host); 
-				if(dns_text) { 
+					document.getElementById("whitelist-radio-2").hidden = false;
+				}
+			} else {
+				var dns_text = this.get_dns_domain_text(host);
+				if(dns_text) {
 					document.getElementById("whitelist-radio-2").label =
 						Pers_whitelist_dialog.strbundle.getString("whitelistAllWebsitesInDomain") + " '" + dns_text + "'";
-					document.getElementById("whitelist-radio-2").hidden = false; 
-				} 
-			}	
+					document.getElementById("whitelist-radio-2").hidden = false;
+				}
+			}
 
 		} catch(e) { Pers_util.pers_alert("fill_dialog: " + e); }
-	}, 
+	},
+
+	remove_from_whitelist : function() {
+		try {
+			// use Perspectives.strbundle because whitelist_dialog.xul isn't loaded yet
+			if(Perspectives.strbundle == null) {
+					Perspectives.strbundle = document.getElementById("notary_strings");
+			}
 
-	remove_from_whitelist : function() { 
-		try { 
 			var host = window.gBrowser.currentURI.host;
 			var old_whitelist = Perspectives.root_prefs.getCharPref("perspectives.whitelist").split(",");
-			var new_whitelist = []; 
+			var new_whitelist = [];
 			for(var entry in old_whitelist) {
-				var e = old_whitelist[entry]; 
-				if(e.length == 0) { 
-					continue; 
-				} 
+				var e = old_whitelist[entry];
+				if(e.length == 0) {
+					continue;
+				}
 				var r = RegExp(e);
-				var display_str = e.replace(/\\/g,"").replace("$","").replace("^",""); 
+				var display_str = e.replace(/\\/g,"").replace("$","").replace("^","");
 				if (host.match(r)) {
-					var answer = confirm("Remove '" + display_str + "' from whitelist?"); //FIXME: localize, once we know how to get here
-					if(answer) { 
-						continue; 
-					} 
-				} 
-				new_whitelist.push(e); 
-			} 
-			Perspectives.root_prefs.setCharPref("perspectives.whitelist",new_whitelist.join(",")); 
-			window.Perspectives.forceStatusUpdate(window);  
-		} catch(e) { alert("remove_from_whitelist:" + e); } 
-	} 
-		
+					var answer = confirm(Perspectives.strbundle.
+						getFormattedString("removeFromWhitelistQuestion", [display_str]));
+					if(answer) {
+						continue;
+					}
+				}
+				new_whitelist.push(e);
+			}
+			Perspectives.root_prefs.setCharPref("perspectives.whitelist",new_whitelist.join(","));
+			window.Perspectives.forceStatusUpdate(window);
+		} catch(e) { alert("remove_from_whitelist:" + e); }
+	}
 }
 
 
diff --git a/plugin/chrome/content/xml_notary_client.js b/plugin/chrome/content/xml_notary_client.js
index 73795a9..b633a1f 100644
--- a/plugin/chrome/content/xml_notary_client.js
+++ b/plugin/chrome/content/xml_notary_client.js
@@ -19,62 +19,62 @@
 
 
 // convert an xml '<server>' node to a javascript object
-// In JSON syntax, this object has the following format: 
-/* { "signature" : "XXXX", 
-     "obs" : [  { "key" : "XXX", 
+// In JSON syntax, this object has the following format:
+/* { "signature" : "XXXX",
+     "obs" : [  { "key" : "XXX",
  		  "timestamps" : [ { "start" : XXX, "end" : YYY } ]
-		} 
-	     ] 
+		}
+	     ]
    }
-*/  
+*/
 var Pers_xml = {
-	parse_server_node: function(reply, expected_version) { 
+	parse_server_node: function(reply, expected_version) {
 
-        	if(reply.nodeName != "notary_reply"){
+		if(reply.nodeName != "notary_reply"){
 			return null;
-        	}
-		var version = reply.attributes.getNamedItem("version").value; 
-		if(version != expected_version) { 
+		}
+		var version = reply.attributes.getNamedItem("version").value;
+		if(version != expected_version) {
 			Pers_debug.d_print("error","Expected version '" + expected_version
 				+ "' but got version '" + version + "'");
-			return null; 
+			return null;
 		}
-        
+
 		var res = new Object();
-		var sig_type = reply.attributes.getNamedItem("sig_type").value; 
+		var sig_type = reply.attributes.getNamedItem("sig_type").value;
 		if(sig_type != "rsa-md5") {
-			// in the future, we will support 'rsa-sha256' as well 
-			Pers_debug.d_print("error","Expected sig_type 'rsa-md5' " + 
+			// in the future, we will support 'rsa-sha256' as well
+			Pers_debug.d_print("error","Expected sig_type 'rsa-md5' " +
 				"but got sig_type '" + sig_type + "'");
-			return null; 
-		} 
-		var sig_base64 = reply.attributes.getNamedItem("sig").value; 
-		res.signature = Pers_util.add_der_signature_header(sig_base64); 
+			return null;
+		}
+		var sig_base64 = reply.attributes.getNamedItem("sig").value;
+		res.signature = Pers_util.add_der_signature_header(sig_base64);
 		res.obs     = new Array();
 		for (var j = 0; j < reply.childNodes.length; j++){
 			var keynode = reply.childNodes[j];
 			if (keynode.nodeName != "key"){
-				continue; 
+				continue;
 			}
 
-			var key_info = { 
-				"key" : keynode.attributes.getNamedItem("fp").value, 
-				"key_type" : keynode.attributes.getNamedItem("type").value, 
-				"timestamps" : [] 
-			}; 
+			var key_info = {
+				"key" : keynode.attributes.getNamedItem("fp").value,
+				"key_type" : keynode.attributes.getNamedItem("type").value,
+				"timestamps" : []
+			};
 			for (var k = 0; k < keynode.childNodes.length; k++){
 				var tsnode = keynode.childNodes[k];
 				if (tsnode.nodeName != "timestamp"){
 					continue;
 				}
-				key_info.timestamps.push({ 
-					"start" : tsnode.attributes.getNamedItem("start").value, 
+				key_info.timestamps.push({
+					"start" : tsnode.attributes.getNamedItem("start").value,
 					"end" : tsnode.attributes.getNamedItem("end").value
-				}); 
+				});
             }
-			res.obs.push(key_info); 
+			res.obs.push(key_info);
         }
-		return res; 
+		return res;
 	},
 
 
@@ -84,74 +84,74 @@ var Pers_xml = {
 				Perspectives.strbundle = document.getElementById("notary_strings");
 		}
 
-		var out = ""; 
-		for(var j = 0; j < server_result.obs.length; j++) { 
-			var o = server_result.obs[j]; 
+		var out = "";
+		for(var j = 0; j < server_result.obs.length; j++) {
+			var o = server_result.obs[j];
 			out += Perspectives.strbundle.getString("sslKey")
 				+ ": '" + o.key + "'\n";
 			for(var k = 0; k < o.timestamps.length; k++){
-				var start_t = o.timestamps[k].start; 
-				var end_t = o.timestamps[k].end; 
-				var start_d = new Date(1000 * start_t).toDateString();  
-				var end_d = new Date(1000 * end_t).toDateString();  
+				var start_t = o.timestamps[k].start;
+				var end_t = o.timestamps[k].end;
+				var start_d = new Date(1000 * start_t).toDateString();
+				var end_d = new Date(1000 * end_t).toDateString();
 				out += Perspectives.strbundle.getString("keyStart") +
 					":\t" + start_t + " - " + start_d + "\n";
 				out += Perspectives.strbundle.getString("keyEnd") +
 					":  \t" + end_t + " - " + end_d + "\n";
 				out += "(" + parseInt((end_t - start_t) / (3600 * 24)) + " " +
 					Perspectives.strbundle.getString("keyDays") + ")\n\n";
-			}   
-		} 
-		if(server_result.obs.length == 0) { 
+			}
+		}
+		if(server_result.obs.length == 0) {
 			out += "[ " + Perspectives.strbundle.getString("noResults") + " ]";
-		}	 
-		if(show_sig) { 
+		}
+		if(show_sig) {
 			out += "\t" + Perspectives.strbundle.getString("signature") + " = '"
 				+ server_result.signature + "'\n";
 		}
 		return out;
-	}, 
+	},
 
-	//Note: the signature is computed over data in 
+	//Note: the signature is computed over data in
 	// network byte order (big endian) so we should do
-	// the same. 
+	// the same.
 	// each observation has:
-	// service-id (variable length, terminated with null-byte) 
+	// service-id (variable length, terminated with null-byte)
 	// num_timespans (2-bytes)
 	// key_len_bytes (2-bytes, always has value of 16 for now
-	// key type (1-byte), always has a value of 3 for SSL 
-	// key data (length specified in key_len_bytes) 
+	// key type (1-byte), always has a value of 3 for SSL
+	// key data (length specified in key_len_bytes)
 	// list of timespan start,end pairs  (length is 2 * 4 * num_timespans)
-	// FIXME: The different keys actually need to be in the same order as 
+	// FIXME: The different keys actually need to be in the same order as
 	// they were on the server, in order to compute the signature correctly.
 	// The xml seems to be parsed in a consistent way, but I don't know if
-	// that is guaranteed to be the case.  
-	pack_result_as_binary: function(server_res,service_id) { 
+	// that is guaranteed to be the case.
+	pack_result_as_binary: function(server_res,service_id) {
 		var bin_str = service_id;
 		bin_str += String.fromCharCode(0); // NULL-terminate
-	 
+
 		for (var i = server_res.obs.length - 1; i >= 0; i--) {
 			var o = server_res.obs[i];
-			var num_timespans = o.timestamps.length; 
-			bin_str += String.fromCharCode((num_timespans >> 8) & 255, 
-											num_timespans & 255); 
+			var num_timespans = o.timestamps.length;
+			bin_str += String.fromCharCode((num_timespans >> 8) & 255,
+											num_timespans & 255);
 			bin_str += String.fromCharCode(0,16,3); // key length is 16, type 3
-			var hex_array = o.key.split(":"); 
+			var hex_array = o.key.split(":");
 			for(var k = 0; k < hex_array.length; k++) {
-				bin_str += String.fromCharCode((parseInt(hex_array[k],16))); 
+				bin_str += String.fromCharCode((parseInt(hex_array[k],16)));
 			}
 			for (var j = 0; j < o.timestamps.length; j++) {
-				var t = o.timestamps[j]; 
-				bin_str += String.fromCharCode((t.start >> 24) & 255, 
-							(t.start >> 16) & 255, 
-							(t.start >> 8) & 255, 
-							t.start & 255);  
-				bin_str += String.fromCharCode((t.end >> 24) & 255, 
-							(t.end >> 16) & 255, (t.end >> 8) & 255, 
-							t.end & 255);  
+				var t = o.timestamps[j];
+				bin_str += String.fromCharCode((t.start >> 24) & 255,
+							(t.start >> 16) & 255,
+							(t.start >> 8) & 255,
+							t.start & 255);
+				bin_str += String.fromCharCode((t.end >> 24) & 255,
+							(t.end >> 16) & 255, (t.end >> 8) & 255,
+							t.end & 255);
 			}
-		} 
-	
-		return bin_str; 
+		}
+
+		return bin_str;
 	}
-} 
+}
diff --git a/plugin/chrome/locale/de/notaries.properties b/plugin/chrome/locale/de/notaries.properties
index a9b291f..ae35324 100644
--- a/plugin/chrome/locale/de/notaries.properties
+++ b/plugin/chrome/locale/de/notaries.properties
@@ -1,49 +1,54 @@
 # Diese Datei beinhaltet lokalisierte Strings zum Javascript-Code von Perspectives
-verificationSuccess=Perspectives hat die Sicherheit Ihrer Verbindung mit dieser Webseite bestätigt und die Firefox Sicherheitsfehlerseite umgangen
-unableToVerify=Möglicher Angriff: Perspectives konnte die Sicherheit Ihrer Verbindung mit dieser Webseite nicht bestätigen
-reportThis=Fehler Melden
+verificationSuccess=Perspectives hat die Sicherheit Ihrer Verbindung mit dieser Webseite bestätigt und die Firefox Sicherheitsfehlerseite umgangen.
+unableToVerify=Möglicher Angriff: Perspectives konnte die Sicherheit Ihrer Verbindung für diese Webseite nicht bestätigen.
+reportThis=Fehler melden
 yesContactNotaries=Ja, bei den Notaren nachfragen
 learnMore=Mehr erfahren
-noRepliesReceived=Warnung: Perspectives hat von den Notaren keine Antwort bekommen. Dies könnte ein Angriff sein oder sie befinden sich hinter einer Firewall / einem Proxy-Server, welche Anfragen an die Notare verhindern.
+noRepliesReceived=Warnung: Perspectives hat von den Notaren keine Antwort bekommen. Dies könnte ein Angriff sein oder Sie befinden sich hinter einer Firewall/einem Proxy-Server, welche Anfragen an die Notare verhindern.
 firewallHelp=Firewall-/Proxy-Hilfe
 noDataError=Perspectives: Keine Daten. Der Webbrowser hat für diese Verbindung einen leeren URI zurückgegeben. Versuchen Sie, die Seite neu zu laden.
-nonHTTPSError=Perspectives: Notare werden nur bei Webseiten mit aktivem HTTPS kontaktiert.\nDie aktuelle Verbindung mit %1$S verwendet %2$S
-rfc1918Error=Perspectives: Keine Informationen. Die Webseite mit IP-Adresse %1$S befindet sich in einem privaten lokalen Netzwerk. Notarenserver können nur öffentliche Webseiten überwachen.
+nonHTTPSError=Perspectives: Notare werden nur bei Webseiten mit aktivem HTTPS kontaktiert.\nDie aktuelle Verbindung mit %1$S verwendet %2$S.
+rfc1918Error=Perspectives: Keine Informationen. Die Webseite mit IP-Adresse %1$S befindet sich in einem privaten lokalen Netzwerk. Notarserver können nur öffentliche Webseiten überwachen.
 noCertError=Perspectives: Keine Informationen. Der Webbrowser konnte kein Zertifikat für %1$S abrufen.
 noProbeRequestedError=Perspectives: Keine Informationen. Entsprechend der Einstellungen werden Notare nur für HTTPS Zertifikate kontaktiert, bei denen die Sicherheitsprüfung des Webbrowsers fehlschlägt.
-needsPermission=Perspectives: Keine Informationen. Entsprechend der Einstellungen werden Notare nicht ohne Erlaubnis kontaktiert.
+needsPermission=Perspectives: Keine Informationen. Entsprechend der Einstellungen werden Notare nicht ohne Ihre Erlaubnis kontaktiert.
 internalError=Perspectives: Ein interner Fehler ist aufgetreten: %1$S
+updateDefaultListFileError=Unerwarteter Fehler beim Aktualisieren der Standard-Notarliste mittels Datei: %1$S
+updateDefaultListWebError=Unerwarteter Fehler beim Aktualisieren der Standard-Notarliste über Web: %1$S
+loadingCreditsError=Fehler beim Laden der Mitwirkenden: %1$S
+#
 noRepliesWarning=Warnung: Perspectives hat von den Notaren keine Antwort bekommen.
-inconsistentWarning=Warnung: Perspectives hat dieses Zertifikat NICHT durchgehend gesehen.
-thresholdWarning=Warnung: Perspectives hat dieses Zertifikat erst seit %1$S Tag(en) durchgehend gesehen, Schwellwert ist %2$S Tage.
-verifiedMessage=Überprüft: Perspectives hat dieses Zertifikat seit %1$S Tag(en) durchgehend gesehen, Schwellwert ist %2$S Tage.
+inconsistentWarning=Warnung: Perspectives hat dieses Zertifikat NICHT einheitlich gesehen.
+thresholdWarning=Warnung: Perspectives hat dieses Zertifikat erst seit %1$S Tag(en) einheitlich gesehen, Schwellwert ist %2$S Tage.
+verifiedMessage=Überprüft: Perspectives hat dieses Zertifikat seit %1$S Tag(en) einheitlich gesehen, Schwellwert ist %2$S Tage.
 exceptionAdded=Perspectives hat eine Sicherheitsausnahme für diese Webseite hinzugefügt.
 # Diese Strings, die zu report.js gehören, sind hier, weil report.xul noch nicht geladen worden ist.
 invalidURI=Ungültiger URI
-unableToMakeReport=Konnte keinen Bericht für diese Website erstellen.
-notEncryptedNoReport=%1$S ist eine unverschlüsselte Website - es gibt keinen Grund einen Bericht zu senden.
-noResultsNoReport=Keine Ergebnisse, um den Bericht zu erstellen.
+unableToMakeReport=Konnte keinen Bericht für diese Webseite erstellen.
+notEncryptedNoReport=%1$S ist eine unverschlüsselte Webseite - es gibt keinen Grund einen Bericht zu senden.
+noResultsNoReport=Keine Ergebnisse um den Bericht zu erstellen.
 noBrowserObject=Kein Webbrowser-Objekt zu diesem Fenster gefunden.
 notValidRemoteServer=URL ist kein gültiger Server.
-couldNotAddToWhitelist=Webseite konnte nicht zur Whitelist hinzugefügt werden
+couldNotAddToWhitelist=Webseite konnte nicht zur Whitelist hinzugefügt werden.
 # Für den Ergebnisse-Dialog
 LegendNotaryAndCurrentKey=Notar und aktueller Schlüssel
 LegendKeyHistory=Schlüsselverlauf (Tage)
 LegendBrowsersKey=Schlüssel des Webbrowsers
 ##
 contactingNotariesAbout=Frage bei den Notaren über '%1$S' nach
-configuredToWhitelist=Perspectives wurde konfiguriert, Verbindungen mit dieser Webseite automatisch zu erlauben
-configuredToWhitelistWithHost=Perspectives wurde konfiguriert, Verbindungen mit '%1$S' automatisch zu erlauben
+configuredToWhitelist=Perspectives wurde so konfiguriert, dass Verbindungen mit dieser Webseite automatisch erlaubt werden.
+configuredToWhitelistWithHost=Perspectives wurde so konfiguriert, dass Verbindungen mit '%1$S' automatisch erlaubt werden.
 addToWhitelist=Zur Whitelist hinzufügen
 removeFromWhitelist=Aus der Whitelist entfernen
-validatedButInsecureEmbedded=Perspectives hat das Zertifikat dieser Website überprüft und die Firefox Sicherheitsfehlerseite umgangen. Diese Seite bindet jedoch unsichere Inhalte ein.
+removeFromWhitelistQuestion='%1$S' aus der Whitelist entfernen?
+validatedButInsecureEmbedded=Perspectives hat das Zertifikat dieser Webseite überprüft und die Firefox Sicherheitsfehlerseite umgangen. Diese Seite bindet jedoch unsichere Inhalte ein.
 errorParsingNotaryEntry=Fehler beim Analysieren des Notareneintrags für '%1$S'
-couldNotFindLine=Konnte keine Zeile mit '%1$S' finden
+couldNotFindLine=Konnte keine Zeile mit '%1$S' finden.
 waitingOnURLData=Warten auf URL-Daten von Firefox (%1$S)
 listOfNotariesIsEmpty=Liste von Notarenserver ist leer
 notaryLookupFor=Nachfragen bei den Notaren über
 results=Ergebnisse
-quorumDuration=Quorum Dauer
+quorumDuration=Mindestdauer
 notaryObservations=Beobachtung der Notare
 sslKey=SSL-Schlüssel
 keyStart=Anfang
@@ -51,6 +56,11 @@ keyEnd=Ende
 keyDays=Tage
 noResults=Keine Ergebnisse
 signature=Unterschrift
+trustedButInsecureEmbedded=Das HTTPS Zertifikat ist vertrauenswürdig, diese Webseite bindet jedoch unsichere Inhalte ein.
+trustedWeaklyButInsecureEmbedded=Das HTTPS Zertifikat ist schwach-vertrauenswürdig, diese Webseite bindet jedoch unsichere Inhalte ein.
+trustedMultipleByBrowser=Diese Webseite benutzt mehrere Zertifikate inklusive des Zertifikats das von Ihrem Browser empfangen und vertraut wird.
+untrustedMultipleNotSeen=Diese Webseite benutzt regelmässig unterschiedliche Zertifikate, aber die meisten Notare haben das Zertifikat welches von Ihrem Browser empfangen wurde nicht vor kurzem gesehen.
+untrustedMultipleNotVerifiable=Perspectives kann diese Webseite nicht überprüfen, da sie regelmässig unterschiedliche Zertifikate verwendet.
 #strings for the 'update preferences' dialog in prompt_update()
 #this is a lot of text, so we break it up with \ns to make it more readable.
 updatePromptTitle=Perspectives Update
diff --git a/plugin/chrome/locale/en-US/notaries.properties b/plugin/chrome/locale/en-US/notaries.properties
index bb8657b..7e2d989 100644
--- a/plugin/chrome/locale/en-US/notaries.properties
+++ b/plugin/chrome/locale/en-US/notaries.properties
@@ -1,47 +1,51 @@
 # This file contains localized strings for Perspectives javascript code
-verificationSuccess=Perspectives has verified the security of your connection to this website and has bypassed the security error page
-unableToVerify=Suspected attack: Perspectives was unable to verify the security of your connection to this website
-reportThis=Report This
+verificationSuccess=Perspectives has verified the security of your connection to this website and has bypassed the security error page.
+unableToVerify=Suspected attack: Perspectives was unable to verify the security of your connection to this website.
+reportThis=Report this
 yesContactNotaries=Yes, contact Notaries
-learnMore=Learn More
+learnMore=Learn more
 hideNotificationReminders=Hide these messages
 noRepliesReceived=Warning: Perspectives received no notary replies. This may be an attack or you may be behind a firewall/proxy that blocks notary requests.
 firewallHelp=Firewall/Proxy Help
 noDataError=Perspectives: No Data. Browser provided an empty URI for this connection. Try hitting refresh.
-nonHTTPSError=Perspectives: Notaries are only contacted for HTTPS enabled websites. \nYour connection to %1$S uses %2$S
+nonHTTPSError=Perspectives: Notaries are only contacted for HTTPS enabled websites. \nYour connection to %1$S uses %2$S.
 rfc1918Error=Perspectives: No Information. The site with IP %1$S is on a private local network. Notary servers can only monitor public sites.
-noCertError=Perspectives: No information. The browser was unable to retrieve a certificate for %1$S
-noProbeRequestedError=Perspectives: No Information. Your preferences are set to query notaries only for HTTPS certificates that fail browser security checks. 
+noCertError=Perspectives: No information. The browser was unable to retrieve a certificate for %1$S.
+noProbeRequestedError=Perspectives: No Information. Your preferences are set to query notaries only for HTTPS certificates that fail browser security checks.
 needsPermission=Perspectives: No Information. Your preferences indicate that Perspectives should not contact Notaries without your permission.
-internalError=Perspectives: An internal error occurred: %1$S
+internalError=Perspectives: An internal error occurred: %1$S.
+updateDefaultListFileError=Unexpected error updating default notary list from file: %1$S.
+updateDefaultListWebError=Unexpected error updating default notary list from web: %1$S.
+loadingCreditsError=Error loading credits: %1$S
 noRepliesWarning=Warning: Perspectives received no Notary replies.
 inconsistentWarning=Warning: Perspectives has NOT seen this certificate consistently.
-thresholdWarning=Warning: Perspectives has seen this certificate consistently for only %1$S days, threshold is %2$S days
-verifiedMessage=Verified: Perspectives has seen this certificate consistently for %1$S days, threshold is %2$S days
-exceptionAdded=Perspectives has added a security exception for this site
+thresholdWarning=Warning: Perspectives has seen this certificate consistently for only %1$S days, threshold is %2$S days.
+verifiedMessage=Verified: Perspectives has seen this certificate consistently for %1$S days, threshold is %2$S days.
+exceptionAdded=Perspectives has added a security exception for this site.
 # These strings for report.js are here because report.xul has not yet been loaded
 invalidURI=Invalid URI
-unableToMakeReport=Unable to generate a report for this website
-notEncryptedNoReport=%1$S is not an encrypted website - there is no point in sending a report
-noResultsNoReport=No results to generate report
-noBrowserObject=No browser object found for this window
-notValidRemoteServer=URL is not a valid remote server
+unableToMakeReport=Unable to generate a report for this website.
+notEncryptedNoReport=%1$S is not an encrypted website - there is no point in sending a report.
+noResultsNoReport=No results to generate report.
+noBrowserObject=No browser object found for this window.
+notValidRemoteServer=URL is not a valid remote server.
 couldNotAddToWhitelist=Could not add site to whitelist
 # For results dialog svg
 LegendNotaryAndCurrentKey=Notary and Current Key
 LegendKeyHistory=Key History (Days)
 LegendBrowsersKey=Browser's Key
 #
-contactingNotariesAbout=Contacting notaries about '%1$S'
-configuredToWhitelist=You have configured Perspectives to whitelist connections to this website
-configuredToWhitelistWithHost=You have configured Perspectives to whitelist connections to '%1$S'
-addToWhitelist=Add To Whitelist
+contactingNotariesAbout=Contacting notaries about '%1$S'.
+configuredToWhitelist=You have configured Perspectives to whitelist connections to this website.
+configuredToWhitelistWithHost=You have configured Perspectives to whitelist connections to '%1$S'.
+addToWhitelist=Add to Whitelist
 removeFromWhitelist=Remove from Whitelist
-validatedButInsecureEmbedded=Perspectives has validated this website's certificate and bypassed the security error page. However, this page contains insecure embedded content
-errorParsingNotaryEntry=Error parsing notary entry for '%1$S'
-couldNotFindLine=Could not find '%1$S' line
+removeFromWhitelistQuestion=Remove '%1$S' from Whitelist?
+validatedButInsecureEmbedded=Perspectives has validated this website's certificate and bypassed the security error page. However, this page contains insecure embedded content.
+errorParsingNotaryEntry=Error parsing notary entry for '%1$S'.
+couldNotFindLine=Could not find '%1$S' line.
 waitingOnURLData=Waiting on URL data (%1$S)
-listOfNotariesIsEmpty=List of notary servers is empty
+listOfNotariesIsEmpty=List of notary servers is empty.
 notaryLookupFor=Notary Lookup for
 results=Results
 quorumDuration=Quorum Duration
@@ -52,9 +56,14 @@ keyEnd=end
 keyDays=days
 noResults=No Results
 signature=Signature
+trustedButInsecureEmbedded=HTTPS Certificate is trusted, but site contains insecure embedded content.
+trustedWeaklyButInsecureEmbedded=HTTPS Certificate is weakly trusted, but site contains insecure embedded content.
+trustedMultipleByBrowser=This site uses multiple certificates, including the certificate received and trusted by your browser.
+untrustedMultipleNotSeen=This site regularly uses multiples certificates, and most Notaries have not recently seen the certificate received by the browser.
+untrustedMultipleNotVerifiable=Perspectives is unable to validate this site, because the site regularly uses multiples certificates.
 #strings for the 'update preferences' dialog in prompt_update()
 #this is a lot of text, so we break it up with \ns to make it more readable.
 updatePromptTitle=Perspectives Update
 updatePrompt=Thank you for updating Perspectives. As of Perspectives 4.0, the default setting is to contact notaries for *all* HTTPS sites rather than only when there is a certificate error.\n\nDo you want to contact notaries for all HTTPS sites?\n(This can be changed at any time in the Preferences window)
-updatePromptButtonYes=Yes, contact notaries for all HTTPS sites
-updatePromptButtonNo=No, only check for websites with certificate errors
+updatePromptButtonYes=Yes, contact notaries for all HTTPS sites.
+updatePromptButtonNo=No, only check for websites with certificate errors.
diff --git a/plugin/chrome/locale/es-MX/notaries.properties b/plugin/chrome/locale/es-MX/notaries.properties
index 2653d71..55e57bc 100644
--- a/plugin/chrome/locale/es-MX/notaries.properties
+++ b/plugin/chrome/locale/es-MX/notaries.properties
@@ -13,6 +13,11 @@ noCertError=Perspectives: No hay información. El navegador ha sido incapaz de r
 noProbeRequestedError=Perspectives: No hay información. Sus preferencias indican que las notarías deben ser contactadas solamente para certificados HTTPS que fallan la inspección de seguridad de su navegador.
 needsPermission=Perspectives: No hay información. Sus preferencias indican que Perspectives no debe contactar notarías sin su autorización.
 internalError=Perspectives: Ha ocurrido un error interno: %1$S
+# TODO: translate
+updateDefaultListFileError=Unexpected error updating default notary list from file: %1$S
+updateDefaultListWebError=Unexpected error updating default notary list from web: %1$S
+loadingCreditsError=Error loading credits: %1$S
+#
 noRepliesWarning=Advertencia: Perspectives no ha recibido respuesta de las notarías.
 inconsistentWarning=Advertencia: Perspectives NO ha visto este certificado de manera consistente.
 thresholdWarning=Advertencia: Perspectives ha visto este certificado consistentemente por tan solo %1$S días, mientras que el rango mínimo especificado es de %2$S días
@@ -25,7 +30,7 @@ unableToMakeReport=Imposible generar un reporte para este sitio web
 notEncryptedNoReport=%1$S no es un sitio encriptado - Es innecesario mandar un reporte
 noResultsNoReport=No hay resultados para generar un reporte
 noBrowserObject=No se ha encontrado un objeto de navegador requerido en esta ventana
-notValidRemoteServer=La dirección no corresponde a un servidor remoto válido 
+notValidRemoteServer=La dirección no corresponde a un servidor remoto válido
 couldNotAddToWhitelist=Imposible agregar el sitio a la lista blanca
 
 # For results dialog svg
@@ -38,6 +43,9 @@ configuredToWhitelist=Usted ha configurado la lista blanca de Perspectives para
 configuredToWhitelistWithHost=Usted ha configurado la lista blanca de Perspectives para aceptar conexiones con '%1$S'
 addToWhitelist=Agregar a Lista Blanca
 removeFromWhitelist=Remover de Lista Blanca
+# TODO: translate
+removeFromWhitelistQuestion=Remove '%1$S' from whitelist?
+#
 validatedButInsecureEmbedded=Perspectives ha validado el certificado de este sitio, y eludido la página de error de seguridad de Firefox. Sin embargo, esta página incluye contenido inseguro
 errorParsingNotaryEntry=Error interpretando la información de notaría para '%1$S'
 couldNotFindLine=Imposible encontrar la línea '%1$S'
@@ -53,6 +61,13 @@ keyEnd=final
 keyDays=días
 noResults=Sin Resultados
 signature=Firma
+# TODO: translate
+trustedButInsecureEmbedded=HTTPS Certificate is trusted, but site contains insecure embedded content.
+trustedWeaklyButInsecureEmbedded=HTTPS Certificate is weakly trusted, but site contains insecure embedded content.
+trustedMultipleByBrowser=This site uses multiple certificates, including the certificate received and trusted by your browser.
+untrustedMultipleNotSeen=This site regularly uses multiples certificates, and most Notaries have not recently seen the certificate received by the browser.
+untrustedMultipleNotVerifiable=Perspectives is unable to validate this site, because the site regularly uses multiples certificates.
+#
 #TODO: please translate these
 #strings for the 'update preferences' dialog in prompt_update()
 #this is a lot of text, so we break it up with \ns to make it more readable.
diff --git a/plugin/chrome/locale/fi/notaries.properties b/plugin/chrome/locale/fi/notaries.properties
index da49849..d64362a 100644
--- a/plugin/chrome/locale/fi/notaries.properties
+++ b/plugin/chrome/locale/fi/notaries.properties
@@ -11,9 +11,14 @@ noDataError=Perspectives: No Data. Browser provided an empty URI for this connec
 nonHTTPSError=Perspectives: Notaries are only contacted for HTTPS enabled websites. \nYour connection to %1$S uses %2$S
 rfc1918Error=Perspectives: No Information. The site with IP %1$S is on a private local network. Notary servers can only monitor public sites.
 noCertError=Perspectives: No information. The browser was unable to retrieve a certificate for %1$S
-noProbeRequestedError=Perspectives: No Information. Your preferences are set to query notaries only for HTTPS certificates that fail browser security checks. 
+noProbeRequestedError=Perspectives: No Information. Your preferences are set to query notaries only for HTTPS certificates that fail browser security checks.
 needsPermission=Perspectives: No Information. Your preferences indicate that Perspectives should not contact Notaries without your permission.
 internalError=Perspectives: An internal error occurred: %1$S
+# TODO: translate
+updateDefaultListFileError=Unexpected error updating default notary list from file: %1$S
+updateDefaultListWebError=Unexpected error updating default notary list from web: %1$S
+loadingCreditsError=Error loading credits: %1$S
+#
 noRepliesWarning=Warning: Perspectives received no Notary replies.
 inconsistentWarning=Warning: Perspectives has NOT seen this certificate consistently.
 thresholdWarning=Warning: Perspectives has seen this certificate consistently for only %1$S days, threshold is %2$S days
@@ -36,6 +41,9 @@ configuredToWhitelist=You have configured Perspectives to whitelist connections
 configuredToWhitelistWithHost=You have configured Perspectives to whitelist connections to '%1$S'
 addToWhitelist=Add To Whitelist
 removeFromWhitelist=Remove from Whitelist
+# TODO: translate
+removeFromWhitelistQuestion=Remove '%1$S' from whitelist?
+#
 validatedButInsecureEmbedded=Perspectives has validated this website's certificate and bypassed Firefox's security error page. However, this page contains insecure embedded content
 errorParsingNotaryEntry=Error parsing notary entry for '%1$S'
 couldNotFindLine=Could not find '%1$S' line
@@ -51,6 +59,13 @@ keyEnd=end
 keyDays=days
 noResults=No Results
 signature=Signature
+# TODO: translate
+trustedButInsecureEmbedded=HTTPS Certificate is trusted, but site contains insecure embedded content.
+trustedWeaklyButInsecureEmbedded=HTTPS Certificate is weakly trusted, but site contains insecure embedded content.
+trustedMultipleByBrowser=This site uses multiple certificates, including the certificate received and trusted by your browser.
+untrustedMultipleNotSeen=This site regularly uses multiples certificates, and most Notaries have not recently seen the certificate received by the browser.
+untrustedMultipleNotVerifiable=Perspectives is unable to validate this site, because the site regularly uses multiples certificates.
+#
 #TODO: please translate these
 #strings for the 'update preferences' dialog in prompt_update()
 #this is a lot of text, so we break it up with \ns to make it more readable.
diff --git a/plugin/chrome/locale/fr/notaries.properties b/plugin/chrome/locale/fr/notaries.properties
index c642668..2ad4d93 100644
--- a/plugin/chrome/locale/fr/notaries.properties
+++ b/plugin/chrome/locale/fr/notaries.properties
@@ -13,6 +13,11 @@ noCertError=Perspectives : aucune information. Le navigateur n'a pas pu récupé
 noProbeRequestedError=Perspectives : aucune Information. Vos préférences sont paramétrées pour ne demander aux Notaires que les certificats HTTPS qui font échouer les vérifications de sécurité du navigateur.
 needsPermission=Perspectives : aucune Information. Vos préférences indiquent que Perspectives ne devrait pas contacter les Notaires sans votre permission
 internalError=Perspectives : une erreur interne s'est produite : %1$S
+# TODO: translate
+updateDefaultListFileError=Unexpected error updating default notary list from file: %1$S
+updateDefaultListWebError=Unexpected error updating default notary list from web: %1$S
+loadingCreditsError=Error loading credits: %1$S
+#
 noRepliesWarning=Attention : Perspectives n'a pas reçu de réponses des Notaires.
 inconsistentWarning=Attention : Perspectives n'a PAS observé l'usage ce certificat de façon pertinente.
 thresholdWarning=Attention : Perspectives a observé l'usage de ce certificat de façon pertinente pendant seulement %1$S jours, le seuil minimum est fixé à %2$S jours
@@ -36,6 +41,9 @@ configuredToWhitelist=Vous avez configuré Perspectives pour mettre sur liste bl
 configuredToWhitelistWithHost=Vous avez configuré Perspectives pour mettre sur liste blanche les connexions à « %1$S »
 addToWhitelist=Ajouter à la liste blanche
 removeFromWhitelist=Supprimer de la liste blanche
+# TODO: translate
+removeFromWhitelistQuestion=Remove '%1$S' from whitelist?
+#
 validatedButInsecureEmbedded=Perspectives a validé le certificat de ce site web et contourné la page des erreurs de sécurité de Firefox. Cependant, cette page contient du contenu embarqué non-sécurisé.
 errorParsingNotaryEntry=Erreur en analysant l'entrée de Notaire pour « %1$S »
 couldNotFindLine=Impossible de trouver la ligne « %1$S »
@@ -51,6 +59,13 @@ keyEnd=fin
 keyDays=jours
 noResults=Aucun résultat
 signature=Signature
+# TODO: translate
+trustedButInsecureEmbedded=HTTPS Certificate is trusted, but site contains insecure embedded content.
+trustedWeaklyButInsecureEmbedded=HTTPS Certificate is weakly trusted, but site contains insecure embedded content.
+trustedMultipleByBrowser=This site uses multiple certificates, including the certificate received and trusted by your browser.
+untrustedMultipleNotSeen=This site regularly uses multiples certificates, and most Notaries have not recently seen the certificate received by the browser.
+untrustedMultipleNotVerifiable=Perspectives is unable to validate this site, because the site regularly uses multiples certificates.
+#
 #TODO: please translate these
 #strings for the 'update preferences' dialog in prompt_update()
 #this is a lot of text, so we break it up with \ns to make it more readable.
diff --git a/plugin/chrome/locale/nl/notaries.properties b/plugin/chrome/locale/nl/notaries.properties
index f6a2601..d78660c 100644
--- a/plugin/chrome/locale/nl/notaries.properties
+++ b/plugin/chrome/locale/nl/notaries.properties
@@ -13,6 +13,11 @@ noCertError=Perspectives: No information. The browser was unable to retrieve a c
 noProbeRequestedError=Perspectives: No Information. Your preferences are set to query notaries only for HTTPS certificates that fail browser security checks.
 needsPermission=Perspectives: No Information. Your preferences indicate that Perspectives should not contact Notaries without your permission.
 internalError=Perspectives: An internal error occurred: %1$S
+# TODO: translate
+updateDefaultListFileError=Unexpected error updating default notary list from file: %1$S
+updateDefaultListWebError=Unexpected error updating default notary list from web: %1$S
+loadingCreditsError=Error loading credits: %1$S
+#
 noRepliesWarning=Warning: Perspectives received no Notary replies.
 inconsistentWarning=Warning: Perspectives has NOT seen this certificate consistently.
 thresholdWarning=Warning: Perspectives has seen this certificate consistently for only %1$S days, threshold is %2$S days
@@ -35,6 +40,9 @@ configuredToWhitelist=You have configured Perspectives to whitelist connections
 configuredToWhitelistWithHost=You have configured Perspectives to whitelist connections to '%1$S'
 addToWhitelist=Add To Whitelist
 removeFromWhitelist=Remove from Whitelist
+# TODO: translate
+removeFromWhitelistQuestion=Remove '%1$S' from whitelist?
+#
 validatedButInsecureEmbedded=Perspectives has validated this website's certificate and bypassed Firefox's security error page. However, this page contains insecure embedded content
 errorParsingNotaryEntry=Error parsing notary entry for '%1$S'
 couldNotFindLine=Could not find '%1$S' line
@@ -50,6 +58,13 @@ keyEnd=end
 keyDays=days
 noResults=No Results
 signature=Signature
+# TODO: translate
+trustedButInsecureEmbedded=HTTPS Certificate is trusted, but site contains insecure embedded content.
+trustedWeaklyButInsecureEmbedded=HTTPS Certificate is weakly trusted, but site contains insecure embedded content.
+trustedMultipleByBrowser=This site uses multiple certificates, including the certificate received and trusted by your browser.
+untrustedMultipleNotSeen=This site regularly uses multiples certificates, and most Notaries have not recently seen the certificate received by the browser.
+untrustedMultipleNotVerifiable=Perspectives is unable to validate this site, because the site regularly uses multiples certificates.
+#
 #TODO: please translate these
 #strings for the 'update preferences' dialog in prompt_update()
 #this is a lot of text, so we break it up with \ns to make it more readable.
diff --git a/plugin/chrome/locale/pl/notaries.properties b/plugin/chrome/locale/pl/notaries.properties
index 1b83ae3..03458c6 100644
--- a/plugin/chrome/locale/pl/notaries.properties
+++ b/plugin/chrome/locale/pl/notaries.properties
@@ -14,6 +14,11 @@ noCertError=Perspectives: Brak informacji. Przeglądarka nie była w stanie pobr
 noProbeRequestedError=Perspectives: Brak informacji. Zgodnie z Twoimi ustawieniami, notariusze odpytywani są o certyfikaty HTTPS tylko wtedy, gdy przeglądarka nie jest w stanie sama ich zweryfikować.
 needsPermission=Perspectives: Brak informacji. Zgodnie z Twoimi ustawieniami, Perspectives nie powinno kontaktować się z notariuszami bez Twojej zgody.
 internalError=Perspectives: Wystąpił błąd wewnętrzny: %1$S
+# TODO: translate
+updateDefaultListFileError=Unexpected error updating default notary list from file: %1$S
+updateDefaultListWebError=Unexpected error updating default notary list from web: %1$S
+loadingCreditsError=Error loading credits: %1$S
+#
 noRepliesWarning=Uwaga: Perspectives nie otrzymało żadnej odpowiedzi od notariuszy.
 inconsistentWarning=Uwaga: Obserwacje certyfikatu nie były spójne.
 thresholdWarning=Uwaga: Obserwacje tego certyfikatu były spójne jedynie przez %1$S dni, próg to %2$S dni
@@ -37,6 +42,9 @@ configuredToWhitelist=Połączenie do tej strony internetowej zostało dodane do
 configuredToWhitelistWithHost=Połączenia do '%1$S' zostały dodane do białej listy
 addToWhitelist=Dodaj do białej listy
 removeFromWhitelist=Usuń z białej listy
+# TODO: translate
+removeFromWhitelistQuestion=Remove '%1$S' from whitelist?
+#
 validatedButInsecureEmbedded=Perspectives zweryfikowało certyfikat tej strony i o minęło stronę błędu bezpieczeństwa. Strona ta zawiera jednak niebezpiecznie osadzoną zawartość
 errorParsingNotaryEntry=Błąd podczas parsowania wpisu notariusza dla '%1$S'
 couldNotFindLine=Nie znaleziono linijki '%1$S'
@@ -52,6 +60,13 @@ keyEnd=koniec
 keyDays=dni
 noResults=Brak wyników
 signature=Podpis
+# TODO: translate
+trustedButInsecureEmbedded=HTTPS Certificate is trusted, but site contains insecure embedded content.
+trustedWeaklyButInsecureEmbedded=HTTPS Certificate is weakly trusted, but site contains insecure embedded content.
+trustedMultipleByBrowser=This site uses multiple certificates, including the certificate received and trusted by your browser.
+untrustedMultipleNotSeen=This site regularly uses multiples certificates, and most Notaries have not recently seen the certificate received by the browser.
+untrustedMultipleNotVerifiable=Perspectives is unable to validate this site, because the site regularly uses multiples certificates.
+#
 #strings for the 'update preferences' dialog in prompt_update()
 #this is a lot of text, so we break it up with \ns to make it more readable.
 updatePromptTitle=Aktualizacja Perspectives
diff --git a/plugin/chrome/locale/zh-CN/notaries.properties b/plugin/chrome/locale/zh-CN/notaries.properties
index 1798f91..ab1b481 100644
--- a/plugin/chrome/locale/zh-CN/notaries.properties
+++ b/plugin/chrome/locale/zh-CN/notaries.properties
@@ -7,12 +7,17 @@ learnMore=了解更多
 noRepliesReceived=警告:Perspectives 未收到认证服务器的回复。这可能是由于一个攻击,或者是你的防火墙/代理阻止了认证的请求。
 firewallHelp=防火墙/代理帮助
 noDataError=Perspectives:无数据。浏览器为这个连接提供了空 URI。请尝试重新载入
-nonHTTPSError=Perspectives:只有访问 HTTPS 站点时才联系认证服务器。\n你连接到 %1$S 使用的是 %2$S 
+nonHTTPSError=Perspectives:只有访问 HTTPS 站点时才联系认证服务器。\n你连接到 %1$S 使用的是 %2$S
 rfc1918Error=Perspectives:无信息。 IP 为 %1$S 的站点在一个私人局域网中。认证服务器只能监视公开站点。
 noCertError=Perspectives:无信息。浏览器找不到 %1$S 的证书
 noProbeRequestedError=Perspectives:无信息。你的首选项要求仅在未通过浏览器的安全检测时才为 HTTPS 证书查询认证。
 needsPermission=Perspectives:无信息。你的首选项要求未经你的允许,Perspectives 不能联系认证服务器。
 internalError=Perspectives:发生内部错误: %1$S
+# TODO: translate
+updateDefaultListFileError=Unexpected error updating default notary list from file: %1$S
+updateDefaultListWebError=Unexpected error updating default notary list from web: %1$S
+loadingCreditsError=Error loading credits: %1$S
+#
 noRepliesWarning=警告:Perspectives 未收到Notary的回复。
 inconsistentWarning=警告:Perspectives 未见过此的证书。
 thresholdWarning=警告:Perspectives 仅连续 %1$S 天见到此证书,最短持续时间是 %1$S 天
@@ -35,6 +40,9 @@ configuredToWhitelist=你已将到此站点的连接加入了 Perspectives 白
 configuredToWhitelistWithHost=你已将到 '%1$S' 的连接加入了 Perspectives 白名单
 addToWhitelist=添加到白名单
 removeFromWhitelist=从白名单移除
+# TODO: translate
+removeFromWhitelistQuestion=Remove '%1$S' from whitelist?
+#
 validatedButInsecureEmbedded=Perspectives 已验证此站点的证书并跳过了 Firefox 的安全错误页。然而此页面包含了不安全的嵌入内容
 errorParsingNotaryEntry=解析 '%1$S' 的认证条目出错
 couldNotFindLine=找不到 '%1$S' 的行
@@ -50,6 +58,13 @@ keyEnd=结束
 keyDays=天
 noResults=无结果
 signature=签名
+# TODO: translate
+trustedButInsecureEmbedded=HTTPS Certificate is trusted, but site contains insecure embedded content.
+trustedWeaklyButInsecureEmbedded=HTTPS Certificate is weakly trusted, but site contains insecure embedded content.
+trustedMultipleByBrowser=This site uses multiple certificates, including the certificate received and trusted by your browser.
+untrustedMultipleNotSeen=This site regularly uses multiples certificates, and most Notaries have not recently seen the certificate received by the browser.
+untrustedMultipleNotVerifiable=Perspectives is unable to validate this site, because the site regularly uses multiples certificates.
+#
 #TODO: please translate these
 #strings for the 'update preferences' dialog in prompt_update()
 #this is a lot of text, so we break it up with \ns to make it more readable.

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/perspectives-extension.git



More information about the Pkg-mozext-commits mailing list