mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-22 01:20:12 +01:00
🎨 多语言配置缺失项使用对应英文配置项补齐 https://github.com/siyuan-note/siyuan/issues/5322
This commit is contained in:
parent
ca6a5a0241
commit
5a31952239
3 changed files with 64 additions and 20 deletions
|
|
@ -60,7 +60,7 @@
|
||||||
"netImg2LocalAsset": "Convertir imágenes de red en imágenes locales",
|
"netImg2LocalAsset": "Convertir imágenes de red en imágenes locales",
|
||||||
"releaseDate": "Fecha de lanzamiento",
|
"releaseDate": "Fecha de lanzamiento",
|
||||||
"pkgSize": "Tamaño del paquete",
|
"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",
|
"dragPosition": "Arrastrar imagen para reposicionarla",
|
||||||
"exportPDF0": "Tamaño de la página",
|
"exportPDF0": "Tamaño de la página",
|
||||||
"exportPDF1": "Página apaisada",
|
"exportPDF1": "Página apaisada",
|
||||||
|
|
@ -83,7 +83,7 @@
|
||||||
"uninstallTip": "Actualmente en uso, es necesario cambiar antes de desinstalar",
|
"uninstallTip": "Actualmente en uso, es necesario cambiar antes de desinstalar",
|
||||||
"safeQuit": "Salir de la aplicación",
|
"safeQuit": "Salir de la aplicación",
|
||||||
"anchor": "Anclaje",
|
"anchor": "Anclaje",
|
||||||
"mostrarMás": "Mostrar más",
|
"showMore": "Mostrar más",
|
||||||
"refPopover": "Abrir el bloque de ref mediante popover",
|
"refPopover": "Abrir el bloque de ref mediante popover",
|
||||||
"refRight": "Abrir el bloque de ref a la derecha",
|
"refRight": "Abrir el bloque de ref a la derecha",
|
||||||
"refBottom": "Abrir el bloque de ref en la parte inferior",
|
"refBottom": "Abrir el bloque de ref en la parte inferior",
|
||||||
|
|
@ -265,7 +265,7 @@
|
||||||
"moveToDown": "Desplazar abajo",
|
"moveToDown": "Desplazar abajo",
|
||||||
"moveToLeft": "Mover a la izquierda",
|
"moveToLeft": "Mover a la izquierda",
|
||||||
"moveToRight": "Mover a la derecha",
|
"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",
|
"uploadAssets2CDN": "Subir archivos de activos a la nube",
|
||||||
"notSupport1": "No admite la función de arrastrar y soltar en los cuadernos",
|
"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",
|
"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",
|
"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",
|
"insertAfter": "Inserta un bloque vacío después del bloque donde se encuentra el cursor",
|
||||||
"list1": "Lista",
|
"list1": "Lista",
|
||||||
"insertar": "Insertar elemento",
|
"insert": "Insertar elemento",
|
||||||
"closeTab": "Cerrar pestaña actual",
|
"closeTab": "Cerrar pestaña actual",
|
||||||
"keymap": "Mapa de teclas",
|
"keymap": "Mapa de teclas",
|
||||||
"clearFontStyle": "Limpiar estilo",
|
"clearFontStyle": "Limpiar estilo",
|
||||||
|
|
@ -379,14 +379,14 @@
|
||||||
"newNameFile": "El nombre del nuevo documento es",
|
"newNameFile": "El nombre del nuevo documento es",
|
||||||
"newContentFile": "El contenido del nuevo documento es",
|
"newContentFile": "El contenido del nuevo documento es",
|
||||||
"exporting": "Exportando, por favor espere...",
|
"exporting": "Exportando, por favor espere...",
|
||||||
"exportado": "Exportación completada: ",
|
"exported": "Exportación completada: ",
|
||||||
"refExpired": "El bloque de contenido de búsqueda no existe",
|
"refExpired": "El bloque de contenido de búsqueda no existe",
|
||||||
"emptyContent": "No hay contenido relacionado",
|
"emptyContent": "No hay contenido relacionado",
|
||||||
"useBrowserView": "Ver en el navegador",
|
"useBrowserView": "Ver en el navegador",
|
||||||
"userLocalPDF": "Abrir con la herramienta local de PDF",
|
"userLocalPDF": "Abrir con la herramienta local de PDF",
|
||||||
"copyID": "ID de copia",
|
"copyID": "ID de copia",
|
||||||
"newBookmark": "Crear una etiqueta de marcador",
|
"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",
|
"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",
|
"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",
|
"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?",
|
"account3Tip": "La copia de seguridad local sobrescribirá la copia de seguridad en la nube. ¿Quieres subirla?",
|
||||||
"account1": "Haga clic para pagar",
|
"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>",
|
"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",
|
"account3": "Suscripción de prueba",
|
||||||
"cuenta4": "El precio de renovación se mantiene de por vida",
|
"account4": "El precio de renovación se mantiene de por vida",
|
||||||
"account6": "Restante antes de que caduque la suscripción",
|
"account6": "Restante antes de que caduque la suscripción",
|
||||||
"account7": "Más funciones avanzadas",
|
"account7": "Más funciones avanzadas",
|
||||||
"account8": "",
|
"account8": "",
|
||||||
"cuenta10": "Suscripción anual",
|
"account10": "Suscripción anual",
|
||||||
"cuenta11": "Hasta que finalice el descuento por pronto pago",
|
"account11": "Hasta que finalice el descuento por pronto pago",
|
||||||
"cuenta12": "Compañero de vida",
|
"account12": "Compañero de vida",
|
||||||
"clickMeToRenew": "<a href=\"https://ld246.com/subscribe/siyuan\" target=\"_blank\">Ir a la renovación</a>",
|
"clickMeToRenew": "<a href=\"https://ld246.com/subscribe/siyuan\" target=\"_blank\">Ir a la renovación</a>",
|
||||||
"priceAnnual": "$72",
|
"priceAnnual": "$72",
|
||||||
"year": "año",
|
"year": "año",
|
||||||
|
|
@ -514,9 +514,9 @@
|
||||||
"appearance6": "El diseño de la ventana se restablecerá al estado inicial después del reinicio",
|
"appearance6": "El diseño de la ventana se restablecerá al estado inicial después del reinicio",
|
||||||
"appearance9": "Abrir carpeta de temas",
|
"appearance9": "Abrir carpeta de temas",
|
||||||
"appearance8": "Abrir carpeta de iconos",
|
"appearance8": "Abrir carpeta de iconos",
|
||||||
"apariencia7": "Cambiar automáticamente con la salida y la puesta del sol",
|
"appearance7": "Cambiar automáticamente con la salida y la puesta del sol",
|
||||||
"apariencia5": "Seleccionar el modo de la interfaz de usuario",
|
"appearance5": "Seleccionar el modo de la interfaz de usuario",
|
||||||
"apariencia4": "Modo",
|
"appearance4": "Modo",
|
||||||
"appearance3": "Seleccionar el tema de resaltado de sintaxis utilizado en el modo oscuro",
|
"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",
|
"appearance2": "Selecciona el tema de resaltado de sintaxis utilizado en el modo claro",
|
||||||
"appearance1": "Tema del bloque de código",
|
"appearance1": "Tema del bloque de código",
|
||||||
|
|
@ -635,7 +635,7 @@
|
||||||
"mount": "Abrir cuaderno de notas",
|
"mount": "Abrir cuaderno de notas",
|
||||||
"newNotebook": "Nuevo cuaderno de notas",
|
"newNotebook": "Nuevo cuaderno de notas",
|
||||||
"fileNameRule": "No se permite /",
|
"fileNameRule": "No se permite /",
|
||||||
"eslogan": "Construye tu jardín digital eterno",
|
"slogan": "Construye tu jardín digital eterno",
|
||||||
"showInFolder": "Mostrar en la carpeta",
|
"showInFolder": "Mostrar en la carpeta",
|
||||||
"search": "Buscar",
|
"search": "Buscar",
|
||||||
"config": "Ajustes",
|
"config": "Ajustes",
|
||||||
|
|
|
||||||
|
|
@ -122,11 +122,55 @@ func serveAppearance(ginServer *gin.Engine) {
|
||||||
}
|
}
|
||||||
siyuan.GET("/appearance/*filepath", func(c *gin.Context) {
|
siyuan.GET("/appearance/*filepath", func(c *gin.Context) {
|
||||||
filePath := filepath.Join(appearancePath, strings.TrimPrefix(c.Request.URL.Path, "/appearance/"))
|
filePath := filepath.Join(appearancePath, strings.TrimPrefix(c.Request.URL.Path, "/appearance/"))
|
||||||
if strings.HasSuffix(c.Request.URL.Path, "/theme.js") && !gulu.File.IsExist(filePath) {
|
if strings.HasSuffix(c.Request.URL.Path, "/theme.js") {
|
||||||
// 主题 js 不存在时生成空内容返回
|
if !gulu.File.IsExist(filePath) {
|
||||||
c.Data(200, "application/x-javascript", nil)
|
// 主题 js 不存在时生成空内容返回
|
||||||
return
|
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)
|
c.File(filePath)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ func Boot() {
|
||||||
readOnly := flag.Bool("readonly", false, "read-only mode")
|
readOnly := flag.Bool("readonly", false, "read-only mode")
|
||||||
accessAuthCode := flag.String("accessAuthCode", "", "access auth code")
|
accessAuthCode := flag.String("accessAuthCode", "", "access auth code")
|
||||||
ssl := flag.Bool("ssl", false, "for https and wss")
|
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")
|
mode := flag.String("mode", "prod", "dev/prod")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue