Traducción automática¶
Resumen¶
Esta página explica la API de Traducción, obsoleta desde la versión 30 en favor de la API de TaskProcessing: cómo consumirla mediante ITranslationManager, cómo implementar un proveedor de Traducción, con contexto de usuario y con detección de idioma, y cómo registrarlo. Está dirigida a quienes desarrollan apps.
Fuente: documentación de Nextcloud, «developer_manual/digging_deeper/machinetranslation», versión 3ad9158, licencia CC BY 3.0; traducida y adaptada para APS Conecta Gestión.
Nuevo en la versión 26.
Obsoleto desde la versión 30: Usar en su lugar la API de TaskProcessing
APS Conecta Gestión ofrece una API de Traducción. La idea general es que existe una API central de OCP que las apps pueden usar para solicitar traducciones automáticas de texto. Para no depender de ninguna tecnología, cualquier app puede proporcionar esta funcionalidad de Traducción registrando un proveedor de Traducción.
Consumir la API de Traducción¶
Para consumir la API de Traducción, hay que inyectar \OCP\Translation\ITranslationManager. Este gestor ofrece los siguientes métodos:
hasProviders()Este método devuelve un booleano que indica si se ha registrado algún proveedor. Si es false, no se puede usar la función de Traducción.getLanguages()Este método devuelve una lista de objetosOCP\Translation\LanguageTupleque indican qué pares de idiomas se admiten actualmente para traducir.translate(string $text, ?string $fromLanguage, string $toLanguage)Este método proporciona la funcionalidad de traducción propiamente dicha. Tener en cuenta que, según la longitud del texto que se quiera traducir, esto puede tardar más que el tiempo de espera de la petición HTTP o que el límite de tiempo de ejecución de PHP.canDetectLanguage()Este método devuelve un booleano que indica si es posible la detección automática del idioma. Si es true, se puede pasarnullcomo parámetro$fromLanguageatranslatey averiguará automáticamente el idioma de origen.
Si se quiere usar la funcionalidad de traducción en un cliente, también hay endpoints de OCS disponibles para ello: API de traducción de OCS
Implementar un proveedor de Traducción¶
Un proveedor de Traducción es una clase que implementa la interfaz OCP\Translation\ITranslationProvider.
<?php
declare(strict_types=1);
namespace OCA\MyApp\Translation;
use OCA\MyApp\AppInfo\Application;
use OCP\Files\File;
use OCP\Translation\ITranslationProvider;
use OCP\IL10N;
class Provider implements ITranslationProvider {
public function __construct(
private IL10N $l,
) {
}
public function getName(): string {
return $this->l->t('My awesome translation provider');
}
public function getAvailableLanguages(): array {
// Return an array of OCP\Translation\LanguageTuple objects here
}
public function translate(?string $fromLanguage, string $toLanguage, string $text): string {
// Do some fancy machine translation and return translated string
}
}
El método getName devuelve una cadena que identifica al proveedor registrado en la interfaz de usuario.
El método translate traduce la cadena recibida y devuelve la traducción. Los dos parámetros de idioma serán códigos de idioma devueltos por getAvailableLanguages del proveedor. Si la traducción falla, se debe lanzar una RuntimeException con un mensaje de error explicativo.
La clase normalmente se guardaría en un archivo en lib/Translation de la app, pero se puede colocar en otro lugar siempre que el contenedor de inyección de dependencias de APS Conecta Gestión pueda cargarla.
Proveedor con contexto de usuario¶
Nuevo en la versión 29.0.0.
A veces el procesamiento de la tarea puede depender de qué usuario la solicitó.
Ahora se puede obtener esta información en el proveedor implementando además la interfaz OCP\Translation\ITranslationProviderWithUserId:
<?php
declare(strict_types=1);
namespace OCA\MyApp\Translation;
use OCA\MyApp\AppInfo\Application;
use OCP\Files\File;
use OCP\Translation\ITranslationProviderWithUserId;
use OCP\IL10N;
class Provider implements ITranslationProviderWithUserId {
private ?string $userId = null;
public function __construct(
private IL10N $l,
) {
}
public function getName(): string {
return $this->l->t('My awesome translation provider');
}
public function getAvailableLanguages(): array {
// Return an array of OCP\Translation\LanguageTuple objects here
}
public function setUserId(?string $userId): void {
$this->userId = $userId;
}
public function translate(?string $fromLanguage, string $toLanguage, string $text): string {
// Do some fancy machine translation and return translated string
}
}
Proporcionar detección de idioma¶
También existe una interfaz IDetectLanguageProvider que permite indicar que el proveedor puede detectar automáticamente los idiomas a partir de un texto de entrada. Se puede usar de la siguiente manera:
<?php
declare(strict_types=1);
namespace OCA\MyApp\Translation;
use OCA\MyApp\AppInfo\Application;
use OCP\Files\File;
use OCP\Translation\ITranslationProvider;
use OCP\Translation\IDetectLanguageProvider;
use OCP\IL10N;
class Provider implements ITranslationProvider, IDetectLanguageProvider {
public function __construct(
private IL10N $l,
) {
}
public function getName(): string {
return $this->l->t('My awesome translation provider');
}
public function getAvailableLanguages(): array {
// Return an array of OCP\Translation\LanguageTuple objects here
}
public function translate(?string $fromLanguage, string $toLanguage, string $text): string {
// Do some fancy machine translation and return translated string
}
public function detectLanguage(string $text): ?string {
// Detect the language of $text
}
}
El método detectLanguage recibe un texto en algún idioma y devuelve el código de ese idioma, o null si la detección no tuvo éxito. El código de idioma que devuelve este método debería ser uno de los idiomas devueltos en getAvailableLanguages.
Registro del proveedor¶
La clase del proveedor se registra mediante el mecanismo de arranque de la clase Application.
<?php
declare(strict_types=1);
namespace OCA\MyApp\AppInfo;
use OCA\MyApp\Translation\Provider;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
class Application extends App implements IBootstrap {
public function register(IRegistrationContext $context): void {
$context->registerTranslationProvider(Provider::class);
}
public function boot(IBootContext $context): void {}
}