번역과 개발을 둘 다 좋아하다 보니 옛날부터 자연스럽게 게임 한국어화에 관심이 있었다. 시작해서 끝마친 게임은 정말 별로 없지만 그 과정은 꽤 재미있었고 돌이켜 보면 배운 것도 적지 않았기에 하나씩 정리해보려고 한다. 첫 글은 스톰바운드라는 카드 게임으로 시작하려고 하는데, 사실 이 게임은 이미 한국어화가 되어 있다. 내가 진행한 것은 기존 한국어 번역을 수정하는 작업이다.
2017년에 출시된 스톰바운드는 하스스톤과 체스가 합쳐진 느낌의 수집형 카드 게임이다. 중간에 접은 시간이 꽤 길지만 나름 초창기부터 시작해서 지금까지 플레이해오고 있는 내가 가장 좋아하는 게임이다. 출시 때부터 지금까지 고쳐지지 않고 계속되는 문제가 하나 있는데 바로 번역의 품질이다.
먼저 카드나 게임 모드의 명칭을 불필요하게 음차해놓은 부분이 정말정말정말정말 많다. 그냥 슬쩍 보고 모르겠으면 음차한 수준이다. 사진의 Overcharger 또한 과충전자 정도로 충분히 번역할 수 있었음에도 오버차저라고 옮겨놓기만 했다. 번역자마다 갈리는 부분이겠지만, 나는 한국어화를 할 때 불가피한 상황이 아니라면 음차를 최대한 지양하는 것이 기본이라고 생각한다. 애초에 번역의 목적은 다른 언어의 뜻을 한국어로 옮겨오는 것인데 음차는 그 목적을 하나도 달성하지 못한다. 그럼 구태여 한국어로 옮기는 것에 무슨 의미가 있을까?
사실 스톰바운드의 한국어 번역에서 음차는 선녀인 수준이다. 가장 문제인 건 잘못 번역된 카드 능력이 있다는 것과 꾸준하게 수정되지 않는다는 점이다. 스톰바운드는 매달 업데이트가 진행되기 때문에 카드 능력이 바뀌는 경우가 잦은데 번역은 이에 맞춰 수정되지 않는다. 이런 식으로 능력 번역이 잘못되었음에도 오랫동안 방치되는 상황이 지속되자 유저들끼리 무엇이 잘못되었는지 숙지하고 있는 상황이 되어 버렸다.
심지어 최근에는 새로운 번역 회사를 찾고 있다더니 뭔가 잘못됐는지 아예 번역기를 사용하고 있는 듯하다. 이러한 모습을 도저히 견딜 수가 없었다.
눈 뜨고 볼 수 없는 번역을 견디지 못한 것은 나뿐만이 아니었다. 두 한국 유저분께서 한번 오역을 바로잡고 용어를 통일하는 수정 작업을 진행하신 적이 있다. 그래도 유저 말은 듣는구나 싶었는데 이후에 진행되는 번역들은 달라진 게 없었다. 심지어 시간이 지날수록 두 분이 작성하신 수정본을 확인하지조차 않는 놀라운 행보가 이어지자 결국 체념한 나머지 손을 떼버리셨다. 뒤에도 적겠지만 이 일은 실시간으로 내게도 일어나고 있는 중이다...
이후 시간이 흘러 번역의 질은 다시 처참해졌고 이번에는 내가 수정해보기로 했다. 앞서 두 분의 수정 작업은 개발사가 제공하는 모든 문자열이 담긴 스프레드시트를 통해 진행됐는데, 개발사가 시트를 업데이트해주지 않으면 수정 작업도 진행될 수 없었기에 비효율적으로 보였다. 그래서 나는 게임의 데이터를 직접 건드리기로 했다.
스톰바운드는 언어 파일을 게임 안에 포함하고 있지 않다. 대신 게임이 실행되면 서버에서 파일을 받아와 캐시해둔다. 서버의 파일이 달라지지 않는 한 캐시해둔 파일을 불러와 사용하므로, 이 파일을 수정하면 게임에 그대로 적용되게 된다. 윈도우 버전의 스톰바운드는 AppData\LocalLow
에 캐시해둔다.
언어 파일은 문자열 키와 값으로 구성된 간단한 .csv
파일인데, 열어 보면 사진처럼 암호화가 되어 있다. 분석하면 키가 42인 XOR 암호화라는 걸 알 수 있다.
게임에 적용하려면 다시 암호화를 해야 하기 때문에, 보다 편한 작업을 위해 C#으로 간단한 유틸리티를 만들었다.
복호화된 파일을 살펴보면 이렇게 되어 있다.
사실 이 작업을 시작한 이유에는 처참한 번역뿐만 아니라 개발사가 영문 텍스트를 너무 더럽게 쓰기 때문도 있었다. 그래서 영문 텍스트를 먼저 싹 다듬고 그걸 기반으로 한국어도 수정했는데, 뜻밖에도 내 수정본이 게임의 공식적인 텍스트 가이드라인이 되었다.
이런 식으로 쓸데없이 장황해서 가독성을 해치는 텍스트를 오른쪽과 같이 개선했다. 참 답답한 건 가이드라인이 수립된 지 약 반 년이 지났는데도 개발사는 이를 제대로 지키고 있지 않는다는 점이다...
이후에는 한국어 번역을 수정했다. 위처럼 카드 이름과 능력, 기타 문자열 등 다양한 오역을 수정하고 가이드라인에 맞춰 텍스트 서식을 다듬었다.
정말 바꾸고 싶었지만 그러지 못한 부문도 몇 개 있었다. 바로 앞서 예시로 들었던 오버차저와 같은 음차된 카드 이름들이다. 이런 음차된 번역명들은 대부분 게임 초기에 추가됐는데, 게임이 출시된 지 무려 5년이나 지났기 때문에 유저들 사이에서 단단히 굳어버렸다. 이러한 이름들을 바꾸는 건 조심스러울 수밖에 없을 뿐더러 유저들에게 의견을 물어보니 바꾸지 않는 것을 선호하는 사람이 많았다. 그렇기에 정말 마음에 들지 않지만 음차된 상태 그대로 내버려 두었다.
수정한 예시들이다. 중구난방이던 영어를 정리하는 것보다는 시간이 적게 걸렸다.
이렇게 수정한 파일을 개발사에게 전달하면 끝이지만, 나는 유저들이 원하면 게임에 바로 적용할 수 있도록 만들고 싶었다. 앞서 설명한 게임의 구조 덕분에 그렇게 만드는 건 크게 어렵지 않으므로 언어 파일을 수정하는 패쳐를 만들기로 했다.
패쳐는 간단하게 파이썬으로 작성했다. Github 리포지토리를 일종의 저장소로 활용했는데, 작업한 언어 파일을 올려두고 이를 유저 컴퓨터에 다운로드받아 기존 언어 파일과 교체하는 방식으로 만들었다.
기존 언어 파일은 확장자를 변경해 백업해두고 다시 복구할 수 있도록 했다. 사실 언어 파일을 지워버리면 게임이 알아서 새로 받아오기 때문에 없어도 괜찮은 기능이지만 편의성을 위해 만들어 뒀다.
그런데 다 만들고 PyInstaller로 빌드하는 과정에서 Windows Defender가 자꾸 바이러스로 오인하는 문제가 발생했다. 해결 과정을 올리기도 했었는데 결국은 빌드 라이브러리를 PyInstaller에서 cx_Freeze로 변경한 뒤에야 벗어날 수 있었다.
패쳐까지 마무리한 뒤, 안내받은 대로 현지화 담당 직원에게 리포지토리를 공유하면서 빠른 적용을 바란다고 연락을 보냈다. 그러나 돌아온 답변은 나를 몹시 당황하게 만들었다.
모든 변경점을 수동으로 적용해야 한다는 것이었다. 도대체 왜?...라는 생각밖에 들지 않았다. 게임에 바로 적용할 수 있도록 .csv
파일로 작업한 것은 물론 손수 암호화까지 해서 전달했는데 왜 직접 작업해야 한다는 건지 이해할 수가 없었다. 이게 말로만 듣던 스타트업의 기술 부채나 주먹구구식 운영이라는 건가부터 시작해 다양한 생각이 머리를 스쳤다. 개발사가 언어 파일을 관리하는 방식을 어느 정도 알고 있기 때문에 더 어이가 없었다.
스톰바운드는 유니티로 개발되었고 다양한 게임 데이터를 PlayerPrefs에 캐시해둔다. 이 데이터를 살펴보면 언어 파일을 AWS S3에서 받아온다는 것을 알 수 있다. AWS를 써보지는 않았지만 찾아보니 굉장히 강력한 스토리지 서비스인 듯 하던데 파일 업데이트가 안 될 리가 없었다. 마음 같아서는 개발사에 당장 쳐들어가서 뭐하자는 거냐고 묻고 싶었다.
인내의 시간을 거치고 드디어 게임에 적용됐다는 연락을 받았는데, 이번에는 위처럼 개판이 나 있었다. 살펴보니 따옴표 몇 개를 빼먹어서 일어난 오류였다. 카드 능력을 비롯해 플레이에 필요한 문자열들이 날라간 상황이길래 즉시 수정본을 보냈으나 답변은 없었다. 결국 다른 직원에게 확인하라는 말 좀 전해 달라고 부탁한 뒤에야 답변을 받을 수 있었다. 놀라운 수동 적용의 시간을 거쳐 무려 6일 뒤에나 수정본이 온전하게 적용되었다.
하지만 말했듯이 스톰바운드는 매달 카드가 변경되고 새로 출시되는 게임이다. 번역기를 돌리거나, 그에 근접한 수준으로 엉망으로 번역하거나, 아예 변경하지 않은 텍스트들을 꼬박꼬박 고쳐 전달했으나 한 달째 안읽씹 당하고 있는 중이다.
몸에 사리가 쌓일 지경이지만 더 걱정되는 건 다른 언어들이다. 한국어는 내가 계속 수정하고 있지만 다른 언어들을 살펴보면 수정되지도 않고 방치되는 중이다. 스톰바운드 공식 디스코드 서버에는 무려 유저들이 번역 수정을 제안하는 채널이 있는데, 제안만 받고 적용하지 않는다고 원성이 자자하다. 이제는 이 개발사가 어떤 행보를 보일지 기대되는 수준이다.
현재진행형으로 가슴 깊은 곳에서 답답함을 느끼고 있는 중이지만, 되돌아보면 나름 배운 점이 많았던 작업이었다. 유니티 게임에서 어떻게 다양한 언어를 지원하는지, 데이터를 어떤 구조와 방식으로 관리하는지 등을 알게 되었다. 이러한 것들은 잘 정리해서 내 게임에 적용해보면 좋겠다는 생각이 들었다. 또한 C#으로 XOR 암복호화 유틸리티도 만들었고, 파이썬으로 패쳐도 제작했다. 이때 만든 패쳐는 나중에 올릴 리스크 오브 레인 시리즈의 한국어화에서도 계속 써먹었다.
기술적인 부분 외에 언어적인 부분에서도 많은 경험을 할 수 있었다. 모국어가 아닌 영문 텍스트를 다듬으며 어떻게 해야 의미는 보존하면서 길이를 단축할 수 있을지 고민해보는 것은 처음이었다. 언어들의 본질은 서로 상통하기에 이 과정에서 알게 된 것들을 한국어로 글을 쓸 때에도 적용할 수 있었다. 번역에서도 느낀 점이 있는데 원문을 꼭 곧이곧대로 번역할 필요는 없다는 것이었다. 영어와 한국어는 분명히 다른 언어이기 때문에 원문과 다른 구조를 취할 때 오히려 읽기 편하고 자연스러울 수도 있다는 것을 알게 되었다. 사소하지만 리포지토리 README를 처음부터 끝까지 영어로 써보는 것도 처음이었다.
한국어화는 아니고 기존 번역 수정 작업이었지만, 또 적용되는 과정이 달관할 정도로 너무 답답했지만 그래도 좋은 경험이었다.