•  desabrochar luz

MTR: traduções múltiplas

embalagem de serviços de tradução para uso interno

Ao publicar um site, você pode querer oferecer traduções diferentes. Algumas pessoas não gostam de tradutores automatizados, acho que uma tradução automática é boa o suficiente e melhor do que nada, e os tradutores automatizados ficaram cada vez melhores com os avanços em PNL e ML.

Os serviços de tradução comuns são google, bing, yandex. Eles oferecem um nível gratuito que queremos embrulhar para nosso uso pessoal. Existem também outros menos conhecidos serviços de tradução , e alguns deles foram desligados no momento da escrita ...

Cache de texto

Se quisermos armazenar as traduções em cache, precisamos dividir o texto solicitado em strings menores, de forma que sejam pequenas o suficiente para fornecer resultados para possíveis solicitações futuras. o troca é que a tradução de frases menores tem menos contexto, o que diminui a qualidade da tradução.

Como dividir o texto recebido de forma que possamos reconstruir o original a partir do texto traduzido é um truque e tanto ... ou um hack. Queremos encontrar uma string estranha o suficiente para que o serviço de tradução a deixe como isso é em sua saída. Eu encontrei variações do personagem de parágrafo trabalhar na maioria das vezes

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

oglue string é usada para concatenar tudo as strings (divididas da solicitação original) em 1 corpo único para a solicitação de tradução upstream que estamos enviando, por exemplo Google. osplitGlue em vez disso, é usado para dividir de volta a tradução recebida nas strings que iremos armazenar em cache. Vemos aqui que a divisão de strings não é útil apenas para armazenamento em cache, mas para reduzir o número de solicitações, porque no caso de nossa solicitação downstream realizar muitas consultas pequenas, usamos nosso maquinário para mesclar solicitações até o tamanho máximo de carga útil permitido pelo serviço upstream.

A interface

Para oferecer suporte a vários serviços transparentemente Eu escrevi uma interface que se estabeleceu nesta API

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

Portanto, um serviço para estar operacional deve oferecer uma função de tradução, como traduzir solicitações e fornecer a lista de idiomas suportados. Com a lista de idiomas suportados, podemos criar uma matriz de forma que saibamos quantos serviços suportam pares de idiomas específicos, para analisar o pares de línguas nós convertemos a representação retornada pelo serviço em um comumiso639-1.

A criação da instância de tradução também permite configurar as opções de solicitações utilizadas porGuzzle instância do cliente de forma que possamos, por exemplo, usar proxies para realizar as solicitações. Os serviços são em cache depois de ser gerado pela primeira vez, isso é útil, pois alguns serviços exigem a geração de alguns tokens iniciais e não queremos regenerá-los todas as vezes.

A versão Go

Eu também escrevi um versão em golang. A versão PHP seria usada importando-a em seu projeto PHP, enquanto a versão go funciona como um serviço autônomo (micro). A versão go é muito mais detalhada, pois requer verificação de tipo estrita e, como oferecemos suporte à consulta de várias strings ao mesmo tempo, temos que expor a API que funciona com diferentes combinações de entrada, e a falta de genéricos go torna a implementação muito difícil, mas oferecida processamento simultâneo e era muito mais rápido em geral.

Insumos de limpeza

Juntamente com a tradução, também desenvolvi um serviço para limpar html . Nós permitimos algumas tags html e descartamos o resto. Também removemos pontuação duplicada semelhante a spam e atributos de html desconhecidos, e agrupamos links em tags âncoras adequadas.

Auto-hospedado:

Conclusões

Hoje em dia acho que usaria apenas uma solução auto-hospedada, fornecida por joshua ou argos, já que não pretendo a melhor tradução, quero oferecer uma tradução legível para um site, de modo que possa ser navegado sem atrito.

Tags de postagem: