피드로 돌아가기
Our Go CMS now speaks 5 languages, themes itself, and meditates on 404s
Dev.toDev.to
Backend

ForgeCMS가 SML 기반 언어 해석, 테마 시스템, OG 메타태그, Amiga 스타일 에러 페이지를 추가하여 프로토타입에서 본격적인 제품으로 전환

Our Go CMS now speaks 5 languages, themes itself, and meditates on 404s

Art2026년 3월 28일3intermediate

Context

Go 기반 CMS는 데이터베이스 없이 Codeberg 저장소에서 콘텐츠를 가져와 €1/월 VPS에서 제공하고 있었으나, 다국어 지원, 테마 관리, 소셜 미디어 공유 메타데이터 등이 미흡한 상태였다.

Technical Solution

  • Accept-Language 헤더 감지와 lang 쿠키 기반 언어 선택: 스페인 바르셀로나 방문자는 자동으로 스페인어 페이지, 카탈루냐는 카탈란어 페이지 로드
  • 언어별 SML 페이지 폴백 체인 구현: atesti/es/index.sml → atesti/index.sml 구조로 자동 폴백
  • Page{lang:} 선언을 통한 페이지별 언어 오버라이드 지원
  • Markdown{src:} 문법으로 현재 언어를 소스 경로에 주입: content.md가 Spanish 방문자에겐 content-es.md로 자동 변환
  • theme.sml과 theme-dark.sml 두 파일로 사이트 색상, 간격, 타이포그래피를 중앙 집중식 관리
  • og:title, og:description, og:url, og:image 메타태그 자동 생성
  • Image{src:}에서 상대 경로를 Codeberg 원본 URL로 자동 변환
  • ETagFor() 함수로 자산 캐시 핑거프린팅 구현
  • Codeberg 도달 불가 시 마지막 유효한 캐시 콘텐츠 제공
  • ErrNotFound 센티넬 타입으로 오류 전파 구조 표준화
  • 404, 500 에러 페이지를 Amiga Guru Meditation 스타일로 렌더링
  • site.sml의 Menu{}, Footer{} 정의를 전체 사이트에서 자동 렌더링

Key Takeaway

저수준 프레임워크 의존성 없이 SML 선언형 시스템으로 다국어, 테마, 메타데이터를 구현하면 프로토타입을 프로덕션 제품으로 전환할 수 있으며, 선언적 설계가 하드코딩된 값 산재를 방지하고 운영 복잡성을 낮춘다.


정적 콘텐츠 기반 소규모 CMS 또는 문서 서버를 구축하는 팀에서 go-i18n 같은 무거운 다국어 라이브러리 대신 HTTP Accept-Language 헤더와 디렉토리 폴백 체인(lang/locale/default)으로 언어 선택을 구현하면 JavaScript 의존성 없이 자동 언어 감지를 제공할 수 있다.

원문 읽기