Overview

Namespaces

  • Kotchasan
    • Cache
    • Database
    • Http
    • Log
    • Orm
  • None
  • PHP
  • Psr
    • Cache
    • Http
      • Message
    • Log

Classes

  • ArrayIterator
  • DateInterval
  • DOMNode
  • Kotchasan
  • Kotchasan\Accordion
  • Kotchasan\ApiController
  • Kotchasan\ArrayTool
  • Kotchasan\Cache\ApcCache
  • Kotchasan\Cache\Cache
  • Kotchasan\Cache\CacheItem
  • Kotchasan\Cache\FileCache
  • Kotchasan\CKEditor
  • Kotchasan\Collection
  • Kotchasan\Config
  • Kotchasan\Controller
  • Kotchasan\Country
  • Kotchasan\Csv
  • Kotchasan\Curl
  • Kotchasan\Currency
  • Kotchasan\Database
  • Kotchasan\Database\Db
  • Kotchasan\Database\DbCache
  • Kotchasan\Database\Driver
  • Kotchasan\Database\PdoMysqlDriver
  • Kotchasan\Database\Query
  • Kotchasan\Database\QueryBuilder
  • Kotchasan\Database\Schema
  • Kotchasan\Database\Sql
  • Kotchasan\DataTable
  • Kotchasan\Date
  • Kotchasan\DOMNode
  • Kotchasan\DOMParser
  • Kotchasan\Email
  • Kotchasan\File
  • Kotchasan\Files
  • Kotchasan\Form
  • Kotchasan\Grid
  • Kotchasan\Html
  • Kotchasan\Htmldoc
  • Kotchasan\HtmlTable
  • Kotchasan\Http\AbstractMessage
  • Kotchasan\Http\AbstractRequest
  • Kotchasan\Http\Message
  • Kotchasan\Http\NotFound
  • Kotchasan\Http\Request
  • Kotchasan\Http\Response
  • Kotchasan\Http\Stream
  • Kotchasan\Http\UploadedFile
  • Kotchasan\Http\Uri
  • Kotchasan\Image
  • Kotchasan\InputItem
  • Kotchasan\Inputs
  • Kotchasan\KBase
  • Kotchasan\Language
  • Kotchasan\ListItem
  • Kotchasan\Log\AbstractLogger
  • Kotchasan\Log\Logger
  • Kotchasan\Login
  • Kotchasan\Menu
  • Kotchasan\Mime
  • Kotchasan\Model
  • Kotchasan\Number
  • Kotchasan\ObjectTool
  • Kotchasan\Orm\Field
  • Kotchasan\Orm\Recordset
  • Kotchasan\Password
  • Kotchasan\Pdf
  • Kotchasan\Province
  • Kotchasan\Router
  • Kotchasan\Session
  • Kotchasan\Singleton
  • Kotchasan\Tab
  • Kotchasan\TableRow
  • Kotchasan\Template
  • Kotchasan\Text
  • Kotchasan\Validator
  • Kotchasan\View
  • PHPMailer
  • Psr\Log\AbstractLogger
  • Psr\Log\LogLevel
  • Psr\Log\NullLogger
  • SMTP

Interfaces

  • ArrayAccess
  • Countable
  • DateTimeInterface
  • Iterator
  • IteratorAggregate
  • Psr\Cache\CacheItemInterface
  • Psr\Cache\CacheItemPoolInterface
  • Psr\Http\Message\MessageInterface
  • Psr\Http\Message\RequestInterface
  • Psr\Http\Message\ResponseInterface
  • Psr\Http\Message\ServerRequestInterface
  • Psr\Http\Message\StreamInterface
  • Psr\Http\Message\UploadedFileInterface
  • Psr\Http\Message\UriInterface
  • Psr\Log\LoggerAwareInterface
  • Psr\Log\LoggerInterface
  • SeekableIterator
  • Serializable
  • Traversable

Traits

  • Psr\Log\LoggerTrait

Exceptions

  • Exception
  • InvalidArgumentException
  • Kotchasan\ApiException
  • Kotchasan\Cache\Exception
  • Kotchasan\Database\Exception
  • Kotchasan\InputItemException
  • LogicException
  • phpmailerException
  • RuntimeException

Functions

  • createClass
  • debug
  • getClassPath
  • Overview
  • Namespace
  • Class
  • Tree
  1: <?php
  2: /**
  3:  * @filesource Kotchasan/Language.php
  4:  *
  5:  * @copyright 2016 Goragod.com
  6:  * @license http://www.kotchasan.com/license/
  7:  *
  8:  * @see http://www.kotchasan.com/
  9:  */
 10: 
 11: namespace Kotchasan;
 12: 
 13: /**
 14:  * Class สำหรับการโหลดภาษา
 15:  *
 16:  * @author Goragod Wiriya <admin@goragod.com>
 17:  *
 18:  * @since 1.0
 19:  */
 20: final class Language extends \Kotchasan\KBase
 21: {
 22:     /**
 23:      * ภาษาทั้งหมดที่ติดตั้ง
 24:      *
 25:      * @var array
 26:      */
 27:     private static $installed_languages;
 28:     /**
 29:      * ชื่อภาษาที่กำลังใช้งานอยู่.
 30:      *
 31:      * @var string
 32:      */
 33:     private static $language_name;
 34:     /**
 35:      * รายการภาษา.
 36:      *
 37:      * @var object
 38:      */
 39:     private static $languages = null;
 40: 
 41:     /**
 42:      * ค้นหาข้อความภาษาที่ต้องการ ถ้าไม่พบคืนค่า $default
 43:      * ถ้าไม่ระบุ $default (null) คืนค่า $key
 44:      * ถ้าระบุ $value_key มาด้วยและ ค่าของภาษาเป็นแอเรย์ จะคืนค่า แอเรย์ของภาษาที่ $value_key
 45:      * ถ้าไม่พบข้อมูลที่เลือกคืนค่า null
 46:      *
 47:      * @assert ('XYZ', array()) [==] array()
 48:      * @assert ('YEAR_OFFSET') [==] 543
 49:      * @assert ('DATE_LONG', null, 0) [==] 'อาทิตย์'
 50:      * @assert ('not found', 'default') [==] 'default'
 51:      *
 52:      * @param string $key
 53:      * @param mixed  $default
 54:      * @param mixed  $value_key
 55:      */
 56:     public static function find($key, $default = null, $value_key = null)
 57:     {
 58:         if (null === self::$languages) {
 59:             new static();
 60:         }
 61:         if (isset(self::$languages->{$key})) {
 62:             $item = self::$languages->$key;
 63:             if (is_array($item)) {
 64:                 if ($value_key !== null && isset($item[$value_key])) {
 65:                     return $item[$value_key];
 66:                 }
 67:             } else {
 68:                 return $item;
 69:             }
 70:         }
 71:         return $default === null ? $key : $default;
 72:     }
 73: 
 74:     /**
 75:      * ฟังก์ชั่นอ่านภาษาที่
 76:      * ถ้าไม่พบ $key ที่ต้อง
 77:      * $default = null (หรือไม่ระบุ) คืนค่า $key
 78:      * $default = อื่นๆ คืนค่า $default
 79:      *
 80:      * @assert ('YEAR_OFFSET') [==] 543
 81:      * @assert ('XYZ', array()) [==] array()
 82:      *
 83:      * @param string $key ข้อความในภาษาอังกฤษ หรือ คีย์ของภาษา
 84:      * @param mixed $default ถ้าไม่ระบุ (null) และไม่พบ $key
 85:      *
 86:      * @return mixed
 87:      */
 88:     public static function get($key, $default = null)
 89:     {
 90:         if (null === self::$languages) {
 91:             new static();
 92:         }
 93:         return isset(self::$languages->{$key}) ? self::$languages->{$key} : ($default === null ? $key : $default);
 94:     }
 95: 
 96:     /**
 97:      * อ่านภาษาหลายรายการ ตามที่กำหนดโดย $keys
 98:      *
 99:      * @param array $keys
100:      *
101:      * @return array
102:      */
103:     public static function getItems(array $keys = array())
104:     {
105:         if (null === self::$languages) {
106:             new static();
107:         }
108:         $result = array();
109:         foreach ($keys as $i => $key) {
110:             $result[is_int($i) ? $key : $i] = isset(self::$languages->{$key}) ? self::$languages->{$key} : $key;
111:         }
112:         return $result;
113:     }
114: 
115:     /**
116:      * โหลดไฟล์ภาษาทั้งหมดที่ติดตั้ง
117:      * คืนค่าข้อมูลภาษาทั้งหมด
118:      *
119:      * @param string $type
120:      *
121:      * @return array
122:      */
123:     public static function installed($type)
124:     {
125:         $language_folder = self::languageFolder();
126:         $datas = array();
127:         foreach (self::installedLanguage() as $lng) {
128:             if ($type == 'php') {
129:                 if (is_file($language_folder.$lng.'.php')) {
130:                     // php
131:                     $datas[$lng] = include $language_folder.$lng.'.php';
132:                 }
133:             } elseif (is_file($language_folder.$lng.'.js')) {
134:                 // js
135:                 $list = file($language_folder.$lng.'.js');
136:                 foreach ($list as $item) {
137:                     if (preg_match('/var\s+(.*)\s+=\s+[\'"](.*)[\'"];/', $item, $values)) {
138:                         $datas[$lng][$values[1]] = $values[2];
139:                     }
140:                 }
141:             }
142:         }
143:         // จัดกลุ่มภาษาตาม key
144:         $languages = array();
145:         foreach ($datas as $language => $values) {
146:             foreach ($values as $key => $value) {
147:                 $languages[$key][$language] = $value;
148:                 if (is_array($value)) {
149:                     $languages[$key]['array'] = true;
150:                 }
151:             }
152:         }
153:         // จัดกลุ่มภาษาตาม id
154:         $datas = array();
155:         $i = 0;
156:         foreach ($languages as $key => $row) {
157:             $datas[$i] = ArrayTool::replace(array('id' => $i, 'key' => $key), $row);
158:             ++$i;
159:         }
160:         return $datas;
161:     }
162: 
163:     /**
164:      * รายชื่อภาษาที่ติดตั้ง
165:      *
166:      * @return array
167:      */
168:     public static function installedLanguage()
169:     {
170:         if (!isset(self::$installed_languages)) {
171:             $language_folder = self::languageFolder();
172:             $files = array();
173:             File::listFiles($language_folder, $files);
174:             foreach ($files as $file) {
175:                 if (preg_match('/(.*\/([a-z]{2,2}))\.(php|js)$/', $file, $match)) {
176:                     self::$installed_languages[$match[2]] = $match[2];
177:                 }
178:             }
179:         }
180:         return self::$installed_languages;
181:     }
182: 
183:     /**
184:      * ตรวจสอบคีย์ของภาษาซ้ำ
185:      * คืนค่าลำดับที่พบ (รายการแรกคือ 0), คืนค่า -1 ถ้าไม่พบ.
186:      *
187:      * @assert (array(array('id' => 0, 'key' => 'One'), array('id' => 100, 'key' => 'Two')), 'One') [==] 0
188:      * @assert (array(array('id' => 0, 'key' => 'One'), array('id' => 100, 'key' => 'Two')), 'two') [==] 100
189:      * @assert (array(array('id' => 0, 'key' => 'One'), array('id' => 100, 'key' => 'Two')), 'O') [==] -1
190:      *
191:      * @param array  $languages ข้อมูลภาษาที่ต้องการตรวจสอบ
192:      * @param string $key       รายการที่ต้องการตรวจสอบ
193:      *
194:      * @return int
195:      */
196:     public static function keyExists($languages, $key)
197:     {
198:         foreach ($languages as $item) {
199:             if (strcasecmp($item['key'], $key) == 0) {
200:                 return $item['id'];
201:             }
202:         }
203:         return -1;
204:     }
205: 
206:     /**
207:      * ฟังก์ชั่นอ่านชื่อโฟลเดอร์เก็บไฟล์ภาษา
208:      *
209:      * @return string
210:      */
211:     public static function languageFolder()
212:     {
213:         return ROOT_PATH.'language/';
214:     }
215: 
216:     /**
217:      * อ่านชื่อภาษาที่กำลังใช้งานอยู่
218:      *
219:      * @assert () [==] 'th'
220:      *
221:      * @return string
222:      */
223:     public static function name()
224:     {
225:         if (null === self::$languages) {
226:             new static();
227:         }
228:         return self::$language_name;
229:     }
230: 
231:     /**
232:      * กำหนดภาษาที่ต้องการ
233:      *
234:      * @param string $language
235:      *
236:      * @return string
237:      */
238:     public static function setName($language)
239:     {
240:         if (null === self::$languages || $language !== self::$languages) {
241:             new static($language);
242:         }
243: 
244:         return self::$language_name;
245:     }
246: 
247:     /**
248:      * ฟังก์ชั่นแปลภาษาที่รับค่ามาจากการ parse Theme
249:      *
250:      * @assert (array(1 => 'not found')) [==] 'not found'
251:      *
252:      * @param array $match ตัวแปรรับค่ามาจากการ parse Theme
253:      *
254:      * @return string
255:      */
256:     public static function parse($match)
257:     {
258:         return self::get($match[1]);
259:     }
260: 
261:     /**
262:      * คืนค่าภาษาตาม $key
263:      * และแทนที่ข้อความ ที่ $replace array(':key' => 'value', ':key' => 'value')
264:      *
265:      * @assert ('You want to :action', array(':action' => 'delete')) [==] 'You want to delete'
266:      *
267:      * @param string $key
268:      * @param array  $replace
269:      *
270:      * @return mixed
271:      */
272:     public static function replace($key, $replace)
273:     {
274:         if (null === self::$languages) {
275:             new static();
276:         }
277:         $value = isset(self::$languages->$key) ? self::$languages->$key : $key;
278:         foreach ($replace as $k => $v) {
279:             $v = isset(self::$languages->$v) ? self::$languages->$v : $v;
280:             $value = str_replace($k, $v, $value);
281:         }
282:         return $value;
283:     }
284: 
285:     /**
286:      * บันทึกไฟล์ภาษา
287:      *
288:      * @param array  $languages
289:      * @param string $type
290:      *
291:      * @return string
292:      */
293:     public static function save($languages, $type)
294:     {
295:         $datas = array();
296:         foreach ($languages as $items) {
297:             foreach ($items as $key => $value) {
298:                 if (!in_array($key, array('id', 'key', 'array', 'owner', 'type', 'js'))) {
299:                     $datas[$key][$items['key']] = $value;
300:                 }
301:             }
302:         }
303:         $language_folder = self::languageFolder();
304:         foreach ($datas as $lang => $items) {
305:             $list = array();
306:             foreach ($items as $key => $value) {
307:                 if ($type == 'js') {
308:                     if (is_string($value)) {
309:                         $list[] = "var $key = '$value';";
310:                     } else {
311:                         $list[] = "var $key = $value;";
312:                     }
313:                 } elseif (is_array($value)) {
314:                     $save = array();
315:                     foreach ($value as $k => $v) {
316:                         $data = '';
317:                         if (preg_match('/^[0-9]+$/', $k)) {
318:                             $data = $k.' => ';
319:                         } else {
320:                             $data = '\''.$k.'\' => ';
321:                         }
322:                         if (is_string($v)) {
323:                             $data .= '\''.$v.'\'';
324:                         } else {
325:                             $data .= $v;
326:                         }
327:                         $save[] = $data;
328:                     }
329:                     $list[] = '\''.$key."' => array(\n    ".implode(",\n    ", $save)."\n  )";
330:                 } elseif (is_string($value)) {
331:                     $list[] = '\''.$key.'\' => \''.($value).'\'';
332:                 } else {
333:                     $list[] = '\''.$key.'\' => '.$value;
334:                 }
335:             }
336:             $f = @fopen($language_folder.$lang.'.'.$type, 'wb');
337:             if ($f !== false) {
338:                 if ($type == 'php') {
339:                     $content = '<'."?php\n/* language/$lang.php */\nreturn array(\n  ".implode(",\n  ", $list)."\n);";
340:                 } else {
341:                     $content = implode("\n", $list);
342:                 }
343:                 fwrite($f, $content);
344:                 fclose($f);
345:             } else {
346:                 return sprintf(self::get('File %s cannot be created or is read-only.'), $lang.'.'.$type);
347:             }
348:         }
349:         return '';
350:     }
351: 
352:     /**
353:      * แปลภาษา
354:      *
355:      * @assert ('ภาษา {LNG_DATE_FORMAT} ไทย') [==] 'ภาษา d M Y เวลา H:i น. ไทย'
356:      *
357:      * @param string $content
358:      *
359:      * @return string
360:      */
361:     public static function trans($content)
362:     {
363:         return preg_replace_callback('/{LNG_([^}]+)}/', function ($match) {
364:             return Language::get($match[1]);
365:         }, $content);
366:     }
367: 
368:     /**
369:      * โหลดภาษาตามที่เลือก
370:      *
371:      * @param string $lang
372:      */
373:     public static function load($lang)
374:     {
375:         // โฟลเดอร์ ภาษา
376:         $language_folder = self::languageFolder();
377:         if (is_file($language_folder.$lang.'.php')) {
378:             $language = include $language_folder.$lang.'.php';
379:             if (isset($language)) {
380:                 self::$languages = (object) $language;
381:                 self::$language_name = $lang;
382:             }
383:         }
384:     }
385: 
386:     /**
387:      * โหลดภาษา
388:      *
389:      * @param string $lang ภาษาที่ต้องการ ถ้าไม่ระบุจะอ่านจาก cookie my_lang
390:      */
391:     private function __construct($lang = null)
392:     {
393:         // โฟลเดอร์ ภาษา
394:         $language_folder = self::languageFolder();
395:         // ภาษาที่เลือก
396:         if ($lang === null) {
397:             $lang = self::$request->get('lang', self::$request->cookie('my_lang', '')->toString())->filter('a-z');
398:         }
399:         if (empty($lang)) {
400:             if (defined('AUTO_LANGUAGE') && AUTO_LANGUAGE === true) {
401:                 // ภาษาจาก Browser
402:                 $languages = self::$request->getAcceptableLanguages();
403:                 if (!empty($languages) && preg_match('/^([a-z]{2,2}).*?$/', strtolower($languages[0]), $match)) {
404:                     $lang = $match[1];
405:                 } else {
406:                     $lang = 'th';
407:                 }
408:             }
409:         }
410:         // ตรวจสอบภาษา ใช้ภาษาแรกที่เจอ
411:         foreach (ArrayTool::replace(array($lang => $lang), self::$cfg->languages) as $item) {
412:             if (!empty($item)) {
413:                 if (is_file($language_folder.$item.'.php')) {
414:                     $language = include $language_folder.$item.'.php';
415:                     if (isset($language)) {
416:                         self::$languages = (object) $language;
417:                         self::$language_name = $item;
418:                         // บันทึกภาษาที่กำลังใช้งานอยู่ลงใน cookie
419:                         setcookie('my_lang', $item, time() + 2592000, '/');
420:                         break;
421:                     }
422:                 }
423:             }
424:         }
425:         if (null === self::$languages) {
426:             // default language
427:             self::$language_name = 'th';
428:             self::$languages = (object) array(
429:                 'DATE_FORMAT' => 'd M Y เวลา H:i น.',
430:                 'DATE_LONG' => array(
431:                     0 => 'อาทิตย์',
432:                     1 => 'จันทร์',
433:                     2 => 'อังคาร',
434:                     3 => 'พุธ',
435:                     4 => 'พฤหัสบดี',
436:                     5 => 'ศุกร์',
437:                     6 => 'เสาร์',
438:                 ),
439:                 'DATE_SHORT' => array(
440:                     0 => 'อา.',
441:                     1 => 'จ.',
442:                     2 => 'อ.',
443:                     3 => 'พ.',
444:                     4 => 'พฤ.',
445:                     5 => 'ศ.',
446:                     6 => 'ส.',
447:                 ),
448:                 'YEAR_OFFSET' => 543,
449:                 'MONTH_LONG' => array(
450:                     1 => 'มกราคม',
451:                     2 => 'กุมภาพันธ์',
452:                     3 => 'มีนาคม',
453:                     4 => 'เมษายน',
454:                     5 => 'พฤษภาคม',
455:                     6 => 'มิถุนายน',
456:                     7 => 'กรกฎาคม',
457:                     8 => 'สิงหาคม',
458:                     9 => 'กันยายน',
459:                     10 => 'ตุลาคม',
460:                     11 => 'พฤศจิกายน',
461:                     12 => 'ธันวาคม',
462:                 ),
463:                 'MONTH_SHORT' => array(
464:                     1 => 'ม.ค.',
465:                     2 => 'ก.พ.',
466:                     3 => 'มี.ค.',
467:                     4 => 'เม.ย.',
468:                     5 => 'พ.ค.',
469:                     6 => 'มิ.ย.',
470:                     7 => 'ก.ค.',
471:                     8 => 'ส.ค.',
472:                     9 => 'ก.ย.',
473:                     10 => 'ต.ค.',
474:                     11 => 'พ.ย.',
475:                     12 => 'ธ.ค.',
476:                 ),
477:             );
478:         }
479:         if (!defined('LANGUAGE')) {
480:             /* ลงทะเบียนภาษาที่ใช้งานอยู่ */
481:             define('LANGUAGE', self::$language_name);
482:         }
483:     }
484: }
485: 
Kotchasan API documentation generated by ApiGen