•  untoreh-luce

MTR: traduzioni multiple

servizi di traduzione wrapper per uso interno

Quando pubblichi un sito web potresti voler offrire diverse traduzioni. Ad alcune persone non piacciono i traduttori automatici, penso che una traduzione automatizzata sia abbastanza buona, e meglio di niente, e i traduttori automatici sono migliorati progressivamente con i progressi in PNL e ML.

I servizi di traduzione comuni sono google, bing, yandex. Questi offrono un livello gratuito che vogliamo avvolgere per il nostro uso personale. Ce ne sono anche altri meno conosciuti servizi di traduzione , e alcuni di essi sono chiusi al momento della scrittura...

Memorizzazione del testo nella cache

Se vogliamo memorizzare nella cache le traduzioni, abbiamo bisogno di dividere il testo richiesto in stringhe più piccole in modo che siano abbastanza piccole da fornire risultati per eventuali richieste future. Il scambio è che la traduzione di frasi più piccole ha meno contesto, il che riduce la qualità della traduzione.

Come dividere il testo in arrivo in modo da poter ricostruire l'originale dal testo tradotto è piuttosto un trucco... o un hack. Vogliamo trovare una stringa abbastanza strana che il servizio di traduzione la lasci così com'è nella sua uscita. Ho trovato variazioni di carattere di paragrafo lavorare la maggior parte delle volte

$this->misc['glue'] = ' ; ¶ ; ';
$this->misc['splitGlue'] = '/\s?;\s?¶\s?;?\s?/';

Ilglue la stringa è usata per concatenare Tutti le stringhe (divise dalla richiesta originale) in uno corpo unico per la richiesta di traduzione a monte che stiamo inviando ad es. Google. IlsplitGlue viene invece utilizzato per sdoppiare la traduzione ricevuta nelle stringhe che andremo a memorizzare nella cache. Vediamo qui che la suddivisione delle stringhe non è utile solo per la memorizzazione nella cache, ma per ridurre il numero di richieste , perché nel caso in cui la nostra richiesta a valle esegua molte piccole query, utilizziamo i nostri macchinari per unire le richieste fino alla dimensione massima del carico utile consentita dal servizio a monte.

L'interfaccia

Per supportare più servizi in modo trasparente Ho scritto un'interfaccia che si è adattata a questa API

function__construct(
    Mtr &$mtr,
    Client &$gz,
    TextReq &$txtrq,
    LanguageCode &$ld);
functiontranslate($source, $target, $input);
functiongenReq(array$params);
functionpreReq(array &$input);
functiongetLangs();

Quindi un servizio per essere operativo deve offrire una funzione di traduzione, come tradurre le richieste e fornire l'elenco delle lingue supportate. Con l'elenco delle lingue supportate possiamo creare una matrice in modo tale da sapere quanti servizi supportano una coppia di lingue specifica, per l'analisi del coppie linguistiche convertiamo la rappresentazione restituita dal servizio in un comuneiso639-1.

La creazione dell'istanza di traduzione consente anche di configurare le opzioni di richiesta utilizzate daGuzzle istanza del client in modo tale che possiamo ad esempio utilizzare i proxy per eseguire le richieste. I servizi sono memorizzato nella cache dopo essere stati generati la prima volta, questo è utile poiché alcuni servizi richiedono di generare alcuni token iniziali e non vogliamo rigenerarli ogni volta.

La versione Go

ho anche scritto a versione in golang . La versione PHP verrebbe utilizzata importandola nel progetto PHP, mentre la versione go funziona come servizio (micro) autonomo. La versione go è molto più dettagliata in quanto richiede un rigoroso controllo del tipo e poiché supportiamo l'interrogazione di più stringhe contemporaneamente, dobbiamo esporre API che funzionano con diverse combinazioni di input e la mancanza di generici go rende l'implementazione molto dolorosa, ma ha offerto elaborazione simultanea ed era molto più veloce in generale.

Ingressi di pulizia

Insieme alla traduzione ho anche creato un servizio per ripulire html . Mettiamo nella whitelist alcuni tag html e scartiamo il resto. Rimuoviamo anche la punteggiatura duplicata simile allo spam e gli attributi html sconosciuti e avvolgiamo i collegamenti in tag di ancoraggio appropriati.

Self-hosted:

Conclusioni

Al giorno d'oggi penso che userei solo una soluzione self-hosted, fornita da joshua o argos, poiché non miro alla migliore traduzione, voglio offrire una traduzione leggibile per un sito Web, in modo che possa essere navigato senza attriti.

Tag degli articoli: