From 387774a09c788f4f609ed3ffd7cb6be855de4342 Mon Sep 17 00:00:00 2001 From: Jaime Perez Crespo <jaime.perez@uninett.no> Date: Fri, 5 Feb 2016 14:26:48 +0100 Subject: [PATCH] Reformat \SimpleSAML\Locale\Translate. --- lib/SimpleSAML/Locale/Translate.php | 229 ++++++++++++++++------------ 1 file changed, 128 insertions(+), 101 deletions(-) diff --git a/lib/SimpleSAML/Locale/Translate.php b/lib/SimpleSAML/Locale/Translate.php index 9d192185d..4740e8f67 100644 --- a/lib/SimpleSAML/Locale/Translate.php +++ b/lib/SimpleSAML/Locale/Translate.php @@ -10,7 +10,8 @@ namespace SimpleSAML\Locale; -class Translate { +class Translate +{ private $configuration = null; @@ -26,25 +27,29 @@ class Translate { /** * The default dictionary. */ - private $defaultDictionary = NULL; + private $defaultDictionary = null; /** * Constructor * * @param \SimpleSAML_Configuration $configuration Configuration object - * @param string|null $defaultDictionary The default dictionary where tags will come from. + * @param string|null $defaultDictionary The default dictionary where tags will come from. */ - function __construct(\SimpleSAML_Configuration $configuration, $defaultDictionary = NULL) { + public function __construct(\SimpleSAML_Configuration $configuration, $defaultDictionary = null) + { $this->configuration = $configuration; $this->language = new Language($configuration); - if($defaultDictionary !== NULL && substr($defaultDictionary, -4) === '.php') { - /* For backwards compatibility - print warning. */ + if ($defaultDictionary !== null && substr($defaultDictionary, -4) === '.php') { + // TODO: drop this entire if clause for 2.0 + // for backwards compatibility - print warning $backtrace = debug_backtrace(); - $where = $backtrace[0]['file'] . ':' . $backtrace[0]['line']; - \SimpleSAML_Logger::warning('Deprecated use of new SimpleSAML\Locale\Translate(...) at ' . $where . - '. The last parameter is now a dictionary name, which should not end in ".php".'); + $where = $backtrace[0]['file'].':'.$backtrace[0]['line']; + \SimpleSAML_Logger::warning( + 'Deprecated use of new SimpleSAML\Locale\Translate(...) at '.$where. + '. The last parameter is now a dictionary name, which should not end in ".php".' + ); $this->defaultDictionary = substr($defaultDictionary, 0, -4); } else { @@ -58,23 +63,25 @@ class Translate { * * @param string $name The name of the dictionary, as the filename in the dictionary directory, without the * '.php' ending. + * * @return array An associative array with the dictionary. */ - private function getDictionary($name) { + private function getDictionary($name) + { assert('is_string($name)'); - if(!array_key_exists($name, $this->dictionaries)) { + if (!array_key_exists($name, $this->dictionaries)) { $sepPos = strpos($name, ':'); - if($sepPos !== FALSE) { + if ($sepPos !== false) { $module = substr($name, 0, $sepPos); $fileName = substr($name, $sepPos + 1); - $dictDir = \SimpleSAML_Module::getModuleDir($module) . '/dictionaries/'; + $dictDir = \SimpleSAML_Module::getModuleDir($module).'/dictionaries/'; } else { $dictDir = $this->configuration->getPathValue('dictionarydir', 'dictionaries/'); $fileName = $name; } - $this->dictionaries[$name] = $this->readDictionaryFile($dictDir . $fileName); + $this->dictionaries[$name] = $this->readDictionaryFile($dictDir.$fileName); } return $this->dictionaries[$name]; @@ -86,31 +93,33 @@ class Translate { * * @param string $tag The tag name. The tag name can also be on the form '{<dictionary>:<tag>}', to retrieve a tag * from the specific dictionary. + * * @return array An associative array with language => string mappings, or null if the tag wasn't found. */ - public function getTag($tag) { + public function getTag($tag) + { assert('is_string($tag)'); - /* First check translations loaded by the includeInlineTranslation and includeLanguageFile methods. */ - if(array_key_exists($tag, $this->langtext)) { + // first check translations loaded by the includeInlineTranslation and includeLanguageFile methods + if (array_key_exists($tag, $this->langtext)) { return $this->langtext[$tag]; } - /* Check whether we should use the default dictionary or a dictionary specified in the tag. */ - if(substr($tag, 0, 1) === '{' && preg_match('/^{((?:\w+:)?\w+?):(.*)}$/D', $tag, $matches)) { + // check whether we should use the default dictionary or a dictionary specified in the tag + if (substr($tag, 0, 1) === '{' && preg_match('/^{((?:\w+:)?\w+?):(.*)}$/D', $tag, $matches)) { $dictionary = $matches[1]; $tag = $matches[2]; } else { $dictionary = $this->defaultDictionary; - if($dictionary === NULL) { - /* We don't have any dictionary to load the tag from. */ - return NULL; + if ($dictionary === null) { + // we don't have any dictionary to load the tag from + return null; } } $dictionary = $this->getDictionary($dictionary); - if(!array_key_exists($tag, $dictionary)) { - return NULL; + if (!array_key_exists($tag, $dictionary)) { + return null; } return $dictionary[$tag]; @@ -121,37 +130,39 @@ class Translate { * Retrieve the preferred translation of a given text. * * @param array $translations The translations, as an associative array with language => text mappings. + * * @return string The preferred translation. - * + * * @throws \Exception If there's no suitable translation. */ - public function getPreferredTranslation($translations) { + public function getPreferredTranslation($translations) + { assert('is_array($translations)'); - /* Look up translation of tag in the selected language. */ + // look up translation of tag in the selected language $selected_language = $this->language->getLanguage(); if (array_key_exists($selected_language, $translations)) { return $translations[$selected_language]; } - /* Look up translation of tag in the default language. */ + // look up translation of tag in the default language $default_language = $this->language->getDefaultLanguage(); - if(array_key_exists($default_language, $translations)) { + if (array_key_exists($default_language, $translations)) { return $translations[$default_language]; } - /* Check for english translation. */ - if(array_key_exists('en', $translations)) { + // check for english translation + if (array_key_exists('en', $translations)) { return $translations['en']; } - /* Pick the first translation available. */ - if(count($translations) > 0) { + // pick the first translation available + if (count($translations) > 0) { $languages = array_keys($translations); return $translations[$languages[0]]; } - /* We don't have anything to return. */ + // we don't have anything to return throw new \Exception('Nothing to return from translation.'); } @@ -160,30 +171,31 @@ class Translate { * Translate the name of an attribute. * * @param string $name The attribute name. + * * @return string The translated attribute name, or the original attribute name if no translation was found. */ - public function getAttributeTranslation($name) { - - /* Normalize attribute name. */ + public function getAttributeTranslation($name) + { + // normalize attribute name $normName = strtolower($name); $normName = str_replace(":", "_", $normName); - /* Check for an extra dictionary. */ - $extraDict = $this->configuration->getString('attributes.extradictionary', NULL); - if ($extraDict !== NULL) { + // check for an extra dictionary + $extraDict = $this->configuration->getString('attributes.extradictionary', null); + if ($extraDict !== null) { $dict = $this->getDictionary($extraDict); if (array_key_exists($normName, $dict)) { return $this->getPreferredTranslation($dict[$normName]); } } - /* Search the default attribute dictionary. */ + // search the default attribute dictionary $dict = $this->getDictionary('attributes'); - if (array_key_exists('attribute_' . $normName, $dict)) { - return $this->getPreferredTranslation($dict['attribute_' . $normName]); + if (array_key_exists('attribute_'.$normName, $dict)) { + return $this->getPreferredTranslation($dict['attribute_'.$normName]); } - /* No translations found. */ + // no translations found return $name; } @@ -201,11 +213,12 @@ class Translate { * This function can also do replacements into the translated tag. It will search the translated tag for the keys * provided in $replacements, and replace any found occurrences with the value of the key. * - * @param string|array $tag A tag name for the translation which should be looked up, or an array with + * @param string|array $tag A tag name for the translation which should be looked up, or an array with * (language => text) mappings. - * @param array $replacements An associative array of keys that should be replaced with values in the translated - * string. - * @param boolean $fallbackdefault Default translation to use as a fallback if no valid translation was found. + * @param array $replacements An associative array of keys that should be replaced with values in the + * translated string. + * @param boolean $fallbackdefault Default translation to use as a fallback if no valid translation was found. + * * @return string The translated tag, or a placeholder value if the tag wasn't found. */ public function t( @@ -213,60 +226,67 @@ class Translate { $replacements = array(), $fallbackdefault = true, $oldreplacements = array(), // TODO: remove this for 2.0 - $striptags = FALSE // TODO: remove this for 2.0 + $striptags = false // TODO: remove this for 2.0 ) { - if(!is_array($replacements)) { + if (!is_array($replacements)) { + // TODO: remove this entire if for 2.0 - /* Old style call to t(...). Print warning to log. */ + // old style call to t(...). Print warning to log $backtrace = debug_backtrace(); - $where = $backtrace[0]['file'] . ':' . $backtrace[0]['line']; - \SimpleSAML_Logger::warning('Deprecated use of SimpleSAML_Template::t(...) at ' . $where . - '. Please update the code to use the new style of parameters.'); - - /* For backwards compatibility. */ - if(!$replacements && $this->getTag($tag) === NULL) { - \SimpleSAML_Logger::warning('Code which uses $fallbackdefault === FALSE should be' . - ' updated to use the getTag() method instead.'); - return NULL; + $where = $backtrace[0]['file'].':'.$backtrace[0]['line']; + \SimpleSAML_Logger::warning( + 'Deprecated use of SimpleSAML_Template::t(...) at '.$where. + '. Please update the code to use the new style of parameters.' + ); + + // for backwards compatibility + if (!$replacements && $this->getTag($tag) === null) { + \SimpleSAML_Logger::warning( + 'Code which uses $fallbackdefault === FALSE should be updated to use the getTag() method instead.' + ); + return null; } $replacements = $oldreplacements; } - if(is_array($tag)) { + if (is_array($tag)) { $tagData = $tag; } else { $tagData = $this->getTag($tag); - if($tagData === NULL) { - /* Tag not found. */ - \SimpleSAML_Logger::info('Template: Looking up [' . $tag . ']: not translated at all.'); + if ($tagData === null) { + // tag not found + \SimpleSAML_Logger::info('Template: Looking up ['.$tag.']: not translated at all.'); return $this->t_not_translated($tag, $fallbackdefault); } } $translated = $this->getPreferredTranslation($tagData); -# if (!empty($replacements)){ echo('<pre> [' . $tag . ']'); print_r($replacements); exit; } foreach ($replacements as $k => $v) { - /* try to translate if no replacement is given */ - if ($v == NULL) $v = $this->t($k); + // try to translate if no replacement is given + if ($v == null) { + $v = $this->t($k); + } $translated = str_replace($k, $v, $translated); } return $translated; } + /** * Return the string that should be used when no translation was found. * - * @param string $tag A name tag of the string that should be returned. + * @param string $tag A name tag of the string that should be returned. * @param boolean $fallbacktag If set to true and string was not found in any languages, return the tag itself. If * false return null. * * @return string The string that should be used, or the tag name if $fallbacktag is set to false. */ - private function t_not_translated($tag, $fallbacktag) { + private function t_not_translated($tag, $fallbacktag) + { if ($fallbacktag) { - return 'not translated (' . $tag . ')'; + return 'not translated ('.$tag.')'; } else { return $tag; } @@ -278,34 +298,35 @@ class Translate { * used ONLU from variable data, or when the translation is already provided by an external source, as a database * or in metadata. * - * @param string $tag The tag that has a translation + * @param string $tag The tag that has a translation * @param array|string $translation The translation array * * @throws \Exception If $translation is neither a string nor an array. */ - public function includeInlineTranslation($tag, $translation) { - + public function includeInlineTranslation($tag, $translation) + { if (is_string($translation)) { $translation = array('en' => $translation); } elseif (!is_array($translation)) { - throw new \Exception("Inline translation should be string or array. Is " . gettype($translation) . " now!"); + throw new \Exception("Inline translation should be string or array. Is ".gettype($translation)." now!"); } - \SimpleSAML_Logger::debug('Template: Adding inline language translation for tag [' . $tag . ']'); + \SimpleSAML_Logger::debug('Template: Adding inline language translation for tag ['.$tag.']'); $this->langtext[$tag] = $translation; } + /** * Include a language file from the dictionaries directory. * - * @param string $file File name of dictionary to include + * @param string $file File name of dictionary to include * @param \SimpleSAML_Configuration|null $otherConfig Optionally provide a different configuration object than the * one provided in the constructor to be used to find the directory of the dictionary. This allows to combine * dictionaries inside the SimpleSAMLphp main code distribution together with external dictionaries. Defaults to * null. */ - public function includeLanguageFile($file, $otherConfig = null) { - + public function includeLanguageFile($file, $otherConfig = null) + { $filebase = null; if (!empty($otherConfig)) { $filebase = $otherConfig->getPathValue('dictionarydir', 'dictionaries/'); @@ -313,9 +334,8 @@ class Translate { $filebase = $this->configuration->getPathValue('dictionarydir', 'dictionaries/'); } - - $lang = $this->readDictionaryFile($filebase . $file); - \SimpleSAML_Logger::debug('Template: Merging language array. Loading [' . $file . ']'); + $lang = $this->readDictionaryFile($filebase.$file); + \SimpleSAML_Logger::debug('Template: Merging language array. Loading ['.$file.']'); $this->langtext = array_merge($this->langtext, $lang); } @@ -324,24 +344,26 @@ class Translate { * Read a dictionary file in JSON format. * * @param string $filename The absolute path to the dictionary file, minus the .definition.json ending. + * * @return array An array holding all the translations in the file. */ - private function readDictionaryJSON($filename) { - $definitionFile = $filename . '.definition.json'; + private function readDictionaryJSON($filename) + { + $definitionFile = $filename.'.definition.json'; assert('file_exists($definitionFile)'); $fileContent = file_get_contents($definitionFile); - $lang = json_decode($fileContent, TRUE); + $lang = json_decode($fileContent, true); if (empty($lang)) { - \SimpleSAML_Logger::error('Invalid dictionary definition file [' . $definitionFile . ']'); + \SimpleSAML_Logger::error('Invalid dictionary definition file ['.$definitionFile.']'); return array(); } - $translationFile = $filename . '.translation.json'; + $translationFile = $filename.'.translation.json'; if (file_exists($translationFile)) { $fileContent = file_get_contents($translationFile); - $moreTrans = json_decode($fileContent, TRUE); + $moreTrans = json_decode($fileContent, true); if (!empty($moreTrans)) { $lang = self::lang_merge($lang, $moreTrans); } @@ -355,13 +377,15 @@ class Translate { * Read a dictionary file in PHP format. * * @param string $filename The absolute path to the dictionary file. + * * @return array An array holding all the translations in the file. */ - private function readDictionaryPHP($filename) { - $phpFile = $filename . '.php'; + private function readDictionaryPHP($filename) + { + $phpFile = $filename.'.php'; assert('file_exists($phpFile)'); - $lang = NULL; + $lang = null; include($phpFile); if (isset($lang)) { return $lang; @@ -375,37 +399,40 @@ class Translate { * Read a dictionary file. * * @param string $filename The absolute path to the dictionary file. + * * @return array An array holding all the translations in the file. */ - private function readDictionaryFile($filename) { + private function readDictionaryFile($filename) + { assert('is_string($filename)'); - \SimpleSAML_Logger::debug('Template: Reading [' . $filename . ']'); + \SimpleSAML_Logger::debug('Template: Reading ['.$filename.']'); - $jsonFile = $filename . '.definition.json'; + $jsonFile = $filename.'.definition.json'; if (file_exists($jsonFile)) { return $this->readDictionaryJSON($filename); } - - $phpFile = $filename . '.php'; + $phpFile = $filename.'.php'; if (file_exists($phpFile)) { return $this->readDictionaryPHP($filename); } - \SimpleSAML_Logger::error($_SERVER['PHP_SELF'].' - Template: Could not find template file [' . $this->template . '] at [' . $filename . ']'); + \SimpleSAML_Logger::error( + $_SERVER['PHP_SELF'].' - Template: Could not find template file ['.$this->template.'] at ['.$filename.']' + ); return array(); } // Merge two translation arrays. - public static function lang_merge($def, $lang) { - foreach($def AS $key => $value) { - if (array_key_exists($key, $lang)) + public static function lang_merge($def, $lang) + { + foreach ($def as $key => $value) { + if (array_key_exists($key, $lang)) { $def[$key] = array_merge($value, $lang[$key]); + } } return $def; } - - } -- GitLab