Completed
Push — master ( 1e127d...8448b8 )
by Vitaly
02:04
created

SamsonLocale::set()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 20
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 20
rs 9.2
cc 4
eloc 8
nc 4
nop 1
1
<?php
2
namespace samson\core;
3
4
// TODO: Should moved to separate module, probably i18n
5
6
//[PHPCOMPRESSOR(remove,start)]
7
// I default locale is not defined
8
if (!defined('DEFAULT_LOCALE')) {
9
    // Define default locale
10
    define('DEFAULT_LOCALE', SamsonLocale::RU);
11
}
12
//[PHPCOMPRESSOR(remove,end)]
13
14
/**
15
 * Класс для поддержки локализации веб-приложения
16
 *
17
 * @author Vitaly Iegorov <[email protected]>
18
 * @package SamsonPHP 
19
 * @version 0.1.0
20
 */
21
class SamsonLocale
22
{
23
    /** Локализация по умолчанию */
24
    const DEF = DEFAULT_LOCALE;
25
    /** Украинская локализация */
26
    const UA = 'ua';
27
    /** Английская локализация */
28
    const EN = 'en';
29
    /** Русская локализация */
30
    const RU = 'ru';
31
    /** Румынская локализация */
32
    const RO = 'ro';
33
    /** Китайская локализация */
34
    const CH = 'ch';
35
    /** Французская локализация */
36
    const FR = 'fr';
37
    /** Корейская локализация */
38
    const KO = 'ko';
39
    /** Немецкая локализация */
40
    const DE = 'de';
41
42
    /**
43
     * Коллекция поддерживаемых локализаций
44
     * Используется для дополнительного контроля за локализациями
45
     * @var array
46
     */
47
    private static $supported = array(
48
        SamsonLocale::DEF,
49
        SamsonLocale::EN,
50
        SamsonLocale::UA,
51
        SamsonLocale::RO,
52
        SamsonLocale::CH,
53
        SamsonLocale::RU,
54
        SamsonLocale::FR,
55
        SamsonLocale::KO,
56
        SamsonLocale::DE,
57
    );
58
59
    /**
60
     * Alias for binding default web-application locale
61
     * @var string
62
     */
63
    public static $defaultLocale = DEFAULT_LOCALE;
64
65
    /**
66
     * Текущая локализация веб-приложения
67
     * @var string
68
     */
69
    public static $current_locale = '';
70
71
    /**
72
     * Коллекция подключенных локализаций для текущего веб-приложения
73
     * Локаль по умолчанию RU, имеет представление пустышку - ''
74
     * @var array
75
     */
76
    public static $locales = array();
77
78
    /**
79
     * Проверить текущей значение установленной локали, и если выставлена
80
     * не поддерживаемая локаль - установим локаль по умолчанию
81
     */
82
    public static function check()
83
    {
84
        // Проверим значение установленной текущей локализации, если оно не входит в список доступных локализаций
85
        // установим локализацию по умолчанию
86
        if (!in_array(strtolower(self::$current_locale), self::$locales)) self::$current_locale = self::DEF;
87
    }
88
89
    /**
90
     * Установить все доступные локализации для текущего веб-приложения.
91
     * Локализацию по умолчанию, передавать не нужно, т.к. она уже включена в список
92
     * и описана в <code>SamsonLocale::DEF</code>
93
     *
94
     * Функция автоматически проверяет уже выставленное значение локализации веб-приложения
95
     * и вслучаи его отсутствия, выставляет локализацию по умолчанию
96
     *
97
     * @param array $available_locales Коллекция с доступными локализациями веб-приложения
98
     */
99
    public static function set(array $available_locales)
100
    {
101
        // Переберем локализации
102
        foreach ($available_locales as $locale) {
103
            $_locale = strtolower($locale);
104
105
            // Добавим в коллекцию доступных локализаций переданные
106
            if (in_array($_locale, self::$supported)) {
107
                // Ignore duplicare locale setting
108
                if (!in_array($_locale, self::$locales)) {
109
                    self::$locales[] = $_locale;
110
                }
111
            } // Проверим разрешаемые локали
112
            else die('Устанавливаемая локализация "' . $locale . '" - не предусмотрена в SamsonLocale');
113
        }
114
115
        // Проверим значение установленной текущей локализации, если оно не входит в список доступных локализаций
116
        // установим локализацию по умолчанию
117
        self::check();
118
    }
119
120
    /**
121
     * Получить все доступные локализации для текущего веб-приложения
122
     */
123
    public static function get()
124
    {
125
        return self::$locales;
126
    }
127
128
    /**
129
     * Установить/Получить текущую локализацию веб-приложения
130
     * @param string $locale Значение локализации веб-приложения для установки
131
     * @return string    Возвращается значение текущей локализации веб-приложения до момента
132
     *                    вызова данного метода
133
     */
134
    public static function current($locale = null)
135
    {
136
        // Сохраним старое значение локали
137
        $_locale = self::$current_locale;
138
139
        // If nothing is passed just return current locale
140
        if (!isset($locale)) {
141
            return $_locale;
142
143
        } else { // Switch locale
144
            // Save new locale
145
            self::$current_locale = strtolower($locale);
146
147
            // Запишем текущее значение локализации
148
            $_SESSION['__SAMSON_LOCALE__'] = self::$current_locale;
149
150
            // Вернем текущее значение локали сайта до момента візова метода
151
            return self::$current_locale;
152
        }
153
    }
154
155
    /**
156
     * Parse URL arguments
157
     * @param array $args Collection of URL arguments
158
     * @return boolean True if current locale has been changed
159
     */
160
    public static function parseURL(array & $args)
161
    {
162
        // Iterate defined site locales
163
        foreach (self::$locales as $locale) {
164
            // Search locale string as URL argument
165
            if (($key = array_search($locale, $args)) !== FALSE) {
166
                // Change current locale
167
                self::current($locale);
168
169
                // If this is not default locale(empty string) - remove it from URL arguments
170
                if ($locale != self::DEF) {
171
                    // Remove argument contained locale string
172
                    unset($args[$key]);
173
174
                    // Reindex array
175
                    $args = array_values($args);
176
                }
177
178
                // Return true status
179
                return true;
180
            }
181
        }
182
183
        // If we are here - this is default locale
184
        // Switch to current web-application $default locale
185
        self::current(self::DEF);
186
187
        return false;
188
    }
189
}
190