From 4db29565def8cffcb5f0aec2f41f8f82d8f0bf1d Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <hypolite@mrpetovan.com>
Date: Sun, 9 Apr 2023 08:15:20 -0400
Subject: [PATCH] [frio] Add Dropzone dictionary strings to l10n

---
 src/App/Page.php                         | 36 +++++++++++++-----
 view/js/dropzone-factory.js              | 17 ++++++++-
 view/templates/head.tpl                  |  5 +++
 view/theme/frio/templates/head.tpl       |  6 ++-
 view/theme/frio/templates/js_strings.tpl | 48 ++++++++++++++----------
 5 files changed, 81 insertions(+), 31 deletions(-)

diff --git a/src/App/Page.php b/src/App/Page.php
index 6849656f40..28fc26a702 100644
--- a/src/App/Page.php
+++ b/src/App/Page.php
@@ -243,22 +243,40 @@ class Page implements ArrayAccess
 		 * being first
 		 */
 		$this->page['htmlhead'] = Renderer::replaceMacros($tpl, [
+			'$l10n' => [
+				'delitem'      => $l10n->t('Delete this item?'),
+				'blockAuthor'  => $l10n->t('Block this author? They won\'t be able to follow you nor see your public posts, and you won\'t be able to see their posts and their notifications.'),
+				'ignoreAuthor' => $l10n->t('Ignore this author? You won\'t be able to see their posts and their notifications.'),
+
+				'likeError'     => $l10n->t('Like not successful'),
+				'dislikeError'  => $l10n->t('Dislike not successful'),
+				'announceError' => $l10n->t('Sharing not successful'),
+				'attendError'   => $l10n->t('Attendance unsuccessful'),
+				'srvError'      => $l10n->t('Backend error'),
+				'netError'      => $l10n->t('Network error'),
+
+				// Dropzone
+				'dictDefaultMessage'           => $l10n->t('Drop files here to upload'),
+				'dictFallbackMessage'          => $l10n->t("Your browser does not support drag and drop file uploads."),
+				'dictFallbackText'             => $l10n->t('Please use the fallback form below to upload your files like in the olden days.'),
+				'dictFileTooBig'               => $l10n->t('File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.'),
+				'dictInvalidFileType'          => $l10n->t("You can't upload files of this type."),
+				'dictResponseError'            => $l10n->t('Server responded with {{statusCode}} code.'),
+				'dictCancelUpload'             => $l10n->t('Cancel upload'),
+				'dictUploadCanceled'           => $l10n->t('Upload canceled.'),
+				'dictCancelUploadConfirmation' => $l10n->t('Are you sure you want to cancel this upload?'),
+				'dictRemoveFile'               => $l10n->t('Remove file'),
+				'dictMaxFilesExceeded'         => $l10n->t("You can't upload any more files."),
+			],
+
 			'$local_user'      => $localUID,
 			'$generator'       => 'Friendica' . ' ' . App::VERSION,
-			'$delitem'         => $l10n->t('Delete this item?'),
-			'$blockAuthor'     => $l10n->t('Block this author? They won\'t be able to follow you nor see your public posts, and you won\'t be able to see their posts and their notifications.'),
-			'$ignoreAuthor'    => $l10n->t('Ignore this author? You won\'t be able to see their posts and their notifications.'),
 			'$update_interval' => $interval,
 			'$shortcut_icon'   => $shortcut_icon,
 			'$touch_icon'      => $touch_icon,
 			'$block_public'    => intval($config->get('system', 'block_public')),
 			'$stylesheets'     => $this->stylesheets,
-			'$likeError'       => $l10n->t('Like not successful'),
-			'$dislikeError'    => $l10n->t('Dislike not successful'),
-			'$announceError'   => $l10n->t('Sharing not successful'),
-			'$attendError'     => $l10n->t('Attendance unsuccessful'),
-			'$srvError'        => $l10n->t('Backend error'),
-			'$netError'        => $l10n->t('Network error'),
+
 			// Dropzone
 			'$max_imagesize' => round(\Friendica\Util\Strings::getBytesFromShorthand($config->get('system', 'maximagesize')) / 1000000, 1),
 
diff --git a/view/js/dropzone-factory.js b/view/js/dropzone-factory.js
index ca77bb6d50..4f14551be8 100644
--- a/view/js/dropzone-factory.js
+++ b/view/js/dropzone-factory.js
@@ -1,4 +1,5 @@
-var DzFactory = function () {
+Dropzone.autoDiscover = false;
+var DzFactory = function (max_imagesize) {
 	this.createDropzone = function(dropSelector, textareaElementId) {
 		return new Dropzone(dropSelector, {
 			paramName: 'userfile', // The name that will be used to transfer the file
@@ -6,6 +7,17 @@ var DzFactory = function () {
 			url: '/media/photo/upload?album=',
 			acceptedFiles: 'image/*',
 			clickable: true,
+			dictDefaultMessage: dzStrings.dictDefaultMessage,
+			dictFallbackMessage: dzStrings.dictFallbackMessage,
+			dictFallbackText: dzStrings.dictFallbackText,
+			dictFileTooBig: dzStrings.dictFileTooBig,
+			dictInvalidFileType: dzStrings.dictInvalidFileType,
+			dictResponseError: dzStrings.dictResponseError,
+			dictCancelUpload: dzStrings.dictCancelUpload,
+			dictUploadCanceled: dzStrings.dictUploadCanceled,
+			dictCancelUploadConfirmation: dzStrings.dictCancelUploadConfirmation,
+			dictRemoveFile: dzStrings.dictRemoveFile,
+			dictMaxFilesExceeded: dzStrings.dictMaxFilesExceeded,
 			accept: function(file, done) {
 				done();
 			},
@@ -54,9 +66,10 @@ var DzFactory = function () {
 	};
 
 	this.setupDropzone = function(dropSelector, textareaElementId) {
+		const self = this;
 		var dropzone = this.createDropzone(dropSelector, textareaElementId);
 		$(dropSelector).on('paste', function(event) {
-			dzFactory.copyPaste(event, dropzone);
+			self.copyPaste(event, dropzone);
 		})
 	};
 }
diff --git a/view/templates/head.tpl b/view/templates/head.tpl
index 2ef1bfe08f..f37fd824e4 100644
--- a/view/templates/head.tpl
+++ b/view/templates/head.tpl
@@ -44,7 +44,12 @@
 <script type="text/javascript" src="view/asset/imagesloaded/imagesloaded.pkgd.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
 <script type="text/javascript" src="view/asset/base64/base64.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
 <script type="text/javascript" src="view/asset/dompurify/dist/purify.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
+<script type="text/javascript">
+	const updateInterval = {{$update_interval}};
+	const localUser = {{if $local_user}}{{$local_user}}{{else}}false{{/if}};
+</script>
 <script type="text/javascript" src="view/js/main.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
+
 <script>
 
 	// Lifted from https://css-tricks.com/snippets/jquery/move-cursor-to-end-of-textarea-or-input/
diff --git a/view/theme/frio/templates/head.tpl b/view/theme/frio/templates/head.tpl
index 7c5ae59463..36b6deb07b 100644
--- a/view/theme/frio/templates/head.tpl
+++ b/view/theme/frio/templates/head.tpl
@@ -103,6 +103,10 @@
 	<script type="text/javascript" src="view/asset/base64/base64.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
 	<script type="text/javascript" src="view/asset/dompurify/dist/purify.min.js?v={{$smarty.const.FRIENDICA_VERSION}}">
 	</script>
+	<script type="text/javascript">
+		const updateInterval = {{$update_interval}};
+		const localUser = {{if $local_user}}{{$local_user}}{{else}}false{{/if}};
+	</script>
 	<script type="text/javascript" src="view/js/main.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
 
 	<script type="text/javascript"
@@ -139,7 +143,7 @@
 	<script type="text/javascript" src="view/theme/frio/js/textedit.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
 	<script type="text/javascript" src="vendor/enyo/dropzone/dist/min/dropzone.min.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
 	<script type="text/javascript" src="view/js/dropzone-factory.js?v={{$smarty.const.FRIENDICA_VERSION}}"></script>
-	<script type="text/javascript"> max_imagesize = {{$max_imagesize}}; var dzFactory = new DzFactory(); Dropzone.autoDiscover = false; </script>
+	<script type="text/javascript"> const dzFactory = new DzFactory({{$max_imagesize}});</script>
 
 	{{* Include the strings which are needed for some js functions (e.g. translation)
 They are loaded into the html <head> so that js functions can use them *}}
diff --git a/view/theme/frio/templates/js_strings.tpl b/view/theme/frio/templates/js_strings.tpl
index bf418a4be2..0eb39d8eab 100644
--- a/view/theme/frio/templates/js_strings.tpl
+++ b/view/theme/frio/templates/js_strings.tpl
@@ -2,24 +2,34 @@
 {{* Strings which are needed for some js functions (e.g. translation or the interval for page update)
 They are loaded into the html <head> so that js functions can use them *}}
 <script type="text/javascript">
-	var updateInterval = {{$update_interval}};
-
-	var localUser = {{if $local_user}}{{$local_user}}{{else}}false{{/if}};
-	var aStr = {
-		'delitem'      : "{{$delitem|escape:'javascript' nofilter}}",
-		'blockAuthor'  : "{{$blockAuthor|escape:'javascript' nofilter}}",
-		'ignoreAuthor' : "{{$ignoreAuthor|escape:'javascript' nofilter}}",
+	const aStr = {
+		delitem      : "{{$l10n.delitem|escape:'javascript' nofilter}}",
+		blockAuthor  : "{{$l10n.blockAuthor|escape:'javascript' nofilter}}",
+		ignoreAuthor : "{{$l10n.ignoreAuthor|escape:'javascript' nofilter}}",
+	};
+	const aActErr = {
+		like       : "{{$l10n.likeError|escape:'javascript' nofilter}}",
+		dislike    : "{{$l10n.dislikeError|escape:'javascript' nofilter}}",
+		announce   : "{{$l10n.announceError|escape:'javascript' nofilter}}",
+		attendyes  : "{{$l10n.attendError|escape:'javascript' nofilter}}",
+		attendno   : "{{$l10n.attendError|escape:'javascript' nofilter}}",
+		attendmaybe: "{{$l10n.attendError|escape:'javascript' nofilter}}",
+	};
+	const aErrType = {
+		srvErr: "{{$l10n.srvError|escape:'javascript' nofilter}}",
+		netErr: "{{$l10n.netError|escape:'javascript' nofilter}}",
+	};
+	const dzStrings = {
+		dictDefaultMessage          : "{{$l10n.dictDefaultMessage|escape:'javascript' nofilter}}",
+		dictFallbackMessage         : "{{$l10n.dictFallbackMessage|escape:'javascript' nofilter}}",
+		dictFallbackText            : "{{$l10n.dictFallbackText|escape:'javascript' nofilter}}",
+		dictFileTooBig              : "{{$l10n.dictFileTooBig|escape:'javascript' nofilter}}",
+		dictInvalidFileType         : "{{$l10n.dictInvalidFileType|escape:'javascript' nofilter}}",
+		dictResponseError           : "{{$l10n.dictResponseError|escape:'javascript' nofilter}}",
+		dictCancelUpload            : "{{$l10n.dictCancelUpload|escape:'javascript' nofilter}}",
+		dictUploadCanceled          : "{{$l10n.dictUploadCanceled|escape:'javascript' nofilter}}",
+		dictCancelUploadConfirmation: "{{$l10n.dictCancelUploadConfirmation|escape:'javascript' nofilter}}",
+		dictRemoveFile              : "{{$l10n.dictRemoveFile|escape:'javascript' nofilter}}",
+		dictMaxFilesExceeded        : "{{$l10n.dictMaxFilesExceeded|escape:'javascript' nofilter}}",
 	};
-        var aActErr = {
-               'like'          : "{{$likeError}}",
-               'dislike'       : "{{$dislikeError}}",
-               'announce'      : "{{$announceError}}",
-               'attendyes'     : "{{$attendError}}",
-               'attendno'      : "{{$attendError}}",
-               'attendmaybe'   : "{{$attendError}}",
-        };
-        var aErrType = {
-               'srvErr'        : "{{$srvError}}",
-               'netErr'        : "{{$netError}}",
-        };
 </script>
-- 
2.39.5