PHPPamokos.lt


13. Parengimas vertimui į kitas kalbas

Namų darbai

Praėjusio skyriaus namų darbas buvo pakeisti deaktyvacijos kablį į šalinimo kablį ir ištrinti ne tik nustatymus, bet ir įskiepio meta laukus. Tuo tikslu tinyRelated v0.10.1 versijoje regsiter_deactivation_hook() buvo pakeista į register_uninstall_hook() (33 eilutė), atitinkamas tinyRelated klasės metodas pervadintas iš deactivate() į uninstall() (51 eilutė). Meta laukų panaikinimui naudojama WordPress funkcija delete_metadata(), kurią kiekvienam naikinamam laukui reikia išviesi atskirai. Kadangi tinyRelated naudoja tris meta laukus, todėl ir funkciją iškviečiame tris kartus (55-57 eilutės).

Įskiepio paruošimas vertimui

WordPress turi vidinę sistemą, kurios pagalba, galima nesunkiai išversti įskiepius, temas ir branduolį į kitas kalbas. Tam naudojama Gettext biblioteka ir įrankiai - vadinamosios i18n (žodžio „internationalization“ trumpinys: i+ 18 raidžių + n) funkcijos.

Paprastos teksto eilutės verčiamos naudojant __( $string, $textdomain ) ir _e( $string, $textdomain ) funkcijas. Šios funkcijos viena nuo kitos skirasi tik tuo, kad __() tekstą grąžina (galima priskirti kintamajam), o _e() - iš karto spausdina su echo.

Naudojimas - labai paprastas - tiesiog visos verstinos teksto eilutės įskiepyje yra apskliaudžiamos į šias funkcijas. Pavyzdžiui

$result = 'Tekstas turi būti išverstas';
// pavirsta į
$result = __( 'Tekstas turi būti išverstas' );

echo 'Kitas tekstas';
// verčiama į
_e( 'Kitas tekstas' );

Jei WordPress konfiguracijoje yra numatyta kita kalba, o vertimų failuose aptinkamas tokios eilutės vertimas, WordPress jį ir parodys vietoj orginalaus teksto. Pagal mūsų ankstesnį pavyzdį vietoj 'Tekstas turi būti išverstas' bus parodyta 'This text has been transalted', o vietoj 'Kitas tekstas' - 'Other text' ar panašiai.

Daugiskaita

Neretai būna tokių kodo eilučių, kurių formuluotė priklauso nuo to, ar apie vieną, ar daugiau objektų kalbame - "1 komentaras" bet „2 komentarai“ ir 10 „komentarų“. Tokiu atveju į pagalbą pasitelkiamos daugiskaitos formų funkcijos.

Paprasta daugiskaita formatuojama naudojant _n() funkciją, kuri turi 4 argumentus:

  • $singular - vienaskaitos forma
  • $plural - daugiskaitos forma
  • $number - skaičius, pagal kurį reikia parinkti reikalingą formą
  • $textdomain

Pavyzdžiui:

echo _n( 'comment', 'comments', get_comments_number() );

Jei komentaras yra vienas - išspausdins 'comment', kitu atveju - 'comments'. O jeigu įjungėme lietuvių kalbą ir išvertėme - atitinkamai 'komentaras', 'komentarai' arba 'komentarų'. Kaip matome, lietuvių kalboje skaitinių formų yra daugiau (3), nei anglų (2) - Gettext biblioteka ir tuo pasirūpins.

Yra ir kitas, sudėtigesnis daugiskaitos formų vaizdavimo būdas, kai daugiskaitos formos yra suformuojamos iš anksto. Jis praverčia, kai ta pati teksto eilutė naudojama daugelyje vietų - tuomet išverstas formas galima išsaugoti į masyvą ir jį vėliau panaudoti daugelį kartų.

Tuo atveju daugiskaitos formos yra paruošiamos naudojant ( _n_noop( $singular, $plural, $domain ) funkciją, o panaudojampos translate_nooped_plural( $nooped_plurals, $number, $domain ) funckijos pagalba. Pavyzdžiui:

$nooped_comments = _n_noop( 'comment', 'comments' );
// POST #1
echo translate_nooped_plural( $nooped_comments, get_comments_number() );
...
// POST #2
echo translate_nooped_plural( $nooped_comments, get_comments_number() );
...
// POST #3
echo translate_nooped_plurual( $nooped_comments, get_comments_number() );

Šis pavyzdys išspausdina trijų skirtingų įrašų komentarų skaičių, panaudodamas tuos pačius sugeneruotus vertimus.

Kontekstas

Verčiant tekstus, dažnai būna svarbus kontekstas, nes, ypač anglų kalboje, dažnai tas pats žodis gali būti naudojamas tiek kaip daiktavartis, tiek kaip veiksmažodis. O kitose kalbose tam dažnai naudojamos skirtingos formos. Kadangi Gettext verčiamus tekstus lygina paraidžiui, „Post“ („Skelbti“) ir „Post“ („Įrašas“) bus suprantamas kaip viena ir ta pati teksto eilutė. Norint jas atskirti, naudojamos kontekstinės funkcijų __(), _e(), _n() bei _n_noop() formos - atitinkamai _x( $string, $context, $textdomain ), _ex( $string, $ncontext, $textdomain ), _nx( $singular, $plurual, $number, $context, $textdomain ) bei _nx_noop( $singular, $plural, $context, $textdomain ). $context kintamajam priskiriant skirtingas reikšmes, galima atskirti skirtingus „Post“ naudojimo būdus. Pavyzdžiui:

_e( 'Post', 'noun' );
_e( 'Post', 'verb' );

Šiuo atveju Gettext leis abu „Post“ versti atskirai - vieną kaip „Įrašas“, kitą - kaip „Skelbti“.

Komentarai vertėjams

Kartais iš verčiamos eilutės nelabai aišku, kas čia yra verčiama ir kokios dalys turėtų išlikti nepakeistos. Programuotojas gali vertėjui palikti specialiai suformuotą komentarą, paaiškinantį santrumpas, specialius simbolius ir panašiai. Pavyzdys:

// translators: this is a comment for translator
__('some ambigous text')

Svarbu, kad komentaras būtų paskutinis prieš vertimo funkciją ir prasidėtų translators:. Daugelis vertimo programų (poEdit ir pan.) tokius komentarus atpažins ir parodys vertėjui, verčiant atitinkamą eilutę.

Textdomain

Visos aukščiau minėtos funkcijos turi papildomą paskutinį parametrą $textdomain, kuris iki šiol buvusiuose pavyzdžiuose buvo ignoruojamas. Šis parametras skirtas vertimo failų skaidymui į modulius. Kiekvienas įskiepis ir išvaizdos tema turi turėti savo textdomain ( geriausiai - tokį patį kaip pavadinimas ) pagal kurį būtų galima atskirti, kad šie vertimai yra skirti būtent šitam įskiepiui ar temai.

Įskiepio textdomain deklaruojamas jo antraštėje pridedant eilutę Text domain: pluginname ir prie kablio plugins_loaded prikabinant kreipimąsi į funkciją load_plugin_textdomain(). Ši funkcija turi 3 argumentus:

  • $textdomain - įskiepio textdomain reikšmė
  • $deprecated - nenaudotinas nuo WordPress 2.7 versijos
  • $relative_path - reliatyvus kelias iki kalbų failų katalogo, pradedant nuo WP_PLUGIN_DIR.

Pavyzdys:

/* 
Plugin Name: My Plugin
Text Domain: my-plugin
*/

add_action( 'plugins_loaded', 'myplugin_load_textdomain' );
function myplugin_load_textdomain() {
  load_plugin_textdomain( 'my-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/langs' ); 
}

.po/.mo failai

Kalbų failų kataloge bus sudėti vertimo failai. Kiekvienai kalbai bus reikalingi du failai - tuo pačiu pavadinimu, bet skirtinga galūne - .mo ir .po. .po - darbinis failas, kurį galima atsidaryti su vertimo programa (poEdit) ar panašia ir redaguoti, o .mo - sukompiliuotas failas, paspartinantis vertimo procesą.

Pradinį vertimo .po failą galima sugeneruoti daugeliu būdų. Man labiausiai patinka naudoti poEdit programos grafinę sąsają.

  1. Parsisunčiate ir įsidiegiate poEdit.
  2. Sukuriame naują katalogą: File > New Catalog...
  3. Užpildome projekto informaciją. Plural forms pasirinkimas priklauso nuo kalbos į kurią verčiate. Lietuvių kalbai šiame lauke reiktų rašyti tokį kodą: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);. Trupmai tariant, čia parašyta, kad lietuvių kalboje yra trys skaitinės formos - vienaskaita, ir du daugiskaitos variantai, bei taisyklės, kada kuri forma naudojama. Mums dar pasisekė - arabų kalba turi 6 (!) skaitines formas. Jei jums reikalingas kitos kalbos kodas, čia yra labai geras sąrašas.
  4. Nurodote, kur failų sistemoje yra verčiamo įskiepio išeities tekstai.
  5. Nurodote visas panaudotas Gettext funkcijas, kuriose reikia ieškoti teksto eilučių.
  6. Spaudžiate OK ir išsaugote failą pavadinimu pagal formatą {textdomain}-{language}.po. Pavyzdžiui: tinyrelated-lt_LT.po
  7. Programa automatiškai atrenka visus kodo gabaliukus, išsaugokite failą dar kartą ir galite imtis vertimo.

Pastabos

Jeigu reikia versti tekstus JavaScript failuose, susipažinkite su tam skirta wp_localize_script() funkcija.

Tekstus rašykite tvarkinga anglų kalba, kiek įmanoma - be žargonų ir sutrumpinimų. Versti visada geriau frazes, o ne atskirus žodžius, nes skirtingose kalbose gali skirtis žodžių tvarka frazėje. Tačiau skaidykite tekstą paragrafais - susijusius sakinius sujunkite, bet nedarykite didelių teksto fragmentų.

Stenkitės tekstuose palikti kuo mažiau technino kodo - HTML elementų ir pan. Kintamųjų reikšmes, URL adresus ir pan informaciją į tekstą geriausiai įterpti per placehoder'ius ir naudoti tokias funkcijas kaip printf() galutiniam foratavimui. Primenu, kad skirtingų kalbų sakinių struktūra skiriasi, todėl placeholder'ius reikėtų numeruoti. Jei naudojate placeholder'ius, palikite komentarą, ką kuris iš jų reiškia - vertėjui %1$s nelabai ką nors sako.

Nepalikite tarpų teksto fragmentų pradžioje/pabaigoje. Jei įmanoma, skyrybos ženklus teksto pradžioje ir pabaigoje palikite ne vertimui, kad nebūtų dviejų atskirų frazių 'Post' ir 'Post:'.

tinyRelated v0.11.0

Taigi, tinyRelated įskiepio kūrimas artėja prie pabaigos. v0.11.0 yra daug mažų pakeitimų - visame tinyrelated.php faile reikėjo į reikiamas funkcijas apskliausti verčiamus teksto gabaliukus. Daugiausiai naudota paprasta __() komanda, tačiau buvo kelios vietos, kur tas pats tekstas (Related Posts) buvo naudojamas skirtinguose kontekstuose - kaip sąrašo antraštė, redaktoriaus lango skydelio ir nustatymo pavadinimas, todėl buvo naudojama konteksto funkcija _x() ir vertimo komentarai (165-166, 239-240, 268-269 eilutės).

Žinoma, taip pat reikėjo nustatyti textdomain bei vertimų katalogą įskiepio antraštėje bei naudojant load_plugin_textdomain() funkciją (atitinkamai 5-6 ir 80 eilutės).

Namų darbai

Norint pabaigti paruošimą vertimui dar reikia išversti options.php bei widget.php failus. Užduotis namams - surasti ir apskliausti reikiamomis funkcijomis visus likusius teksto gabaliukus.



(c) 2015-2018. Visais klausimais kreipkitės povilas@laraveldaily.com