Current File : //opt/RZphp74/includes/Translation2/Admin/Container/xml.php |
<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Contains the Translation2_Admin_Container_xml class
*
* PHP versions 4 and 5
*
* LICENSE: Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE FREEBSD PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @category Internationalization
* @package Translation2
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @author Olivier Guilyardi <olivier@samalyse.com>
* @copyright 2004-2007 Lorenzo Alberton, Olivier Guilyardi
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause)
* @version CVS: $Id: xml.php 305985 2010-12-05 22:55:33Z clockwerx $
* @link http://pear.php.net/package/Translation2
*/
/**
* require Translation2_Container_xml class
*/
require_once 'Translation2/Container/xml.php';
require_once 'XML/Util.php';
/**
* Storage driver for storing/fetching data to/from a XML file
*
* @category Internationalization
* @package Translation2
* @author Lorenzo Alberton <l.alberton@quipo.it>
* @author Olivier Guilyardi <olivier@samalyse.com>
* @copyright 2004-2007 Lorenzo Alberton, Olivier Guilyardi
* @license http://www.debian.org/misc/bsd.license BSD License (3 Clause)
* @link http://pear.php.net/package/Translation2
*/
class Translation2_Admin_Container_xml extends Translation2_Container_xml
{
// {{{ class vars
/**
* Whether _saveData() is already registered at shutdown or not
* @var boolean
*/
var $_isScheduledSaving = false;
// }}}
// {{{ addLang()
/**
* Does nothing (here for compatibility with the container interface)
*
* @param array $langData language data
* @param array $options language options
*
* @return true|PEAR_Error
*/
function addLang($langData, $options = array())
{
return true;
}
// }}}
// {{{ addLangToList()
/**
* Creates a new entry in the <languages> section
*
* @param array $langData array('lang_id' => 'en',
* 'name' => 'english',
* 'meta' => 'some meta info',
* 'error_text' => 'not available',
* 'encoding' => 'iso-8859-1',
* );
*
* @return true|PEAR_Error
*/
function addLangToList($langData)
{
$validInput = array(
'name' => '',
'meta' => '',
'error_text' => '',
'encoding' => 'iso-8859-1',
);
foreach ($validInput as $key => $val) {
if (isset($langData[$key])) $validInput[$key] = $langData[$key];
}
$this->_data['languages'][$langData['lang_id']] = $validInput;
return $this->_scheduleSaving();
}
// }}}
// {{{ updateLang()
/**
* Update the lang info in the langsAvail table
*
* @param array $langData array [@see addLangToList()]
*
* @return true|PEAR_Error
*/
function updateLang($langData)
{
$allFields = array( //'lang_id',
'name', 'meta', 'error_text', 'encoding',
);
foreach ($allFields as $field) {
if (isset($this->_data['languages'][$langData['lang_id']][$field])) {
$this->_data['languages'][$langData['lang_id']][$field] = $langData[$field];
}
}
$success = $this->_scheduleSaving();
$this->fetchLangs(); //update memory cache
return $success;
}
// }}}
// {{{ add()
/**
* Add a new entry in the strings table.
*
* @param string $stringID string ID
* @param string $pageID page/group ID
* @param array $stringArray Associative array with string translations.
* Sample format: array('en' => 'sample', 'it' => 'esempio')
*
* @return true|PEAR_Error
*/
function add($stringID, $pageID, $stringArray)
{
$langs = array_intersect(
array_keys($stringArray),
$this->getLangs('ids')
);
$pageID = is_null($pageID) ? '#NULL' : $pageID;
$pageID = empty($pageID) ? '#EMPTY' : $pageID;
if (!array_key_exists($pageID, $this->_data['pages'])) {
$this->_data['pages'][$pageID] = array();
}
if (!array_key_exists($stringID, $this->_data['pages'][$pageID])) {
$this->_data['pages'][$pageID][$stringID] = array();
}
foreach ($langs as $lang) {
$this->_data['pages'][$pageID][$stringID][$lang] = $stringArray[$lang];
}
return $this->_scheduleSaving();
}
// }}}
// {{{ update()
/**
* Update an existing entry in the strings table.
*
* @param string $stringID string ID
* @param string $pageID page/group ID
* @param array $stringArray Associative array with string translations.
* Sample format: array('en' => 'sample', 'it' => 'esempio')
*
* @return true|PEAR_Error
*/
function update($stringID, $pageID, $stringArray)
{
return $this->add($stringID, $pageID, $stringArray);
}
// }}}
// {{{ remove()
/**
* Remove an entry from the strings table.
*
* @param string $stringID string ID
* @param string $pageID page/group ID
*
* @return true|PEAR_Error
*/
function remove($stringID, $pageID)
{
$pageID = is_null($pageID) ? '#NULL' : $pageID;
$pageID = empty($pageID) ? '#EMPTY' : $pageID;
unset ($this->_data['pages'][$pageID][$stringID]);
if (!count($this->_data['pages'][$pageID])) {
unset ($this->_data['pages'][$pageID]);
}
return $this->_scheduleSaving();
}
// }}}
// {{{ removeLang()
/**
* Remove all the entries for the given lang from the strings table.
*
* @param string $langID language ID
* @param boolean $force (ignored)
*
* @return true|PEAR_Error
*/
function removeLang($langID, $force = true)
{
// remove lang metadata
unset($this->_data['languages'][$langID]);
// remove the entries
foreach (array_keys($this->_data['pages']) as $pageID) {
foreach (array_keys($this->_data['pages'][$pageID]) as $stringID) {
if (array_key_exists($langID, $this->_data['pages'][$pageID][$stringID])) {
unset($this->_data['pages'][$pageID][$stringID][$langID]);
}
}
}
return $this->_scheduleSaving();
}
// }}}
// {{{ removePage()
/**
* Remove all the strings in the given page/group
*
* @param string $pageID page/group ID
*
* @return true|PEAR_Error
*/
function removePage($pageID = null)
{
$pageID = is_null($pageID) ? '#NULL' : $pageID;
$pageID = empty($pageID) ? '#EMPTY' : $pageID;
unset ($this->_data['pages'][$pageID]);
return $this->_scheduleSaving();
}
// }}}
// {{{ getPageNames()
/**
* Get a list of all the pageIDs.
*
* @return array
*/
function getPageNames()
{
$pages = array_keys($this->_data['pages']);
$k = array_search('#NULL', $pages);
if ($k !== false && !is_null($k)) {
$pages[$k] = null;
}
$k = array_search('#EMPTY', $pages);
if ($k !== false && !is_null($k)) {
$pages[$k] = '';
}
return $pages;
}
// }}}
// {{{ _scheduleSaving()
/**
* Prepare data saving
*
* This methods registers _saveData() as a PEAR shutdown function. This
* is to avoid saving multiple times if the programmer makes several
* changes.
*
* @return true|PEAR_Error
* @access private
* @see Translation2_Admin_Container_xml::_saveData()
*/
function _scheduleSaving()
{
if ($this->options['save_on_shutdown']) {
if (!$this->_isScheduledSaving) {
// save the changes on shutdown
register_shutdown_function(array(&$this, '_saveData'));
$this->_isScheduledSaving = true;
}
return true;
}
// save the changes now
return $this->_saveData();
}
// }}}
// {{{ _saveData()
/**
* Serialize and save the updated tranlation data to the XML file
*
* @return boolean | PEAR_Error
* @access private
* @see Translation2_Admin_Container_xml::_scheduleSaving()
*/
function _saveData()
{
if ($this->options['save_on_shutdown']) {
$data =& $this->_data;
} else {
$data = $this->_data;
}
$this->_convertEncodings('to_xml', $data);
$this->_convertLangEncodings('to_xml', $data);
// Serializing
$xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n" .
"<!DOCTYPE translation2 [\n" . TRANSLATION2_DTD . "]>\n\n" .
"<translation2>\n" .
" <languages>\n";
foreach ($data['languages'] as $lang => $spec) {
extract ($spec);
$xml .= " <lang id=\"$lang\">\n" .
" <name>" .
($name ? ' ' . XML_Util::replaceEntities($name) . ' ' : '') .
"</name>\n" .
" <meta>" .
($meta ? ' ' . XML_Util::replaceEntities($meta) . ' ' : "") .
"</meta>\n" .
" <error_text>" .
($error_text
? ' ' . XML_Util::replaceEntities($error_text) . ' '
: "") .
"</error_text>\n" .
" <encoding>" . ($encoding ? " $encoding " : "") .
"</encoding>\n" .
" </lang>\n";
}
$xml .= " </languages>\n" .
" <pages>\n";
foreach ($data['pages'] as $page => $strings) {
$xml .= " <page key=\"" . XML_Util::replaceEntities($page) .
"\">\n";
foreach ($strings as $str_id => $translations) {
$xml .= " <string key=\"" .
XML_Util::replaceEntities($str_id) . "\">\n";
foreach ($translations as $lang => $str) {
$xml .= " <tr lang=\"$lang\"> " .
XML_Util::replaceEntities($str) . " </tr>\n";
}
$xml .= " </string>\n";
}
$xml .= " </page>\n";
}
$xml .= " </pages>\n" .
"</translation2>\n";
unset ($data);
// Saving
if (!$f = fopen ($this->_filename, 'w')) {
return $this->raiseError(sprintf(
'Unable to open the XML file ("%s") for writing',
$this->_filename
),
TRANSLATION2_ERROR_CANNOT_WRITE_FILE,
PEAR_ERROR_TRIGGER,
E_USER_ERROR
);
}
@flock($f, LOCK_EX);
fwrite ($f, $xml);
//@flock($f, LOCK_UN);
fclose ($f);
return true;
}
// }}}
}
?>