Forráskód Böngészése

compile pofile in backend

0xJacky 3 éve
szülő
commit
9940c0ad36

+ 21 - 1
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()
+	}
+}

+ 8 - 1
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) {

+ 1 - 2
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

+ 2 - 6
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 ""

+ 1 - 1
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

BIN
frontend/src/locale/zh_CN/LC_MESSAGES/app.mo


+ 3 - 7
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 "用户"

+ 0 - 125
frontend/src/locale/zh_CN/LC_MESSAGES/app.po~

@@ -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 "用户"

+ 2 - 6
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 ""

+ 1 - 1
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

+ 6 - 2
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,

+ 0 - 1
frontend/src/translations.json

@@ -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":{}}

+ 2 - 2
frontend/src/views/dashboard/DashBoard.vue

@@ -30,8 +30,8 @@
                         <a-col :lg="6" :sm="8" :xs="12" class="chart_dashboard">
                             <div>
                                 <a-tooltip
-                                    :title="$gettext('Used: ')+ disk_used +
-                                     ' / '+ $gettext('Total: ') + disk_total">
+                                    :title="$gettext('Used:')+ disk_used +
+                                     ' / '+ $gettext('Total:') + disk_total">
                                     <a-progress :percent="disk_percentage" type="dashboard"/>
                                     <p class="description" v-translate>Storage</p>
                                 </a-tooltip>

+ 3 - 0
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

+ 7 - 0
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=

+ 2 - 0
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()
 	}
 

+ 11 - 0
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)
+}

+ 29 - 28
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)
 		}
 	}