번역 관리 · 4 min read · Jan 20, 2026

정적 웹사이트를 위한 Gettext

정적 웹사이트를 위한 Gettext

여기 GNU gettext를 사용하여 정적 웹사이트를 위한 번역 관리 시스템을 구현한 방법이 있습니다. 급한 분들을 위해 마지막에 11가지 지침으로 요약했습니다.

목표

이 시스템은 블록별 번역(문자열별 번역)을 가능하게 하며, 이는 페이지별 번역보다 더 좋습니다:

  • 번역되지 않은 부분의 변경 사항이 모든 번역에 자동으로 적용됩니다(형식, 태그, 이미지, 날짜, 이름, 링크 등).
  • 모든 페이지의 텍스트 블록을 함께 저장함으로써 반복되는 블록은 한 번만 번역하면 됩니다(메뉴 텍스트, 저작권 고지, 제목 등).
  • 번역이 진행 중일 때 원본이 변경되어도 길을 잃지 않습니다.
  • 원본에서 단락을 변경할 때 번역의 어떤 부분을 업데이트해야 하는지 쉽게 확인할 수 있습니다.

이러한 시스템을 위해 추상적인 단계는 다음과 같습니다:

  1. 웹페이지에서 번역 가능한 각 텍스트 블록을 표시합니다. 번역할 수 없는 부분은 공유 프레임이 됩니다.
  2. 블록을 데이터베이스로 추출합니다. 번역합니다.
  3. 블록을 다시 프레임에 병합하여 원본 웹페이지를 재생성하는 소프트웨어를 찾거나 작성합니다 - 하지만 영어 데이터베이스 또는 번역된 버전 중 하나에서 텍스트 블록을 가져오는 옵션이 있습니다.

Gettext는 명백한 가능성처럼 보였고, 지금은 모든 것이 완벽하게 작동하고 있지만, 8시간이 걸렸습니다. 기존 문서가 웹사이트나 문서가 아닌 컴퓨터 프로그램을 위한 gettext 사용에 맞춰져 있었기 때문에 어려움이 있었습니다. 그때 나는 내가 한 일을 문서화해야 한다는 것을 깨달았습니다:

내가 한 일

나는 최소한으로 내 웹페이지를 컴퓨터 프로그램으로 변환하는 것부터 시작했습니다. 이는 다섯 단계로 이루어졌습니다:

  1. 텍스트(문자열)를 파일에 출력하는 작은 프로그램을 작성합니다.
  2. 문자열 대신 프로그램에 웹페이지를 복사합니다.
  3. gettext에 필요한 표준 코드를 삽입합니다.
  4. 문자열을 더 작은 문자열로 나누고, 번역 가능한 부분과 번역할 수 없는 부분을 구분합니다.
  5. 번역 가능한 문자열에 gettext 태그를 표시합니다(태그의 형식은 사용하는 프로그래밍 언어에 따라 다르지만 일반적으로 밑줄 _이 포함됩니다).

Gettext는 많은 프로그래밍 언어와 함께 작동하므로 패키지에 포함된 예제 중에서 선택하세요. 내 컴퓨터에서는 이 폴더에 있습니다:
/usr/share/doc/gettext-doc/examples/
언어 선택은 중요하지 않습니다. 코드는 매우 간단할 것입니다.

여기 내 원본 index.html이 있습니다:



Cow


See also: FSFE

지원되는 프로그래밍 언어 중에서 나는 Scheme(리습의 방언)를 선택했습니다. 처음에는 아래 코드가 복잡해 보이지만, 첫 번째와 세 번째 청크만 수정하면 됩니다. 첫 번째 청크는 세 개의 변수를 정의하며, 이는 자명해야 합니다. 모든 웹페이지 텍스트는 세 번째 청크에 있습니다. 이는 블록으로 나누어져 있으며, 번역 가능한 블록 주위에 Scheme용 gettext 태그(_ )를 넣었습니다. 여기에 있습니다, generate-index.scm:

#!/usr/bin/guile -s
!#
(define output-filename "index.html")
(define project-name "ciarans-website")
(define build-directory "/home/ciaran/website-build/")
(use-modules (ice-9 format))
(catch #t (lambda () (setlocale LC_ALL "")) (lambda args #f))
(textdomain project-name)
(bindtextdomain project-name build-directory)
(define _ gettext)
(define page-text (string-append
   "\n"
(_ "Cow")
   "\n\n\n

" (_ "See also: ") "" (_ "FSFE") "

\n" "\n\n")) (define the-file (open-file output-filename "w")) (display page-text the-file)

여덟 개의 문자열 중 세 개가 번역 가능하도록 표시되어 있습니다. 나머지 다섯 개는 어떤 언어 버전의 페이지가 생성되든 동일한 공유 프레임의 일부입니다.

HTML의 모든 따옴표를 백슬래시 따옴표(\”)로 바꾸고, 출력을 읽기 쉽게 하기 위해 몇 개의 줄 바꿈(\n)을 추가해야 합니다. 이것들은 Scheme의 따옴표와 줄 바꿈 시퀀스입니다. 다른 몇 가지 언어에서도 동일하지만, 다른 언어에서는 다를 수 있습니다.

계속하기 전에 “build-directory” 변수를 generate-index.scm이 있는 디렉토리로 설정해야 합니다. 그렇지 않으면 모든 것이 작동하는 것처럼 보이지만 프로그램이 번역된 문자열에 접근하지 못합니다.

그 작업이 완료되면, 다음 두 명령어로 번역 가능한 문자열을 추출합니다:

  • $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  • $ mv ciarans-website.po ciarans-website.pot

그런 다음 다음 명령어로 프랑스어 번역을 위한 파일(“po” 파일)을 생성할 수 있습니다:

  • $ msginit --locale=fr

gettext 매뉴얼의 한 부분에서는 “msginit”이 선택 사항이라고 하며, 대신 수동으로 할 수 있다고 하지만, 이는 나에게 전혀 작동하지 않았습니다. 나는 그 문제를 진단하는 데 두 시간을 보냈습니다. msginit을 사용하세요.

이렇게 하면 fr.po가 생성되며, 이는 어떤 텍스트 편집기로도 편집할 수 있습니다. 맨 위에는 다음과 같은 줄이 있을 것입니다:

"Content-Type: text/plain; charset=UTF-8\n"

문자 집합이 “ASCII”인 경우, 이를 UTF-8로 변경하는 것이 좋습니다. 문자 집합이 다른 경우 다른 gettext 도구(msgmerge 등)에서 잘못된 문자에 대한 오류 메시지가 발생하면 문자 집합을 UTF-8로 변경하는 것이 해결책일 수 있습니다. 또한 content-transfer-encoding 필드가 있을 것입니다. 매뉴얼에서는 항상 “8bit”여야 한다고 합니다.

Emacs는 po 파일을 편집하는 데 특히 좋습니다. 왜냐하면 이를 위한 특별한 편집 모드가 있기 때문입니다.

그런 다음 다음 두 명령어로 po 파일을 특별한 mo 형식으로 변환하고 gettext가 기대하는 하위 디렉토리에 넣어야 합니다:

  • $ mkdir -p fr/LC_MESSAGES
  • $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po

Scheme 파일을 실행 가능하게 만들고, 그게 전부입니다!

ciaran@hide:~/tests/simple-page$ LANGUAGE=fr ./generate-index.scm; cat index.html

Vache


Voir aussi : La FSFE

ciaran@hide:~/tests/simple-page$ LANGUAGE=en ./generate-index.scm; cat index.html Cow

See also: FSFE

ciaran@hide:~/tests/simple-page$

좋습니다, 이것이 당신의 개념 증명입니다. 다음으로, 나는 내 사이트를 이 시스템으로 변환하고 유지 관리해야 합니다(사용하여 msgmerge). 여기 게시할 수 있도록 메모를 유지하려고 합니다.

지침

  1. 빈 파일 generate-index.scm을 만듭니다.
  2. 내 generate-index.scm(위)을 파일에 복사합니다.
  3. generate-index.scm에서 build-directory(세 번째 정의된 변수)를 generate-index.scm이 있는 디렉토리를 가리키도록 조정합니다.
  4. $ xgettext --language=scheme -d ciarans-website -k_ generate-index.scm
  5. $ mv ciarans-website.po ciarans-website.pot
  6. $ msginit --locale=fr
  7. fr.po를 편집하여 세 개의 텍스트 문자열 번역을 추가합니다.
  8. $ mkdir -p fr/LC_MESSAGES
  9. $ msgfmt --output-file=fr/LC_MESSAGES/ciarans-website.mo fr.po
  10. $ chmod +x generate-index.scm
  11. $ LANGUAGE=fr ./generate-index.scm; cat index.html


Ciaran O’Riordan, ( RSS)
자유 소프트웨어를 지원하세요: FSFE의 펠로우십에 가입하세요.

Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.