Bug oder Feature: i18nEmulateGettext

Gesperrt
delinquent
Beiträge: 184
Registriert: Fr 17. Aug 2007, 12:15
Kontaktdaten:

Bug oder Feature: i18nEmulateGettext

Beitrag von delinquent »

Hallo alle miteinander,

mir ist gerade folgendes Szenario in Zusammenhang mit dem Cache der i18nEmulateGettext Funktion in includes/functions.i18n.php aufgefallen:

Während der Entwicklung eines Plugins für das ich eine Gettext-Domäne registriert (kann man das so sagen?) habe, enthielt eine Datei unter anderem die msgid "Create client". In der Domäne Contenido ist diese durch HerrB's Newsletter Extension mit "Mandant erzeugen" übersetzt.

In meiner .po Datei ist hierzu allerdings "Mandant anlegen" hinterliegt. Wenn ich mir die Berechtigungen der Benutzer nun ansehe, steht auch bei meinem Plugin "Mandant erzeugen". Die Ursache hierzu ist offenbar in der Methode i18nEmluateGettext zu suchen, da dort ausschließlich überprüft wird, ob ein String bereits übersetzt worden ist, nicht aber, ob es bereits für diese Domäne übersetzt worden ist.


Hier der original Code aus meiner 4.6.15-er Version (emergence hatte die Methode glaube ich auch bereits überarbeitet, ich bin mir nicht sicher, ob dieser Fix bereits bestandteil dieser Methode ist):

Code: Alles auswählen

function i18nEmulateGettext ($string, $domain = "contenido")
{
	global $cfg, $i18nLanguage, $transFile, $i18nDomains, $_i18nTranslationCache;

	if (!is_array($_i18nTranslationCache))
	{
		$_i18nTranslationCache = array();	
	}
	if (array_key_exists($string, $_i18nTranslationCache)
	{
		return $_i18nTranslationCache[$string];
	}
	
	/* Bad thing, gettext is not available. Let's emulate it */
	if (!file_exists($i18nDomains[$domain].$i18nLanguage."/LC_MESSAGES/".$domain.".po"))
	{
		return $string;
	}
	
	if (!isset($transFile[$domain]))
	{
		$transFile[$domain] = implode('',file($i18nDomains[$domain].$i18nLanguage."/LC_MESSAGES/".$domain.".po"));
	}
	
	$stringStart = strpos($transFile[$domain],'"'.$string.'"');

	if ($stringStart === false)
	{
		return $string;
	}
	
	$results = array();
	preg_match("/msgid.*\"".preg_quote($string,"/")."\".*\nmsgstr(\s*)\"(.*)\"/", $transFile[$domain], $results);

	if (array_key_exists(1, $results))
	{
		$_i18nTranslationCache[$string] = stripslashes($results[2]);
		return stripslashes($results[2]);
	} else {
		return $string;	
	} 
}
Ich habe die Strings, die in das Cache-Array geschrieben werden durch Arrays ersetzt, sodass bei Überprüfung, ob eine Übersetzung bereits gecached wurde auch die Domäne berücksichtigt wird.

Neuer Code:

Code: Alles auswählen

function i18nEmulateGettext ($string, $domain = "contenido")
{
	global $cfg, $i18nLanguage, $transFile, $i18nDomains, $_i18nTranslationCache;

	if (!is_array($_i18nTranslationCache))
	{
		$_i18nTranslationCache = array();	
	}

	// Fix: Domäne eingefügt
	if (array_key_exists($string, $_i18nTranslationCache) && $_i18nTranslationCache[$string]["domain"] == $domain)
	{
		return $_i18nTranslationCache[$string]["string"];
	}
	
	/* Bad thing, gettext is not available. Let's emulate it */
	if (!file_exists($i18nDomains[$domain].$i18nLanguage."/LC_MESSAGES/".$domain.".po"))
	{
		return $string;
	}
	
	if (!isset($transFile[$domain]))
	{
		$transFile[$domain] = implode('',file($i18nDomains[$domain].$i18nLanguage."/LC_MESSAGES/".$domain.".po"));
	}
	
	$stringStart = strpos($transFile[$domain],'"'.$string.'"');

	if ($stringStart === false)
	{
		return $string;
	}
	
	$results = array();
	preg_match("/msgid.*\"".preg_quote($string,"/")."\".*\nmsgstr(\s*)\"(.*)\"/", $transFile[$domain], $results);

	if (array_key_exists(1, $results))
	{
		// Fix: Domäne eingefügt
		$_i18nTranslationCache[$string] = array("string" => stripslashes($results[2]), "domain" => $domain);
		return stripslashes($results[2]);
	} else {
		return $string;	
	} 
}

Ist das ein Bug oder macht gettext das tatsächlich so?
HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB »

Vermutlich Bug, mal ansehen, verschoben.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net
Gesperrt