From e475245b8d3fcd9cd436bcee4f1247cf4b464e16 Mon Sep 17 00:00:00 2001 From: Miles Lott Date: Fri, 15 Jun 2001 21:23:46 +0000 Subject: [PATCH] Add experimental file-based translation class. Not for general consumption, but it almost works... --- phpgwapi/inc/class.translation_file.inc.php | 160 ++++++++++++++++++++ 1 file changed, 160 insertions(+) create mode 100644 phpgwapi/inc/class.translation_file.inc.php diff --git a/phpgwapi/inc/class.translation_file.inc.php b/phpgwapi/inc/class.translation_file.inc.php new file mode 100644 index 0000000000..dee00a4b5a --- /dev/null +++ b/phpgwapi/inc/class.translation_file.inc.php @@ -0,0 +1,160 @@ + * + * Handles multi-language support using flat files * + * -------------------------------------------------------------------------* + * 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$ */ + + // This should be considered experimental. It works, at the app level. + // But, for admin and prefs it really slows things down. See the note + // in the translate() function. + // To use, set $phpgw_info["server"]["translation_system"] = "file"; in + // class.translation.inc.php + class translation + { + var $langarray; // Currently loaded translations + var $loaded_apps = array(); // Loaded app langs + + /*! + @function translate + @abstract Translate phrase to user selected lang + @param $key phrase to translate + @param $vars vars sent to lang function, passed to us + */ + function translation() + { + global $phpgw_info, $lang; + $this->add_app('phpgwapi',$lang); + } + + function isin_array($needle,$haystack) + { + while (list ($k,$v) = each($haystack)) + { + if ($v == $needle) + { + return True; + } + } + return False; + } + + function translate($key, $vars=False) + { + global $phpgw_info, $lang; + + if (!$this->isin_array($phpgw_info['flags']['currentapp'],$this->loaded_apps) && + $phpgw_info['flags']['currentapp'] != 'home') + { + //echo '
loading app "' . $phpgw_info['flags']['currentapp'] . '" for the first time.'; + $this->add_app($phpgw_info['flags']['currentapp'],$lang); + } + elseif ($phpgw_info['flags']['currentapp'] == 'admin' || + $phpgw_info['flags']['currentapp'] == 'preferences') + { + // This is done because for these two apps, all langs must be loaded. + // Note we cannot load for navbar, since it would slow down EVERY page. + // This is true until all common/admin/prefs langs are in the api file only. + @ksort($phpgw_info['apps']); + while(list($x,$app) = each($phpgw_info['apps'])) + { + if (!$this->isin_array($app['name'],$this->loaded_apps)) + { + //echo '
loading app "' . $app['name'] . '" for the first time.'; + $this->add_app($app['name'],$lang); + } + } + } + + if (!$vars) + { + $vars = array(); + } + + $ret = $key; + + if (isset($this->langarray[strtolower ($key)]) && $this->langarray[strtolower ($key)]) + { + $ret = $this->langarray[strtolower ($key)]; + } + else + { + $ret = $key."*"; + } + $ndx = 1; + while( list($key,$val) = each( $vars ) ) + { + $ret = preg_replace( "/%$ndx/", $val, $ret ); + ++$ndx; + } + return $ret; + } + + /*! + @function add_app + @abstract loads all app phrases into langarray + @param $lang user lang variable (defaults to en) + */ + function add_app($app,$lang='') + { + global $phpgw_info; + + define('SEP',filesystem_separator()); + + //echo '
add_app(): called with app="' . $app . '", lang="' . $userlang . '"'; + if (!isset($lang) || !$lang) + { + if (isset($phpgw_info['user']['preferences']['common']['lang']) && + $phpgw_info['user']['preferences']['common']['lang']) + { + $userlang = $phpgw_info['user']['preferences']['common']['lang']; + } + else + { + $userlang = 'en'; + } + } + else + { + $userlang = $lang; + } + + $fn = PHPGW_SERVER_ROOT . SEP . $app . SEP . 'setup' . SEP . 'phpgw_' . $userlang . '.lang'; + if (!file_exists($fn)) + { + $fn = PHPGW_SERVER_ROOT . SEP . $app . SEP . 'setup' . SEP . 'phpgw_en.lang'; + } + + if (file_exists($fn)) + { + $fp = fopen($fn,'r'); + while ($data = fgets($fp,8000)) + { + list($message_id,$app_name,$null,$content) = explode("\t",$data); + //echo '
add_app(): adding phrase: $this->langarray["'.$message_id.'"]=' . trim($content); + $this->langarray[$message_id] = trim($content); + } + fclose($fp); + } + // stuff class array listing apps that are included already + $this->loaded_apps[] = $app; + } + } +?>