게시글소개

TLDR 한국어 번역률 100% - 1. ChatGPT로 초벌 번역하기

CodePsy-2001,ShellChatGPTOpenSourcetldr

발단

tldr은 명령어의 사용법을 간단하게 보여주는 프로젝트로, 셸 환경이라면 어디서나 쉽게 사용할 수 있다. 기존 man 페이지와 비교하면 사용법이 간단하고, 예제가 많아 초보자에게 유용하다.

하지만 한국어 번역률이 심각하게 저조한 상태로, 2024년 8월 시점에는 다종다양한 명령어의 도움말은커녕 git branch 조차도 번역되지 않았었다. (지금은 답답해서 내가 번역해놨다)

❯ tldr git branch

  Main Git command for working with branches.
  More information: <https://git-scm.com/docs/git-branch>.

  List all branches (local and remote; the current branch is highlighted by `*`):
      git branch --all

  List which branches include a specific Git commit in their history:
      git branch --all --contains commit_hash
  ...

pacman도, npm도, docker도 마찬가지였다.

평소 오픈소스 기여에 관심이 많았던 나는 우선 git branch 명령어부터 번역해보기로 했다.

tldr의 구조

tldr 레포지토리를 살펴보면 다음과 같은 구조로 되어 있다.

pages    # English
├── common
│   ├── git.md
│   ├── git-branch.md
├── <enviroment>    # Linux, MacOS, FreeBSD, Windows, ...
pages.ko    # Korean
├── common
│   ├── git-branch.md
pages.<locale>    # Other languages
...

pages.<locale> > <enviroment> > <command>.md 순으로 파일이 차곡차곡 저장되어 있다.

tldr 프로그램은 이 마크다운 파일들을 적시에 캐싱하고, 시스템 로캐일을 기반으로 어떤 파일을 보여줄지 결정하고, 셸에 출력한다.

번역 프로세스

기여자는 다음 과정을 지켜야 한다.

번역 과정 자체는 어렵지 않지만, 각종 스타일 가이드를 꼼꼼하게 지키고 여러 파일을 번역하다보면 굉장히 귀찮아진다. gettext 같은 표준화된 번역 도구를 사용하지 않기 때문에, 웹 기반으로 불특정 다수가 참여하기 어렵다. 영어 버전 파일이 조금이라도 바뀌면 번역 파일을 낡은 것으로 판단, 대신 원본을 보여주기 때문에 체감 번역률은 더욱 낮아진다.

개선할 점

  1. 번역이 필요한 파일 확인
    • 현재, 번역이 필요한 파일을 알려주는 셸 도구 같은 게 없다.
    • 우선 번역률 100%를 달성한 후, 웹훅 등으로 추가적인 번역 수요를 추적할 수 있다면 더 좋겠다.
  2. 초벌 번역
    • 초벌 번역 후 검수 과정을 거치는 게 한 번에 꼼꼼하게 번역하는 것보다 효율적이다.
  3. 코드에 반영
    • PR 컨벤션을 꼼꼼하게 지켜야 한다.

ChatGPT로 초벌 번역하기

초벌 번역에는 ChatGPT를 활용하는 게 매우 효율적이다.

언어 모델을 사용하면 각종 스타일 가이드를 프롬프트 형태로 직접 학습시킬 수 있고, 미묘한 뉘앙스(명령형 문장 등)나 전문 지식도 번역에 반영할 수 있다.

image1

평소 사용하던 gpt-cli를 활용하면 쉽게 번역할 수 있겠다.

모델이나 프롬프트 설정에 YML 파일 하나면 충분하다.

openai_api_key: <API_KEY>
assistants:
  tldr:
    model: gpt-4o
    messages:
    - role: system
      content: >
        You provide excellent and accurate translations for TLDR documentation.
        You provide accurate translations based on the inputted voca, guides, and examples.
        You also infer rules from a given guides to maintain the quality of the translation in as many cases as possible.
    - role: system
      content: |
        [VOCA]
        See also: - 같이 보기:
        <생략>
    - role: system
      content: |
        [Guide]
        {{}}로 감싸진 단어는 최선을 다해 번역하세요. (예: {{commit_hash}} - {{커밋_해시}})
        예시 설명형은 가능한 한 명령법으로 표현되어야 합니다. 예를 들어, '시작하기:' 가 아닌 '시작:' 으로 표현되어야 합니다.
    - role: system
      content: |
        [Example1 - Original]
        <생략>
    - role: system
      content: |
        [Example1 - Translation]
        <생략>

전체 내용은 깃허브에서 직접 확인할 수 있다.

실행은 아래와 같이 한다. (셸 도구라 파일입출력이 매우 간편하다)

gpt-cli tldr < ./pages/common/git-branch.md

셸 스크립트로 자동화하기

초벌 번역 과정은 다음 요건을 지키면 충분하다.

  1. 패턴 매칭으로 번역이 필요한 파일을 찾는다.
  2. 다음 경우에 ChatGPT로 번역한다.
    • 번역 파일이 존재하지 않는 경우
    • 번역 파일이 존재하지만 낡은 경우
#!/bin/bash
# depends on `gpt-cli`
 
for page in "$@"; do
  [[ -f "$page" ]] || continue
  printf "%s" "$(basename "$page")"
 
  page_ko=${page//'./pages/'/'./pages.ko/'}
 
  if [[ -f "$page_ko" ]]; then
    if [[ $(git log -1 --format=%ct "$page_ko") -ge $(git log -1 --format=%ct "$page") ]]; then
      printf "\t\e[33mSkip: already translated\e[0m\n"
      continue
    fi
  fi
 
  translated=$(gpt tldr -p "$(cat "$page")")
  echo "$translated" > "$page_ko"
 
  printf "\t\e[32mSuccess\e[0m\n"
done
 
printf "\nAll tasks are completed.\n\n"

비동기 처리 등 개선의 여지가 있지만, 이만하면 충분하다. 어차피 한 번만 실행하면 되니까.

결과

lazygit으로 전체 결과물을 손쉽게 확인하고 커밋할 수 있다.

lazygit

# 번역 파일 생성
./translate-ko pages/common/git-*.md
# 파일 확인
lazygit .

셸 도구만으로 1시간도 안 걸려서 초벌 번역 작업을 마쳤다. 문서 1만 개 정도 된다. (코딩보다 프롬프팅이 훨씬 오래 걸렸다)

이제 내 Fork 레포에 올려두고 필요할 때마다 검수 및 PR을 보내면 된다.

필요한 만큼만 코딩하니 모든 작업이 빠르고 즐겁다.

다음 편을 기대해주세요!


댓글

© CodePsy-2001.