번역 - solaris0115/RimWorldModGuide GitHub Wiki

번역

이 챕터에서는 만들어진 모드에 언어를 추가하는 방법에 대해 다룹니다.

1. 폴더 추가

번역 하기에 앞서 번역 데이터가 들어갈 폴더를 만들어 줍니다.

  • Plauge
    • About
    • Defs
    • Languages
      • English
        • Keyed
          • Weapon.xml
          • Research.xml
      • Korean
        • Keyed
          • Weapon.xml
          • Research.xml

만약 더 다양한 언어를 추가하고 싶다면 위와같이 해당 국가 폴더를 만들고 그 안에 번역 데이터를 넣어주면 됩니다.

2. 번역하기

번역은 크게 두가지입니다.
기존에 데이터를 번역하는 일과 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라고 정의된 아이템의 각 하위 정보들에 대해서 각각 labeldescription키워드를 통해 한국어로 번역되어 있습니다.
만약 추가하지 않은 부분들은 해당 정의 파일에 있는 언어 그대로 출력하게 될 것 입니다.

두번째 방법은 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 })은 번역파일을 불러올때 코드상에서 데이터를 같이 넘겨줍니다.

  1. 발사체.라벨
  2. 적중한 폰.라벨

즉 XML 번역 파일의 {0}은 {1}을(를) 성공적으로 감염 시켰습니다!의 {0}은 발사체.라벨, 즉 발사체 이름이 들어가고 {1}에는 적중한 폰의 이름이 들어갑니다.
따라서 출력시 "역병탄환수사슴을(를) 성공적으로 감염 시켰습니다!"라는 메세지가 출력될 것 입니다.

수고하셨습니다. 이제 모드로써 가장 기본적인 것들을 마치셨습니다. 하지만 이것으로 모드제작이 끝난 것은 아닙니다. 다음으로 넘어가 끝을 맺어줍시다.

다음: 마무리

⚠️ **GitHub.com Fallback** ⚠️