2025-11-02
[etc] duckov 하다가 dnSpy 툴의 다국어 번역 기여하게 된 썰
지난 주였어.
내 유튜브에 갑자기 duckov 영상이 한 두개씩 뜨더니 점점 더 많이 뜨는거야.
마침 하던 게임도 시들해진 상태라 새 친구를 찾고 있는 와중에 steam에서 15000원이라는 저렴한 가격에 일단 잘 모르고 사봄.
익스트랙션 게임이라던데 해보니까 성장형 있는 로그라이크라고 느껴지긴 함. 딴거보다 사람이랑 안싸우는 파밍형 PvE 컨셉이 좋았어. 지금 플탐이 44시간인데 아직 농장마을(3번째 지역) 절반도 못돌아다니는 나는 미물..
이 게임의 1차 목표는 수집인데 조금 하다보니까 사용자가 만들어놓은 mod를 깔아야 할 필요성이 생기더라고.
예를 들어, 기존엔 가방에 아이템 배경색이 다 동일한데 mod에서 이걸 아이템 희귀도에 따라 배경색을 추가했다던지, 아이템의 개수나 매도 가격, 분해 시 나오는 아이템이 보이는 mod 등 꽤 많은 편.
그런 편의성 mod만 깔아서 즐겁게 하고 있었는데, 가방을 열지 않으면 무게가 보이지 않아서 후반가서는 템을 주웠다 내렸다 하면서 인벤 정리가 꽤 귀찮아졌어. 내 생각엔 hp바 위에 딱 텍스트로 무게만 보였으면 좋겠다 싶어서 mod를 찾아봤는데 썩 마음에 드는게 없더라고.
그런데 갑자기 이런 생각이 드는거야. 발매한지 2주밖에 안된 게임 mod가 700개가 넘어가는데 이렇게 많은 정도면 만드는게 엄청난 고급 기술이 들어가진 않을테니 한번 만들어볼까?
- 탐색
일단 아무것도 모르니까 mod 목록에서 가끔 코드 전체를 github에 공개한 것들을 슬쩍 구경했더니 정말로 솔루션, 프로젝트, c# 파일 하나로 구성했더라고. 아무래도 unity가 이런게 쉬운 편이라 그럴 수 있구나 싶었어.
게임에서 사용하는 함수를 사용하는건 dll 뷰어를 통해 개별적으로 찾아내는 수밖에 없나 봐. (게임사에서 제공해 줄 리가 없지..)
그래서 최근 dll 뷰어인 dnSpy를 설치해서 TeamSoda.Duckov.Core.dll 파일을 열 수 있었어. 거기엔 duckov에서 사용하는 많은 로직이 있었고, 현재 무게/최대 무게 부분을 찾아낸 상태라 이제 .NET dll 프로젝트만 만들어서 어디에 붙일 지 확인하기만 하면 되는 상황이야. 로직은 이런 식으로 생겼더라.
float num2 = num / this.MaxWeight;
WeightStates weightStates = WeightStates.light;
if (num2 > 1f) {
weightStates = WeightStates.overWeight;
}
else if (num2 > 0.75f) {
weightStates = WeightStates.superHeavy;
}
...
대충 무게 퍼센트를 구해서 100%이상이면 overWeight, 75%면 superHeavy 상태로 변경하는 간단한 로직으로 되어있었어. c#으로 만들어졌으니 저거 참고해서 unity.behavior 만들면 하루 이틀이면 뚝딱 나오지 않을까 싶음.
근데 dnSpy란 dll 뷰어쓰면서 참 잘만든 툴이라고 생각됐는데 한국어팩이 없는거야. 이게 없었다면 며칠은 고생했겠다 싶어서 작은 기여나 조금 해보려고 관련 repo에 들어갔더니 dnSpy는 좀 다르더라구.
- 기여 진행
MDN 페이지에서 번역 기여를 조금 해본 적이 있는데 몇번 하다가 때려친게 내 PR이 게으른 리뷰어를 만나면 몇 주동안 응답을 못받아서 그대로 남아있는게 좀 귀찮더라고.
그런 불편한 경험 이후로 아예 안하고 있던 중에 dnSpy는 다국어 문자열을 github에 PR방식으로 하지 않고, 외부 웹서비스를 사용하여 다국어 문자열 관리를 하는게 새로웠어. 이렇게 하니까 github 아이디만 연결해놓으면 해당 프로젝트에 훨씬 더 쉽게 기여가 가능했거든.
생각해보면 큰 회사들은 거의 다 내부에 다국어 텍스트 편집 툴이 존재하기 때문에 딱히 놀랍지는 않은데, 이렇게 공개된 서비스가 있고 이걸 이용해서 상용 서비스가 운영된다는게 대단한 것 같아. 조금 더 많이 알려지면 좋겠다는 개인적인 바람이 있어.
어쨌든 dnSpy 프로젝트의 한국어 테이블을 열어보니 2700개 정도의 텍스트 코드가 있었고, 진행도가 30%쯤인데 대부분 File 같은 쉬운 단어만 번역되어 있는 수준이라 실제로는 꽤 작업이 많았어. 에러 메시지를 어찌나 상세하게 써주시는지 참..
번역 중에 느낀건 내가 참 단어를 모호하게 아는게 많구나 싶었어. 예를 들어, property랑 attribute는 둘 다 대충 속성으로 번역되는데 동일하게 속성으로 해놓으면 사용자가 이게 property인지 attribute인지 모르잖아. 그래서 한참 고민하다가 이것저것 찾아봤는데, 저 단어들은 이런 문제가 있어서 property는 속성, attribute는 음차만 가져와서 어트리뷰트라고 쓴다고 하더라고.
역시 전문가들은 다르구나 싶더라. 이후에 그런 고민되는 단어들은 따로 메모장에 적어뒀다가 다 끝내서 퇴고할 때에 일률적인 번역을 위해 꽤 수정하기도 했어.
그렇게 금요일에 잠깐 손댔다가 주말 내내 해서 결국 2700개 전부 번역해서 100% 채움. 아무도 알아주진 않을테지만 뭔가 개인적인 업적을 달성한 느낌.
- 번역이 힘들었던 점
이런 프로그램 내의 텍스트 번역은 이게 어디서 사용되는 텍스트인지 모르니까 참 애매한 부분이 많았어. 예를 들어, Missing the file path 라고 되어있는 문장을 기계적으로 번역하면 "파일 경로가 없습니다", "파일 경로 없음", "파일 경로가 누락되었습니다", "파일 경로를 찾을 수 없습니다" 같이 여러 가지 뜻과 명사형, 문장형으로 바꿔서 번역할 수 있어.
만약 메뉴의 타이틀이면 명사형으로 끊는게 맞고, 툴팁이면 문장형으로 써줘야 하는데 이게 어디서 쓰일 지는 아무도 모른다는 거 ㅋㅋㅋ 그래서 영어 외 언어들을 번역해서 그 쪽이랑 거의 비슷한 느낌으로 쓰긴 했는데(특히 일본어는 우리나라와 어순도 비슷해서 큰 도움이 됨!) 이래서 번역해놓은게 어색한 문구가 나올 수 밖에 없겠구나 싶었어.
- 결론
1) 주말 다 지나고 나니까 휴일에 duckov만 종일 하려던 계획은 어디가고 내가 이걸 했나 싶은 마음은 듦..
2) 생각해보니 dnSpy(dll 뷰어) 프로그램에 한국어팩이 추가되어도 우리나라에서 쓸 사람이 몇 명이나 있을까 싶음 (1000명이라고 하면 너무 많은가..)
3) 다음 주에는 혼자 쓸 mod나 뚝딱거려야지
이전글: https://frogred8.github.io/
#frogred8 #duckov #dnspy
100% 완성한 모습
crowdin에서 기여도는 이렇게 표시됨
