/includes/runtime/LanguageHandler.php

https://bitbucket.org/thomashii/vtigercrm-6-for-postgresql · PHP · 243 lines · 148 code · 32 blank · 63 comment · 31 complexity · a3fb21a98e631163674945312a810a64 MD5 · raw file

  1. <?php
  2. /*+**********************************************************************************
  3. * The contents of this file are subject to the vtiger CRM Public License Version 1.1
  4. * ("License"); You may not use this file except in compliance with the License
  5. * The Original Code is: vtiger CRM Open Source
  6. * The Initial Developer of the Original Code is vtiger.
  7. * Portions created by vtiger are Copyright (C) vtiger.
  8. * All Rights Reserved.
  9. ************************************************************************************/
  10. /**
  11. * Class to handler language translations
  12. */
  13. class Vtiger_Language_Handler {
  14. //Contains module language translations
  15. protected static $languageContainer;
  16. /**
  17. * Functions that gets translated string
  18. * @param <String> $key - string which need to be translated
  19. * @param <String> $module - module scope in which the translation need to be check
  20. * @return <String> - translated string
  21. */
  22. public static function getTranslatedString($key, $module=''){
  23. $currentLanguage = self::getLanguage();
  24. $translatedString = self::getLanguageTranslatedString($currentLanguage, $key, $module);
  25. // label not found in users language pack, then check in the default language pack(config.inc.php)
  26. if($translatedString === null) {
  27. $defaultLanguage = vglobal('default_language');
  28. if(!empty($defaultLanguage) && strcasecmp($defaultLanguage, $currentLanguage) !== 0) {
  29. $translatedString = self::getLanguageTranslatedString($defaultLanguage, $key, $module);
  30. }
  31. }
  32. // If translation is not found then return label
  33. if($translatedString === null) {
  34. $translatedString = $key;
  35. }
  36. return $translatedString;
  37. }
  38. /**
  39. * Function returns language specific translated string
  40. * @param <String> $language - en_us etc
  41. * @param <String> $key - label
  42. * @param <String> $module - module name
  43. * @return <String> translated string or null if translation not found
  44. */
  45. public static function getLanguageTranslatedString($language, $key, $module=''){
  46. $moduleStrings = array();
  47. $module = str_replace(':', '.', $module);
  48. $moduleStrings = self::getModuleStringsFromFile($language,$module);
  49. if(!empty($moduleStrings['languageStrings'][$key])) {
  50. return $moduleStrings['languageStrings'][$key];
  51. }
  52. // Lookup for the translation in base module, in case of sub modules, before ending up with common strings
  53. if(strpos($module, '.') > 0) {
  54. $baseModule = substr($module, 0, strpos($module, '.'));
  55. if($baseModule == 'Settings') {
  56. $baseModule = 'Settings.Vtiger';
  57. }
  58. $moduleStrings = self::getModuleStringsFromFile($language,$baseModule);
  59. if(!empty($moduleStrings['languageStrings'][$key])) {
  60. return $moduleStrings['languageStrings'][$key];
  61. }
  62. }
  63. $commonStrings = self::getModuleStringsFromFile($language);
  64. if(!empty($commonStrings['languageStrings'][$key]))
  65. return $commonStrings['languageStrings'][$key];
  66. return null;
  67. }
  68. /**
  69. * Functions that gets translated string for Client side
  70. * @param <String> $key - string which need to be translated
  71. * @param <String> $module - module scope in which the translation need to be check
  72. * @return <String> - translated string
  73. */
  74. public static function getJSTranslatedString($language, $key, $module=''){
  75. $moduleStrings = array();
  76. $module = str_replace(':', '.', $module);
  77. $moduleStrings = self::getModuleStringsFromFile($language,$module);
  78. if(!empty($moduleStrings['jsLanguageStrings'][$key])) {
  79. return $moduleStrings['jsLanguageStrings'][$key];
  80. }
  81. // Lookup for the translation in base module, in case of sub modules, before ending up with common strings
  82. if(strpos($module, '.') > 0) {
  83. $baseModule = substr($module, 0, strpos($module, '.'));
  84. if($baseModule == 'Settings') {
  85. $baseModule = 'Settings.Vtiger';
  86. }
  87. $moduleStrings = self::getModuleStringsFromFile($language, $baseModule);
  88. if(!empty($moduleStrings['jsLanguageStrings'][$key])) {
  89. return $moduleStrings['jsLanguageStrings'][$key];
  90. }
  91. }
  92. $commonStrings = self::getModuleStringsFromFile($language);
  93. if(!empty($commonStrings['jsLanguageStrings'][$key]))
  94. return $commonStrings['jsLanguageStrings'][$key];
  95. return $key;
  96. }
  97. /**
  98. * Function that returns translation strings from file
  99. * @global <array> $languageStrings - language specific string which is used in translations
  100. * @param <String> $module - module Name
  101. * @return <array> - array if module has language strings else returns empty array
  102. */
  103. public static function getModuleStringsFromFile($language, $module='Vtiger'){
  104. $module = str_replace(':', '.', $module);
  105. if(empty(self::$languageContainer[$language][$module])){
  106. //Search in customized folder where the users translated string are placed
  107. $qualifiedName = 'languages.'.$language.'.custom.'.$module;
  108. $customizedLangFile = Vtiger_Loader::resolveNameToPath($qualifiedName);
  109. $qualifiedName = 'languages.'.$language.'.'.$module;
  110. $file = Vtiger_Loader::resolveNameToPath($qualifiedName);
  111. $languageStrings = $jsLanguageStrings = array();
  112. if(file_exists($file)){
  113. require $file;
  114. self::$languageContainer[$language][$module]['languageStrings'] = $languageStrings;
  115. self::$languageContainer[$language][$module]['jsLanguageStrings'] = $jsLanguageStrings;
  116. }
  117. // Override the user custom strings from the language/custom folder
  118. if(file_exists($customizedLangFile)){
  119. require $customizedLangFile;
  120. $baseModuleStrings = self::$languageContainer[$language][$module]['languageStrings'];
  121. if(!$baseModuleStrings) $baseModuleStrings = array();
  122. $languageStrings = array_merge($baseModuleStrings, $languageStrings);
  123. self::$languageContainer[$language][$module]['languageStrings'] = $languageStrings;
  124. $baseModuleJSStrings = self::$languageContainer[$language][$module]['jsLanguageStrings'];
  125. if(!$baseModuleJSStrings) $baseModuleJSStrings = array();
  126. $jsLanguageStrings = array_merge($baseModuleJSStrings, $jsLanguageStrings);
  127. self::$languageContainer[$language][$module]['jsLanguageStrings'] = $jsLanguageStrings;
  128. }
  129. }
  130. return self::$languageContainer[$language][$module];
  131. }
  132. /**
  133. * Function that returns current language
  134. * @return <String> -
  135. */
  136. public static function getLanguage() {
  137. $userModel = Users_Record_Model::getCurrentUserModel();
  138. $language = '';
  139. if (!empty($userModel)) {
  140. $language = $userModel->get('language');
  141. }
  142. return empty($language)? vglobal('default_language') : $language;
  143. }
  144. /**
  145. * Function returns module strings
  146. * @param <String> $module - module Name
  147. * @param <String> languageStrings or jsLanguageStrings
  148. * @return <Array>
  149. */
  150. public static function export($module, $type='languageStrings') {
  151. $userSelectedLanguage = self::getLanguage();
  152. $defaultLanguage = vglobal('default_language');
  153. $languages = array($userSelectedLanguage);
  154. //To merge base language and user selected language translations
  155. if($userSelectedLanguage != $defaultLanguage) {
  156. array_push($languages, $defaultLanguage);
  157. }
  158. $resultantLanguageString = array();
  159. foreach($languages as $currentLanguage) {
  160. $exportLangString = array();
  161. $moduleStrings = self::getModuleStringsFromFile($currentLanguage, $module);
  162. if(!empty($moduleStrings[$type])) {
  163. $exportLangString = $moduleStrings[$type];
  164. }
  165. // Lookup for the translation in base module, in case of sub modules, before ending up with common strings
  166. if(strpos($module, '.') > 0) {
  167. $baseModule = substr($module, 0, strpos($module, '.'));
  168. if($baseModule == 'Settings') {
  169. $baseModule = 'Settings.Vtiger';
  170. }
  171. $moduleStrings = self::getModuleStringsFromFile($currentLanguage, $baseModule);
  172. if(!empty($moduleStrings[$type])) {
  173. $exportLangString += $commonStrings[$type];
  174. }
  175. }
  176. $commonStrings = self::getModuleStringsFromFile($currentLanguage);
  177. if(!empty($commonStrings[$type])) {
  178. $exportLangString += $commonStrings[$type];
  179. }
  180. $resultantLanguageString += $exportLangString;
  181. }
  182. return $resultantLanguageString;;
  183. }
  184. /**
  185. * Function to returns all language information
  186. * @return <Array>
  187. */
  188. public static function getAllLanguages(){
  189. return Vtiger_Language::getAll();
  190. }
  191. /**
  192. * Function to get the label name of the Langauge package
  193. * @param <String> $name
  194. */
  195. public static function getLanguageLabel($name) {
  196. $db = PearDatabase::getInstance();
  197. $languageResult = $db->pquery('SELECT label FROM vtiger_language WHERE prefix = ?', array($name));
  198. if($db->num_rows($languageResult)) {
  199. return $db->query_result($languageResult, 0, 'label');
  200. }
  201. return false;
  202. }
  203. }
  204. function vtranslate($key, $moduleName='') {
  205. $args = func_get_args();
  206. return call_user_func_array(array('Vtiger_Language_Handler', 'getTranslatedString'), $args);
  207. }
  208. function vJSTranslate($key, $moduleName='') {
  209. $args = func_get_args();
  210. return call_user_func_array(array('Vtiger_Language_Handler', 'getJSTranslatedString'), $args);
  211. }