Explorar o código

13.3.8 release

Gaudenz Alder %!s(int64=5) %!d(string=hai) anos
pai
achega
d26cf394ca
Modificáronse 79 ficheiros con 3024 adicións e 2741 borrados
  1. 4 0
      ChangeLog
  2. 1 1
      VERSION
  3. 11 8
      etc/sheetsaddon/Code.gs
  4. 5 5
      etc/sheetsaddon/Picker.html
  5. 2 0
      src/main/webapp/connect/office365/js/app.js
  6. 8 3
      src/main/webapp/connect/office365/js/drive.js
  7. 29 29
      src/main/webapp/electronFilesWorker.js
  8. 4 0
      src/main/webapp/index.html
  9. 1 1
      src/main/webapp/js/PreConfig.js
  10. 368 364
      src/main/webapp/js/app.min.js
  11. 171 4
      src/main/webapp/js/diagramly/App.js
  12. 10 0
      src/main/webapp/js/diagramly/Dialogs.js
  13. 3 69
      src/main/webapp/js/diagramly/DrawioFile.js
  14. 1 1
      src/main/webapp/js/diagramly/Editor.js
  15. 164 159
      src/main/webapp/js/diagramly/EditorUi.js
  16. 152 29
      src/main/webapp/js/diagramly/LocalFile.js
  17. 4 34
      src/main/webapp/js/diagramly/Menus.js
  18. 2 8
      src/main/webapp/js/diagramly/Minimal.js
  19. 667 667
      src/main/webapp/js/viewer-static.min.js
  20. 667 667
      src/main/webapp/js/viewer.min.js
  21. 2 1
      src/main/webapp/resources/dia.txt
  22. 2 1
      src/main/webapp/resources/dia_am.txt
  23. 2 1
      src/main/webapp/resources/dia_ar.txt
  24. 2 1
      src/main/webapp/resources/dia_bg.txt
  25. 2 1
      src/main/webapp/resources/dia_bn.txt
  26. 2 1
      src/main/webapp/resources/dia_bs.txt
  27. 2 1
      src/main/webapp/resources/dia_ca.txt
  28. 2 1
      src/main/webapp/resources/dia_cs.txt
  29. 2 1
      src/main/webapp/resources/dia_da.txt
  30. 3 2
      src/main/webapp/resources/dia_de.txt
  31. 2 1
      src/main/webapp/resources/dia_el.txt
  32. 44 43
      src/main/webapp/resources/dia_eo.txt
  33. 2 1
      src/main/webapp/resources/dia_es.txt
  34. 2 1
      src/main/webapp/resources/dia_et.txt
  35. 2 1
      src/main/webapp/resources/dia_eu.txt
  36. 2 1
      src/main/webapp/resources/dia_fa.txt
  37. 2 1
      src/main/webapp/resources/dia_fi.txt
  38. 2 1
      src/main/webapp/resources/dia_fil.txt
  39. 2 1
      src/main/webapp/resources/dia_fr.txt
  40. 535 534
      src/main/webapp/resources/dia_gl.txt
  41. 2 1
      src/main/webapp/resources/dia_gu.txt
  42. 2 1
      src/main/webapp/resources/dia_he.txt
  43. 2 1
      src/main/webapp/resources/dia_hi.txt
  44. 2 1
      src/main/webapp/resources/dia_hr.txt
  45. 2 1
      src/main/webapp/resources/dia_hu.txt
  46. 1 0
      src/main/webapp/resources/dia_i18n.txt
  47. 2 1
      src/main/webapp/resources/dia_id.txt
  48. 2 1
      src/main/webapp/resources/dia_it.txt
  49. 2 1
      src/main/webapp/resources/dia_ja.txt
  50. 2 1
      src/main/webapp/resources/dia_kn.txt
  51. 2 1
      src/main/webapp/resources/dia_ko.txt
  52. 2 1
      src/main/webapp/resources/dia_lt.txt
  53. 2 1
      src/main/webapp/resources/dia_lv.txt
  54. 2 1
      src/main/webapp/resources/dia_ml.txt
  55. 2 1
      src/main/webapp/resources/dia_mr.txt
  56. 2 1
      src/main/webapp/resources/dia_ms.txt
  57. 2 1
      src/main/webapp/resources/dia_my.txt
  58. 2 1
      src/main/webapp/resources/dia_nl.txt
  59. 2 1
      src/main/webapp/resources/dia_no.txt
  60. 2 1
      src/main/webapp/resources/dia_pl.txt
  61. 2 1
      src/main/webapp/resources/dia_pt-br.txt
  62. 2 1
      src/main/webapp/resources/dia_pt.txt
  63. 2 1
      src/main/webapp/resources/dia_ro.txt
  64. 2 1
      src/main/webapp/resources/dia_ru.txt
  65. 2 1
      src/main/webapp/resources/dia_si.txt
  66. 2 1
      src/main/webapp/resources/dia_sk.txt
  67. 2 1
      src/main/webapp/resources/dia_sl.txt
  68. 2 1
      src/main/webapp/resources/dia_sr.txt
  69. 2 1
      src/main/webapp/resources/dia_sv.txt
  70. 2 1
      src/main/webapp/resources/dia_sw.txt
  71. 2 1
      src/main/webapp/resources/dia_ta.txt
  72. 2 1
      src/main/webapp/resources/dia_te.txt
  73. 2 1
      src/main/webapp/resources/dia_th.txt
  74. 2 1
      src/main/webapp/resources/dia_tr.txt
  75. 2 1
      src/main/webapp/resources/dia_uk.txt
  76. 2 1
      src/main/webapp/resources/dia_vi.txt
  77. 2 1
      src/main/webapp/resources/dia_zh-tw.txt
  78. 2 1
      src/main/webapp/resources/dia_zh.txt
  79. 59 59
      src/main/webapp/service-worker.js

+ 4 - 0
ChangeLog

@@ -1,3 +1,7 @@
+03-JUL-2020: 13.3.8
+
+- Adds experimental file system support
+
 02-JUL-2020: 13.3.7
 
 - Fixes image export with sketch style

+ 1 - 1
VERSION

@@ -1 +1 @@
-13.3.7
+13.3.8

+ 11 - 8
etc/sheetsaddon/Code.gs

@@ -1,8 +1,9 @@
 /**
- * diagrams.net Diagrams Sheets add-on v1.0
- * Copyright (c) 2019, JGraph Ltd
+ * diagrams.net Diagrams Sheets add-on v1.1
+ * Copyright (c) 2020, JGraph Ltd
  */
 var EXPORT_URL = "https://exp.draw.io/ImageExport4/export";
+var DIAGRAMS_URL = "https://app.diagrams.net/";
 var DRAW_URL = "https://www.draw.io/";
 
 /**
@@ -51,15 +52,15 @@ function getOAuthToken() {
 function insertDiagrams()
 {
   var html = HtmlService.createHtmlOutputFromFile('Picker.html')
-      .setWidth(620).setHeight(440)
+      .setWidth(640).setHeight(480)
       .setSandboxMode(HtmlService.SandboxMode.IFRAME);
-  SpreadsheetApp.getUi().showModalDialog(html, 'Select Diagrams:');
+  SpreadsheetApp.getUi().showModalDialog(html, 'Select files');
 }
 
 function refreshSheet()
 {
   var cur = SpreadsheetApp.getActiveSheet();
-  var dummy = SpreadsheetApp.getActive().insertSheet("Working...");
+  var dummy = SpreadsheetApp.getActive().insertSheet('Working...');
   SpreadsheetApp.setActiveSheet(dummy);
   SpreadsheetApp.flush();
   SpreadsheetApp.setActiveSheet(cur, true);
@@ -282,7 +283,7 @@ function createLink(id, page, pageId, scale)
   
   params.push('scale=' + (scale || '1'));
   
-  return DRAW_URL + ((params.length > 0) ? "?" + params.join("&") : "") + "#G" + id;
+  return DIAGRAMS_URL + ((params.length > 0) ? "?" + params.join("&") : "") + "#G" + id;
 }
 
 /**
@@ -290,7 +291,9 @@ function createLink(id, page, pageId, scale)
  */
 function isValidLink(url)
 {
-  return url != null && (url.substring(0, DRAW_URL.length) == DRAW_URL || url.substring(0, 22) == "https://drive.draw.io/");
+  return url != null && (url.substring(0, DRAW_URL.length) == DRAW_URL ||
+  	url.substring(0, DIAGRAMS_URL.length) == DIAGRAMS_URL ||
+  	url.substring(0, 22) == "https://drive.draw.io/");
 }
 
 /**
@@ -449,7 +452,7 @@ function fetchImage(id, page, scale, pageId)
  */
 function newDiagram()
 {
-  openUrl('https://www.draw.io/?mode=google');
+  openUrl('https://app.diagrams.net/?mode=google');
 }
 
 /**

+ 5 - 5
etc/sheetsaddon/Picker.html

@@ -3,7 +3,7 @@
 <head>
 <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons.css">
 <script type="text/javascript">
-  var DIALOG_DIMENSIONS = {width: 600, height: 420};
+  var DIALOG_DIMENSIONS = {width: 620, height: 460};
   var DEVELOPER_KEY = 'AIzaSyB4sU8tc25bR_87qNb7eUVQN72_vv8mpbU';
 
   /**
@@ -50,8 +50,8 @@
     if (token)
     {
 		var view1 = new google.picker.DocsView(google.picker.ViewId.FOLDERS)
-		    .setParent('root')
-		    .setIncludeFolders(true)
+	    	.setParent('root')
+	    	.setIncludeFolders(true)
 			.setMimeTypes('*/*');
 		
 		var view2 = new google.picker.DocsView()
@@ -68,8 +68,8 @@
 		    .addView(view1)
 		    .addView(view2)
 		    .addView(view3)
-		    .addView(view4)
-		    .addView(google.picker.ViewId.RECENTLY_PICKED)
+	    	.addView(view4)
+	    	.addView(google.picker.ViewId.RECENTLY_PICKED)
 		    .enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
 		    .enableFeature(google.picker.Feature.SUPPORT_DRIVES)
 		    .hideTitleBar()

+ 2 - 0
src/main/webapp/connect/office365/js/app.js

@@ -3,6 +3,8 @@
 (function ()
 {
 	RESOURCE_BASE = '/resources/dia';
+	PROXY_URL = '/proxy';
+	
 	var EXPORT_URL = 'https://exp.draw.io/ImageExport4/export';
 	var PIXELS_TO_POINTS = 72 / 96;
 	

+ 8 - 3
src/main/webapp/connect/office365/js/drive.js

@@ -162,17 +162,22 @@
 		  .setIncludeFolders(true)
       
       var view3 = new google.picker.DocsView()
-			.setEnableDrives(true)
-			.setIncludeFolders(true)
+		.setEnableDrives(true)
+		.setIncludeFolders(true)
       
+	var view4 = new google.picker.DocsUploadView()
+		.setIncludeFolders(true);
+  
       var dim = AC.getDocDim();
       
       var builder = new google.picker.PickerBuilder()
 			.addView(view1)
 			.addView(view2)
 			.addView(view3)
-			.setOAuthToken(oauthToken)
+			.addView(view4)
+			.addView(google.picker.ViewId.RECENTLY_PICKED)
 			.enableFeature(google.picker.Feature.SUPPORT_DRIVES)
+			.setOAuthToken(oauthToken)
 			.setCallback(pickerCallback)
 			.setSize(dim.w - 10, dim.h - 10);
 				

+ 29 - 29
src/main/webapp/electronFilesWorker.js

@@ -75,41 +75,41 @@ function saveFile(fileObject, data, origStat, overwrite, defEnc, reqId)
 	
 	function doSaveFile()
 	{
-		if (overwrite)
+		//Copy file to backup file (after conflict and stat is checked)
+		fs.copyFile(fileObject.path, fileObject.bkpPath, COPYFILE_EXCL, (err) => 
 		{
-			writeFile();
-		}
-		else
-		{
-			//TODO Using stat before write is not recommended, we can check the error code from writeFile
-			fs.stat(fileObject.path, function(err, stat)
+			if (!err)
 			{
-				if (isConflict(origStat, stat))
-				{
-	    			postMessage({error: true, msg: 'conflict', e: {isConflicted: true}, reqId: reqId});
-				}
-				else if (err != null && err.code !== 'ENOENT')
-				{
-	    			postMessage({error: true, msg: 'stat failed', e: err, reqId: reqId});
-				}
-				else
-				{
-					writeFile();
-				}
-			});
-		}
+				backupCreated = true;
+			}
+			
+			writeFile();
+		});	
 	};
 	
-	//Copy file to backup file
-	fs.copyFile(fileObject.path, fileObject.bkpPath, COPYFILE_EXCL, (err) => 
+	if (overwrite)
 	{
-		if (!err)
-		{
-			backupCreated = true;
-		}
-		
 		doSaveFile();
-	});	
+	}
+	else
+	{
+		//TODO Using stat before write is not recommended, we can check the error code from writeFile
+		fs.stat(fileObject.path, function(err, stat)
+		{
+			if (isConflict(origStat, stat))
+			{
+    			postMessage({error: true, msg: 'conflict', e: {isConflicted: true}, reqId: reqId});
+			}
+			else if (err != null && err.code !== 'ENOENT')
+			{
+    			postMessage({error: true, msg: 'stat failed', e: err, reqId: reqId});
+			}
+			else
+			{
+				doSaveFile();
+			}
+		});
+	}
 };
 
 //TODO handle reqId better

+ 4 - 0
src/main/webapp/index.html

@@ -5,6 +5,10 @@
     <title>Flowchart Maker &amp; Online Diagram Software</title>
     <meta charset="utf-8">
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <!-- Native File System API V2 token for *.draw.io expires 14 Aug 2020 -->
+    <meta http-equiv="origin-trial" content="Ap+kHQ/r5W6VLU9eDVuqOMctTEcui6YU/XLImQmlQVGTlWbdPO2y6B+o+KvlI6d0eikgL4dZQ9rJi+077EUZ/QwAAABleyJvcmlnaW4iOiJodHRwczovL2RyYXcuaW86NDQzIiwiZmVhdHVyZSI6Ik5hdGl2ZUZpbGVTeXN0ZW0yIiwiZXhwaXJ5IjoxNTk3NDI4MjQzLCJpc1N1YmRvbWFpbiI6dHJ1ZX0=">
+    <!-- Native File System API V2 token for *.diagrams.net expires 14 Aug 2020 -->
+    <meta http-equiv="origin-trial" content="AjFjJEEkMlBWI402owb3kGzAEfBK6KaU2NkM/KJRpN4O3saYOHA0CmXhWiFLT/h/Pe5oRK8Ps7o8JAAUKL0TywsAAABqeyJvcmlnaW4iOiJodHRwczovL2RpYWdyYW1zLm5ldDo0NDMiLCJmZWF0dXJlIjoiTmF0aXZlRmlsZVN5c3RlbTIiLCJleHBpcnkiOjE1OTc0MjgzMjksImlzU3ViZG9tYWluIjp0cnVlfQ==">
     <meta name="Description" content="diagrams.net is free online diagram software for making flowcharts, process diagrams, org charts, UML, ER and network diagrams">
     <meta name="Keywords" content="diagram, online, flow chart, flowchart maker, uml, erd">
     <meta itemprop="name" content="diagrams.net - free flowchart maker and diagrams online">

+ 1 - 1
src/main/webapp/js/PreConfig.js

@@ -9,4 +9,4 @@ window.DRAWIO_BASE_URL = null; // Replace with path to base of deployment, e.g.
 window.DRAWIO_VIEWER_URL = null; // Replace your path to the viewer js, e.g. https://www.example.com/js/viewer.min.js
 window.DRAW_MATH_URL = 'math';
 window.DRAWIO_CONFIG = null; // Replace with your custom draw.io configurations. For more details, https://desk.draw.io/support/solutions/articles/16000058316
-urlParams['sync'] = 'none' // Disabled realtime
+urlParams['sync'] = 'manual';

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 368 - 364
src/main/webapp/js/app.min.js


+ 171 - 4
src/main/webapp/js/diagramly/App.js

@@ -1953,7 +1953,7 @@ App.prototype.onBeforeUnload = function()
 			// KNOWN: Message is ignored by most browsers
 			if (file.constructor == LocalFile && file.getHash() == '' && !file.isModified() &&
 				urlParams['nowarn'] != '1' && !this.isDiagramEmpty() && urlParams['url'] == null &&
-				!this.editor.isChromelessView())
+				!this.editor.isChromelessView() && file.fileHandle == null)
 			{
 				return mxResources.get('ensureDataSaved');
 			}
@@ -3376,6 +3376,104 @@ App.prototype.addLanguageMenu = function(elt, addLabel)
 	return img;
 };
 
+/**
+ * Loads the given file handle as a local file.
+ */
+App.prototype.loadFileSystemEntry = function(fileHandle, success, error)
+{
+	error = (error != null) ? error : mxUtils.bind(this, function(e)
+	{
+		this.handleError(e);
+	});
+	
+	fileHandle.getFile().then(mxUtils.bind(this, function(file)
+	{
+		var reader = new FileReader();
+				
+		reader.onload = mxUtils.bind(this, function(e)
+		{
+			try
+			{
+				if (success != null)
+				{
+					var data = e.target.result;
+					
+					if (file.type.substring(0, 6) == 'image/')
+					{
+						data = this.extractGraphModelFromPng(data);
+					}
+
+					success(new LocalFile(this, data, file.name, null, fileHandle, file));
+				}
+				else
+				{
+					this.openFile(e.target.result, file.name, file, false, fileHandle);
+				}
+			}
+			catch(e)
+			{
+				error(e);
+			}
+		});
+		
+		reader.onerror = error;
+		
+		if ((file.type.substring(0, 5) === 'image' ||
+			file.type === 'application/pdf') &&
+			file.type.substring(0, 9) !== 'image/svg')
+		{
+			reader.readAsDataURL(file);
+		}
+		else
+		{
+			reader.readAsText(file);
+		}
+	}), error);
+};
+
+/**
+ * Loads the given file handle as a local file.
+ */
+App.prototype.createFileSystemOptions = function(name)
+{
+	var ext = [];
+	
+	for (var i = 0; i < this.editor.diagramFileTypes.length; i++)
+	{
+		ext.push({description: mxResources.get(this.editor.diagramFileTypes[i].description) +
+			' (.' + this.editor.diagramFileTypes[i].extension + ')',
+			extensions: [this.editor.diagramFileTypes[i].extension]});
+	}
+	
+	// TODO: Specify default name via options
+	return {type: 'save-file', accepts: ext, defaultPath: name};
+};
+
+/**
+ * Loads the given file handle as a local file.
+ */
+App.prototype.chooseFileSystemEntries = function(success, error, opts)
+{
+	error = (error != null) ? error : mxUtils.bind(this, function(e)
+	{
+		if (e.name != 'AbortError')
+		{
+			this.handleError(e);
+		}
+	});
+	
+	opts = (opts != null) ? opts : this.createFileSystemOptions();
+
+	// LATER: Specify default name via options
+	window.chooseFileSystemEntries(opts).then(mxUtils.bind(this, function(fileHandle)
+	{
+		fileHandle.getFile().then(mxUtils.bind(this, function(desc)
+		{
+			success(fileHandle, desc);
+		}), error);
+	}), error);
+};
+
 /**
  * Translates this point by the given vector.
  * 
@@ -3407,6 +3505,22 @@ App.prototype.pickFile = function(mode)
 			{
 				peer.pickFile();
 			}
+			else if (mode == App.MODE_DEVICE && 'chooseFileSystemEntries' in window)
+			{
+				window.chooseFileSystemEntries().then(mxUtils.bind(this, function(fileHandle)
+				{
+					if (this.spinner.spin(document.body, mxResources.get('loading')))
+					{
+						this.loadFileSystemEntry(fileHandle);
+					}
+				}), mxUtils.bind(this, function(e)
+				{
+					if (e.name != 'AbortError')
+					{
+						this.handleError(e);
+					}
+				}));
+			}
 			else if (mode == App.MODE_DEVICE && Graph.fileSupport)
 			{
 				if (this.openFileInputElt == null) 
@@ -3420,7 +3534,8 @@ App.prototype.pickFile = function(mode)
 						{
 							this.openFiles(input.files);
 							
-				    		// Resets input to force change event for same file (type reset required for IE)
+				    		// Resets input to force change event for
+							// same file (type reset required for IE)
 							input.type = '';
 							input.type = 'file';
 				    		input.value = '';
@@ -3875,6 +3990,16 @@ App.prototype.saveFile = function(forceDialog, success)
 		{
 			this.save(file.getTitle(), done);
 		}
+		else if (file != null && file.constructor == LocalFile && file.fileHandle != null)
+		{
+			this.chooseFileSystemEntries(mxUtils.bind(this, function(fileHandle, desc)
+			{
+				file.fileHandle = fileHandle;
+				file.title = desc.name;
+				file.desc = desc;
+				this.save(desc.name, done);
+			}), null, this.createFileSystemOptions(file.getTitle()));
+		}
 		else
 		{
 			var filename = (file.getTitle() != null) ? file.getTitle() : this.defaultFilename;
@@ -3921,8 +4046,30 @@ App.prototype.saveFile = function(forceDialog, success)
 						
 						if (prev == null && mode == App.MODE_DEVICE)
 						{
-							this.setMode(App.MODE_DEVICE);
-							this.save(name, done);
+							if (file != null && 'chooseFileSystemEntries' in window)
+							{
+								this.chooseFileSystemEntries(mxUtils.bind(this, function(fileHandle, desc)
+								{
+									file.fileHandle = fileHandle;
+									file.mode = App.MODE_DEVICE;
+									file.title = desc.name;
+									file.desc = desc;
+
+									this.setMode(App.MODE_DEVICE);
+									this.save(desc.name, done);
+								}), mxUtils.bind(this, function(e)
+								{
+									if (e.name != 'AbortError')
+									{
+										this.handleError(e);
+									}
+								}), this.createFileSystemOptions(name));
+							}
+							else
+							{
+								this.setMode(App.MODE_DEVICE);
+								this.save(name, done);
+							}
 						}
 						else if (mode == 'download')
 						{
@@ -4213,6 +4360,26 @@ App.prototype.createFile = function(title, data, libs, mode, done, replace, fold
 					}));
 				}
 			}
+			else if (!tempFile && mode == App.MODE_DEVICE && 'chooseFileSystemEntries' in window)
+			{
+				complete();
+				
+				this.chooseFileSystemEntries(mxUtils.bind(this, function(fileHandle, desc)
+				{
+					var file = new LocalFile(this, data, desc.name, null, fileHandle, desc);
+					
+					file.saveFile(desc.name, false, mxUtils.bind(this, function()
+					{
+						this.fileCreated(file, libs, replace, done, clibs);
+					}), error, true);
+				}), mxUtils.bind(this, function(e)
+				{
+					if (e.name != 'AbortError')
+					{
+						error(e);
+					}
+				}), this.createFileSystemOptions(title));
+			}
 			else
 			{
 				complete();

+ 10 - 0
src/main/webapp/js/diagramly/Dialogs.js

@@ -10687,6 +10687,11 @@ var FilePropertiesDialog = function(editorUi)
 			{
 				editorUi.fileNode.setAttribute('scale', Math.max(0, parseInt(zoomInput.value) / 100));
 				editorUi.fileNode.setAttribute('border', Math.max(0, parseInt(borderInput.value)));
+				
+				if (file != null)
+				{
+					file.fileChanged();
+				}
 			}
 			
 			editorUi.hideDialog();
@@ -10730,6 +10735,11 @@ var FilePropertiesDialog = function(editorUi)
 			if (editorUi.fileNode != null)
 			{
 				editorUi.fileNode.setAttribute('compressed', (compressedInput.checked) ? 'true' : 'false');
+				
+				if (file != null)
+				{
+					file.fileChanged();
+				}
 			}
 			
 			editorUi.hideDialog();

+ 3 - 69
src/main/webapp/js/diagramly/DrawioFile.js

@@ -161,11 +161,6 @@ DrawioFile.prototype.invalidChecksum = false;
  */
 DrawioFile.prototype.errorReportsEnabled = false;
 
-/**
- * Specifies if stats should be sent.
- */
-DrawioFile.prototype.reportEnabled = true;
-
 /**
  * Specifies if stats should be sent.
  */
@@ -603,7 +598,6 @@ DrawioFile.prototype.reloadFile = function(success, error)
 		var fn = mxUtils.bind(this, function()
 		{
 			this.stats.fileReloaded++;
-			this.reportEnabled = false;
 			
 			// Restores view state and current page
 			var viewState = this.ui.editor.graph.getViewState();
@@ -841,9 +835,9 @@ DrawioFile.prototype.save = function(revision, success, error, unloading, overwr
  * @param {number} dx X-coordinate of the translation.
  * @param {number} dy Y-coordinate of the translation.
  */
-DrawioFile.prototype.updateFileData = function(compressOverride)
+DrawioFile.prototype.updateFileData = function()
 {
-	this.setData(this.ui.getFileData(null, null, null, null, null, null, null, null, this, compressOverride != null? !compressOverride : !this.isCompressed()));
+	this.setData(this.ui.getFileData(null, null, null, null, null, null, null, null, this, !this.isCompressed()));
 };
 
 /**
@@ -877,42 +871,6 @@ DrawioFile.prototype.isCompressed = function()
 	}
 };
 
-/**
- * Translates this point by the given vector.
- * 
- * @param {number} dx X-coordinate of the translation.
- * @param {number} dy Y-coordinate of the translation.
- */
-DrawioFile.prototype.decompress = function()
-{
-	this.updateFileData(false);
-	
-	if (this.ui.fileNode != null)
-	{
-		this.ui.fileNode.setAttribute('compressed', 'false');
-	}
-	
-	this.fileChanged();
-};
-
-/**
- * Translates this point by the given vector.
- * 
- * @param {number} dx X-coordinate of the translation.
- * @param {number} dy Y-coordinate of the translation.
- */
-DrawioFile.prototype.compress = function()
-{
-	this.updateFileData(true);
-
-	if (this.ui.fileNode != null)
-	{
-		this.ui.fileNode.setAttribute('compressed', 'true');
-	}
-	
-	this.fileChanged();
-};
-
 /**
  * Translates this point by the given vector.
  * 
@@ -2248,33 +2206,9 @@ DrawioFile.prototype.removeListeners = function()
  */
 DrawioFile.prototype.destroy = function()
 {
-	this.stats.destroyed++;
-	
-//	try
-//	{
-//		if (!this.ui.isOffline() && this.reportEnabled &&
-//			(DrawioFile.SYNC == 'auto' ||
-//			DrawioFile.SYNC == 'manual'))
-//		{
-//			var user = this.getCurrentUser();
-//			var uid = (user != null) ? user.id : 'unknown';
-//		
-//			EditorUi.logEvent({category: DrawioFile.SYNC + '-DESTROY-FILE-' + DrawioFile.SYNC,
-//				action: 'file-' + this.getId() +
-//				'-mode-' + this.getMode() +
-//				'-size-' + this.getSize() +
-//				'-user-' + uid +
-//				((this.sync != null) ? ('-client-' + this.sync.clientId ) : ''),
-//				label: this.stats});
-//		}
-//	}
-//	catch (e)
-//	{
-//		// ignore
-//	}
-
 	this.clearAutosave();
 	this.removeListeners();
+	this.stats.destroyed++;
 
 	if (this.sync != null)
 	{

+ 1 - 1
src/main/webapp/js/diagramly/Editor.js

@@ -34,7 +34,7 @@
 	Editor.prototype.libraryFileTypes = [{description: 'Library (.drawiolib, .xml)', extensions: ['drawiolib', 'xml']}];
 
 	/**
-	 * Known extensions for own files.
+	 * Additional help text for special file extensions.
 	 */
 	Editor.prototype.fileExtensions = [
 		{ext: 'html', title: 'filetypeHtml'},

+ 164 - 159
src/main/webapp/js/diagramly/EditorUi.js

@@ -10219,6 +10219,167 @@
 		
 		return cells;
 	};
+		
+	/**
+	 * Opens the given files in the editor.
+	 */
+	EditorUi.prototype.openFile = function(data, name, file, temp, fileHandle)
+	{
+		if (name != null && name.length > 0)
+		{
+			if (!this.useCanvasForExport && /(\.png)$/i.test(name))
+			{
+				name = name.substring(0, name.length - 4) + '.drawio';
+			}
+			else if (/(\.pdf)$/i.test(name))
+			{
+				name = name.substring(0, name.length - 4) + '.drawio';
+			}
+			
+			var handleResult = mxUtils.bind(this, function(xml)
+			{
+				var dot = name.lastIndexOf('.');
+				
+				if (dot >= 0)
+				{
+					name = name.substring(0, name.lastIndexOf('.')) + '.drawio';
+				}
+				else
+				{
+					name = name + '.drawio';
+				}
+				
+				if (xml.substring(0, 10) == '<mxlibrary')
+				{
+					// Creates new temporary file if library is dropped in splash screen
+					if (this.getCurrentFile() == null && urlParams['embed'] != '1')
+					{
+						this.openLocalFile(this.emptyDiagramXml, this.defaultFilename, temp);
+					}
+				
+    				try
+	    			{
+    					this.loadLibrary(new LocalLibrary(this, xml, name));
+	    			}
+    				catch (e)
+	    			{
+	    				this.handleError(e, mxResources.get('errorLoadingFile'));
+	    			}
+				}
+				else
+				{
+					this.openLocalFile(xml, name, temp);
+				}
+			});
+			
+			if  (/(\.v(dx|sdx?))($|\?)/i.test(name) || /(\.vs(x|sx?))($|\?)/i.test(name))
+			{
+				this.importVisio(file, mxUtils.bind(this, function(xml)
+				{
+					this.spinner.stop();
+					handleResult(xml);
+				}));
+			}
+			else if (/(\.*<graphml )/.test(data)) 
+			{
+				this.importGraphML(data, mxUtils.bind(this, function(xml)
+				{
+					this.spinner.stop();
+					handleResult(xml);
+				}));
+			}
+			else if (Graph.fileSupport && !this.isOffline() && new XMLHttpRequest().upload &&
+				this.isRemoteFileFormat(data, name))
+			{
+				this.parseFile(file, mxUtils.bind(this, function(xhr)
+				{
+					if (xhr.readyState == 4)
+					{
+						this.spinner.stop();
+						
+						if (xhr.status >= 200 && xhr.status <= 299)
+						{
+							handleResult(xhr.responseText);
+						}
+						else
+						{
+							this.handleError({message: mxResources.get((xhr.status == 413) ?
+        						'drawingTooLarge' : 'invalidOrMissingFile')},
+        						mxResources.get('errorLoadingFile'));
+						}
+					}
+				}));
+			}
+			else if (this.isLucidChartData(data))
+			{
+				if (/(\.json)$/i.test(name))
+				{
+					name = name.substring(0, name.length - 5) + '.drawio';
+				}
+
+				// LATER: Add import step that produces cells and use callback
+				this.convertLucidChart(data, mxUtils.bind(this, function(xml)
+				{
+					this.spinner.stop();
+					this.openLocalFile(xml, name, temp);
+				}), mxUtils.bind(this, function(e)
+				{
+					this.spinner.stop();
+					this.handleError(e);
+				}));
+			}
+			else if (data.substring(0, 10) == '<mxlibrary')
+			{
+				this.spinner.stop();
+				
+				// Creates new temporary file if library is dropped in splash screen
+				if (this.getCurrentFile() == null && urlParams['embed'] != '1')
+				{
+					this.openLocalFile(this.emptyDiagramXml, this.defaultFilename, temp);
+				}
+				
+				try
+    			{
+    				this.loadLibrary(new LocalLibrary(this, data, file.name));
+    			}
+    			catch (e)
+    			{
+    				this.handleError(e, mxResources.get('errorLoadingFile'));
+    			}
+			}
+			else if (data.indexOf('PK') == 0)
+			{
+				this.importZipFile(file, mxUtils.bind(this, function(xml)
+				{
+					this.spinner.stop();
+					handleResult(xml);
+				}), mxUtils.bind(this, function()
+				{
+					this.spinner.stop();
+					this.openLocalFile(data, name, temp);
+				}));
+			}
+			else
+			{
+				if (file.type.substring(0, 9) == 'image/png')
+				{
+					data = this.extractGraphModelFromPng(data);
+				}
+				else if (file.type == 'application/pdf')
+	    		{
+					var xml = Editor.extractGraphModelFromPdf(data);
+					
+					if (xml != null)
+					{
+						data = xml;
+					}
+	    		}
+				
+				this.spinner.stop();
+				this.openLocalFile(data, name, temp, fileHandle, (fileHandle != null) ? file : null);
+			}
+		}
+	};
 	
 	/**
 	 * Opens the given files in the editor.
@@ -10237,163 +10398,7 @@
 					{
 						try
 						{
-							var data = e.target.result;
-							var name = file.name;
-							
-							if (name != null && name.length > 0)
-							{
-								if (!this.useCanvasForExport && /(\.png)$/i.test(name))
-								{
-									name = name.substring(0, name.length - 4) + '.drawio';
-								}
-								else if (/(\.pdf)$/i.test(name))
-								{
-									name = name.substring(0, name.length - 4) + '.drawio';
-								}
-								
-								var handleResult = mxUtils.bind(this, function(xml)
-								{
-									var dot = name.lastIndexOf('.');
-									
-									if (dot >= 0)
-									{
-										name = name.substring(0, name.lastIndexOf('.')) + '.drawio';
-									}
-									else
-									{
-										name = name + '.drawio';
-									}
-									
-									if (xml.substring(0, 10) == '<mxlibrary')
-									{
-										// Creates new temporary file if library is dropped in splash screen
-										if (this.getCurrentFile() == null && urlParams['embed'] != '1')
-										{
-											this.openLocalFile(this.emptyDiagramXml, this.defaultFilename, temp);
-										}
-									
-					    				try
-						    			{
-					    					this.loadLibrary(new LocalLibrary(this, xml, name));
-						    			}
-					    				catch (e)
-						    			{
-						    				this.handleError(e, mxResources.get('errorLoadingFile'));
-						    			}
-									}
-									else
-									{
-										this.openLocalFile(xml, name, temp);
-									}
-								});
-								
-								if  (/(\.v(dx|sdx?))($|\?)/i.test(name) || /(\.vs(x|sx?))($|\?)/i.test(name))
-								{
-									this.importVisio(file, mxUtils.bind(this, function(xml)
-									{
-										this.spinner.stop();
-										handleResult(xml);
-									}));
-								}
-								else if (/(\.*<graphml )/.test(data)) 
-								{
-									this.importGraphML(data, mxUtils.bind(this, function(xml)
-									{
-										this.spinner.stop();
-										handleResult(xml);
-									}));
-								}
-								else if (Graph.fileSupport && !this.isOffline() && new XMLHttpRequest().upload &&
-									this.isRemoteFileFormat(data, name))
-								{
-									this.parseFile(file, mxUtils.bind(this, function(xhr)
-									{
-										if (xhr.readyState == 4)
-										{
-											this.spinner.stop();
-											
-											if (xhr.status >= 200 && xhr.status <= 299)
-											{
-												handleResult(xhr.responseText);
-											}
-											else
-											{
-												this.handleError({message: mxResources.get((xhr.status == 413) ?
-				            						'drawingTooLarge' : 'invalidOrMissingFile')},
-				            						mxResources.get('errorLoadingFile'));
-											}
-										}
-									}));
-								}
-								else if (this.isLucidChartData(data))
-								{
-									if (/(\.json)$/i.test(name))
-									{
-										name = name.substring(0, name.length - 5) + '.drawio';
-									}
-	
-									// LATER: Add import step that produces cells and use callback
-									this.convertLucidChart(data, mxUtils.bind(this, function(xml)
-									{
-										this.spinner.stop();
-										this.openLocalFile(xml, name, temp);
-									}), mxUtils.bind(this, function(e)
-									{
-										this.spinner.stop();
-										this.handleError(e);
-									}));
-								}
-								else if (e.target.result.substring(0, 10) == '<mxlibrary')
-				    			{
-									this.spinner.stop();
-									
-									// Creates new temporary file if library is dropped in splash screen
-									if (this.getCurrentFile() == null && urlParams['embed'] != '1')
-									{
-										this.openLocalFile(this.emptyDiagramXml, this.defaultFilename, temp);
-									}
-									
-				    				try
-					    			{
-					    				this.loadLibrary(new LocalLibrary(this, e.target.result, file.name));
-					    			}
-					    			catch (e)
-					    			{
-					    				this.handleError(e, mxResources.get('errorLoadingFile'));
-					    			}
-				    			}
-								else if (data.indexOf('PK') == 0)
-								{
-									this.importZipFile(file, mxUtils.bind(this, function(xml)
-									{
-										this.spinner.stop();
-										handleResult(xml);
-									}), mxUtils.bind(this, function()
-									{
-										this.spinner.stop();
-										this.openLocalFile(data, name, temp);
-									}));
-								}
-								else
-								{
-									if (file.type.substring(0, 9) == 'image/png')
-									{
-										data = this.extractGraphModelFromPng(data);
-									}
-									else if (file.type == 'application/pdf')
-						    		{
-										var xml = Editor.extractGraphModelFromPdf(data);
-										
-										if (xml != null)
-										{
-											data = xml;
-										}
-						    		}
-									
-									this.spinner.stop();
-									this.openLocalFile(data, name, temp);
-								}
-							}
+							this.openFile(e.target.result, file.name, file, temp);
 						}
 						catch (e)
 						{
@@ -10426,7 +10431,7 @@
 	/**
 	 * Shows the layers dialog if the graph has more than one layer.
 	 */
-	EditorUi.prototype.openLocalFile = function(data, name, temp)
+	EditorUi.prototype.openLocalFile = function(data, name, temp, fileHandle, desc)
 	{
 		var currentFile = this.getCurrentFile();
 		
@@ -10446,7 +10451,7 @@
 			}
 			else
 			{
-				this.fileLoaded(new LocalFile(this, data, name || this.defaultFilename, temp));
+				this.fileLoaded(new LocalFile(this, data, name || this.defaultFilename, temp, fileHandle, desc));
 			}
 		});
 

+ 152 - 29
src/main/webapp/js/diagramly/LocalFile.js

@@ -8,12 +8,14 @@
  * @param {number} x X-coordinate of the point.
  * @param {number} y Y-coordinate of the point.
  */
-LocalFile = function(ui, data, title, temp)
+LocalFile = function(ui, data, title, temp, fileHandle, desc)
 {
 	DrawioFile.call(this, ui, data);
 	
 	this.title = title;
 	this.mode = (temp) ? null : App.MODE_DEVICE;
+	this.fileHandle = fileHandle;
+	this.desc = desc;
 };
 
 //Extends mxEventSource
@@ -27,7 +29,16 @@ mxUtils.extend(LocalFile, DrawioFile);
  */
 LocalFile.prototype.isAutosave = function()
 {
-	return false;
+	return this.fileHandle != null;
+};
+
+/**
+ * Specifies if the autosave checkbox should be shown in the document
+ * properties dialog. Default is false.
+ */
+LocalFile.prototype.isAutosaveOptional = function()
+{
+	return this.fileHandle != null;
 };
 
 /**
@@ -60,7 +71,7 @@ LocalFile.prototype.getTitle = function()
  */
 LocalFile.prototype.isRenamable = function()
 {
-	return true;
+	return this.fileHandle == null;
 };
 
 /**
@@ -91,51 +102,163 @@ LocalFile.prototype.saveAs = function(title, success, error)
  * @param {number} dx X-coordinate of the translation.
  * @param {number} dy Y-coordinate of the translation.
  */
-LocalFile.prototype.saveFile = function(title, revision, success, error)
+LocalFile.prototype.saveAs = function(title, success, error)
+{
+	this.saveFile(title, false, success, error);
+};
+
+/**
+ * Adds all listeners.
+ */
+LocalFile.prototype.getDescriptor = function()
 {
+	return this.desc;
+};
+
+/**
+* Updates the descriptor of this file with the one from the given file.
+*/
+LocalFile.prototype.setDescriptor = function(desc)
+{
+	this.desc = desc;
+};
+
+/**
+ * Translates this point by the given vector.
+ * 
+ * @param {number} dx X-coordinate of the translation.
+ * @param {number} dy Y-coordinate of the translation.
+ */
+LocalFile.prototype.getLatestVersion = function(success, error)
+{
+	if (this.fileHandle == null)
+	{
+		success(null);
+	}
+	else
+	{
+		this.ui.loadFileSystemEntry(this.fileHandle, success, error);
+	}
+};
+
+/**
+ * Translates this point by the given vector.
+ * 
+ * @param {number} dx X-coordinate of the translation.
+ * @param {number} dy Y-coordinate of the translation.
+ */
+LocalFile.prototype.saveFile = function(title, revision, success, error, useCurrentData)
+{
+	if (title != this.title)
+	{
+		this.fileHandle = null;
+		this.desc = null;
+	}
+	
 	this.title = title;
 
 	// Updates data after changing file name
-	this.updateFileData();
+	if (!useCurrentData)
+	{
+		this.updateFileData();
+	}
+	
 	var data = this.getData();
 	var binary = this.ui.useCanvasForExport && /(\.png)$/i.test(this.getTitle());
 	
+	var done = mxUtils.bind(this, function()
+	{
+		this.setModified(false);
+		this.contentChanged();
+		
+		if (success != null)
+		{
+			success();
+		}
+	});
+	
 	var doSave = mxUtils.bind(this, function(data)
 	{
-		if (this.ui.isOfflineApp() || this.ui.isLocalFileSave())
+		if (this.fileHandle != null)
 		{
-			this.ui.doSaveLocalFile(data, title, (binary) ?
-				'image/png' : 'text/xml', binary);
+			// Sets shadow modified state during save
+			if (!this.savingFile)
+			{
+				this.savingFileTime = new Date();
+				this.setShadowModified(false);
+				this.savingFile = true;
+				
+				var errorWrapper = mxUtils.bind(this, function(e)
+				{
+					this.savingFile = false;
+					
+					if (error != null)
+					{
+						// Wraps error object to offer save status option
+						error({error: e});
+					}
+				});
+				
+				this.fileHandle.createWritable().then(mxUtils.bind(this, function(writable)
+				{
+					this.fileHandle.getFile().then(mxUtils.bind(this, function(newDesc)
+					{
+						if (this.desc.lastModified == newDesc.lastModified)
+						{
+							writable.write((binary) ? this.ui.base64ToBlob(data, 'image/png') : data).then(mxUtils.bind(this, function()
+							{
+								writable.close().then(mxUtils.bind(this, function()
+								{
+									this.fileHandle.getFile().then(mxUtils.bind(this, function(desc)
+									{
+										this.setModified(this.getShadowModified());
+										this.savingFile = false;
+										this.desc = desc;
+										done();
+									}), errorWrapper);
+								}), errorWrapper);
+							}), errorWrapper);
+						}
+						else
+						{
+							this.inConflictState = true;
+							errorWrapper();
+						}
+					}), errorWrapper);
+				}), errorWrapper);
+			}
 		}
 		else
 		{
-			if (data.length < MAX_REQUEST_SIZE)
+			if (this.ui.isOfflineApp() || this.ui.isLocalFileSave())
 			{
-				var dot = title.lastIndexOf('.');
-				var format = (dot > 0) ? title.substring(dot + 1) : 'xml';
-
-				// Do not update modified flag
-				new mxXmlRequest(SAVE_URL, 'format=' + format +
-					'&xml=' + encodeURIComponent(data) +
-					'&filename=' + encodeURIComponent(title) +
-					((binary) ? '&binary=1' : '')).
-					simulate(document, '_blank');
+				this.ui.doSaveLocalFile(data, title, (binary) ?
+					'image/png' : 'text/xml', binary);
 			}
 			else
 			{
-				this.ui.handleError({message: mxResources.get('drawingTooLarge')}, mxResources.get('error'), mxUtils.bind(this, function()
+				if (data.length < MAX_REQUEST_SIZE)
+				{
+					var dot = title.lastIndexOf('.');
+					var format = (dot > 0) ? title.substring(dot + 1) : 'xml';
+	
+					// Do not update modified flag
+					new mxXmlRequest(SAVE_URL, 'format=' + format +
+						'&xml=' + encodeURIComponent(data) +
+						'&filename=' + encodeURIComponent(title) +
+						((binary) ? '&binary=1' : '')).
+						simulate(document, '_blank');
+				}
+				else
 				{
-					mxUtils.popup(data);
-				}));
+					this.ui.handleError({message: mxResources.get('drawingTooLarge')}, mxResources.get('error'), mxUtils.bind(this, function()
+					{
+						mxUtils.popup(data);
+					}));
+				}
 			}
-		}
-		
-		this.setModified(false);
-		this.contentChanged();
-		
-		if (success != null)
-		{
-			success();
+			
+			done();
 		}
 	});
 	

+ 4 - 34
src/main/webapp/js/diagramly/Menus.js

@@ -81,7 +81,7 @@
 		editorUi.actions.addAction('new...', function()
 		{
 			var compact = editorUi.isOffline();
-			var dlg = new NewDialog(editorUi, compact);
+			var dlg = new NewDialog(editorUi, compact, !(editorUi.mode == App.MODE_DEVICE && 'chooseFileSystemEntries' in window));
 
 			editorUi.showDialog(dlg.container, (compact) ? 350 : 620, (compact) ? 70 : 440, true, true, function(cancel)
 			{
@@ -501,37 +501,6 @@
 			return autosaveAction.isEnabled() && editorUi.editor.autosave;
 		});
 		
-		var compressedAction = editorUi.actions.addAction('compressed', function()
-		{
-			var file = editorUi.getCurrentFile();
-			
-			if (file != null)
-			{
-				if (file.isCompressed())
-				{
-					file.decompress();
-				}
-				else
-				{
-					file.compress();
-				}
-			}
-		});
-		
-		compressedAction.setToggleAction(true);
-		
-		compressedAction.setSelectedCallback(function()
-		{
-			var file = editorUi.getCurrentFile();
-			
-			return file != null && file.isCompressed();
-		});
-
-		compressedAction.isEnabled = function()
-		{
-			return editorUi.getCurrentFile() != null;
-		}
-		
 		editorUi.actions.addAction('editGeometry...', function()
 		{
 			var cells = graph.getSelectionCells();
@@ -3338,7 +3307,7 @@
 
 			if (urlParams['embed'] != '1')
 			{
-				this.addMenuItems(menu, ['autosave', 'compressed'], parent);
+				this.addMenuItems(menu, ['autosave'], parent);
 			}
 			
 			menu.addSeparator(parent);
@@ -3490,7 +3459,8 @@
 				else
 				{
 					if (!mxClient.IS_CHROMEAPP && !EditorUi.isElectronApp &&
-						file != null && file.constructor != LocalFile)
+						file != null && (file.constructor != LocalFile ||
+						file.fileHandle != null))
 					{	
 						menu.addSeparator(parent);
 						var item = this.addMenuItem(menu, 'synchronize', parent);

+ 2 - 8
src/main/webapp/js/diagramly/Minimal.js

@@ -750,14 +750,8 @@ EditorUi.initMinimalTheme = function()
 			
 			if (mxClient.IS_CHROMEAPP || EditorUi.isElectronApp)
 			{
-				ui.menus.addMenuItems(menu, ['new', 'open', '-'], parent);
-				
-				if (EditorUi.isElectronApp)
-				{
-					ui.menus.addMenuItems(menu, ['synchronize', '-'], parent);
-				}
-				
-				ui.menus.addMenuItems(menu, ['save', 'saveAs', '-'], parent);
+				ui.menus.addMenuItems(menu, ['new', 'open', '-', 'synchronize',
+					'-', 'save', 'saveAs', '-'], parent);
 			}
 			else if (urlParams['embed'] == '1')
 			{

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 667 - 667
src/main/webapp/js/viewer-static.min.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 667 - 667
src/main/webapp/js/viewer.min.js


+ 2 - 1
src/main/webapp/resources/dia.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_am.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ar.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_bg.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_bn.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_bs.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ca.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_cs.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_da.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 3 - 2
src/main/webapp/resources/dia_de.txt

@@ -1026,5 +1026,6 @@ loginFirstThen=Bitte melden Sie sich bei {1} an, dann {2}
 errFetchDocList=Fehler: Konnte Dokumentenliste nicht laden.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
-backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+backupFound=Wiederherstellungsdatei gefunden.
+chromeOnly=Dieses Feature ist nur in Google Chrome verfügbar.
+msgDeleted=Diese Nachricht wurde gelöscht.

+ 2 - 1
src/main/webapp/resources/dia_el.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 44 - 43
src/main/webapp/resources/dia_eo.txt

@@ -6,7 +6,7 @@ accessDenied=Aliro rifuzita
 action=Ago
 actualSize=Vera grandeco
 add=Aldoni
-addAccount=Add account
+addAccount=Aldoni konton
 addedFile={1} aldonita
 addImages=Aldoni bildojn
 addImageUrl=Add Image URL
@@ -22,48 +22,48 @@ alignment=Alignment
 allChangesLost=All changes will be lost!
 allPages=Ĉiuj paĝoj
 allProjects=Ĉiuj projektoj
-allSpaces=All Spaces
-allTags=All Tags
-anchor=Anchor
+allSpaces=Ĉiuj spacoj
+allTags=Ĉiuj etikedoj
+anchor=Ankro
 android=Android
 angle=Angulo
 arc=Arc
 areYouSure=Ĉu vi certas?
 ensureDataSaved=Please ensure your data is saved before closing.
-allChangesSaved=All changes saved
+allChangesSaved=Ĉiuj ŝanĝoj konservitaj
 allChangesSavedInDrive=All changes saved in Drive
 allowPopups=Allow pop-ups to avoid this dialog.
 allowRelativeUrl=Allow relative URL
 alreadyConnected=Nodes already connected
-apply=Apply
+apply=Apliki
 archiMate21=ArchiMate 2.1
 arrange=Arrange
-arrow=Arrow
-arrows=Arrows
-asNew=As New
+arrow=Sago
+arrows=Sagoj
+asNew=Kiel nova
 atlas=Atlas
 author=Aŭtoro
 authorizationRequired=Authorization required
 authorizeThisAppIn=Authorize this app in {1}:
 authorize=Authorize
 authorizing=Authorizing
-automatic=Automatic
-autosave=Autosave
+automatic=Aŭtomata
+autosave=Aŭtomate konservi
 autosize=Autosize
-attachments=Attachments
+attachments=Aldonaĵoj
 aws=AWS
 aws3d=AWS 3D
 azure=Azure
-back=Back
-background=Background
-backgroundColor=Background Color
-backgroundImage=Background Image
-basic=Basic
+back=Reveni
+background=Fono
+backgroundColor=Fonkoloro
+backgroundImage=Fonbildo
+basic=Baza
 blankDrawing=Blank Drawing
 blankDiagram=Blank Diagram
-block=Block
+block=Bloko
 blockquote=Blockquote
-blog=Blog
+blog=Blogo
 bold=Bold
 bootstrap=Bootstrap
 border=Border
@@ -74,7 +74,7 @@ bottomAlign=Bottom Align
 bottomLeft=Bottom Left
 bottomRight=Bottom Right
 bpmn=BPMN
-browser=Browser
+browser=Retumilo
 bulletedList=Bulleted List
 business=Business
 busy=Operation in progress
@@ -90,20 +90,20 @@ changeUser=Ŝanĝi uzanton
 changeStorage=Change storage
 changesNotSaved=Changes have not been saved
 classDiagram=Class Diagram
-userJoined={1} has joined
-userLeft={1} has left
+userJoined={1} aliĝis
+userLeft={1} forlasis
 chatWindowTitle=Chat
 chooseAnOption=Choose an option
-chromeApp=Chrome App
+chromeApp=Chrome-aplikaĵo
 collaborativeEditingNotice=Important Notice for Collaborative Editing
-compressed=Compressed
+compressed=Densigita
 commitMessage=Commit Message
 configLinkWarn=This link configures draw.io. Only click OK if you trust whoever gave you it!
 configLinkConfirm=Click OK to configure and restart draw.io.
 csv=CSV
 dark=Dark
-diagramXmlDesc=XML File
-diagramHtmlDesc=HTML File
+diagramXmlDesc=XML-dosiero
+diagramHtmlDesc=HTML-dosiero
 diagramPngDesc=Editable Bitmap Image
 diagramSvgDesc=Editable Vector Image
 didYouMeanToExportToPdf=Did you mean to export to PDF?
@@ -113,16 +113,16 @@ dragAndDropNotSupported=Drag and drop not supported for images. Would you like t
 dropboxCharsNotAllowed=The following characters are not allowed: \ / : ? * " |
 check=Check
 checksum=Checksum
-circle=Circle
+circle=Cirklo
 cisco=Cisco
-classic=Classic
+classic=Klasika
 clearDefaultStyle=Clear Default Style
 clearWaypoints=Clear Waypoints
 clipart=Clipart
 close=Fermi
 closingFile=Closing file
-collaborator=Collaborator
-collaborators=Collaborators
+collaborator=Kunlaboranto
+collaborators=Kunlaborantoj
 collapse=Collapse
 collapseExpand=Collapse/Expand
 collapse-expand=Click to collapse/expand\nShift-click to move neighbors \nAlt-click to protect group size
@@ -130,12 +130,12 @@ collapsible=Collapsible
 comic=Comic
 comment=Comment
 commentsNotes=Comments/Notes
-compress=Compress
+compress=Densigi
 configuration=Configuration
-connect=Connect
-connecting=Connecting
+connect=Konekti
+connecting=Konektado
 connectWithDrive=Connect with Google Drive
-connection=Connection
+connection=Konekto
 connectionArrows=Connection Arrows
 connectionPoints=Connection Points
 constrainProportions=Constrain Proportions
@@ -179,15 +179,15 @@ diagramIsPublic=Diagram is public
 diagramIsNotPublic=Diagram is not public
 diamond=Diamond
 diamondThin=Diamond (thin)
-didYouKnow=Did you know...
+didYouKnow=Ĉu vi sciis...
 direction=Direction
-discard=Discard
+discard=Forĵeti
 discardChangesAndReconnect=Discard Changes and Reconnect
 googleDriveMissingClickHere=Google Drive missing? Click here!
 discardChanges=Discard Changes
 disconnected=Disconnected
 distribute=Distribute
-done=Done
+done=Preta
 doNotShowAgain=Do not show again
 dotted=Dotted
 doubleClickOrientation=Doubleclick to change orientation
@@ -359,7 +359,7 @@ googleSlides=Google Slides
 googleSites=Google Sites
 googleSheets=Google Sheets
 gradient=Gradient
-gradientColor=Color
+gradientColor=Koloro
 grid=Grid
 gridColor=Grid Color
 gridSize=Grid Size
@@ -369,10 +369,10 @@ hateApp=I hate draw.io
 heading=Heading
 height=Height
 help=Help
-helpTranslate=Help us translate this application
-hide=Hide
-hideIt=Hide {1}
-hidden=Hidden
+helpTranslate=Helpu nin traduki ĉi tiun aplikaĵon
+hide=Kaŝi
+hideIt=Kaŝi {1}
+hidden=Kaŝita
 home=Home
 horizontal=Horizontal
 horizontalFlow=Horizontal Flow
@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_es.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_et.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_eu.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_fa.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_fi.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_fil.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_fr.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 535 - 534
src/main/webapp/resources/dia_gl.txt


+ 2 - 1
src/main/webapp/resources/dia_gu.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_he.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_hi.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_hr.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_hu.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 1 - 0
src/main/webapp/resources/dia_i18n.txt

@@ -1028,3 +1028,4 @@ builtinPlugins=builtinPlugins
 extPlugins=extPlugins
 backupFound=backupFound
 chromeOnly=chromeOnly
+msgDeleted=msgDeleted

+ 2 - 1
src/main/webapp/resources/dia_id.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_it.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ja.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_kn.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ko.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_lt.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_lv.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ml.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_mr.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ms.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_my.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_nl.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_no.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_pl.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_pt-br.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_pt.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ro.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ru.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_si.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_sk.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_sl.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_sr.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_sv.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_sw.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_ta.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_te.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_th.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_tr.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_uk.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_vi.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_zh-tw.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 2 - 1
src/main/webapp/resources/dia_zh.txt

@@ -1027,4 +1027,5 @@ errFetchDocList=Error: Couldn't fetch documents list.
 builtinPlugins=Built-in Plugins
 extPlugins=External Plugins
 backupFound=Backup file found
-chromeOnly=This feature only works on Google Chrome
+chromeOnly=This feature only works in Google Chrome
+msgDeleted=This message has been deleted.

+ 59 - 59
src/main/webapp/service-worker.js

@@ -6,7 +6,7 @@ if (workbox)
 	workbox.precaching.precacheAndRoute([
   {
     "url": "js/app.min.js",
-    "revision": "08f0ac76a3b5bf3aecdbccc500a87612"
+    "revision": "c43c110aa92991ed5edd948538ce6370"
   },
   {
     "url": "js/extensions.min.js",
@@ -26,7 +26,7 @@ if (workbox)
   },
   {
     "url": "index.html",
-    "revision": "c356c0a671c0e709c0b49d17dbf99cf9"
+    "revision": "18c33f3af16a7c95000d868f1886c7b5"
   },
   {
     "url": "open.html",
@@ -62,231 +62,231 @@ if (workbox)
   },
   {
     "url": "resources/dia.txt",
-    "revision": "84c5670cc69d7e0704f863c78b1504de"
+    "revision": "1ec12a0dd13b43b8d7f380cd1bf6b9ad"
   },
   {
     "url": "resources/dia_cs.txt",
-    "revision": "7cc42e3a373d6c500def64511b593e7f"
+    "revision": "06c1109d996b1dad062b05c771a61920"
   },
   {
     "url": "resources/dia_my.txt",
-    "revision": "84c5670cc69d7e0704f863c78b1504de"
+    "revision": "1ec12a0dd13b43b8d7f380cd1bf6b9ad"
   },
   {
     "url": "resources/dia_am.txt",
-    "revision": "05d7c4e48b6d1a77e1ed63348e8fc3fb"
+    "revision": "1a122f299214bc6fc0cf300270f6d869"
   },
   {
     "url": "resources/dia_ml.txt",
-    "revision": "e8de1751473062527c057d9288ae774a"
+    "revision": "97631cb2737b0e746b7f8ecc8941c727"
   },
   {
     "url": "resources/dia_uk.txt",
-    "revision": "fe07a34d958ba8a4d3f249657312d777"
+    "revision": "1a825bf39d1c36c2fa9b2ab48fd2e9e3"
   },
   {
     "url": "resources/dia_bg.txt",
-    "revision": "7c2028d6e68c38e4e3f8997a9ea04e17"
+    "revision": "630a27fef0624423314d0926df57d5d4"
   },
   {
     "url": "resources/dia_ca.txt",
-    "revision": "d5f20ce4508a13d4137945da4f02700d"
+    "revision": "fa1bf307f00d923528574ea211dd227a"
   },
   {
     "url": "resources/dia_th.txt",
-    "revision": "f8b7788abffca66d08abb81d29ab4891"
+    "revision": "3ad389e87a0e85681d6d8e2202ff7908"
   },
   {
     "url": "resources/dia_bs.txt",
-    "revision": "ff477b6802359a1fb9faab6c61a22e79"
+    "revision": "3466869f2e29324c2b3bf55081826454"
   },
   {
     "url": "resources/dia_id.txt",
-    "revision": "1d35e616d93b1ada6da502b70933ba38"
+    "revision": "25b23ac9f923266cd1182fe39923ad47"
   },
   {
     "url": "resources/dia_sk.txt",
-    "revision": "ae389ff931e19d5b8a6e66f613cfddb5"
+    "revision": "8e3c3fbfa22dc7ddb97965e8deed2c4a"
   },
   {
     "url": "resources/dia_ro.txt",
-    "revision": "90546cb6b08b3fa164751b324b0ec72b"
+    "revision": "b80c03fd6a1057df2049c953ce75c8c1"
   },
   {
     "url": "resources/dia_gl.txt",
-    "revision": "23a2087716ab0f7452198a743a83d8bc"
+    "revision": "a742a45372dafe715d15132779e2b375"
   },
   {
     "url": "resources/dia_es.txt",
-    "revision": "4749ece0f2e6e5b09ac454233dd07a9b"
+    "revision": "72bb27405fb620dbc9fff23cae9ab785"
   },
   {
     "url": "resources/dia_eu.txt",
-    "revision": "0efbc89a7f11389ea895c04ab0846d9c"
+    "revision": "6b8bd23addfe2c3d39e09bf378d83074"
   },
   {
     "url": "resources/dia_ko.txt",
-    "revision": "592da9713b3648cacef15222007c3a4b"
+    "revision": "0128304941e2bacfc3a1c5e13647de5d"
   },
   {
     "url": "resources/dia_si.txt",
-    "revision": "84c5670cc69d7e0704f863c78b1504de"
+    "revision": "1ec12a0dd13b43b8d7f380cd1bf6b9ad"
   },
   {
     "url": "resources/dia_kn.txt",
-    "revision": "95eece78fb95494d6c23d6bd4fefd3e4"
+    "revision": "06cfad9581f1e9dacd9eb5b9e8a927ba"
   },
   {
     "url": "resources/dia_hu.txt",
-    "revision": "0f6a4fdf54398c423e43c099c4c3a99c"
+    "revision": "4da4e966274427f93c1ffa0fbb62a131"
   },
   {
     "url": "resources/dia_fi.txt",
-    "revision": "0358e49c467e9b56a666e3b6342f2135"
+    "revision": "6d3b18a576cb038a0bb7f6d8b2203d1c"
   },
   {
     "url": "resources/dia_da.txt",
-    "revision": "0c46a9089640ac1eeecf95dee4aa853d"
+    "revision": "31e166718131d82495b1fcbea5eaa13d"
   },
   {
     "url": "resources/dia_de.txt",
-    "revision": "d5a7fc9948631b97cfc243f6d90d7d07"
+    "revision": "c758942c6cf34797186db837c73f62fc"
   },
   {
     "url": "resources/dia_sl.txt",
-    "revision": "6f1848ca42f4043a5bd6ea4afc89924c"
+    "revision": "a0ba7ed84175d151fb1aed287cfc688d"
   },
   {
     "url": "resources/dia_it.txt",
-    "revision": "c3639da81781d9bc4f221e2e4d746215"
+    "revision": "5eb7f89a1f2d470c54af6a631df49e4a"
   },
   {
     "url": "resources/dia_hr.txt",
-    "revision": "32ece3222e679b263bea16e5887a3097"
+    "revision": "7d098875272b5ebc2f8cc34429ad2d8a"
   },
   {
     "url": "resources/dia_he.txt",
-    "revision": "74cd559d96379f8403a36afbc16ca95d"
+    "revision": "8d42d60f44ceae0e2c98e7db877e0b0e"
   },
   {
     "url": "resources/dia_pt.txt",
-    "revision": "4fd553b9ef0b9197245918243ce8a8c2"
+    "revision": "481877838da3c834ea62a666b9cb60a7"
   },
   {
     "url": "resources/dia_zh-tw.txt",
-    "revision": "0724b57ec2bd99f9939ceb481e8bce06"
+    "revision": "2ebb56adc00cf11923807fbcef5ecf66"
   },
   {
     "url": "resources/dia_et.txt",
-    "revision": "70da2473e4c9781cb847608122f818d2"
+    "revision": "86aeccdd67fe3c30e6648c0f11b3ac34"
   },
   {
     "url": "resources/dia_ja.txt",
-    "revision": "013c93517982e3aed1ceebb6dc641dae"
+    "revision": "e3b2828c0c6907655d8a7456a11dec84"
   },
   {
     "url": "resources/dia_hi.txt",
-    "revision": "be691f2e4daf2620c97b585ac07958ba"
+    "revision": "3923df3b657d8b0c57e2748d95dd1570"
   },
   {
     "url": "resources/dia_eo.txt",
-    "revision": "adf11c778d030597a99ba114b7529ed2"
+    "revision": "fade58d52b126e3a8b40e7a004f9db80"
   },
   {
     "url": "resources/dia_fa.txt",
-    "revision": "ad287de72e903c935172633ccec020ef"
+    "revision": "6ccdc8b9382d820ff4e3a1f94344f4b8"
   },
   {
     "url": "resources/dia_sw.txt",
-    "revision": "58d6282fb75783e7b13234667fd4ee76"
+    "revision": "da1651246e84f1a54c0b83611a9a73ec"
   },
   {
     "url": "resources/dia_pl.txt",
-    "revision": "b3e567f68ddde3a121df6431578adf50"
+    "revision": "c803cb9d37d0a40e7805a51af61f3d53"
   },
   {
     "url": "resources/dia_pt-br.txt",
-    "revision": "1c148e3fc006d07ab7c48cdc49a0c143"
+    "revision": "578125b9508f38fdb7b9123c5d7b325f"
   },
   {
     "url": "resources/dia_sv.txt",
-    "revision": "1ffa33bbb93541f2eb173889b1f85e23"
+    "revision": "e6d546be7ad01b4874771a6a9bcf6999"
   },
   {
     "url": "resources/dia_el.txt",
-    "revision": "097173aa81255fd66bde347987cd4e6e"
+    "revision": "dca71bd35edd43717e61c5f86bc5738f"
   },
   {
     "url": "resources/dia_sr.txt",
-    "revision": "ab1985a41a4e32cd35c43b8b64c34a7c"
+    "revision": "460007c43fded3f0d7fe175d3df8f26b"
   },
   {
     "url": "resources/dia_fr.txt",
-    "revision": "348f42cb77b8401463e15525c58c4054"
+    "revision": "e0fe5b4a4cfd300747e2458c1eac57a6"
   },
   {
     "url": "resources/dia_ru.txt",
-    "revision": "937cfcf76519dd02215637991b84b2d9"
+    "revision": "a2f77277acb7a9abca0be8cfcb6e78b5"
   },
   {
     "url": "resources/dia_gu.txt",
-    "revision": "648f040ee5aa8b1b4426b1c85c90f508"
+    "revision": "a56c935f2e0f4465456c587abde38612"
   },
   {
     "url": "resources/dia_ar.txt",
-    "revision": "316a613a51f7573b73c60bbe607dfba7"
+    "revision": "b754b0206f8c0ef01730e417f0fa4490"
   },
   {
     "url": "resources/dia_tr.txt",
-    "revision": "e1cf56d011355c393bbeb49da3c939a8"
+    "revision": "9669902495e40a08e814a76a5b43e55f"
   },
   {
     "url": "resources/dia_te.txt",
-    "revision": "da3e01d839aff6ba95369e9eeca72b49"
+    "revision": "4e858034bc8bc1ce2025f988d614bf6e"
   },
   {
     "url": "resources/dia_lt.txt",
-    "revision": "0525cd9ccc8b457f14bc6ee18803c888"
+    "revision": "3bc2f077588dda41cbd59c4177af6524"
   },
   {
     "url": "resources/dia_lv.txt",
-    "revision": "19a0fcff5dc481fefc475c3a4236df28"
+    "revision": "9cc27e78ab552a3923ace242b08cc5f8"
   },
   {
     "url": "resources/dia_mr.txt",
-    "revision": "461814f4a2c895d3bdf4fcddb36aad36"
+    "revision": "ad00ca68e1fdb634a86a2eff13c02cce"
   },
   {
     "url": "resources/dia_ms.txt",
-    "revision": "f88f68023a0745952aa626e61160c7f0"
+    "revision": "9836aa97e4f4ca206eb0b244496cb44b"
   },
   {
     "url": "resources/dia_nl.txt",
-    "revision": "4d8a08d9a9bf85d76bce2878d24c15d9"
+    "revision": "92fa763a7fd00e53042b6a25935108c6"
   },
   {
     "url": "resources/dia_fil.txt",
-    "revision": "9143b8577ab8bfb38db1d2b71aa551ed"
+    "revision": "29d5ab8f9f37afc217dbe2667d11ba52"
   },
   {
     "url": "resources/dia_zh.txt",
-    "revision": "9d7194cc4f2a6d6fddc5425d71462f77"
+    "revision": "bceb1463e5553ba0a9fc41b46e5766e2"
   },
   {
     "url": "resources/dia_bn.txt",
-    "revision": "97f2d336d6caa8db00aaa49a7e0a1a5e"
+    "revision": "26a8dbbd11d8ef8340f333701816957b"
   },
   {
     "url": "resources/dia_no.txt",
-    "revision": "082025f45c4c74e064f9ed79d1c9bc0a"
+    "revision": "8bfea6e400b8dea4801baa9a5a7fcc02"
   },
   {
     "url": "resources/dia_vi.txt",
-    "revision": "64c468455ec461f4ca0a41b5bdb8611d"
+    "revision": "c1de0ba62ec390bc459c267e5ee73b07"
   },
   {
     "url": "resources/dia_ta.txt",
-    "revision": "43c54c16a2b6641e2aea783753eeeccf"
+    "revision": "0e4e12b9042c9ba41a69897e9771c691"
   },
   {
     "url": "favicon.ico",