🎨 多语言配置缺失项使用对应英文配置项补齐 https://github.com/siyuan-note/siyuan/issues/5322

This commit is contained in:
Liang Ding 2022-06-30 10:16:33 +08:00
parent ca6a5a0241
commit 5a31952239
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
3 changed files with 64 additions and 20 deletions

View file

@ -60,7 +60,7 @@
"netImg2LocalAsset": "Convertir imágenes de red en imágenes locales",
"releaseDate": "Fecha de lanzamiento",
"pkgSize": "Tamaño del paquete",
"spaceInZE": "Insertar un espacio entre el chino y el occidental",
"optimizeTypography": "Insertar un espacio entre el chino y el occidental",
"dragPosition": "Arrastrar imagen para reposicionarla",
"exportPDF0": "Tamaño de la página",
"exportPDF1": "Página apaisada",
@ -83,7 +83,7 @@
"uninstallTip": "Actualmente en uso, es necesario cambiar antes de desinstalar",
"safeQuit": "Salir de la aplicación",
"anchor": "Anclaje",
"mostrarMás": "Mostrar más",
"showMore": "Mostrar más",
"refPopover": "Abrir el bloque de ref mediante popover",
"refRight": "Abrir el bloque de ref a la derecha",
"refBottom": "Abrir el bloque de ref en la parte inferior",
@ -265,7 +265,7 @@
"moveToDown": "Desplazar abajo",
"moveToLeft": "Mover a la izquierda",
"moveToRight": "Mover a la derecha",
"copyProtocolo": "Copiar hipervínculo de bloque",
"copyProtocol": "Copiar hipervínculo de bloque",
"uploadAssets2CDN": "Subir archivos de activos a la nube",
"notSupport1": "No admite la función de arrastrar y soltar en los cuadernos",
"keymapTip": "Después de modificar algunas teclas de acceso directo, es necesario hacer clic en el botón de actualización para que surta efecto",
@ -347,7 +347,7 @@
"insertBefore": "Inserta un bloque vacío antes del bloque donde está el cursor",
"insertAfter": "Inserta un bloque vacío después del bloque donde se encuentra el cursor",
"list1": "Lista",
"insertar": "Insertar elemento",
"insert": "Insertar elemento",
"closeTab": "Cerrar pestaña actual",
"keymap": "Mapa de teclas",
"clearFontStyle": "Limpiar estilo",
@ -379,14 +379,14 @@
"newNameFile": "El nombre del nuevo documento es",
"newContentFile": "El contenido del nuevo documento es",
"exporting": "Exportando, por favor espere...",
"exportado": "Exportación completada: ",
"exported": "Exportación completada: ",
"refExpired": "El bloque de contenido de búsqueda no existe",
"emptyContent": "No hay contenido relacionado",
"useBrowserView": "Ver en el navegador",
"userLocalPDF": "Abrir con la herramienta local de PDF",
"copyID": "ID de copia",
"newBookmark": "Crear una etiqueta de marcador",
"generarHistoria": "Intervalo de Generación de Historial (minutos, poner a 0 para desactivar)",
"generateHistory": "Intervalo de Generación de Historial (minutos, poner a 0 para desactivar)",
"generateHistoryInterval": "El historial se genera automáticamente cuando se edita o se borra, y se puede ver y retroceder en el historial de datos",
"historyRetentionDays": "Días de retención del historial",
"historyRetentionDaysTip": "Los datos históricos que superen los días de retención se eliminarán automática y completamente",
@ -483,14 +483,14 @@
"account3Tip": "La copia de seguridad local sobrescribirá la copia de seguridad en la nube. ¿Quieres subirla?",
"account1": "Haga clic para pagar",
"account2": "<div>Sincronización de datos cifrada de extremo a extremo</div><div>Copia de seguridad de datos cifrada de extremo a extremo</div><div>Activos en la nube que sirven</div>",
"cuenta3": "Suscripción de prueba",
"cuenta4": "El precio de renovación se mantiene de por vida",
"account3": "Suscripción de prueba",
"account4": "El precio de renovación se mantiene de por vida",
"account6": "Restante antes de que caduque la suscripción",
"account7": "Más funciones avanzadas",
"account8": "",
"cuenta10": "Suscripción anual",
"cuenta11": "Hasta que finalice el descuento por pronto pago",
"cuenta12": "Compañero de vida",
"account10": "Suscripción anual",
"account11": "Hasta que finalice el descuento por pronto pago",
"account12": "Compañero de vida",
"clickMeToRenew": "<a href=\"https://ld246.com/subscribe/siyuan\" target=\"_blank\">Ir a la renovación</a>",
"priceAnnual": "$72",
"year": "año",
@ -514,9 +514,9 @@
"appearance6": "El diseño de la ventana se restablecerá al estado inicial después del reinicio",
"appearance9": "Abrir carpeta de temas",
"appearance8": "Abrir carpeta de iconos",
"apariencia7": "Cambiar automáticamente con la salida y la puesta del sol",
"apariencia5": "Seleccionar el modo de la interfaz de usuario",
"apariencia4": "Modo",
"appearance7": "Cambiar automáticamente con la salida y la puesta del sol",
"appearance5": "Seleccionar el modo de la interfaz de usuario",
"appearance4": "Modo",
"appearance3": "Seleccionar el tema de resaltado de sintaxis utilizado en el modo oscuro",
"appearance2": "Selecciona el tema de resaltado de sintaxis utilizado en el modo claro",
"appearance1": "Tema del bloque de código",
@ -635,7 +635,7 @@
"mount": "Abrir cuaderno de notas",
"newNotebook": "Nuevo cuaderno de notas",
"fileNameRule": "No se permite /",
"eslogan": "Construye tu jardín digital eterno",
"slogan": "Construye tu jardín digital eterno",
"showInFolder": "Mostrar en la carpeta",
"search": "Buscar",
"config": "Ajustes",

View file

@ -122,11 +122,55 @@ func serveAppearance(ginServer *gin.Engine) {
}
siyuan.GET("/appearance/*filepath", func(c *gin.Context) {
filePath := filepath.Join(appearancePath, strings.TrimPrefix(c.Request.URL.Path, "/appearance/"))
if strings.HasSuffix(c.Request.URL.Path, "/theme.js") && !gulu.File.IsExist(filePath) {
// 主题 js 不存在时生成空内容返回
c.Data(200, "application/x-javascript", nil)
return
if strings.HasSuffix(c.Request.URL.Path, "/theme.js") {
if !gulu.File.IsExist(filePath) {
// 主题 js 不存在时生成空内容返回
c.Data(200, "application/x-javascript", nil)
return
}
} else if strings.Contains(c.Request.URL.Path, "/langs/") && strings.HasSuffix(c.Request.URL.Path, ".json") {
lang := path.Base(c.Request.URL.Path)
lang = strings.TrimSuffix(lang, ".json")
if "zh_CN" != lang && "en_US" != lang {
// 多语言配置缺失项使用对应英文配置项补齐 https://github.com/siyuan-note/siyuan/issues/5322
enUSFilePath := filepath.Join(appearancePath, "langs", "en_US.json")
enUSData, err := os.ReadFile(enUSFilePath)
if nil != err {
util.LogFatalf("read en_US.json [%s] failed: %s", enUSFilePath, err)
return
}
enUSMap := map[string]interface{}{}
if err = gulu.JSON.UnmarshalJSON(enUSData, &enUSMap); nil != err {
util.LogFatalf("unmarshal en_US.json [%s] failed: %s", enUSFilePath, err)
return
}
for {
data, err := os.ReadFile(filePath)
if nil != err {
c.JSON(200, enUSMap)
return
}
langMap := map[string]interface{}{}
if err = gulu.JSON.UnmarshalJSON(data, &langMap); nil != err {
util.LogErrorf("unmarshal json [%s] failed: %s", filePath, err)
c.JSON(200, enUSMap)
return
}
for enUSDataKey, enUSDataValue := range enUSMap {
if _, ok := langMap[enUSDataKey]; !ok {
langMap[enUSDataKey] = enUSDataValue
}
}
c.JSON(200, langMap)
return
}
}
}
c.File(filePath)
})

View file

@ -64,7 +64,7 @@ func Boot() {
readOnly := flag.Bool("readonly", false, "read-only mode")
accessAuthCode := flag.String("accessAuthCode", "", "access auth code")
ssl := flag.Bool("ssl", false, "for https and wss")
lang := flag.String("lang", "en_US", "zh_CN/zh_CHT/en_US/fr_FR")
lang := flag.String("lang", "en_US", "zh_CN/zh_CHT/en_US/fr_FR/es_ES")
mode := flag.String("mode", "prod", "dev/prod")
flag.Parse()