When you set a text domain, it (obviously) erases the previous one.
This can be a problem when you use nested includes in which there can be textdomain() calls with different text domains. After returning from the include, your textdomain is changed, and the rest of the parent script fails in translating the remaining sentences.
I wrote these two small functions to avoid that. You should put the whole code into a file which you require_once in every script that needs gettext functionalities. Then, use only set_textdomain() and restore_textdomain() at the beginning and the end of every script/function that sets a text domain.
A call to set_textdomain() MUST correspond to a call to restore_textdomain(), and there is no limit in how many nested calls are done.
One optimization is done here: when the new text domain is the same as the current one, no change is made, and restore_textdomain() will be aware of this so you can still call it safely.
<?php
$_td_stack = array(); function set_textdomain($td)
{
global $_td_stack;
$old_td = textdomain(NULL);
if ($old_td)
{
if (!strcmp($old_td, $td))
{
array_push($_td_stack, false);
}
else
{
array_push($_td_stack, $old_td);
}
}
textdomain($td);
}
function restore_textdomain()
{
global $_td_stack;
$old_td = array_pop($_td_stack);
if ($old_td)
{
textdomain($old_td);
}
}
?>