Moi,
Voisiko joku ystävällisesti pistää minulle koodivinkkiä kielijärjestelmää varten? Eli osoitteen perään kirjoitetaan ?lang=finnish, niin sivu näkyy suomenkielisenä.
Kiittäen,
Auvo
<?php if($_GET['lang'] !=""){ include("inc/teksti_".$_GET['lang'].".html"); } else include("inc/teksti_english.html"); } ?>
Esimerkiksi tällä tapaa.
Kirjoita sivuille tulevat tekstit eri kielillä eri tiedostoihin, esimerkiksi fi.txt, en.txt ja de.txt, seuraavasti:
Tervetuloa! Tämä sivu käsittelee... Tekijä:
Welcome! This page deals with... Author:
Willkommen! Diese Seite handelt von... Autor:
Sitten voit näyttää tekstejä PHP:llä näin:
<?php $kieli = $_GET['kieli']; $tekstit = file($kieli . ".txt"); // tulostetaan tervehdys echo $tekstit[0]; // tulostetaan sisältöä echo $tekstit[1]; // tulostetaan tekijän nimi echo $tekstit[2] . " E. S. I. Merkki"; ?>
Äskeisen sivun osoite olisi esim. sivu.php?kieli=fi.
Jos sivuilla on runsaasti tekstiä, tuo P. Mansikan tekniikka voi olla näppärämpi.
Miten saisi esim. evästeisiin tallennettua ton kielen?
Putkan PHP-opas. Osassa 7 käsitellään evästeitä.
<?php session_start(); $kieli = $_GET['lang']; setcookie("lang", "$kieli", time() + 60 * 60 * 24 * 365); $lang = $_COOKIE["lang"]; $tekstit = file($lang . ".txt"); // tulostetaan tervehdys echo $tekstit[0]; // tulostetaan sisältöä echo $tekstit[1]; // tulostetaan tekijän nimi echo $tekstit[2] . " E. S. I. Merkki"; ?>
Tommosen tein tosta Antin koodista kehitellen. Kieli kuitenkin pysyy vain n. 2 latauksen ajan? Kertokaa mikä mättää.
Varmaankin se mättää että asetat sen joka kerta sen kielen, esim jos osoiterivissä ei olekaan yhtäkkiä tuota lang muuttujaa, niin asetat kieleksi tyhjän.
Miten saisin tuon korjattua? Olen aika aloittelija PHP:ssä eikä omat ideani ole aina kovin hyviä.. :d
Sain tehtyä tämmösen googlen ja putkan avulla.. kommenttia. Koodi voi olla aika hirveetä. Vielä on ongelmana "default" kielen määritys.
<?php session_start(); if(isset($_COOKIE['lang'])){ $lang = $_COOKIE["lang"]; $tekstit = file($lang . ".txt"); } else { $kieli = $_GET['lang']; setcookie("lang", "$kieli", time() + 60 * 60 * 24 * 365); } ?> <?php // tulostetaan tervehdys echo $tekstit[0]; // tulostetaan sisältöä echo $tekstit[1]; // tulostetaan tekijän nimi echo $tekstit[2] . " E. S. I. Merkki"; ?>
Esimerkeissäkin olisi hyvä muistaa niinkin pieni asia kuin tietoturva, varsinkin kun aloittelija neuvoja kyselee. Noiden esimerkkien avulla kun pystyy lukemaan muitakin kuin pelkkiä kielitiedostoja.
Joten vaikkapa kielet arrayhun ja sitten in_array functiolla katsoa onko valittu kieli siinä. 301 esimerkistä saat toimivan pienellä muutoksella.
Nyt taas säädin jonkunlaisen mutta heittää vaan erroria:
Parse error: syntax error, unexpected '{', expecting '(' in http://*** on line 7
<?php session_start(); if(isset($_COOKIE['lang'])){ $lang = $_COOKIE["lang"]; $tekstit = file($lang . ".txt"); } elseif { $os = array("fi", "en"); if (in_array("".$GET['lang']."", $os)) { setcookie("lang", "$kieli", time() + 60 * 60 * 24 *365); } } else { setcookie("lang", "fi", time() + 60 * 60 * 24 *365); } ?> <?php // tulostetaan tervehdys echo $tekstit[0]; // tulostetaan sisältöä echo $tekstit[1]; // tulostetaan tekijän nimi echo $tekstit[2] . " E. S. I. Merkki"; ?>
Apuja!
EDIT: Muokkasin vielä ja nyt ei tule erroria, mutta vaikka osoitteessa olisi ?lang=en, tulee silti kieleksi suomi. Tämmönen:
<?php session_start(); if(isset($_COOKIE['lang'])){ $lang = $_COOKIE["lang"]; $tekstit = file($lang . ".txt"); } $os = array("fi", "en"); if (in_array("".$GET['lang']."", $os)) { setcookie("lang", "$kieli", time() + 60 * 60 * 24 *365); } else { setcookie("lang", "fi", time() + 60 * 60 * 24 *365); } ?> <?php // tulostetaan tervehdys echo $tekstit[0]; // tulostetaan sisältöä echo $tekstit[1]; // tulostetaan tekijän nimi echo $tekstit[2] . " E. S. I. Merkki"; ?>
Plussaa yrittämisestä. Joitakin huomioita:
-Et käytä sessioita, voit heivata session_start rivin pois.
-Viittaa taulukon arvoihin heittomerkeillä, ei lainausmerkeillä (eli ei $_COOKIE["lang"], vaan $_COOKIE['lang']
-Muuttujia ei tarvitse hukuttaa lainausmerkkeihin, kyllä se $kieli on merkkijono ilman, että ympyröit sen seuraavasti: "$kieli". Sama myös $_GET['lang'] in_arrayn parametrina ei vaadi lainausmerkkejä (ja tuosta puuttuu tuo alaviiva). Kaikki ulkoa tulevat syötteet ($_GET, $_POST, $_COOKIE ymsyms) ovat oletusarvoisesti merkkijonoja.
-Tuolla systeemilläsi et voi vaihtaa kieltä ennen kuin poistat keksin. Kannattaisi mieluummin aloittaa tarkastamalla, onko lang-muuttujaa asetettu URLissa.
-$tekstit pitäisi alustaa, ja siihen tulisi hakea sisältö vasta kun kieli on saatu selville.
pseudokoodina:
jos (kieli_asetettu_osoiterivillä) kieli = hae_kieli_osoiteriviltä taisittenjos (kieli_asetettu_keksissä) kieli = hae_kieli_keksistä muutoin kieli = hae_oletuskieli sisalto = lue_kielitiedosto(kieli)
Suosittelen luomaan oman testausympäristön, jossa käsket PHP-tulkkia tulostamaan kaikki virheilmoitukset, virheilmoitukset ovat joskus jopa manuaalia tarkempia kertomaan, mistä virhe löytyy. Jos serverillä on vielä PHP versio 4 niin vois olla jo aika patistaa palveluntarjoajaa päivittämään vitosversioon ;).
Myös selain kertoo kielen silloin kun se sivuja pyytelee, joten oletuksena voi ensimmäisellä kerralla katsoa sillä tavoin kielen mikä todennäköisesti kelpaa lukijalle. Toki kannattaa tarjota linkit kielen vaihtamiseksi.
Kiitos paljon tsuriga! Sain ohjeidesi perusteella väsättyä tämän seuraavan koodipätkän, mutta vielä tässä voi avata esim. asd.txt -tiedostoa kirjoittamalla index.php?lang=asd.
<?php // jos kieli on määritetty osoiterivillä, haetaan kieli osoiteriviltä if (isset($_GET['lang'])){ $lang = $_GET['lang']; $os = array("fi", "en"); if (in_array("".$_GET['lang']."", $os)) { setcookie("lang", "$lang", time() + 60 * 60 * 24 *365); // tähän joku if vielä?? en tiedä millanen } } // jos kieli on määritetty evästeissä, haetaan kieli evästeistä elseif (isset($_COOKIE['lang'])) { $lang = $_COOKIE['lang']; } // jos ei ole missään määritetään oletuskieleksi suomi else { setcookie("lang", "fi", time() + 60 * 60 * 24 *365); } $tekstit = file($lang . ".txt"); // tulostetaan tervehdys echo $tekstit[0]; // tulostetaan sisältöä echo $tekstit[1]; // tulostetaan tekijän nimi echo $tekstit[2] . " E. S. I. Merkki"; ?>
Auvo kirjoitti:
mutta vielä tässä voi avata esim. asd.txt -tiedostoa kirjoittamalla index.php?lang=asd.
Tarkistat sen ennen tiedoston lukemista:
$os = array("fi", "en"); if (in_array($lang, $os)) { $tekstit = file("$lang.txt"); } else { $tekstit = file("fi.txt"); }
Tai tiiviimmin:
Jesh! Kova yritys palkitaan ja kiitos teille! :)
EDIT: Eipäs pelitäkään.. tulee tämmönen jos vaihdan kieltä kirjoittamalla vaikka ?lang=fi: "Warning: Cannot modify header information - headers already sent by (output started at C:\***\xampp\htdocs\***\index.php:95) in C:\***\xampp\htdocs\***\index.php on line 139"
<?php // jos kieli on määritetty osoiterivillä, haetaan kieli osoiteriviltä if (isset($_GET['lang'])){ $lang = $_GET['lang']; $os = array("fi", "en"); // onko kieli sallittujen joukossa arrayssa? if (in_array("".$_GET['lang']."", $os)) { setcookie("lang", "$lang", time() + 60 * 60 * 24 *365); $tekstit = file($lang . ".txt"); } // jos kieli ei ole sallittu, muutetaan oletuskieleksi: suomi else $tekstit = file("fi.txt"); } // jos kieli on määritetty evästeissä, haetaan kieli evästeistä elseif (isset($_COOKIE['lang'])) { $lang = $_COOKIE['lang']; $tekstit = file($lang . ".txt"); } // jos kieltä ei ole vielä määritetty, luodaan uusi eväste oletuskielelle suomi else { setcookie("lang", "fi", time() + 60 * 60 * 24 *365); $tekstit = file("fi.txt"); } // tulostetaan tervehdys echo $tekstit[0]; // tulostetaan sisältöä echo $tekstit[1]; // tulostetaan tekijän nimi echo $tekstit[2] . " E. S. I. Merkki"; ?>
Onko sivun alussa ob_start() -komento?
Ei ole, täytyykö olla?
Ei täyvy. Kyllähän se poistaa ongelman, mutta et sitä tarvitse - kunhan et tulosta mitään ennen kuin asetat keksin. Ja sivun alkuunhan tämä kielen määrittely joka tapauksessa kuuluu.
Nyt toimii. :) Kiitos kaikille
Aihe on jo aika vanha, joten et voi enää vastata siihen.