<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 encoding=utf-8: */
// +----------------------------------------------------------------------+
// | Eventum - Issue Tracking System |
// +----------------------------------------------------------------------+
// | Copyright (c) 2003 - 2008 MySQL AB |
// | Copyright (c) 2008 - 2009 Sun Microsystem Inc. |
// | |
// | This program is free software; you can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 of the License, or |
// | (at your option) any later version. |
// | |
// | This program 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 General Public License for more details. |
// | |
// | You should have received a copy of the GNU General Public License |
// | along with this program; if not, write to: |
// | |
// | Free Software Foundation, Inc. |
// | 59 Temple Place - Suite 330 |
// | Boston, MA 02111-1307, USA. |
// +----------------------------------------------------------------------+
// | Authors: |
// | Bryan Alsdorf <hide@address.com> |
// | Elan Ruusamäe <hide@address.com> |
// +----------------------------------------------------------------------+
//
/**
* Class to handle the logic behind the internationalization issues
* of the application.
*
* @version 1.0
* @author Bryan Alsdorf <hide@address.com>
*/
/**
* List of available locales present in Eventum.
*
* Note that the locales are first tested before they are listed as choices in
* Preferences page.
*/
$avail_langs = array(
'pl_PL' => 'Polish',
# 'en_US' => 'English',
'ru_RU' => 'Russian',
'de_DE' => 'German',
# 'fr_FR' => 'French',
'it_IT' => 'Italian',
'fi_FI' => 'Finnish',
'es_ES' => 'Spanish',
# 'nl_NL' => 'Dutch',
'sv_SE' => 'Swedish',
'pt_BR' => 'Brazilian Portuguese',
);
class Language
{
/**
* Method used to set application default locale.
*
* @access public
* @return void
*/
function setup()
{
// please add the following line to config.inc.php, changing to whatever language you prefer
// define('APP_DEFAULT_LOCALE', 'en_US');
ini_set('mbstring.internal_encoding', 'UTF8');
Language::set(APP_DEFAULT_LOCALE);
}
/**
* Method used to get available languages.
* Uses $avail_langs array and verifies that the language can be used.
*
* @access public
* @return array
*/
function getAvailableLanguages()
{
global $avail_langs;
$languages = array();
foreach ($avail_langs as $code => $language) {
$res = Language::set($code);
if ($res) {
$languages[$code] = $language;
}
}
Language::restore();
return $languages;
}
/**
* Method used to set the appropriate preference of the language
* for the application based on user preference.
*
* @access public
* @return void
*/
function setPreference()
{
$usr_id = Auth::getUserID();
$lang = null;
if (!empty($usr_id)) {
// try user preference
$usr_lang = User::getLang($usr_id);
if (Language::set($usr_lang)) {
$lang = $usr_lang;
}
}
if ($lang == null) {
// fall back to system default
define('APP_CURRENT_LOCALE', APP_DEFAULT_LOCALE);
// we don't need to set language again as APP_DEFAULT_LOCALE was set by Language::setup()
// Language::set(APP_CURRENT_LOCALE);
} else {
define('APP_CURRENT_LOCALE', $lang);
}
}
/**
* Sets active language for for the application.
* Returns false if locale is invalid or cannot be used.
*
* @access public
* @return boolean
*/
function set($locale)
{
// XXX do not append charset to en_US locale
if ($locale != 'en_US') {
$locale = $locale . '.' . APP_CHARSET;
}
$res = _setlocale(LC_TIME, $locale);
if ($res === false) {
return false;
}
$res = _setlocale(LC_MESSAGES, $locale);
if ($res === false) {
return false;
}
// XXX do not require translations for en_US locale
if ($locale != 'en_US') {
// get translator info
$res = _gettext('');
// if empty gettext is returned then the mo catalog is not installed.
if (empty($res)) {
return false;
}
}
User::setLocalizedRoles();
return true;
}
function restore()
{
$locale = defined('APP_CURRENT_LOCALE') ? APP_CURRENT_LOCALE : APP_DEFAULT_LOCALE;
Language::set($locale);
}
}
// if there is no gettext support built into PHP, or we are running in language compatability mode include PHP-gettext
if (!function_exists('gettext') || (defined('APP_GETTEXT_MODE') && APP_GETTEXT_MODE == 'php')) {
require_once(APP_INC_PATH . 'php-gettext/gettext.inc');
function ev_gettext($string) {
if (func_num_args() > 1) {
$arg = array();
for($i = 1 ; $i < func_num_args(); $i++) {
$arg[] = func_get_arg($i);
}
$string = _gettext($string);
return vsprintf($string, $arg);
} else {
return _gettext($string);
}
}
function ev_ngettext($string, $plural, $number) {
return _ngettext($string, $plural, $number);
}
} else {
function ev_gettext($string) {
if (func_num_args() > 1) {
$arg = array();
for($i = 1 ; $i < func_num_args(); $i++) {
$arg[] = func_get_arg($i);
}
$string = gettext($string);
return vsprintf($string, $arg);
} else {
return gettext($string);
}
}
function ev_ngettext($string, $plural, $number) {
return ngettext($string, $plural, $number);
}
function _bind_textdomain_codeset($domain, $codeset) {
return bind_textdomain_codeset($domain, $codeset);
}
function _bindtextdomain($domain, $path) {
return bindtextdomain($domain, $path);
}
function _textdomain($domain) {
return textdomain($domain);
}
function _gettext($msgid) {
return gettext($msgid);
}
function _setlocale($category, $locale) {
return setlocale($category, $locale);
}
}
// this won't change over the request. so set it once and permanently
_bindtextdomain('eventum', APP_PATH . 'misc/localization/');
_bind_textdomain_codeset('eventum', APP_CHARSET);
_textdomain('eventum');
// benchmarking the included file (aka setup time)
if (APP_BENCHMARK) {
$GLOBALS['bench']->setMarker('Included Language Class');
}