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;
}
}
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?