Hvordan ha to språk på nettsiden?

halvors

New Member
Hei!

Er det noen somvet åssen jeg lager to språk på nettsiden min?
Ikke bare lage to nettsider med forskjellig text men ha noen egene språkfiler.

Hva er den enkleste måten?

Halvor.
 
Den metoden jeg benytter er å lagre all tekst i egne PHP-variabler som jeg setter inn i stedet for teksten, og så inkluderer jeg ulike dokumenter som inneholder alle disse variablene på riktig språk.

Et enkelt eksempel: Du lager en fil spraak-engelsk.php og en fil spraak-norsk.php. indexfila di kan da se slik ut:

Kode:
<?php
if ($_GET['spraak'] == 'engelsk') {
$spraak = 'engelsk';
}
else {
$spraak = 'norsk';
}

include('spraak-'.$spraak.'.php');
echo '<h1>'.$lang['tittel'].'</h1>';
echo '<p><a href="index.php?spraak=engelsk">'.$lang['engelsk'].'</a> | <a href="index.php">'.$lang['norsk'].'</a></p>';
echo '<p>'.$lang['introduksjonstekst'].'</p>';
?>

Da vil scriptet hente riktig fil hvor du har lagret all teksten, og sette inn teksten der du trenger den. Og så lager du språkfiler som f.eks. kan se slik ut:

spraak-norsk.php:
Kode:
<?php
$lang['tittel'] = 'Pavens fiskebutikk';
$lang['introduksjonstekst'] = 'Velkommen til Pavens fiskebutikk! Jeg er en vaskeekte pave, og jeg driver altså en fiskebutikk. Spesialiteten min er laks, men jeg har også torsk, gullfisk og sølvfisk. Stikk innom Kaigata 24, Vatikanstaten, så sees vi!';
$lang['engelsk'] = 'Engelsk';
$lang['norsk'] = 'Norsk';
?>

spraak-engelsk.php:
Kode:
<?php
$lang['tittel'] = The Pope's Fish Shop';
$lang['introduksjonstekst'] = 'Welcome to the Pope's Fish Shop! I'm a genuine Pope, and I run a fish shop. My specialty is salmon, but I also stock cod, goldfish and silverfish. Drop by Kaigata 24, the Vatican. See you there!';
$lang['engelsk'] = English';
$lang['norsk'] = 'Norwegian';
?>

Du kan selvsagt ha så mange språkvariabler du bare vil. Grunnen til at jeg putter disse uttrykkene i en array (et triks jeg har lært av phpBB) er to: Jeg slipper å ta opp hundrevis av variabler til dette formålet, og jeg trenger ikke å stresse med å globalisere akkurat de riktige variablene dersom jeg trenger å bruke tekst inni en funksjon.

Lykke til, si fra om noe av dette ble uklart.
 
Sist redigert:

halvors

New Member
Ja, er det mulig og lage med et script?

Hvordan, kan jeg skille mellom norske lesere og utenlandske?
 

michaelo

Medlem
Heisann Halvors,

Det er et par faktorer som må taes med i betraktningen, men en mye brukt metode er som følgende (eksempler taes i PHP):

Du må bestemme deg for et hovedspråk, og skrive alt innholdet på siden. Hver selvstendig setning/stikkord må så "wrappes" i en funksjon som har som rolle å skrive ut i korrekt språk (la oss kalle den "gettext()" ).
HTML:
<h1>Products</h1>
erstattes til:
<h1><?php echo gettext("Products"); ?></h1>

Det gettext() da trenger å gjøre er å slå opp denne tekststrengen i den valgte språkfilen, finner den oversatte teksttrengen, og returnerer denne. Fordelen med å ha en egen funksjon til dette, og ikke slå direkte opp i et array vil være mtp feilhåndtering - hva skal skje om du spør om en tekst-streng som ikke finnes? Sett at jeg ikke har noen oversettelse for "Products" på norsk, så kan det være en løsning å faktisk bare returnere original-strengen - og kanskje logge en notis slik at det er lett for utvikleren å finne ut hvor det mangler oversettelser.

Så nå må du ha en språkfil for alle språk du ønsker utover originalspråket, og disse må da inneholde de originale teksttrengene samt en kobling til de oversatte.

Sett at hovedspråket er engelsk, og vi ønsker en norsk språkfil så vil den kunne være slik:
HTML:
Products
Produkter

Contact
Kontakt
- det vil være greit å holde denne i et format som er lett parse-bart til å legge i et array hvor indeksen er originalstrengene, og verdiene er de oversatte.

(olafmoriarty nevner en god løsning med å bruke arrays direkte i språkfila, og på den måten vil det være godt nok å inkludere den. Her er det stort sett kun snakk om preferanser.)

Den neste casen er da å finne ut hvilken språkfil som skal lastes inn, her har du forskjellige måter - men kan nevne tre vanlige scenarier:

1)
Sørge for at alle sider har en parameter som blir dynamisk satt:
http://example.com/index.php?lang=no

2)
http://example.com/no/index.php
http://example.com/en/index.php

Her kan du f.eks bruke en mod-rewrite (eller tilsvarende) for å omdirigere trafikken til å gå til "index.php?lang=en", og vi kan sjekke $_GET["lang"].

3)
Sette en cookie avhengig av brukervalg.


Men om du i tillegg til statisk innhold har dynamisk innhold i form av f.eks artikler så kan du være nødt til å ha forskjellige tabeller/databaser også, og evt sørge for at spørringene blir tilpasset det valgte språket. Her avhenger det av om hver eneste artikkel skal være tilgjengelig i alle språk, eller om sidene kommer til å leve litt uavhengige av hverandre.

Relevant lesning:
Gettext
Wikipedia om I18n og L10n
CakePHP's implementasjon
 
Ja, er det mulig og lage med et script?

Hvordan, kan jeg skille mellom norske lesere og utenlandske?

Det er mulig -- du får scriptet til å sjekke hvilken IP-adresse brukeren sitter på, og så bruker du en geolocation-database for å gjøre om den IP-adressen til hjemland.

Jeg har ingen førstehåndskunnskap med geolocation og har derfor ingen direkte anbefalinger å komme med, men det ser ut som om denne er 99 % riktig og helt gratis. (Betalløsninger finnes det sannsynligvis mange og bedre av). Der er det bare å laste ned databasen deres og legge inn i din egen MySQL-base, og så kan du kjøre et script for å finne ut om IP-adressen befinner seg i Norge, og gi norske brukere en norskspråklig side.

Vil likevel anbefale deg å gi folk valgmuligheten: Det er mange i Norge som ikke skjønner norsk, og det hender også at IP-en lyver, så la brukerne velge.
 

michaelo

Medlem
Når det gjelder å kunne skille mellom norske lesere og utenlandske så kan du bl.a teste mot HTTP-headeren accept-language, den inneholder informasjon om brukerens språk-preferanser som satt opp i nettleseren.

Andre måter er å teste hvor IP'en kommer fra, eller om du har forskjellige URL'er som peker til samme site (som nevnt i eksempelet over).

EDIT: olafmoriarty tok innersvingen på meg med den =)
 

david.

Medlem
Bruk Smarty (smarty.net) istedenfor masse variabler i html'en og opprett egne tekstfiler for hver språk. Dermed inkluderer du riktig fil akkurat som olafmoriarty nevnte.

Eksempel:

php:

<?php
//finner ut hvilken språk brukerens nettleser er satt til
$lang = getenv("HTTP_ACCEPT_LANGUAGE");
$lang = substr($lang, 0, 2);

//hvis nettleseren er satt til norsk (no) blir filen no.php inkludert, hvis ikke blir en.php (engelsk)inkludert som er satt som "default"
switch ($lang):

case 'no':
include ('no.php');
break;

default :
include ('en.php');

endswitch;

//Smarty
include ('Smarty.class.php');
$smarty = new Smarty;

//gir hver "variabel" sine attribbuter
$smarty -> assign('tittel', $lang['tittel']);
$smarty -> assign('introduksjonstekst', $lang['introduksjonstekst']);

//all html blir lagret i template.tpl, her kaller vi på akkurat denne filen og viser innholdet
$smarty -> display('template.tpl');
?>

html (template.tpl):

<html>
<head>
<title>{$tittel}</title>
</head>
<body>
<h2>{$introduksjonstekst}</h2>
</body>
</html>

Du må selvfølgelig installere Smarty.
 
Andre måter er å teste hvor IP'en kommer fra, eller om du har forskjellige URL'er som peker til samme site (som nevnt i eksempelet over).
Godt poeng. Jeg lanserer en firespråklige portal til våren, og måten jeg har valgt å løse dette på helt praktisk på (og nå forventer jeg at alle som kan litt mer om SEO enn meg skal brøle at dette er en dårlig idé) er å ha fire ulike domenenavn. En utrolig enkel måte å gjøre det på -- da sjekker jeg bare verdien i $_SERVER['SERVER_NAME'] og velger en språkfil basert på informasjonen som ligger der.
 

halvors

New Member
olafmoriarty, hvordan kan jeg bruke språkoppsettet du viste over inni et php include script?

Nå må jeg skrive index.php?page=home for og komme til home. hvordan kan jeg bruke index.php?lang=no da når jeg allerede har bruke en $_GET i index fila?

Halvor.
 
halvors, for å bruke flere get-variabler skriver du bare f.eks.
index.php?spraak=norsk&page=home
som URL. & mellom variablene, altså.

Et tilleggstips som michaelo også kom med over er at du i tillegg lager en .htaccess-fil, slik at du kan sende brukerne til f.eks. domene.com/no/home/, og så oversetter serveren det automagisk til en URL-streng med alle variablene intakt.
 
Du putter inn riktig språkvariabel rett i linken -- for eksempel ved å skrive

Kode:
echo '<a href="index.php?spraak='.$spraak.'&page=home">'.$lang['meny_home'].'</a>';

-- altså, at den variabelen som definerer språk putter du inn i rett i språkvariabelen i URL-en. Det fører til at dersom brukeren ser på den norske siden får hun linker til norske undersider, og dersom hun ser på den engelske siden får hun linker til engelske undersider.

For knapper: Usikker på hva du mener, men: Knappeteksten putter du i språkfilene som all annen tekst:

Kode:
echo '<input type="submit" value="'.$lang['knapp_submit'].'" />';

Skjemamål løser du ved å putte inn variabelen i URL-en i form action:

Kode:
echo '<form method="post" action="index.php?page=bestilling&spraak='.$spraak.'">';
 

halvors

New Member
Et lite problem med dette scriptet:

<?php
if($_GET['lang']=="en") {
$language="en";
}
else {
$language="no";
}
include('language/'.$language.'.php');
?>

Jeg får en feilmelding: Notice: Undefined index: lang in C:\Documents and Settings\Halvor\Skrivebord\hvalstaddata.no\index.php on line 4

Hvordan kan jeg fikse det?

Halvor
 
Topp