Openstack Weblate Migration - Language Migration

해당 글은 Zanata에서 Weblate로의 마이그레이션 과정 중 Language Migration을 진행하면서 겪은 내용과 방법들을 담고 있습니다.

왜 마이그레이션이 필요한가?

저희 팀의 목표는 Zanata에서 이루어지던 작업들을 100% 똑같이 Weblate 플랫폼에서 할 수 있게 하는 것입니다. 그렇기에 기존 Zanata 플랫폼의 프로젝트 구조와 번역 언어를 똑같이 맞추어야했습니다. Weblate 오픈소스를 가지고 처음 실행을 시키면 초기에 몇백개의 언어들이 자동으로 생성되게 됩니다.

그리고 해당 언어들에는 Weblate에서 설정한 Language Code와 Plural-Form들이 정의되어 있습니다.

여기에 올라온 언어들 중에 Zanata에서 사용하는 것들도 존재하지만 사용하지 않고 있는 언어들도 존재하며 Plural 값들이 다르거나 Language Code가 다른 것들도 존재합니다. 이것들을 기존 Zanata에 맞추어야하기에 Language Migration 작업을 시작하게 되었습니다.

Plural 값은 어디에서 가져와?

그러면 Plural 값을 맞출려고 했을 때 해당 값을 어디서 가져올지 고민하였습니다. 처음에는 Zanata API를 활용하는 방향을 생각하였습니다.

http://zanata.org/zanata-platform/rest-api-docs/resource_ProjectLocalesResource.html

해당 API를 보면 Language Code뿐만 아니라 Plural값들도 반환하는 것을 확인할 수 있었습니다. 하지만 실제로는 Language Code만 반환되며 실제로는 Plural 값이 반환되지 않았습니다. 그래서 두 번째로 찾은 방법은 Zanata 또한 오픈소스이기에 해당 오픈소스 프로젝트 레포지토리에서 Plural 값을 담고 있는 파일을 찾았습니다.

https://github.com/zanata/zanata-platform/blob/master/server/services/src/main/resources/pluralforms.properties

이제는 Plural 값을 찾았으니 그 중 어떤 언어들이 실제 Openstack Zanata 플랫폼에서 쓰고 있는지 찾아야하며 그 Language와 위에서 찾은 Plural 파일을 서로 매핑하여 그 언어들을 Weblate에 생성 또는 업데이트를 진행하는 방향으로 결정하였습니다.

여기서 Zanata에서 사용하는 Language는 API를 사용하여 가져와 파일 형태로 만들어 사용하는 것으로 하였습니다.

curl -s \\
  -H "Accept: application/json" \\
  -H "X-Auth-User: " \\
  -H "X-Auth-Token: " \\
  -o /home/ubuntu/zanata.json \\
  "<https://translate.openstack.org/rest/locales/ui>"

curl 명령어를 통해 api를 호출하고 json 파일로 만들어 두어 사용하였습니다.

Zanata에서 가져온 Language 값만 남기기

다음 과정은 위의 API를 통해 가져온 Language 값만 Weblate에 남기고 Weblate의 다른 언어들은 삭제하고 기존 언어들 중 Plural 값이 다른 언어는 zanata-platform에서 가져온 값으로 수정하는 로직을 구성하였습니다. 결론부터 이야기하면 해당 로직은 현재 삭제를 하였습니다. 그 이유는 weblate에서 처음 Language를 생성할 때 plural 값을 세팅하게 되는데 이 값은 생성 이후에 수정하거나 삭제할 수 없습니다. 정확히는 default로 정의된 plural 값을 건드릴 수 없는 것입니다.

Weblate Rest API로 수정 api를 보내더라도 에러를 반환하지는 않지만 수정이 이루어지지 않는다는 것을 알게되었습니다. 그렇기에 해당 로직을 사용하는 것이 아닌 기존 Weblate의 모든 Language들을 삭제하고 Zanata에 있는 Language들을 새로 생성하는 방향으로 로직을 작성하게 되었습니다.

https://docs.weblate.org/en/latest/api.html#languages

Weblate의 모든 Language를 삭제하고 새로 생성하기

최종적으로 선택한 방법은 Weblate의 모든 Language를 삭제하고 새로 생성하는 것입니다. 여기서 Zanata에서 사용하는 언어는 /rest/locales/ui 해당 API로 가져온 파일을 사용하여 생성하며 Plural 값은 Zanata-Platform 오픈소프 레포지토리에서 가져온 파일을 사용하여 진행합니다. 즉, /rest/locales/ui 해당 API에는 Plural 값이 없기에 Zanata-Platform 파일에 같은 Language 이름과 매핑 시켜 Weblate에 사용하게 하였습니다.

작업 순서는 다음과 같습니다.

  1. /rest/locales/ui 로 Zanata.json 파일(Language List 파일) 생성하기

  2. delete_languages.py(Weblate Language 삭제 코드) 실행하기

  3. create_languages_weblate.py(Weblate Language 생성 코드) 실행하기

해당 로직들에 대한 것은 openstack i18n 레포지토리에 패치를 올려둔 상태입니다.

https://review.opendev.org/c/openstack/i18n/+/961371/9

아래는 최종적으로 마이그레이션 이후 화면입니다.

현재의 문제

https://openstack.weblate.cloud/

현재 openstack에서 사용하는 weblate에 마이그레이션을 해둔 상태입니다. 하지만 지속적으로 발생하고 있는 문제는 어느 시점에 Language들이 초기화 된다는 점입니다. 정확히는 제가 마이그레이션할 때 새로 생성한 Language들은 계속해서 남아있지만 삭제하였던 Language들이 계속해서 재생성된다는 점입니다. 해당 문제를 해결할 방법을 찾고 있으며 Weblate측에도 한 번 문의를 남길 예정입니다.

1개의 좋아요