Index: /CKEditor/trunk/_dev/langtool/includes/cklangtool.js
===================================================================
--- /CKEditor/trunk/_dev/langtool/includes/cklangtool.js	(revision 3106)
+++ /CKEditor/trunk/_dev/langtool/includes/cklangtool.js	(revision 3107)
@@ -115,9 +115,9 @@
 		blockCommentStart :Pattern.compile( "\\/\\*" ),
 		blockCommentEnd :Pattern.compile( "\\*\\/" ),
-		entry :Pattern.compile( "^(\\s*)([a-z0-9]+)(\\s*:\\s*\\').*?(\\'.*)$", Pattern.CASE_INSENSITIVE ),
-		arrayEntry :Pattern.compile( "^(\\s*)([a-z0-9]+)(\\s*:\\s*\\[)(.*?)(\\].*)$", Pattern.CASE_INSENSITIVE ),
+		entry :Pattern.compile( "^(\\s*)([a-z0-9][_a-z0-9]*)(\\s*:\\s*\\').*?(\\'.*)$", Pattern.CASE_INSENSITIVE ),
+		arrayEntry :Pattern.compile( "^(\\s*)([a-z0-9][_a-z0-9]*)(\\s*:\\s*\\[)(.*?)(\\].*)$", Pattern.CASE_INSENSITIVE ),
 		arrayItemEntry :Pattern.compile( "\\s*(?:'(.*?)'(?:\\s*,\\s*)?)" ),
 		arrayTranslationKey :Pattern.compile( "^(.*)\\[(\\d+)\\]$" ),
-		objectName :Pattern.compile( "^\\s*([a-z][a-z0-9]*)\\s*:\\s*$", Pattern.CASE_INSENSITIVE ),
+		objectName :Pattern.compile( "^\\s*([a-z][_a-z0-9]*)\\s*:\\s*$", Pattern.CASE_INSENSITIVE ),
 		objectStart :Pattern.compile( "\\{" ),
 		objectEnd :Pattern.compile( "\\}" ),
@@ -457,5 +457,14 @@
 		}
 
-		return result.replace( "\\", "\\\\" ).replace( "\r", "\\r" ).replace( "\n", "\\n" ).replace( "'", "\\'" );
+		return escapeString( result );
+	}
+
+	/*
+	 * Escapes all characters so that a string could be properly saved to a file.
+	 */
+	function escapeString( string )
+	{
+		return string.replace( "\\", "\\\\" ).replace( "\r", "\\r" ).replace( "\n", "\\n" ).replace( "'", "\\'" ).replace( "\u200b",
+				"\\u200b" );
 	}
 
@@ -478,6 +487,4 @@
 			replacement = getTranslation( translation, translationKey );
 
-			if ( translationKey.substring( 0, 2 ) != "__" )
-				found++;
 			/*
 			 * common.textField[1] -> common.textField
@@ -498,4 +505,7 @@
 			{
 				string = (string.substring( 0, matchResult.start() ) + replacement + string.substring( matchResult.end() ));
+
+				if ( translationKey.substring( 0, 2 ) != "__" )
+					found++;
 			}
 
@@ -519,5 +529,5 @@
 				else
 				{
-					lines[ i ] = line.replace( "//", "// MISSING" ).replace( /\[MISSING_TRANSLATION\]/g, '' );
+					lines[ i ] = line.replace( "//", "// MISSING //" ).replace( /\[MISSING_TRANSLATION\]/g, '' );
 				}
 			}
@@ -576,5 +586,7 @@
 			}
 
-			CKLANGTOOL.io.saveFile( new File( CKLANGTOOL.languageDir, "_translationstatus.txt" ), status.join( "\r\n" ), false );
+			var header = "Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.\r\nFor licensing, see LICENSE.html or http://ckeditor.com/license\r\n\r\n";
+
+			CKLANGTOOL.io.saveFile( new File( CKLANGTOOL.languageDir, "_translationstatus.txt" ), header + status.join( "\r\n" ), false );
 			print( "Process completed." );
 		}
