Parcourir la source

9.1.0 release

Former-commit-id: 608a73a9fb38eefc048d70c66714bf043beea033
Gaudenz Alder il y a 7 ans
Parent
commit
69813539f7
70 fichiers modifiés avec 742 ajouts et 305 suppressions
  1. 5 0
      ChangeLog
  2. 1 1
      VERSION
  3. 189 140
      src/main/java/com/mxgraph/online/ProxyServlet.java
  4. 259 2
      src/main/java/com/mxgraph/online/Utils.java
  5. 1 1
      src/main/webapp/cache.manifest
  6. 31 29
      src/main/webapp/js/app.min.js
  7. 37 36
      src/main/webapp/js/atlas-viewer.min.js
  8. 34 32
      src/main/webapp/js/atlas.min.js
  9. 1 1
      src/main/webapp/js/diagramly/App.js
  10. 1 1
      src/main/webapp/js/diagramly/ElectronApp.js
  11. 16 16
      src/main/webapp/js/diagramly/Init.js
  12. 7 7
      src/main/webapp/js/diagramly/Menus.js
  13. 13 1
      src/main/webapp/js/diagramly/Minimal.js
  14. 1 1
      src/main/webapp/js/embed-static.min.js
  15. 1 1
      src/main/webapp/js/reader.min.js
  16. 37 36
      src/main/webapp/js/viewer.min.js
  17. 2 0
      src/main/webapp/resources/dia.txt
  18. 2 0
      src/main/webapp/resources/dia_am.txt
  19. 2 0
      src/main/webapp/resources/dia_ar.txt
  20. 2 0
      src/main/webapp/resources/dia_bg.txt
  21. 2 0
      src/main/webapp/resources/dia_bn.txt
  22. 2 0
      src/main/webapp/resources/dia_bs.txt
  23. 2 0
      src/main/webapp/resources/dia_ca.txt
  24. 2 0
      src/main/webapp/resources/dia_cs.txt
  25. 2 0
      src/main/webapp/resources/dia_da.txt
  26. 2 0
      src/main/webapp/resources/dia_de.txt
  27. 2 0
      src/main/webapp/resources/dia_el.txt
  28. 2 0
      src/main/webapp/resources/dia_eo.txt
  29. 2 0
      src/main/webapp/resources/dia_es.txt
  30. 2 0
      src/main/webapp/resources/dia_et.txt
  31. 2 0
      src/main/webapp/resources/dia_fa.txt
  32. 2 0
      src/main/webapp/resources/dia_fi.txt
  33. 2 0
      src/main/webapp/resources/dia_fil.txt
  34. 2 0
      src/main/webapp/resources/dia_fr.txt
  35. 2 0
      src/main/webapp/resources/dia_gu.txt
  36. 2 0
      src/main/webapp/resources/dia_he.txt
  37. 2 0
      src/main/webapp/resources/dia_hi.txt
  38. 2 0
      src/main/webapp/resources/dia_hr.txt
  39. 2 0
      src/main/webapp/resources/dia_hu.txt
  40. 2 0
      src/main/webapp/resources/dia_i18n.txt
  41. 2 0
      src/main/webapp/resources/dia_id.txt
  42. 2 0
      src/main/webapp/resources/dia_it.txt
  43. 2 0
      src/main/webapp/resources/dia_ja.txt
  44. 2 0
      src/main/webapp/resources/dia_kn.txt
  45. 2 0
      src/main/webapp/resources/dia_ko.txt
  46. 2 0
      src/main/webapp/resources/dia_lt.txt
  47. 2 0
      src/main/webapp/resources/dia_lv.txt
  48. 2 0
      src/main/webapp/resources/dia_ml.txt
  49. 2 0
      src/main/webapp/resources/dia_mr.txt
  50. 2 0
      src/main/webapp/resources/dia_ms.txt
  51. 2 0
      src/main/webapp/resources/dia_nl.txt
  52. 2 0
      src/main/webapp/resources/dia_no.txt
  53. 2 0
      src/main/webapp/resources/dia_pl.txt
  54. 2 0
      src/main/webapp/resources/dia_pt-br.txt
  55. 2 0
      src/main/webapp/resources/dia_pt.txt
  56. 2 0
      src/main/webapp/resources/dia_ro.txt
  57. 2 0
      src/main/webapp/resources/dia_ru.txt
  58. 2 0
      src/main/webapp/resources/dia_sk.txt
  59. 2 0
      src/main/webapp/resources/dia_sl.txt
  60. 2 0
      src/main/webapp/resources/dia_sr.txt
  61. 2 0
      src/main/webapp/resources/dia_sv.txt
  62. 2 0
      src/main/webapp/resources/dia_sw.txt
  63. 2 0
      src/main/webapp/resources/dia_ta.txt
  64. 2 0
      src/main/webapp/resources/dia_te.txt
  65. 2 0
      src/main/webapp/resources/dia_th.txt
  66. 2 0
      src/main/webapp/resources/dia_tr.txt
  67. 2 0
      src/main/webapp/resources/dia_uk.txt
  68. 2 0
      src/main/webapp/resources/dia_vi.txt
  69. 2 0
      src/main/webapp/resources/dia_zh-tw.txt
  70. 2 0
      src/main/webapp/resources/dia_zh.txt

+ 5 - 0
ChangeLog

@@ -1,3 +1,8 @@
+29-AUG-2018: 9.1.0
+
+- Adds content inspection in proxy server
+- Uses minimal UI for small screens
+
 27-AUG-2018: 9.0.9
 
 - Uses mxGraph 3.9.9 beta 8

+ 1 - 1
VERSION

@@ -1 +1 @@
-9.0.9
+9.1.0

+ 189 - 140
src/main/java/com/mxgraph/online/ProxyServlet.java

@@ -5,14 +5,15 @@
 package com.mxgraph.online;
 
 import java.io.BufferedInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URLConnection;
+import java.net.UnknownHostException;
 import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -21,6 +22,8 @@ import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.mxgraph.online.Utils.UnsupportedContentException;
+
 /**
  * Servlet implementation ProxyServlet
  */
@@ -29,14 +32,16 @@ public class ProxyServlet extends HttpServlet
 {
 	private static final Logger log = Logger
 			.getLogger(HttpServlet.class.getName());
-	
-	private static final String[] setValues = new String[]
-			{"image/svg+xml", "image/png", "application/vnd.jgraph.mxfile.realtime", "image/jpeg",
-			 "application/xml", "image/x-wmf", "image/gif", "image/webp", "text/plain",
-			 "application/x-font-ttf", "application/x-font-truetype", "application/x-font-opentype",
-			 "application/font-woff", "application/font-woff2", "application/vnd.ms-fontobject",
-			 "application/font-sfnt"};
-	private static final Set<String> allowedContent = new HashSet<String>(Arrays.asList(setValues));
+
+	/**
+	 * Buffer size for content pass-through.
+	 */
+	private static int BUFFER_SIZE = 3 * 1024;
+
+	/**
+	 * A resuable empty byte array instance.
+	 */
+	private static byte[] emptyBytes = new byte[0];
 
 	/**
 	 * @see HttpServlet#HttpServlet()
@@ -53,171 +58,215 @@ public class ProxyServlet extends HttpServlet
 			HttpServletResponse response) throws ServletException, IOException
 	{
 		String urlParam = request.getParameter("url");
-		
-		// build the UML source from the compressed request parameter
-		String ua = request.getHeader("User-Agent");
-		String ref = request.getHeader("referer");
-		boolean contentTypeAllowed = false;
-		boolean urlAllowed = true;
-		
-		String dom = "";
-
-		if (urlParam != null && urlParam.toLowerCase().contains("://metadata.google.internal/"))
-		{
-			urlAllowed = false;
-			log.log(Level.CONFIG, "proxy request to metadata.google.internal");
-		}
-		else if (ref != null && ref.toLowerCase()
-				.matches("https?://([a-z0-9,-]+[.])*draw[.]io/.*"))
-		{
-			dom = ref.toLowerCase().substring(0, ref.indexOf(".draw.io/") + 8);
-		}
-		else if (ref != null && ref.toLowerCase()
-				.matches("https?://([a-z0-9,-]+[.])*quipelements[.]com/.*"))
-		{
-			dom = ref.toLowerCase().substring(0,
-					ref.indexOf(".quipelements.com/") + 17);
-		}
-		// Enables Confluence/Jira proxy via referer or hardcoded user-agent (for old versions)
-		// UA refers to old FF on macOS so low risk and fixes requests from existing servers
-		else if ((ref != null && ref.equals("draw.io Proxy Confluence Server"))
-				|| (ua != null && ua.equals(
-						"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0")))
-		{
-			dom = "";
-		}
 
-		if (urlAllowed && dom != null && urlParam != null && (urlParam.startsWith("http://")
-				|| urlParam.startsWith("https://")))
+		if (checkUrlParameter(urlParam))
 		{
-			request.setCharacterEncoding("UTF-8");
-			response.setCharacterEncoding("UTF-8");
-
-			OutputStream out = response.getOutputStream();
+			// build the UML source from the compressed request parameter
+			String ref = request.getHeader("referer");
+			String ua = request.getHeader("User-Agent");
+			String dom = getCorsDomain(ref, ua);
 
 			try
 			{
-				URL url = new URL(urlParam);
-				URLConnection connection = url.openConnection();
-				response.setHeader("Cache-Control", "private, max-age=86400");
+				request.setCharacterEncoding("UTF-8");
+				response.setCharacterEncoding("UTF-8");
 
-				if (dom != null && dom.length() > 0)
+				if (dom != null)
 				{
-					response.addHeader("Access-Control-Allow-Origin", dom);
-				}
+					URL url = new URL(urlParam);
+					URLConnection connection = url.openConnection();
+					OutputStream out = response.getOutputStream();
+					response.setHeader("Cache-Control",
+							"private, max-age=86400");
 
-				connection.setRequestProperty("User-Agent", "draw.io");
+					// Workaround for 451 response from Iconfinder CDN
+					connection.setRequestProperty("User-Agent", "draw.io");
 
-				// Status code pass-through and follow redirects
-				if (connection instanceof HttpURLConnection)
-				{
-					((HttpURLConnection) connection)
-							.setInstanceFollowRedirects(true);
+					if (dom.length() > 0)
+					{
+						response.addHeader("Access-Control-Allow-Origin", dom);
+					}
 
-					// Workaround for 451 response from Iconfinder CDN
-					int status = ((HttpURLConnection) connection)
-							.getResponseCode();
-					int counter = 0;
-
-					// Follows a maximum of 2 redirects 
-					while (counter++ < 2
-							&& (status == HttpURLConnection.HTTP_MOVED_PERM
-									|| status == HttpURLConnection.HTTP_MOVED_TEMP))
+					// Status code pass-through and follow redirects
+					if (connection instanceof HttpURLConnection)
 					{
-						url = new URL(connection.getHeaderField("Location"));
-						connection = url.openConnection();
 						((HttpURLConnection) connection)
 								.setInstanceFollowRedirects(true);
-
-						// Workaround for 451 response from Iconfinder CDN
-						connection.setRequestProperty("User-Agent", "draw.io");
-						status = ((HttpURLConnection) connection)
+						int status = ((HttpURLConnection) connection)
 								.getResponseCode();
-					}
+						int counter = 0;
 
-					response.setStatus(status);
-				}
-
-				String base64 = request.getParameter("base64");
-
-				if (connection != null)
-				{
-					String contentType = connection.getContentType();
-					
-					if (contentType != null && allowedContent.contains(contentType))
-					{
-						contentTypeAllowed = true;
-					}
-
-					urlAllowed = false;
-					boolean validateHtml = false;
-
-					if (!contentTypeAllowed)
-					{
-						if (urlParam != null && urlParam.toLowerCase().startsWith("https://trello-attachments.s3.amazonaws.com/"))
+						// Follows a maximum of 2 redirects 
+						while (counter++ < 2
+								&& (status == HttpURLConnection.HTTP_MOVED_PERM
+										|| status == HttpURLConnection.HTTP_MOVED_TEMP))
 						{
-							urlAllowed = true;
-						}
-					}
+							url = new URL(
+									connection.getHeaderField("Location"));
+							connection = url.openConnection();
+							((HttpURLConnection) connection)
+									.setInstanceFollowRedirects(true);
 
-					if (!contentTypeAllowed && !urlAllowed)
-					{
-						if (contentType != null && contentType.equals("text/html"))
-						{
-							validateHtml = true;
+							// Workaround for 451 response from Iconfinder CDN
+							connection.setRequestProperty("User-Agent",
+									"draw.io");
+							status = ((HttpURLConnection) connection)
+									.getResponseCode();
 						}
 
-						log.log(Level.CONFIG, "proxyContent=" + contentType);
-					}
+						response.setStatus(status);
 
-					response.setContentType("application/octet-stream");
+						// Copies input stream to output stream
+						InputStream is = connection.getInputStream();
+						byte[] head = (contentAlwaysAllowed(urlParam))
+								? emptyBytes
+								: Utils.checkStreamContent(is);
+						response.setContentType("application/octet-stream");
+						String base64 = request.getParameter("base64");
+						copyResponse(is, out, head,
+								base64 != null && base64.equals("1"));
+					}
 
-					if (base64 != null && base64.equals("1"))
-					{
-						int BUFFER_SIZE = 3 * 1024;
+					out.flush();
+					out.close();
 
-						try (BufferedInputStream in = new BufferedInputStream(
-								connection.getInputStream(), BUFFER_SIZE);)
-						{
-							StringBuilder result = new StringBuilder();
-							byte[] chunk = new byte[BUFFER_SIZE];
-							int len = 0;
-							while ((len = in.read(chunk)) == BUFFER_SIZE)
-							{
-								result.append(
-										mxBase64.encodeToString(chunk, false));
-							}
-
-							if (len > 0)
-							{
-								chunk = Arrays.copyOf(chunk, len);
-								result.append(
-										mxBase64.encodeToString(chunk, false));
-							}
-
-							out.write(result.toString().getBytes());
-						}
-					}
-					else
-					{
-						Utils.copy(connection.getInputStream(), out);
-					}
+					log.log(Level.FINEST, "processed proxy request: url="
+							+ ((urlParam != null) ? urlParam : "[null]")
+							+ ", referer=" + ((ref != null) ? ref : "[null]")
+							+ ", user agent=" + ((ua != null) ? ua : "[null]"));
 				}
-
-				out.flush();
-				out.close();
+				else
+				{
+					response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
+					log.log(Level.SEVERE,
+							"proxy request with invalid referer: url="
+									+ ((urlParam != null) ? urlParam : "[null]")
+									+ ", referer="
+									+ ((ref != null) ? ref : "[null]")
+									+ ", user agent="
+									+ ((ua != null) ? ua : "[null]"));
+				}
+			}
+			catch (UnknownHostException | FileNotFoundException e)
+			{
+				// do not log 404 and DNS errors
+				response.setStatus(HttpServletResponse.SC_NOT_FOUND);
+			}
+			catch (UnsupportedContentException e)
+			{
+				response.setStatus(HttpServletResponse.SC_FORBIDDEN);
+				log.log(Level.SEVERE, "proxy request with invalid content: url="
+						+ ((urlParam != null) ? urlParam : "[null]")
+						+ ", referer=" + ((ref != null) ? ref : "[null]")
+						+ ", user agent=" + ((ua != null) ? ua : "[null]"));
 			}
 			catch (Exception e)
 			{
 				response.setStatus(
 						HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+				log.log(Level.FINE, "proxy request failed: url="
+						+ ((urlParam != null) ? urlParam : "[null]")
+						+ ", referer=" + ((ref != null) ? ref : "[null]")
+						+ ", user agent=" + ((ua != null) ? ua : "[null]"));
 				e.printStackTrace();
 			}
 		}
 		else
 		{
 			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
+			log.log(Level.SEVERE,
+					"proxy request with invalid URL parameter: url="
+							+ ((urlParam != null) ? urlParam : "[null]"));
 		}
 	}
 
+	/**
+	 * Dynamically generated CORS header for known domains.
+	 * @throws IOException 
+	 */
+	protected void copyResponse(InputStream is, OutputStream out, byte[] head,
+			boolean base64) throws IOException
+	{
+		if (base64)
+		{
+			try (BufferedInputStream in = new BufferedInputStream(is,
+					BUFFER_SIZE))
+			{
+				StringBuilder result = new StringBuilder();
+				result.append(mxBase64.encodeToString(head, false));
+				byte[] chunk = new byte[BUFFER_SIZE];
+				int len = 0;
+
+				while ((len = in.read(chunk)) == BUFFER_SIZE)
+				{
+					result.append(mxBase64.encodeToString(chunk, false));
+				}
+
+				if (len > 0)
+				{
+					chunk = Arrays.copyOf(chunk, len);
+					result.append(mxBase64.encodeToString(chunk, false));
+				}
+
+				out.write(result.toString().getBytes());
+			}
+		}
+		else
+		{
+			out.write(head);
+			Utils.copy(is, out);
+		}
+	}
+
+	/**
+	 * Checks if the URL parameter is legal.
+	 */
+	public boolean checkUrlParameter(String url)
+	{
+		return url != null
+				&& (url.startsWith("http://") || url.startsWith("https://"))
+				&& !url.toLowerCase().contains("://metadata.google.internal/");
+	}
+
+	/**
+	 * Returns true if the content check should be omitted.
+	 */
+	public boolean contentAlwaysAllowed(String url)
+	{
+		return url.toLowerCase()
+				.startsWith("https://trello-attachments.s3.amazonaws.com/");
+	}
+
+	/**
+	 * Gets CORS header for request. Returning null means do not respond.
+	 */
+	protected String getCorsDomain(String referer, String userAgent)
+	{
+		String dom = null;
+
+		if (referer != null && referer.toLowerCase()
+				.matches("https?://([a-z0-9,-]+[.])*draw[.]io/.*"))
+		{
+			dom = referer.toLowerCase().substring(0,
+					referer.indexOf(".draw.io/") + 8);
+		}
+		else if (referer != null && referer.toLowerCase()
+				.matches("https?://([a-z0-9,-]+[.])*quipelements[.]com/.*"))
+		{
+			dom = referer.toLowerCase().substring(0,
+					referer.indexOf(".quipelements.com/") + 17);
+		}
+		// Enables Confluence/Jira proxy via referer or hardcoded user-agent (for old versions)
+		// UA refers to old FF on macOS so low risk and fixes requests from existing servers
+		else if ((referer != null
+				&& referer.equals("draw.io Proxy Confluence Server"))
+				|| (userAgent != null && userAgent.equals(
+						"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:50.0) Gecko/20100101 Firefox/50.0")))
+		{
+			dom = "";
+		}
+
+		return dom;
+	}
+
 }

+ 259 - 2
src/main/java/com/mxgraph/online/Utils.java

@@ -28,6 +28,14 @@ import com.mxgraph.util.mxPoint;
 public class Utils
 {
 
+	/**
+	 *
+	 */
+	public static class UnsupportedContentException extends Exception
+	{
+		private static final long serialVersionUID = 1239597891574347740L;
+	}
+
 	/**
 	 * 
 	 */
@@ -173,8 +181,9 @@ public class Utils
 			try
 			{
 				result = URLEncoder.encode(s, charset).replaceAll("\\+", "%20")
-						.replaceAll("\\%21", "!").replaceAll("\\%27", "'").replaceAll("\\%28", "(")
-						.replaceAll("\\%29", ")").replaceAll("\\%7E", "~");
+						.replaceAll("\\%21", "!").replaceAll("\\%27", "'")
+						.replaceAll("\\%28", "(").replaceAll("\\%29", ")")
+						.replaceAll("\\%7E", "~");
 			}
 			catch (UnsupportedEncodingException e)
 			{
@@ -219,4 +228,252 @@ public class Utils
 		geo.setX(Math.round(x1 + cx - geo.getWidth() / 2));
 		geo.setY(Math.round(y1 + cy - geo.getHeight() / 2));
 	}
+
+	/**
+	 * Checks the file type of an input stream and returns the
+	 * bytes that have been read (because URL connections to not
+	 * have support for mark/reset).
+	 */
+	static public byte[] checkStreamContent(InputStream is)
+			throws IOException, UnsupportedContentException
+	{
+		byte[] head = new byte[16];
+		boolean valid = false;
+
+		if (is.read(head) == head.length)
+		{
+			int c1 = head[0] & 0xFF;
+			int c2 = head[1] & 0xFF;
+			int c3 = head[2] & 0xFF;
+			int c4 = head[3] & 0xFF;
+			int c5 = head[4] & 0xFF;
+			int c6 = head[5] & 0xFF;
+			int c7 = head[6] & 0xFF;
+			int c8 = head[7] & 0xFF;
+			int c9 = head[8] & 0xFF;
+			int c10 = head[9] & 0xFF;
+			int c11 = head[10] & 0xFF;
+			int c12 = head[11] & 0xFF;
+			int c13 = head[12] & 0xFF;
+			int c14 = head[13] & 0xFF;
+			int c15 = head[14] & 0xFF;
+			int c16 = head[15] & 0xFF;
+
+			if (c1 == '<')
+			{
+				// text/html
+				if (c2 == '!'
+						|| ((c2 == 'h'
+								&& (c3 == 't' && c4 == 'm' && c5 == 'l'
+										|| c3 == 'e' && c4 == 'a' && c5 == 'd')
+								|| (c2 == 'b' && c3 == 'o' && c4 == 'd'
+										&& c5 == 'y')))
+						|| ((c2 == 'H'
+								&& (c3 == 'T' && c4 == 'M' && c5 == 'L'
+										|| c3 == 'E' && c4 == 'A' && c5 == 'D')
+								|| (c2 == 'B' && c3 == 'O' && c4 == 'D'
+										&& c5 == 'Y'))))
+				{
+					valid = true;
+				}
+
+				// application/xml
+				if (c2 == '?' && c3 == 'x' && c4 == 'm' && c5 == 'l'
+						&& c6 == ' ')
+				{
+					valid = true;
+				}
+			}
+
+			// big and little (identical) endian UTF-8 encodings, with BOM
+			// application/xml
+			if (c1 == 0xef && c2 == 0xbb && c3 == 0xbf)
+			{
+				if (c4 == '<' && c5 == '?' && c6 == 'x')
+				{
+					valid = true;
+				}
+			}
+
+			// big and little endian UTF-16 encodings, with byte order mark
+			// application/xml
+			if (c1 == 0xfe && c2 == 0xff)
+			{
+				if (c3 == 0 && c4 == '<' && c5 == 0 && c6 == '?' && c7 == 0
+						&& c8 == 'x')
+				{
+					valid = true;
+				}
+			}
+
+			// application/xml
+			if (c1 == 0xff && c2 == 0xfe)
+			{
+				if (c3 == '<' && c4 == 0 && c5 == '?' && c6 == 0 && c7 == 'x'
+						&& c8 == 0)
+				{
+					valid = true;
+				}
+			}
+
+			// big and little endian UTF-32 encodings, with BOM
+			// application/xml
+			if (c1 == 0x00 && c2 == 0x00 && c3 == 0xfe && c4 == 0xff)
+			{
+				if (c5 == 0 && c6 == 0 && c7 == 0 && c8 == '<' && c9 == 0
+						&& c10 == 0 && c11 == 0 && c12 == '?' && c13 == 0
+						&& c14 == 0 && c15 == 0 && c16 == 'x')
+				{
+					valid = true;
+				}
+			}
+
+			// application/xml
+			if (c1 == 0xff && c2 == 0xfe && c3 == 0x00 && c4 == 0x00)
+			{
+				if (c5 == '<' && c6 == 0 && c7 == 0 && c8 == 0 && c9 == '?'
+						&& c10 == 0 && c11 == 0 && c12 == 0 && c13 == 'x'
+						&& c14 == 0 && c15 == 0 && c16 == 0)
+				{
+					valid = true;
+				}
+			}
+
+			// image/gif
+			if (c1 == 'G' && c2 == 'I' && c3 == 'F' && c4 == '8')
+			{
+				valid = true;
+			}
+
+			// image/x-bitmap
+			if (c1 == '#' && c2 == 'd' && c3 == 'e' && c4 == 'f')
+			{
+				valid = true;
+			}
+
+			// image/x-pixmap
+			if (c1 == '!' && c2 == ' ' && c3 == 'X' && c4 == 'P' && c5 == 'M'
+					&& c6 == '2')
+			{
+				valid = true;
+			}
+
+			// image/png
+			if (c1 == 137 && c2 == 80 && c3 == 78 && c4 == 71 && c5 == 13
+					&& c6 == 10 && c7 == 26 && c8 == 10)
+			{
+				valid = true;
+			}
+
+			// image/jpeg
+			if (c1 == 0xFF && c2 == 0xD8 && c3 == 0xFF)
+			{
+				if (c4 == 0xE0 || c4 == 0xEE)
+				{
+					valid = true;
+				}
+
+				/**
+				 * File format used by digital cameras to store images.
+				 * Exif Format can be read by any application supporting
+				 * JPEG. Exif Spec can be found at:
+				 * http://www.pima.net/standards/it10/PIMA15740/Exif_2-1.PDF
+				 */
+				if ((c4 == 0xE1) && (c7 == 'E' && c8 == 'x' && c9 == 'i'
+						&& c10 == 'f' && c11 == 0))
+				{
+					valid = true;
+				}
+			}
+
+			// Additional signatures
+			// See https://www.garykessler.net/library/file_sigs.html
+			// and https://en.wikipedia.org/wiki/List_of_file_signatures
+			// TODO: Add check for .eot fonts
+			// ttf
+			if (c1 == 0x00 && c2 == 0x01 && c3 == 0x00 && c4 == 0x00
+					&& c5 == 0x00)
+			{
+				valid = true;
+			}
+
+			// otf
+			if (c1 == 0x4F && c2 == 0x5a && c3 == 0x54 && c4 == 0x4F
+					&& c5 == 0x00)
+			{
+				valid = true;
+			}
+
+			// woff
+			if (c1 == 0x77 && c2 == 0x4F && c3 == 0x46 && c4 == 0x46)
+			{
+				valid = true;
+			}
+
+			// woff2
+			if (c1 == 0x77 && c2 == 0x4F && c3 == 0x46 && c4 == 0x32)
+			{
+				valid = true;
+			}
+
+			// vsdx, vssx (also zip, jar, odt, ods, odp, docx, xlsx, pptx, apk, aar)
+			if (c1 == 0x50 && c2 == 0x4B && c3 == 0x03 && c4 == 0x04)
+			{
+				valid = true;
+			}
+			else if (c1 == 0x50 && c2 == 0x4B && c3 == 0x03 && c4 == 0x06)
+			{
+				valid = true;
+			}
+
+			// vsd, ppt
+			if (c1 == 0xD0 && c2 == 0xCF && c3 == 0x11 && c4 == 0xE0
+					&& c5 == 0xA1 && c6 == 0xB1 && c7 == 0x1A && c8 == 0xE1)
+			{
+				valid = true;
+			}
+
+			// mxfile, mxlibrary, mxGraphModel
+			if (c1 == '<' && c2 == 'm' && c3 == 'x')
+			{
+				valid = true;
+			}
+
+			if (c1 == '<' && c2 == 'D' && c3 == 'O' && c4 == 'C' && c5 == 'T'
+					&& c6 == 'Y' && c7 == 'P' && c8 == 'E')
+			{
+				valid = true;
+			}
+
+			if (c1 == '<' && c2 == '!' && c3 == '-' && c4 == '-' && c5 == '['
+					&& c6 == 'i' && c7 == 'f' && c8 == ' ')
+			{
+				valid = true;
+			}
+
+			// Gliffy
+			if (c1 == '{' && c2 == '"' && c3 == 'c' && c4 == 'o' && c5 == 'n'
+					&& c6 == 't' && c7 == 'e' && c8 == 'n' && c9 == 't'
+					&& c10 == 'T' && c11 == 'y' && c12 == 'p' && c13 == 'e'
+					&& c14 == '"' && c15 == ':')
+			{
+				valid = true;
+			}
+
+			// Lucidchart
+			if (c1 == '{' && c2 == '"' && c3 == 's' && c4 == 't' && c5 == 'a'
+					&& c6 == 't' && c7 == 'e' && c8 == '"' && c9 == ':')
+			{
+				valid = true;
+			}
+		}
+
+		if (!valid)
+		{
+			throw new UnsupportedContentException();
+		}
+
+		return head;
+	}
+
 }

+ 1 - 1
src/main/webapp/cache.manifest

@@ -1,7 +1,7 @@
 CACHE MANIFEST
 
 # THIS FILE WAS GENERATED. DO NOT MODIFY!
-# 08/27/2018 04:58 PM
+# 08/29/2018 11:24 AM
 
 app.html
 index.html?offline=1

Fichier diff supprimé car celui-ci est trop grand
+ 31 - 29
src/main/webapp/js/app.min.js


Fichier diff supprimé car celui-ci est trop grand
+ 37 - 36
src/main/webapp/js/atlas-viewer.min.js


Fichier diff supprimé car celui-ci est trop grand
+ 34 - 32
src/main/webapp/js/atlas.min.js


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

@@ -2976,7 +2976,7 @@ App.prototype.saveFile = function(forceDialog)
 						
 						// Do not use a filename to use undefined mode
 						window.openFile.setData(this.getFileData(true));
-						this.openLink(this.getUrl(window.location.pathname));
+						this.openLink(this.getUrl(window.location.pathname), null, true);
 					}
 					else if (prev != mode)
 					{

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

@@ -81,7 +81,7 @@ FeedbackDialog.feedbackUrl = 'https://log.draw.io/email';
 
 		var editorUi = this.editorUi;
 
-		editorUi.actions.put('offline', new Action(mxResources.get('online') + '...', function()
+		editorUi.actions.put('useOffline', new Action(mxResources.get('useOffline') + '...', function()
 		{
 			editorUi.openLink('https://www.draw.io/')
 		}));

+ 16 - 16
src/main/webapp/js/diagramly/Init.js

@@ -163,22 +163,22 @@ window.uiTheme = window.uiTheme || (function()
 	}
 	
 	// Uses minimal theme on small screens
-//	try
-//	{
-//		if (ui == null)
-//		{
-//	        var iw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
-//	
-//	        if (iw <= 414)
-//	        {
-//	        	ui = 'min';
-//	        }
-//		}
-//	}
-//	catch (e)
-//	{
-//		// ignore
-//	}
+	try
+	{
+		if (ui == null)
+		{
+	        var iw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
+
+	        if (iw <= 414)
+	        {
+	        	ui = 'min';
+	        }
+		}
+	}
+	catch (e)
+	{
+		// ignore
+	}
 	
 	return ui;
 })();

+ 7 - 7
src/main/webapp/js/diagramly/Menus.js

@@ -399,7 +399,7 @@
 				var filename = (file.getTitle() != null) ? file.getTitle() : editorUi.defaultFilename;
 				editorUi.openLink(window.location.protocol + '//' + window.location.host + '/?create=drawdata&' +
 						((editorUi.mode == App.MODE_DROPBOX) ? 'mode=dropbox&' : '') +
-						'title=' + encodeURIComponent(filename));
+						'title=' + encodeURIComponent(filename), null, true);
 			}
 		});
 
@@ -889,12 +889,12 @@
 				if (!editorUi.isOffline() && !EditorUi.isElectronApp &&
 					!navigator.standalone && urlParams['embed'] != '1')
 				{
-					this.addMenuItems(menu, ['download'], parent);
+					this.addMenuItems(menu, ['downloadDesktop'], parent);
 				}
 				
 				if (!navigator.standalone && urlParams['embed'] != '1')
 				{
-					this.addMenuItems(menu, ['offline'], parent);
+					this.addMenuItems(menu, ['useOffline'], parent);
 				}
 				
 				this.addMenuItems(menu, ['-', 'about'], parent);
@@ -1932,12 +1932,12 @@
 			this.addMenuItems(menu, ['publishLink'], parent);
 		})));
 
-		editorUi.actions.put('offline', new Action(mxResources.get('offline') + '...', function()
+		editorUi.actions.put('useOffline', new Action(mxResources.get('useOffline') + '...', function()
 		{
 			editorUi.openLink('https://app.draw.io/')
 		}));
 		
-		editorUi.actions.put('download', new Action(mxResources.get('download') + '...', function()
+		editorUi.actions.put('downloadDesktop', new Action(mxResources.get('downloadDesktop') + '...', function()
 		{
 			editorUi.openLink('https://get.draw.io/')
 		}));
@@ -2630,10 +2630,10 @@
 				else
 				{
 					this.addMenuItems(menu, ['-', 'save', 'saveAs', '-', 'rename'], parent);
-					
+
 					if (editorUi.isOfflineApp())
 					{
-						if (!editorUi.isOffline())
+						if (navigator.onLine && urlParams['stealth'] != '1')
 						{
 							this.addMenuItems(menu, ['upload'], parent);
 						}

+ 13 - 1
src/main/webapp/js/diagramly/Minimal.js

@@ -801,7 +801,19 @@ EditorUi.initMinimalTheme = function()
 			}
 			else
 			{
-				ui.menus.addMenuItems(menu, ['save', 'saveAs', '-', 'rename', 'makeCopy'], parent);
+				ui.menus.addMenuItems(menu, ['save', 'saveAs', '-', 'rename'], parent);
+				
+				if (ui.isOfflineApp())
+				{
+					if (navigator.onLine && urlParams['stealth'] != '1')
+					{
+						this.addMenuItems(menu, ['upload'], parent);
+					}
+				}
+				else
+				{
+					ui.menus.addMenuItems(menu, ['makeCopy'], parent);
+				}
 			}
 
 			if (file != null && (file.constructor == DriveFile || file.constructor == DropboxFile))

Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
src/main/webapp/js/embed-static.min.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
src/main/webapp/js/reader.min.js


Fichier diff supprimé car celui-ci est trop grand
+ 37 - 36
src/main/webapp/js/viewer.min.js


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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=‫أنقر مرتين لتغيير الإتجاه‬
 doubleClickTooltip=‫انقر مرتين لإضافة نص‬
 doubleClickChangeProperty=Doubleclick to change property name
 download=‫تحميل‬
+downloadDesktop=Download draw.io Desktop
 downloadAs=‫تحميل ك‬
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=‫تحديث المعاينة. المرجو الانتظار...
 updatingSelection=‫تحديث الاختيار. برجاء الانتظار...‬
 upload=‫رفع‬
 url=‫الرابط‬
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=‫عمودي‬

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Кликнете два пъти за промяна на
 doubleClickTooltip=Кликнете два пъти за вмъкване на текст
 doubleClickChangeProperty=Кликнете два пъти за промяна на името на функцията
 download=Изтегляне
+downloadDesktop=Download draw.io Desktop
 downloadAs=Изтегляне като
 clickHereToSave=Кликнете тук за запазване
 draftDiscarded=Черновата е отказана
@@ -694,6 +695,7 @@ updatingPreview=Актуализиране на предварителния п
 updatingSelection=Актуализиране на селекцията. Моля изчакайте...
 upload=Качване
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Ръководство за употреба
 vertical=Вертикален

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dupli klik za promjenu orijentacije
 doubleClickTooltip=Dupli klik za unos teksta
 doubleClickChangeProperty=Dupli klik za promjenu naziva fajla
 download=Preuzmi
+downloadDesktop=Download draw.io Desktop
 downloadAs=Preuzmi kao
 clickHereToSave=Kliknite ovdje kako biste spasili.
 draftDiscarded=Nacrt odbačen
@@ -694,6 +695,7 @@ updatingPreview=Ažuriranje pregleda. Molimo sačekajte...
 updatingSelection=Ažuriranje odabira. Molimo sačekajte...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Korisničko uputstvo
 vertical=Uspravno

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Fes doble clic per canviar l'orientació
 doubleClickTooltip=Fes doble clic per inserir text
 doubleClickChangeProperty=Fes doble clic per canviar el nom de la propietat
 download=Descarregar
+downloadDesktop=Download draw.io Desktop
 downloadAs=Descarregar com
 clickHereToSave=Clica aquí per desar.
 draftDiscarded=Esborrany descartat
@@ -694,6 +695,7 @@ updatingPreview=Actualitzant la vista prèvia. Si us plau, espera...
 updatingSelection=Actualitzant la selecció. Si us plau, espera...
 upload=Carrega
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Manual d'usuari
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dvojitým klepnutím změníte orientaci
 doubleClickTooltip=Dvojitým klepnutím vložíte text
 doubleClickChangeProperty=Dvojitým klepnutím změníte jméno vlastnosti
 download=Stáhnout
+downloadDesktop=Download draw.io Desktop
 downloadAs=Stáhnout jako
 clickHereToSave=Uložíte klepnutím zde.
 draftDiscarded=Koncept zahozen
@@ -694,6 +695,7 @@ updatingPreview=Aktualizuji náhled. Prosím čekejte...
 updatingSelection=Aktualizuji výběr. Prosím čekejte...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Uživatelský manuál
 vertical=Svisle

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dobbeltklik for at ændre orientering
 doubleClickTooltip=Dobbeltklik for at indsætte tekst
 doubleClickChangeProperty=Dobbeltklik for at ændre navn
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download som
 clickHereToSave=Klik her for at gemme
 draftDiscarded=Udkast annulleret
@@ -694,6 +695,7 @@ updatingPreview=Opdaterer Preview. Vent venligst...
 updatingSelection=Opdaterer Valg. Vent venligst...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Brugermanual
 vertical=Lodret

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doppelklicken um Orientierung zu ändern
 doubleClickTooltip=Doppelklicken um Text einzufügen
 doubleClickChangeProperty=Doppelklicken um Eigenschaftsname zu ändern
 download=Herunterladen
+downloadDesktop=draw.io Desktop herunterladen
 downloadAs=Herunterladen als
 clickHereToSave=Hier klicken um zu speichern.
 draftDiscarded=Entwurf gelöscht
@@ -694,6 +695,7 @@ updatingPreview=Aktualisiere Vorschau. Bitte warten...
 updatingSelection=Aktualisiere Markierung. Bitte warten...
 upload=Hochladen
 url=URL
+useOffline=Offline verwenden
 useRootFolder=Wurzelverzeichnis verwenden?
 userManual=Benutzerhandbuch
 vertical=Vertikal

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Κάντε διπλό κλικ για αλλαγή προ
 doubleClickTooltip=Κάντε διπλό κλικ για εισαγωγή κειμένου
 doubleClickChangeProperty=Κάντε διπλό κλικ για να αλλάξετε το εύρος μνήμης
 download=Λήψη
+downloadDesktop=Download draw.io Desktop
 downloadAs=Λήψη ως
 clickHereToSave=Πατήστε εδώ για αποθήκευση
 draftDiscarded=Το σχέδιο απορρίφθηκε
@@ -694,6 +695,7 @@ updatingPreview=Ενημέρωση Προεπισκόπησης. Παρακαλ
 updatingSelection=Ενημέρωση Επιλογής. Παρακαλούμε περιμένετε...
 upload=Ανέβασμα
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Εγχειρίδιο Χρήστη
 vertical=Κάθετο

+ 2 - 0
src/main/webapp/resources/dia_eo.txt

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Elŝuti
+downloadDesktop=Download draw.io Desktop
 downloadAs=Elŝuti kiel
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Alŝuti
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Haga doble clic para cambiar la orientación
 doubleClickTooltip=Haga doble clic para insertar texto
 doubleClickChangeProperty=Haga doble clic para cambiar el nombre de la propiedad
 download=Descargar
+downloadDesktop=Download draw.io Desktop
 downloadAs=Descargar como
 clickHereToSave=Haga clic aquí para guardar.
 draftDiscarded=Borrador descartado
@@ -694,6 +695,7 @@ updatingPreview=Actualizando vista previa. Por favor, espere...
 updatingSelection=Actualizando selección. Por favor, espere...
 upload=Subir
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Manual de usuario
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Topeltklõps suuna muutmiseks
 doubleClickTooltip=Topeltklõps teksti sisestamiseks
 doubleClickChangeProperty=Topeltklõps nime muutmiseks
 download=Lae alla
+downloadDesktop=Download draw.io Desktop
 downloadAs=Lae alla nimega
 clickHereToSave=Kliki siia salvestamiseks
 draftDiscarded=Mustand tühistatud
@@ -694,6 +695,7 @@ updatingPreview=Uuenda eelvaadet. Palun oota...
 updatingSelection=Uuendan valikut. Palun oota...
 upload=Lae üles
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Kasutusjuhend
 vertical=Vertikaalne

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

@@ -174,6 +174,7 @@ doubleClickOrientation=‫برای تغییر موقعیت دوبار کلیک 
 doubleClickTooltip=‫برای وارد کردن متن دوبار کلیک کنید‬
 doubleClickChangeProperty=‫برای تغییر نام property دوبار کلیک کنید‬
 download=‫دانلود‬
+downloadDesktop=Download draw.io Desktop
 downloadAs=‫دانلود به‌صورت‬
 clickHereToSave=‫برای ذخیره اینجا کلیک نمایید.‬
 draftDiscarded=‫پیش‌نویس باطل شد‬
@@ -694,6 +695,7 @@ updatingPreview=‫در حال به روز رسانی پیش نما. لطفا م
 updatingSelection=‫در حال به روز رسانی انتخاب. لطفاً منتظر بمانید...‬
 upload=‫آپلود‬
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=‫راهنمای کاربر‬
 vertical=‫عمودی‬

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Muuta suuntaa kaksoisnapsauttamalla
 doubleClickTooltip=Syötä tekstiä kaksoisnapsauttamalla
 doubleClickChangeProperty=Kaksoisnapauta muuttaaksesi nimeä
 download=Lataa
+downloadDesktop=Download draw.io Desktop
 downloadAs=Lataa nimellä
 clickHereToSave=Klikkaa tästä tallentaaksesi.
 draftDiscarded=Vedos hylätty
@@ -694,6 +695,7 @@ updatingPreview=Esikatselua päivitetään. Ole hyvä ja odota...
 updatingSelection=Valintaa päivitetään. Ole hyvä ja odota...
 upload=Lataa
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Käyttöohje
 vertical=Pystysuunta

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Pindutin ng dalawang beses para mabago ang oryentasyon
 doubleClickTooltip=Pindutin ng dalawang beses para maglagay ng teksto
 doubleClickChangeProperty=Pindutin ng dalawang beses para mabago ang ngalan ng katangian
 download=I-download
+downloadDesktop=Download draw.io Desktop
 downloadAs=I-download bilang
 clickHereToSave=Pindutin dito para i-save
 draftDiscarded=Naisantabi ang draft
@@ -694,6 +695,7 @@ updatingPreview=Ina-update ang Paunang tingin.  Mangyaring maghintay...
 updatingSelection=Ina-update ang mga napili. Mangyaring maghintay...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Gabay ng Gumagamit
 vertical=Patayo

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Double-cliquer pour modifier l’orientation
 doubleClickTooltip=Double-cliquer pour insérer du texte
 doubleClickChangeProperty=Double-cliquer pour changer le nom de la propriété
 download=Télécharger
+downloadDesktop=Download draw.io Desktop
 downloadAs=Télécharger en tant que
 clickHereToSave=Cliquer ici pour sauvegarder
 draftDiscarded=Brouillon abandonné
@@ -694,6 +695,7 @@ updatingPreview=Mise à jour de l'aperçu. Veuillez patienter...
 updatingSelection=Mise à jour de la sélection. Veuillez patienter...
 upload=Télécharger
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Manuel d'utilisation
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=‫לחץ לחיצה כפולה לשינוי אוריינ
 doubleClickTooltip=‫לחץ לחיצה כפולה כדי לשלב טקסט‬
 doubleClickChangeProperty=‫לחץ לחיצה כפולה כדי לשנות את שם המאפיין‬
 download=‫הורד‬
+downloadDesktop=Download draw.io Desktop
 downloadAs=‫הורד בתור‬
 clickHereToSave=‫לחץ כאן כדי לשמור‬
 draftDiscarded=‫הטיוטה נמחקה‬
@@ -694,6 +695,7 @@ updatingPreview=‫מעדכן תצוגה מקדימה. אנא המתן...‬
 updatingSelection=‫מעדכן בחירה. אנא המתן...‬
 upload=‫העלה‬
 url=‫כתובת URL‬
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=‫מדריך למשתמש‬
 vertical=‫אנכי‬

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dupla klikk az irányultság változtatásához
 doubleClickTooltip=Dupla klikk szöveg hozzáadásához
 doubleClickChangeProperty=Dupla klikk a tulajdonság nevének változtatásához
 download=Letölt
+downloadDesktop=Download draw.io Desktop
 downloadAs=Letölt mint
 clickHereToSave=Kattints ide mentéshez
 draftDiscarded=Vázlat elvetve
@@ -694,6 +695,7 @@ updatingPreview=Előnézet frissitése. Kérem várjon...
 updatingSelection=Kiválasztás frissítése. Kérem várjon...
 upload=Feltöltés
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Használati utasítás
 vertical=Merőleges

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

@@ -174,6 +174,7 @@ doubleClickOrientation=doubleClickOrientation
 doubleClickTooltip=doubleClickTooltip
 doubleClickChangeProperty=doubleClickChangeProperty
 download=download
+downloadDesktop=downloadDesktop
 downloadAs=downloadAs
 clickHereToSave=clickHereToSave
 draftDiscarded=draftDiscarded
@@ -694,6 +695,7 @@ updatingPreview=updatingPreview
 updatingSelection=updatingSelection
 upload=upload
 url=url
+useOffline=useOffline
 useRootFolder=useRootFolder
 userManual=userManual
 vertical=vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Klik dua kali untuk mengubah orientasi
 doubleClickTooltip=Klik dua kali untuk menyisipkan teks
 doubleClickChangeProperty=Klik dua kali untuk mengubah nama properti
 download=Unduh
+downloadDesktop=Download draw.io Desktop
 downloadAs=Unduh sebagai
 clickHereToSave=Klik di sini untuk menyimpan.
 draftDiscarded=Draf dibuang
@@ -694,6 +695,7 @@ updatingPreview=Memutakhirkan Pratinjau. Harap tunggu
 updatingSelection=Memutakhirkan Pilihan. Harap tunggu...
 upload=Unggah
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Panduan Pengguna
 vertical=Vertikal

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doppio click per cambiare orientamento
 doubleClickTooltip=Doppio click per inserire il testo
 doubleClickChangeProperty=Doppio click per cambiare il nome della proprietà
 download=Scarica
+downloadDesktop=Download draw.io Desktop
 downloadAs=Scarica come
 clickHereToSave=Clicca qui per salvare.
 draftDiscarded=Bozza scartata
@@ -694,6 +695,7 @@ updatingPreview=Aggiornamento dell'anteprima in corso. Ti preghiamo di attendere
 updatingSelection=Aggiornamento della selezione in corso. Ti preghiamo di attendere...
 upload=Carica
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Manuale d'uso
 vertical=Verticale

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

@@ -174,6 +174,7 @@ doubleClickOrientation=ダブルクリックして向きを変更する
 doubleClickTooltip=ダブルクリックして文字を挿入する
 doubleClickChangeProperty=ダブルクリックでプロパティ名を変更してください
 download=ダウンロードする
+downloadDesktop=Download draw.io Desktop
 downloadAs=という形式でダウンロードする
 clickHereToSave=ここをクリックして保存してください
 draftDiscarded=ドラフトは廃棄されました
@@ -694,6 +695,7 @@ updatingPreview=プレビューを更新中です。しばらくお待ちくだ
 updatingSelection=選択を更新中です。しばらくお待ちください...
 upload=アップロード
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=ユーザーマニュアル
 vertical=垂直

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=더블 클릭하여 방향 변경
 doubleClickTooltip=더블 클릭하여 텍스트 삽입
 doubleClickChangeProperty=더블 클릭하여 속성명 변경
 download=다운로드
+downloadDesktop=Download draw.io Desktop
 downloadAs=다른 파일 형식으로 다운로드
 clickHereToSave=저장하시려면 여기를 클릭해 주시기 바랍니다.
 draftDiscarded=임시저장 삭제
@@ -694,6 +695,7 @@ updatingPreview=미리보기 업데이트 중. 잠시만 기다려주십시오
 updatingSelection=선택내용 업데이트중. 잠시 기다려주십시오…
 upload=업로드
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=사용자 매뉴얼
 vertical=수직

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Klik dua kali untuk mengubah orientasi
 doubleClickTooltip=Klik dua kali untuk memasukkan teks
 doubleClickChangeProperty=Klik dua kali untuk mengubah nama sifat
 download=Muat turun
+downloadDesktop=Download draw.io Desktop
 downloadAs=Muat turun sebagai
 clickHereToSave=Klik di sini untuk menyimpan.
 draftDiscarded=Draf dibuang.
@@ -694,6 +695,7 @@ updatingPreview=Mengemaskini Pratonton. Sila tunggu...
 updatingSelection=Memuat naik pilihan. Sila tunggu...
 upload=Muat naik
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Manual Pengguna
 vertical=Tegak

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dubbelklik om oriëntatie te wijzigen
 doubleClickTooltip=Dubbelklik om tekst in te voegen
 doubleClickChangeProperty=Dubbelklik om eigenschapsnaam te wijzigen
 download=Downloaden
+downloadDesktop=Download draw.io Desktop
 downloadAs=Downloaden als
 clickHereToSave=Klik hier om op te slaan.
 draftDiscarded=Concept genegeerd
@@ -694,6 +695,7 @@ updatingPreview=Voorbeeld wordt bijgewerkt. Even wachten...
 updatingSelection=Selectie wordt bijgewerkt. Even wachten...
 upload=Uploaden
 url=URL
+useOffline=Use Offline
 useRootFolder=Hoofdmap gebruiken?
 userManual=Gebruikershandleiding
 vertical=Verticaal

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dobbeltklikk for å endre retning
 doubleClickTooltip=Dobbeltklikk for å legge til tekst
 doubleClickChangeProperty=Dobbeltklikk for å endre objektnavn
 download=Last ned
+downloadDesktop=Download draw.io Desktop
 downloadAs=Last ned som
 clickHereToSave=Klikk her for å lagre.
 draftDiscarded=Utkast forkastet
@@ -694,6 +695,7 @@ updatingPreview=Oppdaterer forhåndsvisning. Vennligst vent...
 updatingSelection=Oppdaterer utvalg. Vennligst vent...
 upload=Last opp
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Brukermanual
 vertical=Vertikal

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Kliknij dwukrotnie, aby zmienić położenie
 doubleClickTooltip=Kliknij dwukrotnie, aby wstawić tekst
 doubleClickChangeProperty=Kliknij dwukrotnie, aby zmienić nazwę atrybutu
 download=Pobierz
+downloadDesktop=Download draw.io Desktop
 downloadAs=Pobierz jako
 clickHereToSave=Kliknij tutaj, aby zapisać
 draftDiscarded=Wersja robocza została odrzucona
@@ -694,6 +695,7 @@ updatingPreview=Aktualizowanie podglądu. Proszę czekać...
 updatingSelection=Aktualizowanie wyboru. Proszę czekać...
 upload=Załaduj
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Podręcznik użytkownika
 vertical=Pionowy 

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Clique duas vezes para mudar de orientação 
 doubleClickTooltip=Clique duas vezes para inserir texto
 doubleClickChangeProperty=Clique duas vezes para alterar o nome da propriedade
 download=Baixar
+downloadDesktop=Download draw.io Desktop
 downloadAs=Baixar como
 clickHereToSave=Clique aqui para salvar.
 draftDiscarded=Rascunho descartado
@@ -694,6 +695,7 @@ updatingPreview=Atualizando Visualização. Por favor, aguarde...
 updatingSelection=Atualizando seleção. Por favor, aguarde... 
 upload=Carregar
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Manual do Usuário
 vertical=Vertical 

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Carregar duas vezes para mudar de orientação 
 doubleClickTooltip=Carregar duas vezes para inserir texto
 doubleClickChangeProperty=Carregar duas vezes para alterar o nome da propriedade
 download=Descarregar
+downloadDesktop=Download draw.io Desktop
 downloadAs=Descarregar como
 clickHereToSave=Carregar aqui para salvar.
 draftDiscarded=Projeto descartado.
@@ -694,6 +695,7 @@ updatingPreview=A atualizar a antevisão. Por favor, aguarde...
 updatingSelection=A atualizar a seleção. Por favor, aguarde... 
 upload=Carregar
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Manual do Utilizador
 vertical=Vertical 

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dublu-click pentru a modifica orientarea
 doubleClickTooltip=Dublu-click pentru a insera textul
 doubleClickChangeProperty=Dublu-click pentru a redenumi proprietatea
 download=Descarcă
+downloadDesktop=Download draw.io Desktop
 downloadAs=Descarcă ca şi
 clickHereToSave=Apasă aici pentru a salva.
 draftDiscarded=Schiță inlăturată.
@@ -694,6 +695,7 @@ updatingPreview=Actualizarea previzualizarii. Vă rugăm așteptați...
 updatingSelection=Actualizarea selecției. Vă rugăm așteptați...
 upload=Încărcare
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Manualul utilizatorului
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Дважды щелкните мышью, чтобы из
 doubleClickTooltip=Дважды щелкните мышью, чтобы вставить текст
 doubleClickChangeProperty=Дважды щелкните мышью, чтобы изменить название свойства
 download=Скачать
+downloadDesktop=Download draw.io Desktop
 downloadAs=Скачать как
 clickHereToSave=Щелкните здесь, чтобы сохранить.
 draftDiscarded=Черновик удален
@@ -694,6 +695,7 @@ updatingPreview=Подготовка предпросмотра. Пожалуй
 updatingSelection=Обновление выделенной области. Пожалуйста, подождите...
 upload=Загрузить
 url=URL-адрес
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Инструкция
 vertical=Вертикально

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dupli klik za promenu orijentacije
 doubleClickTooltip=Dupli klik za unos teksta
 doubleClickChangeProperty=Dupli klik za promenu imena
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Sačuvaj kao
 clickHereToSave=Klikni ovde za snimanje
 draftDiscarded=Nacrt je odbačen
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Ažuriranje selekcije. Molimo sačekajte...
 upload=Otpremi
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Uspravno

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Dubbelklicka för att ändra riktning
 doubleClickTooltip=Dubbelklicka för att infoga text
 doubleClickChangeProperty=Dubbelklicka för att ändra egenskapsnamn
 download=Ladda ner
+downloadDesktop=Download draw.io Desktop
 downloadAs=Ladda ner som
 clickHereToSave=Klicka här för att spara.
 draftDiscarded=Utkast raderat
@@ -694,6 +695,7 @@ updatingPreview=Uppdaterar förhandsgranskning, vänligen vänta...
 updatingSelection=Uppdaterar markering, vänligen vänta…
 upload=Ladda upp
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Användare manual 
 vertical=Vertikal

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Doubleclick to change orientation
 doubleClickTooltip=Doubleclick to insert text
 doubleClickChangeProperty=Doubleclick to change property name
 download=Download
+downloadDesktop=Download draw.io Desktop
 downloadAs=Download as
 clickHereToSave=Click here to save.
 draftDiscarded=Draft discarded
@@ -694,6 +695,7 @@ updatingPreview=Updating Preview. Please wait...
 updatingSelection=Updating Selection. Please wait...
 upload=Upload
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Vertical

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

@@ -174,6 +174,7 @@ doubleClickOrientation=ดับเบิ้ลคลิ๊กเพื่อเ
 doubleClickTooltip=ดับเบิ้ลคลิ๊กกล่องข้อความช่วยเหลือ
 doubleClickChangeProperty=ดับเบิ้ลคลิกเพื่อเปลี่ยนชื่อคุณสมบัติ
 download=ดาวน์โหลด
+downloadDesktop=Download draw.io Desktop
 downloadAs=ดาวน์โหลดเป็น
 clickHereToSave=คลิกที่นี่เพื่อบันทึก
 draftDiscarded=ยกเลิกร่าง
@@ -694,6 +695,7 @@ updatingPreview=กำลังอัพเดทการแสดงตัว
 updatingSelection=กำลังอัพเดทสิ่งที่เลือก กรุณารอสักครู่...
 upload=อัพโหลด
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=คู่มือการใช้งาน
 vertical=แนวตั้ง

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Yönlendirmeyi değiştirmek için çift tıklayın
 doubleClickTooltip=Metin girmek için çift tıklayın
 doubleClickChangeProperty=Özellik ismini değiştirmek için çift tıklayınız
 download=İndir
+downloadDesktop=Download draw.io Desktop
 downloadAs=Farklı indir
 clickHereToSave=Kaydetmek için burayı tıklayınız
 draftDiscarded=Taslak yoksayıldı
@@ -694,6 +695,7 @@ updatingPreview=Önizleme güncelleniyor. Lütfen bekleyin...
 updatingSelection=Seçimi güncelliyor. Lütfen bekleyin...
 upload=Yükle
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=User Manual
 vertical=Dikey

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Клікніть двічі, щоб змінити нап
 doubleClickTooltip=Клікніть двічі, щоб вставити текст
 doubleClickChangeProperty=Клікніть двічі, щоб змінити назву властивості
 download=Скачати
+downloadDesktop=Download draw.io Desktop
 downloadAs=Скачати як
 clickHereToSave=Натисніть тут, щоб зберегти.
 draftDiscarded=Чернетку видалено
@@ -694,6 +695,7 @@ updatingPreview=Перегляд оновлюється. Будь ласка, з
 updatingSelection=Виділена область оновлюється. Будь ласка, зачекайте...
 upload=Завантажити
 url=URL-адреса
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Керівництво користувача
 vertical=Вертикальний

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

@@ -174,6 +174,7 @@ doubleClickOrientation=Nhấp đôi chuột để đổi hướng
 doubleClickTooltip=Nhấp đôi chuột để chèn văn bản
 doubleClickChangeProperty=Nhấp đôi chuột để đổi tên thuộc tính
 download=Tải xuống
+downloadDesktop=Download draw.io Desktop
 downloadAs=Tải xuống dưới dạng
 clickHereToSave=Nhấn vào đây để lưu
 draftDiscarded=Bản nháp đã bị loại bỏ
@@ -694,6 +695,7 @@ updatingPreview=Đang cập nhật xem trước. Xin đợi...
 updatingSelection=Đang cập nhật lựa chọn. Xin đợi...
 upload=Tải lên
 url=Đường dẫn
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=Hướng dẫn sử dụng
 vertical=Dọc

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

@@ -174,6 +174,7 @@ doubleClickOrientation=雙擊改變方向
 doubleClickTooltip=雙撃插入文字
 doubleClickChangeProperty=雙撃更改屬性名
 download=下載
+downloadDesktop=Download draw.io Desktop
 downloadAs=下載為
 clickHereToSave=點擊此處存檔。
 draftDiscarded=草槁已丟棄
@@ -694,6 +695,7 @@ updatingPreview=預覽更新中。請稍候...
 updatingSelection=選擇更新中。請稍候...
 upload=上傳
 url=URL
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=使用手冊
 vertical=垂直

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

@@ -174,6 +174,7 @@ doubleClickOrientation=双击以改变方向
 doubleClickTooltip=双击以插入文字
 doubleClickChangeProperty=双击以更改属性名
 download=下载
+downloadDesktop=Download draw.io Desktop
 downloadAs=下载为
 clickHereToSave=点击此处保存。
 draftDiscarded=草稿已丢弃
@@ -694,6 +695,7 @@ updatingPreview=预览更新中。请稍候...
 updatingSelection=选择更新中。请稍候...
 upload=上传
 url=URL地址
+useOffline=Use Offline
 useRootFolder=Use root folder?
 userManual=用户手册
 vertical=垂直