]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat(translation): Return the detected language so clients can show more details 38003/head
authorJoas Schilling <coding@schilljs.com>
Mon, 1 May 2023 13:14:18 +0000 (15:14 +0200)
committerJoas Schilling <coding@schilljs.com>
Tue, 2 May 2023 14:38:33 +0000 (16:38 +0200)
Signed-off-by: Joas Schilling <coding@schilljs.com>
core/Controller/TranslationApiController.php
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/Translation/TranslationManager.php
lib/public/Translation/CouldNotTranslateException.php [new file with mode: 0644]
lib/public/Translation/ITranslationManager.php

index a09f7e6aba96f68e50fbe724d5cf35071027d4de..2d47d99e654b16cf9b5415cba9a7e60219b2cc9b 100644 (file)
@@ -32,8 +32,8 @@ use OCP\AppFramework\Http\DataResponse;
 use OCP\IL10N;
 use OCP\IRequest;
 use OCP\PreConditionNotMetException;
+use OCP\Translation\CouldNotTranslateException;
 use OCP\Translation\ITranslationManager;
-use RuntimeException;
 
 class TranslationApiController extends \OCP\AppFramework\OCSController {
        private ITranslationManager $translationManager;
@@ -68,15 +68,19 @@ class TranslationApiController extends \OCP\AppFramework\OCSController {
         */
        public function translate(string $text, ?string $fromLanguage, string $toLanguage): DataResponse {
                try {
+                       $translation = $this->translationManager->translate($text, $fromLanguage, $toLanguage);
+
                        return new DataResponse([
-                               'text' => $this->translationManager->translate($text, $fromLanguage, $toLanguage)
+                               'text' => $translation,
+                               'from' => $fromLanguage,
+
                        ]);
                } catch (PreConditionNotMetException) {
                        return new DataResponse(['message' => $this->l->t('No translation provider available')], Http::STATUS_PRECONDITION_FAILED);
                } catch (InvalidArgumentException) {
                        return new DataResponse(['message' => $this->l->t('Could not detect language')], Http::STATUS_BAD_REQUEST);
-               } catch (RuntimeException) {
-                       return new DataResponse(['message' => $this->l->t('Unable to translate')], Http::STATUS_BAD_REQUEST);
+               } catch (CouldNotTranslateException $e) {
+                       return new DataResponse(['message' => $this->l->t('Unable to translate'), 'from' => $e->getFrom()], Http::STATUS_BAD_REQUEST);
                }
        }
 }
index 90164534da1a64b9a512b820484a834e2bf1b574..0ef53c1342a40300737181d61b091ed53ef6a5d0 100644 (file)
@@ -614,6 +614,7 @@ return array(
     'OCP\\Talk\\IConversationOptions' => $baseDir . '/lib/public/Talk/IConversationOptions.php',
     'OCP\\Talk\\ITalkBackend' => $baseDir . '/lib/public/Talk/ITalkBackend.php',
     'OCP\\Template' => $baseDir . '/lib/public/Template.php',
+    'OCP\\Translation\\CouldNotTranslateException' => $baseDir . '/lib/public/Translation/CouldNotTranslateException.php',
     'OCP\\Translation\\IDetectLanguageProvider' => $baseDir . '/lib/public/Translation/IDetectLanguageProvider.php',
     'OCP\\Translation\\ITranslationManager' => $baseDir . '/lib/public/Translation/ITranslationManager.php',
     'OCP\\Translation\\ITranslationProvider' => $baseDir . '/lib/public/Translation/ITranslationProvider.php',
index 43cdde517342df9cf3b6b1a83d1cc3e15a70f934..f15557329360723ba50f8c9fcb0c2f94675dc7c7 100644 (file)
@@ -647,6 +647,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
         'OCP\\Talk\\IConversationOptions' => __DIR__ . '/../../..' . '/lib/public/Talk/IConversationOptions.php',
         'OCP\\Talk\\ITalkBackend' => __DIR__ . '/../../..' . '/lib/public/Talk/ITalkBackend.php',
         'OCP\\Template' => __DIR__ . '/../../..' . '/lib/public/Template.php',
+        'OCP\\Translation\\CouldNotTranslateException' => __DIR__ . '/../../..' . '/lib/public/Translation/CouldNotTranslateException.php',
         'OCP\\Translation\\IDetectLanguageProvider' => __DIR__ . '/../../..' . '/lib/public/Translation/IDetectLanguageProvider.php',
         'OCP\\Translation\\ITranslationManager' => __DIR__ . '/../../..' . '/lib/public/Translation/ITranslationManager.php',
         'OCP\\Translation\\ITranslationProvider' => __DIR__ . '/../../..' . '/lib/public/Translation/ITranslationProvider.php',
index 3fded754f6a0704bb61a2ad0860a490fe364f31f..2a2b2cd0066b8f72b79e7cccdf828296e103e9ff 100644 (file)
@@ -30,6 +30,7 @@ use InvalidArgumentException;
 use OC\AppFramework\Bootstrap\Coordinator;
 use OCP\IServerContainer;
 use OCP\PreConditionNotMetException;
+use OCP\Translation\CouldNotTranslateException;
 use OCP\Translation\IDetectLanguageProvider;
 use OCP\Translation\ITranslationManager;
 use OCP\Translation\ITranslationProvider;
@@ -58,7 +59,7 @@ class TranslationManager implements ITranslationManager {
                return $languages;
        }
 
-       public function translate(string $text, ?string $fromLanguage, string $toLanguage): string {
+       public function translate(string $text, ?string &$fromLanguage, string $toLanguage): string {
                if (!$this->hasProviders()) {
                        throw new PreConditionNotMetException('No translation providers available');
                }
@@ -87,7 +88,7 @@ class TranslationManager implements ITranslationManager {
                        }
                }
 
-               throw new RuntimeException('Could not translate text');
+               throw new CouldNotTranslateException($fromLanguage);
        }
 
        public function getProviders(): array {
diff --git a/lib/public/Translation/CouldNotTranslateException.php b/lib/public/Translation/CouldNotTranslateException.php
new file mode 100644 (file)
index 0000000..bf7f5b4
--- /dev/null
@@ -0,0 +1,47 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+namespace OCP\Translation;
+
+/**
+ * @since 27.0.0
+ */
+class CouldNotTranslateException extends \RuntimeException {
+       /**
+        * @since 27.0.0
+        */
+       public function __construct(
+               protected ?string $from,
+       ) {
+               parent::__construct();
+       }
+
+       /**
+        * @since 27.0.0
+        */
+       public function getFrom(): ?string {
+               return $this->from;
+       }
+}
index c6b67462152b572cde9345a1c68c20bd6ee11a76..4450f19c42419260b299951152449883e999431e 100644 (file)
@@ -28,7 +28,6 @@ namespace OCP\Translation;
 
 use InvalidArgumentException;
 use OCP\PreConditionNotMetException;
-use RuntimeException;
 
 /**
  * @since 26.0.0
@@ -54,7 +53,7 @@ interface ITranslationManager {
         * @since 26.0.0
         * @throws PreConditionNotMetException If no provider was registered but this method was still called
         * @throws InvalidArgumentException If no matching provider was found that can detect a language
-        * @throws RuntimeException If the translation failed for other reasons
+        * @throws CouldNotTranslateException If the translation failed for other reasons
         */
-       public function translate(string $text, ?string $fromLanguage, string $toLanguage): string;
+       public function translate(string $text, ?string &$fromLanguage, string $toLanguage): string;
 }