diff --git a/handlers/helpers.go b/handlers/helpers.go index 6ecb537..0a9d4c3 100644 --- a/handlers/helpers.go +++ b/handlers/helpers.go @@ -21,6 +21,8 @@ func DefaultData(c *gin.Context) gin.H { siteLogoIsURL, _ := c.Get("site_logo_is_url") siteLogoText, _ := c.Get("site_logo_text") siteHeaderText, _ := c.Get("site_header_text") + siteHomeWelcome, _ := c.Get("site_home_welcome") + siteHomeSubtitle, _ := c.Get("site_home_subtitle") siteFooterText, _ := c.Get("site_footer_text") return gin.H{ @@ -37,6 +39,8 @@ func DefaultData(c *gin.Context) gin.H { "SiteLogoIsURL": siteLogoIsURL, "SiteLogoText": siteLogoText, "SiteHeaderText": siteHeaderText, + "SiteHomeWelcome": siteHomeWelcome, + "SiteHomeSubtitle": siteHomeSubtitle, "SiteFooterText": siteFooterText, } } diff --git a/handlers/settings.go b/handlers/settings.go index 1ce7ece..dc44bdb 100644 --- a/handlers/settings.go +++ b/handlers/settings.go @@ -59,6 +59,9 @@ func SiteSettingsPage(db *gorm.DB) gin.HandlerFunc { data := DefaultData(c) data["Title"] = tr["settings_site_title"] data["Site"] = s + // Pre-compute derived values so the template never invokes methods on + // an interface{}-wrapped struct (which Go templates cannot resolve). + data["SiteLogoIsURL"] = s.LogoIsURL() if msg := c.Query("saved"); msg == "1" { data["Success"] = tr["settings_saved"] } @@ -78,6 +81,10 @@ func SiteSettingsSave(db *gorm.DB, storagePath string) gin.HandlerFunc { s.LogoTextEn = strings.TrimSpace(c.PostForm("logo_text_en")) s.HeaderTextZh = strings.TrimSpace(c.PostForm("header_text_zh")) s.HeaderTextEn = strings.TrimSpace(c.PostForm("header_text_en")) + s.HomeWelcomeZh = strings.TrimSpace(c.PostForm("home_welcome_zh")) + s.HomeWelcomeEn = strings.TrimSpace(c.PostForm("home_welcome_en")) + s.HomeSubtitleZh = strings.TrimSpace(c.PostForm("home_subtitle_zh")) + s.HomeSubtitleEn = strings.TrimSpace(c.PostForm("home_subtitle_en")) s.FooterTextZh = strings.TrimSpace(c.PostForm("footer_text_zh")) s.FooterTextEn = strings.TrimSpace(c.PostForm("footer_text_en")) s.UpdatedBy = userIDFromSession(c) diff --git a/i18n/i18n.go b/i18n/i18n.go index fa52f12..bf04224 100644 --- a/i18n/i18n.go +++ b/i18n/i18n.go @@ -150,6 +150,10 @@ var translations = map[Lang]map[string]string{ "settings_logo_text_en": "Site Title (English)", "settings_header_text_zh": "Header Banner Text (Chinese)", "settings_header_text_en": "Header Banner Text (English)", + "settings_home_welcome_zh": "Home Welcome Heading (Chinese)", + "settings_home_welcome_en": "Home Welcome Heading (English)", + "settings_home_subtitle_zh": "Home Subtitle (Chinese)", + "settings_home_subtitle_en": "Home Subtitle (English)", "settings_footer_text_zh": "Footer Text (Chinese)", "settings_footer_text_en": "Footer Text (English)", "settings_leave_blank": "Leave blank to use the built-in default.", @@ -318,6 +322,10 @@ var translations = map[Lang]map[string]string{ "settings_logo_text_en": "站点标题(英文)", "settings_header_text_zh": "顶部横幅文本(中文)", "settings_header_text_en": "顶部横幅文本(英文)", + "settings_home_welcome_zh": "主页欢迎标题(中文)", + "settings_home_welcome_en": "主页欢迎标题(英文)", + "settings_home_subtitle_zh": "主页副标题(中文)", + "settings_home_subtitle_en": "主页副标题(英文)", "settings_footer_text_zh": "页脚文本(中文)", "settings_footer_text_en": "页脚文本(英文)", "settings_leave_blank": "留空则使用内置默认值。", diff --git a/middleware/auth.go b/middleware/auth.go index f3a92ed..3d229dc 100644 --- a/middleware/auth.go +++ b/middleware/auth.go @@ -103,6 +103,8 @@ func SetUserContext(db *gorm.DB) gin.HandlerFunc { c.Set("site_logo_is_url", site.LogoIsURL()) c.Set("site_logo_text", site.LogoText(string(lang))) c.Set("site_header_text", site.HeaderText(string(lang))) + c.Set("site_home_welcome", site.HomeWelcome(string(lang))) + c.Set("site_home_subtitle", site.HomeSubtitle(string(lang))) c.Set("site_footer_text", site.FooterText(string(lang))) c.Next() diff --git a/models/site_setting.go b/models/site_setting.go index 58c624c..7debc34 100644 --- a/models/site_setting.go +++ b/models/site_setting.go @@ -10,10 +10,14 @@ type SiteSetting struct { Logo string `gorm:"size:512" json:"logo"` // local filename (served under /uploads/logos) OR a full URL LogoTextZh string `gorm:"size:255" json:"logo_text_zh"` // top-left title (zh) LogoTextEn string `gorm:"size:255" json:"logo_text_en"` // top-left title (en) - HeaderTextZh string `gorm:"size:512" json:"header_text_zh"` // header banner text (zh) - HeaderTextEn string `gorm:"size:512" json:"header_text_en"` // header banner text (en) - FooterTextZh string `gorm:"size:512" json:"footer_text_zh"` // footer text (zh) - FooterTextEn string `gorm:"size:512" json:"footer_text_en"` // footer text (en) + HeaderTextZh string `gorm:"size:512" json:"header_text_zh"` // header banner text (zh) + HeaderTextEn string `gorm:"size:512" json:"header_text_en"` // header banner text (en) + HomeWelcomeZh string `gorm:"size:255" json:"home_welcome_zh"` // home page welcome heading (zh) + HomeWelcomeEn string `gorm:"size:255" json:"home_welcome_en"` // home page welcome heading (en) + HomeSubtitleZh string `gorm:"size:512" json:"home_subtitle_zh"` // home page subtitle (zh) + HomeSubtitleEn string `gorm:"size:512" json:"home_subtitle_en"` // home page subtitle (en) + FooterTextZh string `gorm:"size:512" json:"footer_text_zh"` // footer text (zh) + FooterTextEn string `gorm:"size:512" json:"footer_text_en"` // footer text (en) UpdatedBy uint `gorm:"index" json:"updated_by"` UpdatedAt time.Time `json:"updated_at"` } @@ -62,6 +66,36 @@ func (s *SiteSetting) HeaderText(lang string) string { return s.HeaderTextZh } +// HomeWelcome returns the home page welcome heading for the given language, +// falling back to the other language when the requested one is empty. +func (s *SiteSetting) HomeWelcome(lang string) string { + if lang == "zh" { + if s.HomeWelcomeZh != "" { + return s.HomeWelcomeZh + } + return s.HomeWelcomeEn + } + if s.HomeWelcomeEn != "" { + return s.HomeWelcomeEn + } + return s.HomeWelcomeZh +} + +// HomeSubtitle returns the home page subtitle for the given language, +// falling back to the other language when the requested one is empty. +func (s *SiteSetting) HomeSubtitle(lang string) string { + if lang == "zh" { + if s.HomeSubtitleZh != "" { + return s.HomeSubtitleZh + } + return s.HomeSubtitleEn + } + if s.HomeSubtitleEn != "" { + return s.HomeSubtitleEn + } + return s.HomeSubtitleZh +} + // FooterText returns the footer text for the given language code, falling // back to the other language when the requested one is empty. func (s *SiteSetting) FooterText(lang string) string { diff --git a/templates/admin/settings_site.html b/templates/admin/settings_site.html index e844745..8051d4e 100644 --- a/templates/admin/settings_site.html +++ b/templates/admin/settings_site.html @@ -19,14 +19,14 @@
- {{index .Tr "home_subtitle"}} + {{if .SiteHomeSubtitle}}{{.SiteHomeSubtitle}}{{else}}{{index .Tr "home_subtitle"}}{{end}}