2 /************************************************************************/
4 /************************************************************************/
5 /* Copyright (c) 2010 */
6 /* Inclusive Design Institute */
8 /* This program is free software. You can redistribute it and/or */
9 /* modify it under the terms of the GNU General Public License */
10 /* as published by the Free Software Foundation. */
11 /************************************************************************/
13 require_once(dirname(__FILE__) . '/Language.class.php');
15 //define('TR_LANG_STATUS_EMPTY', 0);
16 //define('TR_LANG_STATUS_INCOMPLETE', 1);
17 //define('TR_LANG_STATUS_COMPLETE', 2);
18 //define('TR_LANG_STATUS_PUBLISHED', 3);
22 * Class for managing available languages as Language Objects.
24 * @author Joel Kronenberg
25 * @see Language.class.php
28 class LanguageManager {
31 * This array stores references to all the Language Objects
32 * that are available in this installation.
39 * This array stores references to the Language Objects
40 * that are available in this installation.
44 var $availableLanguages;
47 * The number of languages that are available. Does not include
48 * character set variations.
52 var $numEnabledLanguages;
57 * Initializes availableLanguages and numLanguages.
59 function LanguageManager() {
60 require_once(TR_INCLUDE_PATH. 'classes/DAO/LanguagesDAO.class.php');
61 $languagesDAO = new LanguagesDAO();
63 // initialize available lanuguages. Available languages are the ones with status "enabled"
64 $rows = $languagesDAO->getAllEnabled();
66 // if there's no enabled language, set to default language and default charset
69 $rows = array($languagesDAO->getByLangCodeAndCharset(DEFAULT_LANGUAGE_CODE, DEFAULT_CHARSET));
71 foreach ($rows as $i => $row) {
72 $this->availableLanguages[$row['language_code']][$row['charset']] = new Language($row);
74 $this->numEnabledLanguages = count($this->availableLanguages);
76 // initialize available lanuguages. Available languages are the ones with status "enabled"
77 $rows = $languagesDAO->getAll();
79 foreach ($rows as $i => $row) {
80 $this->allLanguages[$row['language_code']][$row['charset']] = new Language($row);
82 $this->numLanguages = count($this->allLanguages);
87 * Returns a valid Language Object based on the given language $code and optional
88 * $charset, FALSE if it can't be found.
90 * @param string $code The language code of the language to return.
91 * @param string $charset Optionally, the character set of the language to find.
92 * @return boolean|Language Returns FALSE if the requested language code and
93 * character set cannot be found. Returns a Language Object for the
94 * specified language code and character set.
95 * @see getMyLanguage()
97 function getLanguage($code, $charset = '') {
99 if (isset($this->allLanguages[$code])) {
100 if (is_array($this->allLanguages[$code]))
101 foreach ($this->allLanguages[$code] as $language)
103 // return current($this->allLanguages[$code]);
109 foreach ($this->allLanguages[$code] as $language) {
110 if ($language->getCharacterSet() == $charset) {
118 * Tries to detect the user's current language preference/setting from (in order):
119 * _GET, _POST, _SESSION, HTTP_ATCEPT_LANGUAGE, HTTP_USER_AGENT. If no match can be made
120 * then it tries to detect a default setting (defined in config.inc.php) or a fallback
121 * setting, false if all else fails.
123 * @return boolean|Language Returns a Language Object matching the user's current session.
124 * Returns FALSE if a valid Language Object cannot be found
125 * to match the request
128 function getMyLanguage() {
129 global $addslashes, $db, $_config;
131 if (isset($_GET) && !empty($_GET['lang']) && isset($this->availableLanguages[$_GET['lang']])) {
132 $language = $this->getLanguage($_GET['lang']);
139 if (isset($_POST) && !empty($_POST['lang']) && isset($this->availableLanguages[$_POST['lang']])) {
140 $language = $this->getLanguage($_POST['lang']);
147 if (isset($_SESSION) && isset($_SESSION['lang']) && !empty($_SESSION['lang']) && isset($this->availableLanguages[$_SESSION['lang']])) {
148 $language = $this->getLanguage($_SESSION['lang']);
155 // Didn't catch any valid lang : we use the default settings
156 if (isset($_config['default_language'])) $default_lang = $_config['default_language'];
157 else $default_lang = DEFAULT_LANGUAGE_CODE;
159 if (isset($this->availableLanguages[$default_lang])) {
160 $language = $this->getLanguage($default_lang, DEFAULT_CHARSET);
167 if (!empty($_SERVER['HTTP_ATCEPT_LANGUAGE'])) {
168 // Language is not defined yet :
169 // try to find out user's language by checking its HTTP_ATCEPT_LANGUAGE
170 $accepted = explode(',', $_SERVER['HTTP_ATCEPT_LANGUAGE']);
171 $acceptedCnt = count($accepted);
173 for ($i = 0; $i < $acceptedCnt; $i++) {
174 foreach ($this->availableLanguages as $codes) {
175 foreach ($codes as $language) {
176 if ($language->isMatchHttpAcceptLanguage($accepted[$i])) {
184 if (!empty($_SERVER['HTTP_USER_AGENT'])) {
185 // Language is not defined yet :
186 // try to find out user's language by checking its HTTP_USER_AGENT
187 foreach ($this->availableLanguages as $codes) {
188 foreach ($codes as $language) {
189 if ($language->isMatchHttpUserAgent($_SERVER['HTTP_USER_AGENT'])) {
196 // else pick one at random:
197 reset($this->availableLanguages);
198 $uknown_language = current($this->availableLanguages);
199 if ($unknown_language) {
203 return current($uknown_language);
206 function getAvailableLanguages() {
207 return $this->availableLanguages;
211 function printDropdown($current_language, $name, $id) {
212 echo '<select name="'.$name.'" id="'.$id.'">';
214 foreach ($this->availableLanguages as $codes) {
215 $language = current($codes);
216 if ($language->getStatus() == TR_STATUS_ENABLED) {
217 echo '<option value="'.$language->getCode().'"';
218 if ($language->getCode() == $current_language) {
219 echo ' selected="selected"';
221 echo '>'.$language->getNativeName().'</option>';
228 function printList($current_language, $name, $id, $url) {
232 foreach ($this->availableLanguages as $codes) {
233 $language = current($codes);
235 if ($language->getStatus() == TR_STATUS_ENABLED) {
241 if ($language->getCode() == $current_language) {
242 echo '<strong>'.$language->getNativeName().'</strong>';
244 echo '<a href="'.$url.'lang='.$language->getCode().'">'.$language->getNativeName().'</a> ';
253 function getNumEnabledLanguages() {
254 return $this->numEnabledLanguages;
257 function getNumLanguages() {
258 return $this->numLanguages;
262 // checks whether or not the language exists
263 function exists($code) {
264 return isset($this->allLanguages[$code]);
268 // import language pack from specified file
269 function import($filename) {
270 require_once(TR_INCLUDE_PATH . 'lib/pclzip.lib.php');
271 require_once(TR_INCLUDE_PATH . 'classes/Language/LanguageParser.class.php');
272 require_once(TR_INCLUDE_PATH . 'classes/DAO/LanguagesDAO.class.php');
274 global $languageManager, $msg;
276 $import_path = TR_CONTENT_DIR . 'import/';
278 $archive = new PclZip($filename);
279 if ($archive->extract(PCLZIP_OPT_PATH, $import_path) == 0) {
280 exit('Error : ' . $archive->errorInfo(true));
283 $language_xml = @file_get_contents($import_path.'language.xml');
285 $languageParser = new LanguageParser();
286 $languageParser->parse($language_xml);
287 $languageEditor =& $languageParser->getLanguageEditor(0);
289 $lang_code = $languageEditor->getCode();
290 if ($languageManager->exists($lang_code)) {
291 $msg->addError('LANG_EXISTS');
294 if (!$msg->containsErrors()) {
295 $languageEditor->import($import_path . 'language_text.sql');
296 $languagesDAO = new LanguagesDAO();
297 $languagesDAO->UpdateField($lang_code, "status", TR_STATUS_ENABLED);
298 $msg->addFeedback('IMPORT_LANG_SUCCESS');
300 $version_in_pack = $languageEditor->getTransformableVersion();
301 if ($version_in_pack != VERSION)
303 $msg->addFEEDBACK(array('LANG_MISMATCH_VERSION', $version_in_pack, VERSION));
309 @unlink($import_path . 'language.xml');
310 @unlink($import_path . 'language_text.sql');
311 @unlink($import_path . 'readme.txt');
316 // imports LIVE language from the AContent language database
317 function liveImport($language_code) {
320 $tmp_lang_db = mysql_connect(TR_LANG_DB_HOST, TR_LANG_DB_USER, TR_LANG_DB_PASS);
321 // set database connection using utf8
322 mysql_query("SET NAMES 'utf8'", $tmp_lang_db);
325 /* TR_ERROR_NO_DB_CONNECT */
326 echo 'Unable to connect to db.';
329 if (!mysql_select_db('dev_ATansformable_langs', $tmp_lang_db)) {
330 echo 'DB connection established, but database "dev_ATansformable_langs" cannot be selected.';
334 $sql = "SELECT * FROM languages_SVN WHERE language_code='$language_code'";
335 $result = mysql_query($sql, $tmp_lang_db);
337 if ($row = mysql_fetch_assoc($result)) {
338 $row['reg_exp'] = addslashes($row['reg_exp']);
339 $row['native_name'] = addslashes($row['native_name']);
340 $row['english_name'] = addslashes($row['english_name']);
342 $sql = "REPLACE INTO ".TABLE_PREFIX."languages VALUES ('{$row['language_code']}', '{$row['charset']}', '{$row['reg_exp']}', '{$row['native_name']}', '{$row['english_name']}', 3)";
343 $result = mysql_query($sql, $db);
345 $sql = "SELECT * FROM language_text_SVN WHERE language_code='$language_code'";
346 $result = mysql_query($sql, $tmp_lang_db);
348 $sql = "REPLACE INTO ".TABLE_PREFIX."language_text VALUES ";
349 while ($row = mysql_fetch_assoc($result)) {
350 $row['text'] = addslashes($row['text']);
351 $row['context'] = addslashes($row['context']);
352 $sql .= "('{$row['language_code']}', '{$row['variable']}', '{$row['term']}', '{$row['text']}', '{$row['revised_date']}', '{$row['context']}'),";
354 $sql = substr($sql, 0, -1);
355 mysql_query($sql, $db);