[PHP] Constanten veranderen.

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:19
Ik wilde een inleiding schrijven, maar dat stuk tekst werd zo erg lang dat ik alles heb proberen samen te vatten:

Ik heb een groot aantal gedefineeerde constanten. De inhoud van deze constanten is afhankelijk van de ingestelde taal.
Nu is het noodzakelijk dat ik sommige gedefineeerde constanten veranderd kunnen worden.
Maar ja, zoals de naam 'constante' al zegt, is dit niet te veranderen. :)

Ik heb ook geprobeerd om i.p.v. constanten alles variabel te maken. Maar dan zit ik met het probleem dat ik met elke functie honderden variabelen moet meegeven of met global toe moet wijzen.
Dit is zeer omslachtig en zal tienduizenden regels code extra opleveren. :(
Hoe doen de grote websites dat ?

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

Verwijderd

Kun je een klein voorbeeldje geven van wat je bedoelt

Het is nu erg abstract

Acties:
  • 0 Henk 'm!

  • hanneshoffie
  • Registratie: November 2005
  • Laatst online: 19-05-2022
wat dacht je van een dbase. Met bv een aantal velden en veld 1 is woord 1 en in die rij zet je gwoon de verschillende talen.(I)
1. hoi hello gutentag
2.
enz.

Acties:
  • 0 Henk 'm!

  • mocean
  • Registratie: November 2000
  • Laatst online: 04-09 10:34
Als je het in een array zet: $language['accesname']='iets';

dan hoef je bij elke functie maar 1 var global te nemen!

Koop of verkoop je webshop: ecquisition.com


Acties:
  • 0 Henk 'm!

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Meertaligheid? In JSP doen we dat met properties files. In die files staan key/value paren en in je pagina leg je een key neer. Afhankelijk van de locale van de browser, wordt de juiste properties file ingelezen.

Fat Pizza's pizza, they are big and they are cheezy


Acties:
  • 0 Henk 'm!

  • semicolon
  • Registratie: Mei 2004
  • Niet online
Definieer de constanten pas als je weet wat de inhoud is/wordt. Wijzigen kan inderdaad niet, en anders zul je waarschijnlijk inderdaad vele regels krijgen die niet nodig zijn.

- definieer constanten die ook echt constant zijn
- definieer constanten met informatie die opgehaald wordt ergens (DB, file, je neus etc.)
- controleer of de constanten van 'stap 2' bestaan, en zo nee geef ze een standaard waarde.

Zoiets zou denk ik het beste zijn (ben ook wel benieuwd mochten er betere manieren zijn). Het werkt voor mij in elk geval prima.

Zelf zie ik trouwens het nut niet in om constanten te gebruiken voor teksten die afhankelijk zijn van een taal, hier is gettext toch ideaal voor?

[ Voor 13% gewijzigd door semicolon op 02-09-2006 20:39 ]

:D/-<


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 21-09 13:59

DexterDee

I doubt, therefore I might be

Ik heb dit al eerder een keer gepost, hieronder een mogelijke oplossingsrichting voor meertalige variabelen:

index.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
/**
Hoofdscript gebruikmakend van taalafhankelijke variabelen
*/

// haal de language= parameter op uit de url, bestaat deze niet, dan standaard engels
$language = isset($_GET['language']) ? $_GET['language'] : 'english';

// haal de taalspecifieke php op met vertalingen
require("includes/language/{$language}/lang_main.php") or die('Gekozen taal bestaat niet!');

echo $lang['title'];
echo $lang['summary'];


includes/languages/dutch/lang_main.php
PHP:
1
2
3
4
5
/**
Nederlandse taal variabelen
**/
$lang['title']='Dit is mijn titel';
$lang['summary']='Samenvatting';


includes/languages/english/lang_main.php
PHP:
1
2
3
4
5
/**
Engelse taal variabelen
**/
$lang['title']='This is my title';
$lang['summary']='Summary';


includes/languages/german/lang_main.php
PHP:
1
2
3
4
5
/**
Duitse taal variabelen
**/
$lang['title']='Dieses ist meine Titel';
$lang['summary']='Zusammenfassung';


includes/languages/french/lang_main.php
PHP:
1
2
3
4
5
/**
Franse taal variabelen
**/
$lang['title']='C\'est mon titre';
$lang['summary']='Sommaire';


oproepen met:
index.php?language=dutch
index.php?language=english
index.php?language=german
index.php?language=french


of gewoon:
index.php

LET OP: dit is slechts een voorbeeld en zet de taal van de querystring direct in de include. Dit is nauurlijk niet veilig en moet omgeschreven worden naar een veilige methode.

Een taal erbij is een peulenschil. Gewoon in je includes/languages/ folder een nieuwe taal folder maken, PHP bestand(en) kopieren van een bestaande taal folder en aanpassen (vertalen) naar de nieuwe taal.

Als je site heel groot wordt, kun je naast lang_main.php nog specifiekere lang_* php's maken. Deze kun je dan selectief includen, zodat het allemaal snel en overzichtelijk blijft.

Nu hoef je alleen de $lang global te maken in classes en functies en je hebt alle taalafhankelijke variabelen voorhanden...

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:19
Ik heb het nu op de manier zoals DexterDee beschrijft. Afhankelijk van een gekozen taal (of de taal van het besturingssysteem) include hij het bijbehorende .php-bestand. Maar ik gebruik nu de 'define'-functie.

Maar ik zie dat het met een array met namen ook kan en dan de array-variable doorgeven.
(Ik heb #@&^%$*@#%^& vele uren zitten zoeken op diverse fora en php.net en na een post op tweakers heb ik binnen 5 minuten al het antwoord. _/-\o_ )
Bedankt. De array is dé oplossing voor mijn probleem. :)

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 21-09 13:59

DexterDee

I doubt, therefore I might be

Als aanvulling nog, je kunt natuurlijk meerdimensionele arrays gebruiken:
PHP:
1
2
3
4
$lang['homepage']['title']='Titel';
$lang['homepage']['description']='Beschrijving';
$lang['newuser']['name']='Naam';
$lang['newuser']['password']='Wachtwoord';


En als je later nog iets wil wijzigen, gebruik dan bijv. sprintf:
PHP:
1
$lang['newuser']['validation_empty_field']='Veld %s kan niet leeg zijn!';

en dan met:
sprintf( $lang['newuser']['validation_empty_field'], $fieldname )
de juiste waarde(n) erin zetten. Zo hoef je niet de oorspronkelijke waarde te herschrijven in de array :)

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Een constante is toch CONSTANT dezelfde waarde :?

Als je een constante VARIABEL maakt is het geen constante meer (maar een variabele )

Oftewel als je dit implementeert ben je fundamenteel verkeerd bezig imo :) (de verkeerde functionaliteit ergens voor gebruiken)

[ Voor 4% gewijzigd door SchizoDuckie op 02-09-2006 22:14 ]

Stop uploading passwords to Github!


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:19
@SchizoDuckie:
In het begin wilde ik de site in 1 taal. Daarna dacht ik dat het misschien ook handig was om de site ook in het Engels weer te geven voor de buitenlandse bezoekers.
Het gevolg was dat ik 2 php-bestandjes (voor elke taal 1) had aangemaakt waar in elk woord of zin gedefiniëerd was. Dit ging tot zover goed.

Nu had ik (om veel rekentijd te besparen) een stukje code geschreven die een deel van een site genereerde en dan opsloeg als een .htm-bestandje. Echter dit was in de debetreffende taal. Ik wilde dat stuk site in 1 keer genereren in alle talen.
En toen ontstond dit probleem dat ik de gedifiniëerde woorden wilde kunnen veranderen voor een andere taal. Vandaar deze titel. Ik wist niet hoe ik dat anders zou kunnen neerzetten.

Ik heb nu alles in die site aangepast volgens het voorbeeld DexterDee en dat werkt uitstekend. :) Nogmaals bedankt.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 13-07 01:14
Je kunt toch ook gewoon een aantal taalbestanden aanmaken (bijvoorbeeld 'en-us.php', 'nl-dut.php', of wat dan ook) en daar een lijst van defines inzetten, die al de verschillende teksten definieren.

Vervolgens in je code word het taalbestand ge-include afhankelijk van de gekozen taal. Het enige wat dan nog variabel is, is dus het taalbestand wat ge-include wordt.

bv

PHP:
1
2
3
4
// Neerlandsch.php

define ('WELCOME_MSG', 'Welkom bij deze site!');
define ('GOODBYE_MSG', 'De mazz0l');


PHP:
1
2
3
4
//English.php

define ('WELCOME_MSG', 'Welcome to this site!');
define ('GOODBYE_MSG', 'l8r d00d');


En dan in je index (of waar dan ook)

PHP:
1
2
3
$lang = isset($_GET['lang']) ? $_GET['lang'] : 'english';

require_once "lang/{$lang}.php");


(slechts een voorbeeld, kan nog wel beter.)

Maar je begrijpt wel wat ik bedoel. Ik heb een tijdje een veel te complex CMS gebruikt voor een website die deed het ook zo.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

imo de beste manier voor multi-language is door gewoon gettext te gebruiken, daar is het voor gemaakt ;)

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
^^ :) Kan je dan lekker vanuit een admin gedeelte je hele site vertalen.

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Onbekend
  • Registratie: Juni 2005
  • Laatst online: 23:19
@YopY:

Quote van mijn startpost:
Nu is het noodzakelijk dat ik sommige gedefineeerde constanten veranderd kunnen worden.

Ik had inderdaad alles gedefinieerd. Maar op een gegeven moment moest ik omschakelen naar een andere taal.

Speel ook Balls Connect en Repeat


Acties:
  • 0 Henk 'm!

Verwijderd

Een mooie oplossing is natuurlijk iets als een LocalizedMessageProvider class, waaraan je LocalizedMessageSource classes kunt toevoegen. Hoe die classes dan intern werken is niet zo belangrijk. Dat kan met een database, met flatfiles, met gettext, met xml bestanden, wat je maar wilt.

Wat wel duidelijk moet zijn, is dat je geen constanten moet gaan definieren voor deze taken als je flexibiliteit wilt. Ik zou op de plekken waarin je een taal-specifieke tekst nodig hebt een method call plaatsen. Wat er dan aan "de andere kant van de lijn" hangt is dan in elk geval niet meer belangrijk.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Hacku schreef op zondag 03 september 2006 @ 16:31:
^^ :) Kan je dan lekker vanuit een admin gedeelte je hele site vertalen.
:?
Wat heeft een admin gedeelte hiermee te maken?

Acties:
  • 0 Henk 'm!

Verwijderd

Erkens schreef op zondag 03 september 2006 @ 19:08:

:?
Wat heeft een admin gedeelte hiermee te maken?
Niets. In theorie kun je in een admin gedeelte elke mogelijke resource wel aanpassen. Wat dat betreft heeft dat dus niets met het "probleem" te maken.

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op zondag 03 september 2006 @ 19:14:
[...]

Niets. In theorie kun je in een admin gedeelte elke mogelijke resource wel aanpassen. Wat dat betreft heeft dat dus niets met het "probleem" te maken.
precies, dus waarom dat nu aangehaald is mij een raadsel :)
Wat wel een voodeel is op dat punt is dat er voor gettext al enorm veel van dat soort tools te vinden zijn waardoor je ook op dat punt het wiel niet meer rond hoeft te maken.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Erkens schreef op zondag 03 september 2006 @ 19:08:
[...]

:?
Wat heeft een admin gedeelte hiermee te maken?
Niks :?

March of the Eagles


Acties:
  • 0 Henk 'm!

Verwijderd

Erkens schreef op zondag 03 september 2006 @ 19:17:

Wat wel een voodeel is op dat punt is dat er voor gettext al enorm veel van dat soort tools te vinden zijn waardoor je ook op dat punt het wiel niet meer rond hoeft te maken.
Dat is zo, maar gettext is niet gericht op het eenvoudig dynamisch aan kunnen passen van teksten. Neemt niet weg dat ik gewoon wat abstractie in de implementatie zou aanbrengen zodat je niet meer de code hoeft in te duiken om iets aan te passen. Een method laten uitzoeken welke tekst hij moet hebben (en eventueel in welke taal dat dan moet) lijkt me voor de lange termin handiger. Op die manier kun je bijvoorbeeld een melding kunnen laten aanpassen in een bestand of database met een CMS, en de gettext bestanden als "fallback" gebruiken, de standaard meldingen dus.
Pagina: 1