<?php
/* Reminder: always indent with 4 spaces (no tabs). */
// +---------------------------------------------------------------------------+
// | Copyright (c) 2008, Demian Turner |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o 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. |
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "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 COPYRIGHT |
// | OWNER 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. |
// | |
// +---------------------------------------------------------------------------+
// | Seagull 0.6 |
// +---------------------------------------------------------------------------+
// | Translation.php |
// +---------------------------------------------------------------------------+
// | Author: Alexander J. Tarachanowicz II <ajt@localhype.net> |
// +---------------------------------------------------------------------------+
// $Id: Translation.php,v 1.0 2005/05/11 00:00:00 demian Exp $
/**
* A wrapper to PEAR Translation2.
*
* @package SGL
* @author Alexander J. Tarachanowicz II <ajt@localhype.net>
* @version $Revision: 1.0 $
*/
class SGL_Translation2
{
/**
* Generate singleton for PEAR::Tranlation2
*
* Object types:
* o translation (default)
* o admin - translation2_admin
* Storage drivers: (Set in global config under site)
* o single - all translations in a single table (translations)
* o multiple (default) - all translations in a seperate table
* (translation_en, translation_pl, translation_de)
*
* @static
* @access public
* @param string $lang language to return translations
* @param string $type type of object: translation or admin
* @return object $translation Translation2 object
*
*
*/
public static function singleton($type = 'translation')
{
static $instance;
// If the instance exists, return one
if (isset($instance[$type])) {
return $instance[$type];
}
$c = SGL_Config::singleton();
$conf = $c->getAll();
$dbh = SGL_DB::singleton();
// set translation table parameters
$params = array(
'langs_avail_table' => $conf['db']['prefix'] . 'langs',
'lang_id_col' => 'lang_id',
'lang_name_col' => 'name',
'lang_meta_col' => 'meta',
'lang_errmsg_col' => 'error_text',
'lang_encoding_col' => 'encoding',
'string_id_col' => 'translation_id',
'string_page_id_col' => 'page_id',
'string_text_col' => '%s' //'%s' will be replaced by the lang code
);
// set translation driver
$driver = 'DB';
// create translation storage tables
if ($conf['translation']['container'] == 'db') {
$prefix = $conf['db']['prefix'] .
$conf['translation']['tablePrefix'] . '_';
$aLangs = explode(',', $conf['translation']['installedLanguages']);
// set params
foreach ($aLangs as $lang) {
$params['strings_tables'][$lang] = $prefix . $lang;
}
} else {
SGL::raiseError('translation table not specified check global config ',
SGL_ERROR_INVALIDCONFIG, PEAR_ERROR_DIE);
}
// instantiate selected translation2 object
switch (strtolower($type)) {
case 'admin':
require_once 'Translation2/Admin.php';
$instance[$type] = &Translation2_Admin::factory($driver, $dbh, $params);
break;
case 'translation':
default:
require_once 'Translation2.php';
$instance[$type] = &Translation2::factory($driver, $dbh, $params);
}
return $instance[$type];
}
/**
* Clear translation2 and GUI cache
*
* @static
* @access public
*
* @return boolean true on success/false on failure
*/
function clearCache()
{
$c = SGL_Config::singleton();
$conf = $c->getAll();
if ('db' == $conf['translation']['container']) {
// clear Translation2 cache
$trans = SGL_Translation::singleton('admin');
$trans->options['cacheOptions']['cacheDir'] = SGL_TMP_DIR . '/';
$trans->options['cacheOptions']['defaultGroup'] = 'translation';
return $trans->cleanCache();
} else {
// clear file GUI cache
return SGL_Translation::clearGuiTranslationsCache();
}
}
/**
* Clear GUI Translations cache
*
* @static
* @access public
*
* @return boolean true on success/false on failure
*/
function clearGuiTranslationsCache()
{
$c = SGL_Config::singleton();
$aLangs = $aLangs = explode(',', $this->conf['translation']['installedLanguages']);
if (count($aLangs) > 0) {
$cache = SGL_Cache::singleton();
$cache->setOption('cacheDir', SGL_TMP_DIR . '/');
$success = true;
foreach ($aLangs as $group) {
$result = SGL_Cache::clear('translation_' . $group);
$success = $success && $result;
}
return $success;
}
}
/**
* Returns a dictionary of translated strings.
*
* @static
* @param string $module
* @param string $lang
* @return array
*/
function getGuiTranslationsFromFile($module, $lang)
{
// fetch translations from database and cache
$cache = SGL_Cache::singleton();
$lang = SGL_Translation::transformLangID($lang, SGL_LANG_ID_SGL);
$ret = array();
// returned cached translations else fetch from db and cache
if ($serialized = $cache->get($module, 'translation_' . $lang)) {
$words = unserialize($serialized);
SGL::logMessage('translations from cache', PEAR_LOG_DEBUG);
$ret = $words;
} else {
// fetch available languages
$aLanguages = $GLOBALS['_SGL']['LANGUAGE'];
// build global lang file
$langID = str_replace('_', '-', $lang);
$language = @$aLanguages[$langID][1];
$globalLangFile = $language . '.php';
// making an alternative path for email translations
if (strstr($module, '_email')) {
$path = SGL_MOD_DIR . '/' . str_replace('_email', '', $module)
. '/lang/email/';
} else {
$path = SGL_MOD_DIR . '/' . $module . '/lang/';
}
if (is_readable($path . $globalLangFile)) {
include $path . $globalLangFile;
if ($module == 'default') {
$words = &$defaultWords;
}
if (isset($words) && !empty($words)) {
$serialized = serialize($words);
$cache->save($serialized, $module, 'translation_' . $lang);
SGL::logMessage('translations from file', PEAR_LOG_DEBUG);
}
if (isset($words)) {
$ret = $words;
}
} elseif ($module == 'default') {
SGL::raiseError('could not locate the global language file', SGL_ERROR_NOFILE);
}
}
return SGL_Translation2::removeMetaData($ret);
}
/**
* RVS Returns a dictionary of translated strings Master.:phradol,apiruk
*
* @static
* @param string $module
* @param string $lang
* @return array
*/
function rvsGetGuiTranslationsFromFile($module, $lang)
{
// fetch translations from database and cache
$cache = SGL_Cache::singleton();
$lang = SGL_Translation::transformLangID($lang, SGL_LANG_ID_TRANS2);
$lang = SGL_Translation::transformLangID($lang, SGL_LANG_ID_SGL);
$ret = array();
// returned cached translations else fetch from db and cache
if ($serialized = $cache->get($module, 'translation_' . $lang)) {
$words = unserialize($serialized);
SGL::logMessage('translations from cache', PEAR_LOG_DEBUG);
$ret = $words;
} else {
// fetch available languages
$aLanguages = $GLOBALS['_SGL']['LANGUAGE'];
// build global lang file
$langID = str_replace('_', '-', $lang);
$language = @$aLanguages[$langID][1];
$globalLangFile = $language . '.php';
// making an alternative path for email translations
if (strstr($module, '_email')) {
$path = SGL_MOD_DIR . '/' . str_replace('_email', '', $module)
. '/lang/email/';
} else {
$path = SGL_MOD_DIR . '/' . $module . '/lang/';
///RVS START get module path:pharadol,apiruk
$path = SGL_Translation2::rvsGetLangPath($module, $defaultPath = $path);
///RVS END get module path:pharadol,apiruk
}
if (is_readable($path . $globalLangFile)) {
include $path . $globalLangFile;
if ($module == 'default') {
$words = &$defaultWords;
}
if (isset($words) && !empty($words)) {
$serialized = serialize($words);
$cache->save($serialized, $module, 'translation_' . $lang);
SGL::logMessage('translations from file', PEAR_LOG_DEBUG);
}
if (isset($words)) {
$ret = $words;
}
} elseif ($module == 'default') {
SGL::raiseError('could not locate the global language file', SGL_ERROR_NOFILE);
}
}
return SGL_Translation2::removeMetaData($ret);
}
/**
* Update GUI Translations.
*
* @static
* @param array $aTrans hash containing tranlsations to be updated
* @param string $langID language id
* @param string $module module
*
* @return boolean true on success and PEAR Error on failure
*/
function updateGuiTranslations($module, $langID, $aTrans)
{
switch (strtolower($this->conf['translation']['container'])) {
case 'db':
require_once SGL_CORE_DIR . '/Translation.php';
$trans = SGL_Translation::singleton('admin');
$langID = SGL_Translation::transformLangID($langID, SGL_LANG_ID_TRANS2);
foreach ($aTrans as $key => $value) {
$string = array($langID => $value);
$result = $trans->add(stripslashes($key), $module, $string);
if (is_a($result, 'PEAR_Error')) {
return $result;
}
}
return true;
case 'file':
default:
$aTrans = SGL_Translation2::updateMetaData($aTrans);
// read translation data and get reference to root
require_once 'Config.php';
$c = new Config();
$aTransStrip = SGL_Translation2::escapeSingleQuoteInArrayKeys($aTrans);
$root = & $c->parseConfig($aTransStrip, 'phparray');
$langID = SGL_Translation::transformLangID($langID, SGL_LANG_ID_SGL);
// write translation to file
$filename = SGL_Translation2::getFileName($module, $langID);
$arrayName = ($module == 'default') ? 'defaultWords' : 'words';
$result = $c->writeConfig($filename, 'phparray', array('name' => $arrayName));
if (is_a($result, 'PEAR_Error')) {
return $result;
}
return true;
}
}
function getFileName($module, $langId, $path = SGL_MOD_DIR)
{
if (strstr($module, '_email')) {
$fileName = $path . '/' . str_replace('_email', '', $module) . '/lang' .
'/email/' . $GLOBALS['_SGL']['LANGUAGE'][$langId][1] . '.php';
} else {
$fileName = $path . '/' . $module . '/lang/' .
$GLOBALS['_SGL']['LANGUAGE'][$langId][1] . '.php';
///RVS START get file lang path:pharadol,apiruk
$fileName = SGL_Translation2::rvsGetFileName($module, $langId, $pathDefaul = $fileName, $level = 'user');
///RVS END get file lang path:pharadol,apiruk
}
return $fileName;
}
/**
* RVS get file lang path:pharadol,apiruk
*
* @param <string> $module
* @param <string> $langId
* @param <string> $pathDefaul
* @param <string> $level
* @return <string>
*/
function rvsGetFileName($module, $langId, $pathDefaul, $level = 'user')
{
if (defined('RVS_USER_HOME')) {
$rvsModuleLangPath = RVS_USER_HOME . '/.rvsitebuilder/lang/' . $module;
require_once SGL_LIB_PEAR_DIR .'/System.php';
System::mkDir(array('-p', $rvsModuleLangPath));
//owner
$rvsOwnerfilename = $rvsModuleLangPath . '/owner_' . $GLOBALS['_SGL']['LANGUAGE'][$langId][1] . '.php';
//user
$rvsfilename = $rvsModuleLangPath . '/' . $GLOBALS['_SGL']['LANGUAGE'][$langId][1] . '.php';
if (!is_file($rvsfilename) && is_writable($rvsModuleLangPath)) {
$handle = fopen($rvsfilename, 'w+');
fwrite($handle, '');
fclose($handle);
}
}
if ($level == 'user') {
return (isset($rvsfilename)) ? $rvsfilename : $pathDefaul;
} else {
return (isset($rvsOwnerfilename) && is_file($rvsOwnerfilename)) ? $rvsOwnerfilename : false;
}
}
/**
* RVS get module path:pharadol,apiruk
*
* @param <string> $module
* @param <string> $pathDeFault
* @return <string>
*/
function rvsGetLangPath($module, $pathDeFault)
{
if (defined('RVS_USER_HOME')) {
$rvsModuleLangPath = RVS_USER_HOME . '/.rvsitebuilder/lang/' . $module . '/';
require_once SGL_LIB_PEAR_DIR .'/System.php';
System::mkDir(array('-p', $rvsModuleLangPath));
}
return (isset($rvsModuleLangPath)) ? $rvsModuleLangPath : $pathDeFault;
}
/**
* Returns a dictionary of translated strings from the db.
*
* @static
* @param string $module
* @param string $lang
* @param string $fallbackLang
* @return array
*/
function getTranslations($module, $lang, $fallbackLang = false)
{
$c = SGL_Config::singleton();
$conf = $c->getAll();
if (!empty($module) && !empty($lang)) {
$lang = SGL_Translation::transformLangID($lang, SGL_LANG_ID_TRANS2);
$installedLangs = explode(',', $conf['translation']['installedLanguages']);
if ($conf['translation']['container'] == 'db'
&& in_array($lang, $installedLangs)) {
// instantiate translation2 object
$translation = SGL_Translation::singleton();
// set language
$langInstalled = $translation->setLang($lang);
// set translation group
$translation->setPageID($module);
// create decorator for fallback language
if ($fallbackLang) {
$fallbackLang = (is_string($fallbackLang))
? $fallbackLang
: $conf['translation']['fallbackLang'];
$translation = & $translation->getDecorator('Lang');
$translation->setOption('fallbackLang', $fallbackLang);
}
// instantiate cachelite decorator and set options
if ($conf['cache']['enabled']) {
$translation = &$translation->getDecorator('CacheLiteFunction');
$translation->setOption('cacheDir', SGL_TMP_DIR . '/');
$translation->setOption('lifeTime', $conf['cache']['lifetime']);
$translation->setOption('defaultGroup', 'translation');
}
// fetch translations
$words = ($words = $translation->getPage()) ? $words : array();
SGL::logMessage('translations from db for ' . $module, PEAR_LOG_DEBUG);
return $words;
} elseif ($conf['translation']['container'] == 'file') {
return SGL_Translation2::getGuiTranslationsFromFile($module, $lang);
} else {
return array();
}
} else {
return SGL::raiseError('Incorrect parameter passed to ' . __CLASS__ . '::' . __FUNCTION__,
SGL_ERROR_INVALIDARGS);
}
}
/**
* Loads a specific dictionary and merges it to the global SGL['TRANSLATION'] variable
*
* @param string $dictionary
* @param string $lang
*/
function loadDictionary($dictionary, $lang = '')
{
if (empty($lang)) {
$lang = $_SESSION['aPrefs']['language'];
}
$aWords = SGL_Translation2::getTranslations($dictionary, $lang);
if (isset($aWords)) {
$GLOBALS['_SGL']['TRANSLATION'] = array_merge($GLOBALS['_SGL']['TRANSLATION'], $aWords);
}
}
/**
* Returns language ID for currently active lang.
*
* @static
* @return string
*/
function getLangID()
{
if ($langID = str_replace('-', '_', SGL::getCurrentLang() . '_' . $GLOBALS['_SGL']['CHARSET'])) {
return $langID;
} else {
$c = SGL_Config::singleton();
$conf = $c->getAll();
return $conf['translation']['fallbackLang'];
}
}
/**
* Returns default lang as set in installer.
*
* @static
* @return string
*/
function getFallbackLangID()
{
$c = SGL_Config::singleton();
$conf = $c->getAll();
return $conf['translation']['fallbackLang'];
}
/**
* Transform langID to opposite format
*
* SGL_LANG_ID_SGL - en-iso-8859-15
* SGL_LANG_ID_TRANS2 - en_iso_8859_15
*
* @static
* @param string langID language id
* @param int format language id format
* @return langID string
*/
function transformLangID($langID, $format = null)
{
$c = SGL_Config::singleton();
$conf = $c->getAll();
if (isset($format)) {
$langID = ($format == SGL_LANG_ID_SGL)
? str_replace('_', '-', $langID)
: str_replace('-', '_', $langID);
return $langID;
} else {
$langID = (strstr($langID, '-'))
? str_replace('-', '_', $langID)
: str_replace('_', '-', $langID);
return $langID;
}
}
/**
* Remove all translations for all languages for specified module.
*
* @static
* @param string $moduleName module/page name
* @return boolean
*/
function removeTranslations($moduleName)
{
$trans = SGL_Translation::singleton('admin');
$aPages = $trans->getPageNames();
if (SGL::isError($aPages)) {
return $aPages;
}
if (!in_array($moduleName, $aPages)) {
return false; // no translations
}
$aLangs = $trans->getLangs('ids');
if (SGL::isError($aLangs)) {
return $aLangs;
}
$aStrings = array();
foreach ($aLangs as $langId) {
$ret = SGL_Translation::getTranslations($moduleName, $langId);
$aStrings = array_merge($aStrings, array_keys($ret));
}
foreach ($aStrings as $stringId) {
$ret = $trans->remove($stringId, $moduleName);
if (SGL::isError($ret)) {
return $ret;
}
}
return true;
}
/**
* Add/update meta keys to translation array.
*
* @param array $aConfigs
*
* @return array
*
* @static
*/
function updateMetaData($aConfigs)
{
$aMetaData = array(
'__SGL_UPDATED_BY' => SGL_Session::getUsername(),
'__SGL_UPDATED_BY_ID' => SGL_Session::getUid(),
'__SGL_LAST_UPDATED' => SGL_Date::getTime(true)
);
// we do it in this way to put meta data first in array
foreach ($aMetaData as $k => $v) {
if (isset($aConfigs[$k])) {
unset($aConfigs[$k]);
}
}
$aRet = $aMetaData + $aConfigs;
return $aRet;
//return array_merge($aConfigs, $aMetaData);
}
/**
* Remove meta data from translation array.
*
* @param array $aConfigs
* @param boolean $removeAll
*
* @return array
*
* @static
*/
function removeMetaData($aConfigs, $removeAll = false)
{
foreach ($aConfigs as $k => $v) {
if (strpos($k, '__SGL_') === 0) {
if (((strpos($k, '__SGL_CATEGORY_') === 0)
|| (strpos($k, '__SGL_COMMENT_') === 0))
&& !$removeAll) {
continue;
}
unset($aConfigs[$k]);
}
}
return $aConfigs;
}
/**
* Get meta data from translation file.
*
* @param string $moduleName
* @param string $langName
*
* @return array
*
* @static
*/
function getTranslationMetaData($moduleName, $langName)
{
$fileName = self::getFileName($moduleName, $langName);
$words = array();
include $fileName;
if (isset($defaultWords)) {
$words = $defaultWords;
}
$aRet = array();
foreach ($words as $k => $v) {
if (strpos($k, '__SGL_') !== 0) {
break;
}
$aRet[$k] = $v;
}
return $aRet;
}
/**
* Lock translation file.
*
* @param string $moduleName
* @param string $lang
*
* @return void
*
* @static
*/
function lockTranslationFile($moduleName, $lang)
{
$fileName = $moduleName . '_' . $lang . '.lock.txt';
$targetDir = SGL_VAR_DIR . '/translation';
$ok = SGL_Translation2::ensureDirIsWrirable($targetDir);
if (SGL::isError($ok)) {
return $ok;
}
$ok = touch($targetDir . '/' . $fileName);
if ($ok === false) {
return SGL::raiseError(__CLASS__ . ': error creating transation '
. 'locking file', SGL_ERROR_INVALIDFILEPERMS);
}
file_put_contents($targetDir . '/' . $fileName,
SGL_Session::getUsername());
}
/**
* Check if translation is locked.
*
* @param string $moduleName
* @param string $lang
*
* @return boolean
*
* @static
*/
function translationFileIsLocked($moduleName, $lang)
{
$ret = false;
$fileName = SGL_VAR_DIR . "/translation/{$moduleName}_{$lang}.lock.txt";
if (file_exists($fileName)) {
$period = time() - filemtime($fileName);
if ($period < 15 * 60) {
$currentUser = file_get_contents($fileName);
if ($currentUser != SGL_Session::getUsername()) {
$ret = true;
}
} else {
SGL_Translation2::removeTranslationLock($moduleName, $lang);
}
}
return $ret;
}
/**
* Return owner of translation file lock.
*
* @param string $moduleName
* @param string $lang
*
* @return mixed username on success false on failure
*
* @static
*/
function getTranslationLockOwner($moduleName, $lang)
{
$fileName = SGL_VAR_DIR . "/translation/{$moduleName}_{$lang}.lock.txt";
$ret = file_exists($fileName);
if ($ret) {
$ret = file_get_contents($fileName);
}
return $ret;
}
/**
* Remove translation lock.
*
* @param string $moduleName
* @param string $lang
*
* @return void
*
* @static
*/
function removeTranslationLock($moduleName, $lang)
{
$fileName = SGL_VAR_DIR . "/translation/{$moduleName}_{$lang}.lock.txt";
if (file_exists($fileName)) {
$ok = unlink($fileName);
if ($ok === false) {
return SGL::raiseError(__CLASS__ . ': error removing transation '
. 'locking file', SGL_ERROR_INVALIDFILEPERMS);
}
}
}
/**
* Remove locks set by $username.
*
* @param string $userName
*
* @return void
*
* @static
*/
function removeTranslationLocksByUser($username)
{
$targetDir = SGL_VAR_DIR . '/translation';
if (file_exists($targetDir) && is_readable($targetDir)) {
$dh = opendir($targetDir);
while (($fileName = readdir($dh)) !== false) {
if ($fileName == '..' || $fileName == '.') {
continue;
}
$configFile = $targetDir . '/' . $fileName;
$lockedUser = file_get_contents($configFile);
if ($lockedUser == $username) {
$ok = unlink($configFile);
if ($ok === false) {
return SGL::raiseError(__CLASS__ . ': error removing '
. 'transation locking file',
SGL_ERROR_INVALIDFILEPERMS);
}
}
}
closedir($dh);
}
}
/**
* Ensure that target dir exist and is writable.
*
* @param string $dirName
*
* @return boolean
*
* @static
*
* @todo move to SGL_File
*/
function ensureDirIsWrirable($dirName)
{
if (!is_writable($dirName)) {
require_once 'System.php';
$ok = System::mkDir(array('-p', $dirName));
if (SGL::isError($ok)) {
return $ok;
}
if (!$ok) {
return SGL::raiseError("Error making directory
'$dirName' writable");
}
$mask = umask(0);
$ok = @chmod($dirName, 0777);
if (!$ok) {
return SGL::raiseError("Error performing chmod on
directory '$dirName'");
}
umask($mask);
}
return true;
}
/**
* Esacape single quote.
*
* @param string $string
*
* @return string
*
* @static
*
* @todo move to SGL_String
*/
function escapeSingleQuote($string)
{
$ret = str_replace('\\', '\\\\', $string);
$ret = str_replace("'", '\\\'', $ret);
return $ret;
}
/**
* Escape single quotes in every key of given array.
*
* @param array $array
*
* @return array
*
* @static
*/
function escapeSingleQuoteInArrayKeys($array)
{
$ret = array();
foreach ($array as $key => $value) {
$k = SGL_Translation2::escapeSingleQuote($key);
$ret[$k] = is_array($value)
? SGL_Translation2::escapeSingleQuoteInArrayKeys($value)
: $value;
}
return $ret;
}
function getTranslationStorageSize($moduleName, $langId, $getWordsCount = false)
{
$errorsBefore = SGL_Error::count();
$aTrans = SGL_Translation2::getTranslations($moduleName, $langId);
$aTrans = SGL_Translation2::removeMetaData($aTrans, true);
$fallLang = SGL_Translation2::getFallbackLangID();
$fallLang = SGL_Translation2::transformLangID($fallLang, SGL_LANG_ID_SGL);
if ($langId != $fallLang) {
$aFallbackTrans = SGL_Translation2::getTranslations($moduleName, $fallLang);
$aFallbackTrans = SGL_Translation2::removeMetaData($aFallbackTrans, true);
$aTrans2 = array_intersect(array_keys($aFallbackTrans), array_keys($aTrans));
$aTmp = array();
// make sure we intersect correctly
foreach ($aTrans2 as $key) {
if (array_key_exists($key, $aTrans)) {
$aTmp[$key] = $aTrans[$key];
}
}
$aTrans = $aTmp;
unset($aTmp, $aTrans2);
}
$errorsAfter = SGL_Error::count();
// remove the error in case language file was not found
// we assume it has zero strings
if ($errorsAfter > $errorsBefore) {
SGL_Error::pop();
}
// get number for words
if ($getWordsCount) {
$words = 0;
if (!empty($aTrans)) {
$text = trim(implode(' ', $aTrans)); // whole text
$aWords = explode(' ', $text); // words
$words = count($aWords);
}
$ret = array(
'strings' => count($aTrans),
'words' => $words
);
} else {
$ret = count($aTrans);
}
return $ret;
}
}
?>
Copyright 2K16 - 2K18 Indonesian Hacker Rulez