Files
oc-server3/htdocs/lib2/translationHandler.class.php
2012-08-16 21:04:13 +02:00

209 lines
6.2 KiB
PHP

<?php
/***************************************************************************
* For license information see doc/license.txt
*
* Unicode Reminder メモ
***************************************************************************/
$translationHandler = new TranslationHandler();
class TranslationHandler
{
/* create all files in cache2/translate
*/
function createMessageFiles()
{
$rs = sqlf("SELECT DISTINCT `lang` FROM `sys_trans_text`");
while ($r = sql_fetch_assoc($rs))
{
$this->createMessageFile($r['lang']);
}
sql_free_result($rs);
}
/* create file in cache2/translate/$language/LC_MESSAGES/...
*/
private function createMessageFile($language)
{
global $opt;
$language_upper = mb_strtoupper($language);
$language_lower = mb_strtolower($language);
if (!isset($opt['locale'][$language_upper]))
return;
if (!is_dir($opt['rootpath'] . 'cache2/translate/' . $language_lower))
mkdir($opt['rootpath'] . 'cache2/translate/' . $language_lower);
if (!is_dir($opt['rootpath'] . 'cache2/translate/' . $language_lower . '/LC_MESSAGES'))
mkdir($opt['rootpath'] . 'cache2/translate/' . $language_lower . '/LC_MESSAGES');
$f = fopen($opt['rootpath'] . 'cache2/translate/' . $language_lower . '/LC_MESSAGES/messages.po', 'w');
fwrite($f, 'msgid ""' . "\n");
fwrite($f, 'msgstr ""' . "\n");
fwrite($f, '"MIME-Version: 1.0\n"' . "\n");
fwrite($f, '"Content-Type: text/plain; charset=UTF-8\n"' . "\n");
fwrite($f, '"Content-Transfer-Encoding: 8bit\n"' . "\n");
fwrite($f, "\n");
$rs = sqlf("SELECT `sys_trans`.`text` AS `text`, `sys_trans_text`.`text` AS `trans` FROM `sys_trans` INNER JOIN `sys_trans_text` ON `sys_trans`.`id`=`sys_trans_text`.`trans_id` AND `sys_trans_text`.`lang`='&1' WHERE `sys_trans`.`text`!=''", $language_upper);
$variables = array();
$this->loadNodeTextFile($variables, $opt['logic']['node']['id'].'.txt', $language_lower);
$this->loadNodeTextFile($variables, $opt['logic']['node']['id'].'-'.$language_lower.'.txt', $language_lower);
while ($r = sql_fetch_assoc($rs))
{
$trans = $r['trans'];
$trans = $this->substitueVariables($variables, $language_lower, $trans);
fwrite($f, 'msgid "' . $this->escape_text($r['text']) . '"' . "\n");
fwrite($f, 'msgstr "' . $this->escape_text($trans) . '"' . "\n");
fwrite($f, "\n");
}
sql_free_result($rs);
fclose($f);
@exec('msgfmt -o ' . escapeshellcmd($opt['rootpath'] . 'cache2/translate/' . $language_lower . '/LC_MESSAGES/messages.mo') . ' ' . escapeshellcmd($opt['rootpath'] . 'cache2/translate/' . $language_lower . '/LC_MESSAGES/messages.po'));
}
/* escape string for po-file
*/
private function escape_text($text)
{
$text = mb_ereg_replace('\\\\', '\\\\', $text);
$text = mb_ereg_replace('"', '\"', $text);
$text = mb_ereg_replace("\r", "", $text);
while (mb_substr($text, -1, 1) == "\n")
$text = mb_substr($text, 0, mb_strlen($text) - 1);
$text = mb_ereg_replace("\n", "\\n\"\n\"", $text);
return $text;
}
private function prepare_text($text)
{
$text = mb_ereg_replace("\t", ' ', $text);
$text = mb_ereg_replace("\r", ' ', $text);
$text = mb_ereg_replace("\n", ' ', $text);
while (mb_strpos($text, ' ') !== false)
$text = mb_ereg_replace(' ', ' ', $text);
return $text;
}
/* add text to database
*/
function addText($text, $resource_name, $line)
{
global $opt;
if ($text == '') return;
$text = $this->prepare_text($text);
$trans_id = sqlf_value("SELECT `id` FROM `sys_trans` WHERE `text`='&1'", 0, $text);
if ($trans_id == 0)
{
sqlf("INSERT INTO `sys_trans` (`text`) VALUES ('&1')", $text);
$trans_id = sql_insert_id();
}
sqlf("INSERT IGNORE INTO `sys_trans_ref` (`trans_id`, `resource_name`, `line`) VALUES ('&1', '&2', '&3')", $trans_id, $resource_name, $line);
}
/* clear sys_trans_ref to begin new translation of resource
*/
function clearReferences()
{
global $opt, $db;
sqlf("DELETE FROM `sys_trans_ref`");
}
/* import strings from given field to sys_trans_text
*/
function importFromTable($table, $fname = 'name', $fid = 'trans_id')
{
$rs = sqlf("SELECT `&1`.`&2` FROM `&1` LEFT JOIN `sys_trans` ON `&1`.`&3`=`sys_trans`.`id` AND `&1`.`&2`=`sys_trans`.`text`", $table, $fname, $fid);
while ($r = sql_fetch_array($rs))
{
if ($r[$fname] == '')
continue;
$lastId = sqlf_value("SELECT `id` FROM `sys_trans` WHERE `text`='&1'", 0, $r[$fname]);
if ($lastId == 0)
{
sqlf("INSERT INTO `sys_trans` (`text`) VALUES ('&1')", $r[$fname]);
$lastId = sql_insert_id();
}
sqlf("INSERT IGNORE INTO `sys_trans_ref` (`trans_id`, `resource_name`, `line`) VALUES ('&1', '&2', 0)", $lastId, 'table:' . $table . ';field=' . $fname);
}
sql_free_result($rs);
sqlf("UPDATE `&1` SET `&2`=0", $table, $fid);
sqlf("UPDATE `&1`, `sys_trans` SET `&1`.`&3`=`sys_trans`.`id` WHERE `&1`.`&2`=`sys_trans`.`text`", $table, $fname, $fid);
}
/* import variables for substition from config2/nodetext/
*/
function loadNodeTextFile(&$variables, $file, $language)
{
// generic load
global $opt;
$filename = $opt['rootpath'] . '/config2/nodetext/' . $file;
if (file_exists($filename))
{
$fhandle = fopen($filename, 'r');
if ($fhandle)
{
while ($line = fgets($fhandle, 4096))
{
$pos = mb_strpos($line, ' ');
$variable = mb_substr($line, 0, $pos);
$substitution = mb_substr($line, $pos+1, mb_strlen($line));
$substitution = rtrim($substitution);
$variables[$language][$variable]=$substitution;
}
fclose($fhandle);
return true;
}
}
return false;
}
function substitueVariables(&$variables, $lang, $str)
{
$langstr = $str;
// replace variables in string
if (mb_ereg_search_init($langstr))
{
while (false != $vars = mb_ereg_search_regs( "%[^%]*%" ))
{
foreach ($vars as $curly_pattern)
{
// $curly_pattern contatins %pattern% in replacement string
$pattern = mb_substr($curly_pattern,1,mb_strlen($curly_pattern)-2);
// avoid recursive loop
if ($pattern != $str)
{
if (isset($variables[$lang][$pattern]))
{
$pattern_replacement = $variables[$lang][$pattern];
$langstr = mb_ereg_replace($curly_pattern, $pattern_replacement, $langstr);
}
}
}
}
}
return $langstr;
}
}
?>