multilingual.class.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. if (!defined('IN_ONLINE')) {
  3. exit('Access Denied');
  4. }
  5. /**
  6. * Description of multilingual
  7. *
  8. * @author Administrator
  9. */
  10. class multilingual{
  11. private static $_multilingual;
  12. function __construct() {
  13. }
  14. public static function getInstance() {
  15. global $memory_limit;
  16. $memory_limit = ini_get("memory_limit");
  17. ini_set("memory_limit", '2048M');
  18. if (!self::$_multilingual) {
  19. $c = __CLASS__;
  20. self::$_multilingual = new $c;
  21. }
  22. return self::$_multilingual;
  23. }
  24. public function multilingual_config() {
  25. $operate = utils::_get('operate');
  26. $operate = strtolower($operate);
  27. /*
  28. * multilingual_load
  29. */
  30. if ($operate == "multilingual_init") {
  31. $this->_multilingual_init();
  32. }
  33. if ($operate == "multilingual_search") {
  34. $this->_multilingual_search();
  35. }
  36. /*
  37. * multilingual_save
  38. */
  39. if ($operate == "multilingual_save") {
  40. $multilingual = $_POST['multilingual_param'];
  41. $unverifiedNumber = $multilingual['unverifiedNumber'];
  42. $page = $multilingual['page'];
  43. $data = $multilingual['data'];
  44. }
  45. }
  46. private function _multilingual_init() {
  47. // 1. 获取并解析 JSON 数据
  48. $rawData = $_POST['josn_input'];
  49. $mode = $_POST['mode'];
  50. $json = json_decode($rawData, true);
  51. if (!$json) {
  52. common::echo_json_encode(500, "Invalid JSON format");
  53. exit();
  54. }
  55. // 获取控制模式,默认为 'update'
  56. $mode = empty($mode) ? 'update' : 'replace';
  57. $pageKey = isset($json['page']) ? $json['page'] : '';
  58. $unverifiedNumber = isset($json['unverifiedNumber']) ? intval($json['unverifiedNumber']) : 0;
  59. $dataList = isset($json['data']) ? $json['data'] : [];
  60. if (empty($pageKey)) {
  61. common::echo_json_encode(500, "Missing page key");
  62. exit();
  63. }
  64. // 2. 定义语言映射配置
  65. $langMap = [
  66. 'traditionalChinese' => ['name' => '繁体中文', 'code' => 'zh-TW'],
  67. 'simplifiedChinese' => ['name' => '简体中文', 'code' => 'zh-CN'],
  68. 'english' => ['name' => '英语', 'code' => 'en-US'],
  69. 'french' => ['name' => '法语', 'code' => 'fr-FR'],
  70. 'spanish' => ['name' => '西班牙语', 'code' => 'es-ES'],
  71. 'portuguese' => ['name' => '葡萄牙语', 'code' => 'pt-BR']
  72. ];
  73. // 开启事务
  74. global $db;
  75. $db->StartTrans();
  76. try {
  77. // ==========================================
  78. // 第一步:处理页面表 (kln_i18n_pages)
  79. // ==========================================
  80. $pageId = null;
  81. // 如果是覆盖模式,先删除旧页面及关联数据
  82. if ($mode === 'replace') {
  83. // 1. 先删子表 (kln_i18n_keys),防止外键报错
  84. $kikSqlDelete = "DELETE FROM kln_i18n_keys WHERE page_id IN (SELECT id FROM kln_i18n_pages WHERE page_key = '$pageKey')";
  85. $db->GetRow($kikSqlDelete) or ( (!$db->ErrorMsg()) or error_log(common::dbLog($db, $kikSqlDelete), 0));
  86. // 2. 再删主表
  87. $kipSqlDelete = "DELETE FROM kln_i18n_pages WHERE page_key = '$pageKey'";
  88. $db->GetRow($kipSqlDelete) or ( (!$db->ErrorMsg()) or error_log(common::dbLog($db, $kipSqlDelete), 0));
  89. }
  90. // 查询页面是否存在
  91. $checkPageSql = "SELECT id FROM kln_i18n_pages WHERE page_key = '$pageKey'";
  92. $checkPageRes = common::excuteObjectSql($checkPageSql);
  93. if (!empty($checkPageRes)) {
  94. // 存在 -> 更新
  95. $pageId = $checkPageRes[0]['id'];
  96. $updatePageSql = "UPDATE kln_i18n_pages SET unverified_number = $unverifiedNumber WHERE id = $pageId";
  97. common::excuteObjectSql($updatePageSql);
  98. } else {
  99. // 不存在 -> 插入
  100. $insertPageSql = "INSERT INTO kln_i18n_pages (page_key, unverified_number, description) VALUES ('$pageKey', $unverifiedNumber, '')";
  101. common::excuteObjectSql($insertPageSql);
  102. // 获取新生成的 ID (PostgreSQL 语法)
  103. $pageIdRow = common::excuteObjectSql("SELECT currval('kln_i18n_pages_id_seq')");
  104. $pageId = $pageIdRow[0]['currval'];
  105. }
  106. // ==========================================
  107. // 第二步:循环处理数据
  108. // ==========================================
  109. foreach ($dataList as $item) {
  110. $transKey = $item['key'];
  111. $originValue = isset($item['orginEnglish']) ? $item['orginEnglish'] : '';
  112. foreach ($langMap as $jsonKey => $langInfo) {
  113. // 只处理 JSON 中存在的数据
  114. if (isset($item[$jsonKey])) {
  115. $transValue = $item[$jsonKey];
  116. $statusKey = $jsonKey . 'Status';
  117. $status = isset($item[$statusKey]) ? intval($item[$statusKey]) : 0;
  118. // --- 1. 处理语言表 (kln_i18n_languages) ---
  119. $langKey = $jsonKey;
  120. $langName = $langInfo['name'];
  121. $localeCode = $langInfo['code'];
  122. // 查询语言是否存在
  123. $checkLangSql = "SELECT id FROM kln_i18n_languages WHERE lang_key = '$langKey'";
  124. $checkLangRes = common::excuteObjectSql($checkLangSql);
  125. if (!empty($checkLangRes)) {
  126. // 存在 -> 更新
  127. $langId = $checkLangRes[0]['id'];
  128. $updateLangSql = "UPDATE kln_i18n_languages SET lang_name = '$langName', locale_code = '$localeCode' WHERE id = $langId";
  129. common::excuteObjectSql($updateLangSql);
  130. } else {
  131. // 不存在 -> 插入
  132. $insertLangSql = "INSERT INTO kln_i18n_languages (lang_key, lang_name, locale_code, is_active) VALUES ('$langKey', '$langName', '$localeCode', 1)";
  133. common::excuteObjectSql($insertLangSql);
  134. // 获取 ID
  135. $langIdRow = common::excuteObjectSql("SELECT currval('kln_i18n_languages_id_seq')");
  136. $langId = $langIdRow[0]['currval'];
  137. }
  138. // --- 2. 处理词条表 (kln_i18n_keys) ---
  139. // 查询词条是否存在 (根据 page_id, lang_id, trans_key 唯一性)
  140. $checkKeySql = "SELECT id FROM kln_i18n_keys WHERE page_id = $pageId AND lang_id = $langId AND trans_key = '$transKey'";
  141. $checkKeyRes = common::excuteObjectSql($checkKeySql);
  142. if (!empty($checkKeyRes)) {
  143. // 存在 -> 更新
  144. $updateKeySql = "UPDATE kln_i18n_keys SET trans_value = '$transValue', orgin_value = '$originValue', status = $status WHERE id = " . $checkKeyRes[0]['id'];
  145. common::excuteObjectSql($updateKeySql);
  146. } else {
  147. // 不存在 -> 插入
  148. $insertKeySql = "INSERT INTO kln_i18n_keys (page_id, lang_id, trans_key, trans_value, orgin_value, status) VALUES ($pageId, $langId, '$transKey', '$transValue', '$originValue', $status)";
  149. common::excuteObjectSql($insertKeySql);
  150. }
  151. }
  152. }
  153. }
  154. // 提交事务
  155. common::excuteObjectSql("COMMIT");
  156. common::echo_json_encode(200, "Initialization successful (Mode: $mode)");
  157. } catch (Exception $e) {
  158. // 发生错误回滚
  159. common::excuteObjectSql("ROLLBACK");
  160. common::echo_json_encode(500, "Database Error: " . $e->getMessage());
  161. }
  162. exit();
  163. }
  164. private function _multilingual_search() {
  165. $page = common::check_input($_POST ['page']);
  166. $sql = "SELECT * from public.i18n_content where page = '$page'";
  167. $content = common::excuteObjectSql($sql);
  168. if(empty($content)){
  169. common::echo_json_encode(500,"Page not exist");
  170. exit();
  171. }
  172. $multilingual = array();
  173. $multilingual["unverifiedNumber"] = $content['unverifinumber'];
  174. $multilingual["page"] = $page;
  175. $multilingual["data"] = json_decode($content['content_data'],true);
  176. common::echo_json_encode(200,$multilingual);
  177. exit();
  178. }
  179. }
  180. ?>