Rails I18n에 Markdown 변환 기능 추가: _md 접미사 커스터마이징

How to customize Rails I18n key suffixes like `_md` for Markdown

작성자
발행일
2025년 07월 16일

핵심 요약

  • 1 Rails I18n에 `_md` 접미사를 추가하여 마크다운 번역을 HTML로 자동 변환하고 HTML 안전성을 확보하는 방법을 제시합니다.
  • 2 `I18n.backend.class`와 `ActiveSupport::HtmlSafeTranslation`에 패치를 적용하여 마크다운 변환 및 HTML 안전성 검사를 확장합니다.
  • 3 Kramdown 라이브러리를 활용하여 마크다운을 HTML로 변환하며, 인라인 마크다운 처리를 위한 커스텀 파서도 구현합니다.

도입

Rails의 국제화(I18n) 기능은 `_html` 접미사를 통해 HTML 안전한 번역을 지원하지만, HTML을 직접 작성하는 것은 번거롭고 여러 언어 버전에서 유지보수가 어렵다는 단점이 있습니다. 본 글은 이러한 문제점을 해결하기 위해 `_md` 접미사를 도입하여 마크다운으로 번역을 작성하고 이를 자동으로 HTML로 변환하는 Rails I18n 커스터마이징 방안을 제시합니다. 마크다운은 HTML보다 간결하여 번역 작성 및 관리가 용이하다는 장점이 있습니다.

Rails I18n 마크다운 변환 구현 상세

본 기능 구현은 크게 두 가지 핵심 패치와 마크다운 변환 로직으로 구성됩니다.

1. I18n translate 메서드 패치

config/initializers/markdown.rb 파일에 Markdown::I18nBackendExt 모듈을 정의하여 I18n.backend.classprepend 방식으로 삽입합니다. 이는 기존 translate 메서드를 오버라이드하여 마크다운 변환 로직을 추가하기 위함입니다.

  • 기능: 번역 키가 _md로 끝나고 반환된 결과가 문자열인 경우, 해당 문자열을 마크다운으로 간주하고 HTML로 변환합니다.

  • 로직:
    • result.include?(" ")을 통해 여러 줄 마크다운인지 인라인 마크다운인지 판단합니다.
    • 여러 줄인 경우 Markdown.convert를, 인라인인 경우 Markdown.inline을 호출하여 적절히 변환합니다.
  • 참고: Rails의 누락된 번역 감지 로직(특정 매직 넘버 반환)을 고려하여 result.is_a?(String) 조건을 통해 실제 번역 문자열에 대해서만 변환을 시도합니다.

2. HTML 안전성 동작 패치

Markdown::HtmlSafeTranslationExt 모듈을 정의하고 ActiveSupport::HtmlSafeTranslationprepend하여 html_safe_translation_key? 메서드를 확장합니다. 이 패치는 _md 접미사로 끝나는 번역 키도 HTML 안전한 것으로 간주하도록 Rails에 지시합니다.

  • 목적: 마크다운에서 변환된 HTML이 뷰에서 이스케이프되지 않고 안전하게 렌더링되도록 보장합니다.

  • 주의: HTML 안전성 관련 패치는 XSS(크로스 사이트 스크립팅) 공격 가능성을 항상 염두에 두고 면밀히 검토해야 합니다.

3. Kramdown을 이용한 마크다운 변환

Markdown 모듈 내에 self.convertself.inline 클래스 메서드를 구현하여 실제 마크다운-HTML 변환을 담당합니다. Kramdown 라이브러리를 활용합니다.

  • Markdown.convert:
    • 일반적인 마크다운 텍스트를 HTML로 변환합니다.
    • auto_ids: false 옵션으로 자동 ID 생성을 비활성화하고, smart_quotes 옵션을 통해 스마트 쿼트 기능을 비활성화합니다.
    • Kramdown::Document.new(text, options).to_html을 호출하여 변환을 수행합니다.
  • Markdown.inline:
    • 인라인 마크다운 텍스트를 처리하기 위한 메서드입니다.
    • input: "Inline" 옵션을 사용하여 Kramdown의 커스텀 입력 파서인 Kramdown::Parser::Inline을 지정합니다.
    • 이 커스텀 파서는 Kramdown::Parser::Kramdown을 상속받지만, @block_parsers를 비워 블록 레벨 요소(예: <p>)가 생성되지 않도록 하여 순수한 인라인 HTML을 반환합니다.

이러한 단계를 통해 Rails 애플리케이션에서 _md 접미사를 가진 I18n 키를 마크다운으로 작성하고, 자동으로 HTML로 변환하여 안전하게 사용할 수 있게 됩니다.

결론

본 커스터마이징은 Rails I18n 번역에 마크다운을 도입하여 번역 작성의 효율성을 높이고 HTML의 복잡성으로 인한 유지보수 부담을 줄이는 효과를 가져옵니다. 개발자는 더 이상 HTML 태그에 신경 쓰지 않고 콘텐츠 자체에 집중할 수 있게 됩니다. 직접 Rails 핵심 기능을 패치하는 방식이 부담스럽다면 `I18n::Transformers` Gem과 같은 대안을 고려할 수 있으나, HTML 안전성 관련 패치는 여전히 필요할 수 있습니다. 어떠한 방식이든 HTML 안전성 관련 코드는 잠재적인 XSS 공격을 방지하기 위해 항상 면밀히 검토하고 보안에 유의해야 합니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!