Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Kielen valinta

Sivun loppuun

Auvo [22.10.2007 19:51:11]

#

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

pistemies [22.10.2007 19:58:33]

#

<?php

if($_GET['lang'] !=""){
   include("inc/teksti_".$_GET['lang'].".html");
}
else
   include("inc/teksti_english.html");
}

?>

Esimerkiksi tällä tapaa.

Antti Laaksonen [22.10.2007 20:04:22]

#

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.

Auvo [23.10.2007 12:32:54]

#

Miten saisi esim. evästeisiin tallennettua ton kielen?

tsuriga [23.10.2007 13:11:34]

#

Putkan PHP-opas. Osassa 7 käsitellään evästeitä.

Auvo [23.10.2007 14:36:11]

#

<?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ää.

T.M. [23.10.2007 14:43:14]

#

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.

Auvo [23.10.2007 14:54:52]

#

Miten saisin tuon korjattua? Olen aika aloittelija PHP:ssä eikä omat ideani ole aina kovin hyviä.. :d

Auvo [23.10.2007 15:20:57]

#

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";
?>

Opiskelija [23.10.2007 15:21:20]

#

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.

Auvo [23.10.2007 15:48:52]

#

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";
?>

tsuriga [23.10.2007 16:56:47]

#

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 ;).

Merri [23.10.2007 17:04:20]

#

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.

Auvo [23.10.2007 18:02:41]

#

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";
?>

jlaire [23.10.2007 18:15:06]

#

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:

$os = array("fi", "en");
$tekstit = file(in_array($lang, $os) ? "$lang.txt" : "fi.txt");

Auvo [23.10.2007 20:15:10]

#

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";
?>

pistemies [23.10.2007 22:44:07]

#

Onko sivun alussa ob_start() -komento?

Auvo [23.10.2007 22:49:00]

#

Ei ole, täytyykö olla?

tsuriga [23.10.2007 23:12:27]

#

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.

Auvo [24.10.2007 09:05:22]

#

Nyt toimii. :) Kiitos kaikille


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta