목차

이전 항목

텍스트

다음 항목

디스플레이어블

링크


원문 보러 가기
오역 신고하기
Created using Sphinx.

번역

렌파이에는 비주얼 노블을 번역할 때 필요한 체계적인 틀이 갖추어져있습니다. 번역할 수 있는 대상에는 크게 네 가지 종류가 있습니다.:

대사
스크립트의 주요 대사들을 자르거나 붙이거나 빠뜨리거나 대사 순서를 바꾸어 번역할 수 있습니다.
선택지 및 인터페이스 문자열
인터페이스의 글자는 전부 번역할 수 있습니다.
이미지와 파일
특정 언어가 선택되었을 때 사용할 다양한 이미지 및 여러 파일을 포함시킬 수 있습니다.
스타일
사용할 언어에 따라 스타일을 바꿀 수 있으며, 따라서 선택된 언어에 알맞은 폰트를 게임에서 자동으로 선택하게 됩니다.

렌파이의 번역 지원 기능은 현재 게임 제작자가 게임 스크립트를 번역가에게 전달하거나 제작자가 번역 서식을 생성하는 등의 공식 번역 쪽에 중점을 두고 있습니다. 비공식 번역에 대한 지원은 이보다 더 제한적입니다.

기본 언어 및 대체 언어

렌파이에서는 하나의 주 언어로 각 게임 스크립트가 작성되었다고 예상합니다. 실제로 어떤 언어인지에 관계 없이 이 기본 언어를 None 언어라고 부릅니다. (예를 들어 게임이 영어로 작성되었다면 영어는 None 언어가 됩니다.)

None 언어가 선택되었다면 렌파이의 번역 기능은 대부분 비활성화합니다.

대체 언어는 파이썬 식별자로도 쓰이는 이름을 참조합니다. (파이썬 식별자들은 밑줄이나 문자로 시작하여 뒤에 문자, 숫자, 밑줄들이 따라 붙습니다.)

번역 파일 만들기

프로젝트의 스크립트가 있을 경우, 렌파이 런처에서 프로젝트를 열고 "번역 파일 만들기" 를 누르면 번역 파일이 만들어집니다. 번역 파일에서 사용할 언어를 런처에 입력하면 번역 파일을 만들거나 수정하게 됩니다.

번역 파일은 game 디렉토리의 하위 디렉토리인 "tl" 폴더에 있습니다. 예를 들어 tutorial이라는 프로젝트를 피그 라틴으로 번역한다면 번역 파일은 tutorial/game/tl/piglatin 에 배치됩니다.

게임 스크립트 파일 당 하나의 번역 파일이 만들어집니다. common 코드에 적혀 있는 문자열 번역하기 위한 common.rpy 파일도 생성됩니다.

대사 번역하기

렌파이는 비주얼 노블 엔진이므로 대부분의 경우에 대사를 번역하게 될 것입니다. 렌파이에는 문장을 나누거나 붙이거나 문장 순서를 바꾸거나 혹은 문장 전체를 빠뜨릴 수도 있을 정도로 유연한 틀이 갖추어져있습니다.

번역 뭉치

번역의 기본 뭉치는 빈 문장이나 번역할 수 있는 문장이 포함된 하나의 블록입니다. 번역할 수 있는 명령문은 voice 문과 nvl 문입니다. 아래의 게임을 예로 들어보겠습니다.:

label start:
    e "Thank you for taking a look at the Ren'Py translation framework."

    show eileen happy

    e "We aim to provide a comprehensive framework for translating dialogue, strings, images, and styles."

    e "Pretty much everything your game needs!"

이 스크립트는 여러 개의 번역 뭉치로 나눌 수 있습니다. 각 뭉치에는 뭉치가 속한 레이블에서 만들어진 식별자와 개체 안에 있는 코드가 있습니다. (만약 여러 개의 뭉치가 똑같은 번역 번호를 배정받는다면 이를 구분하기 위해 두 번째 뭉치부터 마지막 뭉치에 일련 번호가 붙습니다.)

위에 있는 예제에서 첫 번째로 만들어진 뭉치에는 start_636ae3f5 라는 식별자가 붙으며, 이 첫 번째 뭉치에는 다음 명령문이 들어가게 됩니다.:

e "Thank you for taking a look at the Ren'Py translation framework."

두 번째 뭉치에는 start_bd1ad9e1m 라는 식별자가 붙으며 아래의 명령문이 들어가게 됩니다.:

e "We aim to provide a comprehensive framework for translating dialogue, strings, images, and styles."

세 번째 뭉치에는 start_9e949aac 식별자가 붙으며 아래의 명령문이 들어가게 됩니다.:

e "Pretty much everything your game needs!"

이 뭉치들은 게임 스크립트를 불러왔을 때 렌파이에서 자동으로 만들어집니다.

translate 문

번역 파일을 만들 때 렌파이는 각 번역 뭉치에 대응하는 translate 문을 만듭니다. 위에 있는 스크립트를 번역할 때 렌파이는 다음과 같은 translate 문을 만들어냅니다.:

# game/script.rpy:95
translate piglatin start_636ae3f5:

    # e "Thank you for taking a look at the Ren'Py translation framework."
    e ""

# game/script.rpy:99
translate piglatin start_bd1ad9e1:

    # e "We aim to provide a comprehensive framework for translating dialogue, strings, images, and styles."
    e ""

# game/script.rpy:101
translate piglatin start_9e949aac:

    # e "Pretty much everything your game needs!"
    e ""

이 문장들은 만들어진 스크립트를 수정하여 번역할 수 있습니다. 번역을 마치면 다음과 같은 모습이 될 것입니다.:

# game/script.rpy:95
translate piglatin start_636ae3f5:
    # e "Thank you for taking a look at the Ren'Py translation framework."
    e "Ankthay ouyay orfay akingtay away ooklay atway ethay En'Pyray anslationtray ameworkfray."

# game/script.rpy:99
translate piglatin start_bd1ad9e1:

    # e "We aim to provide a comprehensive framework for translating dialogue, strings, images, and styles."
    e "Eway aimway otay ovidepray away omprehensivecay ameworkfray orfay anslatingtray ialogueday, ingsstray, imagesway, andway ylesstay."

# game/script.rpy:101
translate piglatin start_9e949aac:

    # e "Pretty much everything your game needs!"
    e "Ettypray uchmay everythingway ouryay amegay eedsnay!"

주요 스크립트에 있는 블록이 등장하면 렌파이는 해당 블록에 대응하는 translate 문이 있는지 찾아봅니다. translate문이 있다면 원래 문장 대신 translate 문을 실행해 사용자에게 번역문을 보여줍니다.

고급 번역 기능

translate 문에는 원어의 문장과 1대 1로 대응하는 번역문을 입력하지 않아도 됩니다. 예를 들면 긴 문장은 자를 수 있습니다.:

# game/script.rpy:99
translate piglatin start_bd1ad9e1:
    # e "We aim to provide a comprehensive framework for translating dialogue, strings, images, and styles."
    e "Eway aimway otay ovidepray away omprehensivecay ameworkfray..."
    e "...orfay anslatingtray ialogueday, ingsstray, imagesway, andway ylesstay."

혹은 하나의 명령문을 pass 문으로 교체하여 제거할 수도 있습니다.:

# game/script.rpy:101
translate piglatin start_9e949aac:

    # e "Pretty much everything your game needs!"
    pass

조건문이나 파이썬 코드처럼 대사가 아닌 명령문을 실행하는 것도 가능합니다. 예를 들어, 아래와 같은 스크립트는:

e "You scored [points] points!"

다음처럼 번역할 수 있습니다.:

# game/script.rpy:103
translate piglatin start_36562aba:

    # e "You scored [points] points!"
    e $ latin_points = to_roman_numerals(points)
    e "Ouyay oredscay [latin_points] ointspay!"

번역한 대사를 수정할 때, 특히 하나의 레이블 안에서 여러 번 반복되는 대사를 수정할 때는 유의하시기 바랍니다. 어떤 경우에는 다음과 같은 명령문을 사용하여 번역 식별자를 직접 배정해야 할 수도 있습니다.:

translate None mylable_03ac197e_1:
    "..."

레이블을 추가하는 것도 번역 과정을 혼란스럽게 할 수 있습니다. 이를 방지하기 위해 레이블에 hide 절을 입력하면 번역 코드에서 무시됩니다.:

label ignored_by_translation hide:
    "..."

번역 블록에는 파이썬 코드를 입력할 수도 있으나, 이 코드로 인해 블록 외부에서 부수 효과를 일으켜서는 안 됩니다. 언어를 바꾸면 번역 블록을 재시작하여 부작용을 여러 번 발생시키기 때문입니다.

선택지 및 문자열 번역

렌파이에서는 대사 이외에도 선택지나 기타 문자열에서 발견되는 텍스트를 번역할 수 있습니다. 인터페이스 번역문은 원문과 1 대 1 로 대체됩니다. 문자열이 발견될 때에는 항상 하나의 번역문으로 교체됩니다.

번역 파일을 만들어낼 때에 렌파이는 스크립트 파일을 살펴봐서 _() 함수 안에 있는 문자열과 선택지를 찾아냅니다. 그 뒤 발견한 문자열을 번역 문자열 블록에 입력합니다. 예를 들어 다음과 같은 스크립트가 있을 때:

define e = Character(_("Eileen"))

# ...

menu:

     "Go West":
        # ...

     "Head East":
        # ...

렌파이는 다음과 같은 코드를 만들어냅니다.:

translate piglatin strings:

    old "Eileen"
    new ""

    old "Go West"
    new ""

    old "Head East"
    new ""

이는 다음처럼 번역할 수 있습니다.:

translate piglatin strings:

    old "Eileen"
    new "Eileenway"

    old "Go West"
    new "Ogay Estway"

    old "Head East"
    new "Eadhay Eastway"

문자열 번역문은 대사로 번역되지 않은 대사 문자열에도 적용됩니다.

코드의 여러 곳에서 같은 문자열이 사용되었을 때에는 {#...} 텍스트 태그를 사용해 문자열을 구분할 수 있습니다. 게임에서 표시될 때에는 모두 동일하게 표시되나, 렌파이는 이 문자열들을 번역을 위해 구분된 문자열로 간주합니다.

"New"
"New{#project}"
"New{#game}"
"New{#playlist}"

translate 문자열 명령문은 또한 None 언어를 번역할 때에도 사용할 수 있습니다. 게임이 비영어권 언어로 만들어진 경우에 렌파이 UI를 번역하는 경우에 활용하면 됩니다.

translate None strings:
     old "Start Game"
     new "Artstay Amegay"

치환 문자열 번역하기

치환 문자열은 !t 라는 변환 플래그를 사용하여 번역할 수 있습니다. 그러므로 아래의 코드는 대사와 코드 번역 시스템을 이용하여 번역됩니다.:

if mood_points > 5:
    $ mood = _("좋다")
else:
    $ mood = _("끔찍하다")

"기분 참 [mood!t]."

이미지 및 파일 번역

게임을 번역 할 때에는 어떤 파일을 번역한 버전으로 교체해야 하는 경우도 있습니다. 예를 들어 그림에 글자가 있다면 다른 언어로 번역된 글자가 있는 이미지로 교체해야 할 것입니다.

렌파이는 번역 파일 디렉토리에서 이미지를 검색해 관리합니다. 예를 들어 "piglatin" 언어를 사용하고 있고 "library.png" 파일을 로드했다면 렌파이는 "game/library.png" 파일 대신에 "game/tl/piglatin/library.png" 를 사용합니다.

스타일 번역

게임을 번역할 때에는 스타일, 그 가운데에서도 특히 폰트와 관련된 스타일을 바꿔야 하는 경우가 있습니다. 렌파이는 이를 translate 파이썬 블록으로 관리합니다. 이 블록에는 언어와 연관된 스타일을 바꾸는 코드를 입력할 수 있습니다. 예를 들어 다음과 같이 입력하거나:

translate piglatin python:
     style.default.font = "stonecutter.ttf"

아래처럼 입력할 수 있습니다.:

translate piglatin python:
    style.default.font = "stonecutter.ttf"

어떤 언어를 사용 중일 때 - 게임을 시작할 때 또는 언어를 변경했을 때 - 렌파이는 초기화 단계 마지막에 스타일을 초기화합니다. 그 다음에는 현재 사용하는 언어와 관련된 translate 파이썬 블록과 translate 스타일 블록을 파일에서 먼저 나타난 순서대로 모두 구동합니다. 마지막으로 스타일을 재작성하여 변경사항을 적용합니다.

스타일 번역은 모든 .rpy 파일에 추가할 수 있습니다.

기본 언어

기본 언어는 다음과 같은 방법을 이용하여 선택할 수 있습니다.:

  • RENPY_LANGUAGE 환경 변수에 언어가 설정되었다면 해당 언어를 사용합니다.
  • config.language 에 언어가 설정되었다면 해당 언어를 사용합니다.
  • 이전에 게임에서 한번이라도 어떤 언어를 선택했다면 해당 언어를 사용합니다.
  • 게임을 처음 구동하는 때에는 :var:`config.default_language`를 사용합니다. (기본적으로 None 언어를 사용합니다.)
  • 그 외에는 None 언어를 사용합니다.

번역 관련 액션, 함수, 변수

언어를 바꾸는 방법은 주된 방법은 Language 액션을 사용하는 것입니다.

Language(language)

게임 언어를 language 로 바꾼다.

language
번역하려는 대상 언어가 적힌 문자열, 혹은 게임 스크립트의 기본 언어를 사용하기 위한 None.

Language 액션을 이용하면 다음과 같은 코드를 사용해 preferences 스크린에서 언어 옵션을 추가할 수 있습니다.:

frame:
    style_group "pref"
    has vbox

    label _("언어")
    textbutton "영어" action Language(None)
    textbutton "피그 라틴" action Language("piglatin")

번역과 연관된 함수에는 다음 두 가지가 있습니다.:

renpy.change_language(language)

게임 언어를 language 로 바꾼다. language 는 문자열이거나, 기본 언어를 사용할 때에는 None 이어야 한다.

renpy.known_languages()

게임에서 발견할 수 있는 모든 언어를 반환한다. 기본 언어를 가리키는 None은 포함하지 않는다.

그리고 문자열 번역과 관련 있는 함수에는 다음 두 가지가 있습니다.:

_(s)

(밑줄 하나) s 를 있는 그대로 반환한다. 렌파이는 이 함수로 감싼 문자열을 검색한 뒤 그 문자열들을 번역 가능한 문자열 목록에 추가한다. 이 문자열들은 게임 화면에 나타날 때까지는 번역되지 않는다.

__(s)

(밑줄 두 개) 현재 언어로 번역된 s 를 즉시 반환한다. 이 함수로 감싼 문자열은 번역 가능한 문자열 목록에 추가된다. 게임 화면에 나타날 때 문자열 번역문과 일치한다면 두 번 번역될 수 있다는 점을 주의하라.

언어와 연관된 변수에는 두 가지가 있습니다. 하나는 config.language 변수이며, 이 변수는 게임에서 사용하는 기본 언어를 변경할 때 사용됩니다.

_preferences.language

현재 언어의 이름. 기본 언어를 사용하고 있는 경우 None이다. 이 변수는 읽기 전용 변수로 다루어야 한다. 언어를 변경하려면 renpy.change_language() 함수를 호출하라.

비공식 번역

주석

게임을 비공식으로 번역할 때에는 게임 제작자에게 허락을 구하도록 합시다.

렌파이는 게임 제작자의 적극적인 지원이 없어도 번역 파일을 만들 수 있도록 소소한 기능을 지원합니다. 이 가운데에는 게임에 있는 모든 문자열을 자동으로 문자열 번역문으로 생성할 수 있는 기능도 있습니다. 문자열 번역은 번역되지 않은 대사에 사용되므로 이 방법으로 게임을 번역할 수 있게 됩니다.

문자열 번역 파일을 만들기 위해서는 다음 단계를 거쳐야합니다.:

  • RENPY_LANGUAGE 환경 변수를 번역하려는 언어로 설정한다.
  • RENPY_UPDATE_STRINGS 환경 변수를 아무 값으로 설정한다.
  • 게임의 모든 글자를 발견할 때까지 게임을 플레이한다.

이렇게 하면 "game/tl/language/strings.rpy" 파일을 게임에 있는 모든 문자열이 적혀있는 번역 틀로 업데이트합니다.

게임이 언어 변경 기능을 지원하지 않는다면 init python 블록을 사용하여 config.language 변수를 번역문의 언어로 설정해야 할 것입니다.

비공식 번역을 하는 사람이라면 문자열 번역을 사용해 대사를 번역하는 것과 함께 위에서 설명한 방법을 사용하여 이미지와 스타일을 번역하는 방법도 참조하시기 바랍니다.