Blog ·
Șaisprezece mii de chei, nouă limbi
Traducerea unui panou de control nu este o problemă de text. Eșecurile care contează sunt tăcute: un argument pierdut, un plural aplatizat, o gardă goală.
De Provibr
Catalogul nostru de mesaje în engleză cuprinde în prezent puțin peste șaisprezece mii de șiruri. Sunt nouă la număr, câte unul pentru fiecare limbă, și li se cere să aibă exact aceleași chei. Asta înseamnă undeva peste o sută patruzeci de mii de bucăți de text care trebuie toate să rămână adevărate una față de alta, în timp ce o duzină de oameni schimbă produsul de sub ele.
Partea interesantă a acestei probleme nu este volumul. Este faptul că aproape niciunul dintre eșecuri nu se anunță singur. O traducere cu o greșeală de tipar este raportată de un client într-o săptămână. O traducere care a pierdut în tăcere un argument redă pentru totdeauna o propoziție cu o gaură în ea, iar nimeni nu deschide un tichet pentru o propoziție care se citește bine.
Iată setul de gărzi la care am ajuns și raționamentul din spatele fiecăreia. Ele nu sunt legate de vreun cadru anume; modurile de eșec sunt o proprietate a faptului că aveți mai mult de o limbă.
Clasa de defect care contează
Începeți cu cel care ne-a făcut să luăm lucrul acesta în serios.
Un șir în engleză spune Welcome back, {name}. Cineva îl traduce, iar traducerea este Welcome back. Este gramatical, este o propoziție rezonabilă și se redă fără eroare în orice sistem de șabloane existent. Parametrul pur și simplu nu apare. Nu există nicio excepție, nicio linie de jurnal, niciun avertisment de cheie lipsă.
Defectul acela este invizibil pentru orice test care verifică dacă cheile există, adică testul pe care aproape toată lumea îl scrie primul. Singurul lucru care îl găsește este o comparație: extrageți mulțimea de nume de substituenți din șirul de referință, extrageți-le din traducere și cereți să se potrivească.
Odată ce ați construit acea comparație, trei rafinări se dovedesc necesare, iar fiecare dintre ele a venit dintr-un șir real care a scăpat.
Comparați tipurile argumentelor, nu doar numele. Un {count} gol nu se formatează. El tipărește numărul brut, fără separator de mii, în orice limbă. Scrieți {count, number} și se formatează. Dacă tipul este prezent în engleză și absent în traducere, numele se potrivește, structura ramurilor se potrivește, iar o limbă redă în tăcere un întreg brut acolo unde celelalte redau unul formatat. La fel este și cu datele calendaristice: un argument de dată care și-a pierdut tipul îi aruncă cititorului în față o marcă de timp ISO.
Nu comparați stilurile argumentelor. Stilul de monedă față de stilul de număr simplu este o alegere de prezentare care diferă în mod legitim de la o limbă la alta, iar o gardă care o semnalează îi învață pe oameni să ignore garda. Tipul este structural, stilul este gust, și numai unul dintre ele își are locul într-un test.
Comparați numele ramurilor, nu textul ramurilor. Un plural pe care traducătorul l-a aplatizat își păstrează argumentul, așa că o comparație de substituenți îl lasă bucuroasă să treacă, în timp ce ecranul ajunge să arate un număr gol fără niciun substantiv după el. Exact asta am avut în catalogul nostru neerlandez, și așa a fost găsit.
Pluralele nu sunt o problemă rezolvată pe care să o puteți copia
Instinctul este să cereți ca o traducere să aibă aceleași ramuri de plural ca engleza. Engleza are două: one și other. Cerința aceea este corectă pentru limbile care au tot două și este exact greșită pentru cele care nu au, pentru că acceptă cu voioșie un catalog căruia îi lipsesc categorii de care propria lui limbă are nevoie.
Câteva măsurători, toate din regulile standard care vin cu orice mediu de execuție modern:
| Limba | Ce îi surprinde pe oameni |
|---|---|
| Franceza | Zero ia ramura de singular. „0 machine”, nu „0 machines”. |
| Ucraineana | Patru categorii. Zero cade în many, împreună cu 5 până la 20; 21 este one, iar 22 este few. |
| Româna | De la 2 la 19 este few, 20 este other, iar 101 este iar few. |
| Araba | Șase categorii, împărțite la 0, 1, 2, de la 3 la 10 și de la 11 la 99. |
Rândul despre română are o consecință care se arată ca volum brut. Româna pune o prepoziție înaintea substantivului peste nouăsprezece, așa că o formulare care în engleză nu are deloc nevoie de plural are nevoie de unul în română. Numărând mesajele din cataloagele noastre care conțin un plural: engleza are 319, româna are 498. 179 de mesaje au nevoie în română de o construcție de plural de care engleza nu are deloc nevoie. Ucraineana adaugă încă 13 de la ea, franceza 4.
Iată unul dintre ele, și este o propoziție englezească întru totul obișnuită:
en: Start {days}-day trial
uk: Почати пробний період на {days, plural, one {# день} few {# дні} many {# днів} other {# дня}}Nimic din propoziția în engleză nu sugerează că este o problemă de plural. O gardă care își derivă așteptările din engleză nu are cum să vadă asta.
Așa că a doua gardă rulează pentru fiecare limbă în raport cu catalogul ei propriu: pentru fiecare plural din el, este tratată oare fiecare categorie pe care limba aceasta o poate produce cu adevărat, fie prin nume, fie printr-o ramură cu valoare exactă?
Garda aceea are nevoie de o limită deliberată, altfel devine inutilă. Franceza și spaniola au o categorie many care se aplică numai multiplilor exacți de un milion. Să o cerem peste tot ar adăuga sute de ramuri pe care niciun om nu le va vedea vreodată, într-un produs care numără servere, adrese, membri ai echipei și zile. Așa că verificarea este condusă de eșantioane: ea întreabă ce categorii sunt accesibile pentru numărătorile pe care o cheie le vede în mod realist, iar există o listă mică și explicită de chei care numără mai sus, astfel încât mecanismul să fie acolo în ziua în care ceva chiar o face.
Lista aceea este momentan goală, iar aceasta este o măsurătoare și nu o scăpare. Cei doi candidați care par că ar putea crește mult numără octeți, iar regula franceză vrea un multiplu exact de un milion; un fișier de exact 1.000.000 de octeți este o coincidență, nu un caz.
Garda care nu făcea nimic, în tăcere
Acum cea incomodă, pentru că este chiar eșecul despre care este acest articol, întâmplat uneltelor înseși.
Avem o verificare care spune că fiecare apel de traducere din cod se referă la o cheie existentă. Ea analizează sursa, urmărește care obiect de traducere aparține cărui spațiu de nume și caută fiecare cheie. Raporta că acoperea câteva mii de chei. Era verde.
Sărea totodată peste fiecare apel care venea dintr-un tipar de destructurare, pentru că partea de cod care lega un traducător de un spațiu de nume trata numai un identificator simplu și ignora în tăcere orice altceva. Nicio legare, prin urmare nicio cheie de verificat, prin urmare niciun eșec. Tiparul peste care sărea se întâmpla să fie tocmai cel folosit în cea mai mare parte a aplicației noastre.
L-am găsit pentru că cineva a ghicit un nume de cheie, l-a scris, iar testul a rămas verde.
Din asta au ieșit două reguli, pe care le aplicăm acum fiecărei analize statice pe care o scriem.
Un analizor care întâlnește o formă pe care nu o înțelege trebuie să eșueze zgomotos, nu să sară peste ea în tăcere. Nerecunoscut este o constatare, nu o lipsă de acțiune. Toată valoarea uneltei stă în faptul că s-a uitat la tot.
Dovediți garda roșie înainte să vă încredeți în ea verde. Stricați ceva intenționat și priviți cum testul cade. O verificare care nu a eșuat niciodată nu a fost testată; a fost numai rulată.
O rudă apropiată a acelei lecții: un nume de marcă din cataloagele noastre era scris în patru feluri diferite, iar singurul loc din tot codul care știa scrierea corectă o știa drept excepție într-o listă de permisiuni. Singura componentă care avea răspunsul corect era configurată să se uite în altă parte. O excepție nu este o gardă, iar remediul este de obicei să întoarceți lucrul pe dos: enunțați regula și lăsați excepțiile să fie date atârnate de ea.
Analiza propriului format de mesaje este mai grea decât pare
Extragerea substituenților cu o expresie regulată funcționează până când nu mai funcționează, iar felul în care eșuează este instructiv, pentru că eșuează pe cele mai bune șiruri ale dumneavoastră.
O ramură de selecție al cărei text este un singur cuvânt arată exact ca un argument pentru un potrivitor de tipare. Vechiul nostru scaner dădea alarme false pe cele mai grijuliu scrise mesaje din catalog și, în același timp, rata argumente adevărate din interiorul ramurilor, pentru că o expresie regulată nu poate număra acolade. Greșea în ambele sensuri deodată.
Înlocuitorul parcurge acoladele cum trebuie și intră recursiv în corpurile ramurilor. Are treizeci de linii în loc de una și este diferența dintre o gardă în care oamenii au încredere și o gardă pe lângă care oamenii își fac loc cu adnotări.
Tipografia este o gardă pentru fiecare limbă, nu una comună
Ultima categorie nu poate fi verificată deloc prin comparație, pentru că este tocmai lucrul care diferă între limbi. Franceza vrea un spațiu neîntrerupt înaintea semnului două puncte, a punctului și virgulei, a semnului exclamării și a semnului întrebării. Ucraineana vrea un caracter de apostrof anume, care seamănă cu celelalte două apostrofuri pe care probabil le aveți pe tastatură. Spaniola deschide o întrebare cu un semn răsturnat, în punctul unde începe întrebarea și nu la începutul propoziției. Româna folosește propriile ghilimele și diacritice cu virgulă dedesubt.
Nimic din toate acestea nu este comparabil între limbi, așa că fiecare limbă care are reguli primește propria verificare. Asta sună a dublare și nu este: alternativa este o singură gardă generică ce poate afirma numai intersecția a nouă seturi de reguli, adică, în practică, nimic.
Un avertisment din a face asta într-un depozit mare: un spațiu neîntrerupt este invizibil, iar mai multe unelte îl vor transforma serviabil într-un spațiu obișnuit pe drum. Tocmai de aceea le punem cu un script și verificăm după aceea că sunt încă acolo.
Ce am construi mai întâi, în ordine
Dacă porniți de la o singură limbă și vă așteptați să adăugați altele, aceasta este ordinea care ne-ar fi scutit de cel mai mult.
- Aceleași chei în fiecare catalog, verificate în integrarea continuă. Ieftin, și este temelia pe care stă restul.
- Compararea substituenților și a tipurilor de argumente cu limba de referință. Aceasta este cea care prinde defectele tăcute.
- Compararea numelor de ramuri pentru plurale și selecții, astfel încât un plural aplatizat să fie un eșec.
- Acoperirea pluralului pentru fiecare limbă, condusă de regulile proprii ale limbii, înainte să sosească prima limbă care are nevoie de mai multe categorii decât referința dumneavoastră.
- Tipografia pentru fiecare limbă, câte o verificare mică pentru fiecare limbă care are convenții.
- O verificare statică a faptului că fiecare cheie la care se face referire în cod există și, mai important, că este sinceră în privința apelurilor pe care nu le-a putut înțelege.
Tema care străbate toate cele șase este că defectele de traducere nu aruncă excepții. Ele se redau. Fiecare gardă de aici există pentru că ceva s-a redat perfect, într-o limbă pe care nu o citește nimeni din încăpere, și a spus altceva decât ce voiam noi.