<?php
# -- BEGIN LICENSE BLOCK ---------------------------------------
#
# This file is part of Clearbricks.
#
# Copyright (c) 2003-2011 Olivier Meunier & Association Dotclear
# Licensed under the GPL version 2.0 license.
# See LICENSE file or
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK -----------------------------------------
/**
* Localization tools
*
* @package Clearbricks
* @subpackage Common
*/
/**
* Translated string
*
* Returns a translated string of $str. If translation is not found, returns
* the string.
*
* @param string $str String to translate
* @return string
*/
function __($str)
{
return (!empty($GLOBALS['__l10n'][$str])) ? $GLOBALS['__l10n'][$str] : $str;
}
/**
* Localization utilities
*/
class l10n
{
/** @var string Forced text direction (ltr or rtl). If not given, it will be guessed from current language */
public static $text_direction;
/** @ignore */
protected static $langs = array();
/**
* L10N initialization
*
* Create global arrays for L10N stuff. Should be called before any work
* with other methods.
*/
public static function init()
{
$GLOBALS['__l10n'] = array();
$GLOBALS['__l10n_files'] = array();
}
/**
* Add a file
*
* Adds a l10n file in translation strings. $file should be given without
* extension. This method will look for $file.lang.php and $file.po (in this
* order) and retrieve the first one found.
*
* @param string $file Filename (without extension)
*/
public static function set($file)
{
$lang_file = $file.'.lang';
$po_file = $file.'.po';
$php_file = $file.'.lang.php';
if (file_exists($php_file))
{
require $php_file;
}
elseif (($tmp = self::getPoFile($po_file)) !== false)
{
$GLOBALS['__l10n_files'][] = $po_file;
$GLOBALS['__l10n'] = array_merge($GLOBALS['__l10n'],$tmp);
}
elseif (($tmp = self::getLangFile($lang_file)) !== false)
{
$GLOBALS['__l10n_files'][] = $lang_file;
$GLOBALS['__l10n'] = array_merge($GLOBALS['__l10n'],$tmp);
}
else
{
return false;
}
return true;
}
/** @ignore */
public static function getLangFile($file)
{
if (!file_exists($file)) {
return false;
}
$fp = @fopen($file,'r');
if ($fp === false) {
return false;
}
$res = array();
while ($l = fgets($fp))
{
$l = trim($l);
# Comment
if (substr($l,0,1) == '#') {
continue;
}
# Original text
if (substr($l,0,1) == ';' && ($t = fgets($fp)) !== false && trim($t) != '') {
$res[$l] = trim($t);
}
}
fclose($fp);
return $res;
}
/**
* Load gettext file
*
* Returns an array of strings found in a given gettext (.po) file
*
* @param string $file Filename
* @return array|false
*/
public static function getPoFile($file)
{
if (!file_exists($file)) {
return false;
}
$fc = implode('',file($file));
$res = array();
$matched = preg_match_all('/(msgid\s+("([^"]|\\\\")*?"\s*)+)\s+'.
'(msgstr\s+("([^"]|\\\\")*?(?<!\\\)"\s*)+)/',
$fc, $matches);
if (!$matched) {
return false;
}
for ($i=0; $i<$matched; $i++)
{
$msgid = preg_replace('/\s*msgid\s*"(.*)"\s*/s','\\1',$matches[1][$i]);
$msgstr= preg_replace('/\s*msgstr\s*"(.*)"\s*/s','\\1',$matches[4][$i]);
$msgstr = self::poString($msgstr);
if ($msgstr) {
$res[self::poString($msgid)] = $msgstr;
}
}
if (!empty($res[''])) {
$meta = $res[''];
unset($res['']);
}
return $res;
}
private static function poString($string,$reverse=false)
{
if ($reverse) {
$smap = array('"', "\n", "\t", "\r");
$rmap = array('\\"', '\\n"' . "\n" . '"', '\\t', '\\r');
return trim((string) str_replace($smap, $rmap, $string));
} else {
$smap = array('/"\s+"/', '/\\\\n/', '/\\\\r/', '/\\\\t/', '/\\\"/');
$rmap = array('', "\n", "\r", "\t", '"');
return trim((string) preg_replace($smap, $rmap, $string));
}
}
/**
* L10N file
*
* Returns a file path for a file, a directory and a language.
* If $dir/$lang/$file is not found, it will check if $dir/en/$file
* exists and returns the result. Returns false if no file were found.
*
* @param string $dir Directory
* @param string $file File
* @param string $lang Language
* @return string|false File path or false
*/
public static function getFilePath($dir,$file,$lang)
{
$f = $dir.'/'.$lang.'/'.$file;
if (!file_exists($f)) {
$f = $dir.'/en/'.$file;
}
return file_exists($f) ? $f : false;
}
/**
* ISO Codes
*
* Returns an array predefined languages ISO codes as you can find on
* {@link http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes}
* The list as additionnal IETF codes as pt-br.
*
* @param boolean $flip Flip resulting array
* @param boolean $name_with_code Prefix (code) to names
* @return array
*/
public static function getISOcodes($flip=false,$name_with_code=false)
{
if (empty(self::$langs))
{
self::$langs = array(
'aa' => 'Afaraf',
'ab' => 'ÐÒ§ÑÑа',
'ae' => 'Avesta',
'af' => 'Afrikaans',
'ak' => 'Akan',
'am' => 'á ááá',
'an' => 'Aragonés',
'ar' => 'â«Ø§ÙØ¹Ø±Ø¨ÙØ©',
'as' => 'à¦
সমà§à¦¯à¦¼à¦¾',
'av' => 'Ð°Ð²Ð°Ñ Ð¼Ð°ÑÓ',
'ay' => 'Aymar aru',
'az' => 'AzÉrbaycan dili',
'ba' => 'баÑҡоÑÑ Ñеле',
'be' => 'ÐелаÑÑÑкаÑ',
'bg' => 'бÑлгаÑÑки език',
'bh' => 'à¤à¥à¤à¤ªà¥à¤°à¥',
'bi' => 'Bislama',
'bm' => 'Bamanankan',
'bn' => 'বাà¦à¦²à¦¾',
'bo' => 'à½à½¼à½à¼à½¡à½²à½',
'br' => 'Brezhoneg',
'bs' => 'Bosanski jezik',
'ca' => 'Català ',
'ce' => 'ноÑ
Ñийн моÑÑ',
'ch' => 'Chamoru',
'co' => 'Corsu',
'cr' => 'áá¦ááááá£',
'cs' => 'Äesky',
'cu' => 'ѩзÑÐºÑ Ð¡Ð»Ð¾Ð²Ñ£Ð½ÑÑкÑ',
'cv' => 'ÑÓÐ²Ð°Ñ ÑÓлÑ
и',
'cy' => 'Cymraeg',
'da' => 'Dansk',
'de' => 'Deutsch',
'dv' => 'â«ÞÞ¨ÞÞ¬ÞÞ¨',
'dz' => 'རྫོà½à¼à½',
'ee' => 'ÆÊÉgbÉ',
'el' => 'Îλληνικά',
'en' => 'English',
'eo' => 'Esperanto',
'es' => 'español',
'et' => 'Eesti keel',
'eu' => 'Euskara',
'fa' => 'â«ÙارسÛ',
'ff' => 'Fulfulde',
'fi' => 'Suomen kieli',
'fj' => 'Vosa Vakaviti',
'fo' => 'Føroyskt',
'fr' => 'Français',
'fy' => 'Frysk',
'ga' => 'Gaeilge',
'gd' => 'GÃ idhlig',
'gl' => 'Galego',
'gn' => "Avañe'ẽ",
'gu' => 'àªà«àªàª°àª¾àª¤à«',
'gv' => 'Ghaelg',
'ha' => 'â«ÙÙÙÙØ³Ù',
'he' => 'â«×¢×ר×ת',
'hi' => 'हिनà¥à¤¦à¥',
'ho' => 'Hiri Motu',
'hr' => 'Hrvatski',
'ht' => 'Kreyòl ayisyen',
'hu' => 'Magyar',
'hy' => 'ÕÕ¡ÕµÕ¥ÖÕ¥Õ¶',
'hz' => 'Otjiherero',
'ia' => 'Interlingua',
'id' => 'Bahasa Indonesia',
'ie' => 'Interlingue',
'ig' => 'Igbo',
'ii' => 'êê',
'ik' => 'Iñupiaq',
'io' => 'Ido',
'is' => 'Ãslenska',
'it' => 'Italiano',
'iu' => 'áááááá¦',
'ja' => 'æ¥æ¬èª',
'jv' => 'Basa Jawa',
'ka' => 'á¥áá áá£áá',
'kg' => 'KiKongo',
'ki' => 'Gĩkũyũ',
'kj' => 'Kuanyama',
'kk' => 'ÒÐ°Ð·Ð°Ò ÑÑлÑ',
'kl' => 'Kalaallisut',
'km' => 'áá¶áá¶ááááá',
'kn' => 'à²à²¨à³à²¨à²¡',
'ko' => 'íêµì´',
'kr' => 'Kanuri',
'ks' => 'à¤à¤¶à¥à¤®à¥à¤°à¥',
'ku' => 'Kurdî',
'kv' => 'коми кÑв',
'kw' => 'Kernewek',
'ky' => 'кÑÑгÑз Ñили',
'la' => 'Latine',
'lb' => 'Lëtzebuergesch',
'lg' => 'Luganda',
'li' => 'Limburgs',
'ln' => 'Lingála',
'lo' => 'àºàº²àºªàº²àº¥àº²àº§',
'lt' => 'Lietuvių kalba',
'lu' => 'Luba-Katanga ',
'lv' => 'Latviešu valoda',
'mg' => 'Malagasy fiteny',
'mh' => 'Kajin M̧ajeļ',
'mi' => 'Te reo MÄori',
'mk' => 'македонÑки Ñазик',
'ml' => 'മലയാളà´',
'mn' => 'Ðонгол',
'mo' => 'Limba moldoveneascÄ',
'mr' => 'मराठà¥',
'ms' => 'Bahasa Melayu',
'mt' => 'Malti',
'my' => 'ááá¬á
á¬',
'na' => 'Ekakairũ Naoero',
'nb' => 'Norsk bokmål',
'nd' => 'isiNdebele',
'ne' => 'नà¥à¤ªà¤¾à¤²à¥',
'ng' => 'Owambo',
'nl' => 'Nederlands',
'nl-be' => 'Nederlands (Belgium)',
'nn' => 'Norsk nynorsk',
'no' => 'Norsk',
'nr' => 'Ndébélé',
'nv' => 'Diné bizaad',
'ny' => 'ChiCheŵa',
'oc' => 'Occitan',
'oj' => 'ááááá¯á§áá',
'om' => 'Afaan Oromoo',
'or' => 'à¬à¬¡à¬¼à¬¿à¬',
'os' => 'ÐÑон æвзаг',
'pa' => 'ਪੰà¨à¨¾à¨¬à©',
'pi' => 'पाऴि',
'pl' => 'Polski',
'ps' => 'â«Ù¾ÚتÙ',
'pt' => 'Português',
'pt-br' => 'Português (Brasil)',
'qu' => 'Runa Simi',
'rm' => 'Rumantsch grischun',
'rn' => 'kiRundi',
'ro' => 'RomânÄ',
'ru' => 'Ð ÑÑÑкий',
'rw' => 'IKinyarwanda',
'sa' => 'सà¤à¤¸à¥à¤à¥à¤¤à¤®à¥',
'sc' => 'sardu',
'sd' => 'सिनà¥à¤§à¥',
'se' => 'Davvisámegiella',
'sg' => 'Yângâ tî sängö',
'sh' => 'SrpskoHrvatski',
'si' => 'à·à·à¶à·à¶½',
'sk' => 'SlovenÄina',
'sl' => 'SlovenÅ¡Äina',
'sm' => "Gagana fa'a Samoa",
'sn' => 'chiShona',
'so' => 'Soomaaliga',
'sq' => 'Shqip',
'sr' => 'ÑÑпÑки Ñезик',
'ss' => 'SiSwati',
'st' => 'seSotho',
'su' => 'Basa Sunda',
'sv' => 'Svenska',
'sw' => 'Kiswahili',
'ta' => 'தமிழà¯',
'te' => 'à°¤à±à°²à±à°à±',
'tg' => 'Ñоҷикӣ',
'th' => 'à¹à¸à¸¢',
'ti' => 'áµááá',
'tk' => 'Türkmen',
'tl' => 'Tagalog',
'tn' => 'seTswana',
'to' => 'faka Tonga',
'tr' => 'Türkçe',
'ts' => 'xiTsonga',
'tt' => 'ÑаÑаÑÑа',
'tw' => 'Twi',
'ty' => 'Reo MÄ`ohi',
'ug' => 'UyÆ£urqÉ',
'uk' => 'УкÑаÑнÑÑка',
'ur' => 'â«Ø§Ø±Ø¯Ù',
'uz' => "O'zbek",
've' => 'tshiVená¸a',
'vi' => 'Tiếng Viá»t',
'vo' => 'Volapük',
'wa' => 'Walon',
'wo' => 'Wollof',
'xh' => 'isiXhosa',
'yi' => 'â«××Ö´××ש',
'yo' => 'Yorùbá',
'za' => 'Saɝ cueů
',
'zh' => '䏿',
'zh-hk' => '䏿 (馿¸¯)',
'zh-tw' => '䏿 (èºç£)',
'zu' => 'isiZulu'
);
}
$langs = self::$langs;
if ($name_with_code) {
foreach ($langs as $k => &$v) {
$v = $k.' - '.$v;
}
}
if ($flip) {
return array_flip($langs);
}
return $langs;
}
/**
* Text direction
*
* Returns text direction for a given language.
* If text direction was forced with {@link $text_direction}, returns this
* value.
*
* @param string $lang Language code
* @return string
*/
public static function getTextDirection($lang)
{
if (self::$text_direction) {
return self::$text_direction;
}
if (preg_match('/^(ar|dv|fa|ha|he|ps|ur|yi)$/i',$lang)) {
return 'rtl';
}
return 'ltr';
}
}
?>