From 7a1729e0c8b64b85f908f4580c5ebdad792175d3 Mon Sep 17 00:00:00 2001 From: Uwe Steinmann Date: Tue, 28 Oct 2025 21:35:17 +0100 Subject: [PATCH] move all translation methods into class --- inc/inc.ClassTranslator.php | 409 ++++++++++++++++++++++++++++++++++++ inc/inc.Language.php | 329 ++--------------------------- 2 files changed, 432 insertions(+), 306 deletions(-) create mode 100644 inc/inc.ClassTranslator.php diff --git a/inc/inc.ClassTranslator.php b/inc/inc.ClassTranslator.php new file mode 100644 index 000000000..feda07b1d --- /dev/null +++ b/inc/inc.ClassTranslator.php @@ -0,0 +1,409 @@ + + * @copyright Copyright (C) 2025 Uwe Steinmann + * @version Release: @package_version@ + */ + +namespace Seeddms\Seeddms; + +/** + * Class for translation and language handling + * + * @category DMS + * @package SeedDMS + * @author Uwe Steinmann + * @copyright Copyright (C) 2011 Uwe Steinmann + * @version Release: @package_version@ + */ +class Translator { /* {{{ */ + + protected $settings; + + protected $defaultlang; + + protected $lang; + + protected $missinglang; + + /** + * Constructor + * + * @param string $settings SeedDMS configuration + */ + function __construct($settings=null) { /* {{{ */ + $this->settings = $settings; + $this->defaultlang = ''; + + $this->lang = array(); + $this->missinglang = array(); + } /* }}} */ + + function setDefaultLanguage($lang) { /* {{{ */ + $this->defaultlang = $lang; + } /* }}} */ + + public function init() { /* {{{ */ + $__languages = $this->getLanguages(); + if(!in_array($this->settings->_language, $__languages)) + $__languages[] = $this->settings->_language; + foreach($__languages as $_lang) { + if(file_exists($this->settings->_rootDir . "languages/" . $_lang . "/lang.inc")) { + include $this->settings->_rootDir . "languages/" . $_lang . "/lang.inc"; + $this->lang[$_lang] = $text; + } + } + } /* }}} */ + + function addPhrases($lang, &$data) { /* {{{ */ + if(isset($this->lang[$lang])) + $this->lang[$lang] = array_merge($this->lang[$lang], $data); + else + $this->lang[$lang] = $data; + } /* }}} */ + + function getAvailableLanguages() { /* {{{ */ + $languages = array(); + + $path = $this->settings->_rootDir . "languages/"; + $handle = opendir($path); + + while ($entry = readdir($handle) ) + { + if ($entry == ".." || $entry == ".") { + continue; + } elseif (is_dir($path . $entry)) { + array_push($languages, $entry); + } + } + closedir($handle); + + asort($languages); + return $languages; + } /* }}} */ + + function getLanguages() { /* {{{ */ + if($this->settings->_availablelanguages) { + return $this->settings->_availablelanguages; + } + + return getAvailableLanguages(); + } /* }}} */ + + /** + * Get translation + * + * Returns the translation for a given key. It will replace markers + * in the form [xxx] with those elements from the array $replace. + * A default text can be gіven for the case, that there is no translation + * available. The fourth parameter can override the currently set language + * in the session or the default language from the configuration. + * + * @param string $key key of translation text + * @param array $replace list of values that replace markers in the text + * @param string $defaulttext text used if no translation can be found + * @param string $lang use this language instead of the currently set lang + */ + function translate($key, $replace = array(), $defaulttext = null, $lang="") { /* {{{ */ + $trantext = ''; + if(!$lang) { + if($this->defaultlang) + $lang = $this->defaultlang; + else + $lang = $this->settings->_language; + } + + if(!isset($this->lang[$lang][$key]) || !$this->lang[$lang][$key]) { + if ($defaulttext === null) { + $this->missinglang[$key] = $lang; //$_SERVER['SCRIPT_NAME']; + if(!empty($this->lang[$this->settings->_language][$key])) { + $tmpText = $this->lang[$this->settings->_language][$key]; + } else { + $tmpText = '**'.$key.'**'; + } + } else + $tmpText = $defaulttext; + } else + $tmpText = $this->lang[$lang][$key]; + + if (count($replace) == 0) + return $tmpText.$trantext; + + $keys = array_keys($replace); + foreach ($keys as $key) + $tmpText = str_replace("[".$key."]", $replace[$key], $tmpText); + + return $tmpText; + } /* }}} */ + + function print($key, $replace = array(), $defaulttext = null, $lang="") { /* {{{ */ + print $this->translate($key, $replace, $defaulttext, $lang); + } /* }}} */ + + function printReviewStatusText($status, $date=0) { /* {{{ */ + if (is_null($status)) { + print $this->translate("status_unknown"); + } + else { + switch ($status) { + case -2: + print $this->translate("status_reviewer_removed"); + break; + case -1: + print $this->translate("status_reviewer_rejected").($date !=0 ? " ".$date : ""); + break; + case 0: + print $this->translate("status_not_reviewed"); + break; + case 1: + print $this->translate("status_reviewed").($date !=0 ? " ".$date : ""); + break; + default: + print $this->translate("status_unknown"); + break; + } + } + } /* }}} */ + + function getReviewStatusText($status, $date=0) { /* {{{ */ + if (is_null($status)) { + return $this->translate("status_unknown"); + } + else { + switch ($status) { + case -2: + return $this->translate("status_reviewer_removed"); + break; + case -1: + return $this->translate("status_reviewer_rejected").($date !=0 ? " ".$date : ""); + break; + case 0: + return $this->translate("status_not_reviewed"); + break; + case 1: + return $this->translate("status_reviewed").($date !=0 ? " ".$date : ""); + break; + default: + return $this->translate("status_unknown"); + break; + } + } + } /* }}} */ + + function printApprovalStatusText($status, $date=0) { /* {{{ */ + if (is_null($status)) { + print $this->translate("status_unknown"); + } + else { + switch ($status) { + case -2: + print $this->translate("status_approver_removed"); + break; + case -1: + print $this->translate("status_approval_rejected").($date !=0 ? " ".$date : ""); + break; + case 0: + print $this->translate("status_not_approved"); + break; + case 1: + print $this->translate("status_approved").($date !=0 ? " ".$date : ""); + break; + default: + print $this->translate("status_unknown"); + break; + } + } + } /* }}} */ + + function getApprovalStatusText($status, $date=0) { /* {{{ */ + if (is_null($status)) { + return $this->translate("status_unknown"); + } + else { + switch ($status) { + case -2: + return $this->translate("status_approver_removed"); + break; + case -1: + return $this->translate("status_approval_rejected").($date !=0 ? " ".$date : ""); + break; + case 0: + return $this->translate("status_not_approved"); + break; + case 1: + return $this->translate("status_approved").($date !=0 ? " ".$date : ""); + break; + default: + return $this->translate("status_unknown"); + break; + } + } + } /* }}} */ + + function printOverallStatusText($status) { /* {{{ */ + print getOverallStatusText($status); + } /* }}} */ + + function getOverallStatusText($status) { /* {{{ */ + if (is_null($status)) { + return $this->translate("assumed_released"); + } + else { + switch($status) { + case S_IN_WORKFLOW: + return $this->translate("in_workflow"); + break; + case S_DRAFT_REV: + return $this->translate("draft_pending_review"); + break; + case S_DRAFT_APP: + return $this->translate("draft_pending_approval"); + break; + case S_RELEASED: + return $this->translate("released"); + break; + case S_REJECTED: + return $this->translate("rejected"); + break; + case S_OBSOLETE: + return $this->translate("obsolete"); + break; + case S_EXPIRED: + return $this->translate("expired"); + break; + default: + return $this->translate("status_unknown"); + break; + } + } + } /* }}} */ + + function getAttributeTypeText($attrdef) { /* {{{ */ + $t = ''; + switch($attrdef->getType()) { + case SeedDMS_Core_AttributeDefinition::type_int: + $t = $this->translate("attrdef_type_int"); + break; + case SeedDMS_Core_AttributeDefinition::type_float: + $t = $this->translate("attrdef_type_float"); + break; + case SeedDMS_Core_AttributeDefinition::type_string: + $t = $this->translate("attrdef_type_string"); + break; + case SeedDMS_Core_AttributeDefinition::type_boolean: + $t = $this->translate("attrdef_type_boolean"); + break; + case SeedDMS_Core_AttributeDefinition::type_date: + $t = $this->translate("attrdef_type_date"); + break; + case SeedDMS_Core_AttributeDefinition::type_email: + $t = $this->translate("attrdef_type_email"); + break; + case SeedDMS_Core_AttributeDefinition::type_url: + $t = $this->translate("attrdef_type_url"); + break; + case SeedDMS_Core_AttributeDefinition::type_boolean: + $t = $this->translate("attrdef_type_boolean"); + break; + case SeedDMS_Core_AttributeDefinition::type_folder: + $t = $this->translate("attrdef_type_folder"); + break; + case SeedDMS_Core_AttributeDefinition::type_document: + $t = $this->translate("attrdef_type_document"); + break; + case SeedDMS_Core_AttributeDefinition::type_user: + $t = $this->translate("attrdef_type_user"); + break; + case SeedDMS_Core_AttributeDefinition::type_group: + $t = $this->translate("attrdef_type_group"); + break; + } + return $t; + } /* }}} */ + + function getAttributeObjectTypeText($attrdef) { /* {{{ */ + $ot = ''; + switch($attrdef->getObjType()) { + case SeedDMS_Core_AttributeDefinition::objtype_all: + $ot = $this->translate("all"); + break; + case SeedDMS_Core_AttributeDefinition::objtype_folder: + $ot = $this->translate("folder"); + break; + case SeedDMS_Core_AttributeDefinition::objtype_document: + $ot = $this->translate("document"); + break; + case SeedDMS_Core_AttributeDefinition::objtype_documentcontent: + $ot = $this->translate("documentcontent"); + break; + default: + $ot = $this->translate('objtype_unknown'); + } + return $ot; + } /* }}} */ + + function getAttributeValidationText($error, $attrname='', $attrvalue='', $regex='') { /* {{{ */ + $arr = getAttributeValidationError($error, $attrname, $attrvalue, $regex); + + return $this->translate($arr[0], $arr[1]); + } /* }}} */ + + function getAttributeValidationError($error, $attrname='', $attrvalue='', $regex='') { /* {{{ */ + if(is_object($attrvalue)) + $attrvalue = $attrvalue->getId(); + switch($error) { + case 14: + return array("attr_not_in_valueset", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 13: + return array("attr_not_a_group", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 12: + return array("attr_not_a_user", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 11: + return array("attr_not_a_folder", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 10: + return array("attr_not_a_document", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 9: + return array("attr_malformed_date", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 8: + return array("attr_malformed_boolean", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 7: + return array("attr_malformed_float", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 6: + return array("attr_malformed_int", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 5: + return array("attr_malformed_email", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 4: + return array("attr_malformed_url", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 3: + return array("attr_no_regex_match", array('attrname'=>$attrname, 'value'=>$attrvalue, 'regex'=>$regex)); + break; + case 2: + return array("attr_max_values", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + case 1: + return array("attr_min_values", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + default: + return array("attr_validation_error", array('attrname'=>$attrname, 'value'=>$attrvalue)); + break; + } + } /* }}} */ + +} /* }}} */ diff --git a/inc/inc.Language.php b/inc/inc.Language.php index 8c9ceb59d..deb8850dd 100644 --- a/inc/inc.Language.php +++ b/inc/inc.Language.php @@ -18,48 +18,19 @@ // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -$LANG = array(); -$MISSING_LANG = array(); -$__languages = getLanguages(); -if(!in_array($settings->_language, $__languages)) - $__languages[] = $settings->_language; -foreach($__languages as $_lang) { - if(file_exists($settings->_rootDir . "languages/" . $_lang . "/lang.inc")) { - include $settings->_rootDir . "languages/" . $_lang . "/lang.inc"; - $LANG[$_lang] = $text; - } -} -unset($text); +use Seeddms\Seeddms\Translator; + +$translator = new Translator($settings); +$translator->init(); function getAvailableLanguages() { /* {{{ */ - global $settings; + error_log('getAvailableLanguages() is deprecated'); - $languages = array(); - - $path = $settings->_rootDir . "languages/"; - $handle = opendir($path); - - while ($entry = readdir($handle) ) - { - if ($entry == ".." || $entry == ".") - continue; - else if (is_dir($path . $entry)) - array_push($languages, $entry); - } - closedir($handle); - - asort($languages); - return $languages; + return $GLOBALS['translator']->getAvailableLanguages(); } /* }}} */ function getLanguages() { /* {{{ */ - global $settings; - - if($settings->_availablelanguages) { - return $settings->_availablelanguages; - } - - return getAvailableLanguages(); + return $GLOBALS['translator']->getLanguages(); } /* }}} */ /** @@ -77,310 +48,56 @@ function getLanguages() { /* {{{ */ * @param string $lang use this language instead of the currently set lang */ function getMLText($key, $replace = array(), $defaulttext = null, $lang="") { /* {{{ */ - GLOBAL $settings, $LANG, $session, $MISSING_LANG; - - $trantext = ''; - if(0 && $settings->_otrance) { - $trantext = '
'; + trigger_error("getMLText() is deprecated.", E_USER_DEPRECATED); + foreach(debug_backtrace() as $n) { + trigger_error($n['file'].": Line ".$n['line'], E_USER_DEPRECATED); } - if(!$lang) { - if($session) - $lang = $session->getLanguage(); - else - $lang = $settings->_language; - } - - if(!isset($LANG[$lang][$key]) || !$LANG[$lang][$key]) { - if ($defaulttext === null) { - $MISSING_LANG[$key] = $lang; //$_SERVER['SCRIPT_NAME']; - if(!empty($LANG[$settings->_language][$key])) { - $tmpText = $LANG[$settings->_language][$key]; - } else { - $tmpText = '**'.$key.'**'; - } - } else - $tmpText = $defaulttext; - } else - $tmpText = $LANG[$lang][$key]; - - if(0 && $settings->_otrance) { - $_GLOBALS['used_langs'][$key] = $tmpText; - } - - if (count($replace) == 0) - return $tmpText.$trantext; - - $keys = array_keys($replace); - foreach ($keys as $key) - $tmpText = str_replace("[".$key."]", $replace[$key], $tmpText); - - return $tmpText; + return $GLOBALS['translator']->translate($key, $replace, $defaulttext, $lang); } /* }}} */ -function printMLText($key, $replace = array(), $defaulttext = null, $lang="") /* {{{ */ -{ - print getMLText($key, $replace, $defaulttext, $lang); +function printMLText($key, $replace = array(), $defaulttext = null, $lang="") { /* {{{ */ + $GLOBALS['translator']->print($key, $replace, $defaulttext, $lang); } /* }}} */ function printReviewStatusText($status, $date=0) { /* {{{ */ - if (is_null($status)) { - print getMLText("status_unknown"); - } - else { - switch ($status) { - case -2: - print getMLText("status_reviewer_removed"); - break; - case -1: - print getMLText("status_reviewer_rejected").($date !=0 ? " ".$date : ""); - break; - case 0: - print getMLText("status_not_reviewed"); - break; - case 1: - print getMLText("status_reviewed").($date !=0 ? " ".$date : ""); - break; - default: - print getMLText("status_unknown"); - break; - } - } + $GLOBALS['translator']->printReviewStatusText($status, $date); } /* }}} */ function getReviewStatusText($status, $date=0) { /* {{{ */ - if (is_null($status)) { - return getMLText("status_unknown"); - } - else { - switch ($status) { - case -2: - return getMLText("status_reviewer_removed"); - break; - case -1: - return getMLText("status_reviewer_rejected").($date !=0 ? " ".$date : ""); - break; - case 0: - return getMLText("status_not_reviewed"); - break; - case 1: - return getMLText("status_reviewed").($date !=0 ? " ".$date : ""); - break; - default: - return getMLText("status_unknown"); - break; - } - } + return $GLOBALS['translator']->getReviewStatusText($status, $date); } /* }}} */ function printApprovalStatusText($status, $date=0) { /* {{{ */ - if (is_null($status)) { - print getMLText("status_unknown"); - } - else { - switch ($status) { - case -2: - print getMLText("status_approver_removed"); - break; - case -1: - print getMLText("status_approval_rejected").($date !=0 ? " ".$date : ""); - break; - case 0: - print getMLText("status_not_approved"); - break; - case 1: - print getMLText("status_approved").($date !=0 ? " ".$date : ""); - break; - default: - print getMLText("status_unknown"); - break; - } - } + $GLOBALS['translator']->printApprovalStatusText($status, $date); } /* }}} */ function getApprovalStatusText($status, $date=0) { /* {{{ */ - if (is_null($status)) { - return getMLText("status_unknown"); - } - else { - switch ($status) { - case -2: - return getMLText("status_approver_removed"); - break; - case -1: - return getMLText("status_approval_rejected").($date !=0 ? " ".$date : ""); - break; - case 0: - return getMLText("status_not_approved"); - break; - case 1: - return getMLText("status_approved").($date !=0 ? " ".$date : ""); - break; - default: - return getMLText("status_unknown"); - break; - } - } + return $GLOBALS['translator']->getApprovalStatusText($status, $date); } /* }}} */ function printOverallStatusText($status) { /* {{{ */ - print getOverallStatusText($status); + $GLOBALS['translator']->printOverallStatusText($status); } /* }}} */ function getOverallStatusText($status) { /* {{{ */ - if (is_null($status)) { - return getMLText("assumed_released"); - } - else { - switch($status) { - case S_IN_WORKFLOW: - return getMLText("in_workflow"); - break; - case S_DRAFT_REV: - return getMLText("draft_pending_review"); - break; - case S_DRAFT_APP: - return getMLText("draft_pending_approval"); - break; - case S_RELEASED: - return getMLText("released"); - break; - case S_REJECTED: - return getMLText("rejected"); - break; - case S_OBSOLETE: - return getMLText("obsolete"); - break; - case S_EXPIRED: - return getMLText("expired"); - break; - default: - return getMLText("status_unknown"); - break; - } - } + return $GLOBALS['translator']->getOverallStatusText($status); } /* }}} */ function getAttributeTypeText($attrdef) { /* {{{ */ - $t = ''; - switch($attrdef->getType()) { - case SeedDMS_Core_AttributeDefinition::type_int: - $t = getMLText("attrdef_type_int"); - break; - case SeedDMS_Core_AttributeDefinition::type_float: - $t = getMLText("attrdef_type_float"); - break; - case SeedDMS_Core_AttributeDefinition::type_string: - $t = getMLText("attrdef_type_string"); - break; - case SeedDMS_Core_AttributeDefinition::type_boolean: - $t = getMLText("attrdef_type_boolean"); - break; - case SeedDMS_Core_AttributeDefinition::type_date: - $t = getMLText("attrdef_type_date"); - break; - case SeedDMS_Core_AttributeDefinition::type_email: - $t = getMLText("attrdef_type_email"); - break; - case SeedDMS_Core_AttributeDefinition::type_url: - $t = getMLText("attrdef_type_url"); - break; - case SeedDMS_Core_AttributeDefinition::type_boolean: - $t = getMLText("attrdef_type_boolean"); - break; - case SeedDMS_Core_AttributeDefinition::type_folder: - $t = getMLText("attrdef_type_folder"); - break; - case SeedDMS_Core_AttributeDefinition::type_document: - $t = getMLText("attrdef_type_document"); - break; - case SeedDMS_Core_AttributeDefinition::type_user: - $t = getMLText("attrdef_type_user"); - break; - case SeedDMS_Core_AttributeDefinition::type_group: - $t = getMLText("attrdef_type_group"); - break; - } - return $t; + return $GLOBALS['translator']->getAttributeTypeText($attrdef); } /* }}} */ function getAttributeObjectTypeText($attrdef) { /* {{{ */ - $ot = ''; - switch($attrdef->getObjType()) { - case SeedDMS_Core_AttributeDefinition::objtype_all: - $ot = getMLText("all"); - break; - case SeedDMS_Core_AttributeDefinition::objtype_folder: - $ot = getMLText("folder"); - break; - case SeedDMS_Core_AttributeDefinition::objtype_document: - $ot = getMLText("document"); - break; - case SeedDMS_Core_AttributeDefinition::objtype_documentcontent: - $ot = getMLText("documentcontent"); - break; - default: - $ot = getMLText('objtype_unknown'); - } - return $ot; + return $GLOBALS['translator']->getAttributeObjectTypeText($attrdef); } /* }}} */ function getAttributeValidationText($error, $attrname='', $attrvalue='', $regex='') { /* {{{ */ - $arr = getAttributeValidationError($error, $attrname, $attrvalue, $regex); - - return getMLText($arr[0], $arr[1]); + return $GLOBALS['translator']->getAttributeValidationText($error, $attrname, $attrvalue, $regex); } /* }}} */ function getAttributeValidationError($error, $attrname='', $attrvalue='', $regex='') { /* {{{ */ - if(is_object($attrvalue)) - $attrvalue = $attrvalue->getId(); - switch($error) { - case 14: - return array("attr_not_in_valueset", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 13: - return array("attr_not_a_group", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 12: - return array("attr_not_a_user", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 11: - return array("attr_not_a_folder", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 10: - return array("attr_not_a_document", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 9: - return array("attr_malformed_date", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 8: - return array("attr_malformed_boolean", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 7: - return array("attr_malformed_float", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 6: - return array("attr_malformed_int", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 5: - return array("attr_malformed_email", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 4: - return array("attr_malformed_url", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 3: - return array("attr_no_regex_match", array('attrname'=>$attrname, 'value'=>$attrvalue, 'regex'=>$regex)); - break; - case 2: - return array("attr_max_values", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - case 1: - return array("attr_min_values", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - default: - return array("attr_validation_error", array('attrname'=>$attrname, 'value'=>$attrvalue)); - break; - } + return $GLOBALS['translator']->getAttributeValidationText($error, $attrname, $attrvalue, $regex); } /* }}} */