한창 돌죽 확장 모듈 개발에 미쳐있었던 시절에 구상한게 하나 있음
#$ lab_magic_window_translate = true
#$ lab_skill_window_translate = true
#$ lab_interface_translate = true
#$ lab_ability_window_translate = true
위에 있는 것 같은 기능을 만들면서 인게임에 들어오는 텍스트를 실시간 치환하는 방법으로
번역이 충분히 가능하겠다는 가능성을 깨닫고 인게임 출력을 정교하게 구문분석/치환번역 할 수 있는
라이브러리를 만들면 실시간 치환출력이 가능하지 않을까? 라는 구상을 했었음
이 라이브러리는 일종의 자체 맵핑 언어를 통해 치환 번역을 실시하는데
추출부, 적용부에 맵핑 언어을 사용해 데이터를 추출/치환 과정을 명시하고, 라이브러리가 이것을 자동으로 연결하여 번역문을 만들어내는 방식임
간단한 돌죽 출력문을 통해 예시를 하나 들어보면
You see here a hand axe.
Found a scroll labelled LEM NIHESAO.
Found a stone staircase leading down.
1. 추출부
추출부는 다음과 같이 정의하고 해당 번역 모듈이 장착된 상태에서 게임을 하게 되면
FOUND_SCROLL1=Found a scroll labelled ${SCROLL_NAME}.
번역 데이터베이스에
FOUND_SCROLL1.SCROLL_NAME
LEM NIHESAO
DAE CHUNG
SCRALNA ME
뭐 이런식으로 스크롤 문자가 차곡차곡 쌓이게 됨
이건 번역 참여자들이 번역을 해줘야하는 원자 단어 뭉치이고
추출부의 중첩 적용에 대해서는 일단 깊게 생각은 안해봄
미치광이 이우프가 "우헤헤"라고 말했다.
미치광이 이우프가 "나는 세상의 진리에 대해서 모르는게 없지!"라고 말했다
미치광이 이우프가 "나는 고대 철학에 대해서 모르는게 없지!"라고 말했다
<추출부 중첩이 필요한 예시 한가지>
FOUND_SCROLL1.SCROLL_NAME
LEM NIHESAO : 룬문자1
DAE CHUNG : 대충
SCRALNA ME : 스크롤이름
<번역 예시>
2. 번역부
FOUND_SCROLL1=${SCROLL_NAME} 라벨이 붙은 스크롤을 발견했다.
이렇게 번역을 추가하면 번역 라이브러리가 자동으로
룬문자1 라벨이 붙은 스크롤이 발견했다.
이런식으로 번역하게끔 만들 예정.
웹핵의 경우 웹 인터페이스에 번역을 위한 모듈을 붙일수 있는 형태이므로
번역 권한자가 실시간으로 추출부/번역부를 등록 갱신하면서 게임을 진행할 수 있도록 만들면 게임하면서 번역할 수 있기도 하고
바로바로 적용을 확인하면서 번역할 수 있으니 빠른 번역이 이루어질 수 있을 것이라고 생각함
3. 번역 커스텀 스크립트
고퀄 번역을 위해서는 조사처리가 필수인데 그 밖에 추출부의 데이터베이스 저장전 선행 처리에도 커스텀 스크립트 기능이 필요하다고 예상됨
You see here a hand axe.
이걸 예로 들면
추출부
YOU_SEE_HERE1=You see here ${GENERIC_ITEM}.
번역부 #1
YOU_SEE_HERE1=당신은 ${GENERIC_ITEM}이/가 보인다.
번역부 #2
YOU_SEE_HERE1=당신은 ${GENERIC_ITEM}#KOREAN_JOSA1($1)가 보인다.
번역부 #1의 방식보다
번역부 #2와 같이
#FUNCTION_NAME($숫자)와 같은 식으로 프로그래밍 언어에서 음운분석을 통해 알아서 조사를 끼워넣는 함수를 번역부에 사용가능하도록 커스텀 스크립트를 지원하거나
* $숫자는 N번째 ${} 참조물을 반환
데이터베이스에 저장하기 전 a, the같은 정관사를 빼고 저장할 필요등이 있는 경우 GENERIC_ITEM 함수를 선언해놓으면 저장 전에 선처리 과정(정관사를 제거하는)을 한번 거치게 하는 등의 용도로 쓸 수 있는 기능들의 지원도 생각해봤었고 ㅇㅇ
.................................................................................................................
아무튼 이 방법은 사람 손이 많이 들어가기는 할텐데 텍스트 치환을 통해 번역이 진행되므로 유지 보수 비용(매 버전 갱신시마다 새로 컴파일을 해야하네 말아야하네)이 적고, 프로그래머가 소스를 번역하느라 인게임 스트링을 헤집어 놓고 추가 번역 처리 코드를 삽입하면서 발생하는 오류등에서 자유롭고
철저히 게임을 블랙박스의 관점으로 바라보고 번역을 진행하므로 게임을 순정 상태로 남겨먹을수 있는 장점이 있음
일단 웹핵부터 다 만들어야 하던지 말던지 할텐데 ㅋㅋㅋ
갤에 전에 넷핵 번역하던 사람 오기도 했고
웹핵 코드 잡다가 토악질나와서 잠깐 짧게 머리식힐겸 생각 정리해봤다
대충 쓴거라 두서없는건 양해좀
블랙박스가 뭔지 검색하고 왔네 먼소린가 했당
근데 저 기능들 요즘 쓰는거보면 스펠파워가 안보인다거나 숫자가 밀린다거나 하는 게 요즘 있는거같어
4년전 .18 버전 기준으로 만든건데 저건 하드코딩으로 조잡하게 만들기도 했고 버전업되면서 인터페이스 배치가 조금 바껴서 요즘 버전에서는 어긋나게 보이는듯함
문제는 넷핵은 기본 소스에 임베디드 스크립트가 됐건 확장이 안 되어 있어서 버젼이 올라갈 때마다 저걸 다시 구현해줘야 하는 거 아님? 근시안적으로 현재 버젼만 번역하거나, 아니면 넷핵 개발진들 눈에 띄어서 프로젝트랑 통합되면 상관 없지만. 번역 프로젝트 관리자가 손 놓으면 계속 방치될 거임. 넷핵 소스 잠깐 봤을 때 드는 생각이 단순하게 소스에서 you나 출력 문자열만 뽑아서 DB로 만들고 번역해서, 나중에 버젼 올라가고 소스 바뀌어도 퍼지 서치로 자동 번역하게 툴 만드는게 더 편할 걸?
넷핵은 블랙박스로 두고 웹핵단에서 구현하는건데 한번 구현하면 버전업에 따라서 추가되는 구문이나 단어만 추가번역하면 되고 구현할 필요 없음, 웹핵은 본진 합치는거 생각중이지만 번역 모듈은 생각 없음. 내가 손 놔도 프론트엔드에서 동립적으로 작동하기 때문에 지금 웹죽 번역 스크립트가 버전이 앞자리가 바뀌었는데 수정 한번도 없이 0.18버전부터 지금까지 작동은 하는 것처럼 적당히 잘 돌아갈거임
더해서 퍼지서치로 번역하는것이 훨씬 근시안적인 방법이라고 생각함. 한 버전만 딱 번역하고 말 생각이면 편하기는 훨씬 편할듯. 근데 그 방식은 단순 치환으로만 하면 번역 퀄이 떨어지고 추가로 조사나 연결어같은거 깔끔하게 번역하겠다고 손대면 그 버전 이상 지원하기 힘들듯함
https://gall.dcinside.com/board/view/?id=rlike&no=320970
시간이 나면 한 번 시도해보는 것도 나쁘지는 않을듯. 그런데 게임에서 인터렉티브 번역은 성공할 지는 잘 모르겠음. 번역자가 텍스트만 보고 번역을 하는 것과 게임을 하면서 번역을 하는 것은 현실적으로 괴리가 크고 비효율적일 거임. 검수자 입장이라면 좋겠지만 번역이랑 검수랑은 다른 영역이니까
그건 사례가 좀 없어서 실제로 부딪쳐봐야 알게 될듯? 그런다고 무조건 게임을 하면서 번역해야게끔 만들 생각은 없으니 큰 문제는 없을듯함. DB에 수집된 영문 출력 문장은 그것만 보고 번역할수 있게 만들어 볼 생각이고. 말한 것처럼 검수 & 유지보수 측면에 힘을 주기 위해 만드는 기능이 맞음.
그리고 의외로 유저 상황이랑 잘 맞아떨어져서 일반 유저도 게임 하다가 한두문장씩 번역 일손 도와주면 금상첨화고.
음..뭔지 모르겠지만 들을 가치가 있는 내용이었다
넷핵은 안하지만 틈틈이 번역은 도와줄수있음 - dc App