Loader.php 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. /**
  3. * 加载语言包
  4. * @Author Jinhui Zhu
  5. * @version 1.2
  6. *
  7. * Usage:
  8. * Qii::Qii_Language_Loader('load', 'error', Qii_DIR); 加载系统目录中的语言
  9. * Qii::Qii_Language_Loader('load', 'error'); 加载程序目录中的语言
  10. * OR
  11. * Qii::Qii_Language_Loader()->load('error', Qii_DIR); 加载系统目录中的语言
  12. * Qii::Qii_Language_Loader()->load('error'); 加载程序目录中的语言
  13. */
  14. namespace Qii\Language;
  15. use \Qii\Config\Register;
  16. use \Qii\Config\Consts;
  17. class Loader
  18. {
  19. const VERSION = 1.3;
  20. /**
  21. * @var $loaded ;
  22. */
  23. private $loaded;
  24. protected static $_instance;
  25. public function __construct()
  26. {
  27. return $this;
  28. }
  29. /**
  30. * 单例模式
  31. */
  32. public static function getInstance()
  33. {
  34. return \Qii\Autoloader\Factory::getInstance('\Qii\Language\Loader');
  35. }
  36. /**
  37. * 加载系统语言包
  38. * @param string $package 语言包名称
  39. * @param string $dir 语言包路径 默认为当前目录
  40. * @return Array 语言包内容
  41. */
  42. public function load($package, $dir = '')
  43. {
  44. if(!$dir)
  45. {
  46. $dir = \Qii::getInstance()->getWorkspace() . DS;
  47. }
  48. else if ($dir == Qii_DIR)
  49. {
  50. $dir = Qii_DIR . DS . 'Language' . DS;
  51. }
  52. else
  53. {
  54. $dir = $dir . DS;
  55. }
  56. //先获取语言配置信息
  57. $language = \Qii\Autoloader\Import::includes($dir . 'i18n' . DS . 'language.php');
  58. //如果是cli模式就使用英文
  59. if(IS_CLI) $language = "EN";
  60. $fileName = $dir . 'i18n' . DS . $language . DS . $package . '.php';
  61. if (isset($this->loaded[$fileName])) return;
  62. $this->loaded[$fileName] = true;
  63. if (is_file($fileName)) {
  64. return $this->merge($fileName);
  65. }
  66. throw new \Qii\Exceptions\FileNotFound($fileName, 404);
  67. }
  68. /**
  69. * 将语言包内容保存到系统Language中
  70. * @param string $fileName 文件名
  71. */
  72. protected function merge($fileName)
  73. {
  74. $data = Register::get(Consts::APP_LANGUAGE_CONFIG);
  75. if (!is_file($fileName)) throw new Exceptions(\Qii::i(1405, $fileName));
  76. $merge = (array) \Qii\Autoloader\Import::includes($fileName);
  77. if ($data) $merge = $data + $merge;
  78. Register::set(Consts::APP_LANGUAGE_CONFIG, $merge);
  79. }
  80. /**
  81. * 获取语言内容
  82. * @param Mix $code
  83. * @return String
  84. */
  85. public function get($code)
  86. {
  87. $data = Register::get(Consts::APP_LANGUAGE_CONFIG, array());
  88. if (isset($data) && isset($data[$code])) {
  89. return $data[$code];
  90. }
  91. return $code;
  92. }
  93. /**
  94. * sprintf 格式化语言信息内容
  95. * Qii::i(key, '格式化语言信息内容');
  96. * @return String
  97. */
  98. public function i()
  99. {
  100. $args = func_get_args();
  101. $message = array_shift($args);
  102. $message = $this->get($message);
  103. $vmessage = vsprintf($message, $args);
  104. if ($vmessage == $message && is_array($args) && count($args) > 0 && !(count($args) == 1 && $args[0] == '')) {
  105. return ' ['. $message .'] ['.join("\t", $args) . ']';
  106. }
  107. return $vmessage;
  108. }
  109. /**
  110. * 获取语言内容,支持vsprintf
  111. *
  112. * @param String $words
  113. * @param String $code
  114. * @param argvs vsprintf的格式化参数
  115. * @return String
  116. */
  117. public function gettext($code, $argvs = null)
  118. {
  119. if ($argvs == null) return $this->get($code);
  120. return vsprintf($this->get($code), $argvs);
  121. }
  122. }