anmerkung: function i18nEmulateGettext

Gesperrt
emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

anmerkung: function i18nEmulateGettext

Beitrag von emergence » Mi 15. Okt 2003, 17:53

bei durchsicht der funktion ist mir eine idee gekommen um die funktion eventuell schneller zu machen...

1. die zeile
$fp = fopen($cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po","r");
dient ansich ja nur dazu um zu überprüfen ob die sprachdatei wirklich existiert.
nun kann es aber passieren das eine datei sagen wir mal 50 mal auf die funktion i18nEmulateGettext zugreifen muss.
mein vorschlag: wie wärs die variable global zu speichern und diese überprüfung auszulassen wenn sie bereits gesetzt wurde ?! wär nur logisch.

2. die zeile
$transFile = implode('',file($cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po"));
macht ja nichts anderes als den array (den file erzeugt) zeile für zeile (mittels implode) wieder zusammenzufügen damit man einen string hat.
ähm... sagen wir mal das 50 mal zu machen bringts irgendwie auch nicht (ebenfalls die variable speichern)

nur ne idee... obs schneller ist`, keine ahnung, mir kommts aber so vor, aber ich glaub schon...

ob man jetzt beides seperat oder in einem macht ist an sich egal, ich habs zusammen gefasst. der auszug unten ersetzt nur den ersten teil der funktion.

Code: Alles auswählen

function i18nEmulateGettext ($string)
{
	global $cfg, $i18nLanguage, $transFile;
	/* Bad thing, gettext is not available. Let's emulate it */
	if (!$transFile) {
		$fp = fopen($cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po","r");

		if ($fp === false)
		{
			return $string;
		}

		fclose($fp);
		$transFile = implode('',file($cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po"));
	}
wenn man noch mehr speed haben möchte muss man an sich nur mehr die
kommentarzeilen (alle beginnen mit #) aus der contenido.po entfernen. (die datei hat dann nur mehr eine größe von 25 kb)

timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo » Do 16. Okt 2003, 09:51

Hi emergence,

ja, dieselbe Idee hatten wir vor einigen Wochen auch :)

Ich weiß nicht, ob ich es mal im Forum gepostet habe, aber hier der neue Quelltext (eventuell werde ich noch mehr optimieren, wenn ich mal eine freie Minute habe):

Code: Alles auswählen

function i18nEmulateGettext ($string)
{
	global $cfg, $i18nLanguage, $transFile;

	/* Bad thing, gettext is not available. Let's emulate it */
		
	if (!file_exists($cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po"))
	{
		return $string;
	}
	
	if (!isset($transFile))
	{
		$transFile = implode('',file($cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po"));
	}	
	
	
	$stringStart = strpos($transFile,'"'.$string.'"');

	if ($stringStart === false)
	{
		return $string;
	}
	
	
	$searchStart = $stringStart + strlen($string);
	$msgstrStart = strpos($transFile, 'msgstr', $searchStart);
	
	
	
	$messageStart = strpos($transFile, '"', $msgstrStart);
	$maxMsgEnd = strpos($transFile, "\n", $messageStart);

	$tempMessage = substr($transFile, $messageStart+1, $maxMsgEnd- $messageStart+1);
	

	$startSearch = 0;
	$endOfMessage = 0;
	while ($pos = strpos($tempMessage,'"',$startSearch+1))
	{
		if ($pos === false)
		{
			return "Error in i18nEmulateGettext";
		}
		if (substr($tempMessage, $pos-1,1) != '\\')
		{
			$endOfMessage = $pos;
		}
		
		$startSearch = $pos;
	}
	
	$tempMessage = substr($tempMessage,0,$endOfMessage);
	$tempMessage = str_replace('\\"','"',$tempMessage);
	
	return ($tempMessage); 
	 
}

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Do 16. Okt 2003, 10:55

ich habs jetzt mal ausgetestet bei einem provider ohne gettext

also wenn die funktion noch schneller wird braucht man die gettext unterstützung nicht mehr :-)

ich stelle eigentlich fast keinen unterschied mehr fest (von zeitweise 18 sekunden auf unter 1 sekunde ist nicht schlecht)

ach ja um deinen quelltext noch eleganter zu gestalten habe ich deinen code:

Code: Alles auswählen

   if (!file_exists($cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po")) 
   { 
      return $string; 
   } 
    
   if (!isset($transFile)) 
   { 
      $transFile = implode('',file($cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po")); 
   } 
durch

Code: Alles auswählen

	if (!$transFile) { // high speed only load once

		$fp = $cfg["path"]["contenido"].$cfg['path']['locale'].$i18nLanguage."/LC_MESSAGES/contenido.po";

		if (!file_exists($fp))
		{
			return $string;
		}

		$transFile = implode('',file($fp));

	}
ersetzt.

wie bereits einmal erwähnt die qualität des codes steigt ;-)

emergence
Beiträge: 10641
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 25. Sep 2004, 09:32

geschlossen
*** make your own tools (wishlist :: thx)

Gesperrt