Višejezične web stranice i lokalizacija

Višejezična web stranica daje svakoj publici vlastite URL-ove, naslove i sadržaj, tako da kupac može da čita i kupuje na svom jeziku, a pretraživač tu verziju indeksira zasebno. Prevesti natpis u meniju u podnožju nije isto. Kada je urađeno kako treba, prebacivač jezika ne zarobljava posjetioca, hreflang govori Googleu kako se verzije odnose, a nove stranice imaju jasan put u svaki jezik koji podržavate.

U CodeWizu gradimo višejezične web stranice na WordPressu uz Polylang ili WPML, a prilagođene aplikacije u Laravelu, Node.js-u i na mobilnom internacionalizujemo. Postavljamo strukturu URL-ova, tok prevođenja, SEO signale i detekciju jezika. Sadržaj i dalje traži čovjeka koji jezik zna. Mi brinemo da proizvod taj sadržaj može da drži, a da se shop, keš ili indeks ne raspadnu.

Ovo je za kompanije koje prodaju u više od jedne zemlje, organizacije koje služe Bosnu i Hercegovinu, Srbiju, Hrvatsku i Crnu Goru uz međunarodnu publiku, i timove čiji plugin za prevod već udara o WooCommerce, temu ili page cache.

Stranice: Stranica dvojezičnog rječnika sa odrednicama, skraćenicama i tipografskim simbolima

Višejezična web stranica na WordPressu uz Polylang i WPML

Na WordPressu višejezična web stranica znači da svaki javni dio ima prevod i vlastitu adresu: stranice, objave, proizvodi, kategorije, meniji i stringovi koji žive u temi. I Polylang i WPML to rade. Nisu zamjenjivi, a licenca je rijetko razlog da se izabere jedan.

PolylangWPMLPrilagođeni i18n
Najbolje zaSadržajne sajtove, blogove, većinu poslovnih sajtovaSložen WordPress i težak WooCommerceLaravel, Node.js, mobilne aplikacije
Oblik troškaBesplatno jezgro, Pro za dodatne mogućnostiPlaćena licencaInženjersko vrijeme, bez naknade za plugin
Gdje tekst živiObjave, termini, meniji, prevod stringovaObjave plus sloj za prevod stringova i translation memoryJezički fajlovi, JSON ili redovi u bazi
SEOZasebni URL-ovi, hreflang, podrška za sitemapZasebni URL-ovi, hreflang, podrška za sitemapURL-ove, hreflang i sitemapove implementirate vi
Na šta pazitiNekim page builderima i shopovima trebaju Pro dodaciViše pokretnih dijelova i licenca koju treba održavatiLako se zaborave mejlovi, PDF-ovi i poruke o greškama

Kako postavljamo WordPress

  • Jedan jezik po URL-u, obično direktorijum (/en/, /bhs/) na jednom domenu, da autoritet i hosting ostanu jednostavni. Poddomeni i državni domeni dolaze kada ih zaseban pravni subjekt zaista traži.
  • Prebacivač jezika vodi na prevod trenutne stranice, a ne uvijek na početnu. Ako prevoda nema, odluku donosimo izričito: sakriti link ili poslati posjetioca na jasan fallback. Ne ostavljamo prebacivač koji vodi na 404.
  • Meniji, forme, SEO naslovi, meta opisi, alt tekst slika i slugovi prevode se zajedno sa stranicom. Engleski i BHS slugovi na codewizdev.com namjerno se razlikuju (/services/ i /bhs/usluge/), što je i način na koji Polylang očekuje prevode.
  • WooCommerce proizvodi, atributi, obavijesti o dostavi i transakcioni mejlovi ulaze u isti tok, a ne prevode se usput u temi.
  • Ključevi keša zavise od jezika. Zajednički Varnish ili Cloudflare cache ne smije sljedećem posjetiocu servirati pogrešan jezik, što je jednostavno ako je HTML svakog URL-a stabilan. Pisali smo o tome kako stranice ostaju brze a da keš i dalje bude ispravan.

Sam codewizdev.com radi ovako: engleski i jedan zajednički BHS tekst u Polylangu, namijenjen čitaocima u Bosni i Hercegovini, Srbiji, Hrvatskoj i Crnoj Gori.

Internacionalizacija aplikacija (i18n)

Internacionalizacija je inženjering koji prevod čini mogućim: stringovi izvučeni iz komponenti, formati za datume i valute, i rasporedi koji prežive dužu rečenicu. Lokalizacija je sam prevod i lokalne konvencije koje idu uz njega.

Pravila koja ugrađujemo od početka

  • Nema spajanja rečenica. "Hello, " + name ne može se presložiti za jezik koji ime stavlja na drugo mjesto. Poruke su cijele rečenice sa placeholderima.
  • Množina ide kroz pravila platforme. ICU MessageFormat, Gettext ngettext ili ekvivalent u frameworku pokriva jezike koji ne staju na „one” i „other”.
  • Datumi, brojevi i valute idu kroz Intl ili formatter frameworka, uz izričit locale, umjesto tvrdog DD/MM/YYYY.
  • Ključevi ostaju stabilni (cart.items) kada se formulacija promijeni, da prevodioci ne dobijaju novi fajl.
  • Raspored računa na širenje. Njemačka ili BHS labela često je duža od engleske, pa se dugmad prelamaju, a navigacija ne izlazi iz okvira.
{ "cart.items": "{count, plural, one {# item} other {# items}}", "order.shipped": "Order {id} is on its way" }

U Laravelu to živi u jezičkim fajlovima i trans_choice(). U Reactu ili Next.js-u koristimo održavanu i18n biblioteku. U Flutteru su to ARB fajlovi i intl. Opisi, snimci ekrana i ključne riječi za App Store i Google Play zasebna su lokalizacija od binarnog fajla aplikacije.

hreflang i međunarodni SEO

hreflang govori Googleu koji je URL alternativa za koji jezik ili regiju. Ne podiže stranicu. Smanjuje šansu da se rangira pogrešan jezik ili da dupli prevodi konkurišu jedan drugom. Googleova dokumentacija o lokalizovanim verzijama stranice referenca je prema kojoj ovo implementiramo.

Kako izgleda ispravan skup

Svaka verzija navodi sebe i sve alternative, oznake se poklapaju u oba smjera, a x-default pokazuje na fallback za posjetioce koji ne odgovaraju nijednom jeziku. Skraćen primjer obrasca koji koristimo kada jedan regionalni tekst pokriva više jezičkih kodova:

<link rel="alternate" hreflang="en" href="https://example.com/pricing/" /> <link rel="alternate" hreflang="bs" href="https://example.com/bhs/cijene/" /> <link rel="alternate" hreflang="hr" href="https://example.com/bhs/cijene/" /> <link rel="alternate" hreflang="sr" href="https://example.com/bhs/cijene/" /> <link rel="alternate" hreflang="x-default" href="https://example.com/pricing/" />

Tako je označen i codewizdev.com. BHS URL-ovi su alternative za bs, hr i sr, a engleski je x-default. Iste oznake mogu živjeti u sitemapu umjesto u HTML-u. Ne smiju pokazivati na preusmjeravanja, na URL-ove koji se kanonikalizuju negdje drugdje, ni na stranice koje vraćaju grešku.

  • Svaki jezik kanonikalizuje sam na sebe. Ako canonical svakog prevoda pokazuje na engleski URL, Googleu govorite da prevod ignoriše.
  • Naslovi, opisi i vidljivi podnaslovi pisani su na tom jeziku. Stranica na BHS-u sa engleskim naslovom troši oznaku uzalud.
  • hreflang nije zamjena za korisnu stranicu. Tanke mašinske prevode, indeksirane na veliko, problem su kvaliteta, a ne SEO trik.
  • Search Console, izvještaji po zemljama i upiti pokazuju da li se pojavljuje prava verzija. Takve podatke pretrage koristimo da vidimo koji jezik skuplja prikaze, umjesto da pretpostavimo da je prebacivač dovoljan.
Svijetla mapa svijeta sa šarenim čiodama koje označavaju lokacije u različitim zemljama

Tokovi prevođenja koji ostaju usklađeni

Tok rada odgovara na jednostavno pitanje: kada se cijena, pravilo ili opis proizvoda promijeni u izvornom jeziku, šta se dešava sa ostalima? Ako je odgovor „neko se sjeti”, jezici se raziđu, a jedan od njih je pogrešan pred kupcem.

Praktičan setup

  • Izvorni jezik. Obično jezik na kojem vaš tim piše. Ostali jezici su prevodi tog izvora, a ne nezavisne kopije koje se uređuju na tri mjesta.
  • Rječnik termina. Nazivi proizvoda, obraćanje sa „vi” i termini koji ostaju na engleskom, kao što su brend i nazivi API-ja.
  • Format razmjene. XLIFF, Gettext PO ili uvoz koji Polylang ili WPML već podržavaju, da prevodilac radi u alatu za prevod, a ne u WordPress administraciji za svaki string.
  • Mašinski prevod samo kao nacrt. Razuman je prvi prolaz za interne alate i za nizak rizik u tekstu interfejsa, a zatim ga pročita čovjek. Ne objavljujemo nepregledan mašinski tekst na stranicama koje navode cijene, pravne uslove ili medicinske i finansijske tvrdnje.
  • Pravilo za nedostajući prevod. Prikazuje se izvorni string, a ne praznina, i ne indeksira se stranica koja je uglavnom neprevedena. Novi sadržaj ostaje van alternativnog sitemap-a dok nije stvarno spreman.

Nismo prevodilačka agencija. Gradimo pipeline, sjedimo sa vašim prevodiocima ili urednicima i mejlove, fakture, push notifikacije i PDF priloge držimo na istom spisku kao vidljive stranice. To su stringovi koje kupac primijeti kada je početna već gotova.

Geo-targeting i detekcija jezika

Detekcija jezika pogađa poželjnu verziju. Botovi, putnici i ljudi koji dijele link i dalje moraju da slete na URL koji ostaje sam sebi, tako da detekcija ne može biti jedini način da se do jezika dođe.

PristupZa posjetioceZa pretraživače
Zasebni URL-ovi i vidljiv prebacivačJasno, ako prebacivač zadržava trenutnu stranicuSigurno. Svaki jezik može da se obiđe
Baner koji predlaže drugi jezikPristojno, lako za zanemaritiSigurno. URL se ne mijenja ispod crawlera
Preusmjeravanje po zemlji koje preskače botove i pamti ručni izborZgodno za prve posjeteSigurno samo ako svaki jezik ostane na vlastitom URL-u koji pretraživač može da obiđe
Preusmjeravanje svih, uključujući crawlere, po IP adresiZbunjujuće za putnikeRizično. Google može vidjeti samo jedan jezik
Jedan URL, jezik samo u cookiejuIzgleda jednostavnoNesigurno. Jedan URL ne može da se rangira kao svaki jezik

codewizdev.com koristi treći obrazac. Zemlja dolazi iz Cloudflare zaglavlja CF-IPCountry, koje čita mali endpoint koji se ne kešira, tako da HTML stranice ostaje isti za sve i Varnish i Cloudflare mogu da ga keširaju. Posjetioci iz Bosne i Hercegovine, Srbije, Hrvatske i Crne Gore koji otvore englesku stranicu šalju se na BHS prevod kada on postoji. Botovi se ne preusmjeravaju. Ko je u prebacivaču već izabrao jezik, taj izbor zadržava. Oznaka u prebacivaču za te zemlje može pokazati BS, SR, HR ili ME, dok sadržaj stranice ostaje jedan zajednički BHS tekst.

Tu ideju ponovo koristimo samo kada odgovara publici. Shop koji služi jednu zemlju rijetko je treba. Katalog usmjeren na region i na tržište na engleskom često je treba. Detekcija ne zamjenjuje hreflang i nikada ne preusmjerava URL koji nema prevod.

Višejezična web stranica: greške koje koštaju pozicije

  • Jedan URL za svaki jezik, a tekst se mijenja JavaScriptom ili cookiejem.
  • hreflang koji cilja preusmjeravanje, 404 ili URL koji se kanonikalizuje nazad na drugi jezik.
  • Automatsko preusmjeravanje po IP adresi koje hvata i Googlebot, ili prebacivač koji preusmjeravanje odmah poništi.
  • Neprevedeni slugovi, alt tekst, naslovi i transakcioni mejlovi, pa je „prevedeni” sajt preveden samo iznad pregiba.
  • Indeksiranje mašinski prevedenih stranica koje niko nije pročitao.
  • Prebacivač jezika koji uvijek vodi na početnu stranicu.
  • Zaborav da drugi jezik udvostručuje stranice koje keš, sitemap i urednici moraju da nose.

Shopovi ovo osjete jače od blogova: pogrešan jezik na cijeni ili pravilu dostave izgubljena je narudžba, a ne nezgodan pasus. Ista pažnja vidi se u tome kako gradimo online prodavnice koje moraju da rade dalje od jednog tržišta.

Šta utječe na cijenu višejezične web stranice

Obim prevoda samo je jedan dio cijene, i njega često naručujete vi. Naša strana procjene je rad na proizvodu:

  • Koliko ima šablona, formi, mejlova i sistemskih poruka, i da li su stringovi već izvučeni.
  • WordPress sa pluginom naspram prilagođene aplikacije u koju i18n tek treba ugraditi.
  • Katalog shopa: proizvodi, atributi, kategorije i pravila množe se brže od stranica.
  • Koliko jezika, i da li je neki zdesna nalijevo ili traži drugačiji raspored.
  • SEO setup: hreflang, sitemapovi, canonicali i Search Console za svaku verziju.
  • Da li je detekcija jezika u obimu, i ko će prevoditi novi sadržaj poslije objave.
Osoba drži mali globus pod rukom na livadi obasjanoj suncem

Kako radimo

  1. Audit: popisujemo šablone, stringove, URL-ove i SEO koji sajt već emituje, uključujući hreflang koji pokazuje na pogrešnu stranu.
  2. Plan: biramo strukturu URL-ova, Polylang, WPML ili prilagođeni i18n, izvorni jezik i pravila fallbacka, i dogovaramo ko prevodi.
  3. Izgradnja: implementiramo jezike, prebacivač, hreflang, sitemapove i ponašanje keša, i izvlačimo stringove koje će prevodioci zaista vidjeti.
  4. Prevod: vaši urednici ili prevodioci pune pipeline. Mi povezujemo reviziju, rječnik termina i pravilo za nedovršene stranice.
  5. Test: provjeravamo mete prebacivača, uzajamnost hreflanga, canonicale, mejlove i crawl koji vidi svaki jezik.
  6. Objava i podrška: puštamo, pratimo Search Console i držimo tok upotrebljivim kada se pojave nove stranice i proizvodi.

Zašto CodeWiz

  • Radimo to na sebi: codewizdev.com je engleski i BHS na Polylangu, sa hreflangom i detekcijom jezika po zemlji koja ostavlja crawlere i keš na miru.
  • Full stack: tema, plugin, Laravel ili Node.js aplikacija, shop i konfiguracija servera dolaze iz jednog tima, pa se jezički sloj ne lijepi na kraju.
  • SEO i performanse zajedno: zasebni URL-ovi, iskren hreflang i keš koji ne miješa jezike.
  • Open-source na prvom mjestu: Polylang, WordPress, Laravel i message fajlovi u stilu Gettexta drže sadržaj prenosivim.
  • Poštene cijene: vrhunski razvoj bez vrhunskih cijena, iz Banje Luke, na daljinu sa klijentima lokalno i međunarodno. Više o CodeWizu.

Često postavljana pitanja

Da li uzeti Polylang ili WPML?

Polylang odgovara većini WordPress sajtova sa sadržajem i to je ono što koristimo na codewizdev.com. WPML zaslužuje mjesto na složenim WooCommerce setupima kojima treba njegovo upravljanje prevodima i koji već računaju na licencu. Za Laravel ili Node.js nijedan plugin ne važi i aplikaciju internacionalizujemo direktno. Jedan preporučujemo tek kada vidimo temu, shop i page builder.

Hoće li drugi jezik naškoditi trenutnim pozicijama?

Ne, ako svaki jezik ima vlastiti URL, vlastiti canonical i ispravan hreflang. Uobičajena šteta dolazi od preusmjeravanja koja verziju kriju od crawlera, od canonicala koji svaki jezik usmjeravaju na engleski, ili od tankih automatskih prevoda. Ispravna druga verzija dodaje stranice. Ne zamjenjuje prvi jezik.

Kako rješavate bosanski, hrvatski i srpski?

Kada publika može da dijeli jedan pažljivo napisan ijekavski tekst, jedna BHS verzija ostaje dosljedna. To radimo na našem sajtu, a hreflang taj URL navodi za bs, hr i sr. Kada tržištu trebaju vlastite formulacije, pravni tekst ili ponuda, dobija vlastiti locale i URL. Jedan jezik nećemo cijepati u tri kopije samo da izgleda veće.

Možete li dodati jezik na postojeći sajt?

Da. Radimo audit teme, plugina i trenutnih URL-ova, pa dodajemo jezik a da ne lomimo stranice koje se već rangiraju. Tvrdo upisani stringovi u temi uobičajeno su iznenađenje. Izvlače se, umjesto da se prevode ručno unutar PHP šablona.

Da li vi prevodite sadržaj?

Postavljamo tok, rječnik termina i tehničku integraciju, i možemo pripremiti nacrte mašinskog prevoda za reviziju. Objavljena formulacija treba da dođe od nekoga ko odgovara za taj jezik, posebno tamo gdje kupac plaća ili se na tekst oslanja. Ako već imate prevodioca, radimo u njegovom formatu.

Koliko traje višejezična web stranica?

Dodavanje jednog jezika na dobro sagrađen WordPress sajt često traje nekoliko sedmica, uključujući hreflang, šablone i prvi sadržaj kroz pipeline. Veliki katalog shopa, prilagođena aplikacija ili više jezika sa krugovima revizije traju duže, jer su prevod i provjera dio roka.

Spremni da jezik dodate kako treba?

Recite nam koji jezici vam trebaju i na čemu je sajt sagrađen, a mi ćemo predložiti strukturu URL-ova, alat i tok koji vaši urednici mogu da nastave da koriste. Javite nam se da prođemo kroz to, ili pogledajte naše usluge razvoja.