Simpele taal array werkt niet
Ik heb een tijdje niet geprogrammeerd en loop nu eventjes vast.
Ik heb een functie welke mij de domein extensie doorgeeft en op basis daarvan include ik in de index.php een taalbestand daar ik 14 domeinen heb welke elk een andere taal moeten weergeven:
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function getDomainLanguage()
{
// language selector
$domain = strrchr (strtolower($_SERVER['HTTP_HOST']), ".");
$domainExtension = substr($domain, strpos($domain, '.') + 1);
switch ($domainExtension) {
case "nl":
include './languages/nl.php';
break;
case "be":
include './languages/be.php';
break;
case "com":
include './languages/en.php';
break;
default:
include './languages/en.php';
}
}
{
// language selector
$domain = strrchr (strtolower($_SERVER['HTTP_HOST']), ".");
$domainExtension = substr($domain, strpos($domain, '.') + 1);
switch ($domainExtension) {
case "nl":
include './languages/nl.php';
break;
case "be":
include './languages/be.php';
break;
case "com":
include './languages/en.php';
break;
default:
include './languages/en.php';
}
}
In het taalbestand staat een array:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
/* Dutch language configuration */
$lang = array (
'title' => "this is a title",
'welcome' => "Hello world",
'language' => "The language page is in English",
'en' => "English",
'es' => "Spanish",
'fr' => "French",
);
?>
/* Dutch language configuration */
$lang = array (
'title' => "this is a title",
'welcome' => "Hello world",
'language' => "The language page is in English",
'en' => "English",
'es' => "Spanish",
'fr' => "French",
);
?>
In een test.php bestand welke door de index geladewn wordt zou je denken dat je toegang hebt tot de taal array via: echo $lang['title']; maar helaas geeft die blanco.
Als ik rechtstreeks het taalbestand include in de test.php heb ik wel toegang, waar gaat het mis?
Mvg Furio
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
function getDomainLanguage(){
global $lang; // <-- deze toevoegen
//rest van code
}
?>
function getDomainLanguage(){
global $lang; // <-- deze toevoegen
//rest van code
}
?>
Overigens is include en globale variabelen meestal de eerste aanzet tot spaghetti (het zou bijvoorbeeld mooier zijn als de $lang een property van een object was), maar als het je probleem oplost ...
Rob Doemaarwat op 02/06/2020 12:29:05:
Je doet je include in de function getDomainLanguage(). Binnen die functie is de variabele $lang dus bekend. Daarbuiten niet. Wil je 'm erbuiten dus ook gebruiken, dan moet je:
Overigens is include en globale variabelen meestal de eerste aanzet tot spaghetti (het zou bijvoorbeeld mooier zijn als de $lang een property van een object was), maar als het je probleem oplost ...
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
function getDomainLanguage(){
global $lang; // <-- deze toevoegen
//rest van code
}
?>
function getDomainLanguage(){
global $lang; // <-- deze toevoegen
//rest van code
}
?>
Overigens is include en globale variabelen meestal de eerste aanzet tot spaghetti (het zou bijvoorbeeld mooier zijn als de $lang een property van een object was), maar als het je probleem oplost ...
Bedankt voor je reactie, dit lost het "probleem" inderdaad op! Hartelijk dank. OOP programmeren kan ik helaas niet, ik probeer het zo logisch/overzichtelijk mogelijk te houden op mijn eigen manier. Mapje met languages, functie om de taal voor het domein te pakken en de variablen gebruiken in de html voor de weergave.
Klopt het trouwens dat je wel in test.php of elk ander bestand ook de global $lang moet toevoegen alvorens het werkt?
Kan ik wel de variablen overschrijven bij een loop wat bij een constante niet werkt daarom had ik voor variablen gekozen.
Gewijzigd op 02/06/2020 12:42:55 door Furio Scripting
Als een globale variabele nog niet bestaat, dan bestaat ie direct na de global regel wel (default met een waarde null). Je hoeft 'm dus niet eerst "aan te maken" om 'm pas daarna via global binnen te kunnen harken (maar het mag/kan wel; liefst met een stukje commentaar er bij; dat is logischer dan dat ie opeens zomaar "uit de lucht komt vallen").
Furio Scripting op 02/06/2020 12:39:43:
Kan ik wel de variablen overschrijven bij een loop wat bij een constante niet werkt daarom had ik voor variablen gekozen.
Je kunt prima eerst uitrekenen wat de taal zou moeten zijn en dit dan eenmalig toekennen aan een constante?
Het berekenen van de taal en het vervolgens includen van een of meer taalbestanden staat in principe ook los van elkaar. Dit hoef je dus niet per se te combineren.
Wanneer je geen OOP gebruikt zou je ook in een soort van initialisatieroutine alles uit kunnen schrijven, voorzien van commentaar uiteraard. Hiervoor allemaal parameterloze functies introduceren, het kan, maar het voegt niet zoveel toe, want die code moet je dan vervolgens weer op andere plekken gaan zoeken.
In plaats van HTTP_HOST kun je misschien ook beter SERVER_NAME gebruiken. Alle HTTP-directives worden volgens mij verstrekt via de browser dus deze zijn niet echt 100% betrouwbaar.
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
// mapping of domain extensions to supported languages
// these language settings should be pulled from some config
$languages = array(
'nl' => 'nl',
'be' => 'be',
'com' => 'en',
);
$defaultLanguage = 'en';
$tld = substr(strrchr($_SERVER['SERVER_NAME'], '.'), 1);
$language = array_key_exists($tld, $languages) ? $languages[$tld] : $defaultLanguage;
define('MY_LANGUAGE', $language);
?>
// mapping of domain extensions to supported languages
// these language settings should be pulled from some config
$languages = array(
'nl' => 'nl',
'be' => 'be',
'com' => 'en',
);
$defaultLanguage = 'en';
$tld = substr(strrchr($_SERVER['SERVER_NAME'], '.'), 1);
$language = array_key_exists($tld, $languages) ? $languages[$tld] : $defaultLanguage;
define('MY_LANGUAGE', $language);
?>
Vervolgens kun je MY_LANGUAGE gebruiken voor het includen/requiren van (taal)bestanden.
?? operator en regular expressions en one-liners, dus ik kon het niet laten:
Maar "misschien" is bovenstaande code van Thomas toch iets duidelijker in eerste oogopslag ... ;-)
Persoonlijk ben ik nogal een fan van de Code (php)
1
define('MY_LANGUAGE',$languages[preg_replace('/^.*\\./','',$_SERVER['SERVER_NAME'])] ?? $defaultLanguage);
Maar "misschien" is bovenstaande code van Thomas toch iets duidelijker in eerste oogopslag ... ;-)
Gewijzigd op 02/06/2020 17:36:34 door Rob Doemaarwat
Gezien je spreekt over taalbestand.
ik weet niet of je het weet maar .be staat voor België en hier hebben we 3 talen
Nederlands, Frans en Duits.
Ook in Nederland zijn er 2 talen. Fries wordt nogal vergeten.
https://nl.wikipedia.org/wiki/.frl
En waarom heeft Wallonie geen eigen TLD?
https://www.dnsbelgium.be/
Dit sla je dan bijvoorbeeld op in een cookie ofzo, maar ook dat kun je opnemen / verder verwerken in de bovenstaande logica voor de taalselectie.
Code (php)
en wat doet de strpos functie voor domein.co.uk ? (gaat nog over de oorspronkelijke opzet van TS)
Adoptive Solution op 02/06/2020 18:43:48:
En waarom heeft Wallonie geen eigen TLD?
https://www.dnsbelgium.be/
https://www.dnsbelgium.be/
te gierig