From 95652d4469431036532085a9a00ce322e80a13ec Mon Sep 17 00:00:00 2001
From: Joas Schilling <coding@schilljs.com>
Date: Tue, 23 Jun 2020 08:14:27 +0200
Subject: [PATCH] Fix language in share notes email for users

Signed-off-by: Joas Schilling <coding@schilljs.com>
---
 lib/private/Share20/DefaultShareProvider.php  | 59 +++++++++++--------
 lib/private/Share20/ProviderFactory.php       |  5 +-
 .../lib/Share20/DefaultShareProviderTest.php  | 41 +++++++++----
 3 files changed, 65 insertions(+), 40 deletions(-)

diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index 98ca747a894..302c3573a30 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -43,12 +43,13 @@ use OCP\Defaults;
 use OCP\Files\Folder;
 use OCP\Files\IRootFolder;
 use OCP\Files\Node;
+use OCP\IConfig;
 use OCP\IDBConnection;
 use OCP\IGroupManager;
-use OCP\IL10N;
 use OCP\IURLGenerator;
 use OCP\IUser;
 use OCP\IUserManager;
+use OCP\L10N\IFactory;
 use OCP\Mail\IMailer;
 use OCP\Share\Exceptions\ShareNotFound;
 use OCP\Share\IShare;
@@ -82,24 +83,15 @@ class DefaultShareProvider implements IShareProvider {
 	/** @var Defaults */
 	private $defaults;
 
-	/** @var IL10N */
-	private $l;
+	/** @var IFactory */
+	private $l10nFactory;
 
 	/** @var IURLGenerator */
 	private $urlGenerator;
 
-	/**
-	 * DefaultShareProvider constructor.
-	 *
-	 * @param IDBConnection $connection
-	 * @param IUserManager $userManager
-	 * @param IGroupManager $groupManager
-	 * @param IRootFolder $rootFolder
-	 * @param IMailer $mailer ;
-	 * @param Defaults $defaults
-	 * @param IL10N $l
-	 * @param IURLGenerator $urlGenerator
-	 */
+	/** @var IConfig */
+	private $config;
+
 	public function __construct(
 			IDBConnection $connection,
 			IUserManager $userManager,
@@ -107,16 +99,18 @@ class DefaultShareProvider implements IShareProvider {
 			IRootFolder $rootFolder,
 			IMailer $mailer,
 			Defaults $defaults,
-			IL10N $l,
-			IURLGenerator $urlGenerator) {
+			IFactory $l10nFactory,
+			IURLGenerator $urlGenerator,
+			IConfig $config) {
 		$this->dbConn = $connection;
 		$this->userManager = $userManager;
 		$this->groupManager = $groupManager;
 		$this->rootFolder = $rootFolder;
 		$this->mailer = $mailer;
 		$this->defaults = $defaults;
-		$this->l = $l;
+		$this->l10nFactory = $l10nFactory;
 		$this->urlGenerator = $urlGenerator;
+		$this->config = $config;
 	}
 
 	/**
@@ -1401,45 +1395,58 @@ class DefaultShareProvider implements IShareProvider {
 	 * @throws \OCP\Files\NotFoundException
 	 */
 	private function sendNote(array $recipients, IShare $share) {
-		$toList = [];
+		$toListByLanguage = [];
 
 		foreach ($recipients as $recipient) {
 			/** @var IUser $recipient */
 			$email = $recipient->getEMailAddress();
 			if ($email) {
-				$toList[$email] = $recipient->getDisplayName();
+				$language = $this->config->getSystemValue('force_language', false);
+				$language = \is_string($language) ? $language : $this->config->getUserValue($recipient->getUID(), 'core', 'lang', null);
+				$language = $language ?? $this->config->getSystemValue('default_language', 'en');
+
+				if (!isset($toListByLanguage[$language])) {
+					$toListByLanguage[$language] = [];
+				}
+				$toListByLanguage[$language][$email] = $recipient->getDisplayName();
 			}
 		}
 
-		if (!empty($toList)) {
+		if (empty($toListByLanguage)) {
+			return;
+		}
+
+		foreach ($toListByLanguage as $l10n => $toList) {
 			$filename = $share->getNode()->getName();
 			$initiator = $share->getSharedBy();
 			$note = $share->getNote();
 
+			$l = $this->l10nFactory->get('lib', $l10n);
+
 			$initiatorUser = $this->userManager->get($initiator);
 			$initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator;
 			$initiatorEmailAddress = ($initiatorUser instanceof IUser) ? $initiatorUser->getEMailAddress() : null;
-			$plainHeading = $this->l->t('%1$s shared »%2$s« with you and wants to add:', [$initiatorDisplayName, $filename]);
-			$htmlHeading = $this->l->t('%1$s shared »%2$s« with you and wants to add', [$initiatorDisplayName, $filename]);
+			$plainHeading = $l->t('%1$s shared »%2$s« with you and wants to add:', [$initiatorDisplayName, $filename]);
+			$htmlHeading = $l->t('%1$s shared »%2$s« with you and wants to add', [$initiatorDisplayName, $filename]);
 			$message = $this->mailer->createMessage();
 
 			$emailTemplate = $this->mailer->createEMailTemplate('defaultShareProvider.sendNote');
 
-			$emailTemplate->setSubject($this->l->t('»%s« added a note to a file shared with you', [$initiatorDisplayName]));
+			$emailTemplate->setSubject($l->t('»%s« added a note to a file shared with you', [$initiatorDisplayName]));
 			$emailTemplate->addHeader();
 			$emailTemplate->addHeading($htmlHeading, $plainHeading);
 			$emailTemplate->addBodyText(htmlspecialchars($note), $note);
 
 			$link = $this->urlGenerator->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $share->getNode()->getId()]);
 			$emailTemplate->addBodyButton(
-				$this->l->t('Open »%s«', [$filename]),
+				$l->t('Open »%s«', [$filename]),
 				$link
 			);
 
 
 			// The "From" contains the sharers name
 			$instanceName = $this->defaults->getName();
-			$senderName = $this->l->t(
+			$senderName = $l->t(
 				'%1$s via %2$s',
 				[
 					$initiatorDisplayName,
diff --git a/lib/private/Share20/ProviderFactory.php b/lib/private/Share20/ProviderFactory.php
index 891a5d2c31c..73a14dd4ac1 100644
--- a/lib/private/Share20/ProviderFactory.php
+++ b/lib/private/Share20/ProviderFactory.php
@@ -87,8 +87,9 @@ class ProviderFactory implements IProviderFactory {
 				$this->serverContainer->getLazyRootFolder(),
 				$this->serverContainer->getMailer(),
 				$this->serverContainer->query(Defaults::class),
-				$this->serverContainer->getL10N('sharing'),
-				$this->serverContainer->getURLGenerator()
+				$this->serverContainer->getL10NFactory(),
+				$this->serverContainer->getURLGenerator(),
+				$this->serverContainer->getConfig()
 			);
 		}
 
diff --git a/tests/lib/Share20/DefaultShareProviderTest.php b/tests/lib/Share20/DefaultShareProviderTest.php
index 6f8a96fab19..cb332ac186a 100644
--- a/tests/lib/Share20/DefaultShareProviderTest.php
+++ b/tests/lib/Share20/DefaultShareProviderTest.php
@@ -28,6 +28,7 @@ use OCP\Defaults;
 use OCP\Files\File;
 use OCP\Files\Folder;
 use OCP\Files\IRootFolder;
+use OCP\IConfig;
 use OCP\IDBConnection;
 use OCP\IGroup;
 use OCP\IGroupManager;
@@ -35,8 +36,10 @@ use OCP\IL10N;
 use OCP\IURLGenerator;
 use OCP\IUser;
 use OCP\IUserManager;
+use OCP\L10N\IFactory;
 use OCP\Mail\IMailer;
 use OCP\Share\IShare;
+use PHPUnit\Framework\MockObject\MockObject;
 
 /**
  * Class DefaultShareProviderTest
@@ -64,6 +67,9 @@ class DefaultShareProviderTest extends \Test\TestCase {
 	/** @var \PHPUnit_Framework_MockObject_MockObject|IMailer */
 	protected $mailer;
 
+	/** @var IFactory|MockObject */
+	protected $l10nFactory;
+
 	/** @var \PHPUnit_Framework_MockObject_MockObject|IL10N */
 	protected $l10n;
 
@@ -73,15 +79,20 @@ class DefaultShareProviderTest extends \Test\TestCase {
 	/** @var \PHPUnit_Framework_MockObject_MockObject|IURLGenerator */
 	protected $urlGenerator;
 
+	/** @var IConfig|MockObject */
+	protected $config;
+
 	protected function setUp(): void {
 		$this->dbConn = \OC::$server->getDatabaseConnection();
 		$this->userManager = $this->createMock(IUserManager::class);
 		$this->groupManager = $this->createMock(IGroupManager::class);
 		$this->rootFolder = $this->createMock(IRootFolder::class);
 		$this->mailer = $this->createMock(IMailer::class);
+		$this->l10nFactory = $this->createMock(IFactory::class);
 		$this->l10n = $this->createMock(IL10N::class);
 		$this->defaults = $this->getMockBuilder(Defaults::class)->disableOriginalConstructor()->getMock();
 		$this->urlGenerator = $this->createMock(IURLGenerator::class);
+		$this->config = $this->createMock(IConfig::class);
 
 		$this->userManager->expects($this->any())->method('userExists')->willReturn(true);
 
@@ -95,8 +106,9 @@ class DefaultShareProviderTest extends \Test\TestCase {
 			$this->rootFolder,
 			$this->mailer,
 			$this->defaults,
-			$this->l10n,
-			$this->urlGenerator
+			$this->l10nFactory,
+			$this->urlGenerator,
+			$this->config
 		);
 	}
 
@@ -454,8 +466,9 @@ class DefaultShareProviderTest extends \Test\TestCase {
 				$this->rootFolder,
 				$this->mailer,
 				$this->defaults,
-				$this->l10n,
-				$this->urlGenerator
+				$this->l10nFactory,
+				$this->urlGenerator,
+				$this->config
 			])
 			->setMethods(['getShareById'])
 			->getMock();
@@ -548,8 +561,9 @@ class DefaultShareProviderTest extends \Test\TestCase {
 				$this->rootFolder,
 				$this->mailer,
 				$this->defaults,
-				$this->l10n,
-				$this->urlGenerator
+				$this->l10nFactory,
+				$this->urlGenerator,
+				$this->config
 			])
 			->setMethods(['getShareById'])
 			->getMock();
@@ -2474,8 +2488,9 @@ class DefaultShareProviderTest extends \Test\TestCase {
 			$rootFolder,
 			$this->mailer,
 			$this->defaults,
-			$this->l10n,
-			$this->urlGenerator
+			$this->l10nFactory,
+			$this->urlGenerator,
+			$this->config
 		);
 
 		$password = md5(time());
@@ -2571,8 +2586,9 @@ class DefaultShareProviderTest extends \Test\TestCase {
 			$rootFolder,
 			$this->mailer,
 			$this->defaults,
-			$this->l10n,
-			$this->urlGenerator
+			$this->l10nFactory,
+			$this->urlGenerator,
+			$this->config
 		);
 
 		$u1 = $userManager->createUser('testShare1', 'test');
@@ -2666,8 +2682,9 @@ class DefaultShareProviderTest extends \Test\TestCase {
 			$rootFolder,
 			$this->mailer,
 			$this->defaults,
-			$this->l10n,
-			$this->urlGenerator
+			$this->l10nFactory,
+			$this->urlGenerator,
+			$this->config
 		);
 
 		$u1 = $userManager->createUser('testShare1', 'test');
-- 
GitLab