728x90
이 글에서는 OpenStack의 한글화 컨트리뷰션을 위한 개념 및 용어 정리, 번역 툴 환경 설정에 대해 다룹니다.
현재 저는 2025 OSSCA OpenStack/Kubernetes 한글화 컨트리뷰션 프로젝트에 참여하고 있습니다.
이번 활동을 통해 Zanata에서 Weblate로 OpenStack의 번역 플랫폼 마이그레이션을 진행할 예정입니다.
마이그레이션이 작업이 끝난다면 Zanata는 더이상 사용하지 않을 예정입니다.
🔹 용어 및 개념 정리
🌩️ OpenStack - 오픈소스 클라우드 인프라 플랫폼
- OpenStack은 데이터를 저장하거나, 가상 머신을 만들거나, 네트워크를 구성하는 등의 클라우드 인프라를 오픈소스로 구축할 수 있게 해주는 플랫폼입니다.
아마존 AWS, 구글 클라우드, MS Azure처럼 동작하지만 누구나 소스를 보고 직접 설치하거나 커스터마이징 할 수 있다는 점이 큰 차이점입니다. - OpenStack은 하나의 단일 애플리케이션이 아니라 수십 개의 모듈형 프로젝트(컴포넌트)로 구성되어 있습니다.
- 아래는 OpenStack의 대표적인 컴포넌트 입니다.
- Nova: 가상 머신 생성 및 제어
- Neutron: 네트워크 구성 및 관리
- Cinder: 블록 스토리지 서비스
- Glance: VM 이미지 관리
- Keystone: 인증/인가 시스템
- Horizon: 웹 기반 대시보드
- 이 모든 컴포넌트가 REST API 형태로 연동되며, 유연한 클라우드 운영 환경을 제공합니다.
- 전 세계 수천 명의 개발자가 기여하고 있으며, 정기 릴리즈 주기, 코드 리뷰 프로세스, CI/CD 시스템 등이 매우 체계적입니다.
🚚 Zuul - OpenStack 식 CI/CD 오케스트레이터
- Zuul은 OpenStack 프로젝트에서 자체 개발한 CI/CD 파이프라인 자동화 도구입니다.
- 여러 개의 변경사항(patchset)을 자동으로 병합 순서에 따라 테스트하고 서로 간의 의존성까지 분석해 줍니다.
- 기여자가 코드를 제출하면 자동으로 빌드, 테스트, 배포까지 수행합니다.
🌍 i18n (Internationalization) - 소프트웨어의 다국어 지원 준비
- i18n은 "internationalization"의 줄임말로, i와 n 사이에 18개의 알파벳이 있다는 데서 나온 표현입니다.
- 아이 에잇틴 엔(i eighteen n)이라고 읽습니다.
- 소프트웨어가 전 세계 사용자를 대상으로 제공될 수 있도록 준비하는 과정을 말합니다.
- UI 문자열을 코드에서 분리하여 외부 파일로 추출
- 문자열에 하드코딩된 언어나 포맷(예: 날짜, 통화, 숫자 등)을 지역 설정(locale) 기반으로 변경 가능하게 처리
- 다양한 언어로의 번역(translation) 가능하게 구조화
- OpenStack처럼 전 세계 커뮤니티가 사용하고 참여하는 오픈소스 프로젝트에서는 영어 이외의 다른 언어를 지원해야 하는데 이러한 다국어 지원을 가능하게 해주는 것이 바로 i18n입니다.
- 참고로 OpenStack은 독립적인 i18n 프로젝트 팀을 운영하고 있습니다.
🧾 Zanata, Weblate - 오픈소스 친화적인 번역 플랫폼
- Zanata, Weblate는 오픈소스 소프트웨어의 국제화를 지원하는 웹 기반 번역 플랫폼입니다.
- 그러나, Zanata의 경우 현재는 개발이 중단된 지 오래되어 국제화를 지원하는 번역 플랫폼으로는 Weblate가 메인으로 사용되고 있습니다.
- 2025년 8월 기준 OpenStack의 한글화는 Zanata에서 Weblate로의 마이그레이션 작업이 필요한 상황입니다.
- 이번 컨트리뷰션 활동의 중요한 목표는 새로운 문서 번역이 아닌, 번역 플랫폼 마이그레이션(Zanata -> Weblate)에 있습니다.
✅ Gerrit -코드 리뷰와 권한 관리를 동시에 지원하는 Git 기반 협업 도구
- Gerrit은 Git 저장소 위에서 작동하는 코드 리뷰 시스템입니다.
- 단순한 Git 호스팅 툴이 아니라, 기여자(Contributor)가 올린 코드 변경 사항(Patchset)에 대해 리뷰어(Reviewer)가 승인하거나 의견을 남기는 기능을 제공합니다.
🗂️ .pot 파일이란?
.pot = Portable Object Template
- 소프트웨어의 다국어 번역을 위한 원문 메시지 템플릿 파일입니다.
- 번역되지 않은 상태의 원문 문자열 목록만 들어 있습니다.
- .po(Portable Object) 파일의 기초가 되는 템플릿 역할을 합니다.
🧩 .pot 파일의 역할
- 개발자가 프로그램에 메시지를 작성하면 코드에서 추출된 모든 원문 메시지를 .pot 파일에 정리합니다.
- 이 .pot 파일을 기준으로 번역자들이 .po 파일(각 언어별 번역본)을 작성하는 것입니다.
🚀 zanata-cli 환경 설치
- 우선 마이그레이션 전 zanata-cli 설치를 통해 우분투 로컬 환경에서 zanata-cli를 다룰 수 있도록 합니다.
- 아래는 horizon이라는 레파지토리를 통해 번역 파일을 로컬로 pull 해보는 실습 과정이 담겨있습니다.
- zanata는 기본적으로 리눅스 환경에서 실행됨으로 저는 도커 컨테이너를 이용했습니다.
🔸 도커 컨테이너 초기 실행
# 도커 우분투 컨테이너 생성 및 시작
$ docker run -it --name zanata-container -v zanata-volume:/workspace ubuntu:20.04 bash
# (컨테이너 내부) apt 패키지 업데이트
$ apt update
- 볼륨을 설정하여 컨테이너 종료와 관계없이 데이터를 유지하도록 했습니다.
🔸 기타 필수 설치
# 컨테이너 내부입니다.
# 0install Zanata 설치에 필요한 패키지 프로그램, jdk-8 자바 런타임 환경, vim 문서 수정 라이브러리
$ apt install -y 0install openjdk-8-jre vim
# lxml 설치에 필요한 패키지
$ apt install -y python3 python3-pip libxml2-dev libxslt1-dev python3-dev
# lxml, requests 설치
$ pip3 install lxml requests
- Zanata 공식 문서를 참고하여 진행했습니다.
- 위 링크 내 Others 부분을 보며 진행한 것입니다.
- 각 패키지는 필수로 설치해야 할 패키지입니다.
🔸 Zanata에서 실습 번역 파일 가져오기
# zanata에 로그인하여 settings의 값을 참고하여 ~/.config/zanata.ini 파일 생성 후
# 자신의 워크스페이스에 ZanataUtils.py, create-zanata-xml.py 생성
# horizon 프로젝트 master 브랜치의 각 .pot 파일에 대응하는 번역파일(.po) 위치를 담은 zanata.xml 파일 생성
$ python3 create-zanata-xml.py -p horizon --srcdir . --txdir . -r '**/*.pot' '{path}/{locale_with_underscore}/LC_MESSAGES/{filename}.po' -e '.*/**' -f zanata.xml -v master
- Zanata에 가입한 후 운영진으로부터 한국어 번역팀 참여 신청 수락을 받아야 진행이 가능합니다.
- 이 명령어의 자세한 설명은 다음 글에 다루겠습니다.
🔸 locale로 한글 파일 안 깨지게 설정하기
# 번역 파일 확인하기
vi horizon/locale/ko_KR/LC_MESSAGES/djangojs.po
# 출력
...
msgstr "?????????. ????????? ????????? ????????? ????????????."
# locale 설정을 하지 않으면 문자가 깨짐
# 현재 형식 확인
locale
# 현재 형식 있는지 확인하셔야합니다. (ex) en_US.utf8)
locale -a
# 한글 패키지 다운
apt install -y language-pack-ko
# en_US.UTF-8 설치
locale-gen en_US.UTF-8
# update-locale LANG=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
# 적용
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
# 위의 zanata.xml이 생성 되었는지 확인 후 실행하기
$ zanata-cli -B -e pull
# 번역 파일 확인하기
vi horizon/locale/ko_KR/LC_MESSAGES/djangojs.po
# 출력 예시(한국어로 나오는 걸 확인)
...
msgstr "인증되지 않았습니다. 로그인으로 리다이렉팅합니다"
- 번역 파일을 정상적으로 읽기 위해서는 locale 설정이 필요합니다.
🧐 OpenStack i18n CI 구조 분석해 보기
Project Repository가 업데이트될 때
# zuul.d/projects.yaml
- project:
name: openstack/nova
queue: integrated
templates:
- official-openstack-repo-jobs
- periodic-jobs-with-oslo-master
- publish-to-pypi
- translation-jobs-master-only
- api-guide-jobs
- api-ref-jobs
- zuul이라는 CI 도구에 의해 번역 관련 job이 실행됩니다.
translation-jobs-master-only 분석하기
# /zuul.d/project-templates.yaml
- project-template:
name: translation-jobs-master-only
description: |
Sync translations to translation server and back again for
**master** only.
This is intended for official OpenStack projects that have
translations set up.
post:
jobs:
- upstream-translation-update:
branches: master
periodic:
jobs:
- propose-translation-update:
branches: master
# /zuul.d/pipelines.yaml
- pipeline:
name: periodic
post-review: true
description: Jobs in this queue are triggered on a daily timer.
manager: independent
precedence: low
trigger:
timer:
- time: '0 2 * * *'
- 이름에서 알 수 있듯이 master 브랜치에 merge가 일어나 업데이트가 진행되면 매번 두 개의 post job이 수행됩니다.
- 이 두 작업을 간단히 설명하면
- 하나는 프로젝트가 업데이트 됐을 때 변경 사항을 기여자들이 번역할 수 있도록 Zanata에 원문 템플릿을 업로드합니다.
- 다른 하나는 기여자들이 번역을 하는 시간이 매번 다르기 때문에 스케줄러를 통해 매일 같은 시간에 번역된 내용을 가져와 업데이트합니다.
upstream-translation-update
- 프로젝트가 업데이트되면 프로젝트에서 .pot 파일(영어 원문 템플릿)을 추출하여 xml 설정에 따라 Zanata 서버에 .pot 파일을 업로드(Push)하는 자동화 스크립트를 실행합니다.
- 프로젝트에서 새롭게 업데이트된 원문 템플릿을 Zanata에 Push 하여 기여자들이 번역 작업을 할 수 있게 준비하는 것입니다.
propose_translation_update
- 기여자들에 의해 번역된 .po 파일을 Zanata에서 받아오고, 정리(cleanup)하고, git에 반영하고, 필요하면 Gerrit에 리뷰 패치로 푸시하는 전체 과정을 자동으로 수행합니다.
- perodic을 통해 매일 UTC 2시에 실행됨을 확인할 수 있습니다.
🧹 정리
- 저희는 기존의 CI 작업에 포함되어있는 여러 명령어를 이용해 직접 pot 파일 등을 만들어 Zanata에서 Weblate로 마이그레이션 할 예정입니다.
- 이번 시간에는 그에 필요한 Openstack 컨트리뷰션 관련 용어 정리, 리눅스 설정, 레파지토리에서 번역 파일 Pull 하기 등에 대해 알아보았습니다.
728x90