/system/classes/language.php

https://gitlab.com/srueegger/1zu12bB · PHP · 189 lines · 113 code · 20 blank · 56 comment · 16 complexity · a66fb61b53605afd0f755da05af7aa70 MD5 · raw file

  1. <?PHP
  2. class Language{
  3. public $language = null;
  4. public $root = "";
  5. private $cache = array();
  6. private static $isLoading = false;
  7. /**
  8. *
  9. * @param string $token
  10. */
  11. public function __construct($token = null){
  12. if($token == null){
  13. $token = Settings::getInstance()->get("language");
  14. }
  15. $this->language = $token;
  16. $alias = Page::Current()->alias;
  17. if(Cache::Contains("language",$token."/".$alias)){
  18. $this->cache = Cache::getData("language",$token."/".$alias);
  19. }
  20. }
  21. /**
  22. *
  23. * @param string $token
  24. * @return string
  25. */
  26. public function Translate($token){
  27. if(!isset($this->cache[$token])){
  28. $packageName = DataBase::Current()->EscapeString(self::getLanguagePackName($token,$this->language));
  29. $this->cache[$token] = DataBase::Current()->ReadField("SELECT text FROM {'dbprefix'}languagepack_".$packageName." WHERE token = '".DataBase::Current()->EscapeString($token)."'");
  30. if(!$this->cache[$token]){
  31. $this->cache[$token] = $token;
  32. if(DEVELOPMENT){
  33. die("Language-Token ".$token." not found");
  34. }
  35. }
  36. }
  37. return $this->cache[$token];
  38. }
  39. /**
  40. *
  41. * @param string $token
  42. * @return string
  43. */
  44. public function getString($token){
  45. return $this->Translate($token);
  46. }
  47. /**
  48. * returns the translation of $token
  49. * @return string Translation
  50. */
  51. public static function DirectTranslate($token){
  52. return self::GetGlobal()->Translate($token);
  53. }
  54. /**
  55. *
  56. * @param string $token
  57. * @return string
  58. */
  59. public static function DirectTranslateHtml($token){
  60. return htmlentities(utf8_decode(self::GetGlobal()->Translate($token)));
  61. }
  62. /**
  63. *
  64. * @param string $token
  65. * @return string
  66. */
  67. private static function getLanguagePackName($token,$language){
  68. $namespaces = explode("_",strtolower($token));
  69. if(sizeOf($namespaces) >= 2){
  70. if($namespaces[0] == "plugin"){
  71. return strtoupper($language)."_plugin_".$namespaces[1];
  72. }
  73. else if($namespaces[0] == "skin"){
  74. return strtoupper($language)."_skin_".$namespaces[1];
  75. }
  76. }
  77. return strtoupper($language)."_global";
  78. }
  79. /**
  80. *
  81. * @param string $token
  82. * @param string $text
  83. */
  84. public function addTranslation($token,$text){
  85. $token = DataBase::Current()->EscapeString($token);
  86. $text = DataBase::Current()->EscapeString($text);
  87. $packageName = DataBase::Current()->EscapeString(self::getLanguagePackName($token,$this->language));
  88. DataBase::Current()->Execute("INSERT INTO {'dbprefix'}languagepack_".$packageName." (token,text) VALUES ('".$token."','".$text."')");
  89. }
  90. /**
  91. *
  92. * @param string $token
  93. */
  94. public function deleteTranslation($token){
  95. $token = DataBase::Current()->EscapeString($token);
  96. $packageName = DataBase::Current()->EscapeString(self::getLanguagePackName($token,$this->language));
  97. DataBase::Current()->Execute("DELETE FROM {'dbprefix'}languagepack_".$packageName." WHERE token = '".$token."'");
  98. }
  99. /**
  100. *
  101. * @param string $token
  102. * @param string $text
  103. */
  104. public function updateTranslation($token,$text){
  105. $this->deleteTranslation($token);
  106. $this->addTranslation($token,$text);
  107. }
  108. /**
  109. *
  110. * @param mixed $obj
  111. * @return mixed
  112. */
  113. public function replaceLanguageTokensByObject($obj){
  114. if($obj){
  115. foreach($obj as $key => $value) {
  116. preg_match_all("/{LANG:([^}]+)}/", $value, $tokens, PREG_SET_ORDER);
  117. foreach($tokens as $token){
  118. $translation = Language::DirectTranslate($token[1]);
  119. $obj->{$key} = str_ireplace($token[0],$translation,$obj->{$key});
  120. }
  121. }
  122. }
  123. return $obj;
  124. }
  125. /**
  126. *
  127. * returns a the global instance of the language class
  128. * @return Language
  129. */
  130. public static function GetGlobal(){
  131. if(!isset($GLOBALS['language'])){
  132. self::$isLoading = true;
  133. $GLOBALS['language'] = new Language();
  134. self::$isLoading = false;
  135. self::GetGlobal()->replaceLanguageTokensByObject(Page::Current());
  136. }
  137. return $GLOBALS['language'];
  138. }
  139. public function __destruct() {
  140. $alias = Page::Current()->alias;
  141. if(!Cache::Contains("language",$this->language."/".$alias)){
  142. Cache::setData("language",$this->language."/".$alias, $this->cache);
  143. }
  144. }
  145. /**
  146. *
  147. * @return boolean
  148. */
  149. public static function IsLoading(){
  150. return isset(self::$isLoading) && self::$isLoading;
  151. }
  152. public static function CreateLanguagePack($name,$language = null){
  153. $name = self::getLanguagePackName($name, $language);
  154. DataBase::Current()->Execute("CREATE TABLE {'dbprefix'}languagepack_".$name." (
  155. `token` varchar(255) NOT NULL,
  156. `text` TEXT NOT NULL,
  157. PRIMARY KEY (`token`)
  158. ) ENGINE=MyISAM DEFAULT CHARSET=latin1");
  159. }
  160. public static function DropLanguagePack($name,$language = null){
  161. $name = self::getLanguagePackName($name, $language);
  162. DataBase::Current()->Execute("DROP TABLE {'dbprefix'}languagepack_".$name);
  163. }
  164. public function ClearCache(){
  165. Cache::clear("language");
  166. $this->cache = array();
  167. }
  168. }
  169. ?>