이번에는 곧 나오게 될 이베리아 미션 트리, 아트로파테네 미션 트리 재작업, 새로운 유산, 마지막으로 Raichuu가 번역 속도 향상을 위해 작성한 스크립트를 소개할 거임
우선 이베리아로 시작하겠음
(역주: 이 이베리아는 히스파니아라고도 불리는 현대 스페인과 포르투갈이 위치한 반도와는 이름만 같고 다른 지역이다
개발일지 한국어 번역 넘버링에는 헷갈리지 않도록 현대 명칭인 조지아라고 적었으니 참고)
이베리아
1.6 업데이트부터는 코카서스 지역에서도 미션 트리를 사용할 수 있을 거임
그 중에서도 첫 번째로 완성된 "이베리아 왕들의 흥기"를 보여주겠음
이 미션 트리는 햇빛이 내려쬐는 히스파니아 반도가 아니라 산악 국가 이베리아와 그곳의 개혁 군주에 대해 다룸
미션 트리의 14개 미션에는 이베리아의 불안정한 정치적 상황을 구현하고자 했던 바닐라의 이베리아 이벤트들을 충실하게 보충해줌
따로 해금해야 하는 미션들 대신 모든 통치자가 사용할 수 있는 공용 미션부터 살펴보겠음
왼쪽에는 같은 아르마지교 형제들을 희생시켜서 성장할 수 있는 연속적인 정복 미션이 있음
스크린샷에서 아르마지교 신앙을 공유하는 국가들을 확인할 수 있음
(역주: 중세 시대의 조지아 연대기Georgian Chronicles에 따르면 아르마지Armazi는 기독교화 이전 조지아인들의 최고신이었다고 한다)
첫 번째 미션에서 볼 수 있듯이 플레이어의 나라는 종교를 공유함에도 불구하고 적대적인 국가들에게 둘러싸여 있음
바로 흑해 연안의 비우호적인 공화국들, 서쪽에는 콜키스 왕국, 동쪽에는 사나운 알바니아 부족들을 말하는 거임
(역주: 여기에 언급되는 알바니아도 아드리아 해의 알바니아와는 이름만 같고 다른 지역이다)
모두가 아르마지 신을 숭배하지만 아직 정치적으로 통일되어 있지는 않음
남쪽에는 항상 거대한 괴물 아르메니아의 위협이 존재하고 있으며 이에 대한 미션도 있지만 먼저 동료 신자들을 많이 복속시켜야 할 거임
알바니아인들을 정복했다면 그들을 하나도 남김없이 전부 직접 지배할 것인지, 아니면 봉신으로 해방시킬 것인지 결정해야 함
이웃들과 전쟁을 하지 않을 때는 이 지역의 이름난 포도주를 생산할 시설을 건설할 수도 있음
(역주: 조지아는 고대부터 포도주가 유명했으며 지금도 많은 와인을 생산하고 있다)
콜키스인들과 파시스(Phasis) 시민들을 그들의 항구 도시에서 쫒아내면, 전통적으로 산악 민족이었던 이베리아인들은 역사에 길이 남을 첫 번째 영해를 가지게 됨
이베리아인들은 마치 돌고래처럼 적당한 행운을 가지고 바다로 다이빙할 거임
미션 트리의 오른쪽 루트는 이베리아의 통치자가 파르나바즈 왕조를 세운 파르나바즈(Pharnavaz) 1세일 때만 사용할 수 있음
게임이 시작되고 2년 후 이베리아에 연속적인 바닐라 이벤트가 발생하여 (플레이어의 선택에 따라)파르나바즈가 정권을 장악하는 것으로 끝나게 됨
찬탈자의 찬탈을 허용하지 않을 수도 있고, 그렇게 해도 정복 미션은 사용할 수 있음
하지만 역사의 발자취를 따라 이 전설적인 군주가 아르마지스치헤(Armazistsikhe)에서 권력을 잡도록 한다면 플레이어는 이베리아 왕국을 영원히 바꾸게 될 거임
(역주: 당시 이베리아 왕국의 수도였던 아르마지스치헤는 "아르마지의 성"이라는 뜻이며 현대의 므츠헤타Mtskheta이다)
새로 왕위에 오른 자가 마땅히 가장 먼저 해야 할 일은 바로 현지의 지원을 강화하는 거임
따라서 파르나바즈는 그의 이름으로 통치할 권리를 가진 "에리스타비(eristavi)"라는 특별한 지방관직을 임명하게 됨
(역주: 에리스타비는 조지아의 봉건적 관직으로 보통 비잔티움 제국의 스트라테고스와 동일시되었다)
그 후 파르나바즈는 "고유 언어" 미션에서 조지아 문자를 창제하고(실제로 그가 만들었다는 전설이 있다), 공용어 정책을 실시함으로써 관료제를 개혁하게 됨
또한 플레이어는 수도에 방어 시설을 건설할 수도 있는데, 이게 바닐라 이베리아의 수도 개발 이벤트와 시너지를 내서 산악 요새를 공격하려는 침략자들에게 막강한 방어력을 맛보여줄 수 있음
만약 파르나바즈 1세가 죽기 전까지 그의 모든 업적을 완수했다면 보상으로 파르나바즈 왕조의 혈통을 받게 됨
파르나바즈 1세는 그의 치세 동안 언어와 문자를 정비했고, 이베리아를 안정시켰으며, 다음 500년 동안 이어질 왕조를 세웠음
이 혈통은 파르나바즈 1세의 타고난 정치적 재능을 반영한 거임
혈통 아이콘을 만들어 준 CrazyZombie에게 감사를 표하겠음
이제 OmegaCorps의 파트로 넘어감
아트로파테네
지난 1.5 업데이트의 앙상하지만 많은 정복, 종교, 기타 등등 미션이 있는 아트로파테네 미션 트리를 기억할 거임
이제 더욱 새로워지고 개선된 (하지만 아직은 작업 중인)아트로파테네 미션 트리를 보여주겠음
지난 번의 아트로파테네 미션 트리를 되짚어봤는데, 작지만 중요한 것들이 빠져 있다는 생각이 들었음
다른 페르시아, 이란계 미션 트리와 차별화되는 뭔가 메디아스러운 요소가 정말로 필요하다고 느꼈음
기존의 아트로파테네 미션 트리는 너무 정복 위주였지만, 새로운 미션 트리는 정복을 해야만 하는 타당한 이유와 흥미로운 결과, 보상을 해당 지역에 제공하게 됨
前 아마르디오이족 문명화 미션
이 미션은 히르카니아 지역의 문화적, 경제적 이익을 가져다줄 뿐만 아니라, 카스피 해에 인접한 개척되지 않은 온대 우림을 탐험할 수 있게 해줌
이에 대한 결정과 그 다음에 발생할 이벤트는 플레이어의 보물 창고에 넣을 수 있는 특별한 보물을 제공함
前 메디아 삼각형 미션
한때 메디아인들이 이란 고원 중부를 지배하고 있었을 때, 고대 도시 엑바타나(Ecbatana), 라이(Ray), 아스파다나(Aspadana), 카샨(Kashan)을 통해 권력을 행사했음
이제 이 도시들을 개발하여 하나의 도시권(metropolitan)으로 만들 수 있게 되었음
이 도시들과 관련된 눈여겨볼 결정도 있음
"붉은 도시" 미션을 완료하면 라이 북쪽의 청금석 산을 채굴하여 희귀한 무역품의 효과를 받을 수 있음
앞으로 아트로파테네의 정보가 더 공개될 거임
새로운 유산
유산 추가 계획은 계속 진행되고 있으며 이번에는 일리리아 국가들이 그 대상임
이 유산들에 익숙해지기를 바람
아브리아(Abria)
다오르시아(Daorsia)
에피다우룸(Epidaurum)
델마티아(Delmatia)
리부르니아(Liburnia)
히스트리아(Istria)
자동 번역 스크립트
(역주: 난 코딩은 문외한이니 이건 패스하겠음
인빅투스의 컨텐츠가 너무 많아 일일히 번역하는 건 불가능하다 보니 구글 번역기를 사용해서 자동 번역 스크립트를 만들었다고 함)
Hello, it’s me, Raichuu (aka Mikail in real life)! I am a Day 1 player of Imperator Rome and truly love the game. I am thankful for the additions from Invictus but the translation in German was really bad. That’s why I have joined the team and fixed the translation. Before, the German translation was outdated and no longer maintained - causing new content to show variable names in the game instead of actual words and sentences. There is so much added content in Invictus that it is not feasible to translate everything manually.
Therefore, I have created a little Python script which automatically translates the language text files of one source language (in this case, English) to another target language for all the available language text files. It is inspired by another git project called “ck3_ml_translator” which uses Google Translator to translate the text files. However, it is not so well written and runs very slow. The creator claims that it needs 2 seconds per translation.
Thus I have written my own approach which I already created for my previous work: An asynchronous translator using Google Translator with multiple proxies. It runs 25 times faster than the ck3_ml_translator and completes a full translation run in about 45 minutes. Asynchronous programming is very beneficial for Input/Output-bound code. In our case it means that we already send the next pending requests to Google to translate without waiting for a response first. This way, the waiting time between “I send the request” and “I have the response” is used efficiently to continue with the rest of the code in the meantime until a response is received. I have picked a few random samples out of the German translation and even for previously existing manual translations, the new translation sounds better, it is an overall great result. This would allow us to also use it for any other language that Invictus isn’t supporting yet or no longer have maintainers for. Let me know if there is enough interest! For now, it will only be used for the German translation for each update to ensure that everything is properly translated.
In the remaining part I will talk about the technical details for people who are interested. Firstly, the script accepts two run parameters: The source language (default English) and the target language (default German). Then the script looks for all the files in the source language’s folder including its subfolders and keeps track of them with an absolute path created by a relative pathing from the script’s file location to ensure consistency across different operating systems. After that, each file (YML format) is loaded and prettified to clean out the game-specific tags and placeholders, resulting in a final list of text with a corresponding list of tags. One difficulty here was that the YML files were not following the correct format, so I had to first manually rerun the script multiple times and fix the errors on loading each YML File until there were no more errors. This is hopefully only a one time issue, as long as everyone in the team follows the right format from now on.
Now that we have the list of text to translate in a clean state, we can create the pending future tasks for Python’s built-in module asyncio to work through the tasks in an asynchronous manner, see the translate_batch function below.
However, we have to fake our identity for Google to avoid being blocked after that many requests. That’s why we do not send individual requests but instead create client sessions. Each client session contains a randomly selected user agent which contains meta information to spoof our identity. On top of that, each client session runs through a randomly selected SOCKS5 proxy (I have 100 paid SOCKS5 proxies in a list). This way the client’s IP address is different, see the create_session function below.
To make sure that we regularly create a new client session, we have to chunk the future tasks in multiple sets of roughly the same size. In our case, every 15 tasks/requests, a new client session will be created for another user agent and proxy.
For the request I use the mobile website of Google Translator because it contains much less HTML content. Once the response has arrived, the response’s HTML content is parsed with BeautifulSoup4 and the translated text is extracted through a CSS selector. That translated text is then manipulated with the previously extracted game-specific tags for the final text, see the function translate_async below.
Once all the translation tasks for a file are completed and the final text output is all together in one list, the data is saved in a proper YML format in the corresponding file associated with the right variable name for mapping the translation. If the file doesn’t exist yet, it will be automatically created. If it already exists, it will be overwritten. The filename is identical to the source’s language except that the suffix has changed to the target language, e.g. a file “xyz_english.yml” is changed to “xyz_german.yml” in the case of an English->German translation. Of course the root folder location would also be changed from english/ to german/.
This is essentially a really great and easy way to automatically translate and sync-up the translated content with the original content which is written in English - as long as Google Translator does a good job in translating of course :)
-끝-
https://forum.paradoxplaza.com/forum/threads/mod-imperator-invictus.1473328/page-61#post-28740024
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.