Pridėjome japonų ir Brazilijos portugalų kalbas visai savo svetainei už 31 €
29 rugsėjo mes išleidome globalize.now japonų ir Brazilijos portugalų kalbomis. Kiekvieną puslapį, kiekvieną kainodaros lentelę ir visus 61 tinklaraščio įrašus. Pats vertimas užtruko aštuonias minutes, o programa nurašė apie 31 €. globalize.now yra dirbtiniu intelektu paremta lokalizacijos infrastruktūra, ir štai kaip atrodė jos taikymas mūsų pačių svetainėje — visi skaičiai paimti iš užduoties puslapio ir Git istorijos, o ne iš atminties.
Mūsų įrašas apie tai, kiek 2017 metais kainavo lokalizacijos augimo strategija baigiasi teiginiu, kad savo skaičių kol kas neskelbiame. Tai — pirmasis toks skaičius. Tai kainos, o ne augimo skaičius: dar niekas neturėjo laiko aplankyti /ja/.
Ką tiksliai išvertėme?
Visą svetainę, du kartus. Čia — inventorizacija, atlikta pagal saugyklos duomenis:
- Sąsaja: 1782 eilutės anglų kalba, paskirstytos penkiuose pranešimų kataloguose (pagrindinė svetainė, kainos, palyginimo puslapiai, integracijos ir vertimo pavyzdžiai), iš viso apie 21 000 žodžių.
- Tinklaraštis: 61 įrašas, apie 110 000 žodžių.
- Tikslinės kalbos: japonų (
ja) ir Brazilijos portugalų (pt-BR).
Tai apytiksliai 130 000 pradinio teksto žodžių, verčiamų į dvi kalbas. Pull request pakeitė 170 failų ir pridėjo 34 681 eilutę. Po sulietimo (merge) svetainės žemėlapyje (sitemap) yra 811 URL, paskirstytų 11 lokalių, o svetainė sukuria 962 statinius puslapius.
Kiek laiko tai užtruko?
Aštuonios minutės vertimo, po to ilgesnė kokybės patikra. Arturs, mūsų technologijų vadovas, pridėjo abi kalbas prie projekto, ir užduotis prasidėjo main 08:56 UTC. Užduoties puslapyje viskas suskirstyta:
| Etapas | Trukmė |
|---|---|
| Vertimas (11 264 naujos eilutės, po 5632 kiekvienai kalbai) | 8 min 1 s |
| Automatinė kokybės patikra | 27 min 11 s |
| Pateikimas į „pull request“ | 5 min 29 s |
„Commit“ su abiem kalbomis atsirado 09:29 UTC. Likusios 45 106 eilutės užduotyje buvo paimtos iš vertimo atminties, nes aštuonios jau egzistuojančios kalbos nebuvo pasikeitusios.
Arturs, paminėdamas tai mūsų komandos pokalbyje, spėjo, kad užtruks dešimt minučių. Jis buvo teisus dėl vertimo, bet per daug optimistiškas dėl visos užduoties — skirtumą lėmė kokybės patikra. Mums geriau skirti 27 minutes mašininio laiko patikrai, nei jos praleisti.
Ką rado automatinė kokybės patikra?
72 pastebėjimai iš 11 264 naujų eilučių, ir visi įvertinti kaip nedideli. 11 192 praėjo be pastabų, o kokybės patikra pakeliui atliko 182 automatinius pataisymus.
Dauguma pastebėjimų atsirado dėl to, kad ilgio patikra atsargiai vertina japonų kalbą. „Pricing“ tampa 料金 — dviem simboliais, o ilgio santykis 0,29 vos nesiekia 0,3 ribos. Tai teisingas vertimas, tiesiog suveikianti euristika, sukurta abėcėlinėms kalboms, o ne klaida. Vis tiek paliekame šiuos pastebėjimus matomus: patikra, kuri niekada nesuveikia, nėra patikra.
Kiek tai kainavo?
Apie 31 €: projekto sąnaudų pagal kalbą peržiūra rodo 15,72 € už japonų ir 16,15 € už Brazilijos portugalų kalbą. Tai suma, kurią taiko pati programa — tokia pati, kokią matytų klientas, verčiantis tokį patį kiekį. Tai nėra mūsų vidinė modelio sąnaudų kaina ir jokia nuolaida.
Prie maždaug 260 000 išverstų žodžių tai sudaro apie 12 centų už 1000 žodžių. Jokių papildomų mokesčių nebuvo. Nėra nei mokesčio už kalbą, nei už vartotoją, tad dvyliktos kalbos pridėjimas kainuoja tiek pat, kiek trečiosios. Dabartiniai planai pateikti kainodaros puslapyje.
Ką iš tikrųjų reiškė šis programavimo darbas?
Vienas „pull request“, sujungtas tą pačią popietę, ir jame nebuvo nė kruopelės vertimo. Kai jis buvo atidarytas, vertimo užduotis vėl paleista jam ir 56 370 iš 56 390 eilučių paėmė tiesiai iš vertimo atminties, todėl jau išversti katalogai atsidūrė naujuose failuose per septynias minutes. Vertimas — tai dalis, kuri buvo automatizuota. Naujos lokalės registravimas Next.js svetainėje vis dar yra jūsų kodas, ir verta žinoti, ką reiškia „jūsų kodas“, prieš tai planuojant.
Lokalės pridėjimas next-intl konfigūracijoje yra viena eilutė maršruto (routing) nustatymuose. Visa kita, kas kuria URL, skaito lokalę arba išvardija jūsų lokalias, yra likusi diff dalis:
- Maršrutas (routing): lokalių sąrašas, plius URL prefikso pakeitimas
pt-BR(kitame skyriuje). - SEO metaduomenys: hreflang klasteriai, canonical nuorodos,
og:locale(ja_JP,pt_BR) ir lokalių sąrašas, per kurį iteruoja metaduomenų pagalbinės funkcijos. - Formatavimas:
Intlžymosja-JPirpt-BR, kad datos ir skaičiai atsivaizduotų teisingai. - Kalbos jungiklis: jis nukreipia į kiekvieną lokalę su tikru
<a href hreflang>, kad robotai (crawlers) galėtų juo sekti. - Svetainės žemėlapis (sitemap) ir patikros: svetainės žemėlapio generatorius, lastmod patikra, vidinių nuorodų patikra ir vertimo tikrintuvas — visiems reikėjo „išmokti“ šiuos du naujus kodus.
- Katalogai: tuščios, tik antraštes turinčios
.pofailai dviem lokalėms, užpildyti tame pačiame „pull request“ iš vertimo atminties.
Jei jūsų svetainė mažiau individualizuota nei mūsų, dauguma šio sąrašo bus tik konfigūracija. Jei kur nors patys ranka kuriate URL — o daugumoje svetainių taip yra bent kažkur — kiekvieną tokią vietą pastebėsite tada, kai nuoroda pirmą kartą suveiks netinkamai. Programuotojo gidas aprašo sąranką, o ką iš tikrųjų daro dirbtinio intelekto lokalizacijos agentas paaiškina, kas automatizuota, o kas — ne.
Kodėl Brazilijos portugalų kalba adresuojama /pt-br/, o ne /pt-BR/?
Nes kalbos žymė ir URL segmentas — dvi skirtingos struktūros, atliekančios skirtingas funkcijas.
Teisinga žymė yra pt-BR, pagal BCP 47 standartą. Ją naudojame visur, kur kalbą skaito mašina: failų pavadinimuose, <html lang>, hreflang, og:locale ir Intl. Mažosiomis raidėmis rašomas tik URL:
// i18n/routing.ts (trimmed)
const prefixes = {
"pt-BR": "/pt-br",
} as const;
export const routing = defineRouting({
locales: ["en", "it", "de", "fr", "es", "lv", "hi", "lt", "et", "ja", "pt-BR"],
defaultLocale: "en",
localePrefix: { mode: "always", prefixes },
});
/** The URL path segment for a locale: `pt-BR` → `pt-br`, `de` → `de`. */
export function localeUrlSegment(locale: string): string {
const prefix = (prefixes as Record<string, string | undefined>)[locale];
return prefix ? prefix.slice(1) : locale;
}
Mišraus registro kelius lengva suklysti rašant, o svetainė, atsakanti abiem — /pt-BR/ ir /pt-br/ — adresais, turi po dvi kiekvieno puslapio kopijas, kurios konkuruoja tarpusavyje. Todėl /pt-BR/ nukreipia į /pt-br/, o localeUrlSegment() kiekvieną ranka kurtą URL sukonstruoja iš prefiksų lentelės. Vienas patikimas informacijos šaltinis reiškia, kad kalbos jungiklis, canonical nuorodos ir svetainės žemėlapis (sitemap) niekada negali „išsiskirti“.
Kodėl pasirinkome japonų ir Brazilijos portugalų kalbas?
Tai didelės, plačiai naudojamos interneto kalbos, kurių dar neturėjome. Remiantis W3Techs skaičiavimais tą dieną, kai paleidome atnaujinimą, japonų kalba yra 4,9 % svetainių turinio kalba, o portugalų — 4,1 %.
Argumentas tai daryti egzistuoja seniau, nei mes patys. CSA Research 2020 m. apklausė 8709 vartotojus 29 šalyse, ir 76 % teigė, kad renkasi produktus su informacija gimtąja kalba. Tai paklausos pusė. Pasikeitė pasiūlos pusė: dvi kalbos anksčiau reiškė santykius su tiekėju, o dabar kainuoja 31 €.
Mūsų pačių taisyklė kalboms rinktis aprašyta augimo strategijos įraše. Pažiūrėkite, iš kur jau ateina jūsų srautas, pridėkite dvi kalbas, nekeiskite nieko kito ir matuokite rezultatus ketvirtį metų. Su šiomis dviem kalbomis padarysime lygiai tą pat.
Ko dar nepatikrinome?
Gimtakalbių peržiūros. Nė vienas japonų ar Brazilijos portugalų kalbą gimtąja kalbanti žmogus rezultato dar neperžiūrėjo.
Ką patikrinome: automatinę kokybės patikrą kiekvienai eilutei, tai, kad kūrimo procesas sėkmingai praeina kiekvieną prieškūriminį patikrinimą, ir tai, kad atrankiniu būdu peržiūrėti puslapiai bandomojoje aplinkoje grąžina 200 su teisingu lang, kanoniniu adresu ir hreflang bei atvaizduojami pilnai. Ko kūrimo procesas patikrinti negali — ar sakinys skamba taip, tarsi jį parašė žmogus. Tai supratome sunkiu būdu, kai tikrinome savo pačių vokiečių ir prancūzų kalbų versijas ir radome netinkamą kalbos registrą ištisuose puslapiuose.
Tad peržiūra bus kitas žingsnis, ir šį įrašą papildysime tuo, ką ji atskleis — įskaitant visa, kas buvo klaidinga.
Ar galėtumėte tą pačią patirtį pakartoti savo svetainėje?
Jei jūsų eilutės jau saugomos kataloguose — taip, ir vertimo dalis užtruks vos kelias minutes. Jei jos tebėra fiksuotai įrašytos (angl. hardcoded) komponentuose, pirmiausia reikia konvertavimo. Tai atliekama vieną kartą, per programoje esančią prisijungimo (connect) eigą, o vėliau naujas eilutes verčia push užduotys. Vibe kodavimo gidas aprašo programas, sukurtas naudojant Lovable, Bolt ar Cursor, kur fiksuotai įrašytos eilutės yra norma.
Kaina auga proporcingai verčiamų žodžių kiekiui, ne kalbų skaičiui ar komandos dydžiui. Todėl atsakymas į klausimą „ar apsimoka pridėti kalbą?“ pasikeitė. Šiandien tai patikrinti kainuoja pigiau, nei surengti susitikimą, kuriame tai svarstytumėte.
Išbandykite tai savo saugykloje
Dvi kalbos mums kainavo aštuonias vertimo minutes ir apie 31 €. Prijunkite savo saugyklą, pasirinkite dvi kalbas, į kurias jau rodo jūsų analitika, ir pažiūrėkite, kaip atrodo jūsų pačių kvitas.
globalize.now paverčia užkoduotą programos tekstą į vertimui paruoštus lokalės failus ir juos atnaujina, kai jūs diegiate naujus pakeitimus.
Išbandyti globalize.now nemokamai