/setup/includes/modinstalllexicon.class.php
PHP | 205 lines | 115 code | 14 blank | 76 comment | 25 complexity | ce189e6aa39b161d149221d2c4ac362c MD5 | raw file
Possible License(s): GPL-2.0, Apache-2.0, BSD-3-Clause, LGPL-2.1
- <?php
- /*
- * This file is part of MODX Revolution.
- *
- * Copyright (c) MODX, LLC. All Rights Reserved.
- *
- * For complete copyright and license information, see the COPYRIGHT and LICENSE
- * files found in the top-level directory of this distribution.
- */
- /**
- * modLexicon
- *
- * @package modx
- */
- /**
- * The lexicon handling class for setup.
- *
- * @package modx
- */
- class modInstallLexicon {
- /**
- * @var modInstall $install Reference to the modInstall instance.
- */
- public $install = null;
- /**
- * @var array $_lexicon The translated lexicon array
- */
- protected $_lexicon = array();
- function __construct(modInstall &$install,array $config = array()) {
- $this->install =& $install;
- $this->config = array_merge(array(
- 'lexiconPath' => dirname(__DIR__).'/lang/',
- ),$config);
- }
- /**
- * Gets and parses a lexicon entry.
- * @param string $key The key to grab
- * @param array $placeholders Any values to replace placeholders with
- * @return string The translated key.
- */
- public function get($key,array $placeholders = array()) {
- $v = '';
- if ($this->exists($key)) {
- $v = $this->parse($this->_lexicon[$key],$placeholders);
- }
- return $v;
- }
- /**
- * Sets a lexicon entry value.
- * @param string $key The key to set the value to.
- * @param string $value The value to set.
- * @return string The set value.
- */
- public function set($key,$value = '') {
- $this->_lexicon[$key] = $value;
- return $value;
- }
- /**
- * Parses a lexicon string for placeholder replacement
- * @param string $str
- * @param array $placeholders An array of placeholders
- * @return string
- */
- public function parse($str = '',array $placeholders = array()) {
- if (empty($str)) return '';
- if (empty($placeholders) || !is_array($placeholders)) return $str;
- foreach ($placeholders as $k => $v) {
- $str = str_replace('[[+'.$k.']]',$v,$str);
- }
- return $str;
- }
- /**
- * Checks if a key exists in the currently loaded lexicon
- *
- * @param string $key
- * @return boolean True if key is found
- */
- public function exists($key) {
- return array_key_exists($key,$this->_lexicon);
- }
- /**
- * Accessor method for the lexicon array.
- *
- * @access public
- * @param string $prefix If set, will only return the lexicon entries with this prefix.
- * @param boolean If true, will strip the prefix from the returned indexes
- * @return array The internal lexicon.
- */
- public function fetch($prefix = '',$removePrefix = false) {
- if (!empty($prefix)) {
- $lex = array();
- $lang = $this->_lexicon;
- foreach ($lang as $k => $v) {
- if (strpos($k,$prefix) !== false) {
- $key = $removePrefix ? str_replace($prefix,'',$k) : $k;
- $lex[$key] = $v;
- }
- }
- return $lex;
- }
- return $this->_lexicon;
- }
- /**
- * Returns the currently specified language.
- * @return string The IANA language code
- */
- public function getLanguage() {
- $language = 'en';
- if (isset ($_COOKIE['modx_setup_language'])) {
- $language= $_COOKIE['modx_setup_language'];
- } else {
- $availableLangs = $this->getLanguageList();
- if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
- // break up string into pieces (languages and q factors)
- preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
- if (count($lang_parse[1])) {
- // create a list like "en" => 0.8
- $acceptLangs = array_combine($lang_parse[1], $lang_parse[4]);
- // set default to 1 for any without q factor
- foreach ($acceptLangs as $lang => $q) {
- if ($q === '') $acceptLangs[$lang] = 1;
- }
- // sort list based on value
- arsort($acceptLangs, SORT_NUMERIC);
- foreach ($acceptLangs as $lang => $q) {
- $primary = explode('-', $lang);
- $primary = array_shift($primary);
- if (in_array($lang, $availableLangs)) {
- $language = $lang;
- break;
- } else if (in_array($primary, $availableLangs)) {
- $language = $primary;
- break;
- }
- }
- }
- }
- }
- if (!empty($this->install) && !empty($this->install->settings) && is_object($this->install->settings)) {
- $language = $this->install->settings->get('language', $language);
- }
- return $language;
- }
- /**
- * Get a list of available languages.
- *
- * @return array An array of available languages
- */
- public function getLanguageList() {
- $path = dirname(__DIR__).'/lang/';
- $languages = array();
- /** @var DirectoryIterator $file */
- foreach (new DirectoryIterator($path) as $file) {
- $basename = $file->getFilename();
- if (!in_array($basename, array('.', '..','.htaccess','.svn','.git')) && $file->isDir()) {
- if (file_exists($file->getPathname().'/default.inc.php')) {
- $languages[] = $basename;
- }
- }
- }
- sort($languages);
- return $languages;
- }
- /**
- * Loads a lexicon topic.
- *
- * @param string/array $topics A string name of a topic (or an array of topic names)
- * @return boolean True if successful.
- */
- public function load($topics) {
- $loaded = false;
- $language = $this->getLanguage();
- if (!is_array($topics)) {
- $topics = array($topics);
- }
- foreach ($topics as $topic) {
- $topicFile = $this->config['lexiconPath'].$language.'/'.$topic.'.inc.php';
- if (file_exists($topicFile)) {
- $_lang = array();
- include $topicFile;
- if (is_array($_lang) && !empty($_lang)) {
- $this->_lexicon = array_merge($this->_lexicon,$_lang);
- $loaded = true;
- } else {
- $loaded = false;
- }
- }
- }
- return $loaded;
- }
- }