note 100417 added to function.textdomain
| From: | (withouta) | Date: | Thu, 14 Oct 2010 16:00:19 +0000 |
| Subject: | note 100417 added to function.textdomain | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-173216@lists.php.net to get a copy of this message | ||
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(); // text domains stack
/**
* Sets a new text domain after recording the current one
* so it can be restored later with restore_textdomain().
*
* It's possible to nest calls to these two functions.
* @param string the new text domain to set
*/
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);
}
/**
* Restore the text domain active before the last call to
* set_textdomain().
*/
function restore_textdomain()
{
global $_td_stack;
$old_td = array_pop($_td_stack);
if ($old_td)
{
textdomain($old_td);
}
}
?>
----
Server IP: 69.147.83.197
Probable Submitter: 90.23.107.126
----
Manual Page -- http://www.php.net/manual/en/function.textdomain.php
Edit -- https://master.php.net/note/edit/100417
Del: integrated -- https://master.php.net/note/delete/100417/integrated
Del: useless -- https://master.php.net/note/delete/100417/useless
Del: bad code -- https://master.php.net/note/delete/100417/bad+code
Del: spam -- https://master.php.net/note/delete/100417/spam
Del: non-english -- https://master.php.net/note/delete/100417/non-english
Del: in docs -- https://master.php.net/note/delete/100417/in+docs
Del: other reasons-- https://master.php.net/note/delete/100417
Reject -- https://master.php.net/note/reject/100417
Search -- https://master.php.net/manage/user-notes.php