Toon posts:

[DISC] Hoe applicatie internationaliseren?

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

Verwijderd

Topicstarter
Ik wil mijn (PHP) applicatie in meerdere talen aanbieden. Ik weet dat ik binnen PHP gebruik kan maken van gettext. Hierbij schrijf je in de code zelf volledige zinnen en haal je een eventuele vertaling uit een .po bestand:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function foo($input = array(), $key = null) {
  if (!isset($input)) {
    set_message(_('Er was geen input gegeven'));
    $cache = cache_get("input:$key");

    if ($cache == 0) {
      refresh_cache();
      $cache = cache_get("locale:$key");
      set_message(_('Data stond niet in het cache. Cache is nu aangemaakt, zodat de applicatie volgende keer sneller werkt'));
    }
    $output = unserialize($cache->data);
  }
  return $output;
}

Het voordeel is dat de code meteen een soort van gedocumenteerd wordt door deze zinnen. Het nadeel is, dat als je lange zinnen hebt, je code erg onderbroken wordt. Een andere mogelijkheid is dan om de strings te vervatten in sleutelbenamingen en deze sleutels in een array uit te werken tot zinnen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$t = array(
  'NO_INPUT_GIVEN' => 'Er was geen input gegeven',
  'DATA_NOT_IN_CACHE' => 'Data stond niet in het cache. Cache is nu aangemaakt, zodat de applicatie volgende keer sneller werkt'
);

function foo($input = array(), $key = null) {
  if (!isset($input)) {
    set_message(_('NO_INPUT_GIVEN'));
    $cache = cache_get("input:$key");

    if ($cache == 0) {
      refresh_cache();
      $cache = cache_get("locale:$key");
      set_message(_('DATA_NOT_IN_CACHE'));
    }
    $output = unserialize($cache->data);
  }
  return $output;
}

Voordeel is compactere code, nadeel is minder informatie in de code over de werking. Ook heb ik gemerkt dat de sleutel soms langer is dan de sting zelf:
PHP:
1
2
3
4
5
6
7
$t = array(
  'SYSTEM_BAR' => 'Bar!'
);

function system_foo() {
  echo _('SYSTEM_BAR');
}

Dat is ook weer onhandig. Welke methode gebruik jij? (Of gebruik je nog een andere methode). Waarom gebruik je die methode?

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Ik vermoed dat je best je afkortingen kan gebruiken als standaardtaal in gettext, zodat je het beste van gettext en de kortere labels kunt combineren.

Rustacean


  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 05-11 09:42

JHS

Splitting the thaum.

Code moet je in mijn ogen documenteren met comments, en niet met de teksten die op het scherm van de gebruiker landen. Die laatste zijn volgens mij ook vaak een simplificatie van wat er gebeurt. Hierdoor ontstaat het risico dat je informatie over de werking van je code weg gaat laten. Ik ben zelf dus veeleerder geneigd om een language array / object te maken :) .

DM!


Verwijderd

Topicstarter
Ik heb een aantal open source projecten bekeken om te zien wat nou de meest gebruikte manier is. Als we hele strings in de code manier A noemen en keywords in de code manier B, kun je de volgende indeling maken:

Manier A:
  • MovableType
  • Drupal
  • EZ Publish
  • Wordpress
Manier B:
  • Sugar CRM
  • PHP-Nuke
  • Plone
  • PHPMyAdmin
  • phpBB

Hieruit zou je kunnen afleiden dat de ene manier niet absoluut beter is dan de andere. Vooralsnog denk ik dat het vooral een keuze is die gebaseerd wordt op voorkeuren, niet omdat het ene nou heel veel sneller of bug-vrijer is dan de andere manier.

Iemand hier nog iets aan toe te voegen? Waarom heb jij voor de ene of andere manier gekozen?

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 05-11 09:42

JHS

Splitting the thaum.

Mijn vorige post was niet erg volledig, aangezien het vooral een negatie van een van de vermeende voordelen van de helestring-methode is. Desalniettemin neig ik persoonlijk naar een language array / object. Ik vind het niet de verantwoordelijkheid van een functie / class om te bepalen hoe een error message woordelijk in elkaar zit, maar veeleerder van de presenterende kant. Maar uiteindelijk denk ik dat je volledig gelijk hebt dat het vooral een voorkeur-iets is.

DM!


Verwijderd

Topicstarter
JHS schreef op zondag 04 maart 2007 @ 16:19:
[...] Ik vind het niet de verantwoordelijkheid van een functie / class om te bepalen hoe een error message woordelijk in elkaar zit, maar veeleerder van de presenterende kant[...]
Dat vind ik een valide argument. Als code gescheiden dient te worden van markup, behoren daar ook user-messages bij.

Waar ik alleen wat van baal, is het feit dat je in een beetje applicatie zo'n hoeveelheid grote en kleine strings hebt, dat het keyword soms langer is dan de string zelf (zie openingspost). De code wordt er dan eerder onoverzichtelijker door, dan overzichtelijker. En dat vind ik ook een belangrijk punt om naar te kijken...

  • CubicQ
  • Registratie: September 1999
  • Laatst online: 07:48
Ik denk niet dat je code onoverzichtelijker wordt van langere strings. Je code wordt er ook niet onoverzichtelijker van als je methode-namen langer dan 8 characters gebruikt :)

Wat imho wel van belang is is dat je de codes structureert. Bijvoorbeeld door de code te prefixen met het object waar de string betrekking op heeft, en een aantal algemene prefixes (cache, database, input, etc.). Daarnaast de waarden van de codes in een extern bestand zodat de teksten herbruikbaar zijn over je code-bestanden heen. Verder is het parametriseren van je teksten ook wel handig, dan hoef je niet elke keer dezelfde tekst te typen.

  • raoulduke
  • Registratie: Oktober 2003
  • Niet online

raoulduke

Get in!

Als je kijkt naar de code van phpGroupware dan zie je dat ze daar nog een ander systeem gebruiken: alle strings en vertalingen zijn opgenomen in de backend database. Op zich is daar wel wat voor te zeggen: PHP hoeft niet alle strings tig keer in het geheugen te hebben en je kan redelijk eenvoudig extra strings en talen toevoegen.

Remember, if you have any trouble you can always send a telegram to the Right People.


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 09:13

MueR

Admin Devschuur® & Discord

is niet lief

Het nadeel van je vertalingen in een database, is de hogere load op je database server indien de pagina druk bezocht wordt. Je zou een XML file kunnen gebruiken, met daarin de vertalingen. Zoals al eerder gezegd, het is een kwestie van voorkeur

Anyone who gets in between me and my morning coffee should be insecure.


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Manuzhai schreef op zondag 04 maart 2007 @ 09:44:
Ik vermoed dat je best je afkortingen kan gebruiken als standaardtaal in gettext, zodat je het beste van gettext en de kortere labels kunt combineren.
Erm, en wat nou als er geen definitie is voor die afkorting, i.e. geen vertaling is voor die afkorting. Dan valt gettext toch terug op die afkorting, en geeft die weer afaik. Kun je dan niet beter gewoon bij english human readable strings blijven, zodat in het ergste geval teruggevallen wordt op die engelse string.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 27-11 20:42
Ik heb in een vrij groot programma (zeg 50.000 regels code, al zegt dat niet zoveel natuurlijk) een systeem opgezet voor internationalisering. Alleen voor het vertalen van teksten in de UI overigens, er komt nog meer kijken bij 'echte' i18n natuurlijk (denk aan datums, tijdzones... het kan zo lastig als je zelf wil... en wat dacht je van telwoorden: 1 bericht, twee berichten is al lastig, en er schijnen talen te zijn waar ze tot een stuk of 5 verschillende 'meervouden' hebben...).

Anyway wat ik heb: per string roep ik een functie TL(keyword) aan, dus TL("browser_page_not_found") met inderdaad een prefix om aan te geven op welk onderdeel het van betrekking is. Voor het bijhouden van de onderlinge verschillen tussen de taalfiles maak ik een van de lijsten mijn 'hoofd'-taal waarin ik meteen de strings toevoeg als ik ze gebruik in de code (op dit moment de Nederlandse). Met een script laat ik dan uitzoeken welke er nog ontbreken in de andere taalbestanden en voeg ik die toe :)

Wat ik maar wil zeggen is dat er meer bij komt kijken dan je denkt... Het steeds ophalen van die taalstrings is overigens wel traag natuurlijk, maar met een nette hashtable is het wel op te lossen. Het steeds aanspreken van de database introduceert extra tijd door de latency tussen database-server (ook al is het localhost) en je web-server, het parsen van de query, het uitvoeren etc... dat kun je zelf dus een stuk efficienter maken door gewoon (in het geval van PHP) een bestand weg te schrijven met daarin een array "key" => "string" per taal. Per taal een bestand maken en dat includen afhankelijk van de taalkeuze lijkt mij het meest performant eigenlijk... :)

Verwijderd

Topicstarter
raoulduke schreef op zondag 04 maart 2007 @ 23:04:
Als je kijkt naar de code van phpGroupware dan zie je dat ze daar nog een ander systeem gebruiken: alle strings en vertalingen zijn opgenomen in de backend database. Op zich is daar wel wat voor te zeggen: PHP hoeft niet alle strings tig keer in het geheugen te hebben en je kan redelijk eenvoudig extra strings en talen toevoegen.
Het gaat me in deze discussie niet zozeer om hoe je eea zou willen opslaan alswel of je human readable strings of afkortingen in je code wilt gebruiken :) Maar als het daar dan toch over gaat, ben ik het eens met MisterData (moet ook wel met zo'n username ;) ):
MisterData schreef op maandag 05 maart 2007 @ 11:58:
Per taal een bestand maken en dat includen afhankelijk van de taalkeuze lijkt mij het meest performant eigenlijk... :)
Ik denk overigens dat naarmate je applicatie uitgebreider wordt, het minder makkelijk wordt om unieke keywords te verzinnen. Een oplossing hiervoor is natuurlijk om elk keyword bv. met de module naam te laten beginnen, maar dan heb je wel kans op een hoop diplicaten:
code:
1
2
FORUM_BUTTON_SUBMIT = 'Verstuur bericht'
ARTICLE_BUTTON_SEND = 'Verstuur bericht'
CubicQ schreef op zondag 04 maart 2007 @ 17:45:
[...] Verder is het parametriseren van je teksten ook wel handig, dan hoef je niet elke keer dezelfde tekst te typen.
Wat bedoel je met "parametriseren van je teksten"?

[ Voor 12% gewijzigd door Verwijderd op 05-03-2007 18:33 ]


  • MisterData
  • Registratie: September 2001
  • Laatst online: 27-11 20:42
Verwijderd schreef op maandag 05 maart 2007 @ 18:31:
[...]

Ik denk overigens dat naarmate je applicatie uitgebreider wordt, het minder makkelijk wordt om unieke keywords te verzinnen.
Als je twee taalstrings hebben die hetzelfde keyword zouden moeten hebben moet je volgens mij gaan nadenken of die twee strings niet hetzelfde 'bedoelen'. Als dat zo is moet je ze samenvoegen. Ik heb hier een programma dat gebruik maakt van veel plug-ins; iedere plug-in heeft z'n eigen vertaalbestanden. Door het hele programma door wordt het begrip 'tijdbalk' gebruikt, ik hoef in die gevallen niet steeds plugin1_timeline, plugin2_timeline etc te maken, maar ik maak gewoon een 'gedeeld' bestand met één key 'timeline' erin :)

In het voorbeeld dat je geeft zou je kunnen kiezen voor een algemene key 'send' of 'save' ("Bericht opslaan" is duidelijk genoeg voor zowel een forumpost als een artikel) maar aangezien er kennelijk een verschil tussen is zijn twee verschillende keys gerechtvaardigd: save_forum_post en save_article, ofzo :)

Ik hou er zelf overigens van om als key een verkorte versie van de Engelse tekst te pakken, dus edit_forum_post in plaats van forum_post_edit_button_text of iets dergelijks. Als je dan gaat vertalen blijft de 'bedoeling' van het origineel tenminste nog enigszins behouden :)
Wat bedoel je met "parametriseren van je teksten"?
Ik vermoed dat hij templating bedoeld. Iets in de richting van:

code:
1
2
3
Beste $geslacht $achternaam,

Graag bevestigen we uw bestelling met nummer $nummer. Uw pakketje is op de post gedaan en zal naar verwachting op $datum aankomen.


Dat is ook bij i18n aan de orde (en bij ingewikkeldere teksten ontkom je daar misschien niet eens aan), maar voor het doel van de TS lijken me statische strings genoeg :)

[ Voor 18% gewijzigd door MisterData op 05-03-2007 22:23 ]


  • CubicQ
  • Registratie: September 1999
  • Laatst online: 07:48
MisterData schreef op maandag 05 maart 2007 @ 22:19:

Ik vermoed dat hij templating bedoeld. Iets in de richting van:

code:
1
2
3
Beste $geslacht $achternaam,

Graag bevestigen we uw bestelling met nummer $nummer. Uw pakketje is op de post gedaan en zal naar verwachting op $datum aankomen.


Dat is ook bij i18n aan de orde (en bij ingewikkeldere teksten ontkom je daar misschien niet eens aan), maar voor het doel van de TS lijken me statische strings genoeg :)
Idd. Zie bijvoorbeeld http://struts.apache.org/...tring,%20java.lang.Object[])

Je gebruikt in je voorbeeld voor je parameters argumenten die niet meertalig zijn, maar het krachtige is juist dat je ook parameters kan gebruiken die zelf ook weer meertalig zijn.

[ Voor 13% gewijzigd door CubicQ op 06-03-2007 19:53 . Reden: Ik geef het op, ik kan gewoon niet overweg met het plaatsen van URL's op GoT :) ]


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

SchizoDuckie

Kwaak

CubicQ schreef op dinsdag 06 maart 2007 @ 19:48:
[...]


Ik vermoed dat hij templating bedoeld. Iets in de richting van:

code:
1
2
3
Beste $geslacht $achternaam,

Graag bevestigen we uw bestelling met nummer $nummer. Uw pakketje is op de post gedaan en zal naar verwachting op $datum aankomen.
Daar heb je toch de equivalenten voor van sprintf :?

Stop uploading passwords to Github!


Verwijderd

MueR schreef op maandag 05 maart 2007 @ 00:00:
Het nadeel van je vertalingen in een database, is de hogere load op je database server indien de pagina druk bezocht wordt. Je zou een XML file kunnen gebruiken, met daarin de vertalingen. Zoals al eerder gezegd, het is een kwestie van voorkeur
nee dat geeft een leuke load op je server, telkens die XML gaan parse kost denk ik heel wat meer cpu-cycles dan een paar extra query's over een database verbinding die er toch al is. nog maar niet te spreken over I/O die je op je filesysteem neerlegt.

XML != database en moet dan ook niet als dusdanig worden gebruikt.

@TS
Ik denk dat het belangrijkste is dat je je presentatie-laag gescheiden houdt van de applicatie laag. dus als het goed is heb je al een functie die verantwoordelijk is voor het presenteren van tekst op het scherm zoniet maak er een.

bijvoorbeeld een functie die 2 parameters heeft, 1 is de tekst en de 2 de 2-letterige taal-code. dan plaats je voor elke $tekst een 5 letterige code gevolgt door een punt-comma bijvoorbeeld.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 print_lang("12335; Oke dit is dus een test tekst die naar de user moet", "nl"); 

 functie print_lang($tekst_raw, $taal)
 {
  // check of we geldige waarde's hebben ontvangen

  list($tekst_id, $tekst) = explode(";", $tekst_raw, 2);
  trim($tekst_id);
  trim($tekst);

   // je hebt nu de volgende variable
   // $tekst_id welke de tekst identificeert
   // $tekst welke de meegegeven tekst bevat
   // $taal welke aangeeft in welke taal de meegegeven tekst is.
   
     // verwerk code en e.v.t mysql backend hier.

  return true;
 }


vervolgens kun je in een backend zoals een mysql database de vertaling ophalen en weergeven of doorsturen naar de werkelijke weergave functie. ook kun je het zo maken dat bijvoorbeeld alleen de $tekst_id al genoeg is zodat ook e.v.t spell foutjes worden gecorriceer bijgegaan door een E_USER_NOTICE zodat je je code kunt verbeteren.

ook zou je met % tekens en patterns de waarden kunnen invoegen in ander tallen zodat bijvoorbeeld "Kan bestand php.pdf niet openen" waarbij je dan in je backend opslaat "Kan bestand %f niet openen" met als vertaling "Failed to open file %f.". je script kan dan bijvoorbeeld automatische het 3e woord in de nederlandse melding vervangen met het 5e woord in de engelse vertaling zodat ook waardes in andere talen automatische worden ingevoegd.

meede daarom gebruik je een 5 alphanumerieke code aan het begin van elke aanroep zodat het script weet dat "Kan bestand php.pdf niet openen" en "Kan bestand gtk.pdf niet openen" het zelfde bericht zijn met een andere waarde. mogelijk zou je ook een pattern kunnen gebruiken om het verschill te vinden maar dan weet je script niet meer dat "Failed to open file php.pdf" en "Kan bestand gtk.pdf niet openen" eigenlijk het zelfde bericht zijn en dus de zelfde vertaling gebruiken.

een database kan handig zijn in dit geval maar een oplossing met simpele comma-delimitted tekst-file's werkt zeker ook goed. gewoon voor elke taal 1 bestand met voor elke stukje tekst dat vertaald moet worden 1 regel. vergeet dus niet line-breaks te escapen. en dan op elke regel het formaat: tekst_id;optie1;optie2;vertaling;

dit soort bestanden zijn snel in te leezen en hoef je eigenlijk alleen maar te exploden en klaar. alleen als het erg veel vertalingen gaat, zeg >100Kb dan kan een database sneller zijn ook omdat die middels slimme caching de antwoorden in het geheugen houden en je script dus niet alle vertaalingen in het geheugen hoeft te houden en bij elke page-view opnieuw moet inlezen.

ik denk dat dit de meest gebruikte methode is of een variant in deze richting. en zoals altijd hangt het heel erg af van wat je precies wilt vertallen. als het om een keer 100 statische zinnen gaat dan is soms de tekst file optie zinvoller of gewoon een search&replace op de broncode maar als het om meer dan 100 zinnen gaat of zinnen waar ook variable waarde's in voorkomen dan wordt het lastig en werkt de bovenstaande methode veel flexiebeler ook omdat je elke mogelijke taal kan toevoegen, zeker als je gebruik maakt van de multi-byte extensie voor niet westerse tekens in je presentatie laag.

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Ik gebruik zelf includes met language.$taal.inc.php. Hierin staan dan strings in deze layout:
PHP:
1
2
3
4
5
6
7
8
9
10
11
$language['news']['edit_article'] = 'Bewerk artikel';
$language['news']['delete_article'] = 'Verwijder artikel';
$language['news']['restore_article'] = 'Herstel verwijderd artikel';

$language['forms']['post'] = 'Plaatsen';
$language['forms']['edit'] = 'Bewerken';
$language['forms']['apply'] = 'Toepassen';
$language['forms']['preview'] = 'Voorbeeld';

$language['news']['not_found'] = 'Het door u opgevraagde artikel (%s) is niet gevonden.';
$language['news']['locked'] = 'Het door u opgevraagde artikel (%s) is gesloten voor reacties.';


Deze worden dan via een functie die onder andere deze code bevat aangeroepen:
PHP:
1
2
3
4
5
6
7
8
9
if (isset($language[$category][$item])) {
    $localizedstring = $language[$category][$item];
} else {
    $localizedstring = '';
}

if ($replace) {
    $localizedstring = str_replace('%s', $replace, $localizedstring);
}


Vast wel voor verbetering vatbaar, maar voor mij werkt het prima.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Verwijderd

Topicstarter
Mijn voorkeur gaat denk ik toch uit naar het gebruik van human readable strings in de code zelf. Dit, omdat ik met dat je dan tijdens het programmeren ook wat houvast hebt aan deze strings. Ze "documenteren" immers de code ook iets.

Ik heb alleen wel een vraag hierover. Kortgezegd zou het systeem dan zo werken:
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
function foo($var) {
  echo t("The '%s' settings are updated", array('%s' => $var));
  echo t('Happy surfing!');
}

function t($key, $args) {
  if ($t = get_lang()) {
    $string = $t[$key];
  }
  else {
    $string = $key;
  }

  if (!$args) {
    return $string;
  }
  else {
    return strtr($string, $args);
  }
}

function get_lang() {
  switch (setting_get('language')) {
    case 'nl':
      $t = // get language array from file or database
      return $t;
      break;
    default:
      return null;
  }
}

En de nederlandse language file:
PHP:
1
2
$t["The '%s' settings are updated"] = "De instellingen van '%s' zijn geupdate";
$t["Happy surfing!"] = "Surf vrolijk verder!";

Kortgezegd: engelstalige strings staan in de code. Telkens als er een string naar de client gepushed moet worden, kijkt get_lang() welke taal er voor deze user is ingesteld. Als dit engels is, wordt de string uit de code gebruikt. Als dat bv. Nederlands is, wordt de matchende string uit de language file geplukt.

Of deze methode programmeertechnisch de beste is, daar valt over te discussieren. Immers is er geen strikte scheiding tussen code en vorm (in dit geval taal). Wat dat betreft is het beter om in de code keywords te gebruiken:
PHP:
1
2
3
4
5
function foo($var) {
  echo t('SETTINGS_UPDATED', array('%s' => $var));
}

$t['SETTINGS_UPDATED'] = 'De instellingen zijn geupdate';

Maar deze methode vind ik minder gebruiksvriendelijk. En ik vind het gewoon raar dat voor veel kleine strings, het keyword groter zal zijn: FORUM_BUTTON_SUBMIT voor "Verzenden" ofzo. Ook is de context voor de vertaler duidelijker: de key van de language array legt in het engels precies uit wat er vertaald moet worden. Wel vraag ik me af: de key's in de language arrays gaan met de manier hierboven bestaan uit hele strings. In hoeverre is er dan een vertraging te merken boven het werken met korte keywords als array keys? Zal dat de performance merkbaar beinvloeden?

[ Voor 3% gewijzigd door Verwijderd op 07-03-2007 17:50 ]


Verwijderd

Nee, de lengte van die dingen gaat echt niet je applicatie traag maken. En als je het zo nodig exact wilt weten dan benchmark je toch gewoon? Ik denk dat het gewoon onderhoudbaar houden van je code/teksten een veel betere investering is, dan het "optimaliseren" van wat strings.

Waarom gebruik je eigenlijk '%s', vraag ik me zo af...?

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 07 maart 2007 @ 18:19:
Ik denk dat het gewoon onderhoudbaar houden van je code/teksten een veel betere investering is, dan het "optimaliseren" van wat strings.
Bedoel je hiermee dat jouw voorkeur naar de methode met ARRAY_KEYS uitgaat (omdat alle strings dan onder elkaar in 1 bestand staan ipv verspreid door de code)?
Waarom gebruik je eigenlijk '%s', vraag ik me zo af...?
Dat was een slecht voorbeeld. Ik zou construcites gebruiken als:
PHP:
1
2
3
function foo($module) {
  echo t("The %module settings are updated", array('%module' => $module->name));
}

Verwijderd

Verwijderd schreef op woensdag 07 maart 2007 @ 18:33:

Bedoel je hiermee dat jouw voorkeur naar de methode met ARRAY_KEYS uitgaat (omdat alle strings dan onder elkaar in 1 bestand staan ipv verspreid door de code)?
Waar de strings vandaan komen interesseert mij eigenlijk vrij weinig. Je programmeert als het goed is tegen een interface aan die vertaalde berichten teruggeeft. Wat daar allemaal achter zit zal wel, voor wat betreft de applicatie. Dat is iets wat intern op honderden manieren kan. Je kunt includes gebruiken met arrays met mappings, je kunt iets als gdbm gebruiken, ini files, een database, whatever. Het inlezen van die gegevens duurt slechts een fractie van een seconde, snel genoeg om er geen last van te hebben. En of je in je code dan "preview_button" of "Preview this message" hebt staan boeit mij ook vrij weinig.
Dat was een slecht voorbeeld. Ik zou construcites gebruiken als:
PHP:
1
2
3
function foo($module) {
  echo t("The %module settings are updated", array('%module' => $module->name));
}
Misschien was mijn vraag een beetje scheef. Waarom gebruik je wel '%s' maar niet (v)(s)printf? Kun je meteen de parameters formateren mocht dat nodig zijn.
Waarom omslachtige replace functies gebruiken in plaats van de razendsnelle printf functies?

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 07 maart 2007 @ 18:41:
[...]
Waarom gebruik je wel '%s' maar niet (v)(s)printf? Kun je meteen de parameters formateren mocht dat nodig zijn. Waarom omslachtige replace functies gebruiken in plaats van de razendsnelle printf functies?
Ik gebruik een strtr ipv sprintf omdat sprintf alleen bepaalde type specifiers aanvaardt, terwijl strtr alle soorten tokens vervangt. Ik de string kun je dan meer zin geven aan bepaalde tokens. Vergelijk:
PHP:
1
2
3
$string = 'Bedankt voor uw aanmelding op %forumnaam, %user!';

$string = 'Bedankt voor uw aanmelding op %s, %s!';

Dan geeft de eerste methode (%forumnaam, %user) meer context dan %s, %s! :)

  • semicolon
  • Registratie: Mei 2004
  • Niet online
Verwijderd schreef op woensdag 07 maart 2007 @ 19:26:
[...]

Ik gebruik een strtr ipv sprintf omdat sprintf alleen bepaalde type specifiers aanvaardt, terwijl strtr alle soorten tokens vervangt. Ik de string kun je dan meer zin geven aan bepaalde tokens. Vergelijk:
PHP:
1
2
3
$string = 'Bedankt voor uw aanmelding op %forumnaam, %user!';

$string = 'Bedankt voor uw aanmelding op %s, %s!';

Dan geeft de eerste methode (%forumnaam, %user) meer context dan %s, %s! :)
Dus maak je een eigen functie die ELKE keer als je hem oproept opnieuw de talen moet inlezen?
Ik vind de format functies handig, en ze werken lekker snel. Maar als je een eigen functie maakt zorg dan in elk geval dat hij efficient is..

PHP:
1
2
3
4
$naam = "Bob";
$functie = "de baas";

printf( "Nou, dat is %2\$s, genaamd %1\$s. Kende je %1\$s al?" , $naam , $functie );


Het is misschien minder duidelijk zoals je zelf aangeeft, maar op het moment dat vertaald wordt heb je al een voorbeeld string zodat je weet waarmee het vervangen zou kunnen worden. Zeker als je ook de applicatie erbij houdt.

Om de discussie niet offtopic te brengen, ik gebruik zelf gettext in combinatie met sprintf. Ik weet niet of het ook echt zo is (vast wel), maar ik heb gewoon meer vertrouwen in pre-compiled modules die niet elke keer opnieuw geïnterpreteerd hoeven te worden, en het werkt uitstekend, de gettext taal bestanden zijn enorm duidelijk imho.

Maar ik vertaal alles dan ook zelf en gebruik alleen Nederlands en Engels voor mijn applicaties omdat als ik een andere taal aanbied ik ook vind dat ik er ondersteuning in moet kunnen bieden, en dat kan ik nou eenmaal niet.

:D/-<


Verwijderd

Topicstarter
Max v W schreef op woensdag 07 maart 2007 @ 19:52:
[...]
Dus maak je een eigen functie die ELKE keer als je hem oproept opnieuw de talen moet inlezen?
Nee, dit is slechts een eenvoudig voorbeeld om het principe van vertalen zoals ik dat in mijn hoofd heb, duidelijk te maken. Als ik dit ga uitwerken, zorg ik natuurlijk dat de taal-array in een static var komt te staan, oid. :)

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022

Reveller

Hopla!

Waar ik benieuwd naar ben: kan iemand mij vertellen welke methode React gebruikt? Ik heb net MyReact gedownload om te kijken, maar alle classes / php bestanden zijn geencrypt. Ik zie geen aparte language files. Betekent dit, dat er in de code volledige taalstrings staan?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • G33rt
  • Registratie: Februari 2002
  • Laatst online: 22-06-2022
Reveller schreef op zaterdag 17 maart 2007 @ 19:23:
Waar ik benieuwd naar ben: kan iemand mij vertellen welke methode React gebruikt? Ik heb net MyReact gedownload om te kijken, maar alle classes / php bestanden zijn geencrypt. Ik zie geen aparte language files. Betekent dit, dat er in de code volledige taalstrings staan?
Die kun je weldegelijk vinden:
./global/non-www/plugins/locale/en_US/LC_MESSAGES/admin.po.php
./global/non-www/plugins/locale/en_US/LC_MESSAGES/titles.po.php
./global/non-www/plugins/locale/en_US/LC_MESSAGES/titles.po
./global/non-www/plugins/locale/en_US/LC_MESSAGES/admin.po
./global/non-www/plugins/locale/en_US/LC_MESSAGES/errors.po.php
./global/non-www/plugins/locale/en_US/LC_MESSAGES/errors.po
./global/non-www/plugins/locale/nl_NL/LC_MESSAGES/admin.po.php
./global/non-www/plugins/locale/nl_NL/LC_MESSAGES/titles.po.php
./global/non-www/plugins/locale/nl_NL/LC_MESSAGES/titles.po
./global/non-www/plugins/locale/nl_NL/LC_MESSAGES/admin.po
./global/non-www/plugins/locale/nl_NL/LC_MESSAGES/errors.po.php
./global/non-www/plugins/locale/nl_NL/LC_MESSAGES/errors.po

Volgens mij gebruiken ze gewoon gettext.

[ Voor 3% gewijzigd door G33rt op 18-03-2007 19:49 ]

Pagina: 1