Loader.php 3.1 KB

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