* * and Dan Kuykendall * * and Miles Lott * * Handles multi-language support using SQL * * Copyright (C) 2000, 2001 Joseph Engo * * -------------------------------------------------------------------------* * This library is part of the phpGroupWare API * * http://www.phpgroupware.org/api * * ------------------------------------------------------------------------ * * This library is free software; you can redistribute it and/or modify it * * under the terms of the GNU Lesser General Public License as published by * * the Free Software Foundation; either version 2.1 of the License, * * or any later version. * * This library 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 Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * * along with this library; if not, write to the Free Software Foundation, * * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * \**************************************************************************/ /* $Id$ */ // define the maximal length of a message_id, all message_ids have to be unique // in this length, our column is varchar 255, but addslashes might add some length if (!defined('MAX_MESSAGE_ID_LENGTH')) { define('MAX_MESSAGE_ID_LENGTH',230); } class translation { var $lang = array(); var $userlang = ''; var $currentapp = ''; var $loaded = False; var $translator_helper = '*'; /*! @function translation @abstract class constructor - sets class vars for currentapp and user lang preference @discussion User lang defaults to 'en'. */ function translation() { if(isset($GLOBALS['phpgw_info']['user']['preferences']['common']['lang']) && $GLOBALS['phpgw_info']['user']['preferences']['common']['lang']) { $this->userlang = $GLOBALS['phpgw_info']['user']['preferences']['common']['lang']; } $this->currentapp = $GLOBALS['phpgw_info']['flags']['currentapp']; } /*! @function load_langs @abstract loads up translations into $this->lang based on currentapp and userlang preference. @discussion This also loads translations with appname='common' or appname='all'. */ function load_langs() { if($this->userlang == '') { $this->userlang = $GLOBALS['phpgw_info']['user']['preferences']['common']['lang'] ? $GLOBALS['phpgw_info']['user']['preferences']['common']['lang'] : 'en'; } $sql = "SELECT message_id,content FROM phpgw_lang WHERE lang LIKE '" . $this->userlang . "' AND (app_name LIKE '" . $this->currentapp . "' OR app_name LIKE 'common' OR app_name LIKE 'all') ORDER BY app_name "; if(strcasecmp($this->currentapp, 'common') > 0) { $sql .= 'ASC'; } else { $sql .= 'DESC'; } $GLOBALS['phpgw']->db->query($sql,__LINE__,__FILE__); $GLOBALS['phpgw']->db->next_record(); $count = $GLOBALS['phpgw']->db->num_rows(); for($idx = 0; $idx < $count; ++$idx) { $this->lang[strtolower($GLOBALS['phpgw']->db->f('message_id'))] = $GLOBALS['phpgw']->db->f('content'); $GLOBALS['phpgw']->db->next_record(); } /* Done stuffing the array. If someone prefers to have $GLOBALS['lang'] set to this as before, it could be done here. - $GLOBALS['lang'] = $this->lang; */ $this->loaded = True; } /*! @function translate @abstract Return the translated string from $this->lang, if it exists. If no translation exists, return the same string with an asterisk. @discussion This should be called from the global function lang(), not directly. @syntax translate('translate %1',array('replacement')); OR translate('translate this'); @example translate('translate this %1', array('lang entry')); returns 'Translate this Lang Entry' or 'translate this lang %1*' */ function translate($key,$vars=False) { if(!$vars) { $vars = array(); } $ret = $key; $_key = trim(substr(strtolower($key),0,MAX_MESSAGE_ID_LENGTH)); if(!@isset($this->lang[$_key]) && !$this->loaded) { $this->load_langs(); } $ret = @isset($this->lang[$_key]) ? $this->lang[$_key] : $key . $this->translator_helper; $ndx = 1; while(list($key,$val) = each($vars)) { $ret = preg_replace( "/%$ndx/", $val, $ret ); ++$ndx; } return $ret; } /*! @function add_app @abstract Add an additional app's translations to $this->lang */ function add_app($app) { $sql = "SELECT message_id,content FROM phpgw_lang WHERE lang LIKE '" . $this->userlang . "' AND app_name LIKE '" . $app . "'"; $GLOBALS['phpgw']->db->query($sql,__LINE__,__FILE__); $GLOBALS['phpgw']->db->next_record(); $count = $GLOBALS['phpgw']->db->num_rows(); for($idx = 0; $idx < $count; ++$idx) { $this->lang[strtolower($GLOBALS['phpgw']->db->f('message_id'))] = $GLOBALS['phpgw']->db->f('content'); $GLOBALS['phpgw']->db->next_record(); } } /*! @function get_installed_langs @returns array of installed langs, in the form eg. 'de' => 'German' */ function get_installed_langs() { $GLOBALS['phpgw']->db->query("SELECT DISTINCT l.lang,ln.lang_name FROM phpgw_lang l,phpgw_languages ln WHERE l.lang = ln.lang_id",__LINE__,__FILE__); if (!$GLOBALS['phpgw']->db->num_rows()) { return False; } while ($GLOBALS['phpgw']->db->next_record()) { $langs[$GLOBALS['phpgw']->db->f('lang')] = $GLOBALS['phpgw']->db->f('lang_name'); } return $langs; } }