mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-09-22 00:20:47 +02: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",
|
||||
"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",
|
||||
|
|
|
@ -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)
|
||||
})
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue