+
+ <#elseif article.authorId==leftId>
+
+
+ #if>
+
+
+ ${article.articleTitle}
+
+ <#if article.hasUpdated>
+
+ ${updatedLabel}
+
+ #if>
+ <#if article.articlePutTop>
+
+ ${topArticleLabel}
+
+ #if>
+
+
+ ${article.articleAbstract}
+
+
+
+
+
+ #if>
+
+
+#list>
+<#if 0 != paginationPageCount>
+
+#if>
\ No newline at end of file
diff --git a/community-bubbles/article.ftl b/community-bubbles/article.ftl
new file mode 100644
index 0000000..82a6571
--- /dev/null
+++ b/community-bubbles/article.ftl
@@ -0,0 +1,127 @@
+<#include "macro-head.ftl">
+<#include "macro-comments.ftl">
+
+
+
+ <@head title="${article.articleTitle} - ${blogTitle}">
+
+
+ @head>
+
+
+ ${topBarReplacement}
+
+
+
+
+
+ <#if article.hasUpdated>
+ ${article.articleUpdateDate?string("yyyy-MM-dd HH:mm")}
+ <#else>
+ ${article.articleCreateDate?string("yyyy-MM-dd HH:mm")}
+ #if>
+
+
+
+
+
+
+
+
+
+
+ ${article.articleTitle}
+ <#if article.hasUpdated>
+
+ ${updatedLabel}
+
+ #if>
+ <#if article.articlePutTop>
+
+ ${topArticleLabel}
+
+ #if>
+
+
+ ${article.articleContent}
+ <#if "" != article.articleSign.signHTML?trim>
+
+ ${article.articleSign.signHTML}
+
+ #if>
+
+
+
+
+
+
+
+ <@comments commentList=articleComments article=article>@comments>
+
+
+ <#include "side.ftl">
+
+
+ <@comment_script oId=article.oId>
+ page.tips.externalRelevantArticlesDisplayCount = "${externalRelevantArticlesDisplayCount}";
+ <#if 0 != randomArticlesDisplayCount>
+ page.loadRandomArticles();
+ #if>
+ <#if 0 != relevantArticlesDisplayCount>
+ page.loadRelevantArticles('${article.oId}', '
${relevantArticles1Label} ');
+ #if>
+ <#if 0 != externalRelevantArticlesDisplayCount>
+ page.loadExternalRelevantArticles("<#list article.articleTags?split(",") as articleTag>${articleTag}<#if articleTag_has_next>,#if>#list>");
+ #if>
+ @comment_script>
+
+
diff --git a/community-bubbles/author-articles.ftl b/community-bubbles/author-articles.ftl
new file mode 100644
index 0000000..009a96d
--- /dev/null
+++ b/community-bubbles/author-articles.ftl
@@ -0,0 +1,28 @@
+<#include "macro-head.ftl">
+
+
+
+ <@head title="${authorName} - ${blogTitle}">
+
+
+ @head>
+
+
+ ${topBarReplacement}
+
+
+
+ ${commentName1Label}${authorName}
+
+ <#include "article-list.ftl">
+
+
+ <#include "side.ftl">
+
+
+
+
diff --git a/community-bubbles/css/bubbles.css b/community-bubbles/css/bubbles.css
new file mode 100644
index 0000000..2adb199
--- /dev/null
+++ b/community-bubbles/css/bubbles.css
@@ -0,0 +1,135 @@
+/* ------------------------------------------
+PURE CSS SPEECH BUBBLES
+by Nicolas Gallagher
+- http://nicolasgallagher.com/pure-css-speech-bubbles/
+
+http://nicolasgallagher.com
+http://twitter.com/necolas
+
+Created: 02 March 2010
+Version: 1.2 (03 March 2011)
+
+Dual licensed under MIT and GNU GPLv2 � Nicolas Gallagher
+------------------------------------------ */
+
+/* NOTE: Some declarations use longhand notation so that it can be clearly
+explained what specific properties or values do and what their relationship
+is to other properties or values in creating the effect */
+
+/* ============================================================================================================================
+== GENERAL STYLES
+** ============================================================================================================================ */
+
+
+
+
+
+
+/* ============================================================================================================================
+== BUBBLE WITH A BORDER AND TRIANGLE
+** ============================================================================================================================ */
+
+/* THE SPEECH BUBBLE
+------------------------------------------------------------------------------------------------------------------------------- */
+
+.triangle-border {
+ position:relative;
+ padding:15px;
+ margin:1em 0 3em;
+ border:5px solid #5a8f00;
+ color:#333;
+ background:#fff;
+ /* css3 */
+ -webkit-border-radius:10px;
+ -moz-border-radius:10px;
+ border-radius:10px;
+}
+
+/* Variant : for left positioned triangle
+------------------------------------------ */
+
+.triangle-border.left {
+ margin-left:30px;
+}
+
+/* Variant : for right positioned triangle
+------------------------------------------ */
+
+.triangle-border.right {
+ margin-right:30px;
+}
+
+/* THE TRIANGLE
+------------------------------------------------------------------------------------------------------------------------------- */
+
+.triangle-border:before {
+ content:"";
+ position:absolute;
+ bottom:-20px; /* value = - border-top-width - border-bottom-width */
+ left:40px; /* controls horizontal position */
+ border-width:20px 20px 0;
+ border-style:solid;
+ border-color:#5a8f00 transparent;
+ /* reduce the damage in FF3.0 */
+ display:block;
+ width:0;
+}
+
+/* creates the smaller triangle */
+.triangle-border:after {
+ content:"";
+ position:absolute;
+ bottom:-13px; /* value = - border-top-width - border-bottom-width */
+ left:47px; /* value = (:before left) + (:before border-left) - (:after border-left) */
+ border-width:13px 13px 0;
+ border-style:solid;
+ border-color:#fff transparent;
+ /* reduce the damage in FF3.0 */
+ display:block;
+ width:0;
+}
+
+/* Variant : left
+------------------------------------------ */
+
+/* creates the larger triangle */
+.triangle-border.left:before {
+ top:10px; /* controls vertical position */
+ bottom:auto;
+ left:-30px; /* value = - border-left-width - border-right-width */
+ border-width:15px 30px 15px 0;
+ border-color:transparent #5a8f00;
+}
+
+
+/* creates the smaller triangle */
+.triangle-border.left:after {
+ top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */
+ bottom:auto;
+ left:-21px; /* value = - border-left-width - border-right-width */
+ border-width:9px 21px 9px 0;
+ border-color:transparent #fff;
+}
+
+/* Variant : right
+------------------------------------------ */
+
+/* creates the larger triangle */
+.triangle-border.right:before {
+ top:10px; /* controls vertical position */
+ bottom:auto;
+ left:auto;
+ right:-30px; /* value = - border-left-width - border-right-width */
+ border-width:15px 0 15px 30px;
+ border-color:transparent pink;
+}
+
+/* creates the smaller triangle */
+.triangle-border.right:after {
+ top:16px; /* value = (:before top) + (:before border-top) - (:after border-top) */
+ bottom:auto;
+ left:auto;
+ right:-21px; /* value = - border-left-width - border-right-width */
+ border-width:9px 0 9px 21px;
+ border-color:transparent #fff;
+}
diff --git a/community-bubbles/css/community-bubbles.css b/community-bubbles/css/community-bubbles.css
new file mode 100644
index 0000000..025c468
--- /dev/null
+++ b/community-bubbles/css/community-bubbles.css
@@ -0,0 +1,759 @@
+@charset "utf-8";
+/*
+ * skin community style
+ *
+ * @author
Liyuan Li
+ * @version 1.0.0.7, May 15, 2012
+*/
+body {
+ background-color: #EFEFEF;
+ color: #555555;
+ min-width: 960px;
+}
+
+.copyright {
+ background:#E2E2E2;
+ text-align:left;
+ margin:20px 0;
+ padding:3px 0 3px 10px;
+ color:#333;
+ font-size:9pt;
+ line-height:22px;
+ border-left:5px solid #797979;
+}
+
+a, a:link {
+ color:#000000;
+ text-decoration: none;
+}
+
+a:active, a:visited {
+ color: #000000;
+ text-decoration: none;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+.content {
+ width: 940px;
+ margin: 0 auto;
+}
+
+.content>h2 {
+ margin: -20px 0 20px 0;
+}
+
+.hr {
+ background: url("../images/indentline-light.png") repeat-x scroll left top transparent;
+ margin: 20px 0 40px;
+ clear: both;
+ height: 2px;
+}
+
+.arrow-right {
+ background: url("../images/icon.png") 0px -64px no-repeat;
+ float: left;
+ height: 38px;
+ width: 14px;
+}
+
+input[type='button'] {
+ border-radius:5px;
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.3) inset, 0 0 2px rgba(255, 255, 255, 0.3) inset, 0 1px 2px rgba(0, 0, 0, 0.29);
+ background-color: #000000;
+ background-image: linear-gradient(top,#333333,#000000);
+ background-image: -moz-linear-gradient(top,#333333,#000000);
+ background-image: -ms-linear-gradient(top,#333333,#000000);
+ background-image: -o-linear-gradient(top,#333333,#000000);
+ background-image: -webkit-gradient(linear,left top,left bottom,from(#333333),to(#000000));
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#000000');
+ border: 1px solid #000000;
+ color: white;
+ margin: 15px 0 0 200px;
+ padding: 7px 13px;
+ height: auto;
+}
+
+input[type='button']:hover {
+ background-color: #333333;
+ background-image: linear-gradient(top,#333333,#212121);
+ background-image: -moz-linear-gradient(top,#333333,#212121);
+ background-image: -ms-linear-gradient(top,#333333,#212121);
+ background-image: -o-linear-gradient(top,#333333,#212121);
+ background-image: -webkit-gradient(linear,left top,left bottom,from(#333333),to(#212121));
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#212121');
+}
+
+.minwidth20per{
+ max-width:20%;
+}
+.minwidth70per{
+ max-width:70%;
+}
+
+.marginBottom40 {
+ margin-bottom: 40px;
+}
+
+/* header */
+.header-user {
+ background-color: #DEDEDE;
+ padding-top: 1px;
+}
+
+.header-navi {
+ background: url("../images/icon.png") 0px -130px repeat-x #333333;
+ margin-bottom: 50px;
+}
+
+a.header-title {
+ color: #FFFFFF;
+ text-decoration: none;
+ line-height: 49px;
+ font: bold 35px/53px '微软雅黑,Arial,Helvetica';
+}
+
+.sub-title {
+ color: #9BC4CE;
+ margin-left: 10px;
+}
+
+.header-navi-main .tabs {
+ list-style: none;
+ height: 57px;
+}
+
+.header-navi-main .tab {
+ float: left;
+ font-size: 16px;
+ margin-left: 1px;
+ height: 57px;
+}
+
+.header-navi-main .tab:hover {
+ background: url("../images/icon.png") repeat-x scroll 0 -130px #9BC4CE;
+}
+
+#header-pages {
+ position: relative;
+}
+
+.header-navi-main .tab a {
+ color: #FFFFFF;
+ display: block;
+ font-weight: bold;
+ line-height: 22px;
+ padding: 19px 16px 16px;
+ text-decoration: none;
+}
+
+#header-pages:hover .sub-tabs {
+ left: 0px;
+ list-style: none;
+ position: absolute;
+ top: 57px;
+ display: block;
+}
+
+.header-navi-main .sub-tab {
+ background-color: #9BC4CE;
+ border-bottom: 1px solid #76A0AA;
+ border-top: 1px solid #B4D9E2;
+ margin-left: 0px;
+}
+
+.header-navi-main .sub-tab a {
+ min-width: 98px;
+ padding: 0 16px;
+ line-height: 42px;
+ font-size: 14px;
+}
+
+.header-navi-main .sub-tab:hover {
+ background-color: #76A0AA;
+}
+
+/* article list */
+.article-header {
+ color: #9F9F9F;
+ float: left;
+ font-size: 12px;
+ padding-top: 15px;
+ /* width: 180px; */
+ display:inline-block;
+}
+
+.article-header ul {
+ background-color: #333333;
+ list-style: none;
+ width: 160px;
+}
+
+.article-header ul li {
+ background: url("../images/indentline.png") repeat-x scroll left bottom transparent;
+ font-weight: bold;
+ padding: 7px 15px 8px;
+ margin-left: 0px;
+}
+
+.article-header ul li a {
+ color: #FFFFFF;
+ display: block;
+}
+
+.article-main {
+ background-color: #FFFFFF;
+ border-bottom: 1px solid #E3E3E3;
+ border-right: 1px solid #E3E3E3;
+ margin-right:20px;
+ padding: 20px 20px 0;
+ /* width: 499px; */
+ /* float: left; */
+ overflow: hidden;
+ display:inline-block;
+}
+
+.article-main-right {
+ background-color: #FFFFFF;
+ border-bottom: 1px solid #E3E3E3;
+ border-left: 1px solid #E3E3E3;
+ border-right:none;
+ margin-right:20px;
+ padding: 20px 20px 0;
+ /* width: 499px; */
+ /* float: left; */
+ overflow: hidden;
+ display:inline-block;
+}
+
+.article-body {
+ line-height: 145%;
+}
+
+.article-body a {
+ color: #075181;
+}
+
+.article-body a:hover {
+ color: #68ADD5;
+}
+
+.article-main h2.title {
+ font: bold 30px Arial,Helvetica,sans-serif;
+ margin: 0 0 20px;
+}
+
+.article-main h2.title sup {
+ font-size: 12px;
+}
+
+.read-more a {
+ background-color:#F2F2F2;
+ color: #333333;
+ font-size: 12px;
+ padding: 8px 18px 8px 12px;
+ margin: 20px 0;
+ float: left;
+}
+
+.article-footer {
+ width: 200px;
+ float: left;
+}
+
+.article-footer h3 {
+ background: url("../images/indentline-light.png") repeat-x scroll left bottom transparent;
+ font-size: 17px;
+ padding: 25px 0 10px;
+}
+
+.article-footer ul {
+ list-style: none;
+}
+
+.article-footer li {
+ margin-left: 0px;
+ border-bottom: 1px solid #E0E0E0;
+ padding: 8px 5px;
+}
+
+.article-footer a {
+ color: #888888;
+ margin-bottom: 2px;
+ display: block;
+}
+
+.pagination {
+ background-color: #FFFFFF;
+ border-right: 1px solid #E3E3E3;
+ border-bottom: 1px solid #E3E3E3;
+ margin: 0 0 20px 0px;
+ text-align: center;
+ padding: 12px 20px;
+}
+
+.pagination a {
+ color: #555555;
+ padding: 0 3px;
+ text-decoration: none;
+}
+.pagination a.selected {
+ font-weight: bold;
+}
+
+.pagination a:hover, .pagination a.selected {
+ text-decoration: underline;
+}
+
+/* article detail */
+.article-detail-body {
+ width: 716px;
+ margin-right: 0px;
+}
+
+.article-detail-body .tags, #replyForm {
+ margin: 20px 0;
+}
+
+.article-detail-footer {
+ background-color: #FFFFFF;
+ border-bottom: 1px solid #E3E3E3;
+ border-right: 1px solid #E3E3E3;
+ margin: 40px 0 40px 181px;
+ padding:20px;
+ width: 716px;
+}
+
+.article-detail-footer>a{
+ font-weight: bold;
+}
+
+.article-relative {
+ margin-top: 20px;
+ width: 360px;
+}
+
+.article-relative h4 {
+ font-size: 14px;
+ line-height: 25px;
+}
+
+.article-relative a {
+ color: #555555;
+ line-height: 145%;
+}
+
+#comments {
+ background: url("../images/indentline-light.png") repeat-x scroll left top transparent;
+ padding-top: 30px;
+ position: relative;
+}
+#comments>div{
+ margin-top: 10px;
+}
+
+#comments>div>img {
+ height: 80px;
+ width: 80px;
+ margin: 1px 10px 10px 0;
+}
+
+#comments .comment-panel {
+ background: none repeat scroll 0 0 #FFFFFF;
+ border-bottom: 1px solid #E3E3E3;
+ border-right: 1px solid #E3E3E3;
+ padding: 20px;
+ width: 798px;
+ margin-bottom: 10px;
+ word-wrap:break-word;
+ overflow: hidden;
+}
+
+#comments .comment-top {
+ margin-bottom: 10px;
+}
+
+#comments .comment-panel .reply {
+ margin-top: 20px;
+}
+
+#comments .comment-panel .reply a {
+ border-radius:5px;
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.3) inset, 0 0 2px rgba(255, 255, 255, 0.3) inset, 0 1px 2px rgba(0, 0, 0, 0.29);
+ background-color: #EEEEEE;
+ border: 1px solid #888888;
+ color: #555555;
+ padding: 2px 10px;
+}
+
+#comments .comment-panel .reply a:hover {
+ background-color: #E6E6E6;
+ text-decoration: none;
+}
+
+.comment-body-ref {
+ position: absolute;
+ border: 1px solid #E3E3E3;
+ background-color: #FFFFFF;
+ padding: 10px 0 0 10px;
+ left: 177px;
+ opacity: 0.9;
+}
+
+#comments .comment-body-ref .comment-panel{
+ border-width: 0px;
+ margin-bottom: 0;
+ width: 620px;
+ padding: 10px;
+}
+
+.comment-title {
+ color: #333333;
+ font-size: 30px;
+ margin: 20px 0 15px 0;
+ font-family: \5fae\8f6f\96c5\9ed1;
+}
+
+.comment {
+ margin-bottom: 40px;
+}
+
+.comment th {
+ padding: 10px 0px 10px 0;
+ text-align: left;
+}
+
+.comment input[type="text"], .comment textarea {
+ outline: none;
+ color: #666666;
+ padding: 10px 7px;
+ background-color: #FFFFFF;
+ font-family: Arial,Helvetica,sans-serif;
+ width: 723px;
+ border: 1px solid #DDDDDD;
+ font-size: 12px;
+ height: 16px;
+ line-height: 16px;
+}
+
+.comment textarea {
+ margin: 10px 0;
+ padding: 7px;
+ height: auto;
+}
+
+.comment #captchaReply {
+ margin-left: 10px;
+}
+
+#commentValidate, #commentValidateReply {
+ width: 240px;
+}
+
+.em00, .em01, .em02, .em03, .em04, .em05, .em06, .em07, .em08, .em09, .em10, .em11, .em12, .em13, .em14 {
+ background-image: url("../../community/images/emotions/emotions-black.png");
+ margin: 0 12px;
+}
+
+/* header notice */
+.header-notice {
+ background: url("../images/indentline-light.png") repeat-x scroll left top #DEDEDE;
+ padding: 40px 0;
+}
+.header-cnt{
+ border:5px dashed blue;
+}
+.notice-cnt{
+ padding:15px;
+ font-size:24px;
+}
+
+.header-notice h4 {
+ background-color: #333333;
+ color: #FFFFFF;
+ float: left;
+ font-size: 17px;
+ font-weight: bold;
+ height: 37px;
+ line-height: 37px;
+ padding-left: 15px;
+ width: 145px;
+}
+
+/* footer secondary */
+.footer-secondary {
+ background: url("../images/indentline-light.png") repeat-x scroll left top #DEDEDE;
+ padding: 40px 0;
+}
+
+.footer-secondary h4, .article-date, .comment th span.comment-label {
+ background-color: #333333;
+ color: #FFFFFF;
+ float: left;
+ font-size: 17px;
+ font-weight: bold;
+ height: 37px;
+ line-height: 37px;
+ padding-left: 15px;
+ width: 145px;
+}
+
+.most-view-count-articles, .recent-comments, .notice {
+ float: left;
+ width: 700px;
+ margin-left: 65px;
+ word-break:break-all;
+ word-wrap:break-word;
+}
+
+.most-view-count-articles a {
+ font: 18px 微软雅黑;
+ margin-right: 20px;
+ font-weight: bold;
+}
+
+.most-view-count-articles sup {
+ font-size: 12px;
+ color: #555555;
+ font-weight: normal;
+ margin-right: 3px;
+}
+
+.recent-comments div {
+ float: left;
+ margin: 0 25px 10px 0px;
+ text-align: center;
+ width: 91px;
+}
+
+.recent-comments div a {
+ display: block;
+ line-height: 22px;
+}
+
+.recent-comments img, #comments>div>img {
+ background-color: #FFFFFF;
+ border-bottom: 1px solid #C2C2C2;
+ border-right: 1px solid #C2C2C2;
+ padding: 8px 7px 7px 8px;
+ width: 75px;
+ height: 75px;
+}
+
+.recent-comments img:hover, #comments>div>img:hover {
+ border-color: #5A5A5A;
+}
+
+/* footer widgets */
+.footer-widgets {
+ background: url("../images/indentline-light.png") repeat-x scroll left top transparent;
+ padding: 40px 0;
+}
+
+.footer-block {
+ margin-right: 20px;
+ width: 220px;
+}
+
+.footer-block h4{
+ font: bold 18px 微软雅黑;
+ color: #000000;
+ height: 25px;
+ padding: 0 0 15px;
+ background: url("../images/indentline.png") repeat-x scroll left bottom transparent;
+}
+
+.footer-block ul {
+ list-style: none;
+}
+
+.footer-block li {
+ margin-left: 0px;
+ height: 30px;
+ padding-left: 10px;
+ background: url("../images/indentline-light.png") repeat-x scroll left bottom transparent;
+}
+
+.footer-block li.mostUsedTags a{
+ padding-left: 20px;
+}
+
+.footer-block li img{
+ cursor: pointer;
+ height: 16px;
+ left: 0px;
+ position: relative;
+ top: -20px;
+ width: 16px;
+}
+
+.footer-block li a {
+ color: #555555;
+ display: block;
+ height: 19px;
+ line-height: 19px;
+ overflow: hidden;
+ padding: 6px 0 1px 0px;
+}
+
+.footer-block li sup {
+ float: left;
+ margin: 5px 3px 0 0;
+}
+
+.footer-block li:hover {
+ background: url("../images/icon.png") repeat-x 0px -34px;
+}
+
+/* footer copyright */
+.footer {
+ background: url("../images/indentline-light.png") repeat-x scroll left top #DEDEDE;
+ text-align: left;
+}
+
+.footer .content {
+ line-height: 22px;
+}
+
+.footer a {
+ color: #000000;
+}
+
+.footer .goTop {
+ background: url("../images/icon.png") no-repeat -12px -64px;
+ cursor: pointer;
+ padding-left: 15px;
+ height: 17px;
+ line-height: 17px;
+}
+
+/* error */
+.error-msg {
+ color: #333333;
+ font-weight: bold;
+}
+
+.error-footer {
+ bottom: 0;
+ position: fixed;
+ width: 100%;
+}
+
+.error-panel {
+ background-color: #FFFFFF;
+ border-bottom: 1px solid #E3E3E3;
+ border-right: 1px solid #E3E3E3;
+ margin-bottom: 50px;
+ padding: 20px;
+}
+
+.error-panel h2 {
+ font: bold 30px/24px;
+ margin: 0 0 20px;
+}
+
+/* icon */
+.read-more-icon, .arrow-dowm-icon, .tag-icon, .atom-icon, .up-icon, .down-icon {
+ background-image: url("../images/icon.png");
+ background-repeat: no-repeat;
+ float: left;
+}
+.read-more-icon {
+ background-position: 0 -22px;
+ height: 12px;
+ margin: 2px 0 0 6px;
+ width: 12px;
+}
+
+.arrow-dowm-icon {
+ background-position: -13px -22px;
+ height: 13px;
+ margin: 8px 0 0 6px;
+ width: 13px;
+ cursor: pointer;
+}
+
+.tag-icon {
+ background-position: 0px -102px;
+ margin-right: 6px;
+ height: 16px;
+ width: 16px;
+}
+
+.atom-icon {
+ height: 22px;
+ margin-left: 6px;
+ width: 22px;
+}
+
+.up-icon {
+ background-position: -11px -118px;
+ height: 12px;
+ margin: 6px 0 0 10px;
+ width: 11px;
+ cursor: pointer;
+}
+
+.down-icon {
+ background-position: 0 -118px;
+ height: 12px;
+ margin: 6px 0 0 10px;
+ width: 11px;
+ cursor: pointer;
+}
+
+.star-current-icon, .star-icon, .moon-icon, .moon-current-icon {
+ height: 58px;
+ width: 64px;
+ background-image: url("../images/author-header.png");
+ float: right;
+ white-space:normal;
+ text-align: center;
+ word-break:break-all;
+ padding-top: 6px;
+ word-wrap:break-word;
+ font-weight: bold;
+}
+
+.star-current-icon {
+ background-position: 0px -64px;
+}
+
+a.star-current-icon {
+ color: #333333;
+}
+
+.star-icon {
+ background-position: 0 -192px;
+}
+
+a.star-icon {
+ color: orange;
+}
+
+.moon-icon {
+ float: right;
+ margin-top: 4px;
+}
+
+.moon-current-icon {
+ float: right;
+ background-position: 0 -128px;
+ margin: 1px 0 3px 0;
+}
+
+#tagsPanel a.tagPanel:hover {
+ border: 1px dashed;
+}
+
+#tagsPanel a.tagPanel {
+ border: 1px solid;
+ -moz-border-radius: 5px;
+ -webkit-border-radius: 5px;
+ border-radius: 5px;
+ margin: 3px;
+ cursor: pointer;
+ float: left;
+}
\ No newline at end of file
diff --git a/community-bubbles/footer.ftl b/community-bubbles/footer.ftl
new file mode 100644
index 0000000..df86ad5
--- /dev/null
+++ b/community-bubbles/footer.ftl
@@ -0,0 +1,112 @@
+
+
+
+
${goTopLabel}
+
+
+ ${viewCount1Label}
+
+ ${statistic.statisticBlogViewCount}
+
+
+ ${articleCount1Label}
+
+ ${statistic.statisticPublishedBlogArticleCount}
+
+
+ ${commentCount1Label}
+
+ ${statistic.statisticPublishedBlogCommentCount}
+
+
+
+
+
+
+
+
+${plugins}
\ No newline at end of file
diff --git a/community-bubbles/header.ftl b/community-bubbles/header.ftl
new file mode 100644
index 0000000..47de2c9
--- /dev/null
+++ b/community-bubbles/header.ftl
@@ -0,0 +1,59 @@
+<#if 1 != users?size>
+
+#if>
+
\ No newline at end of file
diff --git a/community-bubbles/images/author-header.png b/community-bubbles/images/author-header.png
new file mode 100644
index 0000000..2424668
Binary files /dev/null and b/community-bubbles/images/author-header.png differ
diff --git a/community-bubbles/images/emotions/em00.png b/community-bubbles/images/emotions/em00.png
new file mode 100644
index 0000000..2420609
Binary files /dev/null and b/community-bubbles/images/emotions/em00.png differ
diff --git a/community-bubbles/images/emotions/em01.png b/community-bubbles/images/emotions/em01.png
new file mode 100644
index 0000000..bddbe24
Binary files /dev/null and b/community-bubbles/images/emotions/em01.png differ
diff --git a/community-bubbles/images/emotions/em02.png b/community-bubbles/images/emotions/em02.png
new file mode 100644
index 0000000..39051f3
Binary files /dev/null and b/community-bubbles/images/emotions/em02.png differ
diff --git a/community-bubbles/images/emotions/em03.png b/community-bubbles/images/emotions/em03.png
new file mode 100644
index 0000000..8cf9113
Binary files /dev/null and b/community-bubbles/images/emotions/em03.png differ
diff --git a/community-bubbles/images/emotions/em04.png b/community-bubbles/images/emotions/em04.png
new file mode 100644
index 0000000..fb061a8
Binary files /dev/null and b/community-bubbles/images/emotions/em04.png differ
diff --git a/community-bubbles/images/emotions/em05.png b/community-bubbles/images/emotions/em05.png
new file mode 100644
index 0000000..83d82b4
Binary files /dev/null and b/community-bubbles/images/emotions/em05.png differ
diff --git a/community-bubbles/images/emotions/em06.png b/community-bubbles/images/emotions/em06.png
new file mode 100644
index 0000000..20d66f0
Binary files /dev/null and b/community-bubbles/images/emotions/em06.png differ
diff --git a/community-bubbles/images/emotions/em07.png b/community-bubbles/images/emotions/em07.png
new file mode 100644
index 0000000..dcda19c
Binary files /dev/null and b/community-bubbles/images/emotions/em07.png differ
diff --git a/community-bubbles/images/emotions/em08.png b/community-bubbles/images/emotions/em08.png
new file mode 100644
index 0000000..676df26
Binary files /dev/null and b/community-bubbles/images/emotions/em08.png differ
diff --git a/community-bubbles/images/emotions/em09.png b/community-bubbles/images/emotions/em09.png
new file mode 100644
index 0000000..94f4605
Binary files /dev/null and b/community-bubbles/images/emotions/em09.png differ
diff --git a/community-bubbles/images/emotions/em10.png b/community-bubbles/images/emotions/em10.png
new file mode 100644
index 0000000..11f9f4c
Binary files /dev/null and b/community-bubbles/images/emotions/em10.png differ
diff --git a/community-bubbles/images/emotions/em11.png b/community-bubbles/images/emotions/em11.png
new file mode 100644
index 0000000..9979744
Binary files /dev/null and b/community-bubbles/images/emotions/em11.png differ
diff --git a/community-bubbles/images/emotions/em12.png b/community-bubbles/images/emotions/em12.png
new file mode 100644
index 0000000..0c9d57f
Binary files /dev/null and b/community-bubbles/images/emotions/em12.png differ
diff --git a/community-bubbles/images/emotions/em13.png b/community-bubbles/images/emotions/em13.png
new file mode 100644
index 0000000..5279d49
Binary files /dev/null and b/community-bubbles/images/emotions/em13.png differ
diff --git a/community-bubbles/images/emotions/em14.png b/community-bubbles/images/emotions/em14.png
new file mode 100644
index 0000000..7594861
Binary files /dev/null and b/community-bubbles/images/emotions/em14.png differ
diff --git a/community-bubbles/images/emotions/emotions-black.png b/community-bubbles/images/emotions/emotions-black.png
new file mode 100644
index 0000000..3e67ef9
Binary files /dev/null and b/community-bubbles/images/emotions/emotions-black.png differ
diff --git a/community-bubbles/images/icon.png b/community-bubbles/images/icon.png
new file mode 100644
index 0000000..0969cba
Binary files /dev/null and b/community-bubbles/images/icon.png differ
diff --git a/community-bubbles/images/indentline-light.png b/community-bubbles/images/indentline-light.png
new file mode 100644
index 0000000..2c267b8
Binary files /dev/null and b/community-bubbles/images/indentline-light.png differ
diff --git a/community-bubbles/images/indentline.png b/community-bubbles/images/indentline.png
new file mode 100644
index 0000000..f57ef44
Binary files /dev/null and b/community-bubbles/images/indentline.png differ
diff --git a/community-bubbles/index.ftl b/community-bubbles/index.ftl
new file mode 100644
index 0000000..19b5679
--- /dev/null
+++ b/community-bubbles/index.ftl
@@ -0,0 +1,28 @@
+<#include "macro-head.ftl">
+
+
+
+ <@head title="${blogTitle}">
+
+
+ @head>
+
+
+ ${topBarReplacement}
+
+
+ <#include "notice.ftl">
+
+
+ <#include "article-list.ftl">
+
+
+ <#include "side.ftl">
+
+
+
+
diff --git a/community-bubbles/js/gravatar.js b/community-bubbles/js/gravatar.js
new file mode 100644
index 0000000..bba1a1a
--- /dev/null
+++ b/community-bubbles/js/gravatar.js
@@ -0,0 +1,7 @@
+function getIcon(email){
+ return "http://secure.gravatar.com/avatar/" + hex_md5(trim(email.toLowerCase())) +"?s=160&r=G";
+}
+
+function trim(str){
+ return str.replace(/(^\s*)|(\s*$)/g, "");
+}
diff --git a/community-bubbles/js/md5.js b/community-bubbles/js/md5.js
new file mode 100644
index 0000000..131d08f
--- /dev/null
+++ b/community-bubbles/js/md5.js
@@ -0,0 +1,379 @@
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
+var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_md5(s) { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
+function b64_md5(s) { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }
+function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }
+function hex_hmac_md5(k, d)
+ { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
+function b64_hmac_md5(k, d)
+ { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
+function any_hmac_md5(k, d, e)
+ { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function md5_vm_test()
+{
+ return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72";
+}
+
+/*
+ * Calculate the MD5 of a raw string
+ */
+function rstr_md5(s)
+{
+ return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
+}
+
+/*
+ * Calculate the HMAC-MD5, of a key and some data (raw strings)
+ */
+function rstr_hmac_md5(key, data)
+{
+ var bkey = rstr2binl(key);
+ if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
+
+ var ipad = Array(16), opad = Array(16);
+ for(var i = 0; i < 16; i++)
+ {
+ ipad[i] = bkey[i] ^ 0x36363636;
+ opad[i] = bkey[i] ^ 0x5C5C5C5C;
+ }
+
+ var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
+ return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
+}
+
+/*
+ * Convert a raw string to a hex string
+ */
+function rstr2hex(input)
+{
+ try { hexcase } catch(e) { hexcase=0; }
+ var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+ var output = "";
+ var x;
+ for(var i = 0; i < input.length; i++)
+ {
+ x = input.charCodeAt(i);
+ output += hex_tab.charAt((x >>> 4) & 0x0F)
+ + hex_tab.charAt( x & 0x0F);
+ }
+ return output;
+}
+
+/*
+ * Convert a raw string to a base-64 string
+ */
+function rstr2b64(input)
+{
+ try { b64pad } catch(e) { b64pad=''; }
+ var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var output = "";
+ var len = input.length;
+ for(var i = 0; i < len; i += 3)
+ {
+ var triplet = (input.charCodeAt(i) << 16)
+ | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
+ | (i + 2 < len ? input.charCodeAt(i+2) : 0);
+ for(var j = 0; j < 4; j++)
+ {
+ if(i * 8 + j * 6 > input.length * 8) output += b64pad;
+ else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
+ }
+ }
+ return output;
+}
+
+/*
+ * Convert a raw string to an arbitrary string encoding
+ */
+function rstr2any(input, encoding)
+{
+ var divisor = encoding.length;
+ var i, j, q, x, quotient;
+
+ /* Convert to an array of 16-bit big-endian values, forming the dividend */
+ var dividend = Array(Math.ceil(input.length / 2));
+ for(i = 0; i < dividend.length; i++)
+ {
+ dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
+ }
+
+ /*
+ * Repeatedly perform a long division. The binary array forms the dividend,
+ * the length of the encoding is the divisor. Once computed, the quotient
+ * forms the dividend for the next step. All remainders are stored for later
+ * use.
+ */
+ var full_length = Math.ceil(input.length * 8 /
+ (Math.log(encoding.length) / Math.log(2)));
+ var remainders = Array(full_length);
+ for(j = 0; j < full_length; j++)
+ {
+ quotient = Array();
+ x = 0;
+ for(i = 0; i < dividend.length; i++)
+ {
+ x = (x << 16) + dividend[i];
+ q = Math.floor(x / divisor);
+ x -= q * divisor;
+ if(quotient.length > 0 || q > 0)
+ quotient[quotient.length] = q;
+ }
+ remainders[j] = x;
+ dividend = quotient;
+ }
+
+ /* Convert the remainders to the output string */
+ var output = "";
+ for(i = remainders.length - 1; i >= 0; i--)
+ output += encoding.charAt(remainders[i]);
+
+ return output;
+}
+
+/*
+ * Encode a string as utf-8.
+ * For efficiency, this assumes the input is valid utf-16.
+ */
+function str2rstr_utf8(input)
+{
+ var output = "";
+ var i = -1;
+ var x, y;
+
+ while(++i < input.length)
+ {
+ /* Decode utf-16 surrogate pairs */
+ x = input.charCodeAt(i);
+ y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
+ if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
+ {
+ x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
+ i++;
+ }
+
+ /* Encode output as utf-8 */
+ if(x <= 0x7F)
+ output += String.fromCharCode(x);
+ else if(x <= 0x7FF)
+ output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
+ 0x80 | ( x & 0x3F));
+ else if(x <= 0xFFFF)
+ output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
+ 0x80 | ((x >>> 6 ) & 0x3F),
+ 0x80 | ( x & 0x3F));
+ else if(x <= 0x1FFFFF)
+ output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
+ 0x80 | ((x >>> 12) & 0x3F),
+ 0x80 | ((x >>> 6 ) & 0x3F),
+ 0x80 | ( x & 0x3F));
+ }
+ return output;
+}
+
+/*
+ * Encode a string as utf-16
+ */
+function str2rstr_utf16le(input)
+{
+ var output = "";
+ for(var i = 0; i < input.length; i++)
+ output += String.fromCharCode( input.charCodeAt(i) & 0xFF,
+ (input.charCodeAt(i) >>> 8) & 0xFF);
+ return output;
+}
+
+function str2rstr_utf16be(input)
+{
+ var output = "";
+ for(var i = 0; i < input.length; i++)
+ output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
+ input.charCodeAt(i) & 0xFF);
+ return output;
+}
+
+/*
+ * Convert a raw string to an array of little-endian words
+ * Characters >255 have their high-byte silently ignored.
+ */
+function rstr2binl(input)
+{
+ var output = Array(input.length >> 2);
+ for(var i = 0; i < output.length; i++)
+ output[i] = 0;
+ for(var i = 0; i < input.length * 8; i += 8)
+ output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
+ return output;
+}
+
+/*
+ * Convert an array of little-endian words to a string
+ */
+function binl2rstr(input)
+{
+ var output = "";
+ for(var i = 0; i < input.length * 32; i += 8)
+ output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
+ return output;
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
+ */
+function binl_md5(x, len)
+{
+ /* append padding */
+ x[len >> 5] |= 0x80 << ((len) % 32);
+ x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+ var a = 1732584193;
+ var b = -271733879;
+ var c = -1732584194;
+ var d = 271733878;
+
+ for(var i = 0; i < x.length; i += 16)
+ {
+ var olda = a;
+ var oldb = b;
+ var oldc = c;
+ var oldd = d;
+
+ a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+ d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+ c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819);
+ b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+ a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+ d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426);
+ c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+ b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+ a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416);
+ d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+ c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
+ b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+ a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682);
+ d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+ c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+ b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329);
+
+ a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+ d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+ c = md5_gg(c, d, a, b, x[i+11], 14, 643717713);
+ b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+ a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+ d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083);
+ c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+ b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+ a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438);
+ d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+ c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+ b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501);
+ a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+ d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+ c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473);
+ b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+ a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+ d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+ c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562);
+ b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+ a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+ d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353);
+ c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+ b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+ a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174);
+ d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+ c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+ b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189);
+ a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+ d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+ c = md5_hh(c, d, a, b, x[i+15], 16, 530742520);
+ b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+ a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+ d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415);
+ c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+ b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+ a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571);
+ d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+ c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+ b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+ a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359);
+ d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+ c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+ b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649);
+ a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+ d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+ c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259);
+ b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+ a = safe_add(a, olda);
+ b = safe_add(b, oldb);
+ c = safe_add(c, oldc);
+ d = safe_add(d, oldd);
+ }
+ return Array(a, b, c, d);
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function md5_cmn(q, a, b, x, s, t)
+{
+ return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
+}
+function md5_ff(a, b, c, d, x, s, t)
+{
+ return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+function md5_gg(a, b, c, d, x, s, t)
+{
+ return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+function md5_hh(a, b, c, d, x, s, t)
+{
+ return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+function md5_ii(a, b, c, d, x, s, t)
+{
+ return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+ var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+ var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function bit_rol(num, cnt)
+{
+ return (num << cnt) | (num >>> (32 - cnt));
+}
diff --git a/community-bubbles/lang/lang_en_US.properties b/community-bubbles/lang/lang_en_US.properties
new file mode 100644
index 0000000..cd03256
--- /dev/null
+++ b/community-bubbles/lang/lang_en_US.properties
@@ -0,0 +1,293 @@
+#
+# Copyright (c) 2009, 2010, 2011, B3log Team
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# Description: B3log Solo language configurations(en_US).
+# Version: 2.0.5.7, Sep 5, 2011
+# Author: Liang Ding
+#
+
+adminConsoleLabel=Admin
+adminIndexLabel=Admin Index
+postArticleLabel=Post
+articleListLabel=Articles
+commentListLabel=Comments
+draftListLabel=Drafts
+userManageLabel=Users
+commonUserLabel=Common User
+addUserLabel=Add User
+updateUserLabel=Update User
+linkManagementLabel=Links
+pluginMgmtLabel=Plugins
+pluginNameLabel=Name
+versionLabel=Version
+statusLabel=Status
+enabledLabel=Enabled
+disabledLabel=Disabled
+enableLabel=Enable
+disableLabel=Disable
+preferenceLabel=Preference
+localeString1Label=Language:
+timeZoneId1Label=Time Zone:
+adminLabel=Admin
+administratorLabel=Administrator
+loginLabel=Login
+logoutLabel=Logout
+initLabel=Initial
+popTagsLabel=Popular Tags
+tag1Label=Tag:
+tags1Label=Tags:
+recentArticlesLabel=Recent Articles
+recentCommentsLabel=Recent Comments
+postCommentsLabel=Post Comment
+mostCommentArticlesLabel=Most Comment Articles
+mostViewCountArticlesLabel=Most View Articles
+em00Label=Smile
+em01Label=Laughter
+em02Label=Happy
+em03Label=Sad
+em04Label=Cry
+em05Label=No Comments
+em06Label=Fidget
+em07Label=Angry
+em08Label=Look Around
+em09Label=Surprise
+em10Label=Cool
+em11Label=Cheeky
+em12Label=Heart
+em13Label=Heart Broken
+em14Label=Devil
+linkLabel=Friend Links
+sumLabel=
+pageLabel=Page
+commentLabel=Comment
+linkTitleLabel=Link Title
+linkTitle1Label=Title:
+updateLabel=Update
+removeLabel=Remove
+putTopLabel=Put Top
+cancelPutTopLabel=Cancel Put Top
+downloadCountLabel=Count
+sizeLabel=Size
+uploadDateLabel=Upload Date
+downloadURLLabel=Download URL
+downloadLabel=Download
+createDateLabel=Create Date
+updateDateLabel=Update Date
+titleLabel=Title
+title1Label=Title:
+content1Label=Content:
+abstract1Label=Summary:
+publishLabel=Publish
+unPublishLabel=Un Publish
+urlLabel=URL
+url1Label=URL (start protocol, e.g.: http://):
+addLinkLabel=Add Link
+updateLinkLabel=Update Link
+archiveLabel=Archive
+archive1Label=archive:
+yearLabel=
+monthLabel=
+blogSyncLabel=Blog Sync
+pageLabel=Page
+pageMgmtLabel=Pages
+othersLabel=Others
+fileListLabel=Files
+submitUploadLabel=Upload
+fileNameLabel=File Name
+paramSettingsLabel=Parameters
+skinLabel=Skins
+signLabel=Signs
+sign1Label=Signs:
+noSignLabel=No Signs
+signIsNullLabel=This Sign is Null
+statisticLabel=Blog Statistic
+viewLabel=View
+countLabel=Posts
+viewCount1Label=View Count:
+articleCount1Label=Article Count:
+commentCountLabel=Comment Count
+commentCount1Label=Comment Count:
+commentEmotions1Label=Emotions:
+commentEmotionsLabel=Emotions
+commentName1Label=Name:
+commentNameLabel=Name
+commentEmail1Label=Email:
+commentEmailLabel=Email
+commentURL1Label=URL:
+commentURLLabel=URL
+commentContent1Label=Content:
+commentContentLabel=Content
+getDateLabel=Get Date
+getArticleLabel=Get Article
+selectDateLabel=Select Date
+selectDate1Label=Select Date:
+importLabel=Import
+chooseBlog1Label=Choose Blog:
+blogArticleImportLabel=Article Import
+blogSyncMgmtLabel=Blog Sync Management
+syncMgmtLabel=Sync manage Blog
+userName1Label=Username:
+userPassword1Label=Password:
+syncPostLabel=Sync Post
+syncUpdateLabel=Sync Update
+syncRemoveLabel=Sync Remove
+categoryLabel=Category
+noticeBoard1Label=Notice Board:
+noticeBoardLabel=Notice Board
+htmlhead1Label=HTML head:
+indexTagDisplayCnt1Label=Index Tag Display Count:
+indexRecentArticleDisplayCnt1Label=Recent Article Display Count:
+indexRecentCommentDisplayCnt1Label=Recent Comment Display Count:
+indexMostCommentArticleDisplayCnt1Label=Most Comment Article Display Count:
+indexMostViewArticleDisplayCnt1Label=Most View Article Display Count:
+relevantArticlesDisplayCnt1Label=Relevant Article Display Count:
+randomArticlesDisplayCnt1Label=Random Article Display Count:
+externalRelevantArticlesDisplayCnt1Label=External Relevant Article Display Count:
+windowSize1Label=Pagination Window Size:
+pageSize1Label=Pagination Page Size:
+blogTitle1Label=Blog Title:
+blogSubtitle1Label=Blog Subtitle:
+blogHost1Label=Blog Host:
+submmitCommentLabel=Commit Comment
+saveLabel=Save
+tagLabel=Tag
+tagsLabel=Tags
+importedLabel=Imported
+captcha1Label=Captcha:
+captchaLabel=Captcha
+clearAllCacheLabel=Clear all cache
+clearCacheLabel=Clear cache
+indexLabel=Index
+nextArticle1Label=Next:
+previousArticle1Label=Previous:
+updatedLabel=Updated!
+topArticleLabel=Top!
+CSDNBlogLabel=CSDN Blog
+BlogJavaLabel=BlogJava
+CnBlogsLabel=CnBlogs
+previousPageLabel=Previous Page
+nextPagePabel=Next Page
+firstPageLabel=First Page
+lastPageLabel=Last Page
+returnTo1Label=Return to:
+tencentLabel=Tencent
+appKey1Label=App Key:
+appSecret1Label=App Secret:
+postToTencentMicroblogWhilePublishArticleLabel=Post to Tencent microblog while publish an article:
+postToCommunityLabel=Post to Community:
+authorizeTencentMicroblog1Label=Click to authorize:
+googleLabel=Google
+OAuthConsumerSecret1Label=OAuth Consumer Secret:
+atomLabel=Atom
+relevantArticles1Label=Relevant Articles:
+randomArticles1Label=Random Articles:
+externalRelevantArticles1Label=External Relevant Articles:
+metaKeywords1Label=Meta Keywords:
+metaDescription1Label=Meta Description:
+removeUnusedTagsLabel=Remove Unused Tags
+goTopLabel=Top
+permalink1Label=Permalink:
+permalinkLabel=Permalink
+welcomeToSoloLabel=Welcome to B3log Solo!
+b3logLabel=
B 3 L O G
+killBrowserLabel=
Let's kill outdated and insecure browser! Let's kill outdated and insecure browser for browser evolution, human progress and better experience.
You can download
+readmoreLabel=Read more\u00bb
+readmore2Label=Read more
+replyLabel=Reply\u00bb
+homeLabel=Home
+enableArticleUpdateHint1Label=Enable Article Update Hint:
+allowVisitDraftViaPermalink1Label=Allow Visit Draft Via Link:
+author1Label=Author:
+authorLabel=Author
+keyOfSolo1Label=Solo Key:
+articleLabel=Article
+tagArticlesLabel=Tag Articles
+dateArticlesLabel=Archive Date Articles
+authorArticlesLabel=Author Articles
+indexArticleLabel=Index Articles
+allTagsLabel=Tag Cloud
+customizedPageLabel=Customized Page
+killBrowserPageLabel=Kill Browser Page
+pageNumLabel=Page Number
+####
+forbiddenLabel=Forbidden Access!
+sorryLabel=Sorry!
+notFoundLabel=Not Found!
+unPulbishSuccLabel=Un Publish Successfully
+unPulbishFailLabel=Un Publish Fail
+removeSuccLabel=Remove Successfully
+removeFailLabel=Remove Fail
+removeUserFailSkinNeedMulUsersLabel=Remove Fail, the current skin need multiple users!
+putTopSuccLabel=Put Top Successfully
+putTopFailLabel=Put Top Fail
+cancelTopSuccLabel=Cancel Top Successfully
+cancelTopFailLabel=Cancel Top Fail
+addSuccLabel=Add Successfully
+addFailLabel=Add Fail
+updateSuccLabel=Update Successfully
+updateFailLabel=Update Fail
+updatePreferenceFailLabel=Update Fail, please check
Blog Host configuration!
+updatePreferenceFailNeedMulUsersLabel=Update Fail, the selected skin need multiple users!
+setFailLabel=Set Fail
+setSuccLabel=Set Successfully
+getFailLabel=Get Fail
+noSettingLabel=No Setting
+getSuccLabel=Get Successfully
+importSuccLabel=Import Successfully :-)
+importFailLabel=Some Import Fail %>_<%
+noCommentLabel=No Comment
+captchaErrorLabel=Captcha Error
+inputErrorLabel=Input Error!
+gotoLabel=Go
+nameEmptyLabel=Username is empty
+passwordEmptyLabel=Password is empty
+blogEmptyLabel=Blogging service is empty
+blogArticleEmptyLabel=Please select articles
+nameTooLongLabel=Sorry, your username must be between 2 and 20 characters long.
+mailCannotEmptyLabel=Mail is empty
+mailInvalidLabel=Mail is invalid
+commentContentCannotEmptyLabel=Sorry, your content must be between 2 and 500 characters long.
+captchaCannotEmptyLabel=Captcha is empty
+loadingLabel=Loading....
+titleEmptyLabel=Title is empty
+contentEmptyLabel=Content is empty
+orderEmptyLabel=Order is empty
+abstractEmptyLabel=Abstract is empty
+tagsEmptyLabel=Tags is empty
+addressEmptyLabel=Address is empty
+noAuthorizationURLLabel=Can not retrieve authorization URL from Google, please \
+make sure the
Consumer Secret you typed in and then try again.
+exceedMaxUploadSizeLabel=Size exceed 1M :-(
+uploadFailLabel=Upload Fail!
+fileEmptyLabel=File is empty
+duplicatedPermalinkLabel=Duplicated permalink!
+invalidPermalinkFormatLabel=Invalid permalink format!
+duplicatedEmailLabel=Duplicated email!
+canntBeLocalhostOnProductionLabel=Can not set host as localhost on production!
+refreshAndRetryLabel=Please refresh and try again!
+noDataLable=NO Data
+editorLeaveLabel=Content is not null, Do you leave\uff1f
+editorPostLabel=Content is not null, Do you clear\uff1f
+####
+confirmRemoveLabel=Are You Sure?
+confirmInitLabel=Are You Sure?
+####
+articleRightLabel=Articles on this site are copyright.
+articleWelcomeCopyLabel=Please feel free to copy.
+articleCopyNoteLabel=Please include the note:Copy from:
+articleTitleLabel=Title:
+articleLinkLabel=Source:
\ No newline at end of file
diff --git a/community-bubbles/lang/lang_zh_CN.properties b/community-bubbles/lang/lang_zh_CN.properties
new file mode 100644
index 0000000..6a21438
--- /dev/null
+++ b/community-bubbles/lang/lang_zh_CN.properties
@@ -0,0 +1,293 @@
+#
+# Copyright (c) 2009, 2010, 2011, B3log Team
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# Description: B3log Solo default language configurations(zh_CN).
+# Version: 2.0.6.2, Sep 5, 2011
+# Author: Liang Ding
+#
+
+adminConsoleLabel=\u540e\u53f0\u7ba1\u7406
+adminIndexLabel=\u540e\u53f0\u9996\u9875
+postArticleLabel=\u53d1\u5e03\u6587\u7ae0
+articleListLabel=\u6587\u7ae0\u7ba1\u7406
+commentListLabel=\u8bc4\u8bba\u7ba1\u7406
+draftListLabel=\u8349\u7a3f\u5939
+userManageLabel=\u7528\u6237\u7ba1\u7406
+commonUserLabel=\u4e00\u822c\u7528\u6237
+addUserLabel=\u6dfb\u52a0\u7528\u6237
+updateUserLabel=\u66f4\u65b0\u7528\u6237
+linkManagementLabel=\u94fe\u63a5\u7ba1\u7406
+pluginMgmtLabel=\u63d2\u4ef6\u7ba1\u7406
+pluginNameLabel=\u63d2\u4ef6\u540d
+versionLabel=\u7248\u672c
+statusLabel=\u72b6\u6001
+enabledLabel=\u5df2\u542f\u7528
+disabledLabel=\u5df2\u7981\u7528
+enableLabel=\u542f\u7528
+disableLabel=\u7981\u7528
+preferenceLabel=\u504f\u597d\u8bbe\u5b9a
+localeString1Label=\u8bed\u8a00\uff1a
+timeZoneId1Label=\u65f6\u533a\uff1a
+adminLabel=\u7ba1\u7406
+administratorLabel=\u7ba1\u7406\u5458
+loginLabel=\u767b\u5f55
+logoutLabel=\u767b\u51fa
+initLabel=\u521d\u59cb\u5316
+popTagsLabel=\u5206\u7c7b\u6807\u7b7e
+tag1Label=\u6807\u7b7e\uff1a
+tags1Label=\u6807\u7b7e\uff1a
+recentArticlesLabel=\u6700\u65b0\u6587\u7ae0
+recentCommentsLabel=\u6700\u65b0\u8bc4\u8bba
+postCommentsLabel=\u53d1\u8868\u8bc4\u8bba
+mostCommentArticlesLabel=\u8bc4\u8bba\u6700\u591a\u7684\u6587\u7ae0
+mostViewCountArticlesLabel=\u8bbf\u95ee\u6700\u591a\u7684\u6587\u7ae0
+em00Label=\u5fae\u7b11
+em01Label=\u5927\u7b11
+em02Label=\u9ad8\u5174
+em03Label=\u60b2\u4f24
+em04Label=\u54ed\u6ce3
+em05Label=\u65e0\u8bed
+em06Label=\u70e6\u8e81
+em07Label=\u751f\u6c14
+em08Label=\u6211\u7785
+em09Label=\u60ca\u8bb6
+em10Label=\u9177
+em11Label=\u987d\u76ae
+em12Label=\u7231\u5fc3
+em13Label=\u5fc3\u788e
+em14Label=\u9b54\u9b3c
+linkLabel=\u53cb\u60c5\u94fe\u63a5
+sumLabel=\u5171
+pageLabel=\u9875
+commentLabel=\u8bc4\u8bba
+linkTitleLabel=\u94fe\u63a5\u6807\u9898
+linkTitle1Label=\u6807\u9898\uff1a
+updateLabel=\u66f4\u65b0
+removeLabel=\u5220\u9664
+putTopLabel=\u7f6e\u9876
+cancelPutTopLabel=\u53d6\u6d88\u7f6e\u9876
+downloadCountLabel=\u4e0b\u8f7d\u6b21\u6570
+sizeLabel=\u5927\u5c0f
+uploadDateLabel=\u4e0a\u4f20\u65e5\u671f
+downloadURLLabel=\u4e0b\u8f7d\u5730\u5740
+downloadLabel=\u4e0b\u8f7d
+createDateLabel=\u521b\u5efa\u65e5\u671f
+updateDateLabel=\u66f4\u65b0\u65e5\u671f
+titleLabel=\u6807\u9898
+title1Label=\u6807\u9898\uff1a
+content1Label=\u6b63\u6587\uff1a
+abstract1Label=\u6458\u8981\uff1a
+publishLabel=\u53d1\u5e03
+unPublishLabel=\u53d6\u6d88\u53d1\u5e03
+urlLabel=URL
+url1Label=URL (\u8bf7\u4ee5\u534f\u8bae\u5f00\u5934\uff0c\u5982: http://)\uff1a
+addLinkLabel=\u6dfb\u52a0\u94fe\u63a5
+updateLinkLabel=\u66f4\u65b0\u94fe\u63a5
+archiveLabel=\u5b58\u6863
+archive1Label=\u5b58\u6863\uff1a
+yearLabel=\u5e74
+monthLabel=\u6708
+blogSyncLabel=\u535a\u5ba2\u540c\u6b65
+pageLabel=\u9875\u9762
+pageMgmtLabel=\u9875\u9762\u7ba1\u7406
+othersLabel=\u5176\u4ed6
+fileListLabel=\u6587\u4ef6\u7ba1\u7406
+submitUploadLabel=\u4e0a\u4f20
+fileNameLabel=\u6587\u4ef6\u540d
+paramSettingsLabel=\u53c2\u6570\u8bbe\u7f6e
+skinLabel=\u76ae\u80a4
+signLabel=\u7b7e\u540d\u6863
+sign1Label=\u7b7e\u540d\u6863\uff1a
+noSignLabel=\u4e0d\u4f7f\u7528\u7b7e\u540d\u6863
+signIsNullLabel=\u8be5\u7b7e\u540d\u6863\u4e3a\u7a7a
+statisticLabel=\u535a\u5ba2\u7edf\u8ba1
+viewLabel=\u6d4f\u89c8
+countLabel=\u7bc7
+viewCount1Label=\u6d4f\u89c8\u6b21\u6570\uff1a
+articleCount1Label=\u6587\u7ae0\u603b\u6570\uff1a
+commentCountLabel=\u8bc4\u8bba\u6570
+commentCount1Label=\u8bc4\u8bba\u603b\u6570\uff1a
+commentEmotions1Label=\u8868\u60c5\uff1a
+commentEmotionsLabel=\u8868\u60c5
+commentName1Label=\u59d3\u540d\uff1a
+commentNameLabel=\u59d3\u540d
+commentEmail1Label=\u90ae\u7bb1\uff1a
+commentEmailLabel=\u90ae\u7bb1
+commentURL1Label=URL\uff1a
+commentURLLabel=URL
+commentContent1Label=\u8bc4\u8bba\u5185\u5bb9\uff1a
+commentContentLabel=\u8bc4\u8bba\u5185\u5bb9
+getDateLabel=\u83b7\u53d6\u65e5\u671f
+getArticleLabel=\u83b7\u53d6\u6587\u7ae0
+selectDateLabel=\u9009\u62e9\u65e5\u671f
+selectDate1Label=\u9009\u62e9\u65e5\u671f\uff1a
+importLabel=\u5bfc\u5165
+chooseBlog1Label=\u8bf7\u9009\u62e9\u9700\u8981\u7ba1\u7406\u7684\u535a\u5ba2\uff1a
+blogArticleImportLabel=\u6587\u7ae0\u5bfc\u5165
+blogSyncMgmtLabel=\u535a\u5ba2\u540c\u6b65\u7ba1\u7406
+syncMgmtLabel=\u540c\u6b65\u7ba1\u7406\u535a\u5ba2
+userName1Label=\u7528\u6237\u540d\uff1a
+userPassword1Label=\u5bc6\u7801\uff1a
+syncPostLabel=\u540c\u6b65\u53d1\u5e03
+syncUpdateLabel=\u540c\u6b65\u66f4\u65b0
+syncRemoveLabel=\u540c\u6b65\u5220\u9664
+categoryLabel=\u5206\u7c7b
+noticeBoard1Label=\u516c\u544a\uff1a
+noticeBoardLabel=\u516c\u544a
+htmlhead1Label=HTML head\uff1a
+indexTagDisplayCnt1Label= \u9996\u9875\u6807\u7b7e\u663e\u793a\u6570\uff1a
+indexRecentArticleDisplayCnt1Label=\u6700\u65b0\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
+indexRecentCommentDisplayCnt1Label=\u6700\u65b0\u8bc4\u8bba\u663e\u793a\u6570\u76ee\uff1a
+indexMostCommentArticleDisplayCnt1Label=\u8bc4\u8bba\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
+indexMostViewArticleDisplayCnt1Label=\u8bbf\u95ee\u6700\u591a\u6700\u591a\u6587\u7ae0\u663e\u793a\u6570\u76ee\uff1a
+relevantArticlesDisplayCnt1Label=\u76f8\u5173\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
+randomArticlesDisplayCnt1Label=\u968f\u673a\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
+externalRelevantArticlesDisplayCnt1Label=\u7ad9\u5916\u76f8\u5173\u9605\u8bfb\u663e\u793a\u6570\u76ee\uff1a
+windowSize1Label=\u5206\u9875\u9875\u7801\u6700\u5927\u5bbd\u5ea6\uff1a
+pageSize1Label=\u5206\u9875\u6bcf\u9875\u663e\u793a\u6587\u7ae0\u6570\uff1a
+blogTitle1Label=\u535a\u5ba2\u6807\u9898\uff1a
+blogSubtitle1Label=\u535a\u5ba2\u5b50\u6807\u9898\uff1a
+blogHost1Label=\u535a\u5ba2\u5730\u5740\uff1a
+submmitCommentLabel=\u63d0\u4ea4\u8bc4\u8bba
+saveLabel=\u4fdd\u5b58
+tagLabel=\u6807\u7b7e
+tagsLabel=\u6807\u7b7e
+importedLabel=\u5df2\u5bfc\u5165
+captcha1Label=\u9a8c\u8bc1\u7801\uff1a
+captchaLabel=\u9a8c\u8bc1\u7801
+clearAllCacheLabel=\u6e05\u9664\u6240\u6709\u9875\u9762\u7f13\u5b58
+clearCacheLabel=\u6e05\u9664\u672c\u9875\u7f13\u5b58
+indexLabel=\u9996\u9875
+nextArticle1Label=\u65b0\u4e00\u7bc7\uff1a
+previousArticle1Label=\u65e7\u4e00\u7bc7\uff1a
+updatedLabel=\u6709\u66f4\u65b0\uff01
+topArticleLabel=\u7f6e\u9876\uff01
+CSDNBlogLabel=CSDN \u535a\u5ba2
+BlogJavaLabel=BlogJava
+CnBlogsLabel=\u535a\u5ba2\u56ed
+previousPageLabel=\u4e0a\u4e00\u9875
+nextPagePabel=\u4e0b\u4e00\u9875
+firstPageLabel=\u7b2c\u4e00\u9875
+lastPageLabel=\u6700\u540e\u4e00\u9875
+returnTo1Label=\u8fd4\u56de\uff1a
+tencentLabel=\u817e\u8baf
+appKey1Label=App Key:
+appSecret1Label=App Secret:
+postToTencentMicroblogWhilePublishArticleLabel=\u53d1\u6587\u7ae0\u65f6\u540c\u6b65\u5230\u817e\u8baf\u5fae\u535a\uff1a
+postToCommunityLabel=\u53d1\u5e03\u5230\u793e\u533a\uff1a
+authorizeTencentMicroblog1Label=\u70b9\u51fb\u56fe\u6807\u8fdb\u884c\u6388\u6743:
+googleLabel=Google
+OAuthConsumerSecret1Label=OAuth Consumer Secret\uff1a
+atomLabel=Atom
+relevantArticles1Label=\u76f8\u5173\u9605\u8bfb\uff1a
+randomArticles1Label=\u968f\u673a\u9605\u8bfb\uff1a
+externalRelevantArticles1Label=\u7ad9\u5916\u76f8\u5173\u9605\u8bfb\uff1a
+metaKeywords1Label=Meta Keywords:
+metaDescription1Label=Meta Description:
+removeUnusedTagsLabel=\u79fb\u9664\u672a\u4f7f\u7528\u6807\u7b7e
+goTopLabel=\u9876\u90e8
+permalink1Label=\u94fe\u63a5\uff1a
+permalinkLabel=\u94fe\u63a5
+welcomeToSoloLabel=\u6b22\u8fce\u4f7f\u7528 B3log Solo\uff01
+b3logLabel=
B 3 L O G
+killBrowserLabel=
\u8ba9\u6211\u4eec\u653e\u5f03\u4f7f\u7528\u90a3\u4e9b\u8fc7\u65f6\u3001\u4e0d\u5b89\u5168\u7684\u6d4f\u89c8\u5668\u5427\uff01 \u4e3a\u4e86\u8ba9\u6d4f\u89c8\u5668\u66f4\u597d\u7684\u53d1\u5c55\uff0c\u4eba\u7c7b\u66f4\u52a0\u7684\u8fdb\u6b65\uff0c\u62e5\u6709\u66f4\u597d\u7684\u4f53\u9a8c\uff0c\u8ba9\u6211\u4eec\u653e\u5f03\u4f7f\u7528\u90a3\u4e9b\u8fc7\u65f6\u3001\u4e0d\u5b89\u5168\u7684\u6d4f\u89c8\u5668\u3002
\u60a8\u53ef\u4ee5\u4e0b\u8f7d
+readmoreLabel=\u9605\u8bfb\u66f4\u591a\u00bb
+readmore2Label=\u9605\u8bfb\u66f4\u591a
+replyLabel=\u56de\u590d\u00bb
+homeLabel=\u9996\u9875
+enableArticleUpdateHint1Label=\u542f\u7528\u6587\u7ae0\u66f4\u65b0\u63d0\u793a\uff1a
+allowVisitDraftViaPermalink1Label=\u5141\u8bb8\u901a\u8fc7\u94fe\u63a5\u8bbf\u95ee\u8349\u7a3f\uff1a
+author1Label=\u4f5c\u8005\uff1a
+authorLabel=\u4f5c\u8005
+keyOfSolo1Label=Solo Key\uff1a
+articleLabel=\u6587\u7ae0
+tagArticlesLabel=\u6807\u7b7e\u6587\u7ae0\u5217\u8868
+dateArticlesLabel=\u5b58\u6863\u6587\u7ae0\u5217\u8868
+authorArticlesLabel=\u4f5c\u8005\u6587\u7ae0\u5217\u8868
+indexArticleLabel=\u9996\u9875\u6587\u7ae0\u5217\u8868
+allTagsLabel=\u6807\u7b7e\u5899
+customizedPageLabel=\u81ea\u5b9a\u4e49\u9875\u9762
+killBrowserPageLabel=Kill Browser Page
+pageNumLabel=\u9875\u53f7
+####
+forbiddenLabel=\u64cd\u4f5c\u88ab\u7981\u6b62\uff01
+sorryLabel=\u5bf9\u4e0d\u8d77\uff01
+notFoundLabel=\u627e\u4e0d\u5230\uff01
+unPulbishSuccLabel=\u53d6\u6d88\u53d1\u5e03\u6210\u529f
+unPulbishFailLabel=\u53d6\u6d88\u53d1\u5e03\u5931\u8d25
+removeSuccLabel=\u5220\u9664\u6210\u529f
+removeFailLabel=\u5220\u9664\u5931\u8d25
+removeUserFailSkinNeedMulUsersLabel=\u5220\u9664\u5931\u8d25\uff0c\u5f53\u524d\u4f7f\u7528\u7684\u76ae\u80a4\u9700\u8981\u591a\u7528\u6237\u652f\u6301
+putTopSuccLabel=\u7f6e\u9876\u6210\u529f
+putTopFailLabel=\u7f6e\u9876\u5931\u8d25
+cancelTopSuccLabel=\u53d6\u6d88\u7f6e\u9876\u6210\u529f
+cancelTopFailLabel=\u53d6\u6d88\u7f6e\u9876\u5931\u8d25
+addSuccLabel=\u6dfb\u52a0\u6210\u529f
+addFailLabel=\u6dfb\u52a0\u5931\u8d25
+updateSuccLabel=\u66f4\u65b0\u6210\u529f
+updateFailLabel=\u66f4\u65b0\u5931\u8d25
+updatePreferenceFailLabel=\u66f4\u65b0\u5931\u8d25\uff0c\u8bf7\u4ed4\u7ec6\u68c0\u67e5\u201c\u535a\u5ba2\u5730\u5740\u201d\u7684\u914d\u7f6e\u662f\u5426\u6b63\u786e
+updatePreferenceFailNeedMulUsersLabel=\u66f4\u65b0\u5931\u8d25\uff0c\u9700\u8981\u591a\u7528\u6237\u624d\u80fd\u4f7f\u7528\u9009\u62e9\u7684\u76ae\u80a4
+setFailLabel=\u8bbe\u7f6e\u5931\u8d25
+setSuccLabel=\u8bbe\u7f6e\u6210\u529f
+getFailLabel=\u83b7\u53d6\u5931\u8d25
+noSettingLabel=\u8be5\u535a\u5ba2\u65e0\u8d26\u53f7\uff0c\u8bf7\u6dfb\u52a0
+getSuccLabel=\u83b7\u53d6\u6210\u529f
+importSuccLabel=\u5bfc\u5165\u6210\u529f :-)
+importFailLabel=\u90e8\u5206\u5bfc\u5165\u5931\u8d25 %>_<%
+noCommentLabel=\u6682\u65e0\u8bc4\u8bba
+captchaErrorLabel=\u9a8c\u8bc1\u7801\u9519\u8bef
+inputErrorLabel=\u8f93\u5165\u9519\u8bef\uff01
+gotoLabel=\u8df3\u8f6c
+nameEmptyLabel=\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a\uff01
+passwordEmptyLabel=\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a\uff01
+blogEmptyLabel=\u8bf7\u9009\u62e9\u535a\u5ba2\u670d\u52a1\uff01
+blogArticleEmptyLabel=\u8bf7\u9009\u62e9\u9700\u8981\u5bfc\u5165\u7684\u6587\u7ae0
+nameTooLongLabel=\u59d3\u540d\u53ea\u80fd\u4e3a 2 \u5230 20 \u4e2a\u5b57\u7b26\uff01
+mailCannotEmptyLabel=\u90ae\u7bb1\u4e0d\u80fd\u4e3a\u7a7a\uff01
+mailInvalidLabel=\u90ae\u7bb1\u683c\u5f0f\u4e0d\u6b63\u786e\uff01
+commentContentCannotEmptyLabel=\u8bc4\u8bba\u5185\u5bb9\u53ea\u80fd\u4e3a 2 \u5230 500 \u4e2a\u5b57\u7b26\uff01
+captchaCannotEmptyLabel=\u9a8c\u8bc1\u7801\u4e0d\u80fd\u4e3a\u7a7a\uff01
+loadingLabel=\u8f7d\u5165\u4e2d....
+titleEmptyLabel=\u6807\u9898\u4e0d\u80fd\u4e3a\u7a7a\uff01
+contentEmptyLabel=\u5185\u5bb9\u4e0d\u80fd\u4e3a\u7a7a\uff01
+orderEmptyLabel=\u5e8f\u53f7\u4e0d\u80fd\u4e3a\u7a7a\uff01
+abstractEmptyLabel=\u6458\u8981\u4e0d\u80fd\u4e3a\u7a7a\uff01
+tagsEmptyLabel=\u6807\u7b7e\u4e0d\u80fd\u4e3a\u7a7a\uff01
+addressEmptyLabel=\u5730\u5740\u4e0d\u80fd\u4e3a\u7a7a\uff01
+noAuthorizationURLLabel=\u4ece Google \u83b7\u53d6\u6388\u6743\u5730\u5740\u5931\u8d25\uff0c\u8bf7\u786e\u8ba4\u60a8\u8f93\u5165\u7684 \
+
Consumer Secret \u662f\u6b63\u786e\u7684\uff0c\u7136\u540e\u8fdb\u884c\u91cd\u8bd5\u3002
+exceedMaxUploadSizeLabel=\u76ee\u524d\u53ea\u80fd\u4e0a\u4f20\u5c0f\u4e8e 1M \u7684\u6587\u4ef6 :-(
+uploadFailLabel=\u4e0a\u4f20\u5931\u8d25\uff01
+fileEmptyLabel=\u6587\u4ef6\u4e3a\u7a7a\uff01
+duplicatedPermalinkLabel=\u94fe\u63a5\u91cd\u590d\uff01
+invalidPermalinkFormatLabel=\u975e\u6cd5\u7684\u94fe\u63a5\u683c\u5f0f\uff01
+duplicatedEmailLabel=\u90ae\u4ef6\u5730\u5740\u91cd\u590d\uff01
+canntBeLocalhostOnProductionLabel=GAE \u73af\u5883\u4e0a\u8bf7\u52ff\u6307\u5b9a\u535a\u5ba2\u5730\u5740\u4e3a localhost\uff01
+refreshAndRetryLabel=\u8bf7\u5237\u65b0\u91cd\u8bd5\uff01
+noDataLable=\u65e0\u6570\u636e
+editorLeaveLabel=\u7f16\u8f91\u5668\u4e2d\u8fd8\u6709\u5185\u5bb9\uff0c\u662f\u5426\u79bb\u5f00\uff1f
+editorPostLabel=\u7f16\u8f91\u5668\u4e2d\u8fd8\u6709\u5185\u5bb9\uff0c\u662f\u5426\u6e05\u7a7a\uff1f
+####
+confirmRemoveLabel=\u786e\u5b9a\u5220\u9664\uff1f
+confirmInitLabel=\u786e\u5b9a\u8fdb\u884c\u521d\u59cb\u5316\u5417\uff1f
+####
+articleRightLabel=\u672C\u7AD9\u6587\u7AE0\u9664\u6CE8\u660E\u8F6C\u8F7D\u5916\uFF0C\u5747\u4E3A\u672C\u7AD9\u539F\u521B\u6216\u7F16\u8BD1
+articleWelcomeCopyLabel=\u6B22\u8FCE\u4EFB\u4F55\u5F62\u5F0F\u7684\u8F6C\u8F7D\uFF0C\u4F46\u8BF7\u52A1\u5FC5\u6CE8\u660E\u51FA\u5904\uFF0C\u5C0A\u91CD\u4ED6\u4EBA\u52B3\u52A8
+articleCopyNoteLabel=\u8F6C\u8F7D\u8BF7\u6CE8\u660E\uFF1A\u6587\u7AE0\u8F6C\u8F7D\u81EA\uFF1A
+articleTitleLabel=\u672C\u6587\u6807\u9898\uFF1A
+articleLinkLabel=\u672C\u6587\u5730\u5740\uFF1A
diff --git a/community-bubbles/macro-comments.ftl b/community-bubbles/macro-comments.ftl
new file mode 100644
index 0000000..0e02388
--- /dev/null
+++ b/community-bubbles/macro-comments.ftl
@@ -0,0 +1,185 @@
+<#macro comments commentList article>
+
+<#if article.commentable>
+
+
+#if>
+#macro>
+
+<#macro comment_script oId>
+
+
+#macro>
\ No newline at end of file
diff --git a/community-bubbles/macro-head.ftl b/community-bubbles/macro-head.ftl
new file mode 100644
index 0000000..45c65b9
--- /dev/null
+++ b/community-bubbles/macro-head.ftl
@@ -0,0 +1,18 @@
+<#macro head title>
+
+
${title}
+<#nested>
+
+
+
+
+
+
+
+
+
+
+
+
+${htmlHead}
+#macro>
\ No newline at end of file
diff --git a/community-bubbles/notice.ftl b/community-bubbles/notice.ftl
new file mode 100644
index 0000000..ace9aae
--- /dev/null
+++ b/community-bubbles/notice.ftl
@@ -0,0 +1,15 @@
+
\ No newline at end of file
diff --git a/community-bubbles/page.ftl b/community-bubbles/page.ftl
new file mode 100644
index 0000000..6dc10bd
--- /dev/null
+++ b/community-bubbles/page.ftl
@@ -0,0 +1,30 @@
+<#include "macro-head.ftl">
+<#include "macro-comments.ftl">
+
+
+
+ <@head title="${page.pageTitle} - ${blogTitle}">
+
+
+ @head>
+
+
+ ${topBarReplacement}
+
+
+
+ ${page.pageContent}
+
+ <@comments commentList=pageComments article=page>@comments>
+
+
+ <#include "side.ftl">
+
+
+ <@comment_script oId=page.oId>@comment_script>
+
+
diff --git a/community-bubbles/preview.png b/community-bubbles/preview.png
new file mode 100644
index 0000000..11cff66
Binary files /dev/null and b/community-bubbles/preview.png differ
diff --git a/community-bubbles/side.ftl b/community-bubbles/side.ftl
new file mode 100644
index 0000000..5f17c08
--- /dev/null
+++ b/community-bubbles/side.ftl
@@ -0,0 +1,114 @@
+
+
diff --git a/community-bubbles/skin.properties b/community-bubbles/skin.properties
new file mode 100644
index 0000000..a96e7c3
--- /dev/null
+++ b/community-bubbles/skin.properties
@@ -0,0 +1,26 @@
+#
+# Copyright (C) 2011, B3log Team
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+#
+# Description: Community skin.
+# Version: 1.0.0.9, Nov 21, 2012
+# Author: Liyuan Li
+#
+
+name=Community-bubbles
+version=0.0.1
+forSolo=0.5.5
+memo=Refers to http://demo.woothemes.com/skeptical/
\ No newline at end of file
diff --git a/community-bubbles/tag-articles.ftl b/community-bubbles/tag-articles.ftl
new file mode 100644
index 0000000..e2c6e35
--- /dev/null
+++ b/community-bubbles/tag-articles.ftl
@@ -0,0 +1,32 @@
+<#include "macro-head.ftl">
+
+
+
+ <@head title="${tag.tagTitle} - ${blogTitle}">
+
+
+ @head>
+
+
+ ${topBarReplacement}
+
+
+
+ <#include "article-list.ftl">
+
+
+ <#include "side.ftl">
+
+
+
+
diff --git a/community-bubbles/tags.ftl b/community-bubbles/tags.ftl
new file mode 100644
index 0000000..a8d12f8
--- /dev/null
+++ b/community-bubbles/tags.ftl
@@ -0,0 +1,41 @@
+<#include "macro-head.ftl">
+
+
+
+ <@head title="${allTagsLabel} - ${blogTitle}">
+
+
+ @head>
+
+
+ ${topBarReplacement}
+
+
+
+ <#include "side.ftl">
+
+
+
+
+
diff --git a/skin-preview/community-bubbles-首页.png b/skin-preview/community-bubbles-首页.png
new file mode 100644
index 0000000..9411ec3
Binary files /dev/null and b/skin-preview/community-bubbles-首页.png differ