Simpele taal array werkt niet

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Furio Scripting

Furio Scripting

02/06/2020 11:36:17
Quote Anchor link
Beste forumleden,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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';
    }
           }


In het taalbestand staat een array:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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",
     );

 
  
 
 ?>


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
 
PHP hulp

PHP hulp

15/07/2020 03:04:23
 
Rob Doemaarwat

Rob Doemaarwat

02/06/2020 12:29:05
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

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 ...
 
Furio Scripting

Furio Scripting

02/06/2020 12:39:43
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php

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
 
Rob Doemaarwat

Rob Doemaarwat

02/06/2020 13:11:46
Quote Anchor link
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").
 
Thomas van den Heuvel

Thomas van den Heuvel

02/06/2020 16:20:31
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
?>

Vervolgens kun je MY_LANGUAGE gebruiken voor het includen/requiren van (taal)bestanden.
 
Rob Doemaarwat

Rob Doemaarwat

02/06/2020 17:32:07
Quote Anchor link
Persoonlijk ben ik nogal een fan van de ?? operator en regular expressions en one-liners, dus ik kon het niet laten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
 
Jan R

Jan R

02/06/2020 18:18:07
Quote Anchor link
off topic
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.
 
Adoptive Solution

Adoptive Solution

02/06/2020 18:43:48
Quote Anchor link
Dan testen op .frl extensie
https://nl.wikipedia.org/wiki/.frl

En waarom heeft Wallonie geen eigen TLD?
https://www.dnsbelgium.be/
 
Thomas van den Heuvel

Thomas van den Heuvel

02/06/2020 19:37:41
Quote Anchor link
Daarom is het misschien handig om van de taal op grond van TLD af te kunnen wijken. Je zou bijvoorbeeld op een NL domein expliciet Engels in kunnen stellen.

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.
 
Rob Doemaarwat

Rob Doemaarwat

02/06/2020 22:31:35
Quote Anchor link
Of je kijkt gewoon naar $_SERVER['HTTP_ACCEPT_LANGUAGE'].
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

//HTTP_ACCEPT_LANGUAGE bij mij "nl-NL,nl;q=0.9,en-US;q=0.8,en;q=0.7"

if(preg_match_all('/[a-z]{2}/',$_SERVER['HTTP_ACCEPT_LANGUAGE'],$matches))
  foreach($matches[0] as $match) if(in_array($match,$languages)){
    $language = $match;
    break;
  }


die($language); //bij mij "nl"


?>
 
Ivo P

Ivo P

02/06/2020 23:01:27
Quote Anchor link
en wat doet de strpos functie voor domein.co.uk ? (gaat nog over de oorspronkelijke opzet van TS)
 
Jan R

Jan R

03/06/2020 22:41:09
Quote Anchor link
Adoptive Solution op 02/06/2020 18:43:48:
En waarom heeft Wallonie geen eigen TLD?
https://www.dnsbelgium.be/

te gierig
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.