diff --git a/cmd/answer/main.go b/cmd/answer/main.go index fb91f5942..9ba33b6f4 100644 --- a/cmd/answer/main.go +++ b/cmd/answer/main.go @@ -26,10 +26,9 @@ import ( ) // main godoc -// @title "apache answer" -// @description = "apache answer api" -// @version = "v0.0.1" -// @BasePath = "/" +// @title Apache Answer +// @description Apache Answer API +// @BasePath / // @securityDefinitions.apikey ApiKeyAuth // @in header // @name Authorization diff --git a/docs/docs.go b/docs/docs.go index 7f5bd8718..69078bf4d 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -7226,6 +7226,35 @@ const docTemplate = `{ } } }, + "/installation/language/config": { + "get": { + "description": "get installation language config mapping", + "produces": [ + "application/json" + ], + "tags": [ + "Lang" + ], + "summary": "get installation language config mapping", + "parameters": [ + { + "type": "string", + "description": "installation language", + "name": "lang", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handler.RespBody" + } + } + } + } + }, "/installation/language/options": { "get": { "description": "get installation language options", diff --git a/docs/swagger.json b/docs/swagger.json index 093e0dfcc..4ca27f0ad 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -7200,6 +7200,35 @@ } } }, + "/installation/language/config": { + "get": { + "description": "get installation language config mapping", + "produces": [ + "application/json" + ], + "tags": [ + "Lang" + ], + "summary": "get installation language config mapping", + "parameters": [ + { + "type": "string", + "description": "installation language", + "name": "lang", + "in": "query", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/handler.RespBody" + } + } + } + } + }, "/installation/language/options": { "get": { "description": "get installation language options", diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 6d96c8a17..b9c36562d 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -7239,6 +7239,25 @@ paths: summary: init environment tags: - installation + /installation/language/config: + get: + description: get installation language config mapping + parameters: + - description: installation language + in: query + name: lang + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/handler.RespBody' + summary: get installation language config mapping + tags: + - Lang /installation/language/options: get: description: get installation language options diff --git a/internal/install/install_controller.go b/internal/install/install_controller.go index 7f57efbf1..0a1165693 100644 --- a/internal/install/install_controller.go +++ b/internal/install/install_controller.go @@ -20,6 +20,7 @@ package install import ( + "encoding/json" "net/http" "os" "path/filepath" @@ -37,6 +38,7 @@ import ( "github.com/gin-gonic/gin" "github.com/jinzhu/copier" "github.com/segmentfault/pacman/errors" + "github.com/segmentfault/pacman/i18n" "github.com/segmentfault/pacman/log" ) @@ -51,6 +53,27 @@ func LangOptions(ctx *gin.Context) { handler.HandleResponse(ctx, nil, translator.LanguageOptions) } +// GetLangMapping get installation language config mapping +// @Summary get installation language config mapping +// @Description get installation language config mapping +// @Tags Lang +// @Param lang query string true "installation language" +// @Produce json +// @Success 200 {object} handler.RespBody{} +// @Router /installation/language/config [get] +func GetLangMapping(ctx *gin.Context) { + t, err := translator.NewTranslator(&translator.I18n{BundleDir: cli.I18nPath}) + if err != nil { + handler.HandleResponse(ctx, err, nil) + return + } + lang := ctx.Query("lang") + trData, _ := t.Dump(i18n.Language(lang)) + var resp map[string]any + _ = json.Unmarshal(trData, &resp) + handler.HandleResponse(ctx, nil, resp) +} + // CheckConfigFileAndRedirectToInstallPage if config file not exist try to redirect to install page // @Summary if config file not exist try to redirect to install page // @Description if config file not exist try to redirect to install page diff --git a/internal/install/install_server.go b/internal/install/install_server.go index f6087fea6..76a2fffe3 100644 --- a/internal/install/install_server.go +++ b/internal/install/install_server.go @@ -64,6 +64,7 @@ func NewInstallHTTPServer() *gin.Engine { installApi.GET(c.UI.BaseURL+"/", CheckConfigFileAndRedirectToInstallPage) installApi.GET(c.UI.BaseURL+"/install", WebPage) installApi.GET(c.UI.BaseURL+"/50x", WebPage) + installApi.GET("/installation/language/config", GetLangMapping) installApi.GET("/installation/language/options", LangOptions) installApi.POST("/installation/db/check", CheckDatabase) installApi.POST("/installation/config-file/check", CheckConfigFile) diff --git a/ui/src/i18n/init.ts b/ui/src/i18n/init.ts index 861889003..919335cba 100644 --- a/ui/src/i18n/init.ts +++ b/ui/src/i18n/init.ts @@ -21,7 +21,6 @@ import { initReactI18next } from 'react-i18next'; import i18next from 'i18next'; import en_US from '@i18n/en_US.yaml'; -// import zh_CN from '@i18n/zh_CN.yaml'; import { DEFAULT_LANG, LANG_RESOURCE_STORAGE_KEY } from '@/common/constants'; import Storage from '@/utils/storage'; @@ -34,9 +33,6 @@ const initResources = { en_US: { translation: en_US.ui, }, - // zh_CN: { - // translation: zh_CN.ui, - // }, }; const storageLang = Storage.get(LANG_RESOURCE_STORAGE_KEY); diff --git a/ui/src/pages/Install/components/FirstStep/index.tsx b/ui/src/pages/Install/components/FirstStep/index.tsx index 3f3f423f2..cb79fdfb8 100644 --- a/ui/src/pages/Install/components/FirstStep/index.tsx +++ b/ui/src/pages/Install/components/FirstStep/index.tsx @@ -24,6 +24,7 @@ import { useTranslation } from 'react-i18next'; import type { LangsType, FormValue, FormDataType } from '@/common/interface'; import Progress from '../Progress'; import { getInstallLangOptions } from '@/services'; +import { setupInstallLanguage } from '@/utils/localize'; interface Props { data: FormValue; @@ -65,6 +66,7 @@ const Index: FC = ({ visible, data, changeCallback, nextCallback }) => { value={data.value} isInvalid={data.isInvalid} onChange={(e) => { + setupInstallLanguage(e.target.value); changeCallback({ lang: { value: e.target.value, diff --git a/ui/src/pages/Install/index.tsx b/ui/src/pages/Install/index.tsx index 5c8f5c842..4b43889ad 100644 --- a/ui/src/pages/Install/index.tsx +++ b/ui/src/pages/Install/index.tsx @@ -37,6 +37,7 @@ import { } from '@/utils'; import { CURRENT_LANG_STORAGE_KEY } from '@/common/constants'; import { BASE_ORIGIN } from '@/router/alias'; +import { setupInstallLanguage } from '@/utils/localize'; import { FirstStep, @@ -293,6 +294,7 @@ const Index: FC = () => { useEffect(() => { configYmlCheck(); + setupInstallLanguage(Storage.get(CURRENT_LANG_STORAGE_KEY)); }, []); if (loading) { diff --git a/ui/src/services/install/index.ts b/ui/src/services/install/index.ts index 70e581a29..47ae75faa 100644 --- a/ui/src/services/install/index.ts +++ b/ui/src/services/install/index.ts @@ -38,3 +38,7 @@ export const installBaseInfo = (params) => { export const getInstallLangOptions = () => { return request.get('/installation/language/options'); }; + +export const getInstallLanguageConfig = (lang: string) => { + return request.get(`/installation/language/config?lang=${lang}`); +}; diff --git a/ui/src/utils/localize.ts b/ui/src/utils/localize.ts index eea132a84..0b45a2222 100644 --- a/ui/src/utils/localize.ts +++ b/ui/src/utils/localize.ts @@ -35,6 +35,7 @@ import { } from '@/common/constants'; import { getAdminLanguageOptions, + getInstallLanguageConfig, getLanguageConfig, getLanguageOptions, } from '@/services'; @@ -61,6 +62,15 @@ export const loadLanguageOptions = async (forAdmin = false) => { }; const pullLanguageConf = (res) => { + if (window.location.pathname === '/install') { + return getInstallLanguageConfig(res.lng).then((langConf) => { + if (langConf && langConf.ui) { + res.resources = langConf.ui; + Storage.set(LANG_RESOURCE_STORAGE_KEY, res); + } + }); + } + return getLanguageConfig().then((langConf) => { if (langConf && langConf.ui) { res.resources = langConf.ui; @@ -68,6 +78,7 @@ const pullLanguageConf = (res) => { } }); }; + const addI18nResource = async (langName) => { const res = { lng: langName, resources: undefined }; const storageResource = Storage.get(LANG_RESOURCE_STORAGE_KEY); @@ -149,3 +160,9 @@ export const setupAppTheme = () => { const theme = getCurrentTheme(); changeTheme(theme); }; + +export const setupInstallLanguage = async (lang) => { + await addI18nResource(lang); + localeDayjs(lang); + i18next.changeLanguage(lang); +};