189 lines
7.6 KiB
PHP
189 lines
7.6 KiB
PHP
<?php
|
|
|
|
/**
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; under version 2
|
|
* of the License (non-upgradable).
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Copyright (c) 2008-2010 (original work) Deutsche Institut für Internationale Pädagogische Forschung (under the project TAO-TRANSFER);
|
|
* 2009-2012 (update and modification) Public Research Centre Henri Tudor (under the project TAO-SUSTAIN & TAO-DEV);
|
|
* 2013 (update and modification) Open Assessment Technologies SA (under the project TAO-PRODUCT);
|
|
*
|
|
*/
|
|
|
|
use oat\generis\model\OntologyRdf;
|
|
use oat\tao\model\TaoOntology;
|
|
|
|
/**
|
|
* Internationalization helper.
|
|
*
|
|
* @author Jérôme Bogaerts <jerome@taotesting.com>
|
|
*/
|
|
class tao_helpers_I18n
|
|
{
|
|
|
|
/**
|
|
* Short description of attribute AVAILABLE_LANGS_CACHEKEY
|
|
*
|
|
* @access private
|
|
* @var string
|
|
*/
|
|
const AVAILABLE_LANGS_CACHEKEY = 'i18n_available_langs';
|
|
|
|
/**
|
|
* Short description of attribute availableLangs
|
|
*
|
|
* @access protected
|
|
* @var array
|
|
*/
|
|
protected static $availableLangs = [];
|
|
|
|
/**
|
|
* Load the translation strings
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
* @param common_ext_Extension $extension
|
|
* @param string langCode
|
|
* @return mixed
|
|
*/
|
|
public static function init(common_ext_Extension $extension, $langCode)
|
|
{
|
|
// if the langCode is empty do nothing
|
|
if (empty($langCode)) {
|
|
throw new Exception("Language is not defined");
|
|
}
|
|
|
|
//init the ClearFw l10n tools
|
|
$translations = tao_models_classes_LanguageService::singleton()->getServerBundle($langCode);
|
|
l10n::init($translations);
|
|
|
|
$serviceManager = \oat\oatbox\service\ServiceManager::getServiceManager();
|
|
$extraPoService = $serviceManager->get(\oat\tao\model\i18n\ExtraPoService::SERVICE_ID);
|
|
$extraPoCount = $extraPoService->requirePos();
|
|
}
|
|
|
|
/**
|
|
* Returns the current interface language for backwards compatibility
|
|
*
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public static function getLangCode()
|
|
{
|
|
return common_session_SessionManager::getSession()->getInterfaceLanguage();
|
|
}
|
|
|
|
/**
|
|
* Returns the code of a resource
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
* @param string code
|
|
* @return core_kernel_classes_Resource
|
|
*/
|
|
public static function getLangResourceByCode($code)
|
|
{
|
|
$langs = self::getAvailableLangs();
|
|
return isset($langs[$code]) ? new core_kernel_classes_Resource($langs[$code]['uri']) : null;
|
|
}
|
|
|
|
/**
|
|
* @param unknown $code
|
|
* @return boolean
|
|
*/
|
|
public static function isLanguageRightToLeft($code)
|
|
{
|
|
$orientation = null;
|
|
$langs = self::getAvailableLangs();
|
|
$orientation = isset($langs[$code]) ? $langs[$code][tao_models_classes_LanguageService::PROPERTY_LANGUAGE_ORIENTATION] : null;
|
|
return $orientation == tao_models_classes_LanguageService::INSTANCE_ORIENTATION_RTL;
|
|
}
|
|
|
|
/**
|
|
* This method returns the languages available in TAO.
|
|
*
|
|
* @access public
|
|
* @author Jerome Bogaerts, <jerome.bogaerts@tudor.lu>
|
|
* @param boolean langName If set to true, an associative array where keys are language codes and values are language labels. If set to false (default), a simple array of language codes is returned.
|
|
* @return array
|
|
* @throws common_exception_InconsistentData
|
|
*/
|
|
private static function getAvailableLangs()
|
|
{
|
|
//get it into the api only once
|
|
if (count(self::$availableLangs) == 0) {
|
|
try {
|
|
self::$availableLangs = common_cache_FileCache::singleton()->get(self::AVAILABLE_LANGS_CACHEKEY);
|
|
} catch (common_cache_NotFoundException $e) {
|
|
$langClass = new core_kernel_classes_Class(tao_models_classes_LanguageService::CLASS_URI_LANGUAGES);
|
|
$valueProperty = new core_kernel_classes_Property(OntologyRdf::RDF_VALUE);
|
|
foreach ($langClass->getInstances() as $lang) {
|
|
$values = $lang->getPropertiesValues([
|
|
OntologyRdf::RDF_VALUE,
|
|
tao_models_classes_LanguageService::PROPERTY_LANGUAGE_USAGES,
|
|
tao_models_classes_LanguageService::PROPERTY_LANGUAGE_ORIENTATION
|
|
]);
|
|
if (count($values[OntologyRdf::RDF_VALUE]) != 1) {
|
|
throw new common_exception_InconsistentData('Error with value of language ' . $lang->getUri());
|
|
}
|
|
$value = current($values[OntologyRdf::RDF_VALUE])->__toString();
|
|
$usages = [];
|
|
foreach ($values[tao_models_classes_LanguageService::PROPERTY_LANGUAGE_USAGES] as $usage) {
|
|
$usages[] = $usage->getUri();
|
|
}
|
|
if (count($values[tao_models_classes_LanguageService::PROPERTY_LANGUAGE_ORIENTATION]) != 1) {
|
|
common_Logger::w('Error with orientation of language ' . $lang->getUri());
|
|
$orientation = tao_models_classes_LanguageService::INSTANCE_ORIENTATION_LTR;
|
|
} else {
|
|
$orientation = current($values[tao_models_classes_LanguageService::PROPERTY_LANGUAGE_ORIENTATION ])->getUri();
|
|
}
|
|
self::$availableLangs[$value] = [
|
|
'uri' => $lang->getUri(),
|
|
tao_models_classes_LanguageService::PROPERTY_LANGUAGE_USAGES => $usages,
|
|
tao_models_classes_LanguageService::PROPERTY_LANGUAGE_ORIENTATION => $orientation
|
|
];
|
|
}
|
|
common_cache_FileCache::singleton()->put(self::$availableLangs, self::AVAILABLE_LANGS_CACHEKEY);
|
|
}
|
|
}
|
|
|
|
return self::$availableLangs;
|
|
}
|
|
|
|
/**
|
|
* Get available languages from the knownledge base depending on a specific usage.
|
|
*
|
|
* By default, TAO considers two built-in usages:
|
|
*
|
|
* * GUI Language ('http://www.tao.lu/Ontologies/TAO.rdf#LanguageUsageGUI')
|
|
* * Data Language ('http://www.tao.lu/Ontologies/TAO.rdf#LanguageUsageData')
|
|
*
|
|
* @author Jérôme Bogaerts <jerome@taotesting.com>
|
|
* @param core_kernel_classes_Resource $usage Resource usage An instance of tao:LanguagesUsages from the knowledge base.
|
|
* @return array An associative array of core_kernel_classes_Resource objects index by language code.
|
|
*/
|
|
public static function getAvailableLangsByUsage(core_kernel_classes_Resource $usage)
|
|
{
|
|
$returnValue = [];
|
|
|
|
foreach (self::getAvailableLangs() as $code => $langData) {
|
|
if (in_array($usage->getUri(), $langData[tao_models_classes_LanguageService::PROPERTY_LANGUAGE_USAGES])) {
|
|
$lang = new core_kernel_classes_Resource($langData['uri']);
|
|
$returnValue[$code] = $lang->getLabel();
|
|
}
|
|
}
|
|
return $returnValue;
|
|
}
|
|
}
|