mirror of
https://github.com/atlanticbiomedical/portal-legacy.git
synced 2025-07-02 01:47:28 -04:00
initial commit
This commit is contained in:
445
lib/symfony/addon/creole/i18n/sfMessageSource_Creole.class.php
Executable file
445
lib/symfony/addon/creole/i18n/sfMessageSource_Creole.class.php
Executable file
@ -0,0 +1,445 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* sfMessageSource_Creole class file.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the BSD License.
|
||||
*
|
||||
* Copyright(c) 2004 by Qiang Xue. All rights reserved.
|
||||
*
|
||||
* To contact the author write to {@link mailto:qiang.xue@gmail.com Qiang Xue}
|
||||
* The latest version of PRADO can be obtained from:
|
||||
* {@link http://prado.sourceforge.net/}
|
||||
*
|
||||
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
|
||||
* @version $Id: sfMessageSource_Creole.class.php 3245 2007-01-12 15:01:53Z fabien $
|
||||
* @package symfony
|
||||
* @subpackage i18n
|
||||
*/
|
||||
|
||||
/*
|
||||
CREATE TABLE `catalogue` (
|
||||
`cat_id` int(11) NOT NULL auto_increment,
|
||||
`name` varchar(100) NOT NULL default '',
|
||||
`source_lang` varchar(100) NOT NULL default '',
|
||||
`target_lang` varchar(100) NOT NULL default '',
|
||||
`date_created` int(11) NOT NULL default '0',
|
||||
`date_modified` int(11) NOT NULL default '0',
|
||||
`author` varchar(255) NOT NULL default '',
|
||||
PRIMARY KEY (`cat_id`)
|
||||
);
|
||||
|
||||
CREATE TABLE `trans_unit` (
|
||||
`msg_id` int(11) NOT NULL auto_increment,
|
||||
`cat_id` int(11) NOT NULL default '1',
|
||||
`source` text NOT NULL,
|
||||
`target` text NOT NULL,
|
||||
`comments` text NOT NULL,
|
||||
`date_added` int(11) NOT NULL default '0',
|
||||
`date_modified` int(11) NOT NULL default '0',
|
||||
`author` varchar(255) NOT NULL default '',
|
||||
`translated` tinyint(1) NOT NULL default '0',
|
||||
PRIMARY KEY (`msg_id`)
|
||||
);
|
||||
|
||||
*/
|
||||
|
||||
/**
|
||||
* sfMessageSource_Creole class.
|
||||
*
|
||||
* Retrieve the message translation from a Creole supported database.
|
||||
*
|
||||
* See the MessageSource::factory() method to instantiate this class.
|
||||
*
|
||||
* @author RoVeRT <symfony[at]rovert[dot]net>
|
||||
*/
|
||||
class sfMessageSource_Creole extends sfMessageSource
|
||||
{
|
||||
/**
|
||||
* A resource link to the database
|
||||
* @var db
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* Create a new message source using Creole.
|
||||
* @param string Creole datasource.
|
||||
* @see MessageSource::factory();
|
||||
*/
|
||||
public function __construct($source)
|
||||
{
|
||||
$this->db = sfContext::getInstance()->getDatabaseConnection($source);
|
||||
if ($this->db == null || !$this->db instanceof Connection)
|
||||
{
|
||||
$error = 'Creole dabatase connection doesn\'t exist. Unable to open session.';
|
||||
throw new sfDatabaseException($error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Destructor, close the database connection.
|
||||
*/
|
||||
public function __destruct()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the database connection.
|
||||
* @return db database connection.
|
||||
*/
|
||||
public function connection()
|
||||
{
|
||||
return $this->db;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an array of messages for a particular catalogue and cultural
|
||||
* variant.
|
||||
* @param string the catalogue name + variant
|
||||
* @return array translation messages.
|
||||
*/
|
||||
protected function &loadData($variant)
|
||||
{
|
||||
$sql = 'SELECT t.source, t.target, t.comments '.
|
||||
'FROM trans_unit t, catalogue c '.
|
||||
'WHERE c.cat_id = t.cat_id AND c.name = ? '.
|
||||
'ORDER BY msg_id ASC';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
$rs = $stmt->executeQuery(array($variant), ResultSet::FETCHMODE_NUM);
|
||||
|
||||
$result = array();
|
||||
|
||||
$count = 0;
|
||||
while ($rs->next())
|
||||
{
|
||||
$source = $rs->getString(1);
|
||||
$result[$source][] = $rs->getString(2); //target
|
||||
$result[$source][] = $count++; //id
|
||||
$result[$source][] = $rs->getString(3); //comments
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the last modified unix-time for this particular catalogue+variant.
|
||||
* We need to query the database to get the date_modified.
|
||||
*
|
||||
* @param string catalogue+variant
|
||||
* @return int last modified in unix-time format.
|
||||
*/
|
||||
protected function getLastModified($source)
|
||||
{
|
||||
$sql = 'SELECT date_modified FROM catalogue WHERE name = ?';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
$rs = $stmt->executeQuery(array($source), ResultSet::FETCHMODE_NUM);
|
||||
|
||||
$result = $rs->next() ? $rs->getInt(1) : 0;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a particular catalogue+variant exists in the database.
|
||||
*
|
||||
* @param string catalogue+variant
|
||||
* @return boolean true if the catalogue+variant is in the database, false otherwise.
|
||||
*/
|
||||
protected function isValidSource($variant)
|
||||
{
|
||||
$sql = 'SELECT COUNT(*) FROM catalogue WHERE name = ?';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
$rs = $stmt->executeQuery(array($variant), ResultSet::FETCHMODE_NUM);
|
||||
|
||||
$result = $rs->next() ? $rs->getInt(1) == 1 : false;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the variants of a particular catalogue.
|
||||
*
|
||||
* @param string catalogue name
|
||||
* @return array list of all variants for this catalogue.
|
||||
*/
|
||||
protected function getCatalogueList($catalogue)
|
||||
{
|
||||
$variants = explode('_', $this->culture);
|
||||
|
||||
$catalogues = array($catalogue);
|
||||
|
||||
$variant = null;
|
||||
|
||||
for ($i = 0, $max = count($variants); $i < $max; $i++)
|
||||
{
|
||||
if (strlen($variants[$i]) > 0)
|
||||
{
|
||||
$variant .= ($variant) ? '_'.$variants[$i] : $variants[$i];
|
||||
$catalogues[] = $catalogue.'.'.$variant;
|
||||
}
|
||||
}
|
||||
|
||||
return array_reverse($catalogues);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve catalogue details, array($cat_id, $variant, $count).
|
||||
*
|
||||
* @param string catalogue
|
||||
* @return array catalogue details, array($cat_id, $variant, $count).
|
||||
*/
|
||||
protected function getCatalogueDetails($catalogue = 'messages')
|
||||
{
|
||||
if (empty($catalogue))
|
||||
{
|
||||
$catalogue = 'messages';
|
||||
}
|
||||
|
||||
$variant = $catalogue.'.'.$this->culture;
|
||||
|
||||
$name = $this->getSource($variant);
|
||||
|
||||
$sql = 'SELECT cat_id FROM catalogue WHERE name = ?';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
$rs = $stmt->executeQuery(array($name), ResultSet::FETCHMODE_NUM);
|
||||
|
||||
if ($rs->getRecordCount() != 1)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$rs->next();
|
||||
|
||||
$cat_id = $rs->getInt(1);
|
||||
|
||||
//first get the catalogue ID
|
||||
$sql = 'SELECT count(msg_id) FROM trans_unit WHERE cat_id = ?';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
$rs = $stmt->executeQuery(array($cat_id), ResultSet::FETCHMODE_NUM);
|
||||
|
||||
$rs->next();
|
||||
$count = $rs->getInt(1);
|
||||
|
||||
return array($cat_id, $variant, $count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the catalogue last modified time.
|
||||
*
|
||||
* @return boolean true if updated, false otherwise.
|
||||
*/
|
||||
protected function updateCatalogueTime($cat_id, $variant)
|
||||
{
|
||||
$time = time();
|
||||
|
||||
$sql = 'UPDATE catalogue SET date_modified = ? WHERE cat_id = ?';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
$result = $stmt->executeUpdate(array($time, $cat_id));
|
||||
|
||||
if (!empty($this->cache))
|
||||
{
|
||||
$this->cache->clean($variant, $this->culture);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the list of untranslated blocks to the translation source.
|
||||
* If the translation was not found, you should add those
|
||||
* strings to the translation source via the <b>append()</b> method.
|
||||
*
|
||||
* @param string the catalogue to add to
|
||||
* @return boolean true if saved successfuly, false otherwise.
|
||||
*/
|
||||
function save($catalogue='messages')
|
||||
{
|
||||
$messages = $this->untranslated;
|
||||
|
||||
if (count($messages) <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$details = $this->getCatalogueDetails($catalogue);
|
||||
|
||||
if ($details)
|
||||
{
|
||||
list($cat_id, $variant, $count) = $details;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($cat_id <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$inserted = 0;
|
||||
|
||||
$time = time();
|
||||
|
||||
try
|
||||
{
|
||||
$sql = 'SELECT msg_id FROM trans_unit WHERE source = ?';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
foreach($messages as $key => $message)
|
||||
{
|
||||
$rs = $stmt->executeQuery(array($message), ResultSet::FETCHMODE_NUM);
|
||||
if ($rs->next())
|
||||
{
|
||||
unset($messages[$key]);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$this->db->begin();
|
||||
|
||||
$sql = 'INSERT INTO trans_unit (cat_id, source, target, comments, date_added, date_modified) VALUES (?, ?, ?, ?, ?, ?)';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
foreach ($messages as $message)
|
||||
{
|
||||
$stmt->executeUpdate(array($cat_id, $message, '', '', $time, $time));
|
||||
++$inserted;
|
||||
}
|
||||
|
||||
$this->db->commit();
|
||||
}
|
||||
catch (Exception $e)
|
||||
{
|
||||
$this->db->rollback();
|
||||
}
|
||||
|
||||
if ($inserted > 0)
|
||||
{
|
||||
$this->updateCatalogueTime($cat_id, $variant);
|
||||
}
|
||||
|
||||
return $inserted > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a particular message from the specified catalogue.
|
||||
*
|
||||
* @param string the source message to delete.
|
||||
* @param string the catalogue to delete from.
|
||||
* @return boolean true if deleted, false otherwise.
|
||||
*/
|
||||
function delete($message, $catalogue='messages')
|
||||
{
|
||||
$details = $this->getCatalogueDetails($catalogue);
|
||||
|
||||
if ($details)
|
||||
{
|
||||
list($cat_id, $variant, $count) = $details;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$deleted = false;
|
||||
|
||||
$sql = 'DELETE FROM trans_unit WHERE cat_id = ? AND source = ?';
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
$rows = $stmt->executeUpdate(array($cat_id, $message));
|
||||
|
||||
if ($rows == 1)
|
||||
{
|
||||
$deleted = $this->updateCatalogueTime($cat_id, $variant);
|
||||
}
|
||||
|
||||
return $deleted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the translation.
|
||||
*
|
||||
* @param string the source string.
|
||||
* @param string the new translation string.
|
||||
* @param string comments
|
||||
* @param string the catalogue of the translation.
|
||||
* @return boolean true if translation was updated, false otherwise.
|
||||
*/
|
||||
function update($text, $target, $comments, $catalogue='messages')
|
||||
{
|
||||
$details = $this->getCatalogueDetails($catalogue);
|
||||
if ($details)
|
||||
{
|
||||
list($cat_id, $variant, $count) = $details;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$time = time();
|
||||
|
||||
$sql = 'UPDATE trans_unit SET target = ?, comments = ?, date_modified = ? WHERE cat_id = ? AND source = ?';
|
||||
|
||||
$updated = false;
|
||||
|
||||
$stmt = $this->db->prepareStatement($sql);
|
||||
|
||||
$rows = $stmt->executeUpdate(array($target, $comments, $time, $cat_id, $text));
|
||||
|
||||
if ($rows == 1)
|
||||
{
|
||||
$updated = $this->updateCatalogueTime($cat_id, $variant);
|
||||
}
|
||||
|
||||
return $updated;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of catalogue as key and all it variants as value.
|
||||
*
|
||||
* @return array list of catalogues
|
||||
*/
|
||||
function catalogues()
|
||||
{
|
||||
$sql = 'SELECT name FROM catalogue ORDER BY name';
|
||||
|
||||
$rs = $this->db->executeQuery($sql, ResultSet::FETCHMODE_NUM);
|
||||
|
||||
$result = array();
|
||||
while ($rs->next())
|
||||
{
|
||||
$details = explode('.', $rs->getString(1));
|
||||
if (!isset($details[1]))
|
||||
{
|
||||
$details[1] = null;
|
||||
}
|
||||
|
||||
$result[] = $details;
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user