diff --git a/Gulpfile.js b/Gulpfile.js
index e9289c2..f1bd347 100644
--- a/Gulpfile.js
+++ b/Gulpfile.js
@@ -268,15 +268,17 @@ gulp.task('i18n', function() {
// 必须要的
// keys.push();
- genI18nJsFile('blog.zh', [], keys);
- genI18nJsFile('blog.en', [], keys);
- genI18nJsFile('blog.fr', [], keys);
- genI18nJsFile('blog.pt', [], keys);
+ genI18nJsFile('blog.zh-cn', [], keys);
+ genI18nJsFile('blog.zh-hk', [], keys);
+ genI18nJsFile('blog.en-us', [], keys);
+ genI18nJsFile('blog.fr-fr', [], keys);
+ genI18nJsFile('blog.pt-pt', [], keys);
- genI18nJsFile('msg.fr', ['member.fr', 'markdown.fr', 'album.fr'], keys);
- genI18nJsFile('msg.zh', ['member.zh', 'markdown.zh', 'album.zh'], keys);
- genI18nJsFile('msg.en', ['member.en', 'markdown.en', 'album.en'], keys);
- genI18nJsFile('msg.pt', ['member.pt', 'markdown.pt', 'album.pt'], keys);
+ genI18nJsFile('msg.fr-fr', ['member.fr-fr', 'markdown.fr-fr', 'album.fr-fr'], keys);
+ genI18nJsFile('msg.zh-cn', ['member.zh-cn', 'markdown.zh-cn', 'album.zh-cn'], keys);
+ genI18nJsFile('msg.zh-hk', ['member.zh-hk', 'markdown.zh-hk', 'album.zh-hk'], keys);
+ genI18nJsFile('msg.en-us', ['member.en-us', 'markdown.en-us', 'album.en-us'], keys);
+ genI18nJsFile('msg.pt-pt', ['member.pt-pt', 'markdown.pt-pt', 'album.pt-pt'], keys);
});
// 合并album需要的js
diff --git a/app/controllers/BaseController.go b/app/controllers/BaseController.go
index f9c07b7..c3c8f47 100644
--- a/app/controllers/BaseController.go
+++ b/app/controllers/BaseController.go
@@ -3,6 +3,7 @@ package controllers
import (
"encoding/json"
"github.com/leanote/leanote/app/info"
+ "github.com/leanote/leanote/app/lea/i18n"
"github.com/revel/revel"
"gopkg.in/mgo.v2/bson"
// . "github.com/leanote/leanote/app/lea"
@@ -181,13 +182,17 @@ func (c BaseController) E404() revel.Result {
// 设置本地
func (c BaseController) SetLocale() string {
locale := string(c.Request.Locale) // zh-CN
+ // lang := locale
+ // if strings.Contains(locale, "-") {
+ // pos := strings.Index(locale, "-")
+ // lang = locale[0:pos]
+ // }
+ // if lang != "zh" && lang != "en" {
+ // lang = "en"
+ // }
lang := locale
- if strings.Contains(locale, "-") {
- pos := strings.Index(locale, "-")
- lang = locale[0:pos]
- }
- if lang != "zh" && lang != "en" && lang != "fr" && lang != "pt" {
- lang = "en"
+ if !i18n.HasLang(locale) {
+ lang = i18n.GetDefaultLang()
}
c.RenderArgs["locale"] = lang
c.RenderArgs["siteUrl"] = configService.GetSiteUrl()
diff --git a/app/i18n/i18n.go b/app/i18n/i18n.go
deleted file mode 100644
index b008de2..0000000
--- a/app/i18n/i18n.go
+++ /dev/null
@@ -1,94 +0,0 @@
-package main
-
-import (
- "bufio"
- "encoding/json"
- "fmt"
- "os"
- "strings"
-)
-
-// convert revel msg to js msg
-
-var msgBasePath = "/Users/life/Documents/Go/package2/src/github.com/leanote/leanote/messages/"
-var targetBasePath = "/Users/life/Documents/Go/package2/src/github.com/leanote/leanote/public/js/i18n/"
-
-func parse(filename string) {
- file, err := os.Open(msgBasePath + filename)
- reader := bufio.NewReader(file)
- msg := map[string]string{}
- if err != nil {
- fmt.Println(err)
- return
- }
- for true {
- line, _, err := reader.ReadLine()
-
- if err != nil {
- break
- }
-
- if len(line) == 0 {
- continue
- }
- // 对每一行进行处理
- if line[0] == '#' || line[1] == '#' {
- continue
- }
- lineStr := string(line)
-
- // 找到第一个=位置
- pos := strings.Index(lineStr, "=")
-
- if pos < 0 {
- continue
- }
-
- key := string(line[0:pos])
- value := string(line[pos+1:])
-
- // fmt.Println(lineStr)
- // fmt.Println(value)
-
- msg[key] = value
- }
-
- // JSON
- b, _ := json.Marshal(msg)
- str := string(b)
- fmt.Println(str)
-
- targetName := targetBasePath + filename + ".js"
- file2, err2 := os.OpenFile(targetName, os.O_RDWR|os.O_CREATE, 0644)
- if err2 != nil {
- file2, err2 = os.Create(targetName)
- }
- file2.WriteString("var MSG = " + str + ";" + `
-function getMsg(key, data) {
- var msg = MSG[key]
- if(msg) {
- if(data) {
- if(!isArray(data)) {
- data = [data];
- }
- for(var i = 0; i < data.length; ++i) {
- msg = msg.replace("%s", data[i]);
- }
- }
- return msg;
- }
- return key;
-}`)
-}
-
-// 生成js的i18n文件
-func main() {
- parse("msg.en")
- parse("msg.zh")
- parse("msg.fr")
- parse("msg.pt")
- parse("blog.zh")
- parse("blog.en")
- parse("blog.fr")
- parse("blog.pt")
-}
diff --git a/app/init.go b/app/init.go
index 1bf7c62..5798a3f 100644
--- a/app/init.go
+++ b/app/init.go
@@ -10,6 +10,7 @@ import (
"github.com/leanote/leanote/app/db"
. "github.com/leanote/leanote/app/lea"
_ "github.com/leanote/leanote/app/lea/binder"
+ "github.com/leanote/leanote/app/lea/i18n"
"github.com/leanote/leanote/app/lea/route"
"github.com/leanote/leanote/app/service"
"github.com/revel/revel"
@@ -38,9 +39,10 @@ func init() {
// session.SessionFilter, // leanote session
// session.MSessionFilter, // leanote memcache session
- revel.FlashFilter, // Restore and write the flash cookie.
- revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
- revel.I18nFilter, // Resolve the requested language
+ revel.FlashFilter, // Restore and write the flash cookie.
+ revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
+ // revel.I18nFilter, // Resolve the requested language
+ i18n.I18nFilter, // Resolve the requested language by leanote
revel.InterceptorFilter, // Run interceptors around the action.
revel.CompressFilter, // Compress the result.
revel.ActionInvoker, // Invoke the action.
@@ -180,10 +182,18 @@ func init() {
return template.HTML(tagStr)
}
+ revel.TemplateFuncs["msg"] = func(renderArgs map[string]interface{}, message string, args ...interface{}) template.HTML {
+ str, ok := renderArgs[revel.CurrentLocaleRenderArg].(string)
+ if !ok {
+ return ""
+ }
+ return template.HTML(i18n.Message(str, message, args...))
+ }
+
// 不用revel的msg
revel.TemplateFuncs["leaMsg"] = func(renderArgs map[string]interface{}, key string) template.HTML {
locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string)
- str := revel.Message(locale, key)
+ str := i18n.Message(locale, key)
if strings.HasPrefix(str, "???") {
str = key
}
@@ -392,9 +402,9 @@ func init() {
*/
/*
- {{range $i := N 1 10}}
-
{{$i}}
- {{end}}
+ {{range $i := N 1 10}}
+ {{$i}}
+ {{end}}
*/
revel.TemplateFuncs["N"] = func(start, end int) (stream chan int) {
stream = make(chan int)
diff --git a/app/lea/i18n/i18n.go b/app/lea/i18n/i18n.go
new file mode 100644
index 0000000..e646027
--- /dev/null
+++ b/app/lea/i18n/i18n.go
@@ -0,0 +1,208 @@
+package i18n
+
+import (
+ "fmt"
+ "github.com/revel/revel"
+ "github.com/robfig/config"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+)
+
+const (
+ CurrentLocaleRenderArg = "currentLocale" // The key for the current locale render arg value
+
+ messageFilesDirectory = "messages"
+ messageFilePattern = `^\w+\.[a-zA-Z]{2}\-[a-zA-Z]{2}$`
+ unknownValueFormat = "??? %s ???"
+ defaultLanguageOption = "i18n.default_language"
+ localeCookieConfigKey = "i18n.cookie"
+)
+
+var (
+ // All currently loaded message configs.
+ // en-us, zh-cn, zh-hk ->
+ messages map[string]*config.Config
+)
+
+func GetAllLangMessages() map[string]*config.Config {
+ return messages
+}
+
+func HasLang(lang string) bool {
+ _, ok := messages[lang]
+ return ok
+}
+
+func GetDefaultLang() string {
+ lang, _ := revel.Config.String(defaultLanguageOption)
+ return lang
+}
+
+// Return all currently loaded message languages.
+func MessageLanguages() []string {
+ languages := make([]string, len(messages))
+ i := 0
+ for language, _ := range messages {
+ languages[i] = language
+ i++
+ }
+ return languages
+}
+
+// Perform a message look-up for the given locale and message using the given arguments.
+//
+// When either an unknown locale or message is detected, a specially formatted string is returned.
+func Message(locale, message string, args ...interface{}) string {
+ language, region := parseLocale(locale)
+
+ langAndRegion := language + "-" + region
+ // revel.TRACE.Println(langAndRegion + " 怎么回事")
+
+ messageConfig, knownLanguage := messages[langAndRegion]
+ if !knownLanguage {
+ // revel.TRACE.Printf("Unsupported language for locale '%s' and message '%s', trying default language", locale, message)
+
+ if defaultLanguage, found := revel.Config.String(defaultLanguageOption); found {
+ // revel.TRACE.Printf("Using default language '%s'", defaultLanguage)
+
+ messageConfig, knownLanguage = messages[defaultLanguage]
+ if !knownLanguage {
+ // WARN.Printf("Unsupported default language for locale '%s' and message '%s'", defaultLanguage, message)
+ return fmt.Sprintf(unknownValueFormat, message)
+ }
+ } else {
+ // WARN.Printf("Unable to find default language option (%s); messages for unsupported locales will never be translated", defaultLanguageOption)
+ return fmt.Sprintf(unknownValueFormat, message)
+ }
+ }
+
+ // This works because unlike the goconfig documentation suggests it will actually
+ // try to resolve message in DEFAULT if it did not find it in the given section.
+ value, error := messageConfig.String(region, message)
+ if error != nil {
+ // WARN.Printf("Unknown message '%s' for locale '%s'", message, locale)
+ return fmt.Sprintf(unknownValueFormat, message)
+ }
+
+ if len(args) > 0 {
+ // revel.TRACE.Printf("Arguments detected, formatting '%s' with %v", value, args)
+ value = fmt.Sprintf(value, args...)
+ }
+
+ return value
+}
+
+func parseLocale(locale string) (language, region string) {
+ if strings.Contains(locale, "-") {
+ languageAndRegion := strings.Split(locale, "-")
+ return languageAndRegion[0], languageAndRegion[1]
+ }
+
+ return locale, ""
+}
+
+// Recursively read and cache all available messages from all message files on the given path.
+func loadMessages(path string) {
+ messages = make(map[string]*config.Config)
+
+ if error := filepath.Walk(path, loadMessageFile); error != nil && !os.IsNotExist(error) {
+ // ERROR.Println("Error reading messages files:", error)
+ }
+}
+
+// Load a single message file
+func loadMessageFile(path string, info os.FileInfo, osError error) error {
+ if osError != nil {
+ return osError
+ }
+ if info.IsDir() {
+ return nil
+ }
+
+ if matched, _ := regexp.MatchString(messageFilePattern, info.Name()); matched {
+ if config, error := parseMessagesFile(path); error != nil {
+ return error
+ } else {
+ locale := parseLocaleFromFileName(info.Name())
+ // revel.TRACE.Print(locale + "----locale")
+
+ // If we have already parsed a message file for this locale, merge both
+ if _, exists := messages[locale]; exists {
+ messages[locale].Merge(config)
+ revel.TRACE.Printf("Successfully merged messages for locale '%s'", locale)
+ } else {
+ messages[locale] = config
+ }
+
+ revel.TRACE.Println("Successfully loaded messages from file", info.Name())
+ }
+ } else {
+ revel.TRACE.Printf("Ignoring file %s because it did not have a valid extension", info.Name())
+ }
+
+ return nil
+}
+
+func parseMessagesFile(path string) (messageConfig *config.Config, error error) {
+ messageConfig, error = config.ReadDefault(path)
+ return
+}
+
+func parseLocaleFromFileName(file string) string {
+ extension := filepath.Ext(file)[1:]
+ return strings.ToLower(extension)
+}
+
+func init() {
+ revel.OnAppStart(func() {
+ loadMessages(filepath.Join(revel.BasePath, messageFilesDirectory))
+ })
+}
+
+func I18nFilter(c *revel.Controller, fc []revel.Filter) {
+ if foundCookie, cookieValue := hasLocaleCookie(c.Request); foundCookie {
+ revel.TRACE.Printf("Found locale cookie value: %s", cookieValue)
+ setCurrentLocaleControllerArguments(c, cookieValue)
+ } else if foundHeader, headerValue := hasAcceptLanguageHeader(c.Request); foundHeader {
+ revel.TRACE.Printf("Found Accept-Language header value: %s", headerValue)
+ setCurrentLocaleControllerArguments(c, headerValue)
+ } else {
+ revel.TRACE.Println("Unable to find locale in cookie or header, using empty string")
+ setCurrentLocaleControllerArguments(c, "")
+ }
+ fc[0](c, fc[1:])
+}
+
+// Set the current locale controller argument (CurrentLocaleControllerArg) with the given locale.
+func setCurrentLocaleControllerArguments(c *revel.Controller, locale string) {
+ c.Request.Locale = locale
+ c.RenderArgs[CurrentLocaleRenderArg] = locale
+}
+
+// Determine whether the given request has valid Accept-Language value.
+//
+// Assumes that the accept languages stored in the request are sorted according to quality, with top
+// quality first in the slice.
+func hasAcceptLanguageHeader(request *revel.Request) (bool, string) {
+ if request.AcceptLanguages != nil && len(request.AcceptLanguages) > 0 {
+ return true, request.AcceptLanguages[0].Language
+ }
+
+ return false, ""
+}
+
+// Determine whether the given request has a valid language cookie value.
+func hasLocaleCookie(request *revel.Request) (bool, string) {
+ if request != nil && request.Cookies() != nil {
+ name := revel.Config.StringDefault(localeCookieConfigKey, revel.CookiePrefix+"_LANG")
+ if cookie, error := request.Cookie(name); error == nil {
+ return true, cookie.Value
+ } else {
+ revel.TRACE.Printf("Unable to read locale cookie with name '%s': %s", name, error.Error())
+ }
+ }
+
+ return false, ""
+}
diff --git a/app/views/home/header.html b/app/views/home/header.html
index c6c5167..0302778 100644
--- a/app/views/home/header.html
+++ b/app/views/home/header.html
@@ -41,7 +41,8 @@ function log(o) {
English
Français
简体中文
- Português
+ 繁体中文
+ Português
diff --git a/conf/app.conf b/conf/app.conf
index 660c64f..40b8131 100644
--- a/conf/app.conf
+++ b/conf/app.conf
@@ -44,7 +44,7 @@ log.warn.prefix = "WARN "
log.error.prefix = "ERROR "
# The default language of this application.
-i18n.default_language=en
+i18n.default_language=en-us
module.static=github.com/revel/modules/static
diff --git a/conf/app.conf-default b/conf/app.conf-default
new file mode 100644
index 0000000..40b8131
--- /dev/null
+++ b/conf/app.conf-default
@@ -0,0 +1,73 @@
+#------------------------
+# leanote config
+#------------------------
+
+http.port=9000
+
+site.url=http://localhost:9000 # or http://x.com:8080, http://www.xx.com:9000
+
+# admin username
+adminUsername=admin
+
+# mongdb
+db.host=127.0.0.1
+db.port=27017
+db.dbname=leanote # required
+db.username= # if not exists, please leave it blank
+db.password= # if not exists, please leave it blank
+# or you can set the mongodb url for more complex needs the format is:
+# mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb
+# db.url=mongodb://root:root123@localhost:27017/leanote
+# db.urlEnv=${MONGODB_URL} # set url from env. eg. mongodb://root:root123@localhost:27017/leanote
+
+# You Must Change It !! About Security!!
+app.secret=V85ZzBeTnzpsHyjQX4zukbQ8qqtju9y2aDM55VWxAH9Qop19poekx3xkcDVvrD0y
+
+#--------------------------------
+# revel config
+# for dev
+#--------------------------------
+app.name=leanote
+http.addr=
+http.ssl=false
+cookie.httponly=false
+cookie.prefix=LEANOTE
+cookie.domain= # for share cookie with sub-domain
+cookie.secure=false
+format.date=2006-01-02
+format.datetime=2006-01-02 15:04:05 # 必须这样配置
+results.chunked=false
+
+log.trace.prefix = "TRACE "
+log.info.prefix = "INFO "
+log.warn.prefix = "WARN "
+log.error.prefix = "ERROR "
+
+# The default language of this application.
+i18n.default_language=en-us
+
+module.static=github.com/revel/modules/static
+
+[dev]
+mode.dev=true
+results.pretty=true
+watch=true
+
+module.testrunner = # github.com/revel/modules/testrunner
+
+log.trace.output = stderr
+log.info.output = stderr
+log.warn.output = stderr
+log.error.output = stderr
+
+[prod]
+mode.dev=false
+results.pretty=false
+watch=false
+
+module.testrunner =
+
+log.trace.output = off
+log.info.output = off
+log.warn.output = %(app.name)s.log
+log.error.output = %(app.name)s.log
diff --git a/messages/album.en b/messages/album.en-us
similarity index 100%
rename from messages/album.en
rename to messages/album.en-us
diff --git a/messages/album.fr b/messages/album.fr-fr
similarity index 100%
rename from messages/album.fr
rename to messages/album.fr-fr
diff --git a/messages/album.pt b/messages/album.pt-pt
similarity index 100%
rename from messages/album.pt
rename to messages/album.pt-pt
diff --git a/messages/album.zh b/messages/album.zh-cn
similarity index 100%
rename from messages/album.zh
rename to messages/album.zh-cn
diff --git a/messages/album.zh-hk b/messages/album.zh-hk
new file mode 100644
index 0000000..301ede2
--- /dev/null
+++ b/messages/album.zh-hk
@@ -0,0 +1,31 @@
+
+# album image
+Images=圖片
+Upload=上傳
+Image URL=圖片地址
+Albums=相冊
+Default=默認
+File title search=通過標題搜索
+Go to upload images=去上傳圖片
+Rename=重命名
+Add=添加
+Add Album=添加相冊
+Add Image=添加圖片
+Can't load this url=不能載入該圖片
+No Images=無圖片
+Click to upload images Or Drop images to here=點擊上傳圖片或將圖片拖至此
+
+Cannot delete default album=不能刪除默認相冊
+Cannot rename default album=不能重命名默認相冊
+This album has images, please delete it's images at first.=相冊內有圖片, 不能刪除
+
+Rename Album=重命名
+Add Success!=添加成功!
+Rename Success!=重命名成功!
+Delete Success!=刪除成功
+Are you sure to delete this image ?=確定刪除該圖片?
+click to remove this image=刪除圖片
+error=錯誤
+Error=錯誤
+Prev=上壹頁
+Next=下壹頁
diff --git a/messages/blog.en b/messages/blog.en-us
similarity index 100%
rename from messages/blog.en
rename to messages/blog.en-us
diff --git a/messages/blog.fr b/messages/blog.fr-fr
similarity index 100%
rename from messages/blog.fr
rename to messages/blog.fr-fr
diff --git a/messages/blog.pt b/messages/blog.pt-pt
similarity index 100%
rename from messages/blog.pt
rename to messages/blog.pt-pt
diff --git a/messages/blog.zh b/messages/blog.zh-cn
similarity index 100%
rename from messages/blog.zh
rename to messages/blog.zh-cn
diff --git a/messages/blog.zh-hk b/messages/blog.zh-hk
new file mode 100644
index 0000000..901e9ec
--- /dev/null
+++ b/messages/blog.zh-hk
@@ -0,0 +1,97 @@
+# blog
+blog=博客
+aboutMe=關於我
+blogSet=博客設置
+
+blogNavs=導航
+quickLinks=快速鏈接
+latestPosts=最近發表
+
+noBlog=無博客
+noTag=無
+blogClass=分類
+updatedTime=更新
+createdTime=創建
+fullBlog=全文
+blogNav=導航
+more=更多...
+previous=上壹頁
+next=下壹頁
+
+#
+# set blog
+#
+blogSet=博客設置
+baseInfoSet=基本設置
+commentSet=評論設置
+themeSet=主題設置
+theme=主題
+blogName=博客標題
+blogLogo=博客Logo
+blogDesc=博客描述
+aboutMe=關於我
+
+#domain
+domainSet=域名設置
+subDomain=博客子域名
+domain=自定義域名
+
+# theme
+elegant=大氣
+navFixed=導航左側固定
+
+openComment=開啟評論?
+chooseComment=選擇評論系統
+disqusHelp=請填寫您申請的Disqus唯壹url前綴. 建議您申請Disqus帳號, 這樣可以自己管理評論. 或使用leanote的默認Disqus Id.
+needHelp=需要幫助?
+blogLogoTips=上傳logo將顯示logo(替代博客標題)
+saveSuccess=保存成功
+
+community=社區
+home=主頁
+none=無
+moreShare=更多分享
+sinaWeibo=新浪微博
+weixin=微信
+tencentWeibo=騰訊微博
+qqZone=QQ空間
+renren=人人網
+report=舉報
+like=贊
+unlike=取消贊
+viewers=人讀過
+author=作者
+delete=刪除
+reply=回復
+comment=評論
+comments=條評論
+cancel=取消
+confirm=確認
+signIn=登錄
+signUp=註冊
+submitComment=發表評論
+reportReason1=不友善內容
+reportReason2=廣告等垃圾信息
+reportReason3=違法違規內容
+reportReason4=不宜公開討論的政治內容
+other=其它
+reportReason=舉報理由
+chooseReason=請選擇舉報理由
+reportSuccess=舉報成功, 我們處理後會通知作者, 感謝您的監督
+error=錯誤
+reportComment?=舉報該評論?
+reportBlog?=舉報該博客?
+confirmDeleteComment=確定刪除該評論?
+scanQRCode=打開微信掃壹掃二維碼
+
+justNow=剛剛
+minutesAgo=分鐘前
+hoursAgo=個小時前
+daysAgo=天前
+weeksAgo=周前
+monthsAgo=個月前
+
+
+
+
+a=a
\ No newline at end of file
diff --git a/messages/markdown.en b/messages/markdown.en-us
similarity index 100%
rename from messages/markdown.en
rename to messages/markdown.en-us
diff --git a/messages/markdown.fr b/messages/markdown.fr-fr
similarity index 100%
rename from messages/markdown.fr
rename to messages/markdown.fr-fr
diff --git a/messages/markdown.pt b/messages/markdown.pt-pt
similarity index 100%
rename from messages/markdown.pt
rename to messages/markdown.pt-pt
diff --git a/messages/markdown.zh b/messages/markdown.zh-cn
similarity index 100%
rename from messages/markdown.zh
rename to messages/markdown.zh-cn
diff --git a/messages/markdown.zh-hk b/messages/markdown.zh-hk
new file mode 100644
index 0000000..b668db1
--- /dev/null
+++ b/messages/markdown.zh-hk
@@ -0,0 +1,35 @@
+
+# markdown editor
+
+Hyperlink=超鏈接
+Please provide the link URL and an optional title=請填寫鏈接和壹個可選的標題
+optional title=可選標題
+Ok=確認
+Cancel=取消
+Strong=粗體
+strong text=粗體
+Emphasis=斜體
+emphasized text=斜體
+Blockquote=引用
+Code Sample=代碼
+enter code here=代碼
+Image=圖片
+Heading=標題
+Numbered List=有序列表
+Bulleted List=無序列表
+List item=項目
+Horizontal Rule=水平線
+Markdown syntax=Markdown 語法
+Undo=撤銷
+Redo=重做
+enter image description here=圖片標題
+enter link description here=鏈接標題
+Edit mode=編輯模式
+Vim mode=Vim模式
+Emacs mode=Emacs模式
+Normal mode=普通模式
+Normal=普通
+Light=輕量
+Light editor=輕量編輯器
+
+Insert Image=插入
diff --git a/messages/member.en b/messages/member.en-us
similarity index 100%
rename from messages/member.en
rename to messages/member.en-us
diff --git a/messages/member.fr b/messages/member.fr-fr
similarity index 100%
rename from messages/member.fr
rename to messages/member.fr-fr
diff --git a/messages/member.pt b/messages/member.pt-pt
similarity index 100%
rename from messages/member.pt
rename to messages/member.pt-pt
diff --git a/messages/member.zh b/messages/member.zh-cn
similarity index 100%
rename from messages/member.zh
rename to messages/member.zh-cn
diff --git a/messages/member.zh-hk b/messages/member.zh-hk
new file mode 100644
index 0000000..47d74ba
--- /dev/null
+++ b/messages/member.zh-hk
@@ -0,0 +1,137 @@
+####################
+# 個人中心
+####################
+
+memberCenter=個人中心
+userNotExists=該成員沿未註冊
+hasUsers=已存在該成員
+Leanote Blog Theme Api=Leanote博客主題API
+My Group=我的分組
+group=用戶組
+newGroup=新建組
+deleteGroup=刪除組
+addMemberTips=輸入用戶名或郵箱添加成員
+deleteMember=刪除成員
+forbiddenNotMyGroup=無權限操作, 非該組的所有者
+userExistsInGroup=已存在該成員
+notMyGroup=非該組的所有者
+
+# 博客列表
+
+# 博客摘要設置
+
+Abstract=摘要
+Description=描述
+Once the abstract has been updated, it will not set the abstract automatically other than you cancel it.=以下內容設置後, 以後修改筆記時將不自動獲取. 若將該文章取消為博客後, 以下內容會自動獲取.
+Main Image=主圖
+Get next image as main image from content=從筆記中自動獲取下壹張
+Raw Content=原文
+
+# member title
+Leanote Member Center=Leanote 個人中心
+Username=用戶名
+Email=Email
+Password=密碼
+Avatar=頭像
+Add Account=添加Leanote帳戶
+Update Post Abstract=更新博文摘要
+Blog Base Info=博客基本設置
+Comment=評論設置
+Posts=博文管理
+Domain=域名
+Paging=分頁
+Category=分類管理
+Add Single=添加單頁
+Update Single=修改單頁
+Single=單頁管理
+Theme=主題
+Update Theme=修改主題
+
+
+#memeber
+welcomeToLeanote=歡迎來到leanote
+accountInfo=帳戶信息
+accountType=帳戶類型
+premiumAccountType=旗艦套餐
+normalAccountType=共享套餐
+imageSize=圖片空間
+attachSize=附件空間
+totalTraffic=流量
+upgrade=升級套餐
+leanoteEvents=Leanote動態
+addLeanoteAccount=新建Leanote帳戶
+defaultComment=默認leanote評論系統
+upgradeAccountTips=Leanote支持綁定自己的域名到博客上, 請 升級您的帳戶
+cateIsPublicNotebook=分類是公開為博客的筆記本
+dragAndSort=拖動可排序
+permanentLink=固定鏈接
+cate=分類
+noCates=無分類
+single=單頁面
+singleTips=您可以添加多個單頁面
+addSingle=添加單頁面
+updateSingle=修改單頁面
+inputSingleTitle=請輸入單頁面標題
+saveSort=保存排序
+pagingAndSort=分頁與排序設置
+perPageSize=每頁記錄數
+sortField=排序字段
+sortType=排序類型
+publicTime=發表時間
+createdTime=創建時間
+updatedTime=更新時間
+desc=降序
+asc=升序
+postList=文章列表
+hasSelfDefined=已設置
+noSelfDefined=未設置
+setAbstract=摘要設置
+title=標題
+content=內容
+
+addTheme=添加主題
+importTheme=導入主題
+exportTheme=導出主題
+export=導出
+preview=預覽
+edit=編輯
+use=使用
+install=安裝
+currentTheme=當前主題
+myOtherThemes=我的其它主題
+leanoteThemeMarket=Leanote主題市場
+updateTheme=編輯主題
+tplStyleScript=模板, 樣式, 腳本
+newFile=新建文件
+image=圖片
+currentFile=當前文件
+tpl=模板
+style=樣式
+script=腳本
+header=頭部
+footer=底部
+index=首頁
+cate=分類
+search=搜索頁
+single=單頁
+archive=歸檔頁
+post=文章頁
+tags=標簽頁
+tag_posts=標簽文章頁
+share_comment=分享評論
+themeJson=主題配置
+paging=分頁
+highlight=高亮
+
+# view js
+
+Are you sure ?=妳確定執行該操作?
+Are you sure to install it ?=妳確定安裝該主題?
+Are you sure to delete=妳確定刪除
+Success=成功
+Error=錯誤
+File exists=文件已存在
+Delete file=刪除文件
+No images=無圖片
+Filename=文件名
+Group Title=分組名
diff --git a/messages/msg.en b/messages/msg.en-us
similarity index 100%
rename from messages/msg.en
rename to messages/msg.en-us
diff --git a/messages/msg.fr b/messages/msg.fr-fr
similarity index 100%
rename from messages/msg.fr
rename to messages/msg.fr-fr
diff --git a/messages/msg.pt b/messages/msg.pt-pt
similarity index 100%
rename from messages/msg.pt
rename to messages/msg.pt-pt
diff --git a/messages/msg.zh b/messages/msg.zh-cn
similarity index 100%
rename from messages/msg.zh
rename to messages/msg.zh-cn
diff --git a/messages/msg.zh-hk b/messages/msg.zh-hk
new file mode 100644
index 0000000..fab7843
--- /dev/null
+++ b/messages/msg.zh-hk
@@ -0,0 +1,317 @@
+# leanote
+app=Leanote
+moto=不只是筆記!
+moto2=知識管理, 博客, 分享, 協作... 盡在Leanote
+moto3=簡約而不簡單
+fork github=Github 源碼
+
+# 首頁
+openSource=開源
+Desktop App=桌面客戶端
+forgetPassword = 忘記密碼?
+or=或
+try=體驗壹下
+3th=第三方登錄
+usernameOrEmail=用戶名或Email
+password=密碼
+home=主頁
+desktopApp=客戶端
+aboutLeanote=關於Leanote
+suggestions=建議
+yourSuggestions=幫助完善Leanote
+leanoteBlog=官方博客
+knowledge=知識
+knowledgeInfo=leanote是壹個筆記, 妳可以用它來管理自己的知識.
+share=分享
+shareInfo=妳也可以將知識分享給妳的好友.
+cooperation=協作
+cooperationInfo=分享給好友的同時也可以讓妳的好友和妳壹起來完善它.
+blog=博客
+blogInfo=將筆記公開, 讓知識傳播的更遠!
+suggestionsInfo=幫助我們完善leanote
+yourContact=您的聯系方式
+emailOrOthers=Email或其它聯系方式
+captcha=驗證碼
+reloadCaptcha=刷新驗證碼
+captchaError=驗證碼錯誤
+inputCaptcha=請輸入驗證碼
+noTag=無標簽
+
+hi=Hi
+welcomeUseLeanote=Welcome!
+myNote=My note
+curUser=Email
+
+# form
+submit=提交
+Submit=提交
+register=註冊
+login=登錄
+Password=密碼
+password2=請確認密碼
+email=Email
+inputUsername=請輸入用戶名或Email
+inputEmail=請輸入Email
+wrongEmail=Email錯誤
+wrongUsernameOrPassword=用戶名或密碼錯誤
+inputPassword=請輸入密碼
+inputLoginPasswordTips=請輸入登錄密碼
+wrongPassword=密碼錯誤
+logining=登錄
+loginSuccess=登錄成功
+
+hi=Hi
+welcomeUseLeanote=歡迎使用leanote
+myNote=我的筆記
+curUser=當前登錄帳戶
+
+# form
+submit=提交
+login=登錄
+register=註冊
+password2=確認密碼
+email=Email
+inputUsername=請輸入用戶名或Email
+inputEmail=請輸入Email
+wrongEmail=Email格式有誤
+wrongUsernameOrPassword=用戶名或密碼有誤
+inputPassword=請輸入密碼
+wrongPassword=密碼有誤
+logining=正在登錄
+loginSuccess=登錄成功, 正在跳轉
+ing=正在處理
+use = 使用
+hadAcount = 已有帳戶?
+hasAcount = 還無帳戶?
+signInWithThird=使用第三方帳號登錄
+
+# 註冊
+registerSuccessAndRdirectToNote=註冊成功, 正在跳轉...
+userHasBeenRegistered=%s已被註冊
+
+# 找回密碼
+passwordTips=密碼至少6位
+findPassword=找回密碼
+findPasswordSendEmailOver=已經將修改密碼的鏈接發送到您的郵箱, 請查收郵件.
+checkEmai=查收郵箱
+updatePassword=修改密碼
+findPasswordTimeout=鏈接已過期
+reFindPassword=重新找回密碼
+updatePassword=修改密碼
+updatePasswordSuccessRedirectToLogin=修改成功, 正在跳轉到登錄頁
+inputPassword2=請再次輸入密碼
+confirmPassword=兩次密碼輸入不壹致
+notGoodPassword=密碼至少6位
+
+# 筆記主頁
+myBlog=我的博客
+history=歷史記錄
+save=保存
+editorTips=幫助
+editorTipsInfo=1. 快捷鍵
ctrl+shift+c 代碼塊切換 2. shift+enter 跳出當前區域
比如在代碼塊中
按shift+enter可跳出當前代碼塊.
+newNote=新建普通筆記
+newMarkdownNote=新建Markdown筆記
+noNoteNewNoteTips=該筆記本下空空如也...何不
+canntNewNoteTips=Sorry, 這裏不能添加筆記的. 妳需要先選擇壹個筆記本.
+new=新建
+newMarkdown=新建Markdown筆記
+clickAddTag=點擊添加標簽
+notebook=筆記本
+note=筆記
+myNotebook=我的筆記本
+addNotebook=添加筆記本
+search=搜索
+clearSearch=清除搜索
+all=最新
+trash=廢紙簍
+delete=刪除
+unTitled=無標題
+defaultShare=默認分享
+leftHidden=隱藏左側
+leftShow=展開左側
+nav=文檔導航
+writingMode=寫作模式
+normalMode=普通模式
+saving=正在保存
+saveSuccess=保存成功
+SearchNote=搜索筆記
+SearchNotebook=搜索筆記本
+Choose File=選擇文件
+Download All=下載全部
+Information=信息
+Are you sure to delete it ?=確認刪除?
+Insert link into content=將附件鏈接插入到內容中
+Download=下載
+Delete=刪除
+Drop images to here=將圖片拖動至此
+Toggle Modify with Readonly=編輯與只讀切換
+
+update=更新
+create=創建
+Update Time=更新時間
+Create Time=創建時間
+Post Url=博文鏈接
+
+demoRegister=立即註冊
+
+close=關閉
+cancel=取消
+send=發送
+
+# 標簽
+tag=標簽
+myTag=我的標簽
+red=紅色
+yellow=黃色
+blue=藍色
+green=綠色
+
+# 設置
+accountSetting=帳戶設置
+logout=退出
+basicInfo=基本信息
+basicInfoSet=博客基本設置
+updateEmail=修改Email
+usernameSetting=用戶名設置
+chooseImage=選擇圖片
+oldPassword=舊密碼
+newPassword=新密碼
+admin=後臺管理
+
+default=默認
+simple=簡約
+
+# tinymce
+uploadImage=上傳圖片
+
+# blog
+aboutMe=關於我
+blogSet=博客設置
+
+# error
+notFound=該頁面不存在
+
+# index
+discussion=社區討論
+download=下載
+howToInstallLeanote=leanote安裝步驟
+
+#
+attachments = 附件
+donate = 捐贈
+
+# contextmenu
+shareToFriends=分享給好友
+publicAsBlog=公開為博客
+cancelPublic=取消公開為博客
+move=移動
+copy=復制
+rename=重命名
+exportPdf=導出PDF
+addChildNotebook=添加子筆記本
+deleteAllShared=刪除所有共享
+deleteSharedNotebook=刪除共享筆記本
+copyToMyNotebook=復制到我的筆記本
+
+####note-dev
+emailInSending=正在發送郵件到
+checkEmail=查看郵件
+setUsername=用戶名設置
+setUsernameTips=妳的郵箱是 %s
, 可以再設置壹個唯壹的用戶名.
用戶名至少4位, 不可含特殊字符.
+currentEmail=當前郵箱為: %s
+updateEmail=修改郵箱
+updateEmailTips=郵箱修改後, 驗證之後才有效, 驗證之後新的郵箱地址將會作為登錄帳號使用.
+sendVerifiedEmail=發送驗證郵箱
+sendSuccess=發送成功
+sendFailed=發送失敗
+verified=已驗證
+unVerified=未驗證
+verifiedNow=現在去驗證
+resendVerifiedEmail=重新發送驗證郵件
+# 分享
+defaultShare=默認分享
+addShare=添加分享
+friendEmail=好友郵箱
+permission=權限
+readOnly=只讀
+writable=可寫
+inputFriendEmail=請輸入好友郵箱
+clickToChangePermission=點擊改變權限
+sendInviteEmailToYourFriend=發送邀請email給Ta
+copySuccess=復制成功
+copyFailed=對不起, 復制失敗, 請自行復制
+friendNotExits=該用戶還沒有註冊%s, 復制邀請鏈接發送給Ta, 邀請鏈接: %s
+emailBodyRequired=郵件內容不能為空
+clickToCopy=點擊復制
+sendSuccess=發送成功
+inviteEmailBody=Hi, 妳好, 我是%s, %s非常好用, 快來註冊吧!
+ notes selected=當前選中了 篇筆記
+
+# 歷史記錄
+historiesNum=leanote會保存筆記的最近10份歷史記錄
+noHistories=無歷史記錄
+datetime=日期
+restoreFromThisVersion=從該版本還原
+confirmBackup=確定要從該版還原? 還原前leanote會備份當前版本到歷史記錄中.
+createAccount=創建帳號
+createAccountSuccess=帳號創建成功
+createAccountFailed=帳號創建失敗
+thirdCreateAcountTips=您現在使用的是第三方帳號登錄%(app)s, 您也可以註冊%(app)s帳號登錄, 趕緊註冊壹個吧.
註冊成功後仍可以使用第三方帳號登錄leanote並管理您現有的筆記.
+
+## valid msg
+cannotUpdateDemo=抱歉, Demo用戶不允許修改
+inputUsername=請輸入用戶名
+updateUsernameSuccess=用戶名修改成功
+usernameIsExisted=用戶名已存在
+noSpecialChars=不能包含特殊字符
+minLength=長度至少為%s
+errorEmail=請輸入正確的email
+verifiedEmaiHasSent=驗證郵件已發送, 請及時查閱郵件並驗證.
+emailSendFailed=郵件發送失敗
+inputPassword=請輸入密碼
+inputNewPassword=請輸入新密碼
+inputPassword2=請輸入確認密碼
+errorPassword=請輸入長度不少於6位的密碼, 盡量復雜
+oldPasswordError=舊密碼錯誤
+confirmPassword=兩次密碼輸入不正確
+updatePasswordSuccess=修改密碼成功
+errorDomain=請輸入正確的域名, 如www.myblog.com
+domainExisted=域名已存在
+errorSubDomain=請輸入正確的博客子域名, 長度至少為4, 不能包含特殊字符
+subDomainExisted=博客子域名已存在
+domainNotPointToLeanote=該域名還未指向 d.leanote.com, 請稍後再試
+errorPerPageSize=每頁記錄數至少為1
+errorSortField=排序類型錯誤
+themeValidHasRoundInclude=警告: 模板存在循環引用問題!
+
+#share
+tokenExpired = 會話已過期
+Share=分享
+hasSharedThisNote=分享了筆記
+inputSharePwd=您需要輸入分享密碼才能查看
+shareToGroup=分享給項目組
+shareByPwd=通過密碼分享
+groupName=分組名
+operation=操作
+groupAndMemberManage=項目組/成員管理
+shareToGroupTips=將筆記/筆記本分享給項目組後, 該組下的用戶便擁有了該筆記/筆記本
+shared=已分享
+notShared=未分享
+shareLink=分享鏈接
+sharePwd=查看密碼
+cancelShare=取消分享
+getShareLinkAndPwd=生成該筆記的分享鏈接和密碼
+
+#############
+# 通用
+#############
+created=創建
+updated=更新
+modify=修改
+Search=搜索
+Save Success=保存成功
+Please save note firstly!=請先保存筆記!
+Please sign in firstly!=妳還沒有登錄, 請先登錄!
+
+# 必須要加這個, 奇怪
+[CN]
diff --git a/public/js/app/page.js b/public/js/app/page.js
index ccfdb28..fcad02a 100644
--- a/public/js/app/page.js
+++ b/public/js/app/page.js
@@ -532,8 +532,7 @@ function initEditor() {
// content_css 不再需要
// content_css : [LEA.sPath + "/css/editor/editor.css"], // .concat(em.getWritingCss()),
skin : "custom",
- // tinymce just support en & zh lang currently
- language: LEA.locale != 'en' && LEA.locale != 'zh' ? 'en' : LEA.locale,
+ language: LEA.locale, // 语言
plugins : [
"autolink link leaui_image lists hr", "paste",
"searchreplace leanote_nav leanote_code tabfocus",
diff --git a/public/js/i18n/blog.en.js b/public/js/i18n/blog.en-us.js
similarity index 100%
rename from public/js/i18n/blog.en.js
rename to public/js/i18n/blog.en-us.js
diff --git a/public/js/i18n/blog.fr.js b/public/js/i18n/blog.fr-fr.js
similarity index 100%
rename from public/js/i18n/blog.fr.js
rename to public/js/i18n/blog.fr-fr.js
diff --git a/public/js/i18n/blog.pt.js b/public/js/i18n/blog.pt-pt.js
similarity index 100%
rename from public/js/i18n/blog.pt.js
rename to public/js/i18n/blog.pt-pt.js
diff --git a/public/js/i18n/blog.zh.js b/public/js/i18n/blog.zh-cn.js
similarity index 100%
rename from public/js/i18n/blog.zh.js
rename to public/js/i18n/blog.zh-cn.js
diff --git a/public/js/i18n/blog.zh-hk.js b/public/js/i18n/blog.zh-hk.js
new file mode 100644
index 0000000..46531ca
--- /dev/null
+++ b/public/js/i18n/blog.zh-hk.js
@@ -0,0 +1 @@
+var MSG={"noTag":"無","saveSuccess":"保存成功","none":"無","like":"贊","unlike":"取消贊","delete":"刪除","cancel":"取消","confirm":"確認","chooseReason":"請選擇舉報理由","reportSuccess":"舉報成功, 我們處理後會通知作者, 感謝您的監督","error":"錯誤","reportComment?":"舉報該評論?","reportBlog?":"舉報該博客?","confirmDeleteComment":"確定刪除該評論?","scanQRCode":"打開微信掃壹掃二維碼","justNow":"剛剛","minutesAgo":"分鐘前","hoursAgo":"個小時前","daysAgo":"天前","weeksAgo":"周前","monthsAgo":"個月前"};function getMsg(key, data) {var msg = MSG[key];if(msg) {if(data) {if(!isArray(data)) {data = [data];}for(var i = 0; i < data.length; ++i) {msg = msg.replace("%s", data[i]);}}return msg;}return key;}
\ No newline at end of file
diff --git a/public/js/i18n/msg.en.js b/public/js/i18n/msg.en-us.js
similarity index 100%
rename from public/js/i18n/msg.en.js
rename to public/js/i18n/msg.en-us.js
diff --git a/public/js/i18n/msg.fr.js b/public/js/i18n/msg.fr-fr.js
similarity index 100%
rename from public/js/i18n/msg.fr.js
rename to public/js/i18n/msg.fr-fr.js
diff --git a/public/js/i18n/msg.pt.js b/public/js/i18n/msg.pt-pt.js
similarity index 100%
rename from public/js/i18n/msg.pt.js
rename to public/js/i18n/msg.pt-pt.js
diff --git a/public/js/i18n/msg.zh.js b/public/js/i18n/msg.zh-cn.js
similarity index 100%
rename from public/js/i18n/msg.zh.js
rename to public/js/i18n/msg.zh-cn.js
diff --git a/public/js/i18n/msg.zh-hk.js b/public/js/i18n/msg.zh-hk.js
new file mode 100644
index 0000000..3a35c4c
--- /dev/null
+++ b/public/js/i18n/msg.zh-hk.js
@@ -0,0 +1 @@
+var MSG={"app":"Leanote","share":"分享","noTag":"無標簽","inputUsername":"請輸入用戶名","inputEmail":"請輸入Email","inputPassword":"請輸入密碼","inputPassword2":"請輸入確認密碼","confirmPassword":"兩次密碼輸入不正確","history":"歷史記錄","editorTips":"幫助","editorTipsInfo":"1. 快捷鍵
ctrl+shift+c 代碼塊切換 2. shift+enter 跳出當前區域
比如在代碼塊中
按shift+enter可跳出當前代碼塊.","all":"最新","trash":"廢紙簍","delete":"刪除","unTitled":"無標題","defaultShare":"默認分享","writingMode":"寫作模式","normalMode":"普通模式","saving":"正在保存","saveSuccess":"保存成功","Are you sure to delete it ?":"確認刪除?","Insert link into content":"將附件鏈接插入到內容中","Download":"下載","Delete":"刪除","update":"更新","Update Time":"更新時間","Create Time":"創建時間","Post Url":"博文鏈接","close":"關閉","cancel":"取消","send":"發送","shareToFriends":"分享給好友","publicAsBlog":"公開為博客","cancelPublic":"取消公開為博客","move":"移動","copy":"復制","rename":"重命名","exportPdf":"導出PDF","addChildNotebook":"添加子筆記本","deleteAllShared":"刪除所有共享","deleteSharedNotebook":"刪除共享筆記本","copyToMyNotebook":"復制到我的筆記本","checkEmail":"查看郵件","sendVerifiedEmail":"發送驗證郵箱","sendSuccess":"發送成功","sendFailed":"發送失敗","friendEmail":"好友郵箱","readOnly":"只讀","writable":"可寫","inputFriendEmail":"請輸入好友郵箱","clickToChangePermission":"點擊改變權限","sendInviteEmailToYourFriend":"發送邀請email給Ta","friendNotExits":"該用戶還沒有註冊%s, 復制邀請鏈接發送給Ta, 邀請鏈接: %s","emailBodyRequired":"郵件內容不能為空","inviteEmailBody":"Hi, 妳好, 我是%s, %s非常好用, 快來註冊吧!","historiesNum":"leanote會保存筆記的最近10份歷史記錄","noHistories":"無歷史記錄","datetime":"日期","restoreFromThisVersion":"從該版本還原","confirmBackup":"確定要從該版還原? 還原前leanote會備份當前版本到歷史記錄中.","createAccountSuccess":"帳號創建成功","createAccountFailed":"帳號創建失敗","updateUsernameSuccess":"用戶名修改成功","usernameIsExisted":"用戶名已存在","noSpecialChars":"不能包含特殊字符","minLength":"長度至少為%s","errorEmail":"請輸入正確的email","verifiedEmaiHasSent":"驗證郵件已發送, 請及時查閱郵件並驗證.","emailSendFailed":"郵件發送失敗","inputNewPassword":"請輸入新密碼","errorPassword":"請輸入長度不少於6位的密碼, 盡量復雜","updatePasswordSuccess":"修改密碼成功","Please save note firstly!":"請先保存筆記!","Please sign in firstly!":"妳還沒有登錄, 請先登錄!","Are you sure ?":"妳確定執行該操作?","Are you sure to install it ?":"妳確定安裝該主題?","Are you sure to delete":"妳確定刪除","Success":"成功","Error":"錯誤","File exists":"文件已存在","Delete file":"刪除文件","No images":"無圖片","Filename":"文件名","Group Title":"分組名","Hyperlink":"超鏈接","Please provide the link URL and an optional title":"請填寫鏈接和壹個可選的標題","optional title":"可選標題","Cancel":"取消","Strong":"粗體","strong text":"粗體","Emphasis":"斜體","emphasized text":"斜體","Blockquote":"引用","Code Sample":"代碼","enter code here":"代碼","Image":"圖片","Heading":"標題","Numbered List":"有序列表","Bulleted List":"無序列表","List item":"項目","Horizontal Rule":"水平線","Markdown syntax":"Markdown 語法","Undo":"撤銷","Redo":"重做","enter image description here":"圖片標題","enter link description here":"鏈接標題","Edit mode":"編輯模式","Vim mode":"Vim模式","Emacs mode":"Emacs模式","Normal mode":"普通模式","Normal":"普通","Light":"輕量","Light editor":"輕量編輯器","Add Album":"添加相冊","Cannot delete default album":"不能刪除默認相冊","Cannot rename default album":"不能重命名默認相冊","Rename Album":"重命名","Add Success!":"添加成功!","Rename Success!":"重命名成功!","Delete Success!":"刪除成功","Are you sure to delete this image ?":"確定刪除該圖片?","click to remove this image":"刪除圖片","error":"錯誤","Prev":"上壹頁","Next":"下壹頁"};function getMsg(key, data) {var msg = MSG[key];if(msg) {if(data) {if(!isArray(data)) {data = [data];}for(var i = 0; i < data.length; ++i) {msg = msg.replace("%s", data[i]);}}return msg;}return key;}
\ No newline at end of file
diff --git a/public/tinymce/langs/en.js b/public/tinymce/langs/en-us.js
similarity index 99%
rename from public/tinymce/langs/en.js
rename to public/tinymce/langs/en-us.js
index 5683b57..5ac6809 100644
--- a/public/tinymce/langs/en.js
+++ b/public/tinymce/langs/en-us.js
@@ -1,4 +1,4 @@
-tinymce.addI18n('en',{
+tinymce.addI18n('en-us',{
"Cut": "Cut",
"Header 2": "Header 2",
"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.",
diff --git a/public/tinymce/langs/fr-fr.js b/public/tinymce/langs/fr-fr.js
new file mode 100644
index 0000000..5db78a5
--- /dev/null
+++ b/public/tinymce/langs/fr-fr.js
@@ -0,0 +1,182 @@
+// TODO
+tinymce.addI18n('fr-fr',{
+"Cut": "Cut",
+"Header 2": "Header 2",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.",
+"Div": "Div",
+"Paste": "Paste",
+"Close": "Close",
+"Font Family": "Font Family",
+"Pre": "Pre",
+"Align right": "Align right",
+"New document": "New document",
+"Blockquote": "Blockquote",
+"Numbered list": "Numbered list",
+"Increase indent": "Increase indent",
+"Formats": "Formats",
+"Headers": "Headers",
+"Select all": "Select all",
+"Header 3": "Header 3",
+"Blocks": "Blocks",
+"Undo": "Undo",
+"Strikethrough": "Strike-through",
+"Bullet list": "Bullet list",
+"Header 1": "Header 1",
+"Superscript": "Superscript",
+"Clear formatting": "Clear formatting",
+"Font Sizes": "Font Sizes",
+"Subscript": "Subscript",
+"Header 6": "Header 6",
+"Redo": "Redo",
+"Paragraph": "Paragraph",
+"Ok": "Ok",
+"Bold": "Bold",
+"Code": "Code",
+"Italic": "Italic",
+"Align center": "Align centre",
+"Header 5": "Header 5",
+"Decrease indent": "Decrease indent",
+"Header 4": "Header 4",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.",
+"Underline": "Underline",
+"Cancel": "Cancel",
+"Justify": "Justify",
+"Inline": "Inline",
+"Copy": "Copy",
+"Align left": "Align left",
+"Visual aids": "Visual aids",
+"Lower Greek": "Lower Greek",
+"Square": "Square",
+"Default": "Default",
+"Lower Alpha": "Lower Alpha",
+"Circle": "Circle",
+"Disc": "Disc",
+"Upper Alpha": "Upper Alpha",
+"Upper Roman": "Upper Roman",
+"Lower Roman": "Lower Roman",
+"Name": "Name",
+"Anchor": "Anchor",
+"You have unsaved changes are you sure you want to navigate away?": "You have unsaved changes are you sure you want to navigate away?",
+"Restore last draft": "Restore last draft",
+"Special character": "Special character",
+"Source code": "Source code",
+"Right to left": "Right to left",
+"Left to right": "Left to right",
+"Emoticons": "Emoticons",
+"Robots": "Robots",
+"Document properties": "Document properties",
+"Title": "Title",
+"Keywords": "Keywords",
+"Encoding": "Encoding",
+"Description": "Description",
+"Author": "Author",
+"Language": "Language",
+"`ctrl/cmd+shift+c` toggle code": "`ctrl/cmd+shift+c` toggle code",
+"Fullscreen": "Full-screen",
+"Horizontal line": "Horizontal line",
+"Horizontal space": "Horizontal space",
+"Insert\/edit image": "Insert\/edit image",
+"General": "General",
+"Advanced": "Advanced",
+"Source": "Source",
+"Border": "Border",
+"Constrain proportions": "Constrain proportions",
+"Vertical space": "Vertical space",
+"Image description": "Image description",
+"Style": "Style",
+"Dimensions": "Dimensions",
+"Insert image": "Insert image",
+"Insert date\/time": "Insert date\/time",
+"Remove link": "Remove link",
+"Url": "URL",
+"Text to display": "Text to display",
+"Anchors": "Anchors",
+"Insert link": "Insert link",
+"New window": "New window",
+"None": "None",
+"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?",
+"Target": "Target",
+"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",
+"Insert\/edit link": "Insert\/edit link",
+"Insert\/edit video": "Insert\/edit video",
+"Poster": "Poster",
+"Alternative source": "Alternative source",
+"Paste your embed code below:": "Paste your embed code below:",
+"Insert video": "Insert video",
+"Embed": "Embed",
+"Nonbreaking space": "Non-breaking space",
+"Page break": "Page break",
+"Paste as text": "Paste as text",
+"Preview": "Preview",
+"Print": "Print",
+"Save": "Save",
+"Could not find the specified string.": "Could not find the specified string.",
+"Replace": "Replace",
+"Next": "Next",
+"Whole words": "Whole words",
+"Find and replace": "Find and replace",
+"Replace with": "Replace with",
+"Find": "Find",
+"Replace all": "Replace all",
+"Match case": "Match case",
+"Prev": "Prev",
+"Spellcheck": "Spell-check",
+"Finish": "Finish",
+"Ignore all": "Ignore all",
+"Ignore": "Ignore",
+"Insert row before": "Insert row before",
+"Rows": "Rows",
+"Height": "Height",
+"Paste row after": "Paste row after",
+"Alignment": "Alignment",
+"Column group": "Column group",
+"Row": "Row",
+"Insert column before": "Insert column before",
+"Split cell": "Split cell",
+"Cell padding": "Cell padding",
+"Cell spacing": "Cell spacing",
+"Row type": "Row type",
+"Insert table": "Insert table",
+"Body": "Body",
+"Caption": "Caption",
+"Footer": "Footer",
+"Delete row": "Delete row",
+"Paste row before": "Paste row before",
+"Scope": "Scope",
+"Delete table": "Delete table",
+"Header cell": "Header cell",
+"Column": "Column",
+"Cell": "Cell",
+"Header": "Header",
+"Cell type": "Cell type",
+"Copy row": "Copy row",
+"Row properties": "Row properties",
+"Table properties": "Table properties",
+"Row group": "Row group",
+"Right": "Right",
+"Insert column after": "Insert column after",
+"Cols": "Cols",
+"Insert row after": "Insert row after",
+"Width": "Width",
+"Cell properties": "Cell properties",
+"Left": "Left",
+"Cut row": "Cut row",
+"Delete column": "Delete column",
+"Center": "Centre",
+"Merge cells": "Merge cells",
+"Insert template": "Insert template",
+"Templates": "Templates",
+"Background color": "Background colour",
+"Text color": "Text colour",
+"Show blocks": "Show blocks",
+"Show invisible characters": "Show invisible characters",
+"Words: {0}": "Words: {0}",
+"Insert": "Insert",
+"File": "File",
+"Edit": "Edit",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help",
+"Tools": "Tools",
+"View": "View",
+"Table": "Table",
+"Format": "Format"
+});
\ No newline at end of file
diff --git a/public/tinymce/langs/pt-pt.js b/public/tinymce/langs/pt-pt.js
new file mode 100644
index 0000000..52367a1
--- /dev/null
+++ b/public/tinymce/langs/pt-pt.js
@@ -0,0 +1,182 @@
+// TODO
+tinymce.addI18n('pt-pt',{
+"Cut": "Cut",
+"Header 2": "Header 2",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.",
+"Div": "Div",
+"Paste": "Paste",
+"Close": "Close",
+"Font Family": "Font Family",
+"Pre": "Pre",
+"Align right": "Align right",
+"New document": "New document",
+"Blockquote": "Blockquote",
+"Numbered list": "Numbered list",
+"Increase indent": "Increase indent",
+"Formats": "Formats",
+"Headers": "Headers",
+"Select all": "Select all",
+"Header 3": "Header 3",
+"Blocks": "Blocks",
+"Undo": "Undo",
+"Strikethrough": "Strike-through",
+"Bullet list": "Bullet list",
+"Header 1": "Header 1",
+"Superscript": "Superscript",
+"Clear formatting": "Clear formatting",
+"Font Sizes": "Font Sizes",
+"Subscript": "Subscript",
+"Header 6": "Header 6",
+"Redo": "Redo",
+"Paragraph": "Paragraph",
+"Ok": "Ok",
+"Bold": "Bold",
+"Code": "Code",
+"Italic": "Italic",
+"Align center": "Align centre",
+"Header 5": "Header 5",
+"Decrease indent": "Decrease indent",
+"Header 4": "Header 4",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.",
+"Underline": "Underline",
+"Cancel": "Cancel",
+"Justify": "Justify",
+"Inline": "Inline",
+"Copy": "Copy",
+"Align left": "Align left",
+"Visual aids": "Visual aids",
+"Lower Greek": "Lower Greek",
+"Square": "Square",
+"Default": "Default",
+"Lower Alpha": "Lower Alpha",
+"Circle": "Circle",
+"Disc": "Disc",
+"Upper Alpha": "Upper Alpha",
+"Upper Roman": "Upper Roman",
+"Lower Roman": "Lower Roman",
+"Name": "Name",
+"Anchor": "Anchor",
+"You have unsaved changes are you sure you want to navigate away?": "You have unsaved changes are you sure you want to navigate away?",
+"Restore last draft": "Restore last draft",
+"Special character": "Special character",
+"Source code": "Source code",
+"Right to left": "Right to left",
+"Left to right": "Left to right",
+"Emoticons": "Emoticons",
+"Robots": "Robots",
+"Document properties": "Document properties",
+"Title": "Title",
+"Keywords": "Keywords",
+"Encoding": "Encoding",
+"Description": "Description",
+"Author": "Author",
+"Language": "Language",
+"`ctrl/cmd+shift+c` toggle code": "`ctrl/cmd+shift+c` toggle code",
+"Fullscreen": "Full-screen",
+"Horizontal line": "Horizontal line",
+"Horizontal space": "Horizontal space",
+"Insert\/edit image": "Insert\/edit image",
+"General": "General",
+"Advanced": "Advanced",
+"Source": "Source",
+"Border": "Border",
+"Constrain proportions": "Constrain proportions",
+"Vertical space": "Vertical space",
+"Image description": "Image description",
+"Style": "Style",
+"Dimensions": "Dimensions",
+"Insert image": "Insert image",
+"Insert date\/time": "Insert date\/time",
+"Remove link": "Remove link",
+"Url": "URL",
+"Text to display": "Text to display",
+"Anchors": "Anchors",
+"Insert link": "Insert link",
+"New window": "New window",
+"None": "None",
+"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?",
+"Target": "Target",
+"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",
+"Insert\/edit link": "Insert\/edit link",
+"Insert\/edit video": "Insert\/edit video",
+"Poster": "Poster",
+"Alternative source": "Alternative source",
+"Paste your embed code below:": "Paste your embed code below:",
+"Insert video": "Insert video",
+"Embed": "Embed",
+"Nonbreaking space": "Non-breaking space",
+"Page break": "Page break",
+"Paste as text": "Paste as text",
+"Preview": "Preview",
+"Print": "Print",
+"Save": "Save",
+"Could not find the specified string.": "Could not find the specified string.",
+"Replace": "Replace",
+"Next": "Next",
+"Whole words": "Whole words",
+"Find and replace": "Find and replace",
+"Replace with": "Replace with",
+"Find": "Find",
+"Replace all": "Replace all",
+"Match case": "Match case",
+"Prev": "Prev",
+"Spellcheck": "Spell-check",
+"Finish": "Finish",
+"Ignore all": "Ignore all",
+"Ignore": "Ignore",
+"Insert row before": "Insert row before",
+"Rows": "Rows",
+"Height": "Height",
+"Paste row after": "Paste row after",
+"Alignment": "Alignment",
+"Column group": "Column group",
+"Row": "Row",
+"Insert column before": "Insert column before",
+"Split cell": "Split cell",
+"Cell padding": "Cell padding",
+"Cell spacing": "Cell spacing",
+"Row type": "Row type",
+"Insert table": "Insert table",
+"Body": "Body",
+"Caption": "Caption",
+"Footer": "Footer",
+"Delete row": "Delete row",
+"Paste row before": "Paste row before",
+"Scope": "Scope",
+"Delete table": "Delete table",
+"Header cell": "Header cell",
+"Column": "Column",
+"Cell": "Cell",
+"Header": "Header",
+"Cell type": "Cell type",
+"Copy row": "Copy row",
+"Row properties": "Row properties",
+"Table properties": "Table properties",
+"Row group": "Row group",
+"Right": "Right",
+"Insert column after": "Insert column after",
+"Cols": "Cols",
+"Insert row after": "Insert row after",
+"Width": "Width",
+"Cell properties": "Cell properties",
+"Left": "Left",
+"Cut row": "Cut row",
+"Delete column": "Delete column",
+"Center": "Centre",
+"Merge cells": "Merge cells",
+"Insert template": "Insert template",
+"Templates": "Templates",
+"Background color": "Background colour",
+"Text color": "Text colour",
+"Show blocks": "Show blocks",
+"Show invisible characters": "Show invisible characters",
+"Words: {0}": "Words: {0}",
+"Insert": "Insert",
+"File": "File",
+"Edit": "Edit",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help",
+"Tools": "Tools",
+"View": "View",
+"Table": "Table",
+"Format": "Format"
+});
\ No newline at end of file
diff --git a/public/tinymce/langs/readme.md b/public/tinymce/langs/readme.md
deleted file mode 100755
index a52bf03..0000000
--- a/public/tinymce/langs/readme.md
+++ /dev/null
@@ -1,3 +0,0 @@
-This is where language files should be placed.
-
-Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/
diff --git a/public/tinymce/langs/zh-cn.js b/public/tinymce/langs/zh-cn.js
new file mode 100644
index 0000000..abc194a
--- /dev/null
+++ b/public/tinymce/langs/zh-cn.js
@@ -0,0 +1,188 @@
+tinymce.addI18n('zh-cn',{
+"Cut": "剪切",
+"Header 2": "标题2",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "你的浏览器不支持对剪贴板的访问,请使用Ctrl+X\/C\/V键进行复制粘贴。",
+"Div": "Div区块",
+"Paste": "粘贴",
+"Close": "关闭",
+"Font Family": "字体",
+"Pre": "预格式文本",
+"Align right": "右对齐",
+"New document": "新文档",
+"Blockquote": "引用",
+"Numbered list": "编号列表",
+"Increase indent": "增加缩进",
+"Formats": "格式",
+"Headers": "标题",
+"Select all": "全选",
+"Header 3": "标题3",
+"Blocks": "区块",
+"Undo": "撤消",
+"Strikethrough": "删除线",
+"Bullet list": "项目符号",
+"Header 1": "标题1",
+"Superscript": "上标",
+"Clear formatting": "清除格式",
+"Font Sizes": "字号",
+"Subscript": "下标",
+"Header 6": "标题6",
+"Redo": "重复",
+"Paragraph": "段落",
+"Ok": "确定",
+"Bold": "粗体",
+"Code": "代码",
+"Italic": "斜体",
+"Align center": "居中",
+"Header 5": "标题5",
+"Decrease indent": "减少缩进",
+"Header 4": "标题4",
+"Convert Code": "转换成文本",
+"toggleCode": "ctrl+shift+c 切换代码",
+"Language": "代码语言",
+"`ctrl/cmd+shift+c` toggle code": "`ctrl/cmd+shift+c` 切换代码",
+"Toggle ace with raw html": "Ace代码与普通Pre代码切换",
+"Inline Code": "",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "当前为纯文本粘贴模式,再次点击可以回到普通粘贴模式。",
+"Underline": "下划线",
+"Cancel": "取消",
+"Justify": "两端对齐",
+"Inline": "文本",
+"Copy": "复制",
+"Align left": "左对齐",
+"Visual aids": "网格线",
+"Lower Greek": "小写希腊字母",
+"Square": "方块",
+"Default": "默认",
+"Lower Alpha": "小写英文字母",
+"Circle": "空心圆",
+"Disc": "实心圆",
+"Upper Alpha": "大写英文字母",
+"Upper Roman": "大写罗马字母",
+"Lower Roman": "小写罗马字母",
+"Name": "名称",
+"Anchor": "锚点",
+"You have unsaved changes are you sure you want to navigate away?": "你还有文档尚未保存,确定要离开?",
+"Restore last draft": "恢复上次的草稿",
+"Special character": "特殊符号",
+"Source code": "源代码",
+"Right to left": "从右到左",
+"Left to right": "从左到右",
+"Emoticons": "表情",
+"Robots": "机器人",
+"Document properties": "文档属性",
+"Title": "标题",
+"Keywords": "关键词",
+"Encoding": "编码",
+"Description": "描述",
+"Author": "作者",
+"Fullscreen": "全屏",
+"Horizontal line": "水平分割线",
+"Horizontal space": "水平边距",
+"Insert\/edit image": "上传/插入图片",
+"Insert\/edit mind map": "新建/编辑思维导图",
+"Insert Mind Map": "插入思维导图",
+"Mind Map": "思维导图",
+"Image": "图片",
+"Insert Image": "插入",
+"General": "普通",
+"Advanced": "高级",
+"Source": "地址",
+"Border": "边框",
+"Constrain proportions": "保持纵横比",
+"Vertical space": "垂直边距",
+"Image description": "图片描述",
+"Style": "样式",
+"Dimensions": "大小",
+"Insert image": "插入图片",
+"Insert date\/time": "插入日期\/时间",
+"Remove link": "删除链接",
+"Url": "地址",
+"Text to display": "显示文字",
+"Anchors": "锚点",
+"Insert link": "插入链接",
+"New window": "在新窗口打开",
+"None": "无",
+"Target": "打开方式",
+"Insert\/edit link": "插入\/编辑链接",
+"Insert\/edit video": "插入\/编辑视频",
+"Poster": "封面",
+"Alternative source": "镜像",
+"Paste your embed code below:": "将内嵌代码粘贴在下面:",
+"Insert video": "插入视频",
+"Embed": "内嵌",
+"Nonbreaking space": "不间断空格",
+"Page break": "分页符",
+"Paste as text": "粘贴为文本",
+"Preview": "预览",
+"Print": "打印",
+"Save": "保存",
+"Could not find the specified string.": "未找到搜索内容.",
+"Replace": "替换",
+"Next": "下一个",
+"Whole words": "全字匹配",
+"Find and replace": "查找和替换",
+"Replace with": "替换为",
+"Find": "查找",
+"Replace all": "全部替换",
+"Match case": "区分大小写",
+"Prev": "上一个",
+"Spellcheck": "拼写检查",
+"Finish": "完成",
+"Ignore all": "全部忽略",
+"Ignore": "忽略",
+"Insert row before": "在上方插入",
+"Rows": "行",
+"Height": "高",
+"Paste row after": "粘贴到下方",
+"Alignment": "对齐方式",
+"Column group": "列组",
+"Row": "行",
+"Insert column before": "在左侧插入",
+"Split cell": "拆分单元格",
+"Cell padding": "单元格内边距",
+"Cell spacing": "单元格外间距",
+"Row type": "行类型",
+"Insert table": "插入表格",
+"Body": "表体",
+"Caption": "标题",
+"Footer": "表尾",
+"Delete row": "删除行",
+"Paste row before": "粘贴到上方",
+"Scope": "范围",
+"Delete table": "删除表格",
+"Header cell": "表头单元格",
+"Column": "列",
+"Cell": "单元格",
+"Header": "表头",
+"Cell type": "单元格类型",
+"Copy row": "复制行",
+"Row properties": "行属性",
+"Table properties": "表格属性",
+"Row group": "行组",
+"Right": "右对齐",
+"Insert column after": "在右侧插入",
+"Cols": "列",
+"Insert row after": "在下方插入",
+"Width": "宽",
+"Cell properties": "单元格属性",
+"Left": "左对齐",
+"Cut row": "剪切行",
+"Delete column": "删除列",
+"Center": "居中",
+"Merge cells": "合并单元格",
+"Insert template": "插入模板",
+"Templates": "模板",
+"Background color": "背景色",
+"Text color": "文字颜色",
+"Show blocks": "显示区块边框",
+"Show invisible characters": "显示不可见字符",
+"Words: {0}": "字数:{0}",
+"Insert": "插入",
+"File": "文件",
+"Edit": "编辑",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "在编辑区按ALT-F9打开菜单,按ALT-F10打开工具栏,按ALT-0查看帮助",
+"Tools": "工具",
+"View": "视图",
+"Table": "表格",
+"Format": "格式"
+});
\ No newline at end of file
diff --git a/public/tinymce/langs/zh-hk.js b/public/tinymce/langs/zh-hk.js
new file mode 100644
index 0000000..f7558b5
--- /dev/null
+++ b/public/tinymce/langs/zh-hk.js
@@ -0,0 +1,189 @@
+// http://www.atool.org/chinese2unicode.php
+tinymce.addI18n('zh-hk',{
+"Cut": "剪切",
+"Header 2": "標題2",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "妳的瀏覽器不支持對剪貼板的訪問,請使用Ctrl+X\/C\/V鍵進行復制粘貼。",
+"Div": "Div區塊",
+"Paste": "粘貼",
+"Close": "關閉",
+"Font Family": "字體",
+"Pre": "預格式文本",
+"Align right": "右對齊",
+"New document": "新文檔",
+"Blockquote": "引用",
+"Numbered list": "編號列表",
+"Increase indent": "增加縮進",
+"Formats": "格式",
+"Headers": "標題",
+"Select all": "全選",
+"Header 3": "標題3",
+"Blocks": "區塊",
+"Undo": "撤消",
+"Strikethrough": "刪除線",
+"Bullet list": "項目符號",
+"Header 1": "標題1",
+"Superscript": "上標",
+"Clear formatting": "清除格式",
+"Font Sizes": "字號",
+"Subscript": "下標",
+"Header 6": "標題6",
+"Redo": "重復",
+"Paragraph": "段落",
+"Ok": "確定",
+"Bold": "粗體",
+"Code": "代碼",
+"Italic": "斜體",
+"Align center": "居中",
+"Header 5": "標題5",
+"Decrease indent": "減少縮進",
+"Header 4": "標題4",
+"Convert Code": "轉換成文本",
+"toggleCode": "ctrl+shift+c 切換代碼",
+"Language": "代碼語言",
+"`ctrl/cmd+shift+c` toggle code": "`ctrl/cmd+shift+c` 切換代碼",
+"Toggle ace with raw html": "Ace代碼與普通Pre代碼切換",
+"Inline Code": "",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "當前為純文本粘貼模式,再次點擊可以回到普通粘貼模式。",
+"Underline": "下劃線",
+"Cancel": "取消",
+"Justify": "兩端對齊",
+"Inline": "文本",
+"Copy": "復制",
+"Align left": "左對齊",
+"Visual aids": "網格線",
+"Lower Greek": "小寫希臘字母",
+"Square": "方塊",
+"Default": "默認",
+"Lower Alpha": "小寫英文字母",
+"Circle": "空心圓",
+"Disc": "實心圓",
+"Upper Alpha": "大寫英文字母",
+"Upper Roman": "大寫羅馬字母",
+"Lower Roman": "小寫羅馬字母",
+"Name": "名稱",
+"Anchor": "錨點",
+"You have unsaved changes are you sure you want to navigate away?": "妳還有文檔尚未保存,確定要離開?",
+"Restore last draft": "恢復上次的草稿",
+"Special character": "特殊符號",
+"Source code": "源代碼",
+"Right to left": "從右到左",
+"Left to right": "從左到右",
+"Emoticons": "表情",
+"Robots": "機器人",
+"Document properties": "文檔屬性",
+"Title": "標題",
+"Keywords": "關鍵詞",
+"Encoding": "編碼",
+"Description": "描述",
+"Author": "作者",
+"Fullscreen": "全屏",
+"Horizontal line": "水平分割線",
+"Horizontal space": "水平邊距",
+"Insert\/edit image": "上傳/插入圖片",
+"Insert\/edit mind map": "新建/編輯思維導圖",
+"Insert Mind Map": "插入思維導圖",
+"Mind Map": "思維導圖",
+"Image": "圖片",
+"Insert Image": "插入",
+"General": "普通",
+"Advanced": "高級",
+"Source": "地址",
+"Border": "邊框",
+"Constrain proportions": "保持縱橫比",
+"Vertical space": "垂直邊距",
+"Image description": "圖片描述",
+"Style": "樣式",
+"Dimensions": "大小",
+"Insert image": "插入圖片",
+"Insert date\/time": "插入日期\/時間",
+"Remove link": "刪除鏈接",
+"Url": "地址",
+"Text to display": "顯示文字",
+"Anchors": "錨點",
+"Insert link": "插入鏈接",
+"New window": "在新窗口打開",
+"None": "無",
+"Target": "打開方式",
+"Insert\/edit link": "插入\/編輯鏈接",
+"Insert\/edit video": "插入\/編輯視頻",
+"Poster": "封面",
+"Alternative source": "鏡像",
+"Paste your embed code below:": "將內嵌代碼粘貼在下面:",
+"Insert video": "插入視頻",
+"Embed": "內嵌",
+"Nonbreaking space": "不間斷空格",
+"Page break": "分頁符",
+"Paste as text": "粘貼為文本",
+"Preview": "預覽",
+"Print": "打印",
+"Save": "保存",
+"Could not find the specified string.": "未找到搜索內容.",
+"Replace": "替換",
+"Next": "下壹個",
+"Whole words": "全字匹配",
+"Find and replace": "查找和替換",
+"Replace with": "替換為",
+"Find": "查找",
+"Replace all": "全部替換",
+"Match case": "區分大小寫",
+"Prev": "上壹個",
+"Spellcheck": "拼寫檢查",
+"Finish": "完成",
+"Ignore all": "全部忽略",
+"Ignore": "忽略",
+"Insert row before": "在上方插入",
+"Rows": "行",
+"Height": "高",
+"Paste row after": "粘貼到下方",
+"Alignment": "對齊方式",
+"Column group": "列組",
+"Row": "行",
+"Insert column before": "在左側插入",
+"Split cell": "拆分單元格",
+"Cell padding": "單元格內邊距",
+"Cell spacing": "單元格外間距",
+"Row type": "行類型",
+"Insert table": "插入表格",
+"Body": "表體",
+"Caption": "標題",
+"Footer": "表尾",
+"Delete row": "刪除行",
+"Paste row before": "粘貼到上方",
+"Scope": "範圍",
+"Delete table": "刪除表格",
+"Header cell": "表頭單元格",
+"Column": "列",
+"Cell": "單元格",
+"Header": "表頭",
+"Cell type": "單元格類型",
+"Copy row": "復制行",
+"Row properties": "行屬性",
+"Table properties": "表格屬性",
+"Row group": "行組",
+"Right": "右對齊",
+"Insert column after": "在右側插入",
+"Cols": "列",
+"Insert row after": "在下方插入",
+"Width": "寬",
+"Cell properties": "單元格屬性",
+"Left": "左對齊",
+"Cut row": "剪切行",
+"Delete column": "刪除列",
+"Center": "居中",
+"Merge cells": "合並單元格",
+"Insert template": "插入模板",
+"Templates": "模板",
+"Background color": "背景色",
+"Text color": "文字顏色",
+"Show blocks": "顯示區塊邊框",
+"Show invisible characters": "顯示不可見字符",
+"Words: {0}": "字數:{0}",
+"Insert": "插入",
+"File": "文件",
+"Edit": "編輯",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "在編輯區按ALT-F9打開菜單,按ALT-F10打開工具欄,按ALT-0查看幫助",
+"Tools": "工具",
+"View": "視圖",
+"Table": "表格",
+"Format": "格式"
+});
\ No newline at end of file
diff --git a/public/tinymce/langs/zh.js b/public/tinymce/langs/zh.js
deleted file mode 100644
index d07a39e..0000000
--- a/public/tinymce/langs/zh.js
+++ /dev/null
@@ -1,188 +0,0 @@
-tinymce.addI18n('zh',{
-"Cut": "\u526a\u5207",
-"Header 2": "\u6807\u98982",
-"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "\u4f60\u7684\u6d4f\u89c8\u5668\u4e0d\u652f\u6301\u5bf9\u526a\u8d34\u677f\u7684\u8bbf\u95ee\uff0c\u8bf7\u4f7f\u7528Ctrl+X\/C\/V\u952e\u8fdb\u884c\u590d\u5236\u7c98\u8d34\u3002",
-"Div": "Div\u533a\u5757",
-"Paste": "\u7c98\u8d34",
-"Close": "\u5173\u95ed",
-"Font Family": "\u5b57\u4f53",
-"Pre": "\u9884\u683c\u5f0f\u6587\u672c",
-"Align right": "\u53f3\u5bf9\u9f50",
-"New document": "\u65b0\u6587\u6863",
-"Blockquote": "\u5f15\u7528",
-"Numbered list": "\u7f16\u53f7\u5217\u8868",
-"Increase indent": "\u589e\u52a0\u7f29\u8fdb",
-"Formats": "\u683c\u5f0f",
-"Headers": "\u6807\u9898",
-"Select all": "\u5168\u9009",
-"Header 3": "\u6807\u98983",
-"Blocks": "\u533a\u5757",
-"Undo": "\u64a4\u6d88",
-"Strikethrough": "\u5220\u9664\u7ebf",
-"Bullet list": "\u9879\u76ee\u7b26\u53f7",
-"Header 1": "\u6807\u98981",
-"Superscript": "\u4e0a\u6807",
-"Clear formatting": "\u6e05\u9664\u683c\u5f0f",
-"Font Sizes": "\u5b57\u53f7",
-"Subscript": "\u4e0b\u6807",
-"Header 6": "\u6807\u98986",
-"Redo": "\u91cd\u590d",
-"Paragraph": "\u6bb5\u843d",
-"Ok": "\u786e\u5b9a",
-"Bold": "\u7c97\u4f53",
-"Code": "\u4ee3\u7801",
-"Italic": "\u659c\u4f53",
-"Align center": "\u5c45\u4e2d",
-"Header 5": "\u6807\u98985",
-"Decrease indent": "\u51cf\u5c11\u7f29\u8fdb",
-"Header 4": "\u6807\u98984",
-"Convert Code": "转换成文本",
-"toggleCode": "ctrl+shift+c 切换代码",
-"Language": "代码语言",
-"`ctrl/cmd+shift+c` toggle code": "`ctrl/cmd+shift+c` 切换代码",
-"Toggle ace with raw html": "Ace代码与普通Pre代码切换",
-"Inline Code": "",
-"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "\u5f53\u524d\u4e3a\u7eaf\u6587\u672c\u7c98\u8d34\u6a21\u5f0f\uff0c\u518d\u6b21\u70b9\u51fb\u53ef\u4ee5\u56de\u5230\u666e\u901a\u7c98\u8d34\u6a21\u5f0f\u3002",
-"Underline": "\u4e0b\u5212\u7ebf",
-"Cancel": "\u53d6\u6d88",
-"Justify": "\u4e24\u7aef\u5bf9\u9f50",
-"Inline": "\u6587\u672c",
-"Copy": "\u590d\u5236",
-"Align left": "\u5de6\u5bf9\u9f50",
-"Visual aids": "\u7f51\u683c\u7ebf",
-"Lower Greek": "\u5c0f\u5199\u5e0c\u814a\u5b57\u6bcd",
-"Square": "\u65b9\u5757",
-"Default": "\u9ed8\u8ba4",
-"Lower Alpha": "\u5c0f\u5199\u82f1\u6587\u5b57\u6bcd",
-"Circle": "\u7a7a\u5fc3\u5706",
-"Disc": "\u5b9e\u5fc3\u5706",
-"Upper Alpha": "\u5927\u5199\u82f1\u6587\u5b57\u6bcd",
-"Upper Roman": "\u5927\u5199\u7f57\u9a6c\u5b57\u6bcd",
-"Lower Roman": "\u5c0f\u5199\u7f57\u9a6c\u5b57\u6bcd",
-"Name": "\u540d\u79f0",
-"Anchor": "\u951a\u70b9",
-"You have unsaved changes are you sure you want to navigate away?": "\u4f60\u8fd8\u6709\u6587\u6863\u5c1a\u672a\u4fdd\u5b58\uff0c\u786e\u5b9a\u8981\u79bb\u5f00\uff1f",
-"Restore last draft": "\u6062\u590d\u4e0a\u6b21\u7684\u8349\u7a3f",
-"Special character": "\u7279\u6b8a\u7b26\u53f7",
-"Source code": "\u6e90\u4ee3\u7801",
-"Right to left": "\u4ece\u53f3\u5230\u5de6",
-"Left to right": "\u4ece\u5de6\u5230\u53f3",
-"Emoticons": "\u8868\u60c5",
-"Robots": "\u673a\u5668\u4eba",
-"Document properties": "\u6587\u6863\u5c5e\u6027",
-"Title": "\u6807\u9898",
-"Keywords": "\u5173\u952e\u8bcd",
-"Encoding": "\u7f16\u7801",
-"Description": "\u63cf\u8ff0",
-"Author": "\u4f5c\u8005",
-"Fullscreen": "\u5168\u5c4f",
-"Horizontal line": "\u6c34\u5e73\u5206\u5272\u7ebf",
-"Horizontal space": "\u6c34\u5e73\u8fb9\u8ddd",
-"Insert\/edit image": "上传/插入图片",
-"Insert\/edit mind map": "新建/编辑思维导图",
-"Insert Mind Map": "插入思维导图",
-"Mind Map": "思维导图",
-"Image": "图片",
-"Insert Image": "插入",
-"General": "\u666e\u901a",
-"Advanced": "\u9ad8\u7ea7",
-"Source": "\u5730\u5740",
-"Border": "\u8fb9\u6846",
-"Constrain proportions": "\u4fdd\u6301\u7eb5\u6a2a\u6bd4",
-"Vertical space": "\u5782\u76f4\u8fb9\u8ddd",
-"Image description": "\u56fe\u7247\u63cf\u8ff0",
-"Style": "\u6837\u5f0f",
-"Dimensions": "\u5927\u5c0f",
-"Insert image": "\u63d2\u5165\u56fe\u7247",
-"Insert date\/time": "\u63d2\u5165\u65e5\u671f\/\u65f6\u95f4",
-"Remove link": "\u5220\u9664\u94fe\u63a5",
-"Url": "\u5730\u5740",
-"Text to display": "\u663e\u793a\u6587\u5b57",
-"Anchors": "\u951a\u70b9",
-"Insert link": "\u63d2\u5165\u94fe\u63a5",
-"New window": "\u5728\u65b0\u7a97\u53e3\u6253\u5f00",
-"None": "\u65e0",
-"Target": "\u6253\u5f00\u65b9\u5f0f",
-"Insert\/edit link": "\u63d2\u5165\/\u7f16\u8f91\u94fe\u63a5",
-"Insert\/edit video": "\u63d2\u5165\/\u7f16\u8f91\u89c6\u9891",
-"Poster": "\u5c01\u9762",
-"Alternative source": "\u955c\u50cf",
-"Paste your embed code below:": "\u5c06\u5185\u5d4c\u4ee3\u7801\u7c98\u8d34\u5728\u4e0b\u9762:",
-"Insert video": "\u63d2\u5165\u89c6\u9891",
-"Embed": "\u5185\u5d4c",
-"Nonbreaking space": "\u4e0d\u95f4\u65ad\u7a7a\u683c",
-"Page break": "\u5206\u9875\u7b26",
-"Paste as text": "\u7c98\u8d34\u4e3a\u6587\u672c",
-"Preview": "\u9884\u89c8",
-"Print": "\u6253\u5370",
-"Save": "\u4fdd\u5b58",
-"Could not find the specified string.": "\u672a\u627e\u5230\u641c\u7d22\u5185\u5bb9.",
-"Replace": "\u66ff\u6362",
-"Next": "\u4e0b\u4e00\u4e2a",
-"Whole words": "\u5168\u5b57\u5339\u914d",
-"Find and replace": "\u67e5\u627e\u548c\u66ff\u6362",
-"Replace with": "\u66ff\u6362\u4e3a",
-"Find": "\u67e5\u627e",
-"Replace all": "\u5168\u90e8\u66ff\u6362",
-"Match case": "\u533a\u5206\u5927\u5c0f\u5199",
-"Prev": "\u4e0a\u4e00\u4e2a",
-"Spellcheck": "\u62fc\u5199\u68c0\u67e5",
-"Finish": "\u5b8c\u6210",
-"Ignore all": "\u5168\u90e8\u5ffd\u7565",
-"Ignore": "\u5ffd\u7565",
-"Insert row before": "\u5728\u4e0a\u65b9\u63d2\u5165",
-"Rows": "\u884c",
-"Height": "\u9ad8",
-"Paste row after": "\u7c98\u8d34\u5230\u4e0b\u65b9",
-"Alignment": "\u5bf9\u9f50\u65b9\u5f0f",
-"Column group": "\u5217\u7ec4",
-"Row": "\u884c",
-"Insert column before": "\u5728\u5de6\u4fa7\u63d2\u5165",
-"Split cell": "\u62c6\u5206\u5355\u5143\u683c",
-"Cell padding": "\u5355\u5143\u683c\u5185\u8fb9\u8ddd",
-"Cell spacing": "\u5355\u5143\u683c\u5916\u95f4\u8ddd",
-"Row type": "\u884c\u7c7b\u578b",
-"Insert table": "\u63d2\u5165\u8868\u683c",
-"Body": "\u8868\u4f53",
-"Caption": "\u6807\u9898",
-"Footer": "\u8868\u5c3e",
-"Delete row": "\u5220\u9664\u884c",
-"Paste row before": "\u7c98\u8d34\u5230\u4e0a\u65b9",
-"Scope": "\u8303\u56f4",
-"Delete table": "\u5220\u9664\u8868\u683c",
-"Header cell": "\u8868\u5934\u5355\u5143\u683c",
-"Column": "\u5217",
-"Cell": "\u5355\u5143\u683c",
-"Header": "\u8868\u5934",
-"Cell type": "\u5355\u5143\u683c\u7c7b\u578b",
-"Copy row": "\u590d\u5236\u884c",
-"Row properties": "\u884c\u5c5e\u6027",
-"Table properties": "\u8868\u683c\u5c5e\u6027",
-"Row group": "\u884c\u7ec4",
-"Right": "\u53f3\u5bf9\u9f50",
-"Insert column after": "\u5728\u53f3\u4fa7\u63d2\u5165",
-"Cols": "\u5217",
-"Insert row after": "\u5728\u4e0b\u65b9\u63d2\u5165",
-"Width": "\u5bbd",
-"Cell properties": "\u5355\u5143\u683c\u5c5e\u6027",
-"Left": "\u5de6\u5bf9\u9f50",
-"Cut row": "\u526a\u5207\u884c",
-"Delete column": "\u5220\u9664\u5217",
-"Center": "\u5c45\u4e2d",
-"Merge cells": "\u5408\u5e76\u5355\u5143\u683c",
-"Insert template": "\u63d2\u5165\u6a21\u677f",
-"Templates": "\u6a21\u677f",
-"Background color": "\u80cc\u666f\u8272",
-"Text color": "\u6587\u5b57\u989c\u8272",
-"Show blocks": "\u663e\u793a\u533a\u5757\u8fb9\u6846",
-"Show invisible characters": "\u663e\u793a\u4e0d\u53ef\u89c1\u5b57\u7b26",
-"Words: {0}": "\u5b57\u6570\uff1a{0}",
-"Insert": "\u63d2\u5165",
-"File": "\u6587\u4ef6",
-"Edit": "\u7f16\u8f91",
-"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "\u5728\u7f16\u8f91\u533a\u6309ALT-F9\u6253\u5f00\u83dc\u5355\uff0c\u6309ALT-F10\u6253\u5f00\u5de5\u5177\u680f\uff0c\u6309ALT-0\u67e5\u770b\u5e2e\u52a9",
-"Tools": "\u5de5\u5177",
-"View": "\u89c6\u56fe",
-"Table": "\u8868\u683c",
-"Format": "\u683c\u5f0f"
-});
\ No newline at end of file