Yritän saada yksinkertaiselle sivustolle tuen monelle eri kielelle. Toteutan tämän käännöstiedostoilla, jotka ovat seuraavan tyyppisiä:
0;;teksti 0;#; 1;;teksti 1;#; 2;;teksti 2;#; 3;;teksti 3;#;
Eli ";#;" erottaa eri tekstiosiot ja ";;" tekstit ja niiden järjestysnumerot toisistaan. Seuraava funktio ladataan joka tiedoston alussa:
<?php /* tähän tulee myöhemmin tarkistus, joka valitsee oikean kielen cookien, IP:n tai jonkin muun tiedon perusteella. testauksessa käytän vain englantia: */ $i18n_lang = "english"; $i18n_filename = "i18n/" . $i18n_lang . ".dat"; $i18n_file = fopen($i18n_filename, "r"); $i18n_data = fread($i18n_file, filesize( $i18n_filename ) ); fclose( $i18n_file ); $i18n_data = explode(";#;", $i18n_data); function translation( $id ) { $text = ""; $i = 0; while( $i < count($i18n_data) ) { $tmp = explode(";;", $i18n_data[$i]); if( $tmp[0] == $id ) { $text = $tmp[1]; $i = count($i18n_data); } // end if $i++; } // end while return $text; } // end function ?>
Ja jokaisen tekstinpätkän sijasta sivuilla käytetään seuraavanlaista tekstin tulostustapaa:
<?php echo translation(1); ?>
Onglema tietenkin on jotta mikkään ei toimi :P huomaatteko jotain virhettä tai olisiko muita vinkkejä?
Kirjoita funktion alkuun:
global $i18n_data;
Funktion ulkopuoliset muuttujat täytyy määritellä näin, jotta niitä voi käyttää.
Tässä on hieman tehokkaampi toteutus, jossa kaikki käännökset siirretään taulukkoon $translation. Tässä taulukossa sanan numero on suoraan taulukon indeksi, jolloin käännöksiä voi hakea suoraan taulukosta.
// laitetaan käännökset taulukkoon for ($i = 0; $i < count($i18n_data); $i++) { $osat = explode(";;", $i18n_data[$i]); $translation[trim($osat[0])] = $osat[1]; } // näytetään käännös 1 echo $translation[1];
Tietysti käännöksen voi hakea myös funktion kautta, joka käyttää samaa taulukkoa.
Loistavaa. Kerkesinkin jo tehdä hieman testailuja ja totesin että jostain syystä tuo $i18n_data ei hyppää funktion sisään... ilmankos ei antanut virheilmoitustakaan :) Paljon kiitoksia!
Aihe on jo aika vanha, joten et voi enää vastata siihen.