번역 - solaris0115/RimWorldModGuide GitHub Wiki
이 챕터에서는 만들어진 모드에 언어를 추가하는 방법에 대해 다룹니다.
번역 하기에 앞서 번역 데이터가 들어갈 폴더를 만들어 줍니다.
- Plauge
- About
- Defs
-
Languages
-
English
-
Keyed
- Weapon.xml
- Research.xml
-
Keyed
-
Korean
-
Keyed
- Weapon.xml
- Research.xml
-
Keyed
-
English
만약 더 다양한 언어를 추가하고 싶다면 위와같이 해당 국가 폴더를 만들고 그 안에 번역 데이터를 넣어주면 됩니다.
번역은 크게 두가지입니다.
기존에 데이터를 번역하는 일과 C#에서 Translate를 통해 불러오는 번역.
우선 공통적으로 언어 데이터는 아래와 같은형식을 갖습니다.
<?xml version="1.0" encoding="utf-8" ?>
<LanguageData>
...
</LanguageData>
우선 XML로 정의된 데이터를 번역하는 방법을 보겠습니다.
아래는 림세널
모드의 번역 데이터입니다.
정의 파일
<thingDef ParentName="BaseYPGun">
<defName>YP_SeoLi</defName>
<label>YP shard rifle</label>
<description>Compared to a conventional assault rifle, the Yunwha Precision 'Seoli(Frost)' shard rifle is equipped with a larger clip and a higher rate of fire. However, to achieve this the rifle sacrifices damage and armor piercing capability.</description>
<graphicData>
.
.
.
<tools>
<li>
<label>stock</label>
...
</li>
<li>
<label>barrel</label>
...
</li>
</tools>
</thingDef>
번역 파일
...
<YP_SeoLi.label>YP 파편 소총</YP_SeoLi.label>
<YP_SeoLi.description>연화 정밀의 "서리" 파편 소총은 재래식 돌격소총에 비해 장탄량이 많고 연사속도도 높습니다. 하지만 이를 위해 화력과 사거리, 장갑 관통 능력을 희생해야만 했습니다.</YP_SeoLi.description>
<YP_SeoLi.tools.0.label>개머리판</YP_SeoLi.tools.0.label>
<YP_SeoLi.tools.1.label>총신</YP_SeoLi.tools.1.label>
...
YP_SeoLi
라고 정의된 아이템의 각 하위 정보들에 대해서 각각 label
과 description
키워드를 통해 한국어로 번역되어 있습니다.
만약 추가하지 않은 부분들은 해당 정의 파일에 있는 언어 그대로 출력하게 될 것 입니다.
두번째 방법은 C#에서 프로그래밍 된 개체로 불러오는 번역 데이터입니다.
우리는 C#프로그래밍 챕터에서 적은 코드가 기억날 것 입니다.
Messages.Message("TST_PlagueBullet_SuccessMessage".Translate(new object[] { this.launcher.Label, hitPawn.Label}), MessageTypeDefOf.NeutralEvent);
...
MoteMaker.ThrowText(hitThing.PositionHeld.ToVector3(), hitThing.MapHeld, TST_PlagueBullet_FailureMote".Translate(Def.AddHediffChance), 12f);
자세히 보시면 "블라블라"다음 .Translate(머시기저시기)
가 공통적으로 적혀있는 것을 알 수 있습니다.
이는 코드레벨에서의 문자열 데이터를 XML번역 데이터를 참조하여 출력하겠다는 것입니다.
만약 해당 번역 파일이 없다면 예외 처리를 하기 때문에 약간의 속도 저하를 불러올 수 있습니다.
코드레벨에서의 번역에 쓰이는 Translator.Translate(string)에 대해서는 다른 페이지에서 다루도록 하겠습니다.
즉 TST_PlagueBullet_SuccessMessage
에 대한 번역 데이터를 찾아보고 없다면 그대로 출력한다는 것입니다.
따라서 우리는 각각의 두 문자열
TST_PlagueBullet_SuccessMessage
TST_PlagueBullet_FailureMote
에 대한 번역을 추가해주어야 합니다.
아래와 같이 추가 해줍니다.
<?xml version="1.0" encoding="utf-8" ?>
<LanguageData>
<TST_PlagueBullet_FailureMote>감염 실패: {0}의 확률</TST_PlagueBullet_FailureMote>
<TST_PlagueBullet_SuccessMessage>{0}은 {1}을(를) 성공적으로 감염 시켰습니다!</TST_PlagueBullet_SuccessMessage>
</LanguageData>
작성중 아마 {숫자}
에 대한 궁금증이 생기셨을 것입니다.
{num}
개체는 번역데이터로부터 어떤 정보들을 받아와 순차적으로 나열해줍니다.
TST_PlagueBullet_SuccessMessage
의 코드에서 자세히 보시면
Translate(new object[] { this.launcher.Label, hitPawn.Label })
가 보이실 것 입니다.
뒤에 (new object[] { this.launcher.Label, hitPawn.Label })
은 번역파일을 불러올때 코드상에서 데이터를 같이 넘겨줍니다.
- 발사체.라벨
- 적중한 폰.라벨
즉 XML 번역 파일의 {0}은 {1}을(를) 성공적으로 감염 시켰습니다!
의 {0}은 발사체.라벨, 즉 발사체 이름이 들어가고 {1}에는 적중한 폰의 이름이 들어갑니다.
따라서 출력시 "역병탄환은
수사슴을(를) 성공적으로 감염 시켰습니다!
"라는 메세지가 출력될 것 입니다.
수고하셨습니다. 이제 모드로써 가장 기본적인 것들을 마치셨습니다. 하지만 이것으로 모드제작이 끝난 것은 아닙니다. 다음으로 넘어가 끝을 맺어줍시다.
다음: 마무리