Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/punic/punic/code/Misc.php
Строк: 251
<?php

namespace Punic;

/**
 * Various helper stuff.
 */
class Misc
{
    
/**
     * Concatenates a list of items returning a localized string (for instance: array(1, 2, 3) will result in '1, 2, and 3' for English or '1, 2 e 3' for Italian).
     *
     * @param array $list The list to concatenate
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return string Returns an empty string if $list is not an array of it it's empty, the joined items otherwise.
     */
    
public static function join($list$locale '')
    {
        return static::
joinInternal($listnull$locale);
    }

    
/**
     * Concatenates a list of unit items returning a localized string (for instance: array('3 ft', '2 in') will result in '3 ft, 2 in'.
     *
     * @param array $list The list to concatenate
     * @param string $width The preferred width ('' for default, or 'short' or 'narrow')
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return string Returns an empty string if $list is not an array of it it's empty, the joined items otherwise.
     */
    
public static function joinUnits($list$width ''$locale '')
    {
        
$keys = array();
        if (!empty(
$width)) {
            switch (
$width) {
                case 
'narrow':
                    
$keys = array('unit-narrow''unit-short');
                    break;
                case 
'short':
                    
$keys = array('unit-short''unit-narrow');
                    break;
                default:
                    throw new 
PunicExceptionValueNotInList($width, array('''short''narrow'));
            }
        }
        
$keys[] = 'unit';

        return static::
joinInternal($list$keys$locale);
    }

    protected static function 
joinInternal($list$keys$locale)
    {
        
$result '';
        if (
is_array($list)) {
            
$list array_values($list);
            
$n count($list);
            switch (
$n) {
                case 
0:
                    break;
                case 
1:
                    
$result strval($list[0]);
                    break;
                default:
                    
$allData Data::get('listPatterns'$locale);
                    
$data null;
                    if (!empty(
$keys)) {
                        foreach (
$keys as $key) {
                            if (isset(
$allData[$key])) {
                                
$data $allData[$key];
                                break;
                            }
                        }
                    }
                    if (
$data === null) {
                        
$data $allData['standard'];
                    }
                    if (isset(
$data[$n])) {
                        
$result vsprintf($data[$n], $list);
                    } else {
                        
$result sprintf($data['end'], $list[$n 2], $list[$n 1]);
                        if (
$n 2) {
                            for (
$index $n 3$index 0; --$index) {
                                
$result sprintf($data['middle'], $list[$index], $result);
                            }
                            
$result sprintf($data['start'], $list[0], $result);
                        }
                    }
                    break;
            }
        }

        return 
$result;
    }

    
/**
     * Fix the case of a string.
     *
     * @param string $string The string whose case needs to be fixed
     * @param string $case How to fix case. Allowed values:
     *   <li>`'titlecase-words'` all words in the phrase should be title case</li>
     *   <li>`'titlecase-firstword'` the first word should be title case</li>
     *   <li>`'lowercase-words'` all words in the phrase should be lower case</li>
     * </ul>
     *
     * @return string
     *
     * @link http://cldr.unicode.org/development/development-process/design-proposals/consistent-casing
     */
    
public static function fixCase($string$case)
    {
        
$result $string;
        if (
is_string($string) && is_string($case) && (isset($string[0]))) {
            switch (
$case) {
                case 
'titlecase-words':
                    if (
function_exists('mb_strtoupper') && (@preg_match('/pL/u''a'))) {
                        
$result preg_replace_callback('/\pL+/u', function ($m) {
                            
$s $m[0];
                            
$l mb_strlen($s'UTF-8');
                            if (
$l === 1) {
                                
$s mb_strtoupper($s'UTF-8');
                            } else {
                                
$s mb_strtoupper(mb_substr($s01'UTF-8'), 'UTF-8').mb_substr($s1$l 1'UTF-8');
                            }

                            return 
$s;
                        }, 
$string);
                    }
                    break;
                case 
'titlecase-firstword':
                    if (
function_exists('mb_strlen')) {
                        
$l mb_strlen($string'UTF-8');
                        if (
$l === 1) {
                            
$result mb_strtoupper($string'UTF-8');
                        } elseif (
$l 1) {
                            
$result mb_strtoupper(mb_substr($string01'UTF-8'), 'UTF-8').mb_substr($string1$l 1'UTF-8');
                        }
                    }
                    break;
                case 
'lowercase-words':
                    if (
function_exists('mb_strtolower')) {
                        
$result mb_strtolower($string'UTF-8');
                    }
                    break;
            }
        }

        return 
$result;
    }

    
/**
     * Parse the browser HTTP_ACCEPT_LANGUAGE header and return the found locales, sorted in descending order by the quality values.
     *
     * @param bool $ignoreCache Set to true if you want to ignore the cache
     *
     * @return array Array keys are the found locales, array values are the relative quality value (from 0 to 1)
     */
    
public static function getBrowserLocales($ignoreCache false)
    {
        static 
$result;
        if (!isset(
$result) || $ignoreCache) {
            
$httpAcceptLanguages = @getenv('HTTP_ACCEPT_LANGUAGE');
            if ((!
is_string($httpAcceptLanguages)) || (strlen($httpAcceptLanguages) === 0)) {
                if (isset(
$_SERVER) && is_array($_SERVER) && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
                    
$httpAcceptLanguages $_SERVER['HTTP_ACCEPT_LANGUAGE'];
                }
            }
            
$result self::parseHttpAcceptLanguage($httpAcceptLanguages);
        }

        return 
$result;
    }

    
/**
     * Parse the value of an HTTP_ACCEPT_LANGUAGE header and return the found locales, sorted in descending order by the quality values.
     *
     * @param string $httpAcceptLanguages
     *
     * @return array Array keys are the found locales, array values are the relative quality value (from 0 to 1)
     */
    
public static function parseHttpAcceptLanguage($httpAcceptLanguages)
    {
        
$result = array();
        if (
is_string($httpAcceptLanguages) && (isset($httpAcceptLanguages[0]))) {
            foreach (
explode(','$httpAcceptLanguages) as $httpAcceptLanguage) {
                if (
preg_match('/^([a-z]{2,3}(?:[_\-][a-z]+)*)(?:\s*;(?:\s*q(?:\s*=(?:\s*([\d.]+))?)?)?)?$/'strtolower(trim($httpAcceptLanguage" t")), $m)) {
                    if (
count($m) > 2) {
                        if (
strpos($m[2], '.') === 0) {
                            
$m[2] = '0'.$m[2];
                        }
                        if (
preg_match('/^[01](\.\d*)?$/'$m[2])) {
                            
$quality round(@floatval($m[2]), 4);
                        } else {
                            
$quality = -1;
                        }
                    } else {
                        
$quality 1;
                    }
                    if ((
$quality >= 0) && ($quality <= 1)) {
                        
$found = array();
                        
$chunks explode('-'str_replace('_''-'$m[1]));
                        
$numChunks count($chunks);
                        if (
$numChunks === 1) {
                            
$found[] = $m[1];
                        } else {
                            
$base $chunks[0];
                            for (
$i 1$i $numChunks; ++$i) {
                                if (
strlen($chunks[$i]) === 4) {
                                    
$base .= '-'.ucfirst($chunks[$i]);
                                    break;
                                }
                            }
                            for (
$i 1$i $numChunks; ++$i) {
                                if (
preg_match('/^[a-z][a-z]$/'$chunks[$i])) {
                                    
$found[] = $base.'-'.strtoupper($chunks[$i]);
                                } elseif (
preg_match('/^\d{3}$/'$chunks[$i])) {
                                    
$found[] = $base.'-'.$chunks[$i];
                                }
                            }
                            if (empty(
$found)) {
                                
$found[] = $base;
                            }
                        }
                        foreach (
$found as $f) {
                            if (isset(
$result[$f])) {
                                if (
$result[$f] < $quality) {
                                    
$result[$f] = $quality;
                                }
                            } else {
                                
$result[$f] = $quality;
                            }
                        }
                    }
                }
            }
        }
        
arsort($resultSORT_NUMERIC);

        return 
$result;
    }

    
/**
     * Retrieve the character order (right-to-left or left-to-right).
     *
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return string Return 'left-to-right' or 'right-to-left'
     */
    
public static function getCharacterOrder($locale '')
    {
        
$data Data::get('layout'$locale);

        return 
$data['characterOrder'];
    }

    
/**
     * Retrieve the line order (top-to-bottom or bottom-to-top).
     *
     * @param string $locale The locale to use. If empty we'll use the default locale set in PunicData
     *
     * @return string Return 'top-to-bottom' or 'bottom-to-top'
     */
    
public static function getLineOrder($locale '')
    {
        
$data Data::get('layout'$locale);

        return 
$data['lineOrder'];
    }
}
Онлайн: 2
Реклама