Vi kontrollerade varje maskinöversättning. Det var kontrollerna som var fel.
Språk
Innan vi släppte vårt översättningsverktygspaket testade vi det på en liten exempelapp: 70 strängar i sex format (JSON, Flutter ARB, Android, Apple .strings, gettext och Markdown) till tyska, ryska, japanska, arabiska och spanska, med en öppen modell på 27 miljarder parametrar på vår egen maskin. Varje översatt sträng går igenom kontroller innan den skrivs. Fyra av de 350 strängarna avvisades. Alla fyra avvisningarna var felaktiga.
Så här ser kontrollerna ut
En översättning som bryter en app är värre än ingen alls, så varje sträng måste behålla sina platshållare (%1$s, {name}, {{count}}), sina taggar, radbrytningar och URL:er; den måste vara i målspråkets skriftspråk; den får inte vara tom, löpa iväg eller vara kvar på engelska; och pluralformer måste täcka exakt de kategorier som språket har. En sträng som underkänns begärs på nytt med problemet specificerat, och en som underkänns igen lämnas ut, så att appen visar engelska för just den strängen.
De fyra avvisningarna
- "Backups" på tyska var "Backups". Kontrollen kallade det oöversatt. Tyskan använder det engelska ordet. Ett identiskt ord är ofta rätt; två eller flera identiska ord är inte det, så det är regeln nu.
- En rysk och en japansk rad med en e-postadress klarade inte skriftkontrollen: färre än 60 % av bokstäverna var kyrilliska eller japanska, eftersom
[email protected]är skrivet med latinska bokstäver. Adresser behandlas nu som platshållare: de måste komma tillbaka oförändrade, och de räknas inte som bokstäver. - Ett japanskt pluralmeddelande kom tillbaka som
{count, plural, =0{連続記録なし} other{{count}日連続}}. Grenen{連続記録なし}har inga mellanslag, så platshållarmönstret tolkade den som en variabel med namnet 連続記録なし. Klammerparenteser i pluralmeddelanden är nu struktur, och platshållarnamn måste vara ASCII.
När kontrollerna var korrigerade bad en andra körning modellen bara om de fyra strängarna, eftersom allt annat fanns i översättningsminnet, och skrev alla 350 på 45 sekunder.
Den del vi förväntade oss att skulle misslyckas, men som inte gjorde det
Pluralformer är där naiv översättning fallerar: engelska har one och other, ryska har one, few, many och other, arabiska sex kategorier och japanska en enda form. Vi bad om exakt målspråkets kategorier och kontrollerade platshållarna i varje form. Modellen skrev "1 день, 2 дня, 5 дней" för ryska och alla sex arabiska former. Varje Android-plural godkändes vid första försöket i alla fem språken, och detsamma gällde varje pluralmeddelande utom det japanska som vår kontroll felaktigt läste.
Det ingen kontroll fångar
Vi översatte därefter de 22 websträngarna i exemplet till alla 42 språk som Polyglot känner till: 924 av 924 strängar godkändes. När vi läste igenom dem stack en ut. På khmer hade "You are offline" kommit tillbaka som en mening som säger "you are online". Det är korrekt formulerad khmer i rätt skrifttecken utan något som saknas, så alla kontroller godkände den. Kontroller fångar det som bryter en app; en felaktig betydelse kräver en person som läser språket.
Slutsatsen
Automatiska kontroller av maskinellt genererad output behöver verklig output att testas mot. Enhetstester med påhittade översättningar godkändes; ett riktigt modell som skrev riktig japanska hittade luckorna på minuter. Polyglot levereras med dessa kontroller, korrigerade, och med testerna för varje av de fyra fallen.