home *** CD-ROM | disk | FTP | other *** search
- <?php
- /* vim: set expandtab tabstop=4 shiftwidth=4: */
- // +----------------------------------------------------------------------+
- // | PHP version 4 |
- // +----------------------------------------------------------------------+
- // | Copyright (c) 1997-2003 The PHP Group |
- // +----------------------------------------------------------------------+
- // | This source file is subject to version 3.0 of the PHP license, |
- // | that is bundled with this package in the file LICENSE, and is |
- // | available through the world-wide-web at |
- // | http://www.php.net/license/3_0.txt. |
- // | If you did not receive a copy of the PHP license and are unable to |
- // | obtain it through the world-wide-web, please send a note to |
- // | license@php.net so we can mail you a copy immediately. |
- // +----------------------------------------------------------------------+
- // | Authors: Kouber Saparev <kouber@php.net> |
- // +----------------------------------------------------------------------+
- //
- // $Id: lang.bg.php,v 1.4 2004/10/22 18:22:52 kouber Exp $
-
- /**
- * Include needed files
- */
- require_once("Numbers/Words.php");
-
- /**
- * Class for translating numbers into Bulgarian.
- *
- * @author Kouber Saparev <kouber@php.net>
- * @package Numbers_Words
- */
- class Numbers_Words_bg extends Numbers_Words
- {
-
- // {{{ properties
-
- /**
- * Locale name.
- * @var string
- * @access public
- */
- var $locale = 'bg';
-
- /**
- * Language name in English.
- * @var string
- * @access public
- */
- var $lang = 'Bulgarian';
-
- /**
- * Native language name.
- * @var string
- * @access public
- */
- var $lang_native = '┴·δπα≡±ΩΦ';
-
- /**
- * Some miscellaneous words and language constructs.
- * @var string
- * @access private
- */
- var $_misc_strings = array(
- 'deset'=>'Σσ±σ≥', // "ten"
- 'edinadeset'=>'σΣΦφαΣσ±σ≥', // "eleven"
- 'na'=>'φα', // liaison particle for 12 to 19
- 'sto'=>'±≥ε', // "hundred"
- 'sta'=>'±≥α', // suffix for 2 and 3 hundred
- 'stotin'=>'±≥ε≥Φφ', // suffix for 4 to 9 hundred
- 'hiliadi'=>'⌡Φδ ΣΦ' // plural form of "thousand"
- );
-
-
- /**
- * The words for digits (except zero). Note that, there are three genders for them (neuter, masculine and feminine).
- * The words for 3 to 9 (masculine) and for 2 to 9 (feminine) are the same as neuter, so they're filled
- * in the _initDigits() method, which is invoked from the constructor.
- * @var string
- * @access private
- */
- var $_digits = array(
- 0=>array(1=>"σΣφε", "ΣΓσ", "≥≡Φ", "≈σ≥Φ≡Φ", "∩σ≥", "°σ±≥", "±σΣσ∞", "ε±σ∞", "ΣσΓσ≥"), // neuter
- 1=>array(1=>'σΣΦφ', 'ΣΓα'), // masculine
- -1=>array(1=>'σΣφα') // feminine
- );
-
- /**
- * A flag, that determines if the _digits array is filled for masculine and feminine genders.
- * @var string
- * @access private
- */
- var $_digits_initialized = false;
-
- /**
- * A flag, that determines if the "and" word is placed already before the last non-empty group of digits.
- * @var string
- * @access private
- */
- var $_last_and = false;
-
- /**
- * The word for zero.
- * @var string
- * @access private
- */
- var $_zero = 'φ≤δα';
-
- /**
- * The word for infinity.
- * @var string
- * @access private
- */
- var $_infinity = 'ßστΩ≡αΘφε±≥';
-
- /**
- * The word for the "and" language construct.
- * @var string
- * @access private
- */
- var $_and = 'Φ';
-
- /**
- * The word separator.
- * @var string
- * @access private
- */
- var $_sep = ' ';
-
- /**
- * The word for the minus sign.
- * @var string
- * @access private
- */
- var $_minus = '∞Φφ≤±'; // minus sign
-
- /**
- * The plural suffix (except for thousand).
- * @var string
- * @access private
- */
- var $_plural = 'α'; // plural suffix
-
- /**
- * The suffixes for exponents (singular).
- * @var array
- * @access private
- */
- var $_exponent = array(
- 0 => '',
- 3 => '⌡Φδ Σα',
- 6 => '∞ΦδΦεφ',
- 9 => '∞ΦδΦα≡Σ',
- 12 => '≥≡ΦδΦεφ',
- 15 => 'ΩΓαΣ≡ΦδΦεφ',
- 18 => 'ΩΓΦφ≥ΦδΦεφ',
- 21 => '±σΩ±≥ΦδΦεφ',
- 24 => '±σ∩≥ΦδΦεφ',
- 27 => 'εΩ≥ΦδΦεφ',
- 30 => 'φεφαδΦεφ',
- 33 => 'ΣσΩαδΦεφ',
- 36 => '≤φΣσΩαδΦεφ',
- 39 => 'Σ≤εΣσΩαδΦεφ',
- 42 => '≥≡σΣσΩαδΦεφ',
- 45 => 'ΩΓα≥ε≡ΣσΩαδΦεφ',
- 48 => 'ΩΓΦφ≥ΣσΩαδΦεφ',
- 51 => '±σΩ±ΣσΩαδΦεφ',
- 54 => '±σ∩≥ΣσΩαδΦεφ',
- 57 => 'εΩ≥εΣσΩαδΦεφ',
- 60 => 'φεΓσ∞ΣσΩαδΦεφ',
- 63 => 'ΓΦπΦφ≥ΦδΦεφ',
- 66 => '≤φΓΦπΦφ≥ΦδΦεφ',
- 69 => 'Σ≤εΓΦπΦφ≥ΦδΦεφ',
- 72 => '≥≡σΓΦπΦφ≥ΦδΦεφ',
- 75 => 'ΩΓα≥ε≡ΓΦπΦφ≥ΦδΦεφ',
- 78 => 'ΩΓΦφΓΦπΦφ≥ΦδΦεφ',
- 81 => '±σΩ±ΓΦπΦφ≥ΦδΦεφ',
- 84 => '±σ∩≥σφΓΦπΦφ≥ΦδΦεφ',
- 87 => 'εΩ≥εΓΦπΦφ≥ΦδΦεφ',
- 90 => 'φεΓσ∞ΓΦπΦφ≥ΦδΦεφ',
- 93 => '≥≡ΦπΦφ≥ΦδΦεφ',
- 96 => '≤φ≥≡ΦπΦφ≥ΦδΦεφ',
- 99 => 'Σ≤ε≥≡ΦπΦφ≥ΦδΦεφ',
- 102 => '≥≡σ≥≡ΦπΦφ≥ΦδΦεφ',
- 105 => 'ΩΓα≥ε≡≥≡ΦπΦφ≥ΦδΦεφ',
- 108 => 'ΩΓΦφ≥≡ΦπΦφ≥ΦδΦεφ',
- 111 => '±σΩ±≥≡ΦπΦφ≥ΦδΦεφ',
- 114 => '±σ∩≥σφ≥≡ΦπΦφ≥ΦδΦεφ',
- 117 => 'εΩ≥ε≥≡ΦπΦφ≥ΦδΦεφ',
- 120 => 'φεΓσ∞≥≡ΦπΦφ≥ΦδΦεφ',
- 123 => 'ΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 126 => '≤φΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 129 => 'Σ≤εΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 132 => '≥≡σΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 135 => 'ΩΓα≥ε≡ΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 138 => 'ΩΓΦφΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 141 => '±σΩ±ΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 144 => '±σ∩≥σφΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 147 => 'εΩ≥εΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 150 => 'φεΓσ∞ΩΓαΣ≡απΦφ≥ΦδΦεφ',
- 153 => 'ΩΓΦφΩΓαπΦφ≥ΦδΦεφ',
- 156 => '≤φΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 159 => 'Σ≤εΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 162 => '≥≡σΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 165 => 'ΩΓα≥ε≡ΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 168 => 'ΩΓΦφΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 171 => '±σΩ±ΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 174 => '±σ∩≥σφΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 177 => 'εΩ≥εΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 180 => 'φεΓσ∞ΩΓΦφΩαπΦφ≥ΦδΦεφ',
- 183 => '±σΩ±απΦφ≥ΦδΦεφ',
- 186 => '≤φ±σΩ±απΦφ≥ΦδΦεφ',
- 189 => 'Σ≤ε±σΩ±απΦφ≥ΦδΦεφ',
- 192 => '≥≡σ±σΩ±απΦφ≥ΦδΦεφ',
- 195 => 'ΩΓα≥ε≡±σΩ±απΦφ≥ΦδΦεφ',
- 198 => 'ΩΓΦφ±σΩ±απΦφ≥ΦδΦεφ',
- 201 => '±σΩ±±σΩ±απΦφ≥ΦδΦεφ',
- 204 => '±σ∩≥σφ±σΩ±απΦφ≥ΦδΦεφ',
- 207 => 'εΩ≥ε±σΩ±απΦφ≥ΦδΦεφ',
- 210 => 'φεΓσ∞±σΩ±απΦφ≥ΦδΦεφ',
- 213 => '±σ∩≥απΦφ≥ΦδΦεφ',
- 216 => '≤φ±σ∩≥απΦφ≥ΦδΦεφ',
- 219 => 'Σ≤ε±σ∩≥απΦφ≥ΦδΦεφ',
- 222 => '≥≡σ±σ∩≥απΦφ≥ΦδΦεφ',
- 225 => 'ΩΓα≥ε≡±σ∩≥απΦφ≥ΦδΦεφ',
- 228 => 'ΩΓΦφ±σ∩≥απΦφ≥ΦδΦεφ',
- 231 => '±σΩ±±σ∩≥απΦφ≥ΦδΦεφ',
- 234 => '±σ∩≥σφ±σ∩≥απΦφ≥ΦδΦεφ',
- 237 => 'εΩ≥ε±σ∩≥απΦφ≥ΦδΦεφ',
- 240 => 'φεΓσ∞±σ∩≥απΦφ≥ΦδΦεφ',
- 243 => 'εΩ≥επΦφ≥ΦδΦεφ',
- 246 => '≤φεΩ≥επΦφ≥ΦδΦεφ',
- 249 => 'Σ≤εεΩ≥επΦφ≥ΦδΦεφ',
- 252 => '≥≡σεΩ≥επΦφ≥ΦδΦεφ',
- 255 => 'ΩΓα≥ε≡εΩ≥επΦφ≥ΦδΦεφ',
- 258 => 'ΩΓΦφεΩ≥επΦφ≥ΦδΦεφ',
- 261 => '±σΩ±εΩ≥επΦφ≥ΦδΦεφ',
- 264 => '±σ∩≥εΩ≥επΦφ≥ΦδΦεφ',
- 267 => 'εΩ≥εεΩ≥επΦφ≥ΦδΦεφ',
- 270 => 'φεΓσ∞εΩ≥επΦφ≥ΦδΦεφ',
- 273 => 'φεφαπΦφ≥ΦδΦεφ',
- 276 => '≤φφεφαπΦφ≥ΦδΦεφ',
- 279 => 'Σ≤εφεφαπΦφ≥ΦδΦεφ',
- 282 => '≥≡σφεφαπΦφ≥ΦδΦεφ',
- 285 => 'ΩΓα≥ε≡φεφαπΦφ≥ΦδΦεφ',
- 288 => 'ΩΓΦφφεφαπΦφ≥ΦδΦεφ',
- 291 => '±σΩ±φεφαπΦφ≥ΦδΦεφ',
- 294 => '±σ∩≥σφφεφαπΦφ≥ΦδΦεφ',
- 297 => 'εΩ≥εφεφαπΦφ≥ΦδΦεφ',
- 300 => 'φεΓσ∞φεφαπΦφ≥ΦδΦεφ',
- 303 => '÷σφ≥ΦδΦεφ'
- );
- // }}}
-
- // {{{ Numbers_Words_bg()
-
- /**
- * The class constructor, used for calling the _initDigits method.
- *
- * @return void
- *
- * @access public
- * @author Kouber Saparev <kouber@php.net>
- * @see function _initDigits
- */
- function Numbers_Words_bg() {
- $this->_initDigits();
- }
- // }}}
-
- // {{{ _initDigits()
-
- /**
- * Fills the _digits array for masculine and feminine genders with
- * corresponding references to neuter words (when they're the same).
- *
- * @return void
- *
- * @access private
- * @author Kouber Saparev <kouber@php.net>
- */
- function _initDigits() {
- if (!$this->_digits_initialized) {
- for ($i=3; $i<=9; $i++) {
- $this->_digits[1][$i] =& $this->_digits[0][$i];
- }
- for ($i=2; $i<=9; $i++) {
- $this->_digits[-1][$i] =& $this->_digits[0][$i];
- }
- $this->_digits_initialized = true;
- }
- }
- // }}}
-
- // {{{ _splitNumber()
-
- /**
- * Split a number to groups of three-digit numbers.
- *
- * @param mixed $num An integer or its string representation
- * that need to be split
- *
- * @return array Groups of three-digit numbers.
- *
- * @access private
- * @author Kouber Saparev <kouber@php.net>
- * @since PHP 4.2.3
- */
-
- function _splitNumber($num)
- {
- if (is_string($num)) {
- $ret = array();
- $strlen = strlen($num);
- $first = substr($num, 0, $strlen%3);
- preg_match_all('/\d{3}/', substr($num, $strlen%3, $strlen), $m);
- $ret =& $m[0];
- if ($first) array_unshift($ret, $first);
- return $ret;
- }
- else
- return explode(' ', number_format($num, 0, '', ' ')); // a faster version for integers
- }
- // }}}
-
- // {{{ _showDigitsGroup()
-
- /**
- * Converts a three-digit number to its word representation
- * in Bulgarian language.
- *
- * @param integer $num An integer between 1 and 999 inclusive.
- *
- * @param integer $gender An integer which represents the gender of
- * the current digits group.
- * 0 - neuter
- * 1 - masculine
- * -1 - feminine
- *
- * @param boolean $last A flag that determines if the current digits group
- * is the last one.
- *
- * @return string The words for the given number.
- *
- * @access private
- * @author Kouber Saparev <kouber@php.net>
- */
- function _showDigitsGroup($num, $gender = 0, $last = false)
- {
- /* A storage array for the return string.
- Positions 1, 3, 5 are intended for digit words
- and everything else (0, 2, 4) for "and" words.
- Both of the above types are optional, so the size of
- the array may vary.
- */
- $ret = array();
-
- // extract the value of each digit from the three-digit number
- $e = $num%10; // ones
- $d = ($num-$e)%100/10; // tens
- $s = ($num-$d*10-$e)%1000/100; // hundreds
-
- // process the "hundreds" digit.
- if ($s) {
- switch ($s) {
- case 1:
- $ret[1] = $this->_misc_strings['sto'];
- break;
- case 2:
- case 3:
- $ret[1] = $this->_digits[0][$s].$this->_misc_strings['sta'];
- break;
- default:
- $ret[1] = $this->_digits[0][$s].$this->_misc_strings['stotin'];
- }
- }
-
- // process the "tens" digit, and optionally the "ones" digit.
- if ($d) {
- // in the case of 1, the "ones" digit also must be processed
- if ($d==1) {
- if (!$e) {
- $ret[3] = $this->_misc_strings['deset']; // ten
- } else {
- if ($e==1) {
- $ret[3] = $this->_misc_strings['edinadeset']; // eleven
- } else {
- $ret[3] = $this->_digits[1][$e].$this->_misc_strings['na'].$this->_misc_strings['deset']; // twelve - nineteen
- }
- // the "ones" digit is alredy processed, so skip a second processment
- $e = 0;
- }
- } else {
- $ret[3] = $this->_digits[1][$d].$this->_misc_strings['deset']; // twenty - ninety
- }
- }
-
- // process the "ones" digit
- if ($e) {
- $ret[5] = $this->_digits[$gender][$e];
- }
-
- // put "and" where needed
- if (count($ret)>1) {
- if ($e) {
- $ret[4] = $this->_and;
- } else {
- $ret[2] = $this->_and;
- }
- }
-
- // put "and" optionally in the case this is the last non-empty group
- if ($last) {
- if (!$s||count($ret)==1) {
- $ret[0] = $this->_and;
- }
- $this->_last_and = true;
- }
-
- // sort the return array so that "and" constructs go to theirs appropriate places
- ksort($ret);
-
- return implode($this->_sep, $ret);
- }
- // }}}
-
- // {{{ toWords()
-
- /**
- * Converts a number to its word representation
- * in Bulgarian language.
- *
- * @param integer $num An integer between 9.99*-10^302 and 9.99*10^302 (999 centillions)
- * that need to be converted to words
- *
- * @return string The corresponding word representation
- *
- * @access public
- * @author Kouber Saparev <kouber@php.net>
- */
- function toWords($num = 0)
- {
- $ret = array();
- $ret_minus = '';
-
- // check if $num is a valid non-zero number
- if (!$num || preg_match('/^-?0+$/', $num) || !preg_match('/^-?\d+$/', $num)) return $this->_zero;
-
- // add a minus sign
- if (substr($num, 0, 1) == '-') {
- $ret_minus = $this->_minus . $this->_sep;
- $num = substr($num, 1);
- }
-
- // if the absolute value is greater than 9.99*10^302, return infinity
- if (strlen($num)>306) {
- return $ret_minus . $this->_infinity;
- }
-
- // strip excessive zero signs
- $num = ltrim($num, '0');
-
- // split $num to groups of three-digit numbers
- $num_groups = $this->_splitNumber($num);
-
- $sizeof_numgroups = count($num_groups);
-
- // go through the groups in reverse order, so that the last group could be determined
- for ($i=$sizeof_numgroups-1, $j=1; $i>=0; $i--, $j++) {
- if (!isset($ret[$j])) {
- $ret[$j] = '';
- }
-
- // what is the corresponding exponent for the current group
- $pow = $sizeof_numgroups-$i;
-
- // skip processment for empty groups
- if ($num_groups[$i]!='000') {
- if ($num_groups[$i]>1) {
- if ($pow==1) {
- $ret[$j] .= $this->_showDigitsGroup($num_groups[$i], 0, !$this->_last_and && $i).$this->_sep;
- $ret[$j] .= $this->_exponent[($pow-1)*3];
- } elseif ($pow==2) {
- $ret[$j] .= $this->_showDigitsGroup($num_groups[$i], -1, !$this->_last_and && $i).$this->_sep;
- $ret[$j] .= $this->_misc_strings['hiliadi'].$this->_sep;
- } else {
- $ret[$j] .= $this->_showDigitsGroup($num_groups[$i], 1, !$this->_last_and && $i).$this->_sep;
- $ret[$j] .= $this->_exponent[($pow-1)*3].$this->_plural.$this->_sep;
- }
- } else {
- if ($pow==1) {
- $ret[$j] .= $this->_showDigitsGroup($num_groups[$i], 0, !$this->_last_and && $i).$this->_sep;
- } elseif ($pow==2) {
- $ret[$j] .= $this->_exponent[($pow-1)*3].$this->_sep;
- } else {
- $ret[$j] .= $this->_digits[1][1].$this->_sep.$this->_exponent[($pow-1)*3].$this->_sep;
- }
- }
- }
- }
-
- return $ret_minus . rtrim(implode('', array_reverse($ret)), $this->_sep);
- }
- // }}}
- }
- ?>
-