diff --git a/addons/autolink/autolink.js b/addons/autolink/autolink.js index 59e5dc43d..5d32aadb2 100644 --- a/addons/autolink/autolink.js +++ b/addons/autolink/autolink.js @@ -1,36 +1,67 @@ +/** + * @file autolink.js + * @brief javascript code for autolink addon + * @author taggon (gonom9@gmail.com) + */ +(function($){ + var protocol_re = '(https?|ftp|news|telnet|irc)://'; + var domain_re = '(?:[\\w\\-]+\\.)+(?:[a-z]+)'; + var max_255_re = '(?:1[0-9]{2}|2[0-4][0-9]|25[0-5])'; + var ip_re = '(?:'+max_255_re+'\\.){3}'+max_255_re; + var port_re = '(?::([0-9]+))?'; + var path_re = '((?:/[\\w!"$-/:-@]+)*)'; + var hash_re = '(?:#([\\w!-@]+))?'; -jQuery(function($) { - var url_regx = /((http|https|ftp|news|telnet|irc):\/\/(([0-9a-z\-._~!$&'\(\)*+,;=:]|(%[0-9a-f]{2}))*\@)?((\[(((([0-9a-f]{1,4}:){6}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|(::([0-9a-f]{1,4}:){5}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|(([0-9a-f]{1,4})?::([0-9a-f]{1,4}:){4}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:)?[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){3}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:){2}([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::([0-9a-f]{1,4}:[0-9a-f]{1,4})|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])))|((([0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4})|((([0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::))|(v[0-9a-f]+.[0-9a-z\-._~!$&'\(\)*+,;=:]+))\])|(([0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])){3}[0-9]|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))|(([0-9a-z\-._~!$&'\(\)*+,;=]|(%[0-9a-f]{2}))+))(:[0-9]*)?(\/([0-9a-z\-._~!$&'\(\)*+,;=:@]|(%[0-9a-f]{2}))*)*(\?([0-9a-z\-._~!$&'\(\)*+,;=:@\/\?]|(%[0-9a-f]{2}))*)?(#([0-9a-z\-._~!$&'\(\)*+,;=:@\/\?]|(%[0-9a-f]{2}))*)?)/i; + var url_regex = new RegExp('('+protocol_re+'('+domain_re+'|'+ip_re+')'+port_re+path_re+hash_re+')', 'ig'); - function replaceHrefLink(obj) { - var obj_list = obj.childNodes; + var AutoLink = xe.createPlugin("autolink", { + targets : [], + init : function() { + this.targets = []; + }, + API_ONREADY : function() { + var thisPlugin = this; - for(var i = 0; i < obj_list.length; ++i) { - var obj = obj_list[i]; - var pObj = obj.parentNode; - if(!pObj) continue; + // extract target text nodes + this.extractTargets($('.xe_content')); - var pN = pObj.nodeName.toLowerCase(); - if($.inArray(pN, ['a', 'pre', 'xml', 'textarea', 'input', 'select', 'option', 'code', 'script', 'style']) != -1) continue; + $(this.targets).each(function(){ + thisPlugin.cast('AUTOLINK', [this]); + }); + }, + API_AUTOLINK : function(oSender, params) { + var textNode = params[0]; + var content = textNode.nodeValue; + var dummy = $(''); - if(obj.nodeType == 3 && obj.length >= 10) { - var content = obj.nodeValue; - if(!/(http|https|ftp|news|telnet|irc):\/\//i.test(content)) continue; + content = content.replace(//g, '>'); + content = content.replace(url_regex, '$1'); - content = content.replace(//g, '>'); - content = content.replace(url_regx, '$1'); + $(textNode).before(dummy); + $(textNode).replaceWith(content); + params[0] = dummy.next('a'); + dummy.remove(); + }, + extractTargets : function(obj) { + var thisPlugin = this; - $(obj).replaceWith(content); - delete(content); + $(obj) + .contents() + .each(function(){ + // FIX ME : When this meanless code wasn't executed, url_regex do not run correctly. why? + url_regex.exec(''); - } else if(obj.nodeType == 1 && obj.childNodes.length) { - replaceHrefLink(obj); - } - } - } + if (!$(this).is('a,pre,xml,code,script,style,:input')) { + if (this.nodeType == 3 && url_regex.test(this.nodeValue)) { // text node + thisPlugin.targets.push(this); + } else { + + thisPlugin.extractTargets(this); + } + } + }); + } + }); - $('.xe_content').each(function() { - replaceHrefLink(this); - }); -}); + xe.registerPlugin(new AutoLink()); +})(jQuery); \ No newline at end of file diff --git a/addons/autolink/autolink.spec.html b/addons/autolink/autolink.spec.html new file mode 100644 index 000000000..f9fe19b16 --- /dev/null +++ b/addons/autolink/autolink.spec.html @@ -0,0 +1,103 @@ + + + + +Autolink Addon Unit Test + + + + + + + + + + + + + \ No newline at end of file diff --git a/addons/blogapi/blogapi.addon.php b/addons/blogapi/blogapi.addon.php index c87c407a3..57fa31277 100644 --- a/addons/blogapi/blogapi.addon.php +++ b/addons/blogapi/blogapi.addon.php @@ -22,16 +22,6 @@ // act가 api가 아니면 그냥 리턴~ if($_REQUEST['act']!='api') return; - /** - * blogapi의 경우 GET argument와 XML Content가 같이 오기에 XE의 경우 XML Content가 오면 이것만 처리하기에 - * GET argument중에 mid값을 강제 설정해야 모듈을 정상적으로 찾는다 - **/ - if($called_position == 'before_module_init') { - $mid = $_REQUEST['mid']; - Context::set('mid', $mid, true); - $this->mid = $mid; - } - // 관련 func 파일 읽음 require_once('./addons/blogapi/blogapi.func.php'); @@ -88,7 +78,7 @@ switch($method_name) { // 블로그 정보 case 'blogger.getUsersBlogs' : - $obj->url = Context::getRequestUri().$this->mid; + $obj->url = getFullSiteUrl(''); $obj->blogid = $this->mid; $obj->blogName = $this->module_info->browser_title; $blog_list = array($obj); @@ -162,7 +152,6 @@ if(!$document_srl) { printContent( getXmlRpcFailure(1, 'no permission') ); } else { - $oDocumentModel = &getModel('document'); $oDocument = $oDocumentModel->getDocument($document_srl); if(!$oDocument->isExists() || !$oDocument->isGranted()) { @@ -198,8 +187,8 @@ '', $category, date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()), - $oDocument->getContent(false), - $oDocument->getPermanentUrl(), + $oDocument->getContent(false, false, true,false), + getFullUrl('','document_srl', $oDocument->document_srl), $oDocument->document_srl, $oDocument->getTitleText() ); @@ -264,7 +253,7 @@ } } - $obj->content = str_replace($uploaded_target_path,sprintf('./files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); + $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); $oDocumentController = &getController('document'); $obj->allow_comment = 'Y'; @@ -275,7 +264,7 @@ $content = getXmlRpcFailure(1, $output->getMessage()); } else { //$content = getXmlRpcResponse(Context::getRequestUri().$this->mid.'/'.$document_srl); - $content = getXmlRpcResponse(''.$document_srl); + $content = getXmlRpcResponse($document_srl); } FileHandler::removeDir($tmp_uploaded_path); @@ -364,7 +353,8 @@ $obj->uploaded_count += $file_count; } } - $obj->content = str_replace($uploaded_target_path,sprintf('./files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); + + $obj->content = str_replace($uploaded_target_path,sprintf('/files/attach/images/%s/%s%s', $this->module_srl, getNumberingPath($document_srl,3), $filename), $obj->content); $oDocumentController = &getController('document'); $output = $oDocumentController->updateDocument($oDocument,$obj); @@ -372,7 +362,7 @@ if(!$output->toBool()) { $content = getXmlRpcFailure(1, $output->getMessage()); } else { - $content = getXmlRpcResponse(Context::getRequestUri().$this->mid.'/'.$document_srl); + $content = getXmlRpcResponse(getFullUrl('','document_srl',$document_srl)); FileHandler::removeDir($tmp_uploaded_path); } @@ -389,16 +379,22 @@ $oDocumentModel = &getModel('document'); $oDocument = $oDocumentModel->getDocument($document_srl); + // 글 존재 + if(!$oDocument->isExists()) { + $content = getXmlRpcFailure(1, 'not exists'); + // 글 삭제 권한 체크 - if(!$oDocument->isGranted()) { + } elseif(!$oDocument->isGranted()) { $content = getXmlRpcFailure(1, 'no permission'); break; - } - $oDocumentController = &getController('document'); - $output = $oDocumentController->deleteDocument($document_srl); - if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage()); - else $content = getXmlRpcResponse(true); + // 삭제 + } else { + $oDocumentController = &getController('document'); + $output = $oDocumentController->deleteDocument($document_srl); + if(!$output->toBool()) $content = getXmlRpcFailure(1, $output->getMessage()); + else $content = getXmlRpcResponse(true); + } printContent($content); break; @@ -423,22 +419,16 @@ $posts = array(); foreach($output->data as $key => $oDocument) { $post = null; - $post->link = $post->permaLink = getUrl('','mid',$this->mid,'document_srl',$oDocument->document_srl); + $post->categories = array(); + $post->dateCreated = date("Ymd", $oDocument->getRegdateTime()).'T'.date("H:i:s", $oDocument->getRegdateTime()); + $post->description = htmlspecialchars($oEditorController->transComponent($oDocument->getContent(false,false,true,false))); + $post->link = $post->permaLink = getFullUrl('','document_srl',$oDocument->document_srl); + $post->postid = $oDocument->document_srl; + $post->title = htmlspecialchars($oDocument->get('title')); + $post->publish = 1; $post->userid = $oDocument->get('user_id'); $post->mt_allow_pings = 0; $post->mt_allow_comments = $oDocument->allowComment()=='Y'?1:0; - $post->description = htmlspecialchars($oEditorController->transComponent($oDocument->get('content'))); - $post->postid = $oDocument->document_srl; - $post->title = htmlspecialchars($oDocument->get('title')); - - $year = substr($oDocument->get('regdate'),0,4); - $month = substr($oDocument->get('regdate'),4,2); - $day = substr($oDocument->get('regdate'),6,2); - $hour = substr($oDocument->get('regdate'),8,2); - $min = substr($oDocument->get('regdate'),10,2); - $sec = substr($oDocument->get('regdate'),12,2); - $time = mktime($hour,$min,$sec,$month,$day,$year); - $post->dateCreated = gmdate("D, d M Y H:i:s", $time); $posts[] = $post; } $content = getXmlRpcResponse($posts); @@ -456,7 +446,7 @@ XpressEngine - http://www.zeroboard.com/ + http://www.xpressengine.com/ {$homepagelink} diff --git a/addons/blogapi/blogapi.func.php b/addons/blogapi/blogapi.func.php index b3e2503c2..65630f78e 100644 --- a/addons/blogapi/blogapi.func.php +++ b/addons/blogapi/blogapi.func.php @@ -29,6 +29,7 @@ // 인코딩 처리 function _getEncodedVal($val, $is_sub_set = false) { if(is_int($val)) $buff = sprintf("%d", $val); + elseif(is_string($val)&&preg_match('/^([0-9]+)T([0-9\:]+)$/', $val)) $buff = sprintf("%s\n", $val); elseif(is_double($val)) $buff = sprintf("%f", $val); elseif(is_bool($val)) $buff = sprintf("%d", $val?1:0); elseif(is_object($val)) { diff --git a/addons/captcha/conf/info.xml b/addons/captcha/conf/info.xml index 181f46bdb..3ece27bcf 100644 --- a/addons/captcha/conf/info.xml +++ b/addons/captcha/conf/info.xml @@ -2,7 +2,7 @@ Captcha 애드온 CAPTCHA addon - Captcha Addon + Captcha Addon 验证码插件 Captchaアドオン 圖形驗證 @@ -20,7 +20,7 @@ 为了解决互联网垃圾而开发的验证码机制。 - 非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。 + 非登录用户发布话题或评论时将会弹出验证图片选择框,选择正确的图片才可以正常发布(适用于版面/issueTracker)。 ボット(bot)がプログラムによるスパム行為を防ぐために、掲示板/issueTrackerで書き込み・コメントを登録する際、ランダムな文字や数字の列を画面に表示し、表示されたものと一致した情報を入力した時、登録が出来るようにするアドオンです。 @@ -34,132 +34,132 @@ zero - zero - zero + zero + zero zero - zero + zero zero Captcha 표시 대상 + 应用对象 + Captchaを表示する対象 + 選擇目標 Captcha Target Mục tiêu Captcha hiển thị - 应用对象 - Captchaを表示する対象 - 選擇目標 글/댓글 등록시 captcha가 동작할 대상을 정할 수 있습니다. 관리자는 무조건 제외됩니다 + 可以指定验证码应用对象(管理员除外)。 + 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。 + 除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。 You may specify targets CAPTCHA work. It's not applied when administrator writes. Khi gửi bài, bình luận, Capcha sẽ hiển thị để xác nhận hành động của người sử dụng. Chức năng này không hoạt động với người quản lý. - 可以指定验证码应用对象(管理员除外)。 - 管理者を除き、書き込み・コメントを入力する際にcaptchaイメージを見せる対象を設定します。 - 除了管理員,在發表主題或評論時,設定圖形驗證應用的對象。 로그인하지 않은 사용자 + 非登录用户 + ログインしてないユーザー + 非用戶 Not logged-in users Người dùng chưa đăng nhập - 非登录用户 - ログインしてないユーザー - 非用戶 모든 사용자 + 所有用户 + すべてのユーザー + 所有用戶 All users Tất cả mọi người - 所有用户 - すべてのユーザー - 所有用戶 동작 방식 + 验证方式 + 動作方式 + 行為模式 How it works Sử dụng - 验证方式 - 動作方式 - 行為模式 "1번만 동작"을 선택하시면 1번만 동작후 상태를 저장해서 다음부터 물어보지 않고 그렇지 않으면 매번 물어보게 됩니다 + "一次"就是每个IP只出现一次验证。 + 「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。 + 選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。 If you choose "Once", CAPTCHA works only once for the user by storing status. Otherwise, this addon would show an image every time the user writes. Nếu chọn "Chỉ một lần" thì sau lần hiển thị đó Capcha sẽ không hiển thị với người sử dụng đó nữa. - "一次"就是每个IP只出现一次验证。 - 「1回だけ表示」を選択すると、最初だけ動作した後、その情報を記憶して次回からはCaptchaを見せないようにします。また、もう一つのオプションは毎回Captchaを表示します。 - 選擇"單次",產生第一次動作後,下次不會再顯示;選擇"每次"則會一直顯示。 1번만 동작 + 一次 + 1回だけ表示 + 單次 Chỉ một lần once - 一次 - 1回だけ表示 - 單次 매번 동작 + 每次 + 毎回表示 + 每次 every time Luôn sử dụng - 每次 - 毎回表示 - 每次 비밀번호 찾기 적용 + 应用到查找密码功能 + 비밀번호 찾기 적용 + 비밀번호 찾기 적용 applying to an action finding account Khi lấy lại mật khẩu - 비밀번호 찾기 적용 - 비밀번호 찾기 적용 - 비밀번호 찾기 적용 적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + 启用此项功能可以有效地拦截以查找密码名义发送的垃圾邮件。 + 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. If you set this option as apply, CAPTCHA will work for finding account action, too. Nếu áp dụng, khi thành viên cần lấy lại mật khẩu khi lỡ quên, Capcha sẽ hiện thị để xác nhận việc này. - 적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - 적용으로 하시면 비밀번호 찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - 적용으로 하시면 비밀번호찾기 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. 적용하지 않음 + 不启用 + 적용하지 않음 + 적용하지 않음 Not apply Không áp dụng - 적용하지 않음 - 적용하지 않음 - 적용하지 않음 적용 + 启用 + 적용 + 적용 Apply Áp dụng - 적용 - 적용 - 적용 인증 메일 재발송 적용 + 应用到认证邮件重新发送功能 + 인증 메일 재발송 적용 + 인증 메일 재발송 적용 apply to an action resending authmail Khi lấy lại mã kích hoạt - 인증 메일 재발송 적용 - 인증 메일 재발송 적용 - 인증 메일 재발송 적용 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + 启用此项功能可以有效地拦截以重新发送认证邮件名义发送的垃圾邮件。 + 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. + 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. If you set this option as apply, CAPTCHA will work for resending authmail action, too. Nếu áp dụng, khi thành viên cần lấy lại mã kích hoạt thành viên, Capcha sẽ hiện thị để xác nhận việc này. - 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. - 적용으로 하시면 인증 메일 재발송 기능에도 적용되어 악의적인 봇(또는 프로그램)에 의한 메일 발송을 막을 수 있습니다. 적용하지 않음 + 不启用 + 적용하지 않음 + 적용하지 않음 Not apply Không áp dụng - 적용하지 않음 - 적용하지 않음 - 적용하지 않음 적용 + 启用 + 적용 + 적용 Apply Áp dụng - 적용 - 적용 - 적용 diff --git a/addons/mobile/conf/info.xml b/addons/mobile/conf/info.xml index d97cbe787..ac7b1bb37 100644 --- a/addons/mobile/conf/info.xml +++ b/addons/mobile/conf/info.xml @@ -45,7 +45,7 @@ misol - misol + misol misol misol misol diff --git a/addons/smartphone/conf/info.xml b/addons/smartphone/conf/info.xml index 5825baba0..3c16e2adf 100644 --- a/addons/smartphone/conf/info.xml +++ b/addons/smartphone/conf/info.xml @@ -1,16 +1,20 @@ SmartPhone XE 애드온 - SmartPhone XE + SmartPhone XE + 智能手机XE插件 SmartPhone XE SmartPhone XE SmartPhone XE アドオン IPhone (touch) 등, smartphone 에서 접속시 최적화된 화면을 보여줍니다. - + This addon displays the best screen for users who use smartphones like IPhone (touch). + + 用于IPhone(touch)等智能手机访问时的界面优化。 + Addon này sẽ hiển thị Website trên màn hình iPhone một cách tốt nhất khi người dùng sử dụng SmartPhone để truy cập (iPhone cảm ứng) @@ -24,7 +28,8 @@ 2009-04-20 haneul - haneul + haneul + haneul haneul haneul haneul diff --git a/classes/context/Context.class.php b/classes/context/Context.class.php index c50f0be2b..075199de2 100644 --- a/classes/context/Context.class.php +++ b/classes/context/Context.class.php @@ -163,6 +163,7 @@ $this->addJsFile("./common/js/jquery.js"); $this->addJsFile("./common/js/x.js"); $this->addJsFile("./common/js/common.js"); + $this->addJsFile("./common/js/js_app.js"); $this->addJsFile("./common/js/xml_handler.js"); $this->addJsFile("./common/js/xml_js_filter.js"); $this->addCSSFile("./common/css/default.css"); @@ -646,11 +647,10 @@ * @brief GET/POST방식일 경우 처리 **/ function _setRequestArgument() { - if($this->_getRequestMethod() == 'XMLRPC' || $this->_getRequestMethod() == 'JSON') return; if(!count($_REQUEST)) return; foreach($_REQUEST as $key => $val) { - if($val === "") continue; + if($val === "" || Context::get($key)) continue; $val = $this->_filterRequestVar($key, $val); if($this->_getRequestMethod()=='GET'&&isset($_GET[$key])) $set_to_vars = true; elseif($this->_getRequestMethod()=='POST'&&isset($_POST[$key])) $set_to_vars = true; @@ -834,7 +834,7 @@ $val = trim($args_list[$i+1]); // 값이 없으면 GET변수에서 해당 키를 제거 - if(!isset($val)) { + if(!isset($val) || strlen($val)<1) { unset($get_vars[$key]); continue; } @@ -847,12 +847,6 @@ if($vid) $get_vars['vid'] = $vid; else unset($get_vars['vid']); - if(count($get_vars)) { - foreach($get_vars as $key => $val) { - if(!trim($val)) unset($get_vars[$key]); - } - } - // action명이 변경되었던 것에 대해 호환성을 유지하기 위한 강제 값 변경 switch($get_vars['act']) { case 'dispMemberFriend' : $get_vars['act'] = 'dispCommunicationFriend'; break; @@ -936,9 +930,11 @@ if(isset($url[$ssl_mode][$domain_key])) return $url[$ssl_mode][$domain_key]; + $current_use_ssl = $_SERVER['HTTPS']=='on' ? true : false; + switch($ssl_mode) { case FOLLOW_REQUEST_SSL : - if($_SERVER['HTTPS']=='on') $use_ssl = true; + if($current_use_ssl) $use_ssl = true; else $use_ssl = false; break; case ENFORCE_SSL : @@ -957,11 +953,17 @@ } $url_info = parse_url('http://'.$target_url); + + if($current_use_ssl != $use_ssl) + { + unset($url_info['port']); + } + if($use_ssl) { if(Context::get("_https_port") && Context::get("_https_port") != 443) { $url_info['port'] = Context::get("_https_port"); } - else + elseif($url_info['port']==443) { unset($url_info['port']); } diff --git a/classes/db/DB.class.php b/classes/db/DB.class.php index 3640eee06..9ad440626 100644 --- a/classes/db/DB.class.php +++ b/classes/db/DB.class.php @@ -226,6 +226,7 @@ * @return object of error **/ function getError() { + $this->errstr = Context::convertEncodingStr($this->errstr); return new Object($this->errno, $this->errstr); } @@ -326,7 +327,7 @@ break; } - if($this->errno != 0 ) $output = new Object($this->errno, $this->errstr); + if($this->isError()) $output = $this->getError(); else if(!is_a($output, 'Object') && !is_subclass_of($output, 'Object')) $output = new Object(); $output->add('_query', $this->query); $output->add('_elapsed_time', sprintf("%0.5f", $this->elapsed_time)); diff --git a/classes/db/DBCubrid.class.php b/classes/db/DBCubrid.class.php index 14189cad3..803f7195c 100644 --- a/classes/db/DBCubrid.class.php +++ b/classes/db/DBCubrid.class.php @@ -87,6 +87,7 @@ } $this->is_connected = true; + $this->password = md5($this->password); } /** @@ -618,7 +619,7 @@ $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); if (count ($output->groups)) { - foreach ($output->groups as &$value) { + foreach ($output->groups as $key => $value) { if (strpos ($value, '.')) { $tmp = explode ('.', $value); $tmp[0] = sprintf ('"%s"', $tmp[0]); @@ -627,6 +628,7 @@ } elseif (strpos ($value, '(')) $value = $value; else $value = sprintf ('"%s"', $value); + $output->groups[$key] = $value; } $query .= sprintf(' group by %s', implode(',',$output->groups)); } @@ -798,7 +800,7 @@ $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition); if (count ($output->groups)) { - foreach ($output->groups as &$value) { + foreach ($output->groups as $key => $value) { if (strpos ($value, '.')) { $tmp = explode ('.', $value); $tmp[0] = sprintf ('"%s"', $tmp[0]); @@ -807,6 +809,7 @@ } elseif (strpos ($value, '(')) $value = $value; else $value = sprintf ('"%s"', $value); + $output->groups[$key] = $value; } $query .= sprintf(' group by %s', implode(',',$output->groups)); } diff --git a/classes/db/DBFirebird.class.php b/classes/db/DBFirebird.class.php index 462ec175b..7f8a475b7 100644 --- a/classes/db/DBFirebird.class.php +++ b/classes/db/DBFirebird.class.php @@ -112,6 +112,7 @@ // 접속체크 $this->is_connected = true; + $this->password = md5($this->password); } /** diff --git a/classes/db/DBMssql.class.php b/classes/db/DBMssql.class.php index c42078980..17a442686 100644 --- a/classes/db/DBMssql.class.php +++ b/classes/db/DBMssql.class.php @@ -83,6 +83,7 @@ // 접속체크 if($this->conn){ $this->is_connected = true; + $this->password = md5($this->password); }else{ $this->is_connected = false; } diff --git a/classes/db/DBMysql.class.php b/classes/db/DBMysql.class.php index 572cdc024..394001050 100644 --- a/classes/db/DBMysql.class.php +++ b/classes/db/DBMysql.class.php @@ -97,6 +97,7 @@ // 접속체크 $this->is_connected = true; + $this->password = md5($this->password); // mysql의 경우 utf8임을 지정 $this->_query("set names 'utf8'"); diff --git a/classes/db/DBMysql_innodb.class.php b/classes/db/DBMysql_innodb.class.php index 62ef273d3..dcef02b3b 100644 --- a/classes/db/DBMysql_innodb.class.php +++ b/classes/db/DBMysql_innodb.class.php @@ -97,6 +97,7 @@ // 접속체크 $this->is_connected = true; + $this->password = md5($this->password); // mysql의 경우 utf8임을 지정 $this->_query("set names 'utf8'"); diff --git a/classes/db/DBMysqli.class.php b/classes/db/DBMysqli.class.php new file mode 100644 index 000000000..826ddd103 --- /dev/null +++ b/classes/db/DBMysqli.class.php @@ -0,0 +1,674 @@ + 'bigint', + 'number' => 'bigint', + 'varchar' => 'varchar', + 'char' => 'char', + 'text' => 'text', + 'bigtext' => 'longtext', + 'date' => 'varchar(14)', + 'float' => 'float', + ); + + /** + * @brief constructor + **/ + function DBMysqli() { + $this->_setDBInfo(); + $this->_connect(); + } + + /** + * @brief 설치 가능 여부를 return + **/ + function isSupported() { + if(!function_exists('mysqli_connect')) return false; + return true; + } + + /** + * @brief DB정보 설정 및 connect/ close + **/ + function _setDBInfo() { + $db_info = Context::getDBInfo(); + $this->hostname = $db_info->db_hostname; + $this->port = $db_info->db_port; + $this->userid = $db_info->db_userid; + $this->password = $db_info->db_password; + $this->database = $db_info->db_database; + $this->prefix = $db_info->db_table_prefix; + if(!substr($this->prefix,-1)!='_') $this->prefix .= '_'; + } + + /** + * @brief DB 접속 + **/ + function _connect() { + // db 정보가 없으면 무시 + if(!$this->hostname || !$this->userid || !$this->password || !$this->database) return; + + // 접속시도 + if($this->port){ + $this->fd = mysqli_connect($this->hostname, $this->userid, $this->password, $this->database, $this->port); + }else{ + $this->fd = mysqli_connect($this->hostname, $this->userid, $this->password, $this->database); + } + $error = mysqli_connect_errno(); + if($error) { + $this->setError($error); + return; + } + mysqli_set_charset($this->fd,'utf8'); + + // 접속체크 + $this->is_connected = true; + $this->password = md5($this->password); + } + + /** + * @brief DB접속 해제 + **/ + function close() { + if(!$this->isConnected()) return; + mysqli_close($this->fd); + } + + /** + * @brief 쿼리에서 입력되는 문자열 변수들의 quotation 조절 + **/ + function addQuotes($string) { + if(version_compare(PHP_VERSION, "5.9.0", "<") && get_magic_quotes_gpc()) $string = stripslashes(str_replace("\\","\\\\",$string)); + if(!is_numeric($string)) $string = mysqli_escape_string($this->fd,$string); + return $string; + } + + /** + * @brief 트랜잭션 시작 + **/ + function begin() { + } + + /** + * @brief 롤백 + **/ + function rollback() { + } + + /** + * @brief 커밋 + **/ + function commit() { + } + + /** + * @brief : 쿼리문의 실행 및 결과의 fetch 처리 + * + * query : query문 실행하고 result return\n + * fetch : reutrn 된 값이 없으면 NULL\n + * rows이면 array object\n + * row이면 object\n + * return\n + **/ + function _query($query) { + if(!$this->isConnected()) return; + + // 쿼리 시작을 알림 + $this->actStart($query); + + // 쿼리 문 실행 + $result = mysqli_query($this->fd,$query); + + // 오류 체크 + $error = mysqli_error($this->fd); + if($error) $this->setError(mysqli_errno($this->fd), $error); + + // 쿼리 실행 종료를 알림 + $this->actFinish(); + + // 결과 리턴 + return $result; + } + + /** + * @brief 결과를 fetch + **/ + function _fetch($result) { + if(!$this->isConnected() || $this->isError() || !$result) return; + while($tmp = mysqli_fetch_object($result)) { + $output[] = $tmp; + } + if(count($output)==1) return $output[0]; + return $output; + } + + /** + * @brief 1씩 증가되는 sequence값을 return (mysql의 auto_increment는 sequence테이블에서만 사용) + **/ + function getNextSequence() { + $query = sprintf("insert into `%ssequence` (seq) values ('0')", $this->prefix); + $this->_query($query); + $sequence = mysqli_insert_id($this->fd); + if($sequence % 10000 == 0) { + $query = sprintf("delete from `%ssequence` where seq < %d", $this->prefix, $sequence); + $this->_query($query); + } + + return $sequence; + } + + /** + * @brief mysql old password를 가져오는 함수 (mysql에서만 사용) + **/ + function isValidOldPassword($password, $saved_password) { + $query = sprintf("select password('%s') as password, old_password('%s') as old_password", $this->addQuotes($password), $this->addQuotes($password)); + $result = $this->_query($query); + $tmp = $this->_fetch($result); + if($tmp->password == $saved_password || $tmp->old_password == $saved_password) return true; + return false; + } + + /** + * @brief 테이블 기생성 여부 return + **/ + function isTableExists($target_name) { + $query = sprintf("show tables like '%s%s'", $this->prefix, $this->addQuotes($target_name)); + $result = $this->_query($query); + $tmp = $this->_fetch($result); + if(!$tmp) return false; + return true; + } + + /** + * @brief 특정 테이블에 특정 column 추가 + **/ + function addColumn($table_name, $column_name, $type='number', $size='', $default = '', $notnull=false) { + $type = $this->column_type[$type]; + if(strtoupper($type)=='INTEGER') $size = ''; + + $query = sprintf("alter table %s%s add %s ", $this->prefix, $table_name, $column_name); + if($size) $query .= sprintf(" %s(%s) ", $type, $size); + else $query .= sprintf(" %s ", $type); + if($default) $query .= sprintf(" default '%s' ", $default); + if($notnull) $query .= " not null "; + + $this->_query($query); + } + + /** + * @brief 특정 테이블에 특정 column 제거 + **/ + function dropColumn($table_name, $column_name) { + $query = sprintf("alter table %s%s drop %s ", $this->prefix, $table_name, $column_name); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 column의 정보를 return + **/ + function isColumnExists($table_name, $column_name) { + $query = sprintf("show fields from %s%s", $this->prefix, $table_name); + $result = $this->_query($query); + if($this->isError()) return; + $output = $this->_fetch($result); + if($output) { + $column_name = strtolower($column_name); + foreach($output as $key => $val) { + $name = strtolower($val->Field); + if($column_name == $name) return true; + } + } + return false; + } + + /** + * @brief 특정 테이블에 특정 인덱스 추가 + * $target_columns = array(col1, col2) + * $is_unique? unique : none + **/ + function addIndex($table_name, $index_name, $target_columns, $is_unique = false) { + if(!is_array($target_columns)) $target_columns = array($target_columns); + + $query = sprintf("alter table %s%s add %s index %s (%s);", $this->prefix, $table_name, $is_unique?'unique':'', $index_name, implode(',',$target_columns)); + $this->_query($query); + } + + /** + * @brief 특정 테이블의 특정 인덱스 삭제 + **/ + function dropIndex($table_name, $index_name, $is_unique = false) { + $query = sprintf("alter table %s%s drop index %s;", $this->prefix, $table_name, $index_name); + $this->_query($query); + } + + + /** + * @brief 특정 테이블의 index 정보를 return + **/ + function isIndexExists($table_name, $index_name) { + //$query = sprintf("show indexes from %s%s where key_name = '%s' ", $this->prefix, $table_name, $index_name); + $query = sprintf("show indexes from %s%s", $this->prefix, $table_name); + $result = $this->_query($query); + if($this->isError()) return; + $output = $this->_fetch($result); + if(!$output) return; + if(!is_array($output)) $output = array($output); + + for($i=0;$iKey_name == $index_name) return true; + } + return false; + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXml($xml_doc) { + return $this->_createTable($xml_doc); + } + + /** + * @brief xml 을 받아서 테이블을 생성 + **/ + function createTableByXmlFile($file_name) { + if(!file_exists($file_name)) return; + // xml 파일을 읽음 + $buff = FileHandler::readFile($file_name); + return $this->_createTable($buff); + } + + /** + * @brief schema xml을 이용하여 create table query생성 + * + * type : number, varchar, text, char, date, \n + * opt : notnull, default, size\n + * index : primary key, index, unique\n + **/ + function _createTable($xml_doc) { + // xml parsing + $oXml = new XmlParser(); + $xml_obj = $oXml->parse($xml_doc); + + // 테이블 생성 schema 작성 + $table_name = $xml_obj->table->attrs->name; + if($this->isTableExists($table_name)) return; + $table_name = $this->prefix.$table_name; + + if(!is_array($xml_obj->table->column)) $columns[] = $xml_obj->table->column; + else $columns = $xml_obj->table->column; + + foreach($columns as $column) { + $name = $column->attrs->name; + $type = $column->attrs->type; + $size = $column->attrs->size; + $notnull = $column->attrs->notnull; + $primary_key = $column->attrs->primary_key; + $index = $column->attrs->index; + $unique = $column->attrs->unique; + $default = $column->attrs->default; + $auto_increment = $column->attrs->auto_increment; + + $column_schema[] = sprintf('`%s` %s%s %s %s %s', + $name, + $this->column_type[$type], + $size?'('.$size.')':'', + $default?"default '".$default."'":'', + $notnull?'not null':'', + $auto_increment?'auto_increment':'' + ); + + if($primary_key) $primary_list[] = $name; + else if($unique) $unique_list[$unique][] = $name; + else if($index) $index_list[$index][] = $name; + } + + if(count($primary_list)) { + $column_schema[] = sprintf("primary key (%s)", '`'.implode($primary_list,'`,`').'`'); + } + + if(count($unique_list)) { + foreach($unique_list as $key => $val) { + $column_schema[] = sprintf("unique %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + if(count($index_list)) { + foreach($index_list as $key => $val) { + $column_schema[] = sprintf("index %s (%s)", $key, '`'.implode($val,'`,`').'`'); + } + } + + $schema = sprintf('create table `%s` (%s%s) %s;', $this->addQuotes($table_name), "\n", implode($column_schema,",\n"), "ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci"); + + $output = $this->_query($schema); + if(!$output) return false; + } + + /** + * @brief 조건문 작성하여 return + **/ + function getCondition($output) { + if(!$output->conditions) return; + $condition = $this->_getCondition($output->conditions,$output->column_type); + if($condition) $condition = ' where '.$condition; + return $condition; + } + + function getLeftCondition($conditions,$column_type){ + return $this->_getCondition($conditions,$column_type); + } + + + function _getCondition($conditions,$column_type) { + $condition = ''; + foreach($conditions as $val) { + $sub_condition = ''; + foreach($val['condition'] as $v) { + if(!isset($v['value'])) continue; + if($v['value'] === '') continue; + if(!in_array(gettype($v['value']), array('string', 'integer'))) continue; + + $name = $v['column']; + $operation = $v['operation']; + $value = $v['value']; + $type = $this->getColumnType($column_type,$name); + $pipe = $v['pipe']; + $value = $this->getConditionValue($name, $value, $operation, $type, $column_type); + if(!$value) $value = $v['value']; + $str = $this->getConditionPart($name, $value, $operation); + if($sub_condition) $sub_condition .= ' '.$pipe.' '; + $sub_condition .= $str; + } + if($sub_condition) { + if($condition && $val['pipe']) $condition .= ' '.$val['pipe'].' '; + $condition .= '('.$sub_condition.')'; + } + } + return $condition; + } + + /** + * @brief insertAct 처리 + **/ + function _executeInsertAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$val.'`'; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + $name = $val['name']; + $value = $val['value']; + + $value_list = array(); + if($output->column_type[$name]!='number') { + $value = "'".$this->addQuotes($value)."'"; + if(!$value) $value = 'null'; + } elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = '`'.$name.'`'; + $value_list[] = $value; + } + + $query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list)); + + return $this->_query($query); + } + + /** + * @brief updateAct 처리 + **/ + function _executeUpdateAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$val.'` as '.$key; + } + + // 컬럼 정리 + foreach($output->columns as $key => $val) { + if(!isset($val['value'])) continue; + $name = $val['name']; + $value = $val['value']; + if(strpos($name,'.')!==false&&strpos($value,'.')!==false) $column_list[] = $name.' = '.$value; + else { + if($output->column_type[$name]!='number') $value = "'".$this->addQuotes($value)."'"; + elseif(!$value || is_numeric($value)) $value = (int)$value; + + $column_list[] = sprintf("`%s` = %s", $name, $value); + } + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition); + + return $this->_query($query); + } + + /** + * @brief deleteAct 처리 + **/ + function _executeDeleteAct($output) { + // 테이블 정리 + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$val.'`'; + } + + // 조건절 정리 + $condition = $this->getCondition($output); + + $query = sprintf("delete from %s %s", implode(',',$table_list), $condition); + + return $this->_query($query); + } + + /** + * @brief selectAct 처리 + * + * select의 경우 특정 페이지의 목록을 가져오는 것을 편하게 하기 위해\n + * navigation이라는 method를 제공 + **/ + function _executeSelectAct($output) { + // 테이블 정리 + $table_list = array(); + foreach($output->tables as $key => $val) { + $table_list[] = '`'.$this->prefix.$val.'` as '.$key; + } + + $left_join = array(); + // why??? + $left_tables= (array)$output->left_tables; + foreach($left_tables as $key => $val) { + $condition = $this->_getCondition($output->left_conditions[$key],$output->column_type); + if($condition){ + $left_join[] = $val . ' `'.$this->prefix.$output->_tables[$key].'` as '.$key . ' on (' . $condition . ')'; + } + } + + $click_count = array(); + if(!$output->columns) { + $columns = '*'; + } else { + $column_list = array(); + foreach($output->columns as $key => $val) { + $name = $val['name']; + $alias = $val['alias']; + if($val['click_count']) $click_count[] = $val['name']; + + if(substr($name,-1) == '*') { + $column_list[] = $name; + } elseif(strpos($name,'.')===false && strpos($name,'(')===false) { + if($alias) $column_list[] = sprintf('`%s` as `%s`', $name, $alias); + else $column_list[] = sprintf('`%s`',$name); + } else { + if($alias) $column_list[] = sprintf('%s as `%s`', $name, $alias); + else $column_list[] = sprintf('%s',$name); + } + } + $columns = implode(',',$column_list); + } + + $condition = $this->getCondition($output); + + if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output); + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if($output->order) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + // list_count를 사용할 경우 적용 + if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']); + + $result = $this->_query($query); + if($this->isError()) return; + + if(count($click_count)>0 && count($output->conditions)>0){ + $_query = ''; + foreach($click_count as $k => $c) $_query .= sprintf(',%s=%s+1 ',$c,$c); + $_query = sprintf('update %s set %s %s',implode(',',$table_list), substr($_query,1), $condition); + $this->_query($_query); + } + + $data = $this->_fetch($result); + + $buff = new Object(); + $buff->data = $data; + return $buff; + } + + /** + * @brief query xml에 navigation 정보가 있을 경우 페이징 관련 작업을 처리한다 + * + * 그닥 좋지는 않은 구조이지만 편리하다.. -_-; + **/ + function _getNavigationData($table_list, $columns, $left_join, $condition, $output) { + require_once(_XE_PATH_.'classes/page/PageHandler.class.php'); + + // 전체 개수를 구함 + $count_condition = count($output->groups) ? sprintf('%s group by %s', $condition, implode(', ', $output->groups)) : $condition; + $total_count = $this->getCountCache($output->tables, $count_condition); + if($total_count === false) { + $count_query = sprintf("select count(*) as count from %s %s %s", implode(', ', $table_list), implode(' ', $left_join), $count_condition); + if (count($output->groups)) + $count_query = sprintf('select count(*) as count from (%s) xet', $count_query); + $result = $this->_query($count_query); + $count_output = $this->_fetch($result); + $total_count = (int)$count_output->count; + $this->putCountCache($output->tables, $count_condition, $total_count); + } + + $list_count = $output->list_count['value']; + if(!$list_count) $list_count = 20; + $page_count = $output->page_count['value']; + if(!$page_count) $page_count = 10; + $page = $output->page['value']; + if(!$page) $page = 1; + + // 전체 페이지를 구함 + if($total_count) $total_page = (int)( ($total_count-1) / $list_count) + 1; + else $total_page = 1; + + // 페이지 변수를 체크 + if($page > $total_page) $page = $total_page; + $start_count = ($page-1)*$list_count; + + // list_order, update_order 로 정렬시에 인덱스 사용을 위해 condition에 쿼리 추가 + if($output->order) { + $conditions = $this->getConditionList($output); + if(!in_array('list_order', $conditions) && !in_array('update_order', $conditions)) { + foreach($output->order as $key => $val) { + $col = $val[0]; + if(!in_array($col, array('list_order','update_order'))) continue; + if($condition) $condition .= sprintf(' and %s < 2100000000 ', $col); + else $condition = sprintf(' where %s < 2100000000 ', $col); + } + } + } + + $query = sprintf("select %s from %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition); + + if(count($output->groups)) $query .= sprintf(' group by %s', implode(',',$output->groups)); + + if(count($output->order)) { + foreach($output->order as $key => $val) { + $index_list[] = sprintf('%s %s', $val[0], $val[1]); + } + if(count($index_list)) $query .= ' order by '.implode(',',$index_list); + } + + $query = sprintf('%s limit %d, %d', $query, $start_count, $list_count); + $result = $this->_query($query); + if($this->isError()) { + $buff = new Object(); + $buff->total_count = 0; + $buff->total_page = 0; + $buff->page = 1; + $buff->data = array(); + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + + $virtual_no = $total_count - ($page-1)*$list_count; + while($tmp = mysqli_fetch_object($result)) { + $data[$virtual_no--] = $tmp; + } + + $buff = new Object(); + $buff->total_count = $total_count; + $buff->total_page = $total_page; + $buff->page = $page; + $buff->data = $data; + + $buff->page_navigation = new PageHandler($total_count, $total_page, $page, $page_count); + return $buff; + } + } +?> diff --git a/classes/db/DBPostgresql.class.php b/classes/db/DBPostgresql.class.php index 9b164b047..08414f076 100644 --- a/classes/db/DBPostgresql.class.php +++ b/classes/db/DBPostgresql.class.php @@ -104,7 +104,7 @@ class DBPostgresql extends DB // 접속체크 $this->is_connected = true; - + $this->password = md5($this->password); // utf8임을 지정 //$this ->_query('set client_encoding to uhc'); } diff --git a/classes/db/DBSqlite2.class.php b/classes/db/DBSqlite2.class.php index e1d0b4bd6..d7d11a2aa 100644 --- a/classes/db/DBSqlite2.class.php +++ b/classes/db/DBSqlite2.class.php @@ -76,6 +76,7 @@ // 접속체크 $this->is_connected = true; + $this->password = md5($this->password); } /** diff --git a/classes/db/DBSqlite3_pdo.class.php b/classes/db/DBSqlite3_pdo.class.php index 3c97682a9..6df2050e2 100644 --- a/classes/db/DBSqlite3_pdo.class.php +++ b/classes/db/DBSqlite3_pdo.class.php @@ -84,6 +84,7 @@ // 접속체크 $this->is_connected = true; + $this->password = md5($this->password); } /** diff --git a/classes/display/DisplayHandler.class.php b/classes/display/DisplayHandler.class.php index 2a2adde92..d18c3373b 100644 --- a/classes/display/DisplayHandler.class.php +++ b/classes/display/DisplayHandler.class.php @@ -272,7 +272,7 @@ $end = getMicroTime(); // Firebug 콘솔 출력 - if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '5.2.0', '>=')) { + if(__DEBUG_OUTPUT__ == 2 && version_compare(PHP_VERSION, '6.0.0') === -1) { static $firephp; if(!isset($firephp)) $firephp = FirePHP::getInstance(true); @@ -379,7 +379,7 @@ } // HTML 주석으로 출력 - if(__DEBUG_OUTPUT__ == 1 && Context::getResponseMethod() == 'HTML') { + if($buff && __DEBUG_OUTPUT__ == 1 && Context::getResponseMethod() == 'HTML') { $buff = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($buff, true)); if(__DEBUG_PROTECT__ == 1 && __DEBUG_PROTECT_IP__ != $_SERVER['REMOTE_ADDR']) { @@ -390,7 +390,7 @@ } // 파일에 출력 - if(__DEBUG_OUTPUT__ == 0) { + if($buff && __DEBUG_OUTPUT__ == 0) { $debug_file = _XE_PATH_.'files/_debug_message.php'; $buff = sprintf("[%s %s:%d]\n%s\n", date('Y-m-d H:i:s'), $file_name, $line_num, print_r($buff, true)); diff --git a/classes/file/FileHandler.class.php b/classes/file/FileHandler.class.php index da3808613..c8a94369f 100644 --- a/classes/file/FileHandler.class.php +++ b/classes/file/FileHandler.class.php @@ -397,6 +397,40 @@ return true; } + /** + * @brief convert size in string into numeric value + * @param[in] $val size in string (ex., 10, 10K, 10M, 10G ) + * @return converted size + */ + function returnBytes($val) + { + $val = trim($val); + $last = strtolower(substr($val, -1)); + if($last == 'g') $val *= 1024*1024*1024; + else if($last == 'm') $val *= 1024*1024; + else if($last == 'k') $val *= 1024; + + return $val; + } + + /** + * @brief check available memory to load image file + * @param[in] $imageInfo image info retrieved by getimagesize function + * @return true: it's ok, false: otherwise + */ + function checkMemoryLoadImage(&$imageInfo) + { + if(!function_exists('memory_get_usage')) return true; + $K64 = 65536; + $TWEAKFACTOR = 1.5; + $channels = $imageInfo['channels']; + if(!$channels) $channels = 6; //for png + $memoryNeeded = round( ($imageInfo[0] * $imageInfo[1] * $imageInfo['bits'] * $channels / 8 + $K64 ) * $TWEAKFACTOR ); + $availableMemory = FileHandler::returnBytes(ini_get('memory_limit')) - memory_get_usage(); + if($availableMemory < $memoryNeeded) return false; + return true; + } + /** * @brief moves an image file (resizing is possible) * @param[in] $source_file path of the source file @@ -416,7 +450,10 @@ if(!$resize_height) $resize_height = $resize_width; // retrieve source image's information - list($width, $height, $type, $attrs) = @getimagesize($source_file); + $imageInfo = getimagesize($source_file); + if(!FileHandler::checkMemoryLoadImage($imageInfo)) return false; + list($width, $height, $type, $attrs) = $imageInfo; + if($width<1 || $height<1) return; switch($type) { @@ -470,20 +507,24 @@ // create temporary image having original type switch($type) { case 'gif' : + if(!function_exists('imagecreatefromgif')) return false; $source = @imagecreatefromgif($source_file); break; // jpg case 'jpeg' : case 'jpg' : + if(!function_exists('imagecreatefromjpeg')) return false; $source = @imagecreatefromjpeg($source_file); break; // png case 'png' : + if(!function_exists('imagecreatefrompng')) return false; $source = @imagecreatefrompng($source_file); break; // bmp case 'wbmp' : case 'bmp' : + if(!function_exists('imagecreatefromwbmp')) return false; $source = @imagecreatefromwbmp($source_file); break; default : @@ -514,17 +555,21 @@ // write into the file switch($target_type) { case 'gif' : + if(!function_exists('imagegif')) return false; $output = @imagegif($thumb, $target_file); break; case 'jpeg' : case 'jpg' : + if(!function_exists('imagejpeg')) return false; $output = @imagejpeg($thumb, $target_file, 100); break; case 'png' : + if(!function_exists('imagepng')) return false; $output = @imagepng($thumb, $target_file, 9); break; case 'wbmp' : case 'bmp' : + if(!function_exists('imagewbmp')) return false; $output = @imagewbmp($thumb, $target_file, 100); break; } diff --git a/classes/module/ModuleHandler.class.php b/classes/module/ModuleHandler.class.php index f67b298e7..890abc6d7 100644 --- a/classes/module/ModuleHandler.class.php +++ b/classes/module/ModuleHandler.class.php @@ -2,45 +2,40 @@ /** * @class ModuleHandler * @author zero (zero@nzeo.com) - * @brief 모듈 핸들링을 위한 Handler + * @brief Handling modules * - * 모듈을 실행시키기 위한 클래스. - * constructor에 아무 인자 없이 객체를 생성하면 현재 요청받은 - * 상태를 바탕으로 적절한 모듈을 찾게 되고, - * 별도의 인자 값을 줄 경우 그에 맞는 모듈을 찾아서 실행한다. - * 만약 찾아진 모듈의 요청된 act 가 없으면 action_foward를 참조하여 다른 모듈의 act를 실행한다. + * @remarks This class is to excute actions of modules. + * Constructing an instance without any parameterconstructor, it finds the target module based on Context. + * If there is no act on the found module, excute an action referencing action_forward. **/ class ModuleHandler extends Handler { - var $oModule = NULL; ///< 모듈 객체 + var $oModule = NULL; ///< Module Instance - var $module = NULL; ///< 모듈 + var $module = NULL; ///< Module var $act = NULL; ///< action - var $mid = NULL; ///< 모듈의 객체명 - var $document_srl = NULL; ///< 문서 번호 - var $module_srl = NULL; ///< 모듈의 번호 + var $mid = NULL; ///< Module ID + var $document_srl = NULL; ///< Document Number + var $module_srl = NULL; ///< Module Number - var $module_info = NULL; ///< 모듈의 정보 + var $module_info = NULL; ///< Module Info. Object - var $error = NULL; ///< 진행 도중 에러 발생시 에러 코드를 정의, message 모듈을 호출시 사용 + var $error = NULL; ///< an error code. /** * @brief constructor - * - * ModuleHandler에서 사용할 변수를 미리 세팅 - * 인자를 넘겨주지 않으면 현 페이지 요청받은 Request Arguments를 이용하여 - * 변수를 세팅한다. + * @remarks it prepares variables to use in moduleHandler **/ function ModuleHandler($module = '', $act = '', $mid = '', $document_srl = '', $module_srl = '') { - // 설치가 안되어 있다면 install module을 지정 + // If XE has not installed yet, set module as install if(!Context::isInstalled()) { $this->module = 'install'; $this->act = Context::get('act'); return; } - // Request Argument중 모듈을 찾을 수 있는 변수를 구함 + // Set variables from request arguments if(!$module) $this->module = Context::get('module'); else $this->module = $module; @@ -58,12 +53,12 @@ $this->entry = Context::get('entry'); - // 기본 변수들의 검사 (XSS방지를 위한 기초적 검사) + // Validate variables to prevent XSS if($this->module && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->module)) die(Context::getLang("msg_invalid_request")); if($this->mid && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->mid)) die(Context::getLang("msg_invalid_request")); if($this->act && !preg_match("/^([a-z0-9\_\-]+)$/i",$this->act)) die(Context::getLang("msg_invalid_request")); - // 애드온 실행 (모듈 실행 전) + // execute addon (before module initialization) $called_position = 'before_module_init'; $oAddonController = &getController('addon'); $addon_file = $oAddonController->getCacheFilePath(); @@ -71,10 +66,10 @@ } /** - * @brief module, mid, document_srl을 이용하여 모듈을 찾고 act를 실행하기 위한 준비를 함 + * @brief Initialization. It finds the target module based on module, mid, document_srl, and prepares to execute an action + * @return true: OK, false: redirected **/ function init() { - // ModuleModel 객체 생성 $oModuleModel = &getModel('module'); $site_module_info = Context::get('site_module_info'); @@ -85,50 +80,50 @@ if($this->document_srl) Context::set('document_srl', $this->document_srl); } - // 문서번호(document_srl)가 있을 경우 모듈 정보를 구해옴 + // Get module's information based on document_srl, if it's specified if($this->document_srl && !$this->module) { $module_info = $oModuleModel->getModuleInfoByDocumentSrl($this->document_srl); - // 문서가 존재하지 않으면 문서 정보를 제거 + // If the document does not exist, remove document_srl if(!$module_info) { unset($this->document_srl); - // 문서가 존재할 경우 모듈 정보를 바탕으로 virtual site 및 mid 비교 } else { - // mid 값이 다르면 문서의 mid로 설정 + // If it exists, compare mid based on the module information + // if mids are not matching, set it as the document's mid if($this->mid != $module_info->mid) { $this->mid = $module_info->mid; Context::set('mid', $module_info->mid, true); } } - // 요청된 모듈과 문서 번호가 다르면 문서 번호에 의한 모듈 정보를 제거 + // if requested module is different from one of the document, remove the module information retrieved based on the document number if($this->module && $module_info->module != $this->module) unset($module_info); } - // 모듈정보를 구하지 못했고 mid 요청이 있으면 mid에 해당하는 모듈 정보를 구함 + // If module_info is not set yet, and there exists mid information, get module information based on the mid if(!$module_info && $this->mid) { $module_info = $oModuleModel->getModuleInfoByMid($this->mid, $site_module_info->site_srl); //if($this->module && $module_info->module != $this->module) unset($module_info); } - // module_site_srl과 site_srl 값이 다르면 redirect 시도 + // redirect, if module_site_srl and site_srl are different if(!$this->module && !$module_info && $site_module_info->site_srl == 0 && $site_module_info->module_site_srl > 0) { $site_info = $oModuleModel->getSiteInfo($site_module_info->module_site_srl); header("location:".getNotEncodedSiteUrl($site_info->domain,'mid',$site_module_info->mid)); return false; } - // 역시 모듈을 못 찾았고 $module이 없다면 기본 모듈을 찾아봄 + // If module_info is not set still, and $module does not exist, find the default module if(!$module_info && !$this->module) $module_info = $site_module_info; if(!$module_info && !$this->module && $site_module_info->module_site_srl) $module_info = $site_module_info; - // 모듈정보와 사이트 모듈정보가 다르면(다른 사이트이면) 페이지 리다이렉트 + // redirect, if site_srl of module_info is different from one of site's module_info if($module_info && $module_info->site_srl != $site_module_info->site_srl) { - // 현재 요청된 모듈이 가상 사이트 모듈일 경우 + // If the module is of virtual site if($module_info->site_srl) { $site_info = $oModuleModel->getSiteInfo($module_info->site_srl); $redirect_url = getNotEncodedSiteUrl($site_info->domain, 'mid',Context::get('mid'),'document_srl',Context::get('document_srl'),'module_srl',Context::get('module_srl'),'entry',Context::get('entry')); - // 가상 사이트 모듈이 아닌데 가상 사이트에서 호출되었을 경우 + // If it's called from a virtual site, though it's not a module of the virtual site } else { $db_info = Context::getDBInfo(); if(!$db_info->default_url) return Context::getLang('msg_default_url_is_not_defined'); @@ -138,7 +133,7 @@ return false; } - // 모듈 정보가 찾아졌을 경우 모듈 정보에서 기본 변수들을 구함, 모듈 정보에서 module 이름을 구해움 + // If module info was set, retrieve variables from the module information if($module_info) { $this->module = $module_info->module; $this->mid = $module_info->mid; @@ -148,34 +143,35 @@ Context::addHtmlHeader($part_config->header_script); } - // 모듈정보에 module과 mid를 강제로 지정 + // Set module and mid into module_info $this->module_info->module = $this->module; $this->module_info->mid = $this->mid; - // 여기까지도 모듈 정보를 찾지 못했다면 깔끔하게 시스템 오류 표시 + // Still no module? it's an error if(!$this->module) $this->error = 'msg_module_is_not_exists'; - // mid값이 있을 경우 mid값을 세팅 + // If mid exists, set mid into context if($this->mid) Context::set('mid', $this->mid, true); - // 실제 동작을 하기 전에 trigger 호출 + // Call a trigger after moduleHandler init $output = ModuleHandler::triggerCall('moduleHandler.init', 'after', $this->module_info); if(!$output->toBool()) { $this->error = $output->getMessage(); return false; } - // 현재 모듈의 정보를 세팅 + // Set current module info into context Context::set('current_module_info', $this->module_info); return true; } /** - * @brief 모듈과 관련된 정보를 이용하여 객체를 구하고 act 실행까지 진행시킴 + * @brief get a module instance and execute an action + * @return executed module instance **/ function procModule() { - // 에러가 있으면 메세지 객체를 만들어서 return + // If error occurred while preparation, return a message instance if($this->error) { $oMessageView = &getView('message'); $oMessageView->setError(-1); @@ -184,99 +180,98 @@ return $oMessageView; } - // ModuleModel 객체 생성 $oModuleModel = &getModel('module'); - // 해당 모듈의 conf/action.xml 을 분석하여 action 정보를 얻어옴 + // Get action information with conf/action.xml $xml_info = $oModuleModel->getModuleActionXml($this->module); - // 미설치시에는 act값을 강제로 변경 + // If not installed yet, modify act if($this->module=="install") { if(!$this->act || !$xml_info->action->{$this->act}) $this->act = $xml_info->default_index_act; } - // 현재 요청된 act가 있으면 $xml_info에서 type을 찾음, 없다면 기본 action을 이용 + // if act exists, find type of the action, if not use default index act if(!$this->act) $this->act = $xml_info->default_index_act; - // act값이 지정이 안되어 있으면 오류 표시 + // still no act means error if(!$this->act) { $this->error = 'msg_module_is_not_exists'; return; } - // type, kind 값 구함 + // get type, kind $type = $xml_info->action->{$this->act}->type; $kind = strpos(strtolower($this->act),'admin')!==false?'admin':''; if(!$kind && $this->module == 'admin') $kind = 'admin'; - // 모듈 객체 생성 + // create a module instance $oModule = &$this->getModuleInstance($this->module, $type, $kind); if(!is_object($oModule)) { $this->error = 'msg_module_is_not_exists'; return; } - // 모듈에 act값을 세팅 $oModule->setAct($this->act); - // 모듈 정보 세팅 $this->module_info->module_type = $type; $oModule->setModuleInfo($this->module_info, $xml_info); - // 모듈을 수행하고 결과가 false이면 message 모듈 호출 지정 + // execute the action, and if failed, set error if(!$oModule->proc()) $this->error = $oModule->getMessage(); return $oModule; } /** - * @ 실행된 모듈의 컨텐츠를 출력 + * @brief display contents from executed module + * @param[in] $oModule module instance + * @return none **/ function displayContent($oModule = NULL) { - // 설정된 모듈이 정상이지 않을 경우 message 모듈 객체 생성 + // If the module is not set or not an object, set error if(!$oModule || !is_object($oModule)) { $this->error = 'msg_module_is_not_exists'; } - // install 모듈이 아닐 때 DB 접속에 문제가 있으면 오류 + // If connection to DB has a problem even though it's not install module, set error if($this->module != 'install' && $GLOBALS['__DB__'][Context::getDBType()]->is_connected == false) { $this->error = 'msg_dbconnect_failed'; } - // 모듈 동작을 마친 후 trigger call + // Call trigger after moduleHandler proc $output = ModuleHandler::triggerCall('moduleHandler.proc', 'after', $oModule); if(!$output->toBool()) $this->error = $output->getMessage(); - // HTML call 이면 message view 객체 이용하도록 + // Use message view object, if HTML call if(!in_array(Context::getRequestMethod(),array('XMLRPC','JSON'))) { - // 에러가 발생하였을시 처리 + // If error occurred, handle it if($this->error) { - // message 모듈 객체를 생성해서 컨텐츠 생성 + // display content with message module instance $oMessageView = &getView('message'); $oMessageView->setError(-1); $oMessageView->setMessage($this->error); $oMessageView->dispMessage(); - // 정상적으로 호출된 객체가 있을 경우 해당 객체의 template를 변경 + // If module was called normally, change the templates of the module into ones of the message view module if($oModule) { $oModule->setTemplatePath($oMessageView->getTemplatePath()); $oModule->setTemplateFile($oMessageView->getTemplateFile()); - // 그렇지 않으면 message 객체를 호출된 객체로 지정 + // Otherwise, set message instance as the target module } else { $oModule = $oMessageView; } } - // 해당 모듈에 layout_srl이 있는지 확인 + // Check if layout_srl exists for the module if($oModule->module_info->layout_srl && !$oModule->getLayoutFile()) { - // layout_srl이 있으면 해당 레이아웃 정보를 가져와 layout_path/ layout_file 위치 변경 + // If layout_srl exists, get information of the layout, and set the location of layout_path/ layout_file $oLayoutModel = &getModel('layout'); $layout_info = $oLayoutModel->getLayout($oModule->module_info->layout_srl); if($layout_info) { - // 레이아웃 정보중 extra_vars의 이름과 값을 $layout_info에 입력 + // Input extra_vars into $layout_info if($layout_info->extra_var_count) { foreach($layout_info->extra_var as $var_id => $val) { @@ -286,7 +281,7 @@ $layout_info->{$var_id} = $val->value; } } - // 레이아웃 정보중 menu를 Context::set + // Set menus into context if($layout_info->menu_count) { foreach($layout_info->menu as $menu_id => $menu) { if(file_exists($menu->php_file)) @include($menu->php_file); @@ -294,33 +289,40 @@ } } - // 레이아웃 정보를 Context::set + // Set layout information into context Context::set('layout_info', $layout_info); $oModule->setLayoutPath($layout_info->path); $oModule->setLayoutFile('layout'); - // 레이아웃이 수정되었을 경우 수정본을 지정 + // If layout was modified, use the modified version $edited_layout = $oLayoutModel->getUserLayoutHtml($layout_info->layout_srl); if(file_exists($edited_layout)) $oModule->setEditedLayoutFile($edited_layout); } } } - // 컨텐츠 출력 + // Display contents $oDisplayHandler = new DisplayHandler(); $oDisplayHandler->printContent($oModule); } /** - * @brief module의 위치를 찾아서 return + * @brief returns module's path + * @param[in] $module module name + * @return path of the module **/ function getModulePath($module) { return sprintf('./modules/%s/', $module); } /** - * @brief 모듈 객체를 생성함 + * @brief It creates a module instance + * @param[in] $module module name + * @param[in] $type instance type, (e.g., view, controller, model) + * @param[in] $kind admin or svc + * @return module instance (if failed it returns null) + * @remarks if there exists a module instance created before, returns it. **/ function &getModuleInstance($module, $type = 'view', $kind = '') { $class_path = ModuleHandler::getModulePath($module); @@ -330,21 +332,16 @@ if($kind != 'admin') $kind = 'svc'; - // global 변수에 미리 생성해 둔 객체가 없으면 새로 생성 + // if there is no instance of the module in global variable, create a new one if(!$GLOBALS['_loaded_module'][$module][$type][$kind]) { - - /** - * 모듈의 위치를 파악 - **/ - - // 상위 클래스명 구함 + // Get base class name and load the file contains it if(!class_exists($module)) { $high_class_file = sprintf('%s%s%s.class.php', _XE_PATH_,$class_path, $module); if(!file_exists($high_class_file)) return NULL; require_once($high_class_file); } - // 객체의 이름을 구함 + // Get the object's name switch($type) { case 'controller' : if($kind == 'admin') { @@ -392,43 +389,48 @@ break; } - // 클래스 파일의 이름을 구함 + // Get the name of the class file if(!file_exists($class_file)) return NULL; - // eval로 객체 생성 + // Create an instance with eval function require_once($class_file); + if(!class_exists($instance_name)) return NULL; $eval_str = sprintf('$oModule = new %s();', $instance_name); @eval($eval_str); if(!is_object($oModule)) return NULL; - // 해당 위치에 속한 lang 파일을 읽음 + // Load language files for the class Context::loadLang($class_path.'lang'); - // 생성된 객체에 자신이 호출된 위치를 세팅해줌 + // Set variables to the instance $oModule->setModule($module); $oModule->setModulePath($class_path); - // 요청된 module에 constructor가 있으면 실행 + // If the module has a constructor, run it. if(!isset($GLOBALS['_called_constructor'][$instance_name])) { $GLOBALS['_called_constructor'][$instance_name] = true; if(@method_exists($oModule, $instance_name)) $oModule->{$instance_name}(); } - // GLOBALS 변수에 생성된 객체 저장 + // Store the created instance into GLOBALS variable $GLOBALS['_loaded_module'][$module][$type][$kind] = $oModule; } if(__DEBUG__==3) $GLOBALS['__elapsed_class_load__'] += getMicroTime() - $start_time; - // 객체 리턴 + // return the instance return $GLOBALS['_loaded_module'][$module][$type][$kind]; } /** - * @brief trigger_name, called_position을 주고 trigger 호출 + * @brief call a trigger + * @param[in] $trigger_name trigger's name to call + * @param[in] $called_position called position + * @param[in] $obj an object as a parameter to trigger + * @return Object **/ function triggerCall($trigger_name, $called_position, &$obj) { - // 설치가 안되어 있다면 trigger call을 하지 않고 바로 return + // skip if not installed if(!Context::isInstalled()) return new Object(); $oModuleModel = &getModel('module'); diff --git a/classes/page/PageHandler.class.php b/classes/page/PageHandler.class.php index 5dd920731..3620e1ef1 100644 --- a/classes/page/PageHandler.class.php +++ b/classes/page/PageHandler.class.php @@ -2,25 +2,29 @@ /** * @class PageHandler * @author zero (zero@nzeo.com) - * @brief 페이지 네비게이션 담당 + * @brief handles page navigation * @version 0.1 * - * 전체갯수, 전체페이지, 현재페이지, 페이지당 목록의 수를 넘겨주면 \n - * 페이지 네비게이션에 필요한 variables와 method를 구현\n + * @remarks Getting total counts, number of pages, current page number, number of items per page, + * this class implements methods and contains variables for page navigation **/ class PageHandler extends Handler { - var $total_count = 0; ///< 전체 item의 갯수 - var $total_page = 0; ///< 전체 페이지 수 - var $cur_page = 0; ///< 현 페이지 - var $page_count = 10; ///< 한번에 보일 페이지의 수 - var $first_page = 1; ///< 첫 페이지 - var $last_page = 1; ///< 마지막 페이지 - var $point = 0; ///< getNextPage() 호출시 증가하는 값 + var $total_count = 0; ///< number of total items + var $total_page = 0; ///< number of total pages + var $cur_page = 0; ///< current page number + var $page_count = 10; ///< number of page links displayed at one time + var $first_page = 1; ///< first page number + var $last_page = 1; ///< last page number + var $point = 0; ///< increments per getNextPage() /** * @brief constructor + * @param[in] $total_count number of total items + * @param[in] $total_page number of total pages + * @param[in] $cur_page current page number + * @param[in] $page_count number of page links displayed at one time **/ function PageHandler($total_count, $total_page, $cur_page, $page_count = 10) { $this->total_count = $total_count; @@ -41,7 +45,8 @@ } /** - * @brief 다음 페이지 요청 + * @brief request next page + * @return next page number **/ function getNextPage() { $page = $this->first_page+$this->point++; diff --git a/common/css/button.css b/common/css/button.css index 322a8ff77..a22664844 100644 --- a/common/css/button.css +++ b/common/css/button.css @@ -3,9 +3,9 @@ /* Anchor Button */ a.button, -a.button span { position:relative; display:inline-block; text-decoration:none !important; background:url(../tpl/images/buttonWhite.gif) no-repeat; cursor:pointer; white-space:nowrap; vertical-align:middle; *vertical-align:top;} +a.button span { position:relative; display:inline-block; text-decoration:none !important; background:url(../tpl/images/buttonWhite.gif) no-repeat; cursor:pointer; white-space:nowrap; vertical-align:middle;} a.button { padding:0; background-position:left top; overflow:visible;} -a.button span { left:2px; padding:6px 10px 5px 8px; color:#000; font:12px/12px Sans-serif; background-position:right top;} +a.button span { left:2px; padding:6px 10px 5px 8px; color:#000; font:12px/12px Sans-serif; background-position:right top; *vertical-align:top;} /* Large Size */ a.button.large { background-position:left -30px; } a.button.large span { padding:7px 10px 6px 8px; font:16px/16px Sans-serif; background-position:right -30px;} @@ -22,11 +22,11 @@ span.button button, span.button input { position:relative; margin:0; display:inline-block; border:0; font:12px Sans-serif; white-space:nowrap; background:url(../tpl/images/buttonWhite.gif) no-repeat; vertical-align:middle;} span.button { padding:0; background-position:left top;} span.button button, -span.button input { height:23px; left:2px; *top:-1px; _top:0; padding:0 10px 0 8px; line-height:24px; background-position:right top; cursor:pointer; *overflow:visible;} +span.button input { height:23px; left:2px; *vertical-align:top; padding:0 10px 0 8px; line-height:24px; background-position:right top; cursor:pointer; *overflow:visible;} /* Large Size */ span.button.large { background-position:left -30px;} span.button.large button, -span.button.large input { height:30px; *top:0; _top:-1px; padding:0 10px 0 8px; font:16px/30px Sans-serif; background-position:right -30px;} +span.button.large input { height:30px; padding:0 10px 0 8px; font:16px/30px Sans-serif; background-position:right -30px;} /* xLarge Size */ span.button.xLarge { background-position:left -65px;} span.button.xLarge button, @@ -34,7 +34,7 @@ span.button.xLarge input { height:35px; padding:0 10px 0 8px; font:20px/36px San /* Small Size */ span.button.small { background-position:left -107px;} span.button.small button, -span.button.small input { height:18px; *top:0; _top:-1px; padding:0 6px 0 4px; font:11px/18px Sans-serif; background-position:right -107px;} +span.button.small input { height:18px; padding:0 6px 0 4px; font:11px/18px Sans-serif; background-position:right -107px;} /* Strong Button */ a.button.strong *, diff --git a/common/js/common.js b/common/js/common.js index 7882dfb78..5f79bbbc0 100644 --- a/common/js/common.js +++ b/common/js/common.js @@ -450,8 +450,8 @@ function _displayMultimedia(src, width, height, options) { }; var params = jQuery.extend(defaults, options || {}); - var autostart = (params.autostart && params.autostart != 'false') ? 'true' : 'false'; - delete(params.autostart); + var autostart = (params.autostart && params.autostart != 'false') ? 'true' : 'false'; + delete(params.autostart); var clsid = ""; var codebase = ""; @@ -464,8 +464,8 @@ function _displayMultimedia(src, width, height, options) { } else if(/\.swf/i.test(src)) { clsid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; - if(typeof(enforce_ssl)=='undefined'){ codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } - else { codebase = "https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } + if(typeof(enforce_ssl)!='undefined' && enforce_ssl){ codebase = "https://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } + else { codebase = "http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0"; } html = ''; html += ''; for(var name in params) { @@ -477,6 +477,11 @@ function _displayMultimedia(src, width, height, options) { + '' + ''; } else { + if (jQuery.browser.mozilla || jQuery.browser.opera) { + // firefox and opera uses 0 or 1 for autostart parameter. + autostart = (params.autostart && params.autostart != 'false') ? '1' : '0'; + } + html = '= 0) _apps.splice(nIndex, 1); + + if ($.isArray(_apps[sName])) { + nIndex = $.inArray(oApp, _apps[sName]); + if (nIndex >= 0) _apps[sName].splice(nIndex, 1); + } + }, + + /** + * @brief overrides broadcast method + */ + broadcast : function(oSender, msg, params) { + for(var i=0; i < _apps.length; i++) { + _apps[i].cast(oSender, msg, params); + } + + // cast to child plugins + this.cast(oSender, msg, params); + } +} + +_app_base = { + _plugins : [], + _messages : [], + + _fn_level : -1, + + /** + * @brief register a plugin instance + */ + registerPlugin : function(oPlugin) { + var sName = oPlugin.getName().toLowerCase(); + + // check if the plugin is already registered + if ($.inArray(oPlugin, this._plugins) >= 0) return false; + + // push the plugin into the _plugins array + this._plugins.push(oPlugin); + + if (!$.isArray(this._plugins[sName])) { + this._plugins[sName] = []; + } + this._plugins[sName].push(oPlugin); + + // register method pool + var msgs = this._messages; + $.each(oPlugin, function(key, val){ + if (!$.isFunction(val)) return true; + if (!/^API_((BEFORE_|AFTER_)?[A-Z0-9_]+)$/.test(key)) return true; + + var fn = function(s,p){ return oPlugin[key](s,p) }; + fn._fn = val; + + if (RegExp.$2) { // is hooker? + if (!$.isArray(msgs[RegExp.$1])) msgs[RegExp.$1] = []; + msgs[RegExp.$1].push(fn); + } else { // register only one main function + msgs[RegExp.$1] = fn; + } + }); + + // set the application + oPlugin.oApp = this; + + // binding + oPlugin.cast = function(msg, params) { + oPlugin._cast(msg, params); + }; + + oPlugin.broadcast = function(msg, params) { + oPlugin._broadcast(msg, params); + }; + + return true; + }, + + /** + * @brief unregister a plugin instance + */ + unregisterPlugin : function(oPlugin) { + var sName = oPlugin.getName().toLowerCase(); + + // remove from _plugins array + var nIndex = $.inArray(oPlugin, this._plugins); + if (nIndex >= 0) this._plugins.splice(nIndex, 1); + + if ($.isArray(this._plugins[sName])) { + nIndex = $.inArray(oPlugin, this._plugins); + if (nIndex >= 0) this._plugins[sName].splice(nIndex, 1); + } + + // unregister method pool + var msgs = this._messages; + $.each(oPlugin, function(key, val){ + if (!$.isFunction(val)) return true; + if (!/^API_([A-Z0-9_]+)$/.test(key)) return true; + if (typeof msgs[RegExp.$1] == 'undefined') return true; + + if ($.isArray(msgs[RegExp.$1])) { + msgs[RegExp.$1] = $.grep(msgs[RegExp.$1], function(fn,i){ return (fn._fn != val); }); + if (!msgs[RegExp.$1].length) { + delete msgs[RegExp.$1]; + } + } else { + if (msgs[RegExp.$1]._fn == val) { + delete msgs[RegExp.$1]; + } + + } + }); + + // unset the application + oPlugin.oApp = null; + }, + + cast : function(sender, msg, params) { + var i, len; + var aMsg = this._messages; + + msg = msg.toUpperCase(); + + // increase function level + this._fn_level++; + + // BEFORE hooker + if (typeof aMsg['BEFORE_'+msg] != 'undefined') { + var bContinue = this.cast(sender, 'BEFORE_'+msg, params); + if (!bContinue) { + this._fn_level--; + return; + } + } + + // main api function + var vRet; + if ($.isFunction(aMsg[msg])) { + vRet = aMsg[msg](sender, params); + } else if ($.isArray(aMsg[msg])) { + vRet = []; + for(i=0; i < aMsg[msg].length; i++) { + vRet.push( aMsg[msg][i](sender, params) ); + } + } + + // AFTER hooker + if (typeof aMsg['AFTER_'+msg] != 'undefined') { + this.cast(sender, 'AFTER_'+msg, params); + } + + // decrease function level + this._fn_level--; + + if (this._fn_level < 0) { // top level function + return vRet; + } else { + if (typeof vRet == 'undefined') vRet = true; + return $.isArray(vRet)?$.inArray(false, vRet):!!vRet; + } + }, + + broadcast : function(sender, msg, params) { + if (this.parent && this.parent.broadcast) { + this.parent.broadcast(sender, msg, params); + } + } +}; + +_plugin_base = { + oApp : null, + _binded_fn : [], + + _cast : function(msg, params) { + if (this.oApp && this.oApp.cast) { + this.oApp.cast(this, msg, params || []); + } + }, + _broadcast : function(msg, params) { + if (this.oApp && this.oApp.broadcast) { + this.oApp.broadcast(this, mag, params || []); + } + } + + /** + * Event handler prototype + */ +}; + +function getTypeBase() { + var _base = function() { + if ($.isArray(this._plugins)) this._plugins = []; + if ($.isArray(this._messages)) this._messages = []; + if ($.isArray(this._binded_fn)) this._binded_fn = []; + + if ($.isFunction(this.init)) { + this.init.apply(this, arguments); + } + }; + + return _base; +} + +window.xe = $.extend(_app_base, _xe_base); + +// domready event +$(function(){ xe.broadcast(xe, 'ONREADY'); }); + +// load event +$(window).load(function(){ xe.broadcast(xe, 'ONLOAD'); }); + +})(jQuery); \ No newline at end of file diff --git a/common/lang/en.lang.php b/common/lang/en.lang.php index 9890129b2..357b82bbd 100644 --- a/common/lang/en.lang.php +++ b/common/lang/en.lang.php @@ -296,6 +296,10 @@ $lang->msg_ftp_chmod_fail = "Chmod failed. Please check the permission and configuration of FTP server."; $lang->msg_ftp_connect_success = "Connection and authentication to the FTP server succeeded."; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + // Alert messages for Javascript using by XML filter $lang->filter->isnull = 'Please input a value for %s'; diff --git a/common/lang/es.lang.php b/common/lang/es.lang.php index 8c98b0877..3c2e938d1 100644 --- a/common/lang/es.lang.php +++ b/common/lang/es.lang.php @@ -302,6 +302,11 @@ $lang->msg_ftp_chmod_fail = "Ha fallado el comando de FTP para la modificación de atributos de directorio. Verifique la configuración del servicio FTP en el servidor."; $lang->msg_ftp_connect_success = "conexión con éxito al FTP"; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + + // Mensajes de alerta para Javascript usando el filtro XML $lang->filter->isnull = 'Introduzca valor en el %s'; diff --git a/common/lang/fr.lang.php b/common/lang/fr.lang.php index 5ff8125e0..2f775fdd0 100644 --- a/common/lang/fr.lang.php +++ b/common/lang/fr.lang.php @@ -296,6 +296,10 @@ $lang->msg_ftp_chmod_fail = "FTP를 이용한 디렉토리의 속성 변경을 실패하였습니다. FTP 서버의 설정을 확인해주세요"; $lang->msg_ftp_connect_success = "FTP 접속 및 인증 성공하였습니다"; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + // Messages d\'alerte de le Javascript qui est utilisé dans les filtres en XML $lang->filter->isnull = 'Entrez une valeur pour %s'; diff --git a/common/lang/ge.lang.php b/common/lang/ge.lang.php index 056f0734a..31577eba8 100644 --- a/common/lang/ge.lang.php +++ b/common/lang/ge.lang.php @@ -296,6 +296,10 @@ $lang->msg_ftp_chmod_fail = "FTP를 이용한 디렉토리의 속성 변경을 실패하였습니다. FTP 서버의 설정을 확인해주세요"; $lang->msg_ftp_connect_success = "FTP 접속 및 인증 성공하였습니다"; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + // Alert Nachrichten für JavaScript unter Verwendung von XML-Filter $lang->filter->isnull = 'Bitte geben Sie einen Wert für% s'; diff --git a/common/lang/jp.lang.php b/common/lang/jp.lang.php index 9ba0fb49b..0a262067b 100644 --- a/common/lang/jp.lang.php +++ b/common/lang/jp.lang.php @@ -225,9 +225,9 @@ $lang->msg_invalid_format = '正しくないフォーマットです。'; $lang->msg_not_permitted_act = '現在の操作は実行する権限がありません。'; - $lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다"; + $lang->msg_module_is_not_exists = "動作に必要なモジュールが見つかりません。\nサイト管理者へモジュールの点検をお問い合わせ下さい。"; $lang->msg_module_is_not_standalone = 'このモジュールはスタンドアローンでは作動しません。'; - $lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다'; + $lang->msg_default_url_is_not_defined = 'デフォルトURLが定められてないため、動作を中止します。'; $lang->success_registed = '登録しました。'; $lang->success_declared = '通報しました。'; @@ -298,6 +298,11 @@ $lang->msg_ftp_chmod_fail = 'FTPを用いたディレクトリパーミッション(permission)変更に失敗しました。FTPサーバーの設定を再度ご確認下さい。'; $lang->msg_ftp_connect_success = 'FTP接続に成功しました。'; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + + // xml filterで用いられているjavascript用のアラートメッセージ $lang->filter->isnull = '%sを入力して下さい。'; $lang->filter->outofrange = '%sの文字の長さを合わせて下さい。'; diff --git a/common/lang/ko.lang.php b/common/lang/ko.lang.php index 90b73cef9..0c1e477f5 100644 --- a/common/lang/ko.lang.php +++ b/common/lang/ko.lang.php @@ -279,7 +279,7 @@ $lang->eid = '확장변수 이름'; // ftp 관련 - $lang->ftp_form_title = 'FTP 정보 입력'; + $lang->ftp_form_title = 'FTP 계정 정보 입력'; $lang->ftp = 'FTP'; $lang->ftp_port = 'FTP port'; $lang->cmd_check_ftp_connect = 'FTP 접속 확인'; @@ -298,6 +298,10 @@ $lang->msg_ftp_chmod_fail = 'FTP를 이용한 디렉토리의 속성 변경에 실패하였습니다. FTP 서버의 설정을 확인해주세요.'; $lang->msg_ftp_connect_success = 'FTP 접속 및 인증에 성공하였습니다.'; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + // xml filter에서 사용되는 javascript용 alert msg $lang->filter->isnull = '%s을 입력해주세요.'; $lang->filter->outofrange = '%s의 글자 수를 맞추어 주세요.'; diff --git a/common/lang/ru.lang.php b/common/lang/ru.lang.php index 3554b0229..1e9682ed2 100644 --- a/common/lang/ru.lang.php +++ b/common/lang/ru.lang.php @@ -291,6 +291,12 @@ $lang->msg_ftp_chmod_fail = "FTP를 이용한 디렉토리의 속성 변경을 실패하였습니다. FTP 서버의 설정을 확인해주세요"; $lang->msg_ftp_connect_success = "FTP 접속 및 인증 성공하였습니다"; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + + + $lang->is_active = 'Активно'; $lang->is_required = 'Требуемое поле'; $lang->eid = '확장변수 이름'; diff --git a/common/lang/vi.lang.php b/common/lang/vi.lang.php index d01f43763..1ece93503 100644 --- a/common/lang/vi.lang.php +++ b/common/lang/vi.lang.php @@ -286,6 +286,10 @@ $lang->msg_ftp_chmod_fail = "CHMOD không thành công. Xin vui lòng kiểm tra lại."; $lang->msg_ftp_connect_success = "Đã xác nhận và kết nối thành công tới máy chủ bằng FTP."; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + // Alert messages for Javascript using by XML filter $lang->filter->isnull = 'Xin vui lòng nhập giá trị cho %s'; diff --git a/common/lang/zh-CN.lang.php b/common/lang/zh-CN.lang.php index 9d9b04c54..c89a96343 100644 --- a/common/lang/zh-CN.lang.php +++ b/common/lang/zh-CN.lang.php @@ -2,7 +2,7 @@ /** * @file common/lang/zh-CN.lang.php * @author zero (zero@nzeo.com) - * @brief 简体中文语言包 (只收录基本内容) + * @brief 简体中文语言包 **/ // 基本使用的 action 语言 @@ -24,16 +24,16 @@ $lang->cmd_load = '导入'; $lang->cmd_input = '输入'; $lang->cmd_search = '搜索'; - $lang->cmd_find = '찾기'; - $lang->cmd_replace = '바꾸기'; - $lang->cmd_confirm = '확인'; + $lang->cmd_find = '查找'; + $lang->cmd_replace = '替换'; + $lang->cmd_confirm = '确认'; $lang->cmd_cancel = '取消'; $lang->cmd_back = '返回'; $lang->cmd_vote = '推荐'; $lang->cmd_vote_down = '反对'; $lang->cmd_declare = '举报'; $lang->cmd_cancel_declare = '取消举报'; - $lang->cmd_declared_list = '举报目录'; + $lang->cmd_declared_list = '举报列表'; $lang->cmd_copy = '复制'; $lang->cmd_move = '移动'; $lang->cmd_move_up = '向上'; @@ -124,7 +124,7 @@ $lang->file = '文件'; $lang->mid = '模块名称'; - $lang->sid = 'Site Name'; + $lang->sid = '站点名称'; $lang->layout = '布局'; $lang->widget = '控件 '; $lang->module = '模块'; @@ -209,7 +209,7 @@ $lang->about_layout = '布局是布置模块的外观,在上端布局菜里单可以进行管理'; // 信息 - $lang->msg_call_server = '系统正在链接服务器,请稍后。'; + $lang->msg_call_server = '系统正在连接服务器,请稍后…'; $lang->msg_db_not_setted = '还没有设定 DB'; $lang->msg_dbconnect_failed = "连接DB时发生错误。\n请重新确认DB信息。"; $lang->msg_invalid_queryid = 'Query ID值指定错误'; @@ -221,18 +221,19 @@ $lang->msg_error_occured = '发生错误'; $lang->msg_not_founded = '没有找到相关内容'; $lang->msg_no_result = '找不到和您查询的相符结果'; - $lang->msg_fail_to_request_open = 'Fail to open your request'; - $lang->msg_invalid_format = 'Invalid Format'; + $lang->msg_fail_to_request_open = '连接失败!'; + $lang->msg_invalid_format = '错误的格式!'; $lang->msg_not_permitted_act = '没有权限执行 action命令'; - $lang->msg_module_is_not_exists = "요청하신 모듈을 찾을 수 없습니다.\n사이트 관리자에게 모듈 점검 요청 바랍니다"; + $lang->msg_module_is_not_exists = "没有找到该模块!\n请联系网站管理员进行模块维护。"; $lang->msg_module_is_not_standalone = '您请求的模块不能单独执行'; - $lang->msg_default_url_is_not_defined = '기본 URL이 정해지지 않아서 동작을 중지합니다'; + $lang->msg_default_url_is_not_defined = '请设置XE通行证!'; $lang->success_registed = '提交成功!'; $lang->success_declared = '举报成功!'; $lang->success_updated = '修改成功!'; $lang->success_deleted = '删除成功!'; + $lang->success_restore = '复原成功!'; $lang->success_voted = '推荐成功!'; $lang->success_blamed = '反对成功!'; $lang->success_moved = '移动成功!'; @@ -253,28 +254,29 @@ $lang->confirm_logout = '确定要退出吗?'; $lang->confirm_vote = '确定要推荐吗?'; $lang->confirm_delete = '确定要删除吗?'; + $lang->confirm_restore = '确定要复原吗?'; $lang->confirm_move = '确定要移动吗?'; $lang->confirm_reset = '确定要初始化吗?'; $lang->confirm_leave = '确定要注销吗?'; $lang->column_type = '格式'; $lang->column_type_list['text'] = '单行文本输入区(text)'; - $lang->column_type_list['homepage'] = '网址格式 (url)'; - $lang->column_type_list['email_address'] = '邮件格式 (email)'; - $lang->column_type_list['tel'] = '电话号码格式 (phone)'; - $lang->column_type_list['textarea'] = '多行文本框 (textarea)'; - $lang->column_type_list['checkbox'] = '复选框 (checkbox)'; - $lang->column_type_list['select'] = '下拉列表框 (select)'; - $lang->column_type_list['radio'] = '单选框 (radio)'; + $lang->column_type_list['homepage'] = '网址格式(url)'; + $lang->column_type_list['email_address'] = '邮件格式(email)'; + $lang->column_type_list['tel'] = '电话号码格式(phone)'; + $lang->column_type_list['textarea'] = '多行文本框(textarea)'; + $lang->column_type_list['checkbox'] = '复选框(checkbox)'; + $lang->column_type_list['select'] = '下拉列表框(select)'; + $lang->column_type_list['radio'] = '单选框(radio)'; $lang->column_type_list['kr_zip'] = '韩国邮编(zip)'; - $lang->column_type_list['date'] = '日期 (年月日)'; - //$lang->column_type_list['jp_zip'] = '日本地址 (zip)'; + $lang->column_type_list['date'] = '日期(年月日)'; + //$lang->column_type_list['jp_zip'] = '日本地址(zip)'; $lang->column_name = '项目名'; $lang->column_title = '项目标题'; $lang->default_value = '缺省值'; $lang->is_active = '激活'; $lang->is_required = '必填'; - $lang->eid = '확장변수 이름'; + $lang->eid = '扩展变量名'; // ftp 相关 $lang->ftp_form_title = '设置FTP信息'; @@ -296,6 +298,9 @@ $lang->msg_ftp_chmod_fail = "修改文件夹属性失败。请确认 FTP服务器设置。"; $lang->msg_ftp_connect_success = "FTP连接成功。"; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; // 在xml filter使用的 javascript用 alert msg $lang->filter->isnull = '请输入%s'; diff --git a/common/lang/zh-TW.lang.php b/common/lang/zh-TW.lang.php index 4dadc73a3..1ceb1bdb2 100644 --- a/common/lang/zh-TW.lang.php +++ b/common/lang/zh-TW.lang.php @@ -297,6 +297,11 @@ $lang->msg_ftp_chmod_fail = '修改資料夾權限失敗。請確認FTP主機設置。'; $lang->msg_ftp_connect_success = 'FTP連線成功。'; + $lang->ftp_path_title = 'FTP 경로 정보 입력'; + $lang->msg_ftp_installed_realpath = '설치된 XE의 절대경로'; + $lang->msg_ftp_installed_ftp_realpath = '설치된 XE의 FTP 절대경로 설정'; + + // 在xml filter中所使用的JavaScript警告訊息 $lang->filter->isnull = '請輸入%s'; $lang->filter->outofrange = '請確認%s字數'; diff --git a/config/config.inc.php b/config/config.inc.php index f551ab9e6..ee8e6d42b 100644 --- a/config/config.inc.php +++ b/config/config.inc.php @@ -13,7 +13,7 @@ * @brief XE의 전체 버전 표기 * 이 파일의 수정이 없더라도 공식 릴리즈시에 수정되어 함께 배포되어야 함 **/ - define('__ZBXE_VERSION__', '1.2.6'); + define('__ZBXE_VERSION__', '1.3.0'); /** * @brief zbXE가 설치된 장소의 base path를 구함 diff --git a/layouts/xe_official/conf/info.xml b/layouts/xe_official/conf/info.xml index fc30de24a..aa8a647f8 100644 --- a/layouts/xe_official/conf/info.xml +++ b/layouts/xe_official/conf/info.xml @@ -8,7 +8,7 @@ Diseño oficial de la página web de XE XE 官方网站布局 XE 官方網站版面 - Giao diện chính thức của XE + Giao diện chính thức của XE XE 공식 사이트 레이아웃입니다. 디자인 : 이소라 @@ -76,7 +76,7 @@ zero zero zero - zero + zero @@ -89,7 +89,7 @@ Colorset Colorset Set de colores - Màu sắc + Màu sắc 원하시는 컬러셋을 선택해주세요. 希望するカラーセットを選択して下さい。 请选择颜色。 @@ -98,7 +98,7 @@ Bitte wählen Sie ein colorset Sie wollen. Выберите colorset хотите. Seleccione set de colores que desea. - Hãy chọn màu sắc bạn muốn. + Hãy chọn màu sắc bạn muốn. 기본 デフォルト @@ -108,7 +108,7 @@ Básico 默认 預設 - Cơ bản + Cơ bản 검은색 @@ -119,7 +119,7 @@ Negro 黑色 黑色 - Black + Black 하얀색 @@ -130,7 +130,7 @@ Blanco 白色 白色 - White + White @@ -142,7 +142,7 @@ Logobildes Изображения логотипа Imagen del logotipo - Hình Logo + Hình Logo 레이아웃의 상단에 표시될 로고이미지를 입력하세요. (세로길이가 23px인 투명이미지가 가장 어울립니다) レイアウトの上段に表示されるロゴイメージを入力して下さい。 (縦幅が23pxである透明イメージをお勧めします。。) 请输入显示在布局顶部的LOGO图片(高度为23px的透明图片为适)。 @@ -151,7 +151,7 @@ Bitte geben Sie ein Logo das Bild wird auf dem oberen Layout. (Transparent Bild mit einer Höhe von 23px wird empfohlen). Введите логотип изображение, которое будет отображаться в верхней части формы. (Прозрачный изображение с высотой 23px рекомендуется.) Ingresar una imagen para logotipo. ( Se recomienda una imagen de fondo transparente con una altura de 23px. - Hãy chọn Logo hiển thị phía trên cùng của giao diện. (Đề nghị: Hình ảnh có nền trong suốt và kích thước 23px.) + Hãy chọn Logo hiển thị phía trên cùng của giao diện. (Đề nghị: Hình ảnh có nền trong suốt và kích thước 23px.) 홈 페이지 URL @@ -162,7 +162,7 @@ Homepage URL Домашняя страница URL URL de la página web - URL Trang chủ + URL Trang chủ 로고를 클릭시에 이동할 홈 페이지 URL을 입력해 주세요. ロゴをクリックした時に移動するホームページのURLを入力して下さい。 点击网站LOGO时要移动的页面URL。 @@ -171,7 +171,7 @@ Bitte geben Sie die URL umzuleiten, wenn Benutzer klickt das Logo Пожалуйста, введите URL для перенаправления, когда пользователь нажимает логотип Ingresar el URL de la página web para redireccionar al pulsar el logotipo - Hãy nhập địa chỉ bạn muốn chuyển đến khi bấm vào Logo + Hãy nhập địa chỉ bạn muốn chuyển đến khi bấm vào Logo 배경 이미지 @@ -182,7 +182,7 @@ Hintergrundbild Фоновое изображение Imagen de fondo - Hình nền + Hình nền 배경 이미지를 사용하시려면 등록해주세요. 背景イメージを使う場合は、登録して下さい。 要想使用背景图片请在这里上传。 @@ -191,7 +191,7 @@ Bitte geben Sie, wenn Sie verwenden wollen Hintergrundbild. Введите, если вы хотите использовать фоновое изображение. Ingresar imagen de fondo si desea usar. - Hãy nhập hình nền nếu bạn muốn sử dụng. + Hãy nhập hình nền nếu bạn muốn sử dụng. @@ -205,7 +205,7 @@ Top Menü Верхнее меню Menú Principal - Menu trên + Menu trên 하단 메뉴 @@ -216,7 +216,7 @@ Bottom-Menü Внизу меню Menú Inferior - Menu dưới + Menu dưới diff --git a/libs/ftp.class.php b/libs/ftp.class.php index 3bd739f54..ad6c526cf 100644 --- a/libs/ftp.class.php +++ b/libs/ftp.class.php @@ -48,7 +48,7 @@ /* Constractor */ function ftp() { - $this->debug = FALSE; + $this->debug = false; $this->umask = 0022; $this->timeout = 30; diff --git a/modules/addon/lang/zh-CN.lang.php b/modules/addon/lang/zh-CN.lang.php index d73c19dc1..76404e10c 100644 --- a/modules/addon/lang/zh-CN.lang.php +++ b/modules/addon/lang/zh-CN.lang.php @@ -13,5 +13,5 @@ $lang->addon_history = '更新纪录 '; $lang->about_addon_mid = "可以指定使用插件的对象。
(全部解除表示可用在所有对象。)"; - $lang->about_addon = '插件是加载扩展功能的动作,而不是输出结果组件。
启用/禁用插件,为网站提供强大的功能。'; + $lang->about_addon = '插件就是对动作(Action)的有效控制来给核心程序提供扩展功能的一种组件。
只需启用/禁用操作,即可为网站提供强大的扩展功能。'; ?> diff --git a/modules/admin/admin.admin.controller.php b/modules/admin/admin.admin.controller.php index 7353aebb5..511e29e16 100644 --- a/modules/admin/admin.admin.controller.php +++ b/modules/admin/admin.admin.controller.php @@ -2,35 +2,35 @@ /** * @class adminAdminController * @author zero (zero@nzeo.com) - * @brief admin 모듈의 admin controller class + * @brief admin controller class of admin module **/ class adminAdminController extends admin { /** - * @brief 초기화 + * @brief initialization + * @return none **/ function init() { - // 접속 사용자에 대한 체크 + // forbit access if the user is not an administrator $oMemberModel = &getModel('member'); $logged_info = $oMemberModel->getLoggedInfo(); - - // 관리자가 아니면 금지 if($logged_info->is_admin!='Y') return $this->stop("msg_is_not_administrator"); } /** - * @brief 모든 캐시 파일 재생성 + * @brief Regenerate all cache files + * @return none **/ function procAdminRecompileCacheFile() { $oModuleModel = &getModel('module'); $module_list = $oModuleModel->getModuleList(); - // 개발 디버그 파일들 제거 + // remove debug files FileHandler::removeFile(_XE_PATH_.'files/_debug_message.php'); FileHandler::removeFile(_XE_PATH_.'files/_debug_db_query.php'); FileHandler::removeFile(_XE_PATH_.'files/_db_slow_query.php'); - // 각 모듈마다 돌면서 캐시 파일 제거 + // call recompileCache for each module foreach($module_list as $module) { $oModule = null; $oModule = &getClass($module->module); @@ -41,7 +41,8 @@ } /** - * @brief 관리자 로그아웃 + * @brief Logout + * @return none **/ function procAdminLogout() { $oMemberController = &getController('member'); diff --git a/modules/admin/admin.admin.view.php b/modules/admin/admin.admin.view.php index 27e49f1c4..fbe939f1f 100644 --- a/modules/admin/admin.admin.view.php +++ b/modules/admin/admin.admin.view.php @@ -2,30 +2,28 @@ /** * @class adminAdminView * @author zero (zero@nzeo.com) - * @brief admin 모듈의 admin view class + * @brief admin view class of admin module **/ class adminAdminView extends admin { /** - * @brief 초기화 + * @brief Initilization + * @return none **/ function init() { - // template path 지정 $this->setTemplatePath($this->module_path.'tpl'); - // 접속 사용자에 대한 체크 + // forbit access if the user is not an administrator $oMemberModel = &getModel('member'); $logged_info = $oMemberModel->getLoggedInfo(); - - // 관리자가 아니면 금지 if($logged_info->is_admin!='Y') return $this->stop("msg_is_not_administrator"); - // 관리자용 레이아웃으로 변경 + // change into administration layout $this->setLayoutPath($this->getTemplatePath()); $this->setLayoutFile('layout.html'); - // 설치된 모듈 목록 가져와서 적절히 분리 + // Retrieve the list of installed modules $oModuleModel = &getModel('module'); $installed_module_list = $oModuleModel->getModulesXmlInfo(); @@ -33,7 +31,7 @@ $package_idx = 0; foreach($installed_module_list as $key => $val) { if($val->module == 'admin' || !$val->admin_index_act) continue; - // action 정보 구함 + // get action information $action_spec = $oModuleModel->getModuleActionXml($val->module); $actions = array(); if($action_spec->default_index_act) $actions[] = $action_spec->default_index_act; @@ -47,14 +45,14 @@ $obj->index_act = $val->admin_index_act; if(in_array(Context::get('act'), $actions)) $obj->selected = true; - // 패키지 모듈 + // Packages if($val->category == 'package') { if($package_idx == 0) $obj->position = "first"; else $obj->position = "mid"; $package_modules[] = $obj; $package_idx ++; if($obj->selected) Context::set('package_selected',true); - // 일반 모듈 + // Modules } else { $installed_modules[] = $obj; } @@ -83,17 +81,16 @@ } /** - * @brief 관리자 메인 페이지 출력 + * @brief Display main administration page + * @return none **/ function dispAdminIndex() { - /** - * 최근 뉴스를 가져와서 세팅 - **/ + //Retrieve recent news and set them into context $newest_news_url = sprintf("http://news.xpressengine.com/%s/news.php", Context::getLangType()); $cache_file = sprintf("%sfiles/cache/newest_news.%s.cache.php", _XE_PATH_,Context::getLangType()); if(!file_exists($cache_file) || filemtime($cache_file)+ 60*60 < time()) { - // 네트웍 상태로 데이터를 가져오지 못할 상황을 고려해 일단 filemtime을 변경하여 관리자 페이지 refresh시에 다시 읽ㅇ 오지 않도록 함 - // 뉴스를 보지는 못하지만 관리자 페이지 접속은 이상없도록 함 + // Considering if data cannot be retrieved due to network problem, modify filemtime to prevent trying to reload again when refreshing administration page + // Ensure to access the administration page even though news cannot be displayed FileHandler::writeFile($cache_file,''); FileHandler::getRemoteFile($newest_news_url, $cache_file, null, 1, 'GET', 'text/html', array('REQUESTURL'=>getFullUrl(''))); } @@ -120,31 +117,29 @@ Context::set('download_link', $buff->zbxe_news->attrs->download_link); } - // DB 정보를 세팅 + // DB Information $db_info = Context::getDBInfo(); Context::set('selected_lang', $db_info->lang_type); - // 현재 버젼과 설치 경로 세팅 + // Current Version and Installed Path Context::set('current_version', __ZBXE_VERSION__); Context::set('installed_path', realpath('./')); - // 모듈 목록을 가져옴 + // Get list of modules $oModuleModel = &getModel('module'); $module_list = $oModuleModel->getModuleList(); Context::set('module_list', $module_list); - // 애드온 목록을 가져옴 + // Get list of addons $oAddonModel = &getAdminModel('addon'); $addon_list = $oAddonModel->getAddonList(); Context::set('addon_list', $addon_list); - /** - * 각종 통계를 추출 - **/ + // Get statistics $args->date = date("Ymd000000", time()-60*60*24); $today = date("Ymd"); - // 회원현황 + // Member Status $output = executeQueryArray("admin.getMemberStatus", $args); if($output->data) { foreach($output->data as $var) { @@ -158,7 +153,7 @@ $output = executeQuery("admin.getMemberCount", $args); $status->member->total = $output->data->count; - // 문서현황 + // Document Status $output = executeQueryArray("admin.getDocumentStatus", $args); if($output->data) { foreach($output->data as $var) { @@ -172,7 +167,7 @@ $output = executeQuery("admin.getDocumentCount", $args); $status->document->total = $output->data->count; - // 댓글현황 + // Comment Status $output = executeQueryArray("admin.getCommentStatus", $args); if($output->data) { foreach($output->data as $var) { @@ -186,7 +181,7 @@ $output = executeQuery("admin.getCommentCount", $args); $status->comment->total = $output->data->count; - // 엮인글현황 + // Trackback Status $output = executeQueryArray("admin.getTrackbackStatus", $args); if($output->data) { foreach($output->data as $var) { @@ -200,7 +195,7 @@ $output = executeQuery("admin.getTrackbackCount", $args); $status->trackback->total = $output->data->count; - // 첨부파일현황 + // Attached files Status $output = executeQueryArray("admin.getFileStatus", $args); if($output->data) { foreach($output->data as $var) { @@ -214,7 +209,7 @@ $output = executeQuery("admin.getFileCount", $args); $status->file->total = $output->data->count; - // 게시물 신고현황 + // Reported documents Status $output = executeQueryArray("admin.getDocumentDeclaredStatus", $args); if($output->data) { foreach($output->data as $var) { @@ -228,7 +223,7 @@ $output = executeQuery("admin.getDocumentDeclaredCount", $args); $status->documentDeclared->total = $output->data->count; - // 댓글 신고현황 + // Reported comments Status $output = executeQueryArray("admin.getCommentDeclaredStatus", $args); if($output->data) { foreach($output->data as $var) { @@ -253,7 +248,8 @@ } /** - * @brief 관리자 설정 + * @brief Display Configuration(settings) page + * @return none **/ function dispAdminConfig() { $db_info = Context::getDBInfo(); @@ -272,6 +268,36 @@ $output = executeQuery('module.getSiteInfo', $site_args); Context::set('start_module', $output->data); + $pwd = Context::get('pwd'); + if(!$pwd) $pwd = '/'; + Context::set('pwd',$pwd); + require_once(_XE_PATH_.'libs/ftp.class.php'); + + $ftp_info = Context::getFTPInfo(); + $oFtp = new ftp(); + if($oFtp->ftp_connect('localhost', $ftp_info->ftp_port)){ + if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { + $_list = $oFtp->ftp_rawlist($pwd); + $oFtp->ftp_quit(); + } + } + $list = array(); + if(count($_list) == 0 || !$_list[0]) { + $oFtp = new ftp(); + if($oFtp->ftp_connect($_SERVER['SERVER_NAME'], $ftp_info->ftp_port)){ + if($oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { + $_list = $oFtp->ftp_rawlist($pwd); + $oFtp->ftp_quit(); + } + } + } + if($_list){ + foreach($_list as $k => $v){ + if(strpos($v,'d') === 0) $list[] = substr(strrchr($v,' '),1) . '/'; + } + } + + Context::set('list',$list); Context::set('layout','none'); $this->setTemplateFile('config'); } diff --git a/modules/admin/admin.class.php b/modules/admin/admin.class.php index 003c0585f..89cdbd044 100644 --- a/modules/admin/admin.class.php +++ b/modules/admin/admin.class.php @@ -2,50 +2,53 @@ /** * @class admin * @author zero (zero@nzeo.com) - * @brief admin 모듈의 high class + * @brief base class of admin module **/ class admin extends ModuleObject { /** - * @brief 설치시 추가 작업이 필요할시 구현 + * @brief install admin module + * @return new Object **/ function moduleInstall() { return new Object(); } /** - * @brief 설치가 이상이 없는지 체크하는 method + * @brief if update is necessary it returns true **/ function checkUpdate() { return false; } /** - * @brief 업데이트 실행 + * @brief update module + * @return new Object **/ function moduleUpdate() { return new Object(); } /** - * @brief 캐시 파일 재생성 + * @brief regenerate cache file + * @return none **/ function recompileCache() { - // 템플릿 컴파일 파일 삭제 + // remove compiled templates FileHandler::removeFilesInDir("./files/cache/template_compiled"); - // optimized 파일 삭제 + // remove optimized files FileHandler::removeFilesInDir("./files/cache/optimized"); - // js_filter_compiled 파일 삭제 + // remove js_filter_compiled files FileHandler::removeFilesInDir("./files/cache/js_filter_compiled"); - // queries 파일 삭제 + // remove cached queries FileHandler::removeFilesInDir("./files/cache/queries"); - // ./files/cache/news* 파일 삭제 + // remove ./files/cache/news* files $directory = dir(_XE_PATH_."files/cache/"); while($entry = $directory->read()) { if(substr($entry,0,11)=='newest_news') FileHandler::removeFile("./files/cache/".$entry); diff --git a/modules/admin/lang/jp.lang.php b/modules/admin/lang/jp.lang.php index 387e1ca58..ace53460e 100644 --- a/modules/admin/lang/jp.lang.php +++ b/modules/admin/lang/jp.lang.php @@ -32,10 +32,10 @@ $lang->env_information = '環境情報'; - $lang->current_version = 'インストールバージョン'; + $lang->current_version = 'インストール済みバージョン'; $lang->current_path = 'インストールパス'; $lang->released_version = '最新バージョン'; - $lang->about_download_link = "インストールされたバージョンより新しいバージョンが配布されています。\n「ダウンロード」リンクをクリックするとダウンロード出来ます。"; + $lang->about_download_link = "新しいバージョンが配布されています。\n「ダウンロード」リンクをクリックするとダウンロード出来ます。"; $lang->item_module = 'モジュールリスト'; $lang->item_addon = 'アドオンリスト'; @@ -51,12 +51,11 @@ $lang->cmd_shortcut_management = 'メニューの編集'; - $lang->msg_is_not_administrator = '管理者だけアクセス出来ます'; + $lang->msg_is_not_administrator = '管理者のみアクセス出来ます'; $lang->msg_manage_module_cannot_delete = 'モジュール、アドオン、ウィジェットのショットカットは削除出来ません。'; $lang->msg_default_act_is_null = 'デフォルトの管理者のアクションが指定されていないため、ショットカットを登録することが出来ません。'; $lang->welcome_to_xe = 'XEの管理者ページです。'; - $lang->about_admin_page = "管理者ページはまだ未完成です。\nクローズベータバージョンの期間に、多くの方々からご意見をいただきながら、必ず完成したいと思います。"; $lang->about_lang_env = '初めてサイトに訪問したユーザーに対し、上記の選択した言語でサイトを表示させるためには、必ず下記の「保存」ボタンをクリックして適用して下さい。'; $lang->xe_license = 'XEのライセンスはGPLです。'; @@ -66,7 +65,7 @@ $lang->today = '今日'; $lang->cmd_lang_select = '言語選択'; - $lang->about_cmd_lang_select = '選択された言語だけでサービスを行います。'; + $lang->about_cmd_lang_select = '選択した言語だけでサービスを行います。'; $lang->about_recompile_cache = '要らないかごみのキャッシューファイルを整理します。'; $lang->use_ssl = 'SSL環境設定'; $lang->ssl_options = array( diff --git a/modules/admin/lang/zh-CN.lang.php b/modules/admin/lang/zh-CN.lang.php index 522e25bc2..5e97abaa3 100644 --- a/modules/admin/lang/zh-CN.lang.php +++ b/modules/admin/lang/zh-CN.lang.php @@ -8,8 +8,8 @@ $lang->admin_info = '管理员信息'; $lang->admin_index = '管理首页'; $lang->control_panel = '控制面板'; - $lang->start_module = '启动模块'; - $lang->about_start_module = '您可以指定默认的启动模块。'; + $lang->start_module = '首页模块'; + $lang->about_start_module = '可指定用户访问网站时的默认首页模块。'; $lang->module_category_title = array( 'service' => '应用管理', @@ -30,11 +30,12 @@ $lang->default_url = "XE通行证"; $lang->about_default_url = "请输入默认站点的XE安装地址(ex: http://域名/xe)。
说明:简单的说,就是绑定帐号系统。只需要登录一次,就可以在用站点模块生成的多个子站点中随意漫游。"; + $lang->env_information = "系统信息"; $lang->current_version = "安装版本"; $lang->current_path = "安装路径"; $lang->released_version = "最新版本"; - $lang->about_download_link = "官方网站已发布新版本。\n请点击download链接下载最新版本。"; + $lang->about_download_link = "官方网站已发布最新版本XE。\n请点击[下载]链接下载最新版本。"; $lang->item_module = "模块目录"; $lang->item_addon = "插件目录"; @@ -55,10 +56,8 @@ $lang->msg_default_act_is_null = '没有指定默认管理员的动作,是不能添加到快捷菜单的。'; $lang->welcome_to_xe = 'XE 管理页面'; - $lang->about_admin_page = "后台管理页面未完成"; $lang->about_lang_env = "可以设置显示给首次访问者的同一语言环境。修改语言环境后请点击 [保存] 按钮进行保存。"; - $lang->xe_license = 'XE遵循 GPL协议'; $lang->about_shortcut = '可以删除添加到常用模块中的快捷菜单。'; @@ -77,6 +76,6 @@ $lang->about_use_ssl = "选择性使用选项应用于新用户注册/修改用户信息等已指定的action当中,使用选项应用于所有服务。"; $lang->server_ports = "指定服务器端口"; $lang->about_server_ports = "使用除HTTP(80), HTTPS(443)以外的端口时,必须得指定该服务器端口号。"; - $lang->use_db_session = '使用DB session认证'; - $lang->about_db_session = '使用DBsession认证时系统会把PHPsession保存到数据库。
不使用这个功能会提高服务器应答速度,但读取不了在线人数。'; + $lang->use_db_session = 'DB储存认证会话'; + $lang->about_db_session = '用DB储存认证时的PHP会话。
服务器使用率较少的网站建议不要勾选此项(可提高网站访问速度)。
只是无法统计在线会员。'; ?> diff --git a/modules/admin/tpl/config.html b/modules/admin/tpl/config.html index 6665f90d3..51b3da5c0 100644 --- a/modules/admin/tpl/config.html +++ b/modules/admin/tpl/config.html @@ -3,6 +3,7 @@ + @@ -141,7 +142,46 @@ + +

{$lang->ftp_path_title}

+
+ + + + + + + + + + + + + + + + + + +
{$lang->msg_ftp_installed_realpath}
{_XE_PATH_} +
{$lang->msg_ftp_installed_ftp_realpath}
+ +
+ + + +
+ +
+
+
diff --git a/modules/admin/tpl/css/font.css b/modules/admin/tpl/css/font.css index bc27ce0e3..fa704215f 100755 --- a/modules/admin/tpl/css/font.css +++ b/modules/admin/tpl/css/font.css @@ -11,10 +11,10 @@ #xeAdmin h1.xeAdmin a{ text-decoration:none !important; font-family:Arial; font-size:16px; color:#fff; margin:0; padding:0;} #xeAdmin table th{ color:#666;} #xeAdmin table th a { color:#666;} -#xeAdmin table td{ color:#888;} -#xeAdmin table td a { color:#888;} -#xeAdmin caption{ font-size:11px; font-family:Tahoma; color:#888;} -#xeAdmin div.summary { font-size:11px; font-family:Tahoma; color:#888;} +#xeAdmin table td{ color:#767676;} +#xeAdmin table td a { color:#767676;} +#xeAdmin caption{ font-size:11px; font-family:Tahoma; color:#767676;} +#xeAdmin div.summary { font-size:11px; font-family:Tahoma; color:#767676;} #xeAdmin div.summary strong { font-weight:normal; } #xeAdmin button.text{ font-size:12px;} #xeAdmin em, @@ -31,10 +31,10 @@ #xeAdmin .lnb li a{ color:#fff; font-size:14px; font-family:Dotum, Tahoma;} #xeAdmin .path{ color:#ccc; font-size:11px;} -#xeAdmin .path a{ color:#888; font-size:11px; font-family:Dotum, Sans-serif;} +#xeAdmin .path a{ color:#767676; font-size:11px; font-family:Dotum, Sans-serif;} .e1 .navigation li a{ color:#000; text-decoration:none;} -.e1 .navigation li ul li a{ color:#888;} +.e1 .navigation li ul li a{ color:#767676;} .e1 .navigation li ul li.active a{ font-weight:bold; color:#666;} .e2 .section h2.xeAdmin { font-size:12px; margin:0; padding:0;} @@ -43,15 +43,18 @@ .e2 table tbody th{ font-weight:normal; font-family:Dotum;} .e2 .notice li a{ color:#666; } -.e2 .notice li .date{ color:#888; font:10px Tahoma;} +.e2 .notice li .date{ color:#767676; font:10px Tahoma;} .localNavigation li a{ text-decoration:none !important; color:#666;} .localNavigation li.active a{ font-weight:bold; color:#1e6aac;} #xeAdmin h2.xeAdmin { font-size:12px;} #xeAdmin h3.xeAdmin { font-size:12px; color:#666; margin:0; padding:0;} -#xeAdmin p.summary{ color:#888;} -#xeAdmin p.summary a { text-decoration:none; color:#888; } +#xeAdmin p.summary{ color:#767676;} +#xeAdmin p.summary a { text-decoration:none; color:#767676; } #xeAdmin p.summary.red { color:#A54D4D; } #xeAdmin p.summary.red a { text-decoration:none; color:#A54D4D; } -#xeAdmin div.infoText { color:#888;} +#xeAdmin div.infoText { color:#767676;} +#xeAdmin div.infoText p.warning{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconWarning.gif) no-repeat left top;} +#xeAdmin div.infoText p.update{ margin:0 0 10px 0; padding:0 0 0 25px; background:url(../img/iconRefresh.gif) no-repeat left top;} +#xeAdmin .buttonAction{} diff --git a/modules/admin/tpl/filter/install_ftp_path.xml b/modules/admin/tpl/filter/install_ftp_path.xml new file mode 100644 index 000000000..afaef82e1 --- /dev/null +++ b/modules/admin/tpl/filter/install_ftp_path.xml @@ -0,0 +1,9 @@ + +
+ + + + + + +
diff --git a/modules/admin/tpl/img/iconRefresh.gif b/modules/admin/tpl/img/iconRefresh.gif new file mode 100644 index 000000000..9d1304ccd Binary files /dev/null and b/modules/admin/tpl/img/iconRefresh.gif differ diff --git a/modules/admin/tpl/img/iconWarning.gif b/modules/admin/tpl/img/iconWarning.gif new file mode 100644 index 000000000..822de82cc Binary files /dev/null and b/modules/admin/tpl/img/iconWarning.gif differ diff --git a/modules/admin/tpl/index.html b/modules/admin/tpl/index.html index 23739e662..f4c5dc352 100644 --- a/modules/admin/tpl/index.html +++ b/modules/admin/tpl/index.html @@ -33,7 +33,8 @@ - + + {$val->title} ({$val->module}) {$val->version} @@ -44,18 +45,36 @@ created_table_count != $val->table_count)-->class="alert"> {$val->created_table_count}/{$val->table_count} - need_install || $val->need_update)-->class="alert"> + {$lang->cmd_install} {$lang->cmd_update} - - - {$lang->module_info} + + + + + + {$val->title} ({$val->module}) + {$val->version} + + + {$author->name} + + + created_table_count != $val->table_count)-->class="alert"> + {$val->created_table_count}/{$val->table_count} + + - + {$lang->module_info} + + + diff --git a/modules/autoinstall/autoinstall.admin.controller.php b/modules/autoinstall/autoinstall.admin.controller.php new file mode 100644 index 000000000..a950767c4 --- /dev/null +++ b/modules/autoinstall/autoinstall.admin.controller.php @@ -0,0 +1,293 @@ +package =& $package; + } + + function _download() + { + if($this->package->path == ".") + { + $this->download_file = $this->temp_dir."xe.tar"; + $this->target_path = ""; + $this->download_path = $this->temp_dir; + } + else + { + $subpath = substr($this->package->path,2); + $this->download_file = $this->temp_dir.$subpath.".tar"; + $subpatharr = explode("/", $subpath); + array_pop($subpatharr); + $this->download_path = $this->temp_dir.implode("/", $subpatharr); + $this->target_path = implode("/", $subpatharr); + } + + $postdata = array(); + $postdata["path"] = $this->package->path; + $postdata["module"] = "resourceapi"; + $postdata["act"] = "procResourceapiDownload"; + $buff = FileHandler::getRemoteResource($this->base_url, null, 3, "POST", "application/x-www-form-urlencoded; charset=utf-8", array(), array(), $postdata); + FileHandler::writeFile($this->download_file, $buff); + } + + function install() + { + $this->_download(); + $file_list = $this->_unPack(); + $this->_copyDir($file_list); + + FileHandler::removeDir($this->temp_dir); + return; + } + + function _unPack(){ + require_once(_XE_PATH_.'libs/tar.class.php'); + + $oTar = new tar(); + $oTar->openTAR($this->download_file); + + $_files = $oTar->files; + $file_list = array(); + foreach($_files as $key => $info) { + FileHandler::writeFile($this->download_path."/".$info['name'], $info['file']); + $file_list[] = $info['name']; + } + return $file_list; + } + + function _copyDir(&$file_list){ + $ftp_info = Context::getFTPInfo(); + if(!$ftp_info->ftp_user || !$ftp_info->ftp_password) return new Object(-1,'msg_ftp_invalid_auth_info'); + + require_once(_XE_PATH_.'libs/ftp.class.php'); + + $oFtp = new ftp(); + if(!$oFtp->ftp_connect('localhost', $ftp_info->ftp_port)) return new Object(-1,'msg_ftp_not_connected'); + if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { + $oFtp->ftp_quit(); + return new Object(-1,'msg_ftp_invalid_auth_info'); + } + + $_list = $oFtp->ftp_rawlist($ftp_config->ftp_root_path); + if(count($_list) == 0 || !$_list[0]) { + $oFtp->ftp_quit(); + $oFtp = new ftp(); + if(!$oFtp->ftp_connect($_SERVER['SERVER_NAME'], $ftp_info->ftp_port)) return new Object(-1,'msg_ftp_not_connected'); + if(!$oFtp->ftp_login($ftp_info->ftp_user, $ftp_info->ftp_password)) { + $oFtp->ftp_quit(); + return new Object(-1,'msg_ftp_invalid_auth_info'); + } + } + + $ftp_config = Context::getFTPInfo(); + $target_dir = $ftp_config->ftp_root_path.$this->target_path; + + foreach($file_list as $k => $file){ + $org_file = $file; + if($this->package->path == ".") + { + $file = substr($file,3); + } + $path = FileHandler::getRealPath("./".$this->target_path."/".$file); + $path_list = explode('/', dirname($this->target_path."/".$file)); + + $real_path = "./"; + $ftp_path = $ftp_config->ftp_root_path; + + for($i=0;$iftp_mkdir($ftp_path); + $oFtp->ftp_site("CHMOD 755 ".$path); + } + } + $oFtp->ftp_put($target_dir .'/'. $file, FileHandler::getRealPath($this->download_path."/".$org_file)); + } + $oFtp->ftp_quit(); + + return new Object(); + } + + } + + class autoinstallAdminController extends autoinstall { + + /** + * @brief 초기화 + **/ + function init() { + } + + function checkFileCheckSum($file, $checksum){ + $local_checksum = md5_file(FileHandler::getRealPath($file)); + return ($local_checksum === $checksum); + } + + function _cleanDownloaded($obj){ + FileHandler::removeDir($obj->download_path); + } + + function procAutoinstallAdminUpdateinfo() + { + $oModel = &getModel('autoinstall'); + $item = $oModel->getLatestPackage(); + if($item) + { + $params["updatedate"] = $item->updatedate; + } + + $params["act"] = "getResourceapiUpdate"; + $body = XmlGenerater::generate($params); + $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); + $xml = new XmlParser(); + $xmlDoc = $xml->parse($buff); + $this->updateCategory($xmlDoc); + $this->updatePackages($xmlDoc); + $this->checkInstalled(); + + $this->setMessage("success_updated"); + } + + function checkInstalled() + { + executeQuery("autoinstall.deleteInstalledPackage"); + $oModel =& getModel('autoinstall'); + $packages = $oModel->getPackages(); + foreach($packages as $package) + { + $real_path = FileHandler::getRealPath($package->path); + if(!file_exists($real_path)) { + continue; + } + + if($package->path == ".") + { + $type = "core"; + $version = __ZBXE_VERSION__; + } + else + { + $path_array = explode("/", $package->path); + $target_name = array_pop($path_array); + $type = substr(array_pop($path_array), 0, -1); + switch($type) + { + case "module": + case "addon": + case "layout": + case "widget": + $config_file = "/conf/info.xml"; + break; + case "component": + $config_file = "/info.xml"; + break; + case "skin": + case "widgetstyle": + $config_file = "/skin.xml"; + break; + + default: + continue; + } + $xml = new XmlParser(); + $xmlDoc = $xml->loadXmlFile($real_path.$config_file); + if(!$xmlDoc) continue; + $version = $xmlDoc->{$type}->version->body; + } + + $args = null; + $args->package_srl = $package->package_srl; + $args->version = $package->version; + $args->current_version = $version; + if(version_compare($args->version, $args->current_version, ">")) + { + $args->need_update="Y"; + } + else + { + $args->need_update="N"; + } + + $output = executeQuery("autoinstall.insertInstalledPackage", $args); + } + } + + function procAutoinstallAdminPackageinstall() + { + $package_srls = Context::get('package_srl'); + $oModel =& getModel('autoinstall'); + $packages = explode(',', $package_srls); + foreach($packages as $package_srl) + { + $package = $oModel->getPackage($package_srl); + $oModuleInstaller = new ModuleInstaller($package); + $oModuleInstaller->install(); + } + $this->setMessage('success_installed'); + } + + function updatePackages(&$xmlDoc) + { + $oModel =& getModel('autoinstall'); + if(!$xmlDoc->response->packages->item) return; + if(!is_array($xmlDoc->response->packages->item)) + { + $xmlDoc->response->packages->item = array($xmlDoc->response->packages->item); + } + $targets = array('package_srl', 'updatedate', 'latest_item_srl', 'path', 'version', 'category_srl'); + foreach($xmlDoc->response->packages->item as $item) + { + $args = null; + foreach($targets as $target) + { + $args->{$target} = $item->{$target}->body; + } + if($oModel->getPackage($args->package_srl)) + { + executeQuery("autoinstall.updatePackage", $args); + } + else + { + executeQuery("autoinstall.insertPackage", $args); + } + } + } + + function updateCategory(&$xmlDoc) + { + executeQuery("autoinstall.deleteCategory", $args); + $oModel =& getModel('autoinstall'); + if(!is_array($xmlDoc->response->categorylist->item)) + { + $xmlDoc->response->categorylist->item = array($xmlDoc->response->categorylist->item); + } + foreach($xmlDoc->response->categorylist->item as $item) + { + $args = null; + $args->category_srl = $item->category_srl->body; + $args->parent_srl = $item->parent_srl->body; + $args->title = $item->title->body; + executeQuery("autoinstall.insertCategory", $args); + } + } + } +?> diff --git a/modules/autoinstall/autoinstall.admin.view.php b/modules/autoinstall/autoinstall.admin.view.php new file mode 100644 index 000000000..4f3f56e42 --- /dev/null +++ b/modules/autoinstall/autoinstall.admin.view.php @@ -0,0 +1,194 @@ +module_path); + Context::set('original_site', $this->original_site); + Context::set('uri', $this->uri); + $this->setTemplatePath($template_path); + } + + function rearrange(&$item, &$targets) + { + $ret = null; + foreach($targets as $target) + { + $ret->{$target} = $item->{$target}->body; + } + return $ret; + } + + function rearranges($items) + { + if(!is_array($items)) $items = array($items); + $item_list = array(); + $targets = array('category_srl', 'package_srl', 'item_screenshot_url', 'package_voted', 'package_voter', 'package_description', 'package_downloaded', 'item_regdate', 'title', 'item_version', 'package_star'); + $targetpackages = array(); + foreach($items as $item) + { + $targetpackages[$item->package_srl->body] = 0; + } + $oModel = &getModel('autoinstall'); + $packages = $oModel->getInstalledPackages(array_keys($targetpackages)); + + foreach($items as $item) + { + $v = $this->rearrange($item, $targets); + if($packages[$v->package_srl]) + { + $v->current_version = $packages[$v->package_srl]->current_version; + $v->need_update = $packages[$v->package_srl]->need_update; + } + $item_list[$v->package_srl] = $v; + } + + return $item_list; + } + + function dispAutoinstallAdminInstall() { + $package_srl = Context::get('package_srl'); + if(!$package_srl) return $this->dispAutoinstallAdminIndex(); + $ftp_info = Context::getFTPInfo(); + if(!$ftp_info->ftp_root_path) Context::set('show_ftp_note', true); + + $params["act"] = "getResourceapiInstallInfo"; + $params["package_srl"] = $package_srl; + $xmlDoc = XmlGenerater::getXmlDoc($params); + $oModel = &getModel('autoinstall'); + + $targetpackages = array(); + if($xmlDoc) + { + $xmlPackage =& $xmlDoc->response->package; + $package->package_srl = $xmlPackage->package_srl->body; + $package->title = $xmlPackage->title->body; + $package->package_description = $xmlPackage->package_description->body; + $package->version = $xmlPackage->version->body; + $package->path = $xmlPackage->path->body; + if($xmlPackage->depends) + { + if(!is_array($xmlPackage->depends->item)) $xmlPackage->depends->item = array($xmlPackage->depends->item); + $package->depends = array(); + foreach($xmlPackage->depends->item as $item) + { + $dep_item = null; + $dep_item->package_srl = $item->package_srl->body; + $dep_item->title = $item->title->body; + $dep_item->version = $item->version->body; + $dep_item->path = $item->path->body; + $package->depends[] = $dep_item; + $targetpackages[$dep_item->package_srl] = 1; + } + $packages = $oModel->getInstalledPackages(array_keys($targetpackages)); + $package->deplist = ""; + foreach($package->depends as $key => $dep) + { + if(!$packages[$dep->package_srl]) { + $package->depends[$key]->installed = false; + $package->package_srl .= ",". $dep->package_srl; + } + else { + $package->depends[$key]->installed = true; + $package->depends[$key]->cur_version = $packages[$dep->package_srl]->version; + if(version_compare($dep->version, $packages[$dep->package_srl]->version, ">")) + { + $package->need_update = true; + $package->package_srl .= ",". $dep->package_srl; + } + else + { + $package->need_update = false; + } + } + } + } + $installedPackage = $oModel->getInstalledPackage($package_srl); + if($installedPackage) { + $package->installed = true; + $package->cur_version = $installedPackage->current_version; + $package->need_update = version_compare($package->version, $installedPackage->current_version, ">"); + } + + Context::set("package", $package); + } + $this->setTemplateFile('install'); + } + + function dispAutoinstallAdminIndex() { + $oModuleModel = &getModel('module'); + $config = $oModuleModel->getModuleConfig('autoinstall'); + $ftp_info = Context::getFTPInfo(); + if(!$ftp_info->ftp_root_path) Context::set('show_ftp_note', true); + + $this->setTemplateFile('index'); + + $params = array(); + $params["act"] = "getResourceapiLastupdate"; + $body = XmlGenerater::generate($params); + $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); + $xml_lUpdate = new XmlParser(); + $lUpdateDoc = $xml_lUpdate->parse($buff); + $updateDate = $lUpdateDoc->response->updatedate->body; + + $oModel = &getModel('autoinstall'); + $item = $oModel->getLatestPackage(); + if(!$item || $item->updatedate < $updateDate ) + { + Context::set('need_update', true); + return; + } + + + $page = Context::get('page'); + if(!$page) $page = 1; + Context::set('page', $page); + + $order_type = Context::get('order_type'); + if(!in_array($order_type, array('asc', 'desc'))) $order_type = 'desc'; + Context::set('order_type', $order_type); + + $order_target = Context::get('order_target'); + if(!in_array($order_target, array('newest', 'download', 'popular'))) $order_target = 'newest'; + Context::set('order_target', $order_target); + + $search_keyword = Context::get('search_keyword'); + + $childrenList = Context::get('childrenList'); + $category_srl = Context::get('category_srl'); + if($childrenList) $params["category_srl"] = $childrenList; + else if($category_srl) $params["category_srl"] = $category_srl; + + $params["act"] = "getResourceapiPackagelist"; + $params["order_target"] = $order_target; + $params["order_type"] = $order_type; + $params["page"] = $page; + if($search_keyword) + { + $params["search_keyword"] = $search_keyword; + } + $xmlDoc = XmlGenerater::getXmlDoc($params); + if($xmlDoc && $xmlDoc->response->packagelist->item) + { + $item_list = $this->rearranges($xmlDoc->response->packagelist->item); + Context::set('item_list', $item_list); + $array = array('total_count', 'total_page', 'cur_page', 'page_count', 'first_page', 'last_page'); + $page_nav = $this->rearrange($xmlDoc->response->page_navigation, $array); + $page_navigation = new PageHandler($page_nav->total_count, $page_nav->total_page, $page_nav->cur_page, $page_nav->page_count); + Context::set('page_navigation', $page_navigation); + } + + $oModel = &getModel('autoinstall'); + $categories = &$oModel->getCategoryList(); + Context::set('categories', $categories); + Context::set('tCount', $oModel->getPackageCount(null)); + } + } +?> diff --git a/modules/autoinstall/autoinstall.class.php b/modules/autoinstall/autoinstall.class.php new file mode 100644 index 000000000..221de96b9 --- /dev/null +++ b/modules/autoinstall/autoinstall.class.php @@ -0,0 +1,64 @@ +'; + if(!is_array($params)) return null; + $params["module"] = "resourceapi"; + foreach($params as $key => $val) + { + $xmlDoc .= sprintf("<%s>", $key, $val, $key); + } + $xmlDoc .= ""; + return $xmlDoc; + } + + function getXmlDoc(&$params) + { + $body = XmlGenerater::generate($params); + $buff = FileHandler::getRemoteResource($this->uri, $body, 3, "POST", "application/xml"); + if(!$buff) return; + $xml = new XmlParser(); + $xmlDoc = $xml->parse($buff); + return $xmlDoc; + } + } + + class autoinstall extends ModuleObject { + var $uri = "http://download.xpressengine.com/"; + var $original_site = "http://www.xpressengine.com/"; + var $tmp_dir = './files/cache/autoinstall/'; + + /** + * @brief 설치시 추가 작업이 필요할시 구현 + **/ + function moduleInstall() { + } + + /** + * @brief 설치가 이상이 없는지 체크하는 method + **/ + function checkUpdate() { + return false; + } + + /** + * @brief 업데이트 실행 + **/ + function moduleUpdate() { + return new Object(0, 'success_updated'); + } + + /** + * @brief 캐시 파일 재생성 + **/ + function recompileCache() { + } + } +?> diff --git a/modules/autoinstall/autoinstall.model.php b/modules/autoinstall/autoinstall.model.php new file mode 100644 index 000000000..c2d0378f0 --- /dev/null +++ b/modules/autoinstall/autoinstall.model.php @@ -0,0 +1,117 @@ +category_srl = $category_srl; + $output = executeQueryArray("autoinstall.getCategory", $args); + if(!$output->data) return null; + return array_shift($output->data); + } + + function getPackages() + { + $output = executeQueryArray("autoinstall.getPackages"); + if(!$output->data) return array(); + return $output->data; + } + + function getInstalledPackage($package_srl) + { + $args->package_srl = $package_srl; + $output = executeQueryArray("autoinstall.getInstalledPackage", $args); + if(!$output->data) return null; + return array_shift($output->data); + } + + function getPackage($package_srl) + { + $args->package_srl = $package_srl; + $output = executeQueryArray("autoinstall.getPackage", $args); + if(!$output->data) return null; + return array_shift($output->data); + } + + function getCategoryList() + { + $output = executeQueryArray("autoinstall.getCategories"); + if(!$output->toBool() || !$output->data) return array(); + + $categoryList = array(); + foreach($output->data as $category) + { + $category->children = array(); + $categoryList[$category->category_srl] = $category; + } + + $depth0 = array(); + foreach($categoryList as $key => $category) + { + if($category->parent_srl) + { + $categoryList[$category->parent_srl]->children[] =& $categoryList[$key]; + } + else + { + $depth0[] = $key; + } + } + $resultList = array(); + foreach($depth0 as $category_srl) + { + $this->setDepth($categoryList[$category_srl], 0, $categoryList, $resultList); + } + return $resultList; + } + + function getPackageCount($category_srl) + { + $args->category_srl = $category_srl; + $output = executeQuery("autoinstall.getPackageCount", $args); + if(!$output->data) return 0; + return $output->data->count; + } + + function setDepth(&$item, $depth, &$list, &$resultList) + { + $resultList[$item->category_srl] =& $item; + $item->depth = $depth; + $siblingList = $item->category_srl; + foreach($item->children as $child) + { + $siblingList .= ",".$this->setDepth($list[$child->category_srl], $depth+1, $list, $resultList); + } + if(count($item->children) < 1) + { + $item->nPackages = $this->getPackageCount($item->category_srl); + } + $item->childrenList = $siblingList; + return $siblingList; + } + + function getLatestPackage() { + $output = executeQueryArray("autoinstall.getLatestPackage"); + if(!$output->data) return null; + return array_shift($output->data); + } + + function getInstalledPackages(&$package_list) { + $args->package_list = &$package_list; + $output = executeQueryArray("autoinstall.getInstalledPackages", $args); + $result = array(); + if(!$output->data) return $result; + foreach($output->data as $value) + { + $result[$value->package_srl] = $value; + } + return $result; + } + + } +?> diff --git a/modules/autoinstall/autoinstall.view.php b/modules/autoinstall/autoinstall.view.php new file mode 100644 index 000000000..6de79151b --- /dev/null +++ b/modules/autoinstall/autoinstall.view.php @@ -0,0 +1,26 @@ +install($file, $checksum); + return $output; + } + } +?> diff --git a/modules/autoinstall/conf/info.xml b/modules/autoinstall/conf/info.xml new file mode 100644 index 000000000..b2b1575df --- /dev/null +++ b/modules/autoinstall/conf/info.xml @@ -0,0 +1,22 @@ + + + 쉬운 설치 + Easy-Installation + 在线安装 + 관리자 모드에서 클릭으로 모듈/스킨/레이아웃/위젯/위젯스타일 등을 설치하는 모듈입니다. + With this module, you can install and upgrade your programs including modules, skins, layouts, etc., from www.xpressengine.com by one-click. + 很方便的在管理页面一键安装XE相关模块(模块/皮肤/布局/控件/控件样式等)。 + 0.1 + 2009-11-11 + system + + haneul + haneul + haneul + + + sol + sol + sol + + diff --git a/modules/autoinstall/conf/module.xml b/modules/autoinstall/conf/module.xml new file mode 100644 index 000000000..a4283f729 --- /dev/null +++ b/modules/autoinstall/conf/module.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/modules/autoinstall/lang/en.lang.php b/modules/autoinstall/lang/en.lang.php new file mode 100644 index 000000000..c273a0d84 --- /dev/null +++ b/modules/autoinstall/lang/en.lang.php @@ -0,0 +1,30 @@ +autoinstall = 'Easy-install'; + $lang->about_autoinstall = 'It helps you install/upgrade progams(skins) of XE.'; + $lang->package_update = 'Recent Update'; + $lang->package_downloaded_count = 'Download Count'; + $lang->need_update = "You need to update package list."; + + $lang->order_newest = "Newest"; + $lang->order_popular = "Popular"; + $lang->order_download = "Download"; + $lang->success_installed = "Installations succeeded."; + $lang->view_all_package = "View All"; + $lang->description_ftp_note = "If FTP configuration is not set, installation would not work. Please configure FTP information"; + $lang->description_update = "If you recently upgrade or install programs without easy installation module, please press update button to keep information of the programs updated."; + $lang->install = "Install"; + $lang->update = "Update"; + $lang->current_version = "Installed version"; + $lang->depending_programs = "This program depends on "; + $lang->require_update = "Update is required."; + $lang->require_installation = "Installation is required."; + $lang->description_install = "Installation process also install/update programs which this program depends on"; + $lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)"; + $lang->path = "Path"; +?> diff --git a/modules/autoinstall/lang/ko.lang.php b/modules/autoinstall/lang/ko.lang.php new file mode 100644 index 000000000..0d71fd533 --- /dev/null +++ b/modules/autoinstall/lang/ko.lang.php @@ -0,0 +1,30 @@ +autoinstall = '쉬운 설치'; + $lang->about_autoinstall = 'XpressEngine의 여러 프로그램을 쉽게 설치/업그레이드할 수 있도록 도와주는 모듈입니다.'; + $lang->package_update = '최근 업데이트'; + $lang->package_downloaded_count = '전체 다운로드'; + $lang->need_update = "업데이트가 필요합니다."; + + $lang->order_newest = "신규 등록"; + $lang->order_popular = "인기"; + $lang->order_download = "다운로드"; + $lang->success_installed = "설치가 성공하였습니다."; + $lang->view_all_package = "전체 보기"; + $lang->description_ftp_note = "FTP 설정이 안되어있으면 설치가 진행되지 않습니다. FTP설정을 해주세요"; + $lang->description_update = "새로 설치한 모듈의 버전 정보등은 업데이트를 눌러주시면 반영됩니다."; + $lang->install = "설치"; + $lang->update = "업데이트"; + $lang->current_version = "현재 설치 버전"; + $lang->depending_programs = "의존하고 있는 프로그램"; + $lang->require_update = "업데이트가 필요합니다."; + $lang->require_installation = "설치가 필요합니다."; + $lang->description_install = "설치를 진행하면, 이 프로그램이 의존하고 있는 모든 프로그램을 업데이트/설치 합니다."; + $lang->description_download = "FTP를 이용할 수 없는 경우, 직접 다운로드 하여 해당 path에 설치하셔야 합니다. (한칸 상위에서 압축을 푸시면 됩니다. ./modules/board의 경우 ./modules에서 tar를 푸세요)"; + $lang->path = "설치경로"; +?> diff --git a/modules/autoinstall/lang/zh-CN.lang.php b/modules/autoinstall/lang/zh-CN.lang.php new file mode 100644 index 000000000..87adc73a8 --- /dev/null +++ b/modules/autoinstall/lang/zh-CN.lang.php @@ -0,0 +1,30 @@ +autoinstall = 'Autoinstall'; + $lang->about_autoinstall = 'Autoinstall是XpressEngine的自动安装模块。'; + $lang->package_update = '最新更新'; + $lang->package_downloaded_count = '总下载'; + $lang->need_update = "有新的更新。"; + + $lang->order_newest = "最新发布"; + $lang->order_popular = "热门"; + $lang->order_download = "下载"; + $lang->success_installed = "安装成功!"; + $lang->view_all_package = "查看全部"; + $lang->description_ftp_note = "请务必完成FTP设置,否则将无法在线安装(更新)相关模块。"; + $lang->description_update = "新安装(更新)模块的版本信息,点击Update按钮后才能正常显示。"; + $lang->install = "Install"; + $lang->update = "Update"; + $lang->depending_programs = "This program depends on "; + $lang->require_update = "Update is required."; + $lang->require_installation = "Installation is required."; + $lang->description_install = "Installation process also install/update programs which this program depends on"; + $lang->current_version = "Installed version"; + $lang->description_download = "When FTP is disabled, you should download it and extract it into target path. (if target path is ./modules/board, extract it at ./modules)"; + $lang->path = "Path"; +?> diff --git a/modules/autoinstall/queries/deleteCategory.xml b/modules/autoinstall/queries/deleteCategory.xml new file mode 100644 index 000000000..f0cbea6d6 --- /dev/null +++ b/modules/autoinstall/queries/deleteCategory.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/modules/autoinstall/queries/deleteInstalledPackage.xml b/modules/autoinstall/queries/deleteInstalledPackage.xml new file mode 100644 index 000000000..feb3cc3df --- /dev/null +++ b/modules/autoinstall/queries/deleteInstalledPackage.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/autoinstall/queries/getCategories.xml b/modules/autoinstall/queries/getCategories.xml new file mode 100644 index 000000000..be66b8c1e --- /dev/null +++ b/modules/autoinstall/queries/getCategories.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/autoinstall/queries/getCategory.xml b/modules/autoinstall/queries/getCategory.xml new file mode 100644 index 000000000..99d8e7275 --- /dev/null +++ b/modules/autoinstall/queries/getCategory.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/autoinstall/queries/getInstalledPackage.xml b/modules/autoinstall/queries/getInstalledPackage.xml new file mode 100644 index 000000000..4c2680c49 --- /dev/null +++ b/modules/autoinstall/queries/getInstalledPackage.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/autoinstall/queries/getInstalledPackages.xml b/modules/autoinstall/queries/getInstalledPackages.xml new file mode 100644 index 000000000..f0d8afe07 --- /dev/null +++ b/modules/autoinstall/queries/getInstalledPackages.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/autoinstall/queries/getLatestPackage.xml b/modules/autoinstall/queries/getLatestPackage.xml new file mode 100644 index 000000000..9ce02710d --- /dev/null +++ b/modules/autoinstall/queries/getLatestPackage.xml @@ -0,0 +1,16 @@ + + +
+ + + + + + + + + + + + + diff --git a/modules/autoinstall/queries/getPackage.xml b/modules/autoinstall/queries/getPackage.xml new file mode 100644 index 000000000..ff00dd252 --- /dev/null +++ b/modules/autoinstall/queries/getPackage.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/autoinstall/queries/getPackageCount.xml b/modules/autoinstall/queries/getPackageCount.xml new file mode 100644 index 000000000..f1f3e05d0 --- /dev/null +++ b/modules/autoinstall/queries/getPackageCount.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/autoinstall/queries/getPackages.xml b/modules/autoinstall/queries/getPackages.xml new file mode 100644 index 000000000..e85b91ce6 --- /dev/null +++ b/modules/autoinstall/queries/getPackages.xml @@ -0,0 +1,8 @@ + + +
+ + + + + diff --git a/modules/autoinstall/queries/insertCategory.xml b/modules/autoinstall/queries/insertCategory.xml new file mode 100644 index 000000000..87e240d6f --- /dev/null +++ b/modules/autoinstall/queries/insertCategory.xml @@ -0,0 +1,10 @@ + + +
+ + + + + + + diff --git a/modules/autoinstall/queries/insertInstalledPackage.xml b/modules/autoinstall/queries/insertInstalledPackage.xml new file mode 100644 index 000000000..b05ddacc9 --- /dev/null +++ b/modules/autoinstall/queries/insertInstalledPackage.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/autoinstall/queries/insertPackage.xml b/modules/autoinstall/queries/insertPackage.xml new file mode 100644 index 000000000..4b0148c0f --- /dev/null +++ b/modules/autoinstall/queries/insertPackage.xml @@ -0,0 +1,13 @@ + + +
+ + + + + + + + + + diff --git a/modules/autoinstall/queries/updateCategory.xml b/modules/autoinstall/queries/updateCategory.xml new file mode 100644 index 000000000..ec2bbcf28 --- /dev/null +++ b/modules/autoinstall/queries/updateCategory.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/autoinstall/queries/updateInstalledPackage.xml b/modules/autoinstall/queries/updateInstalledPackage.xml new file mode 100644 index 000000000..26f9c5926 --- /dev/null +++ b/modules/autoinstall/queries/updateInstalledPackage.xml @@ -0,0 +1,13 @@ + + +
+ + + + + + + + + + diff --git a/modules/autoinstall/queries/updatePackage.xml b/modules/autoinstall/queries/updatePackage.xml new file mode 100644 index 000000000..7ae6aefd0 --- /dev/null +++ b/modules/autoinstall/queries/updatePackage.xml @@ -0,0 +1,15 @@ + + +
+ + + + + + + + + + + + diff --git a/modules/autoinstall/schemas/autoinstall_installed_packages.xml b/modules/autoinstall/schemas/autoinstall_installed_packages.xml new file mode 100644 index 000000000..84b2ef4d0 --- /dev/null +++ b/modules/autoinstall/schemas/autoinstall_installed_packages.xml @@ -0,0 +1,6 @@ +
+ + + + +
diff --git a/modules/autoinstall/schemas/autoinstall_packages.xml b/modules/autoinstall/schemas/autoinstall_packages.xml new file mode 100644 index 000000000..cf1e102a9 --- /dev/null +++ b/modules/autoinstall/schemas/autoinstall_packages.xml @@ -0,0 +1,9 @@ + + + + + + + +
+ diff --git a/modules/autoinstall/schemas/autoinstall_remote_categories.xml b/modules/autoinstall/schemas/autoinstall_remote_categories.xml new file mode 100644 index 000000000..6e25f12b9 --- /dev/null +++ b/modules/autoinstall/schemas/autoinstall_remote_categories.xml @@ -0,0 +1,5 @@ + + + + +
diff --git a/modules/autoinstall/tpl/config.html b/modules/autoinstall/tpl/config.html new file mode 100644 index 000000000..1edb85f3e --- /dev/null +++ b/modules/autoinstall/tpl/config.html @@ -0,0 +1,37 @@ + + + +
+ + + + + + + + + + + + + + + + +
설치된 XE의 절대경로
{_XE_PATH_} +
설치된 XE의 FTP 절대경로 설정
+ +
+ + + +
+ +
+
diff --git a/modules/autoinstall/tpl/css/autoinstall.css b/modules/autoinstall/tpl/css/autoinstall.css new file mode 100644 index 000000000..e4c9a5f11 --- /dev/null +++ b/modules/autoinstall/tpl/css/autoinstall.css @@ -0,0 +1,55 @@ +@charset "utf-8"; +/* NHN > UIT Center > Open UI Tech Team > Jeong Chan Myeong(dece24@nhncorp.com) */ +.install{ border-top:1px solid #ddd; *zoom:1;} +.install:after{ content:""; display:block; clear:both;} + +.aside { width:180px; float:left; margin-right:30px; padding-bottom:30px; } + +.aside .categoryBox { background-color:#F8F8F8; padding:10px; width:160px; overflow:hidden; } +.aside .categoryBox h3 { padding:0 0 10px 0; margin:0 0 10px 0; white-space:nowrap; overflow:hidden; color:#48494E; font-size:11px; font-weight:normal; background:transparent url(../img/hrE1.gif) repeat-x scroll left bottom;} +.aside .categoryBox h3 a { color:#48494E; font-size:12px; font-weight:bold; text-decoration:none; } +.aside .categoryBox ul.category { margin:10px 0 0 0; padding:0; list-style:none; } +.aside .categoryBox ul.category li { margin:0 0 10px 10px; } +.aside .categoryBox ul.category li a.selected { font-weight:bold; color:#2893BB; } +.aside .categoryBox ul.category li a { text-decoration:none; color:#7B7575; } +.aside .categoryBox ul.category li span { font-family:verdana; font-size:10px; color:#999; } + +.aside .categoryBox ul.resourceManage { margin:0; padding:10px 0 0 0; list-style:none; background:transparent url(../img/hrE1.gif) repeat-x scroll left top; } +.aside .categoryBox ul.resourceManage li { background:url(../img/btnManage.gif) no-repeat 2px 2px; padding-left:14px; white-space:nowrap; overflow:hidden; margin-bottom:10px; } +.aside .categoryBox ul.resourceManage li a { text-decoration:none; color:#747474; } +.aside .categoryBox ul.resourceManage li a.selected { font-weight:bold; } + +.aside .searchBox { padding:10px 0; text-align:center; background:transparent url(../img/hrE1.gif) repeat-x scroll left top;} +.aside .searchBox input.input { border:1px solid #ddd; width:120px; height:16px;} +.aside .searchBox input.submit { vertical-align:middle; } + +.install .content { position:relative; *zoom:1; overflow:hidden; width:auto; float:none; margin:0;} + +.updateList, +.updateList th, +.updateList td{ border:0; vertical-align:top; text-align:left; padding:10px 0;} +.updateList {width:100%; height:100px; table-layout:fixed;} +.updateList th, +.updateList td{ border-bottom:1px dotted #ddd;} +.updateList th img { border:1px solid #ccc; padding:2px; overflow:hidden; *zoom:1; } +.updateList td { padding:10px 0 0 0;} +.updateList td .title{ position:relative;} +.updateList td .title h3 { padding:0; margin:0 0 5px 0; font-size:12px;} +.updateList td .title a {text-decoration:none; color:#333 !important; } +.updateList td .title .button{ position:absolute; top:0; right:0;} +.updateList td .info p{ margin:0 0 5px 0; line-height:1.5;} +.updateList td .info p.desc{ margin:0 100px 10px 0;} +.updateList td .info p.meta{ font-size:11px;} +.updateList td .info p.meta span{ display:inline-block; line-height:1; padding:0 5px 0 9px;} +.updateList td .info p.meta .reputation{ padding:0 5px 0 0;} +.updateList td .info p.meta .reputation img{ float:left; margin:-1px 0 0 0;} +.updateList td .info p.meta .reputation span{ padding:0 0 0 5px;} +.updateList td .info p.meta .lastUpdate{ border-left:1px solid #ddd;} +.updateList td .info p.meta .download{ border-left:1px solid #ddd;} + +ul.listOrder { position:relative; overflow:hidden; margin:0; padding:10px 0; text-align:left; background:transparent url(../img/hrE1.gif) repeat-x scroll left bottom;} +ul.listOrder.asc li.arrow { background:url(../img/arrUp.gif) no-repeat right 2px; padding-right:10px; } +ul.listOrder.desc li.arrow { background:url(../img/arrDown.gif) no-repeat right 2px; padding-right:10px; } +ul.listOrder li { position:relative; left:-1px; display:inline; margin:0; padding:0 5px 0 9px; border-left:1px solid #ddd;} +ul.listOrder li.arrow a { text-decoration:none; font-weight:bold; color:#2893BB; } +ul.listOrder li a { text-decoration:none; color:#7B7575; } diff --git a/modules/autoinstall/tpl/filter/insert_config.xml b/modules/autoinstall/tpl/filter/insert_config.xml new file mode 100644 index 000000000..08b866eca --- /dev/null +++ b/modules/autoinstall/tpl/filter/insert_config.xml @@ -0,0 +1,9 @@ + +
+ + + + + + +
diff --git a/modules/autoinstall/tpl/header.html b/modules/autoinstall/tpl/header.html new file mode 100644 index 000000000..6d226d988 --- /dev/null +++ b/modules/autoinstall/tpl/header.html @@ -0,0 +1 @@ +

{$lang->autoinstall} Beta

diff --git a/modules/autoinstall/tpl/img/arrDown.gif b/modules/autoinstall/tpl/img/arrDown.gif new file mode 100644 index 000000000..f99fafc05 Binary files /dev/null and b/modules/autoinstall/tpl/img/arrDown.gif differ diff --git a/modules/autoinstall/tpl/img/arrUp.gif b/modules/autoinstall/tpl/img/arrUp.gif new file mode 100644 index 000000000..f948d2d58 Binary files /dev/null and b/modules/autoinstall/tpl/img/arrUp.gif differ diff --git a/modules/autoinstall/tpl/img/arrowPagination.gif b/modules/autoinstall/tpl/img/arrowPagination.gif new file mode 100644 index 000000000..53bf40388 Binary files /dev/null and b/modules/autoinstall/tpl/img/arrowPagination.gif differ diff --git a/modules/autoinstall/tpl/img/btn_search.gif b/modules/autoinstall/tpl/img/btn_search.gif new file mode 100644 index 000000000..ed7b21a93 Binary files /dev/null and b/modules/autoinstall/tpl/img/btn_search.gif differ diff --git a/modules/autoinstall/tpl/img/hrE1.gif b/modules/autoinstall/tpl/img/hrE1.gif new file mode 100644 index 000000000..fc3a410f6 Binary files /dev/null and b/modules/autoinstall/tpl/img/hrE1.gif differ diff --git a/modules/autoinstall/tpl/img/starOff.gif b/modules/autoinstall/tpl/img/starOff.gif new file mode 100644 index 000000000..3357deb77 Binary files /dev/null and b/modules/autoinstall/tpl/img/starOff.gif differ diff --git a/modules/autoinstall/tpl/img/starOn.gif b/modules/autoinstall/tpl/img/starOn.gif new file mode 100644 index 000000000..5378d5098 Binary files /dev/null and b/modules/autoinstall/tpl/img/starOn.gif differ diff --git a/modules/autoinstall/tpl/index.html b/modules/autoinstall/tpl/index.html new file mode 100644 index 000000000..f4106888d --- /dev/null +++ b/modules/autoinstall/tpl/index.html @@ -0,0 +1,21 @@ + + + +
+ +

{$lang->description_ftp_note} FTP Setup

+ + +

{$lang->need_update}

+ +

{$lang->description_update}

+ +

+
+ +
+ + + + +
diff --git a/modules/autoinstall/tpl/install.html b/modules/autoinstall/tpl/install.html new file mode 100644 index 000000000..65798ef2d --- /dev/null +++ b/modules/autoinstall/tpl/install.html @@ -0,0 +1,24 @@ + + + +
+

{$package->title} ver. {$package->version} ( {$lang->current_version}: {$package->cur_version} ({$lang->require_update}) {$lang->require_installation} )

+ +
+
{$lang->depending_programs} :
+
{$dep->title} ver. {$dep->version} - + {$lang->current_version}: {$dep->cur_version} ({$lang->require_update}) {$lang->require_installation} + {$lang->download} ({$lang->path} : {$dep->path}) +
+
+ + +

{$lang->description_download}. (FTP Setup)

+

{$lang->path} : {$package->path}

+

{$lang->download}

+ +

{$lang->description_install}.

+

{$lang->install}

+ + +
diff --git a/modules/autoinstall/tpl/js/autoinstall.js b/modules/autoinstall/tpl/js/autoinstall.js new file mode 100644 index 000000000..4e65fd53f --- /dev/null +++ b/modules/autoinstall/tpl/js/autoinstall.js @@ -0,0 +1,26 @@ +function completeUpdate(ret_obj) { + alert(ret_obj['message']); + location.reload(); +} + +function doUpdate() { + var params = new Array(); + exec_xml('autoinstall', 'procAutoinstallAdminUpdateinfo', params, completeUpdate); +} + +function doInstallPackage(package_srl) { + var params = new Array(); + params['package_srl'] = package_srl; + exec_xml('autoinstall', 'procAutoinstallAdminPackageinstall', params, completeInstall); +} + +function completeUpdateNoMsg(ret_obj) { + location.reload(); +} + +function completeInstall(ret_obj) { + alert(ret_obj['message']); + var params = new Array(); + exec_xml('autoinstall', 'procAutoinstallAdminUpdateinfo', params, completeUpdateNoMsg); +} + diff --git a/modules/autoinstall/tpl/leftBox.html b/modules/autoinstall/tpl/leftBox.html new file mode 100644 index 000000000..e65b9f190 --- /dev/null +++ b/modules/autoinstall/tpl/leftBox.html @@ -0,0 +1,47 @@ +
+
+

{$lang->view_all_package} ({$tCount})

+ {@ $_pDepth = 0;} + +
    + + + +
+ + + {@ $_pDepth = $val->depth} + +
  • + + category_srl == $category_srl)--> class="selected">{$val->title} + + category_srl == $category_srl)--> class="selected">{$val->title} + + + ({$val->nPackages}) + + + {@$_pDepth++} +
      + + + + + +
    + +
  • + + +
    + +
    diff --git a/modules/autoinstall/tpl/list.html b/modules/autoinstall/tpl/list.html new file mode 100644 index 000000000..f698697bd --- /dev/null +++ b/modules/autoinstall/tpl/list.html @@ -0,0 +1,79 @@ +
    +
      + + {@$_order_type = 'asc'}{@$_order_type = 'desc'} + + {@$_order_type = 'desc'} + +
    • class="arrow">{$lang->order_newest}
    • + + {@$_order_type = 'asc'}{@$_order_type = 'desc'} + + {@$_order_type = 'desc'} + +
    • class="arrow">{$lang->order_download}
    • + + {@$_order_type = 'asc'}{@$_order_type = 'desc'} + + {@$_order_type = 'desc'} + +
    • class="arrow">{$lang->order_popular}
    • +
    + + + + + + {@ $target_url = $original_site."?mid=download&package_srl=".$val->package_srl; } + + + + +
    + +
    +

    {cut_str(htmlspecialchars($val->package_description),200)}

    +

    + + + + + + + + + {sprintf("%0.1f",$val->package_voted/$val->package_voter*2)}/{number_format($val->package_voter)} + + {$lang->package_update} {zdate($val->item_regdate, "Y-m-d H:i")} + {$lang->package_downloaded_count} : {number_format($val->package_downloaded)} +

    +
    +
    + + +
    diff --git a/modules/comment/lang/zh-CN.lang.php b/modules/comment/lang/zh-CN.lang.php index 122bb6016..cc2782b50 100644 --- a/modules/comment/lang/zh-CN.lang.php +++ b/modules/comment/lang/zh-CN.lang.php @@ -7,7 +7,7 @@ $lang->cmd_comment_do = '将把此评论..'; - $lang->comment_list = '评论目录'; + $lang->comment_list = '评论列表'; $lang->cmd_toggle_checked_comment = '反选'; $lang->cmd_delete_checked_comment = '删除所选'; diff --git a/modules/communication/lang/jp.lang.php b/modules/communication/lang/jp.lang.php index 6d391af38..840101d98 100644 --- a/modules/communication/lang/jp.lang.php +++ b/modules/communication/lang/jp.lang.php @@ -33,7 +33,7 @@ $lang->cmd_view_friend = '友達リスト'; $lang->cmd_add_friend = '友達登録'; $lang->cmd_view_message_box = 'メッセージ'; - $lang->cmd_store = "保存"; + $lang->cmd_store = '保存'; $lang->cmd_add_friend_group = '友達グループ追加'; $lang->cmd_rename_friend_group = '友達グループ名変更'; diff --git a/modules/communication/skins/default/messages.html b/modules/communication/skins/default/messages.html index 714202d16..1b7736cf6 100644 --- a/modules/communication/skins/default/messages.html +++ b/modules/communication/skins/default/messages.html @@ -32,7 +32,7 @@ - {$message->nick_name} ({$message->user_id}) + {$message->nick_name} ({$message->user_id}) {zdate($message->regdate, "Y.m.d H:i:s")} diff --git a/modules/document/document.controller.php b/modules/document/document.controller.php index fcd639545..6e1fee85f 100644 --- a/modules/document/document.controller.php +++ b/modules/document/document.controller.php @@ -1287,7 +1287,8 @@ 'header("Cache-Control: post-check=0, pre-check=0", false); '. 'header("Pragma: no-cache"); '. '%s'. - '%s'. + '%s '. + '$oContext->close();'. '?>'. '%s', $header_script, diff --git a/modules/document/lang/zh-CN.lang.php b/modules/document/lang/zh-CN.lang.php index b1664b8d3..66aaec20a 100644 --- a/modules/document/lang/zh-CN.lang.php +++ b/modules/document/lang/zh-CN.lang.php @@ -5,12 +5,11 @@ * @brief 文章(document)模块语言包 **/ - $lang->document_list = '主题目录'; + $lang->document_list = '主题列表'; $lang->thumbnail_type = '缩略图生成方式'; - $lang->thumbnail_crop = '裁减'; - $lang->thumbnail_ratio = '比例'; + $lang->thumbnail_crop = '裁减(按指定大小裁剪图片)'; + $lang->thumbnail_ratio = '比例(按原图比例缩略处理)'; $lang->cmd_delete_all_thumbnail = '删除全部缩略图'; - $lang->move_target_module = "移动目标模块"; $lang->title_bold = '粗标题'; $lang->title_color = '标题颜色'; $lang->new_document_count = '新帖'; @@ -20,8 +19,10 @@ $lang->category_color = '分类颜色'; $lang->expand = '展开'; $lang->category_group_srls = '用户组'; + $lang->cmd_make_child = '添加下级分类'; $lang->cmd_enable_move_category = "分类顺序(勾选后用鼠标拖动分类项)"; + $lang->about_category_title = '请输入分类名。'; $lang->about_expand = '选择此项将维持展开状态。'; $lang->about_category_group_srls = '所选用户组才可以查看此分类。'; @@ -40,6 +41,8 @@ $lang->msg_is_secret = '这是密帖!'; $lang->msg_checked_document_is_deleted = '删除了%d个文章。'; + $lang->move_target_module = '目标模块'; + // 管理页面查找的对象 $lang->search_target_list = array( 'title' => '标题', @@ -62,8 +65,34 @@ 'last_update' => '最近更新日期', 'ipaddress' => 'IP 地址', ); + $lang->alias = "Alias"; $lang->history = "编辑记录"; $lang->about_use_history = "设置启用编辑记录与否。启用将记录修改主题版本,并可以复原。"; $lang->trace_only = "只留痕迹"; + + $lang->cmd_trash = "回收箱"; + $lang->cmd_restore = "复原"; + $lang->cmd_restore_all = "全部复原"; + + $lang->in_trash = "回收箱"; + $lang->trash_nick_name = "操作人昵称"; + $lang->trash_date = "删除日期"; + $lang->trash_description = "说明"; + + // 管理页面回收箱搜索对象 + $lang->search_target_trash_list = array( + 'title' => '标题', + 'content' => '内容', + 'user_id' => '用户名', + 'member_srl' => '会员编号', + 'user_name' => '姓名', + 'nick_name' => '昵称', + 'trash_member_srl' => '操作人会员编号', + 'trash_user_name' => '操作人用户名', + 'trash_nick_name' => '操作人昵称', + 'trash_date' => '删除日期', + 'trash_ipaddress' => '操作人IP地址', + ); + ?> diff --git a/modules/editor/components/multimedia_link/info.xml b/modules/editor/components/multimedia_link/info.xml index 6b7781497..7242345ee 100644 --- a/modules/editor/components/multimedia_link/info.xml +++ b/modules/editor/components/multimedia_link/info.xml @@ -12,7 +12,7 @@ エディターに拡張子が「wmv,avi,flv」などのマルチメディアコンテンツを追加、または属性の修正ができます。 插入wmv,avi,flv等多媒体文件或修改其相应属性 。 It can add multimedia data like wmv,avi,flv to editor or change the attribution of multimedia data. - Se pueden agregar datos multimedia como wmv, avi, flv al editor o cambiar la atribución de datos multimedia. + Se pueden agregar datos multimedia como wmv, avi, flv al editor o cambiar la atribución de datos multimedia. Это может добавить мультимедиа данные как wmv,avi,flv в редактор или изменить параметры данных мультимедиа. 可新增 wmv、avi,flv等多媒體檔案或修改其相關屬性。 Chèn Media dạng '.wmv,.avi,.flv,.mp3,.wma' vào bài viết. @@ -20,7 +20,7 @@ 2007-02-28 - zero + zero zero zero zero diff --git a/modules/editor/components/multimedia_link/lang/zh-TW.lang.php b/modules/editor/components/multimedia_link/lang/zh-TW.lang.php index ec32d25db..76f34f417 100644 --- a/modules/editor/components/multimedia_link/lang/zh-TW.lang.php +++ b/modules/editor/components/multimedia_link/lang/zh-TW.lang.php @@ -10,4 +10,8 @@ $lang->multimedia_width = "寬度"; $lang->multimedia_height = "高度"; $lang->multimedia_auto_start = "自動播放"; + + $lang->multimedia_wmode_window = '總是在上'; + $lang->multimedia_wmode_opaque = '背景不透明'; + $lang->multimedia_wmode_transparent = '透明背景'; ?> diff --git a/modules/editor/editor.admin.view.php b/modules/editor/editor.admin.view.php index 0b437d7cb..3eba4369e 100644 --- a/modules/editor/editor.admin.view.php +++ b/modules/editor/editor.admin.view.php @@ -61,8 +61,9 @@ // 모듈 카테고리 목록을 구함 $module_categories = $oModuleModel->getModuleCategories(); + if(!is_array($mid_list)) $mid_list = array($mid_list); foreach($mid_list as $module_srl => $module) { - $module_categories[$module->module_category_srl]->list[$module_srl] = $module; + if($module) $module_categories[$module->module_category_srl]->list[$module_srl] = $module; } } else { $module_categories[0]->list = $mid_list; diff --git a/modules/editor/lang/en.lang.php b/modules/editor/lang/en.lang.php index 06c3c0b82..a1f832bc6 100644 --- a/modules/editor/lang/en.lang.php +++ b/modules/editor/lang/en.lang.php @@ -118,6 +118,7 @@ $lang->edit->help_align_left = 'Align left'; $lang->edit->help_align_center = 'Align center'; $lang->edit->help_align_right = 'Align right'; + $lang->edit->help_align_justify = 'Align justity'; $lang->edit->help_add_indent = 'Add indent'; $lang->edit->help_remove_indent = 'Remove indent'; $lang->edit->help_list_number = 'Apply number list'; @@ -210,6 +211,7 @@ $lang->edit->minimize_list = 'Minimize'; $lang->edit->move = 'Move'; + $lang->edit->refresh = 'Refresh'; $lang->edit->materials = 'Materials'; $lang->edit->temporary_savings = 'Temporary Saved List'; @@ -221,7 +223,7 @@ $lang->edit->paging_next_help = 'Move to next page.'; $lang->edit->toc = 'Table of Contents'; - $lang->edit->close_help = '도움말 닫기'; + $lang->edit->close_help = 'Close Help'; $lang->edit->confirm_submit_without_saving = 'There is paragraphs that were not saved.\\nProceed anyway?'; ?> diff --git a/modules/editor/lang/es.lang.php b/modules/editor/lang/es.lang.php index 6e7a0cd77..4c9614c6b 100644 --- a/modules/editor/lang/es.lang.php +++ b/modules/editor/lang/es.lang.php @@ -114,6 +114,7 @@ $lang->edit->help_align_left = 'Margen izquierdo'; $lang->edit->help_align_center = 'Margen central'; $lang->edit->help_align_right = 'Margen derecho'; + $lang->edit->help_align_justify = 'Align justity'; $lang->edit->help_add_indent = 'Anadir tabulación'; $lang->edit->help_remove_indent = 'Quitar tabulación'; $lang->edit->help_list_number = 'Aplicar la lista con números'; @@ -206,6 +207,7 @@ $lang->edit->minimize_list = '최소화'; $lang->edit->move = '이동'; + $lang->edit->refresh = 'Refresh'; $lang->edit->materials = '글감보관함'; $lang->edit->temporary_savings = '임시저장목록'; diff --git a/modules/editor/lang/fr.lang.php b/modules/editor/lang/fr.lang.php index 9cdb7fbe5..15f814d1a 100644 --- a/modules/editor/lang/fr.lang.php +++ b/modules/editor/lang/fr.lang.php @@ -118,6 +118,7 @@ $lang->edit->help_align_left = 'Aligner à gauche'; $lang->edit->help_align_center = 'Aligner centr'; $lang->edit->help_align_right = 'Aligner droite'; + $lang->edit->help_align_justify = 'Align justity'; $lang->edit->help_add_indent = 'Ajouter un Rentré'; $lang->edit->help_remove_indent = 'Enlever un Rentré'; $lang->edit->help_list_number = 'Appliquer la liste numroté'; @@ -210,6 +211,7 @@ $lang->edit->minimize_list = '최소화'; $lang->edit->move = '이동'; + $lang->edit->refresh = 'Refresh'; $lang->edit->materials = '글감보관함'; $lang->edit->temporary_savings = '임시저장목록'; diff --git a/modules/editor/lang/jp.lang.php b/modules/editor/lang/jp.lang.php index 89e026ce8..2aa2c0dbc 100644 --- a/modules/editor/lang/jp.lang.php +++ b/modules/editor/lang/jp.lang.php @@ -121,6 +121,7 @@ $lang->edit->help_align_left = 'テキストを左揃えで表示します。'; $lang->edit->help_align_center = 'テキストを中央揃えで表示します。'; $lang->edit->help_align_right = 'テキストを右揃えで表示します。'; + $lang->edit->help_align_justify = 'Align justity'; $lang->edit->help_add_indent = 'インデントを増やします。'; $lang->edit->help_remove_indent = 'インデントを減らします。'; $lang->edit->help_list_number = '番号付リスト'; @@ -213,19 +214,18 @@ $lang->edit->move = '移動'; $lang->edit->refresh = '再読み込み'; - $lang->edit->materials = '資料箱'; + $lang->edit->materials = '資料箱'; $lang->edit->temporary_savings = '下書きリスト'; $lang->edit->drag_here = '下のツールリストから段落のタイプを選んで追加できます。
    マウスでドラッグをすると、右の資料箱からこの枠に文書を追加できます。'; - $lang->edit->paging_prev = '前へ'; $lang->edit->paging_next = '次へ'; $lang->edit->paging_prev_help = '前のページへ移動します。'; $lang->edit->paging_next_help = '次のページへ移動します。'; $lang->edit->toc = 'リスト'; - $lang->edit->close_help = '도움말 닫기'; + $lang->edit->close_help = 'ヘルプを閉じる'; - $lang->edit->confirm_submit_without_saving = '저장하지 않은 단락이 있습니다.\\n그냥 전송하시겠습니까?'; + $lang->edit->confirm_submit_without_saving = 'まだ保存してない内容があります。\\nそのまま転送して宜しいでしょうか?'; ?> diff --git a/modules/editor/lang/ko.lang.php b/modules/editor/lang/ko.lang.php index 8f0abe00a..06f953cea 100644 --- a/modules/editor/lang/ko.lang.php +++ b/modules/editor/lang/ko.lang.php @@ -121,6 +121,7 @@ $lang->edit->help_align_left = '왼쪽 정렬을 합니다.'; $lang->edit->help_align_center = '가운데 정렬을 합니다.'; $lang->edit->help_align_right = '오른쪽 정렬을 합니다.'; + $lang->edit->help_align_justify = '양쪽 정렬을 합니다.'; $lang->edit->help_add_indent = '단락의 들여쓰기 수준을 높입니다.'; $lang->edit->help_remove_indent = '단락의 들여쓰기 수준을 낮춥니다.'; $lang->edit->help_list_number = '숫자로된 목록을 적용합니다.'; diff --git a/modules/editor/lang/ru.lang.php b/modules/editor/lang/ru.lang.php index 92f788ec4..5241fe718 100644 --- a/modules/editor/lang/ru.lang.php +++ b/modules/editor/lang/ru.lang.php @@ -114,6 +114,7 @@ $lang->edit->help_align_left = 'Выровнять по левому краю'; $lang->edit->help_align_center = 'Выровнять по центру'; $lang->edit->help_align_right = 'Выровнять по правому краю'; + $lang->edit->help_align_justify = 'Align justity'; $lang->edit->help_add_indent = 'Добавить отступ'; $lang->edit->help_remove_indent = 'Удалить отступ'; $lang->edit->help_list_number = 'Применить числовой список'; @@ -206,6 +207,7 @@ $lang->edit->minimize_list = '최소화'; $lang->edit->move = '이동'; + $lang->edit->refresh = 'Refresh'; $lang->edit->materials = '글감보관함'; $lang->edit->temporary_savings = '임시저장목록'; diff --git a/modules/editor/lang/vi.lang.php b/modules/editor/lang/vi.lang.php index cbb20903d..d7e7a2a46 100644 --- a/modules/editor/lang/vi.lang.php +++ b/modules/editor/lang/vi.lang.php @@ -120,6 +120,7 @@ $lang->edit->help_align_left = 'Căn trái'; $lang->edit->help_align_center = 'Căn giữa'; $lang->edit->help_align_right = 'Căn phải'; + $lang->edit->help_align_justify = 'Align justity'; $lang->edit->help_add_indent = 'Thụt vào'; $lang->edit->help_remove_indent = 'Giãn ra'; $lang->edit->help_list_number = 'Thứ tự số'; @@ -212,6 +213,7 @@ $lang->edit->minimize_list = 'Thu nhỏ'; $lang->edit->move = 'Di chuyển'; + $lang->edit->refresh = 'Refresh'; $lang->edit->materials = 'Vật liệu'; $lang->edit->temporary_savings = 'Danh sách lưu tạm thời'; diff --git a/modules/editor/lang/zh-CN.lang.php b/modules/editor/lang/zh-CN.lang.php index f297480ac..0724d4ea2 100644 --- a/modules/editor/lang/zh-CN.lang.php +++ b/modules/editor/lang/zh-CN.lang.php @@ -1,229 +1,231 @@ - - * @brief 网页编辑器(editor) 模块语言包 - **/ - - $lang->editor = '网页编辑器'; - $lang->component_name = '组件'; - $lang->component_version = '版本'; - $lang->component_author = '作者'; - $lang->component_link = '链接'; - $lang->component_date = '编写日期'; - $lang->component_license = '版权'; - $lang->component_history = '更新日志'; - $lang->component_description = '说明'; - $lang->component_extra_vars = '变数设置'; - $lang->component_grant = '权限设置'; - $lang->content_style = 'Content Style'; - $lang->content_font = 'Content Font'; - $lang->content_font_size = '문서 폰트 크기'; - - $lang->about_component = '组件简介'; - $lang->about_component_grant = '可以设置除默认组件外的扩展组件使用权限
    (全部解除时任何用户都可以使用)。'; - $lang->about_component_mid = '可以指定使用编辑器组件的对象。
    (全部解除时任何用户都可以使用)。'; - - $lang->msg_component_is_not_founded = '找不到%s 组件说明!'; - $lang->msg_component_is_inserted = '您选择的组件已插入!'; - $lang->msg_component_is_first_order = '您选择的组件已到最上端位置!'; - $lang->msg_component_is_last_order = '您选择的组件已到最下端位置!'; - $lang->msg_load_saved_doc = "有自动保存的内容, 确定要恢复吗?\n发布主题后,自动保存的文本将会被删除。"; - $lang->msg_auto_saved = '已自动保存!'; - - $lang->cmd_disable = '非激活'; - $lang->cmd_enable = '激活'; - - $lang->editor_skin = '编辑器皮肤'; - $lang->upload_file_grant = '文件上传权限'; - $lang->enable_default_component_grant = '默认组件使用权限'; - $lang->enable_component_grant = '组件使用权限'; - $lang->enable_html_grant = 'HTML编辑权限'; - $lang->enable_autosave = '内容自动保存'; - $lang->height_resizable = '高度调整'; - $lang->editor_height = '编辑器高度'; - - $lang->about_editor_skin = '可以选择编辑器皮肤。'; - $lang->about_content_style = '문서 편집 및 내용 출력시 원하는 서식을 지정할 수 있습니다'; - $lang->about_content_font = '문서 편집 및 내용 출력시 원하는 폰트를 지정할 수 있습니다.
    지정하지 않으면 사용자 설정에 따르게 됩니다
    ,(콤마)로 여러 폰트를 지정할 수 있습니다.'; - $lang->about_content_font_size = '문서 편집 및 내용 출력시 원하는 폰트의 크기를 지정할 수 있습니다.
    12px, 1em등 단위까지 포함해서 입력해주세요.'; - $lang->about_upload_file_grant = '可以设置上传文件的权限(全部解除为无限制)。'; - $lang->about_default_component_grant = '可以设置编辑器默认组件的使用权限(全部解除为无限制)。'; - $lang->about_editor_height = '可以指定编辑器的默认高度。'; - $lang->about_editor_height_resizable = '允许用户拖动编辑器高度。'; - $lang->about_enable_html_grant = 'HTML代码编辑权限设置。'; - $lang->about_enable_autosave = '发表主题时激活内容自动保存功能。'; - - $lang->edit->fontname = '字体'; - $lang->edit->fontsize = '大小'; - $lang->edit->use_paragraph = '段落功能'; - $lang->edit->fontlist = array( - '宋体'=>'宋体', - '黑体'=>'黑体', - '楷体_GB2312'=>'楷体', - '仿宋_GB2312'=>'仿宋', - '隶书'=>'隶书', - '幼圆'=>'幼圆', - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', - ); - - $lang->edit->header = '样式'; - $lang->edit->header_list = array( - 'h1' => '标题 1', - 'h2' => '标题 2', - 'h3' => '标题 3', - 'h4' => '标题 4', - 'h5' => '标题 5', - 'h6' => '标题 6', - ); - - $lang->edit->submit = '确认'; - - $lang->edit->fontcolor = '文本颜色'; - $lang->edit->fontbgcolor = '背景颜色'; - $lang->edit->bold = '粗体'; - $lang->edit->italic = '斜体'; - $lang->edit->underline = '下划线'; - $lang->edit->strike = '取消线'; - $lang->edit->sup = '上标'; - $lang->edit->sub = '下标'; - $lang->edit->redo = '恢复'; - $lang->edit->undo = '撤销'; - $lang->edit->align_left = '左对齐'; - $lang->edit->align_center = '居中对齐'; - $lang->edit->align_right = '右对齐'; - $lang->edit->align_justify = '两端对齐'; - $lang->edit->add_indent = '增加缩进'; - $lang->edit->remove_indent = '减少缩进'; - $lang->edit->list_number = '有序列表'; - $lang->edit->list_bullet = '无序列表'; - $lang->edit->remove_format = '删除文字格式'; - - $lang->edit->help_fontcolor = '文本颜色'; - $lang->edit->help_fontbgcolor = '背景颜色'; - $lang->edit->help_bold = '粗体'; - $lang->edit->help_italic = '斜体'; - $lang->edit->help_underline = '下划线'; - $lang->edit->help_strike = '取消线'; - $lang->edit->help_sup = '上标'; - $lang->edit->help_sub = '下标'; - $lang->edit->help_redo = '恢复'; - $lang->edit->help_undo = '撤销'; - $lang->edit->help_align_left = '左对齐'; - $lang->edit->help_align_center = '居中对齐'; - $lang->edit->help_align_right = '右对齐'; - $lang->edit->help_add_indent = '增加缩进'; - $lang->edit->help_remove_indent = '减少缩进'; - $lang->edit->help_list_number = '有序列表'; - $lang->edit->help_list_bullet = '无序列表'; - $lang->edit->help_use_paragraph = '分段请按 ctrl+回车. (发表主题快捷键:alt+S)'; - - $lang->edit->url = '插入链接'; - $lang->edit->blockquote = '插入注释框'; - $lang->edit->table = '表格'; - $lang->edit->image = '图片'; - $lang->edit->multimedia = '视频'; - $lang->edit->emoticon = '表情图标'; - - $lang->edit->upload = '上传'; - $lang->edit->upload_file = '上传附件'; - $lang->edit->link_file = '插入附件'; - $lang->edit->delete_selected = '删除所选'; - - $lang->edit->icon_align_article = '占一个段落'; - $lang->edit->icon_align_left = '文本左侧'; - $lang->edit->icon_align_middle = '居中对齐'; - $lang->edit->icon_align_right = '文本右侧'; - - $lang->about_dblclick_in_editor = '双击背景, 文本, 图片, 引用即可对其相关组件进行详细设置。'; - - - $lang->edit->rich_editor = '所见即所得编辑器'; - $lang->edit->html_editor = 'HTML 编辑器'; - $lang->edit->extension ='扩展组建'; - $lang->edit->help = '帮助'; - $lang->edit->help_command = '快捷键说明'; + + * @brief 网页编辑器(editor) 模块语言包 + **/ + + $lang->editor = '网页编辑器'; + $lang->component_name = '组件'; + $lang->component_version = '版本'; + $lang->component_author = '作者'; + $lang->component_link = '链接'; + $lang->component_date = '编写日期'; + $lang->component_license = '版权'; + $lang->component_history = '更新日志'; + $lang->component_description = '说明'; + $lang->component_extra_vars = '变数设置'; + $lang->component_grant = '权限设置'; + $lang->content_style = '文档样式'; + $lang->content_font = '文档字体'; + $lang->content_font_size = '字体大小'; + + $lang->about_component = '组件简介'; + $lang->about_component_grant = '可以设置除默认组件外的扩展组件使用权限
    (全部解除时任何用户都可以使用)。'; + $lang->about_component_mid = '可以指定使用编辑器组件的对象。
    (全部解除时任何用户都可以使用)。'; + + $lang->msg_component_is_not_founded = '找不到%s 组件说明!'; + $lang->msg_component_is_inserted = '您选择的组件已插入!'; + $lang->msg_component_is_first_order = '您选择的组件已到最上端位置!'; + $lang->msg_component_is_last_order = '您选择的组件已到最下端位置!'; + $lang->msg_load_saved_doc = "有自动保存的内容, 确定要恢复吗?\n发布主题后,自动保存的文本将会被删除。"; + $lang->msg_auto_saved = '已自动保存!'; + + $lang->cmd_disable = '非激活'; + $lang->cmd_enable = '激活'; + + $lang->editor_skin = '编辑器皮肤'; + $lang->upload_file_grant = '文件上传权限'; + $lang->enable_default_component_grant = '默认组件使用权限'; + $lang->enable_component_grant = '组件使用权限'; + $lang->enable_html_grant = 'HTML编辑权限'; + $lang->enable_autosave = '内容自动保存'; + $lang->height_resizable = '高度调整'; + $lang->editor_height = '编辑器高度'; + + $lang->about_editor_skin = '可以选择编辑器皮肤。'; + $lang->about_content_style = '可以指定编辑或打印文档时的文档样式。'; + $lang->about_content_font = '可以指定编辑或打印文档时的文档字体,不指定随用户设置。
    多个字体可以用逗号(,)区分输入。'; + $lang->about_content_font_size = '可以指定编辑或打印文档时的文档字体大小。
    指定时请包含字体单位(如12px, 1em)。'; + $lang->about_upload_file_grant = '可以设置上传文件的权限(全部解除为无限制)。'; + $lang->about_default_component_grant = '可以设置编辑器默认组件的使用权限(全部解除为无限制)。'; + $lang->about_editor_height = '可以指定编辑器的默认高度。'; + $lang->about_editor_height_resizable = '允许用户拖动编辑器高度。'; + $lang->about_enable_html_grant = 'HTML代码编辑权限设置。'; + $lang->about_enable_autosave = '发表主题时激活内容自动保存功能。'; + + $lang->edit->fontname = '字体'; + $lang->edit->fontsize = '大小'; + $lang->edit->use_paragraph = '段落功能'; + $lang->edit->fontlist = array( + '宋体'=>'宋体', + '黑体'=>'黑体', + '楷体_GB2312'=>'楷体', + 'Arial'=>'Arial', + 'Arial Black'=>'Arial Black', + 'Tahoma'=>'Tahoma', + 'Verdana'=>'Verdana', + 'Sans-serif'=>'Sans-serif', + 'Serif'=>'Serif', + 'Monospace'=>'Monospace', + 'Cursive'=>'Cursive', + 'Fantasy'=>'Fantasy', + ); + + $lang->edit->header = '样式'; + $lang->edit->header_list = array( + 'h1' => '标题 1', + 'h2' => '标题 2', + 'h3' => '标题 3', + 'h4' => '标题 4', + 'h5' => '标题 5', + 'h6' => '标题 6', + ); + + $lang->edit->submit = '确认'; + + $lang->edit->fontcolor = '文本颜色'; + $lang->edit->fontbgcolor = '背景颜色'; + $lang->edit->bold = '粗体'; + $lang->edit->italic = '斜体'; + $lang->edit->underline = '下划线'; + $lang->edit->strike = '取消线'; + $lang->edit->sup = '上标'; + $lang->edit->sub = '下标'; + $lang->edit->redo = '恢复'; + $lang->edit->undo = '撤销'; + $lang->edit->align_left = '左对齐'; + $lang->edit->align_center = '居中对齐'; + $lang->edit->align_right = '右对齐'; + $lang->edit->align_justify = '两端对齐'; + $lang->edit->add_indent = '增加缩进'; + $lang->edit->remove_indent = '减少缩进'; + $lang->edit->list_number = '有序列表'; + $lang->edit->list_bullet = '无序列表'; + $lang->edit->remove_format = '删除文字格式'; + + $lang->edit->help_remove_format = '清除格式。'; + $lang->edit->help_strike_through = '取消线。'; + $lang->edit->help_align_full = '两端对齐。'; + + $lang->edit->help_fontcolor = '文本颜色。'; + $lang->edit->help_fontbgcolor = '背景颜色。'; + $lang->edit->help_bold = '粗体'; + $lang->edit->help_italic = '斜体'; + $lang->edit->help_underline = '下划线'; + $lang->edit->help_strike = '取消线'; + $lang->edit->help_sup = '上标'; + $lang->edit->help_sub = '下标'; + $lang->edit->help_redo = '恢复'; + $lang->edit->help_undo = '撤销'; + $lang->edit->help_align_left = '左对齐'; + $lang->edit->help_align_center = '居中对齐'; + $lang->edit->help_align_right = '右对齐'; + $lang->edit->help_align_justify = '两端对齐'; + $lang->edit->help_add_indent = '增加缩进'; + $lang->edit->help_remove_indent = '减少缩进'; + $lang->edit->help_list_number = '有序列表'; + $lang->edit->help_list_bullet = '无序列表'; + $lang->edit->help_use_paragraph = '分段请按 Ctrl+回车. (发表主题快捷键:Alt+S)'; + + $lang->edit->url = '链接'; + $lang->edit->blockquote = '注释框'; + $lang->edit->table = '表格'; + $lang->edit->image = '图片'; + $lang->edit->multimedia = '视频'; + $lang->edit->emoticon = '表情图标'; + + $lang->edit->upload = '上传'; + $lang->edit->upload_file = '上传附件'; + $lang->edit->link_file = '插入附件'; + $lang->edit->delete_selected = '删除所选'; + + $lang->edit->icon_align_article = '占一个段落'; + $lang->edit->icon_align_left = '文本左侧'; + $lang->edit->icon_align_middle = '居中对齐'; + $lang->edit->icon_align_right = '文本右侧'; + + $lang->about_dblclick_in_editor = '双击背景, 文本, 图片, 引用即可对其相关组件进行详细设置。'; + + $lang->edit->rich_editor = '常规'; + $lang->edit->html_editor = 'HTML'; + $lang->edit->extension ='扩展组件'; + $lang->edit->help = '帮助'; + $lang->edit->help_command = '快捷键说明'; + + $lang->edit->lineheight = '行间距'; + $lang->edit->fontbgsampletext = '我爱中华!'; + + $lang->edit->hyperlink = '链接'; + $lang->edit->target_blank = '新窗口'; + + $lang->edit->quotestyle1 = '左侧实线'; + $lang->edit->quotestyle2 = '引用符号'; + $lang->edit->quotestyle3 = '实线'; + $lang->edit->quotestyle4 = '实线 + 背景'; + $lang->edit->quotestyle5 = '粗实线'; + $lang->edit->quotestyle6 = '虚线'; + $lang->edit->quotestyle7 = '虚线 + 背景'; + $lang->edit->quotestyle8 = '取消应用'; + + + $lang->edit->jumptoedit = '跳转'; + $lang->edit->set_sel = '表格大小'; + $lang->edit->row = '行'; + $lang->edit->col = '列'; + $lang->edit->add_one_row = '添加1行'; + $lang->edit->del_one_row = '删除1行'; + $lang->edit->add_one_col = '添加1列'; + $lang->edit->del_one_col = '删除1列'; + + $lang->edit->table_config = '表格属性'; + $lang->edit->border_width = '表格边框'; + $lang->edit->border_color = '边框颜色'; + $lang->edit->add = '加'; + $lang->edit->del = '减'; + $lang->edit->search_color = '修改颜色'; + $lang->edit->table_backgroundcolor = '背景颜色'; + $lang->edit->special_character = '特殊字符'; + $lang->edit->insert_special_character = '插入特殊字符'; + $lang->edit->close_special_character = '关闭'; + $lang->edit->symbol = '基本符号'; + $lang->edit->number_unit = '数字/单位'; + $lang->edit->circle_bracket = '数字序号'; + $lang->edit->korean = '韩文'; + $lang->edit->greece = '希腊'; + $lang->edit->Latin = '拉丁'; + $lang->edit->japan = '日文'; + $lang->edit->selected_symbol = '被选字符'; + + $lang->edit->search_replace = '查找/替换'; + $lang->edit->close_search_replace = '关闭'; + $lang->edit->replace_all = '全部替换'; + $lang->edit->search_words = '查找内容'; + $lang->edit->replace_words = '替换为'; + $lang->edit->next_search_words = '查找下一个'; + $lang->edit->edit_height_control = '调整输入框大小'; + + $lang->edit->merge_cells = '合并单元格'; + $lang->edit->split_row = '跨行'; + $lang->edit->split_col = '跨列'; - $lang->edit->lineheight = '줄간격'; - $lang->edit->fontbgsampletext = '가나다'; - - $lang->edit->hyperlink = '하이퍼링크'; - $lang->edit->target_blank = '새창으로'; - - $lang->edit->quotestyle1 = '왼쪽 실선'; - $lang->edit->quotestyle2 = '인용 부호'; - $lang->edit->quotestyle3 = '실선'; - $lang->edit->quotestyle4 = '실선 + 배경'; - $lang->edit->quotestyle5 = '굵은 실선'; - $lang->edit->quotestyle6 = '점선'; - $lang->edit->quotestyle7 = '점선 + 배경'; - $lang->edit->quotestyle8 = '적용 취소'; - - - $lang->edit->jumptoedit = '편집 도구모음 건너뛰기'; - $lang->edit->set_sel = '칸 수 지정'; - $lang->edit->row = '행'; - $lang->edit->col = '열'; - $lang->edit->add_one_row = '1행추가'; - $lang->edit->del_one_row = '1행삭제'; - $lang->edit->add_one_col = '1열추가'; - $lang->edit->del_one_col = '1열삭제'; - - $lang->edit->table_config = '표 속성 지정'; - $lang->edit->border_width = '테두리 굵기'; - $lang->edit->border_color = '테두리 색'; - $lang->edit->add = '더하기'; - $lang->edit->del = '빼기'; - $lang->edit->search_color = '색상찾기'; - $lang->edit->table_backgroundcolor = '표 배경색'; - $lang->edit->special_character = '특수문자'; - $lang->edit->insert_special_character = '특수문자 삽입'; - $lang->edit->close_special_character = '특수문자 레이어 닫기'; - $lang->edit->symbol = '일반기호'; - $lang->edit->number_unit = '숫자와 단위'; - $lang->edit->circle_bracket = '원,괄호'; - $lang->edit->korean = '한글'; - $lang->edit->greece = '그리스'; - $lang->edit->Latin = '라틴어'; - $lang->edit->japan = '일본어'; - $lang->edit->selected_symbol = '선택한 기호'; - - $lang->edit->search_replace = '찾기/바꾸기'; - $lang->edit->close_search_replace = '찾기/바꾸기 레이어 닫기'; - $lang->edit->replace_all = '모두바꾸기'; - $lang->edit->search_words = '찾을단어'; - $lang->edit->replace_words = '바꿀단어'; - $lang->edit->next_search_words = '다음찾기'; - $lang->edit->edit_height_control = '입력창 크기 조절'; - - $lang->edit->merge_cells = '셀 병합'; - $lang->edit->split_row = '행 분할'; - $lang->edit->split_col = '열 분할'; + $lang->edit->toggle_list = '展开/折叠列表'; + $lang->edit->minimize_list = '最小化'; - $lang->edit->toggle_list = '목록 접기/펼치기'; - $lang->edit->minimize_list = '최소화'; + $lang->edit->move = '移动'; + $lang->edit->refresh = '刷新'; + $lang->edit->materials = '素材库'; + $lang->edit->temporary_savings = '临时保存列表'; - $lang->edit->move = '이동'; - $lang->edit->materials = '글감보관함'; - $lang->edit->temporary_savings = '임시저장목록'; - - $lang->edit->drag_here = '아래의 단락추가 툴바에서 원하는 유형의 단락을 추가해 글 쓰기를 시작하세요.
    글감 보관함에 글이 있으면 이곳으로 끌어 넣기 할 수 있습니다.'; + $lang->edit->drag_here = '请点击编辑器工具栏中的相应按钮开始撰写日志。
    素材库中的素材可以直接拖放到编辑区。'; - $lang->edit->paging_prev = '이전'; - $lang->edit->paging_next = '다음'; - $lang->edit->paging_prev_help = '이전 페이지로 이동합니다.'; - $lang->edit->paging_next_help = '다음 페이지로 이동합니다.'; + $lang->edit->paging_prev = '上一个'; + $lang->edit->paging_next = '下一个'; + $lang->edit->paging_prev_help = '上一页。'; + $lang->edit->paging_next_help = '下一页。'; - $lang->edit->toc = '목차'; - $lang->edit->close_help = '도움말 닫기'; + $lang->edit->toc = '列表'; + $lang->edit->close_help = '关闭帮助'; - $lang->edit->confirm_submit_without_saving = '저장하지 않은 단락이 있습니다.\\n그냥 전송하시겠습니까?'; + $lang->edit->confirm_submit_without_saving = '尚有未保存的段落。\\n确定要提交吗?'; ?> diff --git a/modules/editor/lang/zh-TW.lang.php b/modules/editor/lang/zh-TW.lang.php index 15e02595f..7aac102f2 100644 --- a/modules/editor/lang/zh-TW.lang.php +++ b/modules/editor/lang/zh-TW.lang.php @@ -18,7 +18,7 @@ $lang->component_grant = '權限設置'; $lang->content_style = '內容樣式'; $lang->content_font = '內容字體'; - $lang->content_font_size = '문서 폰트 크기'; + $lang->content_font_size = '字體大小'; $lang->about_component = '組件簡介'; $lang->about_component_grant = '除預設組件外,可設置延伸組件的使用權限
    (全部解除時,任何用戶都可使用)。'; @@ -44,9 +44,9 @@ $lang->editor_height = '編輯器高度'; $lang->about_editor_skin = '選擇編輯器面板。'; - $lang->about_content_style = '문서 편집 및 내용 출력시 원하는 서식을 지정할 수 있습니다'; - $lang->about_content_font = '문서 편집 및 내용 출력시 원하는 폰트를 지정할 수 있습니다.
    지정하지 않으면 사용자 설정에 따르게 됩니다
    ,(콤마)로 여러 폰트를 지정할 수 있습니다.'; - $lang->about_content_font_size = '문서 편집 및 내용 출력시 원하는 폰트의 크기를 지정할 수 있습니다.
    12px, 1em등 단위까지 포함해서 입력해주세요.'; + $lang->about_content_style = '修改內容時,可指定要顯示的內容樣式'; + $lang->about_content_font = '修改內容時,可指定要顯示的內容字體。
    如果沒有指定的話,以系統預設為主。
    以,(逗號)區分多個字體。'; + $lang->about_content_font_size = '修改內容時,可指定要顯示的內容字體大小。
    請輸入單位,像是12px, 1em等。'; $lang->about_upload_file_grant = '設置上傳檔案的權限(全部解除為無限制)。'; $lang->about_default_component_grant = '設置編輯器預設組件的使用權限(全部解除為無限制)。'; $lang->about_editor_height = '指定編輯器的預設高度。'; @@ -58,18 +58,18 @@ $lang->edit->fontsize = '大小'; $lang->edit->use_paragraph = '段落功能'; $lang->edit->fontlist = array( - '新細明體'=>'新細明體', - '標楷體'=>'標楷體', - '細明體'=>'細明體', - 'Arial'=>'Arial', - 'Arial Black'=>'Arial Black', - 'Tahoma'=>'Tahoma', - 'Verdana'=>'Verdana', - 'Sans-serif'=>'Sans-serif', - 'Serif'=>'Serif', - 'Monospace'=>'Monospace', - 'Cursive'=>'Cursive', - 'Fantasy'=>'Fantasy', + '新細明體' => '新細明體', + '標楷體' => '標楷體', + '細明體' => '細明體', + 'Arial' => 'Arial', + 'Arial Black' => 'Arial Black', + 'Tahoma' => 'Tahoma', + 'Verdana' => 'Verdana', + 'Sans-serif' => 'Sans-serif', + 'Serif' => 'Serif', + 'Monospace' => 'Monospace', + 'Cursive' => 'Cursive', + 'Fantasy' => 'Fantasy', ); $lang->edit->header = '樣式'; @@ -121,6 +121,7 @@ $lang->edit->help_align_left = '靠左對齊'; $lang->edit->help_align_center = '置中對齊'; $lang->edit->help_align_right = '靠右對齊'; + $lang->edit->help_align_justify = '左右對齊'; $lang->edit->help_add_indent = '縮排'; $lang->edit->help_remove_indent = '凸排'; $lang->edit->help_list_number = '編號'; @@ -205,26 +206,27 @@ $lang->edit->next_search_words = '搜尋下一個'; $lang->edit->edit_height_control = '設定大小'; - $lang->edit->merge_cells = '分割儲存格'; - $lang->edit->split_row = '插入行'; - $lang->edit->split_col = '插入列'; + $lang->edit->merge_cells = '合併儲存格'; + $lang->edit->split_row = '分割行'; + $lang->edit->split_col = '分割列'; - $lang->edit->toggle_list = '목록 접기/펼치기'; - $lang->edit->minimize_list = '최소화'; + $lang->edit->toggle_list = '摺疊/展開'; + $lang->edit->minimize_list = '最小化'; - $lang->edit->move = '이동'; + $lang->edit->move = '搬移'; + $lang->edit->refresh = '重整'; $lang->edit->materials = '글감보관함'; - $lang->edit->temporary_savings = '임시저장목록'; + $lang->edit->temporary_savings = '暫存檔列表'; $lang->edit->drag_here = '아래의 단락추가 툴바에서 원하는 유형의 단락을 추가해 글 쓰기를 시작하세요.
    글감 보관함에 글이 있으면 이곳으로 끌어 넣기 할 수 있습니다.'; - $lang->edit->paging_prev = '이전'; - $lang->edit->paging_next = '다음'; - $lang->edit->paging_prev_help = '이전 페이지로 이동합니다.'; - $lang->edit->paging_next_help = '다음 페이지로 이동합니다.'; + $lang->edit->paging_prev = '前頁'; + $lang->edit->paging_next = '次頁'; + $lang->edit->paging_prev_help = '往上一頁'; + $lang->edit->paging_next_help = '往下一頁'; - $lang->edit->toc = '목차'; - $lang->edit->close_help = '도움말 닫기'; + $lang->edit->toc = '目錄'; + $lang->edit->close_help = '關閉使用手冊'; - $lang->edit->confirm_submit_without_saving = '저장하지 않은 단락이 있습니다.\\n그냥 전송하시겠습니까?'; + $lang->edit->confirm_submit_without_saving = '有內容尚未儲存。\\n是否要繼續進行?'; ?> diff --git a/modules/editor/skins/xpresseditor/js/xe_interface.js b/modules/editor/skins/xpresseditor/js/xe_interface.js index 2b93ee509..a255c3ce5 100644 --- a/modules/editor/skins/xpresseditor/js/xe_interface.js +++ b/modules/editor/skins/xpresseditor/js/xe_interface.js @@ -58,7 +58,7 @@ function editorStart_xe(editor_sequence, primary_key, content_key, editor_height } var content = form[content_key].value; - if(xFF && !content) content = '

     

    '; + if(xFF && !content) content = '
    '; // src, href, url의 XE 상대경로를 http로 시작하는 full path로 변경 content = content.replace(/(src=|href=|url\()("|\')*([^"\'\)]+)("|\'|\))*(\s|>)*/ig, function(m0,m1,m2,m3,m4,m5) { @@ -177,8 +177,25 @@ function editorGetContentTextarea_xe(editor_sequence) { if (!oEditor) return ''; var str = oEditor.getIR(); + if(!jQuery.trim(str.replace(/( |<\/?(p|br|span|div)([^>]+)?>)/ig, ''))) return ''; + // 속도 문제가 있으므로 1024 문자 미만일 때만 첫 노드가 텍스트 노드인지 테스트 + // 그 이상이면 P 노드가 정상적으로 생성되었다고 가정한다. + if (str.length < 1024) { + var div = jQuery('
    '+str+'
    ').eq(0); + var nodes = div.contents(); + jQuery.each(nodes, function() { + if (this.nodeType == 3) { + jQuery(this).wrap('

    '); + } + }); + str = div.html(); + } + + // 파이어폭스의 경우 의미없는
    이 컨텐트 마지막에 추가될 수 있다. + str = str.replace(/
    $/i, ''); + return str; } diff --git a/modules/editor/skins/xpresseditor/skin.xml b/modules/editor/skins/xpresseditor/skin.xml index 82590cde8..53a8e5d73 100644 --- a/modules/editor/skins/xpresseditor/skin.xml +++ b/modules/editor/skins/xpresseditor/skin.xml @@ -32,18 +32,18 @@ 2009-03-22 행복한고니 - gony - gony + gony + gony gony gony - gony + gony gony 하얀색(기본) 白(デフォルト) - 白色(基本) + 白色(默认) White (default) White (Mặc định) Blanco (por defecto) @@ -66,7 +66,7 @@ White Text Editor(Dòng tự động mở) White Text Editor(Auto Line Break) Editor de texto en blanco (Auto de línea) - 白色文本编辑器(自动换行) + 白色文本编辑器(使用HTML,自动换行) 白色文字編輯器(Auto Line Break) @@ -76,7 +76,7 @@ Black Text Editor(Dòng tự động mở) Black Text Editor(Auto Line Break) Editor de texto negro (salto de línea automático) - 黑色文本编辑器(自动换行) + 黑色文本编辑器(使用HTML,自动换行) 黑色文字編輯器(Auto Line Break) @@ -86,7 +86,7 @@ White Text Editor(Sử dụng HTML) White Text Editor(Use HTML) Editor de texto en blanco (Uso de HTML) - 白色文本编辑器(使用HTML) + 白色文本编辑器(使用HTML,不自动换行) 白色文字編輯器(Use HTML) @@ -96,7 +96,7 @@ Black Text Editor(Sử dụng HTML) Black Text Editor(Use HTML) Editor de texto negro (Uso de HTML) - 黑色文本编辑器(使用HTML) + 黑色文本编辑器(使用HTML,不自动换行) 黑色文字編輯器(Use HTML) @@ -106,7 +106,7 @@ White Text Editor(Không có HTML) White Text Editor(No HTML) Editor de texto en blanco (no HTML) - 白色文本编辑器(不使用HTML) + 白色文本编辑器(不使用HTML,自动换行) 白色文字編輯器(No HTML) @@ -116,7 +116,7 @@ Black Text Editor(Không có HTML) Black Text Editor(No HTML) Editor de texto negro (no HTML) - 黑色文本编辑器(不使用HTML) + 黑色文本编辑器(不使用HTML,自动换行) 黑色文字編輯器(No HTML) diff --git a/modules/editor/styles/default/skin.xml b/modules/editor/styles/default/skin.xml index 25e78b4d0..2ec500816 100644 --- a/modules/editor/styles/default/skin.xml +++ b/modules/editor/styles/default/skin.xml @@ -1,7 +1,8 @@ XE 기본 서식 - XE 기본 서식 + XE默认样式 + XE 기본 서식 XE Mặc định XEデフォルトスタイル XE預設樣式 @@ -9,6 +10,13 @@ XE 기본 문서 서식입니다. 있는 그대로 표시가 될 뿐 편집/ 출력시 아무런 영향을 끼치지 않습니다.
    + + XE默认样式。 + 主题显示及编辑不会受到任何影响,即原样输出。 + + + XEの基本ドキュメント書式です。 + そのまま表示されるだけで、編集・出力には影響しません。 XE default document style. It displays as it is, and affect nothing to editing / printing. @@ -21,6 +29,8 @@ 2009-05-23 정찬명 + Chan-Myung Jeong + Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong diff --git a/modules/editor/styles/xeStyle/skin.xml b/modules/editor/styles/xeStyle/skin.xml index a1ca36766..6112df29e 100644 --- a/modules/editor/styles/xeStyle/skin.xml +++ b/modules/editor/styles/xeStyle/skin.xml @@ -1,6 +1,7 @@ XE 기본 서식 (하얀 배경) + XE默认样式(白色背景) XE Mặc định (Nền sáng) XEデフォルトスタイル(白色背景) XE預設樣式(白色背景) @@ -8,6 +9,10 @@ XE 기본 문서 서식입니다. 문서 수정중에는 각 요소들이 구분되어 보입니다. + + XE默认样式。 + 在编辑文档时,可清晰地区分各标签区域。 + Trang mẫu mặc định của XE. Nó sẽ hiển thị trong phần sửa đổi bài viết. @@ -24,6 +29,7 @@ 2009-04-17 정찬명 + Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong diff --git a/modules/editor/styles/xeStyleBlack/skin.xml b/modules/editor/styles/xeStyleBlack/skin.xml index 0309695f5..22aea761c 100644 --- a/modules/editor/styles/xeStyleBlack/skin.xml +++ b/modules/editor/styles/xeStyleBlack/skin.xml @@ -1,13 +1,18 @@ XE 기본 서식 (검은 배경) + XE默认格式(黑色背景) XE Mặc định (Nền tối) - XEデフォルトスタイル(黑色背景) + XEデフォルトスタイル(黒色背景) XE預設樣式(黑色背景) XE 기본 문서 서식입니다. 문서 수정중에는 각 요소들이 구분되어 보입니다. + + XE默认格式。 + 在编辑文档时,可清晰地区分各标签区域。 + Mẫu mặc định của XE. Nó sẽ hiển thị trong phần sửa đổi bài viết. @@ -24,6 +29,7 @@ 2009-04-17 정찬명 + Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong Chan-Myung Jeong diff --git a/modules/editor/tpl/setup_component.html b/modules/editor/tpl/setup_component.html index 81bf322e2..e76908bce 100644 --- a/modules/editor/tpl/setup_component.html +++ b/modules/editor/tpl/setup_component.html @@ -51,34 +51,36 @@ - -
    - {$lang->module} - -
    - -

    {$lang->about_component_mid}

    - -
    - - - {$modules->title} - - {$lang->none_category} - -
    + + +
    + {$lang->module} + +
    + +

    {$lang->about_component_mid}

    + +
    + + + {$modules->title} + + {$lang->none_category} + +
    -
    - -
    - mid_list))-->checked="checked" /> - +
    + +
    + mid_list))-->checked="checked" /> + +
    +
    -
    - - - + + +
    diff --git a/modules/file/lang/zh-CN.lang.php b/modules/file/lang/zh-CN.lang.php index 0d6587fa2..7f2fa43ab 100644 --- a/modules/file/lang/zh-CN.lang.php +++ b/modules/file/lang/zh-CN.lang.php @@ -12,7 +12,7 @@ $lang->status = '状态'; $lang->is_valid = '有效'; $lang->is_stand_by = '等待'; - $lang->file_list = '附件目录'; + $lang->file_list = '附件列表'; $lang->allow_outlink = '防盗链'; $lang->allow_outlink_site = '允许外链站点'; $lang->allowed_filesize = '文件大小限制'; @@ -34,14 +34,14 @@ $lang->msg_cart_is_null = ' 请选择要删除的文件。'; $lang->msg_checked_file_is_deleted = '已删除%d个文件!'; $lang->msg_exceeds_limit_size = '已超过系统指定的上传文件大小!'; - $lang->msg_file_not_found = '요청하신 파일을 찾을 수 없습니다.'; + $lang->msg_file_not_found = '无法找到该文件。'; $lang->file_search_target_list = array( 'filename' => '文件名', 'filesize_more' => '文件大小 (byte, 以上)', 'filesize_mega_more' => '文件大小 (Mb, 以上)', - 'filesize_less' => '파일크기 (byte, 이하)', - 'filesize_mega_less' => '파일크기 (Mb, 이하)', + 'filesize_less' => '文件大小 (byte, 以下)', + 'filesize_mega_less' => '文件大小 (Mb, 以下)', 'download_count' => '下载次数 (以上)', 'user_id' => '用户名', 'user_name' => '姓名', diff --git a/modules/install/install.admin.controller.php b/modules/install/install.admin.controller.php index cf7385e12..7ae05930a 100644 --- a/modules/install/install.admin.controller.php +++ b/modules/install/install.admin.controller.php @@ -119,7 +119,7 @@ * @brief FTP 정보 등록 **/ function procInstallAdminSaveFTPInfo() { - $ftp_info = Context::gets('ftp_user','ftp_password','ftp_port'); + $ftp_info = Context::gets('ftp_user','ftp_password','ftp_port','ftp_root_path'); $ftp_info->ftp_port = (int)$ftp_info->ftp_port; if(!$ftp_info->ftp_port) $ftp_info->ftp_port = 21; $buff = 'about_database_file = 'Sqlite saves data in the file. Location of the database file should be unreachable by web
    Data file should be inside the permission of 707.'; $lang->success_installed = 'Installation has been completed'; - $lang->success_updated = 'Update has been completed'; $lang->msg_cannot_proc = 'Installation environment is not proper to proceed.'; $lang->msg_already_installed = 'XE is already installed'; diff --git a/modules/install/lang/es.lang.php b/modules/install/lang/es.lang.php index e7f76ea43..b6892c716 100644 --- a/modules/install/lang/es.lang.php +++ b/modules/install/lang/es.lang.php @@ -269,7 +269,6 @@ EndOfLicense; $lang->about_database_file = 'Sqlite guarda el dato en el archivo. Es necesario crear archivo de BD en un lugar inaccesible de la web.
    El archivo de dato debe estar ubicado en un lugar con la atribución 707.'; $lang->success_installed = 'Instalación finalizada'; - $lang->success_updated = 'Actualización finalizada'; $lang->msg_cannot_proc = 'No puede ser ejecutado lo requerido por no disponer del ambiente de instalación.'; $lang->msg_already_installed = 'Instalación de XE ya existe.'; diff --git a/modules/install/lang/fr.lang.php b/modules/install/lang/fr.lang.php index a7a142e5a..29393dadd 100644 --- a/modules/install/lang/fr.lang.php +++ b/modules/install/lang/fr.lang.php @@ -227,7 +227,6 @@ EndOfLicense; $lang->about_database_file = 'Sqlite conserve des données dans le fichier. Vous devez placer le fichier de la base de données où l\'on ne peut pas accéder par web.
    Le fichier des Donées doit être en dedans la permission 707.'; $lang->success_installed = 'Installation s\'est complété'; - $lang->success_updated = 'Mise à Jour s\'est complété'; $lang->msg_cannot_proc = 'Environnement d\'Installation n\'est pas équipé à procéder.'; $lang->msg_already_installed = 'XE est déjà installé'; diff --git a/modules/install/lang/jp.lang.php b/modules/install/lang/jp.lang.php index 41cbd7f7a..be1b4a263 100644 --- a/modules/install/lang/jp.lang.php +++ b/modules/install/lang/jp.lang.php @@ -265,7 +265,6 @@ EndOfLicense; $lang->about_database_file = 'Sqliteはファイルにデータを保存します。そのため、データベースファイルにはウェブからアクセス出来ない場所にしなければなりません。
    データファイルのパーミッションは「707」に設定して下さい。'; $lang->success_installed = '正常にインストールされました。'; - $lang->success_updated = '正常にアップデートされました。'; $lang->msg_cannot_proc = 'インストール出来る環境が整っていないため、リクエストを実行出来ませんでした。'; $lang->msg_already_installed = '既にインストールされています。'; diff --git a/modules/install/lang/ko.lang.php b/modules/install/lang/ko.lang.php index ba1e66d30..99be1b687 100644 --- a/modules/install/lang/ko.lang.php +++ b/modules/install/lang/ko.lang.php @@ -265,7 +265,6 @@ EndOfLicense; $lang->about_database_file = 'Sqlite는 파일에 데이터를 저장합니다. 데이터베이스 파일의 위치를 웹에서 접근할 수 없는 곳으로 하셔야 합니다.
    데이터 파일은 707퍼미션 설정된 곳으로 지정해주세요.'; $lang->success_installed = '설치가 되었습니다.'; - $lang->success_updated = '업데이트가 되었습니다.'; $lang->msg_cannot_proc = '설치 환경이 갖춰지지 않아 요청을 실행할 수가 없습니다.'; $lang->msg_already_installed = '이미 설치가 되어 있습니다.'; diff --git a/modules/install/lang/ru.lang.php b/modules/install/lang/ru.lang.php index 41609b38d..d9d6bcf01 100644 --- a/modules/install/lang/ru.lang.php +++ b/modules/install/lang/ru.lang.php @@ -357,7 +357,6 @@ EndOfLicense; $lang->about_database_file = 'Sqlite сохраняет данные в файл. Размещение базы данных должно быть недоступно с веб
    Файл базы данных должен иметь права доступа 707.'; $lang->success_installed = 'Установка завершена'; - $lang->success_updated = 'Обновление завершено'; $lang->msg_cannot_proc = 'Невозможно исполнить запрос, поскольку окружение установки не указано'; $lang->msg_already_installed = 'XE уже установлена'; diff --git a/modules/install/lang/vi.lang.php b/modules/install/lang/vi.lang.php index 2916490c4..abab21454 100644 --- a/modules/install/lang/vi.lang.php +++ b/modules/install/lang/vi.lang.php @@ -172,7 +172,6 @@ EndOfLicense; $lang->about_database_file = 'Sqlite lưu trữ dữ liệu trong một File, vì vậy cần tới sự truy cập đến nó trong Database.
    Hãy CHMOD thành 707.'; $lang->success_installed = 'Bạn đã cài đặt XE thành công!'; - $lang->success_updated = 'Đã cập nhật thành công!'; $lang->msg_cannot_proc = 'Môi trường cài đặt không thích hợp.'; $lang->msg_already_installed = 'Một phiên bản nào đó của XE đã được cài đặt từ trước.
    Xin hãy kiểm tra lại!'; diff --git a/modules/install/lang/zh-CN.lang.php b/modules/install/lang/zh-CN.lang.php index 2f6bc6988..8427c0c8c 100644 --- a/modules/install/lang/zh-CN.lang.php +++ b/modules/install/lang/zh-CN.lang.php @@ -256,7 +256,6 @@ EndOfLicense; $lang->about_database_file = 'Sqlite是文件里保存数据。数据库的文件位置应该放在web不能访问的地方。
    数据文件应放在具有707属性的位置。'; $lang->success_installed = '已完成安装。'; - $lang->success_updated = '已完成更新。'; $lang->msg_cannot_proc = '不具备安装所需环境,不能继续进行。'; $lang->msg_already_installed = '已安装'; diff --git a/modules/install/lang/zh-TW.lang.php b/modules/install/lang/zh-TW.lang.php index 6c12a460c..429d4503d 100644 --- a/modules/install/lang/zh-TW.lang.php +++ b/modules/install/lang/zh-TW.lang.php @@ -257,7 +257,6 @@ EndOfLicense; $lang->about_database_file = 'Sqlite是保存資料於檔案中。資料庫的檔案位置應該放在web不能訪問的地方。
    資料檔案應放在具有707權限的位置。'; $lang->success_installed = '已完成安裝。'; - $lang->success_updated = '已完成更新。'; $lang->msg_cannot_proc = '不具備安裝所需環境,無法繼續安裝。'; $lang->msg_already_installed = '已安裝'; diff --git a/modules/install/tpl/js/install_admin.js b/modules/install/tpl/js/install_admin.js index 3777cb5c3..23a3e73a7 100644 --- a/modules/install/tpl/js/install_admin.js +++ b/modules/install/tpl/js/install_admin.js @@ -31,3 +31,7 @@ function doCheckFTPInfo() { function completeInstallCheckFtpInfo(ret_obj) { alert(ret_obj['message']); } + +function completeFtpPath(ret_obj){ + location.reload(); +} diff --git a/modules/integration_search/integration_search.view.php b/modules/integration_search/integration_search.view.php index 72c7e725f..5f7b44994 100644 --- a/modules/integration_search/integration_search.view.php +++ b/modules/integration_search/integration_search.view.php @@ -32,7 +32,7 @@ $config = $oModuleModel->getModuleConfig('integration_search'); if(!$config->skin) $config->skin = 'default'; Context::set('module_info', unserialize($config->skin_vars)); - $this->setTemplatePath($this->module_path."/skins/".$this->skin."/"); + $this->setTemplatePath($this->module_path."/skins/".$config->skin."/"); $target = $config->target; if(!$target) $target = 'include'; diff --git a/modules/integration_search/lang/zh-CN.lang.php b/modules/integration_search/lang/zh-CN.lang.php index 2682c4926..4847e7ca3 100644 --- a/modules/integration_search/lang/zh-CN.lang.php +++ b/modules/integration_search/lang/zh-CN.lang.php @@ -10,12 +10,14 @@ $lang->sample_code = "代码"; $lang->about_target_module = "所选模块作为搜索对象。请注意权限设置。"; $lang->about_sample_code = "可把上述代码插入到相应布局当中即可实现搜索功能。"; + $lang->msg_no_keyword = '请输入搜索关键词。'; + $lang->msg_document_more_search = '利用\'继续搜索\'按钮可以进一步搜索。'; $lang->is_result_text = "符合'%s'的搜索结果约有%d项"; $lang->multimedia = "图片/视频"; - $lang->include_search_target = '只有在选定的目标'; - $lang->exclude_search_target = '搜索选定目的地从'; + $lang->include_search_target = '只搜索所选对象'; + $lang->exclude_search_target = '所选对象从搜索中排除'; $lang->is_search_option = array( 'document' => array( diff --git a/modules/layout/lang/jp.lang.php b/modules/layout/lang/jp.lang.php index 089fc52cd..0a4db3d45 100644 --- a/modules/layout/lang/jp.lang.php +++ b/modules/layout/lang/jp.lang.php @@ -29,7 +29,7 @@ $lang->about_layout_code = "下のレイアウトコードを修正し、保存するとサービスに反映されます。 必ずプレビューで確認してから保存して下さい。 - XEのテンプレート文法はXEテンプレートを参考して下さい。"; + XEのテンプレート文法はXEテンプレートを参考して下さい。"; $lang->layout_export = 'エクスポート'; $lang->layout_btn_export = 'マイレイアウトをダウンロードする'; diff --git a/modules/layout/lang/zh-CN.lang.php b/modules/layout/lang/zh-CN.lang.php index acbe36481..92251592f 100644 --- a/modules/layout/lang/zh-CN.lang.php +++ b/modules/layout/lang/zh-CN.lang.php @@ -13,7 +13,7 @@ $lang->layout_license = '版权'; $lang->layout_history = "更新记录 "; $lang->layout_info = "布局信息"; - $lang->layout_list = '布局目录'; + $lang->layout_list = '布局列表'; $lang->menu_count = '菜单数'; $lang->downloaded_list = '下载目录'; $lang->layout_preview_content = '显示内容的部分。'; diff --git a/modules/member/lang/zh-CN.lang.php b/modules/member/lang/zh-CN.lang.php index 63dfb7d67..b553310bd 100644 --- a/modules/member/lang/zh-CN.lang.php +++ b/modules/member/lang/zh-CN.lang.php @@ -96,7 +96,7 @@ $lang->cmd_view_member_info = '个人资料'; $lang->cmd_leave = '注销'; $lang->cmd_find_member_account = '查找用户名/密码'; - $lang->cmd_resend_auth_mail = '인증 메일 재발송'; + $lang->cmd_resend_auth_mail = '重新发送认证邮件'; $lang->cmd_member_list = '会员目录'; $lang->cmd_module_config = '常规选项'; @@ -104,8 +104,8 @@ $lang->cmd_send_mail = '发送邮件'; $lang->cmd_manage_id = '禁止用户名'; $lang->cmd_manage_form = '扩展注册表单'; - $lang->cmd_view_own_document = '我的话题'; - $lang->cmd_manage_member_info = 'Manage Member Info'; + $lang->cmd_view_own_document = '会员话题'; + $lang->cmd_manage_member_info = '管理会员信息'; $lang->cmd_trace_document = '主题追踪'; $lang->cmd_trace_comment = '评论追踪'; $lang->cmd_view_scrapped_document = '我的收藏'; @@ -206,5 +206,5 @@ $lang->about_member = "可以添加/修改/删除会员及管理用户组或注册表单的会员管理模块。\n此模块不仅可以生成缺省用户组以外的其他用户组来管理会员,并且通过注册表单的管理获得除会员基本信息以外的扩展信息。"; - $lang->about_resend_auth_mail = '인증 메일을 받지 못하신 경우 다시 받으실 수 있습니다.'; + $lang->about_resend_auth_mail = '没有收到认证邮件时,可以在此重新发送认证邮件。'; ?> diff --git a/modules/member/member.admin.model.php b/modules/member/member.admin.model.php index 9066376d7..fcf1147f8 100644 --- a/modules/member/member.admin.model.php +++ b/modules/member/member.admin.model.php @@ -75,13 +75,19 @@ } // selected_group_srl이 있으면 query id를 변경 (table join때문에) + $sort_index = Context::get('sort_index'); + if($sort_index != 'last_login') $sort_index = "member_srl"; if($args->selected_group_srl) { $query_id = 'member.getMemberListWithinGroup'; - $args->sort_index = "member.member_srl"; + $args->sort_index = "member.".$sort_index; } else { $query_id = 'member.getMemberList'; - $args->sort_index = "member_srl"; + $args->sort_index = $sort_index; } + $sort_order = Context::get('sort_order'); + if($sort_order != "asc") $sort_order = "desc"; + $args->sort_order = $sort_order; + Context::set('sort_order', $sort_order); // 기타 변수들 정리 $args->page = Context::get('page'); diff --git a/modules/member/queries/getMemberList.xml b/modules/member/queries/getMemberList.xml index 95bf6961d..a532ef84a 100644 --- a/modules/member/queries/getMemberList.xml +++ b/modules/member/queries/getMemberList.xml @@ -23,7 +23,7 @@ - + diff --git a/modules/member/queries/getMemberListWithinGroup.xml b/modules/member/queries/getMemberListWithinGroup.xml index e80affa2f..355865943 100644 --- a/modules/member/queries/getMemberListWithinGroup.xml +++ b/modules/member/queries/getMemberListWithinGroup.xml @@ -26,7 +26,7 @@ - + diff --git a/modules/member/tpl/member_list.html b/modules/member/tpl/member_list.html index f021161e7..1556aa84f 100644 --- a/modules/member/tpl/member_list.html +++ b/modules/member/tpl/member_list.html @@ -40,13 +40,13 @@ Total {number_format($total_count)}, Page {number_format($page)}/{number_format($total_page)} -
    {$lang->no}
    +
    {$lang->user_id}
    {$lang->user_name}
    {$lang->nick_name}
    -
    {$lang->signup_date}
    -
    {$lang->last_login}
    + +
     
    diff --git a/modules/menu/menu.admin.controller.php b/modules/menu/menu.admin.controller.php index 6e172b38d..db299b87c 100644 --- a/modules/menu/menu.admin.controller.php +++ b/modules/menu/menu.admin.controller.php @@ -411,7 +411,8 @@ 'header("Cache-Control: no-store, no-cache, must-revalidate"); '. 'header("Cache-Control: post-check=0, pre-check=0", false); '. 'header("Pragma: no-cache"); '. - '%s'. + '%s '. + '$oContext->close(); '. '?>'. '%s', $header_script, diff --git a/modules/module/lang/zh-CN.lang.php b/modules/module/lang/zh-CN.lang.php index a2b94fd6e..18410dc61 100644 --- a/modules/module/lang/zh-CN.lang.php +++ b/modules/module/lang/zh-CN.lang.php @@ -7,7 +7,7 @@ $lang->virtual_site = "站点"; $lang->module_list = "模块目录"; - $lang->module_index = "模块目录"; + $lang->module_index = "模块列表"; $lang->module_category = "模块分类"; $lang->module_info = "模块信息"; $lang->add_shortcut = "添加到快捷菜单"; @@ -34,12 +34,12 @@ $lang->lang_code = "语言变量"; $lang->filebox = "文件管理"; - $lang->access_type = '접속 방법'; - $lang->access_domain = 'Domain 접속'; - $lang->access_vid = 'Site ID 접속'; + $lang->access_type = '访问方式'; + $lang->access_domain = '域名'; + $lang->access_vid = '站点ID'; $lang->about_domain = "要创建一个站点必须有一个专用域名。
    一级域名或二级域名皆可。输入的时候请把XE安装路径也一起输入。
    ex) www.xpressengine.com/xe"; - $lang->about_vid = '별도의 도메인이 아닌 http://XE주소/ID 로 접속할 수 있습니다. 모듈명(mid)와 중복될 수 없습니다.
    첫글자는 영문으로 시작해야 하고 영문과 숫자 그리고 _ 만 사용할 수 있습니다'; - $lang->msg_already_registed_vid = '이미 등록된 사이트 ID 입니다. 게시판등의 mid와도 중복이 되지 않습니다. 다른 ID를 입력해주세요.'; + $lang->about_vid = '直接以http://XE安装地址/ID的方式访问。
    模块名(mid)不能重复。
    模块名要以英文字母开头,且只允许使用英文字母,数字及"_"。'; + $lang->msg_already_registed_vid = '重复的站点ID,请重新输入(注:站点ID不能重复,而且也不能与版面mid重复)。'; $lang->msg_already_registed_domain = "对不起!已有相同的域名。请重新输入。"; $lang->header_script = "文件头部脚本"; @@ -72,10 +72,10 @@ $lang->msg_move_failed = '移动失败!'; $lang->msg_cannot_delete_for_child = '不能删除有下级分类的分类!'; $lang->msg_limit_mid ="模块名称只允许英文字母+[英文字母+数字]。"; - $lang->msg_extra_name_exists = '이미 존재하는 확장변수 이름입니다. 다른 이름을 입력해주세요.'; + $lang->msg_extra_name_exists = '已有的扩展变量名称,请重新输入!'; $lang->about_browser_title = "显示在浏览器窗口的标题值。 在RSS/Trackback也可以使用。"; - $lang->about_mid = "模块名称只允许使用英文,数字和下划线。 The maximum length is 40."; + $lang->about_mid = "模块名称只允许使用英文,数字和下划线(最多不能超过40字节)。"; $lang->about_default = "用没有mid值的网址访问网站时,将会显示默认。"; $lang->about_module_category = "可以分类管理模块。 模块分类可以在 模块管理 > 模块分类 中进行管理。"; $lang->about_description= '管理用使用说明。'; @@ -93,6 +93,7 @@ $lang->about_module = "除基本library以外XE全部由模块组成。\n模块管理中列出所有已安装的模块,因此易于管理。"; $lang->about_extra_vars_default_value = '复选/单选缺省值需要多个时,用,(逗号)来分隔。'; $lang->about_search_virtual_site = "请输入子站点域名后再进行搜索。
    子站点以外的模块可以留空搜索。(输入时http://除外)。"; + $lang->about_extra_vars_eid_value = '请输入扩展变量名称(只允许英文字母+[英文字母+数字+_])。'; $lang->about_langcode = "要想实现多国语言切换请点击[选择语言变量]按钮。"; $lang->about_file_extension= "只允许%s文件。"; ?> diff --git a/modules/module/module.controller.php b/modules/module/module.controller.php index d205a269d..fcea72e66 100644 --- a/modules/module/module.controller.php +++ b/modules/module/module.controller.php @@ -156,7 +156,7 @@ unset($args->page); // mid값 검사 - if(!ereg("^[a-zA-Z][a-zA-Z0-9_]+", $args->mid)) return new Object(-1, 'msg_limit_mid'); + if(!preg_match("/^[a-z][a-z0-9_]+$/i", $args->mid)) return new Object(-1, 'msg_limit_mid'); // 변수를 검사 (modules의 기본 변수와 그렇지 않은 변수로 분리) $extra_vars = clone($args); diff --git a/modules/module/module.model.php b/modules/module/module.model.php index 963eb36ec..cb6981730 100644 --- a/modules/module/module.model.php +++ b/modules/module/module.model.php @@ -82,7 +82,7 @@ $hostname = $url_info['host']; $path = preg_replace('/\/$/','',$url_info['path']); $sites_args->domain = sprintf('%s%s%s', $hostname, $url_info['port']&&$url_info['port']!=80?':'.$url_info['port']:'',$path); - $output = executeQuery('module.getSiteDefaultInfo', $sites_args); + $output = executeQuery('module.getSiteInfoByDomain', $sites_args); } else { if(!$vid) $vid = $mid; if($vid) { @@ -949,7 +949,13 @@ // 각 모듈의 module.class.php로 upgrade 유무 체크 $oDummy = null; $oDummy = &getModule($module_name, 'class'); - if($oDummy) $info->need_update = $oDummy->checkUpdate(); + if($oDummy && method_exists($oDummy, "checkUpdate")) { + $info->need_update = $oDummy->checkUpdate(); + } + else + { + continue; + } $list[] = $info; } diff --git a/modules/module/queries/getSiteDefaultInfo.xml b/modules/module/queries/getSiteDefaultInfo.xml deleted file mode 100644 index 8dd76137d..000000000 --- a/modules/module/queries/getSiteDefaultInfo.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - -
    - - - - - - - - - - - - - diff --git a/modules/page/lang/zh-CN.lang.php b/modules/page/lang/zh-CN.lang.php index 4ad956c79..0da7a2372 100644 --- a/modules/page/lang/zh-CN.lang.php +++ b/modules/page/lang/zh-CN.lang.php @@ -9,5 +9,5 @@ $lang->about_page = "可制作完整页面的模块。\n利用最新主题列表或其他控件可以生成动态的页面,且通过网页编辑器做出形式多样的页面。\n连接页面URL同其他模块链接相同。即:mid=模块名称。选择默认选项此页面将变为首页。"; $lang->cmd_page_modify = "页面编辑"; $lang->page_caching_interval = "缓冲时间设置"; - $lang->about_page_caching_interval = "单位为分。缓冲时间内页面将输出临时储存的数据。
    输出外部服务器信息或数据时,如消耗资源很大,尽量把缓冲时间设置为大一点的相应值。
    0 表示无缓冲。"; + $lang->about_page_caching_interval = "单位为分。缓冲时间间隔内页面将输出临时储存的数据。
    显示外链服务器信息或数据时,如消耗资源很大,尽量把缓冲时间设置为大一点的相应值。
    0 表示无缓冲。"; ?> diff --git a/modules/point/lang/zh-CN.lang.php b/modules/point/lang/zh-CN.lang.php index 3bbe703a1..fa946487f 100644 --- a/modules/point/lang/zh-CN.lang.php +++ b/modules/point/lang/zh-CN.lang.php @@ -8,7 +8,7 @@ $lang->point = "积分"; $lang->level = "级别"; - $lang->about_point_module = "积分系统可以在发表/删除新帖,发表/删除评论,上传/下载/删除/文件等动作时,付与其相应的积分。"; + $lang->about_point_module = "积分系统可以在发表新帖及评论,上传/下载文件等动作时,付与其相应的积分的模块。"; $lang->about_act_config = "版面,博客等模块都有发表/删除新帖,发表/删除评论等动作。
    要想与版面/博客之外的模块关联积分功能时,添加与其各模块功能相适合的act值即可。"; $lang->max_level = '最高级别'; @@ -25,8 +25,8 @@ $lang->disable_download = '禁止下载'; $lang->about_disable_download = '没有积分时,将禁止下载。 (图片除外)'; - $lang->disable_read_document = '글 열람 금지'; - $lang->about_disable_read_document = '포인트가 없을 경우 글 열람을 금지하게 됩니다'; + $lang->disable_read_document = '禁止查看主题'; + $lang->about_disable_read_document = '没有积分时,将禁止查看主题。'; $lang->level_point_calc = '计算级别积分'; $lang->expression = '使用级别变数"i"输入JS数学函数。例: Math.pow(i, 2) * 90'; @@ -37,8 +37,8 @@ $lang->about_cmd_point_recal = '积分初始化。即只保留文章/评论/附件/新会员注册的相关积分项。
    其中,初始化后的新会员注册积分项,将在会员有相关动作(发表主题/评论等)时,才付与其相应的积分。
    此项功能请务必慎用!此项功能只能在数据转移或真的需要初始化所有积分时才可以使用。'; $lang->point_link_group = '用户组绑定'; - $lang->point_group_reset_and_add = '설정된 그룹 초기화 후 새 그룹 부여'; - $lang->point_group_add_only = '새 그룹만 부여'; + $lang->point_group_reset_and_add = '初始化已有用户组重新设置'; + $lang->point_group_add_only = '只应用到新用户组'; $lang->about_point_link_group = '即级别绑定用户组。当级别达到指定级别时,会员所属用户组将自动更新为与其相对应的用户组。'; $lang->about_module_point = '可以分别对各模块进行积分设置,没有被设置的模块将使用默认值。
    所有积分在相反动作下恢复原始值。即:发表新帖后再删除得到的积分为0分。'; @@ -61,7 +61,7 @@ $lang->cmd_point_member_list = '会员积分目录'; $lang->msg_cannot_download = '积分不足无法下载!'; - $lang->msg_disallow_by_point = "포인트가 부족하여 글을 읽을 수 없습니다 (필요포인트 : %d, 현재포인트 : %d)"; + $lang->msg_disallow_by_point = "积分不够,无法查看主题。(所需积分 : %d, 当前积分 : %d)"; $lang->point_recal_message = '计算并应用中(%d / %d)。'; $lang->point_recal_finished = '积分重新计算并应用完毕。'; diff --git a/modules/poll/lang/zh-CN.lang.php b/modules/poll/lang/zh-CN.lang.php index fef3ad4c9..e793fbe77 100644 --- a/modules/poll/lang/zh-CN.lang.php +++ b/modules/poll/lang/zh-CN.lang.php @@ -10,7 +10,7 @@ $lang->poll_join_count = "投票者"; $lang->poll_checkcount = "必选项目数"; - $lang->cmd_poll_list = '查看目录'; + $lang->cmd_poll_list = '投票列表'; $lang->cmd_delete_checked_poll = '删除所选项目'; $lang->cmd_apply_poll = '参与投票'; $lang->cmd_view_result = '查看结果'; diff --git a/modules/rss/lang/zh-CN.lang.php b/modules/rss/lang/zh-CN.lang.php index 040040d00..e45a70c23 100644 --- a/modules/rss/lang/zh-CN.lang.php +++ b/modules/rss/lang/zh-CN.lang.php @@ -12,7 +12,7 @@ $lang->feed_copyright = '版权'; $lang->feed_document_count = '每页主题数'; $lang->feed_image = 'RSS图片'; - $lang->rss_type = "将显示的RSS形式"; + $lang->rss_type = "RSS Feed显示样式"; $lang->open_rss = 'RSS公开'; $lang->open_rss_types = array( 'Y' => '公开全文', diff --git a/modules/spamfilter/lang/zh-CN.lang.php b/modules/spamfilter/lang/zh-CN.lang.php index 7d64fc102..88d5cef5e 100644 --- a/modules/spamfilter/lang/zh-CN.lang.php +++ b/modules/spamfilter/lang/zh-CN.lang.php @@ -6,8 +6,8 @@ **/ // action 相关 - $lang->cmd_denied_ip = "禁止IP目录"; - $lang->cmd_denied_word = "敏感词目录"; + $lang->cmd_denied_ip = "禁止IP列表"; + $lang->cmd_denied_word = "敏感词列表"; // 一般用语 $lang->spamfilter = "垃圾过滤"; diff --git a/modules/widget/widget.controller.php b/modules/widget/widget.controller.php index 956d631d9..db75700cf 100644 --- a/modules/widget/widget.controller.php +++ b/modules/widget/widget.controller.php @@ -69,7 +69,7 @@ $attribute = $this->arrangeWidgetVars($widget, Context::getRequestVars(), $vars); // 결과물을 구함 - $widget_code = $this->execute($widget, $vars, true); + $widget_code = $this->execute($widget, $vars, true, false); $this->add('widget_code', $widget_code); } @@ -437,7 +437,7 @@ * * $javascript_mode가 true일 경우 페이지 수정시 위젯 핸들링을 위한 코드까지 포함함 **/ - function execute($widget, $args, $javascript_mode = false) { + function execute($widget, $args, $javascript_mode = false, $escaped = true) { // 디버그를 위한 위젯 실행 시간 저장 if(__DEBUG__==3) $start = getMicroTime(); @@ -446,7 +446,7 @@ if(count($object_vars)) { foreach($object_vars as $key => $val) { if(in_array($key, array('widgetbox_content','body','class','style','widget_sequence','widget','widget_padding_left','widget_padding_top','widget_padding_bottom','widget_padding_right','widgetstyle','document_srl'))) continue; - $args->{$key} = utf8RawUrlDecode($val); + if($escaped) $args->{$key} = utf8RawUrlDecode($val); } } @@ -624,7 +624,7 @@ // 위젯 스타일을 컴파일 한다. - if($args->widgetstyle) $widget_content_body = $this->complieWidgetStyle($args->widgetstyle,$widget, $widget_content_body, $args, $javascript_mode); + if($args->widgetstyle) $widget_content_body = $this->compileWidgetStyle($args->widgetstyle,$widget, $widget_content_body, $args, $javascript_mode); $output = $widget_content_header . $widget_content_body . $widget_content_footer; @@ -666,7 +666,7 @@ } - function complieWidgetStyle($widgetStyle,$widget,$widget_content_body, $args, $javascript_mode){ + function compileWidgetStyle($widgetStyle,$widget,$widget_content_body, $args, $javascript_mode){ if(!$widgetStyle) return $widget_content_body; $oWidgetModel = &getModel('widget'); diff --git a/widgets/content/conf/info.xml b/widgets/content/conf/info.xml index 63cd77a45..a709da03b 100644 --- a/widgets/content/conf/info.xml +++ b/widgets/content/conf/info.xml @@ -41,7 +41,7 @@ ArticleBài viết主题 - 主題 + 主題書き込み @@ -50,7 +50,7 @@ Comment Bình luận 评论 - 評論 + 評論 コメント @@ -59,7 +59,7 @@ Attached Image Hình đính kèm 图片 - 圖片 + 圖片 添付イメージ @@ -68,7 +68,7 @@ Trackback Liên kết Web 引用 - 引用 + 引用 トラックバック @@ -77,7 +77,7 @@ Feed (RSS/ATOM) Feed (RSS/ATOM) Feed (RSS/ATOM) - Feed (RSS/ATOM) + Feed (RSS/ATOM) Feed (RSS/ATOM) @@ -412,7 +412,7 @@ 정렬대상을 내림차순 또는 올림차순으로 정렬할 수 있습니다.对其排序对象可进行升序/降序方式排序。ソートタイプを、降順、または昇順に設定します。 - You can sort target articles by asending or desending order. + You can sort target articles by ascending or descending order.Bạn có thể phân loại bài viết theo kiểu tăng hay giảm.Usted puede ordenar los documentos en orden acendente o en orden descendente.Вы можете сортировать статьи в порядке возрастания или убывания. @@ -422,7 +422,7 @@ 내림차순降序降順 - Desending order + Descending orderGiảm dầnOrden DescendenteПо убыванию @@ -433,7 +433,7 @@ 올림차순升序昇順 - Asending order + Ascending orderTăng dầnOrden AcendenteПо возрастанию @@ -556,43 +556,48 @@ select 페이지수 - Page + Page + 分页 + 頁數 + Page Trang - 分页 - 頁數 ページ数 1 1 - 1 + 1 + 1 + 1 + 1 1 - 1 - 1 1 2 2 - 2 + 2 + 2 + 2 + 2 2 - 2 - 2 2 3 3 - 3 + 3 + 3 + 3 + 3 3 - 3 - 3 3 페이지수 2이상일 경우 이전/다음 버튼이 나타납니다. - Prev/Next buttons will appear when there are more than 2 pages. + Prev/Next buttons will appear when there are more than 2 pages. + 分页数在2以上时,将会出现上一页/下一页按钮。 + 頁數在2以上時,會出現上一頁/下一頁按鈕。 + Prev/Next buttons will appear when there are more than 2 pages. Nút bấm "Trang trước/Trang sau" sẽ xuất hiện khi có từ 2 trang trở lên. - 分页数在2以上时,将会出现上一页/下一页按钮。 - 頁數在2以上時,會出現上一頁/下一頁按鈕。 ページ数が2枚以上の場合、前へ/次へのボタンが現れます。 @@ -634,11 +639,11 @@ text 내용 글자수 - Content Length + Content Length Độ dài nội dung 内容の文字数 - 内容摘要字数 - 內容字數 + 内容摘要字数 + 內容字數 module_srl_list @@ -670,6 +675,8 @@ Feed(RSS/ATOM) URL 피드 주소는 타입이 지원하는 문서 형식일 경우에만 등록 됩니다. (지원 문서 형식 : RSS 2.0, RSS 1.0, ATOM 1.0) + 请输入RSS格式地址。 + (支持文档格式 : RSS 2.0, RSS 1.0, ATOM 1.0) Chỉ hỗ trợ những định dạng được dăng kí. (RSS 2.0 RSS 1.0 ATOM 1.0). RSS URLはタイプが RSSの時だけ登録出来ます。 (サポートする文書形式 : RSS 2.0, RSS 1.0, ATOM 1.0) diff --git a/widgets/counter_status/conf/info.xml b/widgets/counter_status/conf/info.xml index ebe9feed1..211ef4c46 100644 --- a/widgets/counter_status/conf/info.xml +++ b/widgets/counter_status/conf/info.xml @@ -7,7 +7,7 @@ 计数器 Базовый виджет счетчика 計數器 - Counter + Counter 기본 카운터 모듈을 이용하여 전체, 어제, 오늘의 접속현황을 표시합니다. counter모듈이 설치되어 있어야 하고 counter 애드온이 켜져 있어야 합니다. @@ -39,7 +39,7 @@ 利用訪問統計模組顯示總訪問量與昨天、今日的訪問統計量。 想要使用此組件,必須先安裝訪問統計模組並啟動元件。 - + Widget này sẽ hiển thị số người đã truy cập hôm qua và hôm nay bằng cách sử dụng Counter Module cơ bản. Nó cũng thể hiẹn tổng số người đã truy cập. Đê làm việc này bạn phải cài đặt Counter Module và kích hoạt Counter Addon. @@ -55,6 +55,6 @@ zero zero zero - zero + zero diff --git a/widgetstyles/simple/skin.xml b/widgetstyles/simple/skin.xml index f2543e873..77fa30e58 100644 --- a/widgetstyles/simple/skin.xml +++ b/widgetstyles/simple/skin.xml @@ -1,15 +1,15 @@ 심플 스트롱 + 简易细线控件样式 Simple line - Dòng đơn giản - 简易控件样式 + Dòng đơn giản 簡單樣式 シンプルストロング 선 하나만으로 꾸며진 위젯스타일 입니다. + 简易细线控件样式。 A widget style decorated with one simple line. - Widget được trang trí với một dòng đơn giản. - 只有栏目名和查看更多(more)选项的简易控件样式。 + Widget được trang trí với một dòng đơn giản. 只有標題與more按紐的簡單控件樣式。 線一つだけのウィジェットスタイルです。 0.1 @@ -19,7 +19,7 @@ sol sol - sol + sol sol sol sol @@ -29,20 +29,20 @@ 컬러셋 Colorset - Tạo màu + Tạo màu 颜色 顏色 カラーセット 컬러셋을 지정해주세요 Choose colorset - Lựa chọn màu sắc + Lựa chọn màu sắc 请指定适当的颜色。 請選擇顏色。 カラーセットを指定して下さい。 하얀색 White - White + White 白色 白色 @@ -51,7 +51,7 @@ 검은색 Black - Black + Black 黑色 黑色 @@ -61,13 +61,13 @@ 제목 Title - Tiêu đề + Tiêu đề 栏目名 標題 タイトル 제목 텍스트 Title text - Chữ của tiêu đề + Chữ của tiêu đề 请输入栏目名。 請輸入標題。 「タイトル」のテキスト @@ -75,26 +75,28 @@ 더보기 URL more URL - URL của Xem thêm + URL của Xem thêm 查看更多(链接) more URL 「もっと見る」URL http:// 포함한 URL를 등록합니다. + 请输入包含http://的URL地址。 + 請輸入http://以外的URL網址。 Destination of a link 'more'. Register an URL including http:// - Địa chỉ trang sẽ chuyển đến khi bấm vào Xem thêm (Bao gồm cả http://) + Địa chỉ trang sẽ chuyển đến khi bấm vào Xem thêm (Bao gồm cả http://) 「http://」を含んだURLを登録します。 더보기 텍스트 more Text - Chữ của Xem thêm + Chữ của Xem thêm 查看更多(文本) more TEXT 「もっと見る」テキスト 더보기 텍스트 Text for a link 'more' - Có thể dùng những từ khác thay cho từ Xem thêm - 文本形式的"查看更多"。 + 文本格式的"查看更多"。 + Có thể dùng những từ khác thay cho từ Xem thêm 純文字格式。 「もっと見る」テキスト