Markdown으로 작성된 번역을 Rails I18n에서 지원하기 위한 핵심은 두 가지 주요 구성 요소를 패치하는 것입니다. 첫째, I18n translate
메서드를 확장해야 합니다. 이는 config/initializers/markdown.rb
파일에 Markdown::I18nBackendExt
모듈을 정의하고, ActiveSupport.on_load(:i18n)
블록 내에서 I18n.backend.class
에 prepend
함으로써 이루어집니다. 이 모듈은 translate
메서드를 오버라이드하여 번역 키가 _md
로 끝나는지 확인하고, 해당 문자열이 Markdown 형식일 경우 Markdown.convert
또는 Markdown.inline
메서드를 호출하여 HTML로 변환합니다. 이때, 번역 문자열에 줄바꿈(\n
)이 포함되어 있는지 여부에 따라 블록 또는 인라인 Markdown으로 변환하는 로직이 적용됩니다. 흥미로운 점은 Rails가 누락된 번역을 감지하기 위해 특정 마법 숫자(-(2**60)
)를 사용하는 방식에 대한 설명도 포함되어 있습니다.
둘째, Rails의 HTML Safe 동작을 패치하여 _md
접미사를 가진 번역 문자열도 HTML 안전하다고 인식하도록 해야 합니다. 이는 Markdown::HtmlSafeTranslationExt
모듈을 정의하고 ActiveSupport::HtmlSafeTranslation
에 prepend
함으로써 구현됩니다. 이 모듈은 html_safe_translation_key?
메서드를 확장하여 key.to_s.end_with?("_md")
조건이 참일 경우 해당 키를 HTML 안전한 것으로 간주하도록 합니다.
Markdown 변환을 위해서는 Kramdown
라이브러리를 활용합니다. Markdown.convert
및 Markdown.inline
메서드는 Kramdown을 사용하여 입력된 Markdown 텍스트를 HTML로 변환합니다. 특히 Kramdown::Parser::Inline
클래스를 커스터마이징하여 블록 레벨 요소(예: <p>
) 없이 순수하게 인라인 HTML을 생성하는 방법을 제시합니다. 이는 번역된 문구가 단락이 아닌 짧은 구문일 때 유용합니다.
본문에서는 직접적인 패치 방식 외에 I18n::Transformers
Gem과 같은 대안도 언급하지만, HTML 안전성 관련 패치는 여전히 필요하며, XSS(Cross-Site Scripting) 공격 가능성에 대한 면밀한 검토와 안전한 구현이 항상 중요하다고 강조합니다.