From: Christopher Ng Date: Fri, 4 Feb 2022 19:02:32 +0000 (+0000) Subject: Make Sabre File exception messages translatable X-Git-Tag: v24.0.0beta1~140^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fpull%2F30536%2Fhead;p=nextcloud-server.git Make Sabre File exception messages translatable Signed-off-by: Christopher Ng --- diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php index 28817b93b76..3a13dba5df6 100644 --- a/apps/dav/lib/Connector/Sabre/File.php +++ b/apps/dav/lib/Connector/Sabre/File.php @@ -43,6 +43,7 @@ use OC\AppFramework\Http\Request; use OC\Files\Filesystem; use OC\Files\Stream\HashWrapper; use OC\Files\View; +use OCA\DAV\AppInfo\Application; use OCA\DAV\Connector\Sabre\Exception\EntityTooLarge; use OCA\DAV\Connector\Sabre\Exception\FileLocked; use OCA\DAV\Connector\Sabre\Exception\Forbidden as DAVForbiddenException; @@ -60,7 +61,9 @@ use OCP\Files\NotFoundException; use OCP\Files\NotPermittedException; use OCP\Files\Storage; use OCP\Files\StorageNotAvailableException; +use OCP\IL10N; use OCP\ILogger; +use OCP\L10N\IFactory as IL10NFactory; use OCP\Lock\ILockingProvider; use OCP\Lock\LockedException; use OCP\Share\IManager; @@ -75,6 +78,8 @@ use Sabre\DAV\IFile; class File extends Node implements IFile { protected $request; + protected IL10N $l10n; + /** * Sets up the node, expects a full path name * @@ -86,6 +91,11 @@ class File extends Node implements IFile { public function __construct(View $view, FileInfo $info, IManager $shareManager = null, Request $request = null) { parent::__construct($view, $info, $shareManager); + // Querying IL10N directly results in a dependency loop + /** @var IL10NFactory $l10nFactory */ + $l10nFactory = \OC::$server->get(IL10NFactory::class); + $this->l10n = $l10nFactory->get(Application::APP_ID); + if (isset($request)) { $this->request = $request; } else { @@ -128,7 +138,7 @@ class File extends Node implements IFile { throw new Forbidden(); } } catch (StorageNotAvailableException $e) { - throw new ServiceUnavailable("File is not updatable: " . $e->getMessage()); + throw new ServiceUnavailable($this->l10n->t('File is not updatable: %1$s', [$e->getMessage()])); } // verify path of the target @@ -162,7 +172,7 @@ class File extends Node implements IFile { $partFilePath = $this->path; if ($view && !$this->emitPreHooks($exists)) { - throw new Exception('Could not write to final file, canceled by hook'); + throw new Exception($this->l10n->t('Could not write to final file, canceled by hook')); } } @@ -223,7 +233,7 @@ class File extends Node implements IFile { if ($target === false) { \OC::$server->getLogger()->error('\OC\Files\Filesystem::fopen() failed', ['app' => 'webdav']); // because we have no clue about the cause we can only throw back a 500/Internal Server Error - throw new Exception('Could not write file contents'); + throw new Exception($this->l10n->t('Could not write file contents')); } [$count, $result] = \OC_Helper::streamCopy($data, $target); fclose($target); @@ -235,7 +245,15 @@ class File extends Node implements IFile { $expected = $_SERVER['CONTENT_LENGTH']; } if ($expected !== "0") { - throw new Exception('Error while copying file to target location (copied bytes: ' . $count . ', expected filesize: ' . $expected . ' )'); + throw new Exception( + $this->l10n->t( + 'Error while copying file to target location (copied: %1$s, expected filesize: %2$s)', + [ + $this->l10n->n('%n byte', '%n bytes', $count), + $this->l10n->n('%n byte', '%n bytes', $expected), + ], + ) + ); } } @@ -245,7 +263,15 @@ class File extends Node implements IFile { if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['REQUEST_METHOD'] === 'PUT') { $expected = (int)$_SERVER['CONTENT_LENGTH']; if ($count !== $expected) { - throw new BadRequest('Expected filesize of ' . $expected . ' bytes but read (from Nextcloud client) and wrote (to Nextcloud storage) ' . $count . ' bytes. Could either be a network problem on the sending side or a problem writing to the storage on the server side.'); + throw new BadRequest( + $this->l10n->t( + 'Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side.', + [ + $this->l10n->n('%n byte', '%n bytes', $expected), + $this->l10n->n('%n byte', '%n bytes', $count), + ], + ) + ); } } } catch (\Exception $e) { @@ -266,7 +292,7 @@ class File extends Node implements IFile { if ($needsPartFile) { if ($view && !$this->emitPreHooks($exists)) { $partStorage->unlink($internalPartPath); - throw new Exception('Could not rename part file to final file, canceled by hook'); + throw new Exception($this->l10n->t('Could not rename part file to final file, canceled by hook')); } try { $this->changeLock(ILockingProvider::LOCK_EXCLUSIVE); @@ -295,7 +321,7 @@ class File extends Node implements IFile { $fileExists = $storage->file_exists($internalPath); if ($renameOkay === false || $fileExists === false) { \OC::$server->getLogger()->error('renaming part file to final file failed $renameOkay: ' . ($renameOkay ? 'true' : 'false') . ', $fileExists: ' . ($fileExists ? 'true' : 'false') . ')', ['app' => 'webdav']); - throw new Exception('Could not rename part file to final file'); + throw new Exception($this->l10n->t('Could not rename part file to final file')); } } catch (ForbiddenException $ex) { if (!$ex->getRetry()) { @@ -353,7 +379,7 @@ class File extends Node implements IFile { $this->refreshInfo(); } } catch (StorageNotAvailableException $e) { - throw new ServiceUnavailable("Failed to check file size: " . $e->getMessage(), 0, $e); + throw new ServiceUnavailable($this->l10n->t('Failed to check file size: %1$s', [$e->getMessage()]), 0, $e); } return '"' . $this->info->getEtag() . '"'; @@ -438,14 +464,14 @@ class File extends Node implements IFile { $this->convertToSabreException($e); } if ($res === false) { - throw new ServiceUnavailable("Could not open file"); + throw new ServiceUnavailable($this->l10n->t('Could not open file')); } return $res; } catch (GenericEncryptionException $e) { // returning 503 will allow retry of the operation at a later point in time - throw new ServiceUnavailable("Encryption not ready: " . $e->getMessage()); + throw new ServiceUnavailable($this->l10n->t('Encryption not ready: %1$s', [$e->getMessage()])); } catch (StorageNotAvailableException $e) { - throw new ServiceUnavailable("Failed to open file: " . $e->getMessage()); + throw new ServiceUnavailable($this->l10n->t('Failed to open file: %1$s', [$e->getMessage()])); } catch (ForbiddenException $ex) { throw new DAVForbiddenException($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { @@ -470,7 +496,7 @@ class File extends Node implements IFile { throw new Forbidden(); } } catch (StorageNotAvailableException $e) { - throw new ServiceUnavailable("Failed to unlink: " . $e->getMessage()); + throw new ServiceUnavailable($this->l10n->t('Failed to unlink: %1$s', [$e->getMessage()])); } catch (ForbiddenException $ex) { throw new DAVForbiddenException($ex->getMessage(), $ex->getRetry()); } catch (LockedException $e) { @@ -524,7 +550,7 @@ class File extends Node implements IFile { $info = \OC_FileChunking::decodeName($name); if (empty($info)) { - throw new NotImplemented('Invalid chunk name'); + throw new NotImplemented($this->l10n->t('Invalid chunk name')); } $chunk_handler = new \OC_FileChunking($info); @@ -536,7 +562,15 @@ class File extends Node implements IFile { $expected = (int)$_SERVER['CONTENT_LENGTH']; if ($bytesWritten !== $expected) { $chunk_handler->remove($info['index']); - throw new BadRequest('Expected filesize of ' . $expected . ' bytes but read (from Nextcloud client) and wrote (to Nextcloud storage) ' . $bytesWritten . ' bytes. Could either be a network problem on the sending side or a problem writing to the storage on the server side.'); + throw new BadRequest( + $this->l10n->t( + 'Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side.', + [ + $this->l10n->n('%n byte', '%n bytes', $expected), + $this->l10n->n('%n byte', '%n bytes', $bytesWritten), + ], + ) + ); } } } @@ -583,7 +617,7 @@ class File extends Node implements IFile { $targetStorage->unlink($targetInternalPath); } $this->fileView->changeLock($targetPath, ILockingProvider::LOCK_SHARED); - throw new Exception('Could not rename part file assembled from chunks'); + throw new Exception($this->l10n->t('Could not rename part file assembled from chunks')); } } else { // assemble directly into the final file @@ -667,13 +701,13 @@ class File extends Node implements IFile { } if ($e instanceof GenericEncryptionException) { // returning 503 will allow retry of the operation at a later point in time - throw new ServiceUnavailable('Encryption not ready: ' . $e->getMessage(), 0, $e); + throw new ServiceUnavailable($this->l10n->t('Encryption not ready: %1$s', [$e->getMessage()]), 0, $e); } if ($e instanceof StorageNotAvailableException) { - throw new ServiceUnavailable('Failed to write file contents: ' . $e->getMessage(), 0, $e); + throw new ServiceUnavailable($this->l10n->t('Failed to write file contents: %1$s', [$e->getMessage()]), 0, $e); } if ($e instanceof NotFoundException) { - throw new NotFound('File not found: ' . $e->getMessage(), 0, $e); + throw new NotFound($this->l10n->t('File not found: %1$s', [$e->getMessage()]), 0, $e); } throw new \Sabre\DAV\Exception($e->getMessage(), 0, $e);