multilanguage
Ik ben bezig met multilanguage.
het vertalen gaat goed.
maar ik loop nu tegen een probleem aan.
in een array staan wat woordjes die ik wilt vertalen.
maar hij vertaald ze niet:
Code (php)
lang.nl.php
Code (php)
1
2
3
2
3
define('LANG_MENU_HALLO', 'Hallo');
define('LANG_MENU_DOEI', 'Doei');
define('LANG_MENU_AUTO', 'Auto');
define('LANG_MENU_DOEI', 'Doei');
define('LANG_MENU_AUTO', 'Auto');
dit is alleen maar even om te testen.
maar hij doet het niet.
hij zegt gewoon:
LANG_MENU_HALLO
als ik dit doe:
dan zegt hij Hallo
hoe kan ik dit het beste doen?
Maar het is vrij onzinnig en niet doordacht om dit met constanten te doen want je kan ook met functies gewoon er voor zorgen dat van auto Auto gemaakt wordt...
Kijk eens of je dit niet kunt doen met 1 of meerdere array's
http://nl.php.net/manual-lookup.php?pattern=uc&lang=en
en bekijk bij de uc functies dan ook wat er nog meer is onder het kopje "See also"
Gewijzigd op 08/10/2010 18:17:26 door Noppes Homeland
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$lang = 'nl';
if ($lang == 'nl') {
$teksten = Array("Welkom op mijn website ".$user['naam'], "Dit is een voorbeeld");;
} else {
$teksten = Array("Welcome to my website ".$user['naam'], "This is an example");
}
$user = mysql_fetch_assoc(mysql_query("SELECT naam FROM gebruikers WHERE id = 1"));
echo $teksten[0];
?>
$lang = 'nl';
if ($lang == 'nl') {
$teksten = Array("Welkom op mijn website ".$user['naam'], "Dit is een voorbeeld");;
} else {
$teksten = Array("Welcome to my website ".$user['naam'], "This is an example");
}
$user = mysql_fetch_assoc(mysql_query("SELECT naam FROM gebruikers WHERE id = 1"));
echo $teksten[0];
?>
Dan krijg je gegarandeerd een fout, want $user['naam'] is bovenaan nog niet gedeclareerd.
Noppes Homeland op 08/10/2010 18:15:38:
Zoek dan eens op php.net hoe je een string omzet naar hoofdletters!
Maar het is vrij onzinnig en niet doordacht om dit met constanten te doen want je kan ook met functies gewoon er voor zorgen dat van auto Auto gemaakt wordt...
Kijk eens of je dit niet kunt doen met 1 of meerdere array's
http://nl.php.net/manual-lookup.php?pattern=uc&lang=en
en bekijk bij de uc functies dan ook wat er nog meer is onder het kopje "See also"
Maar het is vrij onzinnig en niet doordacht om dit met constanten te doen want je kan ook met functies gewoon er voor zorgen dat van auto Auto gemaakt wordt...
Kijk eens of je dit niet kunt doen met 1 of meerdere array's
http://nl.php.net/manual-lookup.php?pattern=uc&lang=en
en bekijk bij de uc functies dan ook wat er nog meer is onder het kopje "See also"
Misschien moet je gewoon effe het topic doorlezen of effe naar de code kijken?
Dit gaat totaaaaaaaaal niet over hoofdletters o.i.d.
@TS-er: Als je per se constanten wilt gebruiken, kijk dan naar constant, define, language.constants, language.constants.syntax.
Maar ik denk dat multidimensionele arrays handiger is in gebruik.
Jij gaat er blijkbaar vanuit dat de waarden altijd in hoofdletters de array staan.
-> en dus verwijs ik naar omzetten naar hoofdletters omdat je constanten in prinicpe altijd in hoofdletters definieerd.
En om van de waarden die in de array staan nu via een define om te zetten naar eerste karakter een hoofdletter en de restklein, is in dit geval ook nog eens omslachtig, gezien het feit hoe de define gedeclareerd staat. Een vertaling NL naar EN is onmogelijk op deze manier. In dit geval kan je net zo goed door de array fietsen en en ucfirst eroverheen halen, dan heb je hetzelfde effect.
Maar ja, je bent gelukkig toch nog ergens mee eens, het feit dat multidimensionele arrays handiger in gebruik zijn.
Ik snap echter niet helemaal het antwoord op mijn vraag.
ik heb ook het volgende geprobeerd:
Maar dat werkt ook niet.
hoe kan ik dat werkend maken?
Quote:
Jongens, graag geen ruzie :)
Daar moet je maar overheen lezen... maar ja, er kunnen soms zinige opmerkingen tussen zitten.
Hoe je dit werkende krijgt, wel Karl heeft links gegeven 1 daarvan geeft de oplossing.
Maar ja, het advies is: gebruik multidimensionele arrays
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$languages = array();
$languages['nl']['HALLO'] = 'Hallo';
$languages['en']['HALLO'] = 'Helo';
$vertaalwoord = 'HALLO';
echo isset($languages['nl'][$vertaalwoord]) ? $languages['nl'][$vertaalwoord] : 'Het gezochte woordt kan niet vertaald worden';
echo isset($languages['en'][$vertaalwoord]) ? $languages['en'][$vertaalwoord] : 'Het gezochte woordt kan niet vertaald worden';
$vertaalwoord = 'NIET';
echo isset($languages['nl'][$vertaalwoord]) ? $languages['nl'][$vertaalwoord] : 'NL: Het gezochte woord kan niet vertaald worden';
echo isset($languages['en'][$vertaalwoord]) ? $languages['en'][$vertaalwoord] : 'EN: Het gezochte woord kan niet vertaald worden';
?>
$languages = array();
$languages['nl']['HALLO'] = 'Hallo';
$languages['en']['HALLO'] = 'Helo';
$vertaalwoord = 'HALLO';
echo isset($languages['nl'][$vertaalwoord]) ? $languages['nl'][$vertaalwoord] : 'Het gezochte woordt kan niet vertaald worden';
echo isset($languages['en'][$vertaalwoord]) ? $languages['en'][$vertaalwoord] : 'Het gezochte woordt kan niet vertaald worden';
$vertaalwoord = 'NIET';
echo isset($languages['nl'][$vertaalwoord]) ? $languages['nl'][$vertaalwoord] : 'NL: Het gezochte woord kan niet vertaald worden';
echo isset($languages['en'][$vertaalwoord]) ? $languages['en'][$vertaalwoord] : 'EN: Het gezochte woord kan niet vertaald worden';
?>
foutje eruit gehaald....++
Gewijzigd op 08/10/2010 19:55:33 door Noppes Homeland
http://php.net/manual/en/book.gettext.php
Met het programma poEdit kun je gemakkelijk je PHP code indexeren en alle teksten in de functie _('tekst') laten vervangen met een vertaling.
Misschien heb je er wat aan.
PS: let wel goed op dat je je locale settings goed hebt staan.
Noppes Homeland op 08/10/2010 19:39:34:
Maar de ergste fout laat je staan.
Zal is kijken of ik de t eruit kan krijgen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
class Language
{
protected $data;
protected $language;
public function __constrcut(array $data, $language)
{
$this->data = $data;
$this->setLanguage($language);
}
public function setLanguage($language)
{
if(!isset($data[$language]))
throw new Exception('Language '.$language.' not found');
$this->language = $language;
}
public function get($key)
{
if(!isset($this->data[$this->language][$key]))
return null;
$args = func_get_args();
// Verwijder de key
array_shift($args);
// Zie documentatie op php.net
return vsprintf($this->data[$this->language][$key], $args);
}
}
// En dan de toepassing:
$array = array(
'nl' => array(
'greet' => 'Hallo %s!' // Kijk voor de %* codes bij de docs van printf
),
'en' => array(
'greet' => 'Hi %s!'
)
);
$lang = new Language($array, 'nl');
echo $lang->get('greet', 'Pim');
?>
class Language
{
protected $data;
protected $language;
public function __constrcut(array $data, $language)
{
$this->data = $data;
$this->setLanguage($language);
}
public function setLanguage($language)
{
if(!isset($data[$language]))
throw new Exception('Language '.$language.' not found');
$this->language = $language;
}
public function get($key)
{
if(!isset($this->data[$this->language][$key]))
return null;
$args = func_get_args();
// Verwijder de key
array_shift($args);
// Zie documentatie op php.net
return vsprintf($this->data[$this->language][$key], $args);
}
}
// En dan de toepassing:
$array = array(
'nl' => array(
'greet' => 'Hallo %s!' // Kijk voor de %* codes bij de docs van printf
),
'en' => array(
'greet' => 'Hi %s!'
)
);
$lang = new Language($array, 'nl');
echo $lang->get('greet', 'Pim');
?>
Gewijzigd op 09/10/2010 16:46:53 door Pim -
Ok bedankt ik ga even het een en ander proberen :)
en dan zou je bijvoorbeeld zoiets kunnen krijgen.
language/lang_nl.php
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$dictionary = array(
['description_that_makes_sense'] => 'Beschrijving die ergens op slaat',
['another_one_that_makes_sense'] => 'Nog een die ergens op slaat'
);
?>
$dictionary = array(
['description_that_makes_sense'] => 'Beschrijving die ergens op slaat',
['another_one_that_makes_sense'] => 'Nog een die ergens op slaat'
);
?>
language/lang_en.php
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$dictionary = array(
['description_that_makes_sense'] => 'Beschrijving die ergens op slaat',
['another_one_that_makes_sense'] => 'Nog een die ergens op slaat'
);
?>
$dictionary = array(
['description_that_makes_sense'] => 'Beschrijving die ergens op slaat',
['another_one_that_makes_sense'] => 'Nog een die ergens op slaat'
);
?>
language/lang.php
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$allowed = array('nl', 'en');
$standard = 'en';
//Hier bepaling van de taal, nu maar even iets gedaan
$current = 'nl';
if (in_array($current, $allowed))
{
include 'lang_'. $current .'.php';
} else {
//eventuele fout melding voor verkeerde taal (hack poging misschien)
include 'lang_'. $standard .'.php';
}
?>
$allowed = array('nl', 'en');
$standard = 'en';
//Hier bepaling van de taal, nu maar even iets gedaan
$current = 'nl';
if (in_array($current, $allowed))
{
include 'lang_'. $current .'.php';
} else {
//eventuele fout melding voor verkeerde taal (hack poging misschien)
include 'lang_'. $standard .'.php';
}
?>
En dan kan je dus gewoon ed lang.php includen, en bij alles wat je echo doet, $dictionary['omschrijving'] gebruiken.