•  untoreh-light

MTR: flera översättningar

inslagning av översättningstjänster för internt bruk

När du publicerar en webbplats kanske du vill erbjuda olika översättningar. Vissa människor gillar inte automatiserade översättare, jag tror att en automatisk översättning är tillräckligt bra och bättre än ingenting, och automatiska översättare har blivit gradvis bättre med framstegen inom NLP och ML.

Vanliga översättningstjänster är google, bing, yandex. Dessa erbjuder en gratis nivå som vi vill slå in för vårt eget personliga bruk. Det finns också andra mindre kända översättartjänster , och några av dem stängs av i skrivande stund ...

Cachar text

Om vi ​​vill cacha översättningar behövde vi dela upp den begärda texten i mindre strängar så att de är tillräckligt små för att ge träffar för möjliga framtida förfrågningar. De avvägning är att översättningen av mindre meningar har mindre sammanhang, vilket sänker kvaliteten på översättningen.

Hur delar vi upp inkommande text så att vi kan rekonstruera originalet från den översatta texten är ett ganska knep..eller ett hack. Vi vill hitta en sträng som är så konstig att översättningstjänsten lämnar den som det är i sin produktion. Jag har hittat variationer av stycke tecken att jobba för det mesta

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

Deglue sträng används för att sammanfoga Allt strängarna (delade från den ursprungliga begäran) i ett enda kropp för den uppströms översättningsbegäran som vi skickar till t.ex. Google. DesplitGlue används istället för att dela upp den mottagna översättningen till de strängar som vi ska cacha. Vi ser här att strängdelning inte bara är användbart för cachning, utan för att minska antalet förfrågningar, för om vår efterfrågeförfrågan utför många små frågor använder vi vårt maskineri för att slå samman förfrågningar upp till den maximala nyttolaststorleken som tillåts av uppströms -tjänsten.

Gränssnittet

För att stödja flera tjänster transparent Jag skrev ett gränssnitt som bosatte sig på denna API

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

Så en tjänst för att fungera måste erbjuda en översättningsfunktion, hur man översätter förfrågningar och tillhandahåller en lista över språk som stöds. Med listan över språk som stöds kan vi skapa en matris så att vi vet hur många tjänster som stöder ett specifikt språkpar, för att analysera språkpar vi konverterar representationen som tjänsten returnerar till en gemensamiso639-1.

Skapandet av översättningsinstansen gör det också möjligt att konfigurera de förfrågningsalternativ som används avGuzzle klientinstans så att vi till exempel kan använda proxy för att utföra förfrågningarna. Tjänsterna är cachad efter att ha genererats första gången är detta användbart eftersom vissa tjänster kräver att de genererar några initiala tokens och vi inte vill återskapa dem varje gång.

Go -versionen

Jag skrev också en version i golang. PHP -versionen skulle användas genom att importera den i ditt PHP -projekt, medan go -versionen fungerar som en fristående (mikro) tjänst. Go -versionen är mycket mer omfattande eftersom den kräver strikt typkontroll och eftersom vi stöder att fråga flera strängar samtidigt måste vi avslöja api som fungerar med olika inmatningskombinationer, och bristen på go -generika gör implementeringen mycket smärtsam, men det erbjöds samtidig behandling, och var mycket snabbare i allmänhet.

Rengöring av ingångar

Tillsammans med översättningen byggde jag också en tjänst för städa html . Vi vitlistar några html -taggar och kasserar resten. Vi tar också bort skräppliknande dubblett skiljetecken och okända html-attribut och slår in länkar i rätt ankartaggar.

Själv värd:

Slutsatser

Numera tror jag att jag bara skulle använda en egen värdlösning, tillhandahållen av antingen joshua eller argos, eftersom jag inte siktar på den bästa översättningen, jag vill erbjuda en läsbar översättning för en webbplats, så att den kan navigeras utan friktion.

Inläggstaggar: