/include/Jaws/Translate.php

https://github.com/jaws-project/jaws · PHP · 330 lines · 175 code · 38 blank · 117 comment · 39 complexity · 9b257156e6a6ee6559737795453dfaaa MD5 · raw file

  1. <?php
  2. /**
  3. * Class to manage translation of strings
  4. *
  5. * @category JawsType
  6. * @package Core
  7. * @author Jorge A Gallegos <kad@gulags.org>
  8. * @author Pablo Fischer <pablo@pablo.com.mx>
  9. * @author Jon Wood <jon@substance-it.co.uk>
  10. * @author Ali Fazelzadeh <afz@php.net>
  11. * @copyright 2005-2022 Jaws Development Group
  12. * @license http://www.gnu.org/copyleft/lesser.html
  13. */
  14. class Jaws_Translate
  15. {
  16. /**
  17. * Translate types
  18. *
  19. * @const int
  20. * @access public
  21. */
  22. const TRANSLATE_GLOBAL = 0;
  23. const TRANSLATE_GADGET = 1;
  24. const TRANSLATE_PLUGIN = 2;
  25. const TRANSLATE_INSTALL = 4;
  26. const TRANSLATE_UPGRADE = 5;
  27. /**
  28. * Gadgets list array
  29. *
  30. * @access private
  31. * @var array
  32. */
  33. private static $real_gadgets_module = array();
  34. /**
  35. * plugins list array
  36. *
  37. * @access private
  38. * @var array
  39. */
  40. private static $real_plugins_module = array();
  41. /**
  42. * Default language to use
  43. *
  44. * @access private
  45. * @var string
  46. */
  47. var $_defaultLanguage = 'en';
  48. /**
  49. * load user translated files
  50. *
  51. * @access private
  52. * @var bool
  53. */
  54. var $_load_user_translated = true;
  55. /**
  56. * store modules translates data
  57. *
  58. * @access private
  59. * @var bool
  60. */
  61. var $translates = array();
  62. /**
  63. * Constructor
  64. *
  65. * @access private
  66. * @param bool $load_user_translated Loaded user customized translated statements
  67. * @return void
  68. */
  69. private function __construct($load_user_translated)
  70. {
  71. $gDir = ROOT_JAWS_PATH . 'gadgets/';
  72. $gadgets = scandir($gDir);
  73. foreach ($gadgets as $gadget) {
  74. if ($gadget[0] == '.' || !is_dir($gDir . $gadget)) {
  75. continue;
  76. }
  77. self::$real_gadgets_module[strtoupper($gadget)] = $gadget;
  78. }
  79. $pDir = ROOT_JAWS_PATH . 'plugins/';
  80. $plugins = scandir($pDir);
  81. foreach ($plugins as $plugin) {
  82. if ($plugin[0] == '.' || !is_dir($pDir . $plugin)) {
  83. continue;
  84. }
  85. self::$real_plugins_module[strtoupper($plugin)] = $plugin;
  86. }
  87. $this->_load_user_translated = $load_user_translated;
  88. }
  89. /**
  90. * Creates the Jaws_Translate instance if it doesn't exist else it returns the already created one
  91. *
  92. * @access public
  93. * @param bool $load_user_translated Loaded user customized translated statements
  94. * @return object returns the instance
  95. */
  96. static function getInstance($load_user_translated = true)
  97. {
  98. static $objTranslate;
  99. if (!isset($objTranslate)) {
  100. $objTranslate = new Jaws_Translate($load_user_translated);
  101. }
  102. return $objTranslate;
  103. }
  104. /**
  105. * Initializes the Translate
  106. *
  107. * @access public
  108. * @param bool $load_user_translated Loaded user customized translated statements
  109. * @return void
  110. */
  111. function init($lang = 'en')
  112. {
  113. $this->_defaultLanguage = $lang;
  114. }
  115. /**
  116. * Set the default language to use
  117. *
  118. * @access public
  119. * @param string $lang Language to use
  120. * @return void
  121. */
  122. function SetLanguage($lang)
  123. {
  124. $this->_defaultLanguage = $lang;
  125. }
  126. /**
  127. * Translate a string.
  128. *
  129. * @access public
  130. * @param int $type Type of module
  131. * @param string $module Module name
  132. * @param string $string Statement
  133. * @param array $params Statement parameters
  134. * @return string The translated string, with replacements made.
  135. */
  136. function XTranslate($lang, $type, $module, $string, $params)
  137. {
  138. $lang = empty($lang)? $this->_defaultLanguage : $lang;
  139. $string = strtoupper($string);
  140. $module = strtoupper($module);
  141. switch ($type) {
  142. case self::TRANSLATE_GLOBAL:
  143. $module = '';
  144. break;
  145. case self::TRANSLATE_INSTALL:
  146. $module = 'INSTALLER';
  147. break;
  148. case self::TRANSLATE_UPGRADE:
  149. $module = 'UPGRADER';
  150. break;
  151. case self::TRANSLATE_GADGET:
  152. case self::TRANSLATE_PLUGIN:
  153. break;
  154. default:
  155. return $string;
  156. }
  157. // autoload not loaded module language
  158. if (!isset($this->translates[$lang][$type][$module])) {
  159. if (!$this->LoadTranslation($module, $type, $lang)) {
  160. return $string;
  161. }
  162. }
  163. if (isset($this->translates[$lang][$type][$module][$string])) {
  164. $string = Jaws_UTF8::str_replace(
  165. array('\n', '\"'),
  166. array("\n", '"'),
  167. $this->translates[$lang][$type][$module][$string]
  168. );
  169. }
  170. foreach ($params as $key => $value) {
  171. $string = str_replace('{' . $key . '}', $value, $string);
  172. }
  173. if (strpos($string, '{') !== false) {
  174. $string = preg_replace('/\s*{[0-9]+\}/u', '', $string);
  175. }
  176. return $string;
  177. }
  178. /**
  179. * Loads a translation file.
  180. *
  181. * @access public
  182. * @param string $module The translation to load
  183. * @param string $type Type of module(TRANSLATE_GLOBAL, TRANSLATE_GADGET, TRANSLATE_PLUGIN)
  184. * @param string $lang Optional language code
  185. * @return mixed
  186. */
  187. function LoadTranslation($module, $type = self::TRANSLATE_GLOBAL, $lang = null)
  188. {
  189. $lang = empty($lang) ? $this->_defaultLanguage : $lang;
  190. $module = strtoupper($module);
  191. // Only attempt to load a translation if it isn't already loaded.
  192. if (isset($this->translates[$lang][$type][$module])) {
  193. return $this->translates[$lang][$type][$module];
  194. }
  195. switch ($type) {
  196. case self::TRANSLATE_GADGET:
  197. if (!array_key_exists($module, self::$real_gadgets_module)) {
  198. return false;
  199. }
  200. $module = self::$real_gadgets_module[$module];
  201. if ($lang == 'en') {
  202. $orig_i18n = ROOT_JAWS_PATH . "gadgets/$module/Resources/translates.ini";
  203. } else {
  204. $orig_i18n = ROOT_JAWS_PATH . "languages/$lang/gadgets/$module.ini";
  205. }
  206. $data_i18n = ROOT_DATA_PATH . "languages/$lang/gadgets/$module.ini";
  207. break;
  208. case self::TRANSLATE_PLUGIN:
  209. if (!array_key_exists($module, self::$real_plugins_module)) {
  210. return false;
  211. }
  212. $module = self::$real_plugins_module[$module];
  213. if ($lang == 'en') {
  214. $orig_i18n = ROOT_JAWS_PATH . "plugins/$module/Resources/translates.ini";
  215. } else {
  216. $orig_i18n = ROOT_JAWS_PATH . "languages/$lang/plugins/$module.ini";
  217. }
  218. $data_i18n = ROOT_DATA_PATH . "languages/$lang/plugins/$module.ini";
  219. break;
  220. case self::TRANSLATE_INSTALL:
  221. $module = 'Installer';
  222. if ($lang == 'en') {
  223. $orig_i18n = ROOT_JAWS_PATH . "install/Resources/translates.ini";
  224. } else {
  225. $orig_i18n = ROOT_JAWS_PATH . "languages/$lang/Install.ini";
  226. }
  227. $data_i18n = ROOT_DATA_PATH . "languages/$lang/Install.ini";
  228. break;
  229. case self::TRANSLATE_UPGRADE:
  230. $module = 'Upgrader';
  231. if ($lang == 'en') {
  232. $orig_i18n = ROOT_JAWS_PATH . "upgrade/Resources/translates.ini";
  233. } else {
  234. $orig_i18n = ROOT_JAWS_PATH . "languages/$lang/Upgrade.ini";
  235. }
  236. $data_i18n = ROOT_DATA_PATH . "languages/$lang/Upgrade.ini";
  237. break;
  238. default:
  239. $module = '';
  240. if ($lang == 'en') {
  241. $orig_i18n = ROOT_JAWS_PATH . "include/Jaws/Resources/translates.ini";
  242. } else {
  243. $orig_i18n = ROOT_JAWS_PATH . "languages/$lang/Global.ini";
  244. }
  245. $data_i18n = ROOT_DATA_PATH . "languages/$lang/Global.ini";
  246. }
  247. $tmp_orig = array();
  248. if (file_exists($orig_i18n)) {
  249. $tmp_orig = parse_ini_file($orig_i18n, false, INI_SCANNER_RAW);
  250. $GLOBALS['log']->Log(JAWS_DEBUG, "Loaded translation for $module, language $lang");
  251. } else {
  252. $GLOBALS['log']->Log(JAWS_DEBUG, "No translation could be found for $module for language $lang");
  253. }
  254. $tmp_data = array();
  255. if ($this->_load_user_translated && Jaws_FileManagement_File::file_exists($data_i18n)) {
  256. $tmp_data = Jaws_FileManagement_File::parse_ini_file($data_i18n, false, INI_SCANNER_RAW);
  257. $GLOBALS['log']->Log(JAWS_DEBUG, "Loaded data translation for $module, language $lang");
  258. }
  259. return $this->translates[$lang][$type][strtoupper($module)] = $tmp_data + $tmp_orig;;
  260. }
  261. /**
  262. * Gets module translations
  263. *
  264. * @access public
  265. * @param string $module The translation to load
  266. * @param string $type Type of module(TRANSLATE_GLOBAL, TRANSLATE_GADGET, TRANSLATE_PLUGIN)
  267. * @param string $lang Optional language code
  268. * @return mixed
  269. */
  270. function getTranslation($module, $type = self::TRANSLATE_GLOBAL, $lang = null)
  271. {
  272. $lang = empty($lang) ? $this->_defaultLanguage : $lang;
  273. return $this->LoadTranslation($module, $type, $lang);
  274. }
  275. /**
  276. * Add a new translation statement
  277. *
  278. * @access public
  279. * @param string $module Module name
  280. * @param string $key_name Key name
  281. * @param string $key_value Key value
  282. * @param string $type Type of module(TRANSLATE_GLOBAL, TRANSLATE_GADGET, TRANSLATE_PLUGIN)
  283. * @param string $lang Optional language code
  284. * @return void
  285. */
  286. function AddTranslation($module, $key_name, $key_value, $type = self::TRANSLATE_GLOBAL, $lang = null)
  287. {
  288. $lang = empty($lang)? $this->_defaultLanguage : $lang;
  289. $this->translates[$lang][$type][strtoupper($module)][strtoupper($key_name)] = $key_value;
  290. return true;
  291. }
  292. }