Best practices voor meertalige sites

Pagina: 1
Acties:
  • 111 views sinds 30-01-2008
  • Reageer

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
Omdat dit eerder server-side is, start ik em in programming, maar eigenlijk leunt deze TS dicht aan bij SEO. Ik wil voor een vriendin een kleine website maken in het NL, FR en EN. Nu heb ik nog nooit websites in meerdere talen moeten proggen en ik wil het meteen zo goed mogelijk doen. In mijn ontwerp heb ik het taalID constant nodig en ik vroeg me nu af hoe ik dit het beste ga implementeren.

Ik heb de neiging steeds met een centrale index.php te werken waar vanalles geinclude wordt via include of functies. In deze centrale index.php staat onderstaande PHPcode. Deze wordt gevoed door een modrewrite zodat mijn urls er kunnen uitzien als /nl/ of /en/ . Op zich werkt dit nu in test-vorm.

Mijn vraag is nu: wat kan er nog beter? (want ik ben er spijtig genoeg van overtuigd dat mijn progskillz niet echt super zijn + ik zit met het gevoel dat er een conceptfout inzit, doch vind em niet meteen)

code:
1
2
3
4
5
6
7
8
# maak taal'directories'
RewriteRule ^(nl|fr|en)$               /$1/ [R]

# statische pagina's worden .html
RewriteRule ^(nl|fr|en)/(.*).html(.*)$ path/index.php?p=static&f=$2$3&language=$1 [NC,L]

# dit is voor de rest
RewriteRule ^(nl|fr|en)/(.*)$          path/$2?language=$1 [NC,L]

In PHP doe ik (voorlopig gewoon procedureel):
PHP:
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/* language-selection */
if ( isset($_GET['language']) )
{
    if ( in_array(strtolower($_GET['language']), $aLanguages, false) )
    {
        if (_DEBUG) echo '<br>language changed to '.strtolower(substr($_GET['language'], 0, 2)).' ; '.$_GET['language'];
        $_SESSION['language'] = strtolower(substr($_GET['language'], 0,2));
    }
    else
    {
        if (_DEBUG) echo '<br>error, language doesnt exist yet';
    }
}
else
{
    if (!isset($_SESSION['language']))
    {
        if (in_array(strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2)), $aLanguages, false))
        {
            if (_DEBUG) echo '<br>$_SERVER[HTTP_ACCEPT_LANGUAGE]: '.strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2));
            $_SESSION['language'] = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2));
        }
        else
        {
            if (_DEBUG) echo '<br>$preferred_language: '.strtolower(substr($preferred_language, 0,2));
            $_SESSION['language'] = strtolower(substr($preferred_language, 0,2));
        }
    }
}

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Waarom denk je dat er een conceptfout in zit als het verder gewoon duidelijk uitziet en goed werkt? Ik zou hooguit die substr voor de lengte van de taalafkorting weghalen, aangezien er later misschien wel eens een taal toegevoegd moet kunnen worden die langer is dan 2 tekens, maar goed, dat is verder conceptueel niet van invloed. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • EnsconcE
  • Registratie: Oktober 2001
  • Laatst online: 10:33
Wat gebeurt er als $_SESSION['language'] wel gezet is terwijl de $_GET['language'] niet gezet is?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Dan hoeft $_SESSION['language'] niet te wijzigen en hoeft er dus niks te gebeuren? ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
EnsconcE schreef op donderdag 21 december 2006 @ 15:51:
Wat gebeurt er als $_SESSION['language'] wel gezet is terwijl de $_GET['language'] niet gezet is?
Dan verandert de $_SESSION['language'] niet (op zich hoeft dit dan ook niet, de taal verandert dan niet). Door met de rewritemod te werken, is er steeds een $_GET['language'] (tot m'n spijt, want dat maakt het gedeelte met de sessies minder nodig).

Het grootste nadeel van mijn setup is dat je verplicht bent met een <BASE HREF="website/taalinstelling/"> element te werken:

Je komt immers meestal binnen via www.ebsi.te en dan is er dus geen rewrite naar /nl/ etc...


Om volledig te zijn, heb ik in mijn config ook opgenomen:
PHP:
1
2
3
/* language-vars */
$aLanguages = array('nl','fr','en');
$preferred_language = 'nl';


In lijn 35 heb ik ondertussen in_array(strtolower($_GET['language'])... uitgebreid met de substr-functie, aangezien het hier niet gecontroleerde input betreft én dat er veel en-US taal-instellingen zijn en dan zou ik die moeten koppelen aan één taal.

In lijn 56 heb ik ondertussen substr($preferred_language, 0,2) vervangen door $preferred_language, aangezien de functie hier geen nut heeft.

[ Voor 0% gewijzigd door moozzuzz op 21-12-2006 16:47 . Reden: -NME- is sneller dan ik :^) ]


  • wustenveld
  • Registratie: Februari 2002
  • Laatst online: 30-10 17:22
Je zou ook die rewrite er uit kunnen slopen en als een taal moet veranderen ?language=nl toevoegen aan het url via een button met van die stoere vlaggetjes. Dan hoef je ook niet persé met die base href te werken ;)

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

...wat weer als nadeel heeft dat een gebruiker geen directe links kan openen naar de juiste taal wanneer hij deze doorgestuurd krijgt via mail of iets dergelijks. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Dennahz
  • Registratie: November 2001
  • Laatst online: 27-11 08:52

Dennahz

Life feels like hell should.

-NMe- schreef op donderdag 21 december 2006 @ 19:00:
...wat weer als nadeel heeft dat een gebruiker geen directe links kan openen naar de juiste taal wanneer hij deze doorgestuurd krijgt via mail of iets dergelijks. :)
Dat kan je eventueel oplossen door de standaard taalinstelling van de browser op te vragen? Of gethostbyaddr en bij extentie .nl > nederlands, .com > engels etc. Niet helemaal perfect, maar toch voor de meeste bezoekers correct.

Twitter


Verwijderd

Dennahz schreef op donderdag 21 december 2006 @ 19:06:

Dat kan je eventueel oplossen door de standaard taalinstelling van de browser op te vragen? Of gethostbyaddr en bij extentie .nl > nederlands, .com > engels etc. Niet helemaal perfect, maar toch voor de meeste bezoekers correct.
En wat moet een zoekmachine dan precies indexeren? Is het niet een stukje handiger als een unieke URL een unieke pagina oplevert? Of beschouw je een pagina in het Engels hetzelfde als die pagina in het Nederlands?

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 18:40

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
Ik werk zelf zo:

www.site.nl/nl/titel-pagina

www.sitel.nl/eng/page-title

Waarbij 'nl' en 'eng' gewoon 2 php bestanden zijn die vrijwel hetzelfde zijn, maar een andere $language kennen :)

  • mcdronkz
  • Registratie: Oktober 2003
  • Laatst online: 16-04 12:44
We Are Borg schreef op donderdag 21 december 2006 @ 19:13:
Ik werk zelf zo:

www.site.nl/nl/titel-pagina

www.sitel.nl/eng/page-title

Waarbij 'nl' en 'eng' gewoon 2 php bestanden zijn die vrijwel hetzelfde zijn, maar een andere $language kennen :)
Dat kun je natuurlijk ook vrij eenvoudig oplossen met mod_rewrite.

Verwijderd

moozzuzz schreef op donderdag 21 december 2006 @ 16:47:
[...]
Het grootste nadeel van mijn setup is dat je verplicht bent met een <BASE HREF="website/taalinstelling/"> element te werken:

Je komt immers meestal binnen via www.ebsi.te en dan is er dus geen rewrite naar /nl/ etc...
code:
1
2
# Default taal = nl
RedirectMatch ^/$ /nl/


Beter is wel dat op basis van Accept-Language te doen; dat kan Apache misschien (waarschijnlijk) ook wel, anders laat je de eerste redirect door een PHP script doen.

  • We Are Borg
  • Registratie: April 2000
  • Laatst online: 18:40

We Are Borg

Moderator Wonen & Mobiliteit / General Chat
mcdronkz schreef op donderdag 21 december 2006 @ 21:55:
[...]


Dat kun je natuurlijk ook vrij eenvoudig oplossen met mod_rewrite.
Daar heb je gelijk in :)

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:03
Ik vind het positief dat mensen toch steeds vaker ook een Nederlandse versie in een /nl subdirectory stoppen. Zo houd je rekening met de toekomst en krijg je niet van die inconsistente taaldirectories (nl direct in de root, en engels in een subdir 8)7 ).

  • japaveh
  • Registratie: Maart 2003
  • Laatst online: 18:21

japaveh

Jield BV

Ikzelf werk met een $lang variabele die via multiviews en mod_rewrite vanuit de url elke keer wordt aangeroepen. De mod_rewrite wordt nu alleen gebruikt om de index.php weg de writen. Multiviews regelt de rest. In de PHP code wordt de juiste pagina samengesteld aan de hand van de waarde van $_GET['lang']

zeg maar: http://www.website.tld/index.php?lang=nl&page=blaat... wordt dus: http://website.tld/nl/blaat

Zo krijg je dus inderdaad elke keer een unieke URL naar elke pagina waarbij de indruk wordt gewekt dat alles in een eigen sub-directory wordt gezet. Dat is enerzijds beter voor zoekmachines maar ook voor mensen die een URL willen mailen naar iemand.

Verder werkt ik dus met meedere taal-versies in de database en vaste tekstfiles (bv lang.nl.php, lang.fr.php en lang.en.php) waarin de meest voorkomende woorden zijn opgelsagen. Het gaat dan bijvoorbeeld om formulierinformatie als naam, adres etc.

Solo Database: Online electronic logbook and database system for research applications

Pagina: 1