diff --git a/frontend/frontend.go b/frontend/frontend.go index 3fa536f2..4847e444 100644 --- a/frontend/frontend.go +++ b/frontend/frontend.go @@ -1,6 +1,26 @@ package frontend -import "embed" +import ( + "embed" + "github.com/0xJacky/pofile" + "log" + "path" +) //go:embed dist var DistFS embed.FS + +var Translations pofile.Dict + +func InitTranslations() { + lang := []string{"zh_CN", "zh_TW", "en"} + Translations = make(pofile.Dict) + for _, v := range lang { + p, err := pofile.Parse(path.Join("frontend", "src", "locale", v, "LC_MESSAGES", "app.po")) + if err != nil { + log.Fatalln(err) + } + Translations[p.Header.Language] = make(pofile.Dict) + Translations[p.Header.Language] = p.ToDict() + } +} diff --git a/frontend/src/lib/store/settings.js b/frontend/src/lib/store/settings.js index 43e0ce10..f69f2094 100644 --- a/frontend/src/lib/store/settings.js +++ b/frontend/src/lib/store/settings.js @@ -1,17 +1,24 @@ export const settings = { namespace: true, state: { - language: '' + language: '', + translations: {}, }, mutations: { set_language(state, payload) { state.language = payload }, + update_translations(state, payload) { + state.translations = payload + } }, actions: { set_language({commit}, data) { commit('set_language', data) }, + update_translations({commit}, data) { + commit('update_translations', data) + } }, getters: { current_language(state) { diff --git a/frontend/src/lib/translate/gettext.js b/frontend/src/lib/translate/gettext.js index fe89d489..043dd4a4 100644 --- a/frontend/src/lib/translate/gettext.js +++ b/frontend/src/lib/translate/gettext.js @@ -1,7 +1,6 @@ import {translate} from 'vue-gettext' import store from '@/lib/store' import {availableLanguages} from '@/lib/translate/index' -import translations from '@/translations.json' let lang = window.navigator.language if (!lang.includes('zh')) { @@ -24,6 +23,6 @@ const { gettext: $gettext, } = translate -translate.initTranslations(translations, config) +translate.initTranslations(store.state.settings.translations, config) export default $gettext diff --git a/frontend/src/locale/en/LC_MESSAGES/app.po b/frontend/src/locale/en/LC_MESSAGES/app.po index 543507ec..eb9b47e0 100644 --- a/frontend/src/locale/en/LC_MESSAGES/app.po +++ b/frontend/src/locale/en/LC_MESSAGES/app.po @@ -103,21 +103,17 @@ msgid "System message" msgstr "" #: src/views/dashboard/DashBoard.vue:124 -msgid "Total: " +msgid "Total:" msgstr "" #: src/views/dashboard/DashBoard.vue:12 msgid "Uptime" msgstr "" -#: src/views/dashboard/DashBoard.vue:94 +#: src/views/dashboard/DashBoard.vue:94 src/views/dashboard/DashBoard.vue:123 msgid "Used:" msgstr "" -#: src/views/dashboard/DashBoard.vue:123 -msgid "Used: " -msgstr "" - #: src/router/index.js:27 msgid "Users" msgstr "" diff --git a/frontend/src/locale/en/LC_MESSAGES/app.po~ b/frontend/src/locale/en/LC_MESSAGES/app.po~ index 60380c61..543507ec 100644 --- a/frontend/src/locale/en/LC_MESSAGES/app.po~ +++ b/frontend/src/locale/en/LC_MESSAGES/app.po~ @@ -23,7 +23,7 @@ msgid "Add Sites" msgstr "" #: src/views/dashboard/DashBoard.vue:94 -msgid "Cached: " +msgid "Cached:" msgstr "" #: src/router/index.js:60 diff --git a/frontend/src/locale/zh_CN/LC_MESSAGES/app.mo b/frontend/src/locale/zh_CN/LC_MESSAGES/app.mo index a415c8de..7a30e353 100644 Binary files a/frontend/src/locale/zh_CN/LC_MESSAGES/app.mo and b/frontend/src/locale/zh_CN/LC_MESSAGES/app.mo differ diff --git a/frontend/src/locale/zh_CN/LC_MESSAGES/app.po b/frontend/src/locale/zh_CN/LC_MESSAGES/app.po index 3b91a26d..b01fc527 100644 --- a/frontend/src/locale/zh_CN/LC_MESSAGES/app.po +++ b/frontend/src/locale/zh_CN/LC_MESSAGES/app.po @@ -105,21 +105,17 @@ msgid "System message" msgstr "系统消息" #: src/views/dashboard/DashBoard.vue:124 -msgid "Total: " -msgstr "总共: " +msgid "Total:" +msgstr "总共:" #: src/views/dashboard/DashBoard.vue:12 msgid "Uptime" msgstr "运行时间" -#: src/views/dashboard/DashBoard.vue:94 +#: src/views/dashboard/DashBoard.vue:94 src/views/dashboard/DashBoard.vue:123 msgid "Used:" msgstr "已使用:" -#: src/views/dashboard/DashBoard.vue:123 -msgid "Used: " -msgstr "已使用: " - #: src/router/index.js:27 msgid "Users" msgstr "用户" diff --git a/frontend/src/locale/zh_CN/LC_MESSAGES/app.po~ b/frontend/src/locale/zh_CN/LC_MESSAGES/app.po~ deleted file mode 100644 index 1a3d823a..00000000 --- a/frontend/src/locale/zh_CN/LC_MESSAGES/app.po~ +++ /dev/null @@ -1,125 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"POT-Creation-Date: \n" -"PO-Revision-Date: \n" -"Last-Translator: Automatically generated\n" -"Language-Team: none\n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: easygettext\n" -"X-Generator: Poedit 3.0.1\n" - -#: src/router/index.js:98 -msgid "404 Not Found" -msgstr "404 找不到页面" - -#: src/router/index.js:76 -msgid "About" -msgstr "关于" - -#: src/router/index.js:47 -msgid "Add Sites" -msgstr "添加站点" - -#: src/views/dashboard/DashBoard.vue:94 -msgid "Cached: " -msgstr "缓存: " - -#: src/router/index.js:60 -msgid "Config" -msgstr "配置" - -#: src/router/index.js:19 -msgid "Dashboard" -msgstr "仪表盘" - -#: src/router/index.js:124 -msgid "Detected version update, this page will automatically refresh." -msgstr "检测到版本更新,页面将会自动刷新。" - -#: src/views/dashboard/DashBoard.vue:95 -msgid "Free:" -msgstr "空闲:" - -#: src/router/index.js:12 -msgid "Home" -msgstr "首页" - -#: src/router/index.js:86 -msgid "Install" -msgstr "安装" - -#: src/views/dashboard/DashBoard.vue:13 -msgid "Load averages" -msgstr "系统负载" - -#: src/router/index.js:92 -msgid "Login" -msgstr "登录" - -#: src/views/dashboard/DashBoard.vue:23 -msgid "Memory" -msgstr "内存" - -#: src/router/index.js:68 -msgid "Modify Config" -msgstr "配置修改" - -#: src/router/index.js:51 -msgid "Modify Sites" -msgstr "站点修改" - -#: src/router/index.js:104 -msgid "Not Found" -msgstr "找不到页面" - -#: src/router/index.js:128 -msgid "OK" -msgstr "好的" - -#: src/views/dashboard/DashBoard.vue:96 -msgid "Physical memory:" -msgstr "物理内存:" - -#: src/views/dashboard/DashBoard.vue:38 -msgid "Server status" -msgstr "服务器状态" - -#: src/router/index.js:35 -msgid "Sites" -msgstr "站点" - -#: src/router/index.js:43 -msgid "Sites List" -msgstr "站点列表" - -#: src/views/dashboard/DashBoard.vue:32 -msgid "Storage" -msgstr "存储" - -#: src/router/index.js:123 -msgid "System message" -msgstr "系统消息" - -#: src/views/dashboard/DashBoard.vue:124 -msgid "Total: " -msgstr "总共: " - -#: src/views/dashboard/DashBoard.vue:12 -msgid "Uptime" -msgstr "运行时间" - -#: src/views/dashboard/DashBoard.vue:94 -msgid "Used:" -msgstr "已使用:" - -#: src/views/dashboard/DashBoard.vue:123 -msgid "Used: " -msgstr "已使用: " - -#: src/router/index.js:27 -msgid "Users" -msgstr "用户" diff --git a/frontend/src/locale/zh_TW/LC_MESSAGES/app.po b/frontend/src/locale/zh_TW/LC_MESSAGES/app.po index 6095b829..409e89c8 100644 --- a/frontend/src/locale/zh_TW/LC_MESSAGES/app.po +++ b/frontend/src/locale/zh_TW/LC_MESSAGES/app.po @@ -102,21 +102,17 @@ msgid "System message" msgstr "" #: src/views/dashboard/DashBoard.vue:124 -msgid "Total: " +msgid "Total:" msgstr "" #: src/views/dashboard/DashBoard.vue:12 msgid "Uptime" msgstr "" -#: src/views/dashboard/DashBoard.vue:94 +#: src/views/dashboard/DashBoard.vue:94 src/views/dashboard/DashBoard.vue:123 msgid "Used:" msgstr "" -#: src/views/dashboard/DashBoard.vue:123 -msgid "Used: " -msgstr "" - #: src/router/index.js:27 msgid "Users" msgstr "" diff --git a/frontend/src/locale/zh_TW/LC_MESSAGES/app.po~ b/frontend/src/locale/zh_TW/LC_MESSAGES/app.po~ index 6bd8bd48..6095b829 100644 --- a/frontend/src/locale/zh_TW/LC_MESSAGES/app.po~ +++ b/frontend/src/locale/zh_TW/LC_MESSAGES/app.po~ @@ -22,7 +22,7 @@ msgid "Add Sites" msgstr "" #: src/views/dashboard/DashBoard.vue:94 -msgid "Cached: " +msgid "Cached:" msgstr "" #: src/router/index.js:60 diff --git a/frontend/src/main.js b/frontend/src/main.js index 00c6d376..4b6f9c76 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -11,7 +11,7 @@ import utils from '@/lib/utils' import api from '@/api' import GetTextPlugin from 'vue-gettext' import {availableLanguages} from '@/lib/translate' -import translations from '@/translations.json' +import http from '@/lib/http' Vue.use(utils) @@ -23,10 +23,14 @@ Vue.prototype.$api = api Vue.use(GetTextPlugin, { availableLanguages, defaultLanguage: store.getters.current_language, - translations: translations, + translations: store.state.settings.translations, silent: true }) +http.get('/translations.json').then(r => { + store.commit('update_translations', r) +}) + NProgress.configure({ easing: 'ease', speed: 500, diff --git a/frontend/src/translations.json b/frontend/src/translations.json deleted file mode 100644 index 65e079c3..00000000 --- a/frontend/src/translations.json +++ /dev/null @@ -1 +0,0 @@ -{"en":{},"zh_CN":{"404 Not Found":"404 找不到页面","About":"关于","Add Sites":"添加站点","Cached:":"缓存:","Config":"配置","Dashboard":"仪表盘","Detected version update, this page will automatically refresh.":"检测到版本更新,页面将会自动刷新。","Free:":"空闲:","Home":"首页","Install":"安装","Load averages":"系统负载","Login":"登录","Memory":"内存","Modify Config":"配置修改","Modify Sites":"站点修改","Not Found":"找不到页面","OK":"好的","Physical memory:":"物理内存:","Server status":"服务器状态","Sites":"站点","Sites List":"站点列表","Storage":"存储","System message":"系统消息","Total: ":"总共: ","Uptime":"运行时间","Used:":"已使用:","Used: ":"已使用: ","Users":"用户"},"zh_TW":{}} \ No newline at end of file diff --git a/frontend/src/views/dashboard/DashBoard.vue b/frontend/src/views/dashboard/DashBoard.vue index a09b4faa..9799afbd 100644 --- a/frontend/src/views/dashboard/DashBoard.vue +++ b/frontend/src/views/dashboard/DashBoard.vue @@ -30,8 +30,8 @@
+ :title="$gettext('Used:')+ disk_used + + ' / '+ $gettext('Total:') + disk_total">

Storage

diff --git a/go.mod b/go.mod index 414682e1..652f48d8 100644 --- a/go.mod +++ b/go.mod @@ -23,11 +23,13 @@ require ( ) require ( + github.com/0xJacky/pofile v0.0.0-20220219022008-df96416310e5 // indirect github.com/StackExchange/wmi v1.2.1 // indirect github.com/cenkalti/backoff/v4 v4.1.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-ole/go-ole v1.2.5 // indirect github.com/golang/protobuf v1.3.4 // indirect + github.com/itchyny/timefmt-go v0.1.3 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.2 // indirect github.com/json-iterator/go v1.1.9 // indirect @@ -37,6 +39,7 @@ require ( github.com/miekg/dns v1.1.40 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/tklauser/go-sysconf v0.3.7 // indirect github.com/tklauser/numcpus v0.2.3 // indirect github.com/ugorji/go/codec v1.1.7 // indirect diff --git a/go.sum b/go.sum index 2840a5af..039e93d1 100644 --- a/go.sum +++ b/go.sum @@ -23,6 +23,10 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/0xJacky/pofile v0.0.0-20220216140954-bc565a3feb80 h1:qKPxkbGoP/vVxN1Vgd964oJBlhGwhrCAKiheoieOPhc= +github.com/0xJacky/pofile v0.0.0-20220216140954-bc565a3feb80/go.mod h1:gSDWobvodMtvwh7FE/F999AQoCwBoXgzyGffYFX9nKA= +github.com/0xJacky/pofile v0.0.0-20220219022008-df96416310e5 h1:NEsbh2Wez8+0Y72hbVQPPhyIkmc1RAgWOWbcISRUxEs= +github.com/0xJacky/pofile v0.0.0-20220219022008-df96416310e5/go.mod h1:gSDWobvodMtvwh7FE/F999AQoCwBoXgzyGffYFX9nKA= github.com/Azure/azure-sdk-for-go v32.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg= github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= @@ -225,6 +229,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/iij/doapi v0.0.0-20190504054126-0bbf12d6d7df/go.mod h1:QMZY7/J/KSQEhKWFeDesPjMj+wCHReeknARU3wqlyN4= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/infobloxopen/infoblox-go-client v1.1.1/go.mod h1:BXiw7S2b9qJoM8MS40vfgCNB2NLHGusk1DtO16BD9zI= +github.com/itchyny/timefmt-go v0.1.3 h1:7M3LGVDsqcd0VZH2U+x393obrzZisp7C0uEe921iRkU= +github.com/itchyny/timefmt-go v0.1.3/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A= github.com/jarcoal/httpmock v1.0.6/go.mod h1:ATjnClrvW/3tijVmpL/va5Z3aAyGvqU3gCT8nX0Txik= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= @@ -335,6 +341,7 @@ github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrap github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= diff --git a/main.go b/main.go index 9954b570..77913267 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "context" "flag" + "github.com/0xJacky/Nginx-UI/frontend" "github.com/0xJacky/Nginx-UI/server/model" "github.com/0xJacky/Nginx-UI/server/router" "github.com/0xJacky/Nginx-UI/server/settings" @@ -32,6 +33,7 @@ func main() { log.Printf("nginx config dir path: %s", tool2.GetNginxConfPath("")) if "" != settings.ServerSettings.JwtSecret { model.Init() + frontend.InitTranslations() go tool2.AutoCert() } diff --git a/server/api/translations.go b/server/api/translations.go new file mode 100644 index 00000000..0e044eda --- /dev/null +++ b/server/api/translations.go @@ -0,0 +1,11 @@ +package api + +import ( + "github.com/0xJacky/Nginx-UI/frontend" + "github.com/gin-gonic/gin" + "net/http" +) + +func GetTranslations(c *gin.Context) { + c.JSON(http.StatusOK, frontend.Translations) +} diff --git a/server/router/routers.go b/server/router/routers.go index 516bf95c..a9994da5 100644 --- a/server/router/routers.go +++ b/server/router/routers.go @@ -2,7 +2,7 @@ package router import ( "bufio" - api2 "github.com/0xJacky/Nginx-UI/server/api" + "github.com/0xJacky/Nginx-UI/server/api" "github.com/gin-contrib/static" "github.com/gin-gonic/gin" "net/http" @@ -29,46 +29,47 @@ func InitRouter() *gin.Engine { g := r.Group("/api") { - g.GET("install", api2.InstallLockCheck) - g.POST("install", api2.InstallNginxUI) + g.GET("translations.json", api.GetTranslations) + g.GET("install", api.InstallLockCheck) + g.POST("install", api.InstallNginxUI) - g.POST("/login", api2.Login) - g.DELETE("/logout", api2.Logout) + g.POST("/login", api.Login) + g.DELETE("/logout", api.Logout) g := g.Group("/", authRequired()) { - g.GET("/analytic", api2.Analytic) + g.GET("/analytic", api.Analytic) - g.GET("/users", api2.GetUsers) - g.GET("/user/:id", api2.GetUser) - g.POST("/user", api2.AddUser) - g.POST("/user/:id", api2.EditUser) - g.DELETE("/user/:id", api2.DeleteUser) + g.GET("/users", api.GetUsers) + g.GET("/user/:id", api.GetUser) + g.POST("/user", api.AddUser) + g.POST("/user/:id", api.EditUser) + g.DELETE("/user/:id", api.DeleteUser) - g.GET("domains", api2.GetDomains) - g.GET("domain/:name", api2.GetDomain) - g.POST("domain/:name", api2.EditDomain) - g.POST("domain/:name/enable", api2.EnableDomain) - g.POST("domain/:name/disable", api2.DisableDomain) - g.DELETE("domain/:name", api2.DeleteDomain) + g.GET("domains", api.GetDomains) + g.GET("domain/:name", api.GetDomain) + g.POST("domain/:name", api.EditDomain) + g.POST("domain/:name/enable", api.EnableDomain) + g.POST("domain/:name/disable", api.DisableDomain) + g.DELETE("domain/:name", api.DeleteDomain) - g.GET("configs", api2.GetConfigs) - g.GET("config/:name", api2.GetConfig) - g.POST("config", api2.AddConfig) - g.POST("config/:name", api2.EditConfig) + g.GET("configs", api.GetConfigs) + g.GET("config/:name", api.GetConfig) + g.POST("config", api.AddConfig) + g.POST("config/:name", api.EditConfig) - g.GET("backups", api2.GetFileBackupList) - g.GET("backup/:id", api2.GetFileBackup) + g.GET("backups", api.GetFileBackupList) + g.GET("backup/:id", api.GetFileBackup) - g.GET("template/:name", api2.GetTemplate) + g.GET("template/:name", api.GetTemplate) - g.GET("cert/issue/:domain", api2.IssueCert) - g.GET("cert/:domain/info", api2.CertInfo) + g.GET("cert/issue/:domain", api.IssueCert) + g.GET("cert/:domain/info", api.CertInfo) // 添加域名到自动续期列表 - g.POST("cert/:domain", api2.AddDomainToAutoCert) + g.POST("cert/:domain", api.AddDomainToAutoCert) // 从自动续期列表中删除域名 - g.DELETE("cert/:domain", api2.RemoveDomainFromAutoCert) + g.DELETE("cert/:domain", api.RemoveDomainFromAutoCert) } }