diff --git a/doc/src/content/docs/ko/i18n/explanation/file_format.md b/doc/src/content/docs/ko/i18n/explanation/file_format.md new file mode 100644 index 000000000000..6cc51c51e8a4 --- /dev/null +++ b/doc/src/content/docs/ko/i18n/explanation/file_format.md @@ -0,0 +1,186 @@ +--- +title: 번역 파일 포맷 (.po) +--- + +번역은 각 언어 및 국가별 언어 코드로 명명된 [`".po"` 파일(Portable Object)][po]에 저장됩니다. 예를 +들어 스페인에서 사용되는 스페인어에 대한 번역은 `es_ES.po`에, 멕시코에서 사용되는 스페인어에 대한 +번역은 `es_MX.po`에 저장됩니다. + +[po]: https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html + +평범한 텍스트 파일이므로 아무 텍스트 편집기를 써도 상관없으나 보통은 +[Poedit](https://poedit.net)같은 전용 번역 편집기나 웹 기반 +번역 도구를 쓸 수도 있습니다. + +`".po"` 파일의 형식은 번역할 영어 문구와 그 뒤에 로컬 번역이 있는 항목 목록입니다. 영어 문구는 +`msgid`로 시작하는 줄에 있고, 번역된 구문은 `msgstr`로 시작하는 줄에 있습니다. + +`msgid` 줄 앞에는 해당 단어나 문구가 소스 코드에서 어디에서 왔는지를 나타내는 주석 줄이 있습니다. +원문의 의미가 명확하지 않을 때 맥락을 파악하는데 도움을 줍니다. 또한 번역을 더 쉽게 하기 위해 +개발자가 남긴 주석이 있을 수도 있습니다. + +대부분의 항목은 다음과 같이 표시됩니다: + +``` +#: action.cpp:421 +msgid "Construct Terrain" +msgstr "niarreT tcurtsnoC" +``` + +여기서 영어 문구는 "Construct Terrain" 이고, `action.cpp` 파일의 421 번째 줄에 나와 있습니다. 이 +예제는 그저 영어 문자를 뒤집은 것입니다. 이렇게 하면 "Construct Terrain" 대신 "niarreT tcurtsnoC"가 +표시됩니다. + +또 다른 예제로는: + +``` +#: action.cpp:425 defense.cpp:635 defense.cpp:701 npcmove.cpp:2049 +msgid "Sleep" +msgstr "pleeS" +``` + +방금의 예제와 비슷하지만, 더 많은 곳에서 쓰이는 문구를 번역했습니다. 이렇게 하면 `action.cpp`, +`defense.cpp`(두 번), `npcmove.cpp` 총 네 곳에서 문구 "Sleep"이 "pleeS"로 표시됩니다. + +## 파일 헤더 + +".po"` 파일 상단의 헤더는 주석/msgid/msgstr 형식과 다른 유일한 부분입니다. + +이미 설정된 번역을 작업하는 경우에는 수정할 필요가 없습니다. + +새로 번역할 경우, 사용 중인 편집기, 또는 번역을 초기화할 때 권장되는 방식인 `msginit` 프로그램을 +통해서 대부분 설정이 완료되어야 합니다(TRANSLATING.md 참조). + +다른 번역 파일에서 시작하는 경우에도 몇 가지 사항을 변경해야 할 수 있습니다. 가능한 한 최선을 다해 +입력하세요. + +헤더는 다음과 같이 표시됩니다: + +``` +# French translations for Cataclysm-DDA package. +# Copyright (C) 2013 CleverRaven and Cataclysm-DDA contributors. +# This file is distributed under the same license as the Cataclysm-DDA package. +# Administrator , 2013. +# +msgid "" +msgstr "" +"Project-Id-Version: 0.7-git\n" +"Report-Msgid-Bugs-To: http://github.com/CleverRaven/Cataclysm-DDA\n" +"POT-Creation-Date: 2013-08-01 13:44+0800\n" +"PO-Revision-Date: 2013-08-01 14:02+0800\n" +"Last-Translator: YOUR NAME \n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +``` + +새로 번역을 시작하거나 기존 번역을 담당하고 있는 경우, 번역과 관련된 질문이나 문제가 있을 때 연락을 +받을 수 있도록 이름과 이메일 주소를 기재하면 도움이 됩니다. + +수동으로 쉽게 작성할 수 없는 유일한 중요한 부분은 [`복수형 양식`](#복수형-양식) 항목입니다. 이 +섹션은 귀하의 언어에서 다양한 수의 사물이 처리되는 방식을 결정합니다. 이에 대해서는 나중에 자세히 +설명하겠습니다. + +## 문자열 및 줄 바꿈 서식 지정 + +일부 문자열에는 `%s`, `%2$d` 및 `\n`과 같은 특수 용어가 있습니다. + +`\n`은 줄 바꿈을 나타냅니다. 코드에서 줄 바꿈이 가능한 경우 줄을 감싸기 때문에 대부분 불필요하지만, +때로는 다른 줄에 내용을 배치할 때 사용되기도 합니다. 번역에서 새 줄이 있어야 할 곳에 `\n`을 사용하면 +됩니다. + +`%s` 및 기타 유사한 용어는 게임이 실행 중일 때 다른 용어로 대체됩니다. 번역에 따라 이러한 용어를 +이동해야 할 수도 있습니다. 번역에서 `%`로 시작하는 모든 용어는 그대로 유지하는 것이 중요합니다. + +다음은 `%d`를 숫자로 대체한 예입니다: + +``` +#: addiction.cpp:224 +#, c-format +msgid "" +"Strength - %d; Perception - 1; Dexterity - 1;\n" +"Depression and physical pain to some degree. Frequent cravings. Vomiting." +msgstr "" +";1 - ytiretxeD ;1 - noitpecreP ;%d - htgnertS\n" +".gnitimoV .sgnivarc tneuqerF .eerged emos ot niap lacisyhp dna noisserpeD" +``` + +여기서 `%d`가 반전되지 않고 `\n`이 줄 끝에 남아 있는 것이 중요합니다. 이 경우 메시지가 표시될 때 +`%d`는 캐릭터의 힘 ( STR ) 수정자로 대체됩니다. + +경우에 따라 용어의 순서를 변경해야 할 수도 있습니다. 게임에 혼란을 줄 수 있으니까요. `%` 용어의 +순서를 변경되면 모든 용어에 숫자를 추가해야 게임에서 어떤 것이 어떤 것인지 알 수 있습니다. 일부 +문자열에는 이미 이러한 숫자가 있지만 그렇지 않은 문자열도 있을 수 있습니다. + +예를 들어 `%s가 %s를 쐈다!`가 들어 있는 문자열이 있으면 번역할 때 바뀔 수 있습니다. 아마도 +`%s가 %s에게 쏘였다!`와 같이 될 것입니다. 하지만 지금은 거꾸로, 쏘는 사람이 맞는 사람과 바뀐 +것입니다. + +이 경우 각 `%s`는 숫자(1~9)로 번호를 매긴 다음 `%`와 `s` 사이에 달러 기호( `$` )를 넣어야 합니다. +예를 들어 `%1$s가 %2$s를 쐈다!`는 `%s가 %s를 쐈다!`와 동일합니다. 따라서 위의 번역 예제는 +`%2$s가 %1$s에게 쏘였다!`가 될 수 있으며, 이 번역은 올바르게 작동합니다. + +게임에서 이러한 `%1$s` `%2$s` 매개변수를 자동으로 알아낼 수 있지만, (A): 번역의 모든 `%` 용어에 +번호가 매겨져 있는지, (B): 영어 텍스트의 원래 순서에 따라 번호가 올바른지, 그 두 가지를 확인해야 +합니다. + +예를 들자면: + +``` +#: map.cpp:680 +#, c-format +msgid "%s loses control of the %s." +msgstr "%2$s eht fo lortnoc sesol %1$s" +``` + +게임 내에서 `아비게일`이 `트럭`을 운전하고 있다고 가정할 때 `kcurt eht fo lortnoc sesol liagibA`로 +표시됩니다. + +## 문자열에 포함된 특수 태그 + +번역할 때 일부 문자열의 앞이나 안쪽에 특수 태그가 있을 수 있습니다. 이러한 태그는 그대로 두고 나머지 +문자열만 번역해야 합니다. + +예를 들어, "data/raw/names.json"의 NPC 및 도시 이름 앞에는 단어와의 충돌을 피하기 위해 ``이 +붙습니다(예: 재료의 `Wood`, 성의 `Wood`). 이러한 경우 `` 부분을 남겨 두어야 합니다. + +이하는 그 예시입니다: + +``` +#. ~ proper name; gender=female; usage=given +#: lang/json/json_names.py:6 +msgid "Abigail" +msgstr "liagibA" +``` + +또한 이름 위에는 해당 이름이 게임 내에서 어떤 용도로 사용되는지 알려주는 주석이 표시됩니다. 예시의 +경우 '아비게일'은 여성 NPC의 이름으로 사용할 수 있는 이름입니다. + +## 복수형 양식 + +많은 언어가 사물의 수에 따라 다른 용어를 사용합니다. 이러한 용어는 `".po"` 파일 헤더의 `Plural-Form` +줄에 정의된 복수형을 사용하여 지원됩니다. + +이 경우 수에 따라 다른 형식을 위한 여러 개의 `msgstr` 줄이 있습니다. 게임은 개수에 따라 자동으로 +올바른 형태를 선택합니다. + +이하는 그 예시입니다: + +``` +#: melee.cpp:913 +#, c-format +msgid "%d enemy hit!" +msgid_plural "%d enemies hit!" +msgstr[0] "!tih ymene %d" +msgstr[1] "!tih seimene %d" +``` + +여기서 첫 번째 항목은 `enemy`가 하나만 있을 때, 두 번째 항목은 `enemies`이 하나보다 더 있을 때를 +나타냅니다. 이 규칙은 언어마다 크게 다릅니다. + +> 역주: +> +> 한국어는 해당사항이 없습니다. diff --git a/doc/src/content/docs/ko/i18n/explanation/style.md b/doc/src/content/docs/ko/i18n/explanation/style.md new file mode 100644 index 000000000000..82366da9e211 --- /dev/null +++ b/doc/src/content/docs/ko/i18n/explanation/style.md @@ -0,0 +1,46 @@ +--- +title: Language Specific Style Guide +--- + +:::note{title="This section is a template."} + +As this page is for language-specific notes, it shouldn't be translated. Instead, it's used as a +template. [Check here for examples.](#writing-style-guide-for-your-language) + +::: + +## How to write one for your language + +1. [Find your language code.](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) +2. Create `doc/src/content/docs/{your-language-code}/i18n/explanation/style.md`. +3. If it doesn't, add your language to `doc/astro.config.ts` file, for example: + +```diff +diff --git a/doc/astro.config.ts b/doc/astro.config.ts +index da91c2e0014..3dafa248a06 100644 +--- a/doc/astro.config.ts ++++ b/doc/astro.config.ts +@@ -41,6 +41,7 @@ export default defineConfig({ + locales: { + en: { label: "English" }, + ko: { label: "한국어", lang: "ko-KR" }, ++ ru: { label: "Русский", lang: "ru-RU" }, + }, + logo: { src: "./src/assets/icon-round.svg" }, + social: { github, discord }, +``` + +In this example, it will allow russian language to be availble in language selector. Check +[starlight](https://starlight.astro.build/guides/i18n/) for details. + +## Writing style guide for your language + +There's no restrictions on how or what to write in this file. For example, you could: + +- write language specific notes for other translaotrs to read +- link to external resources or tools + +You could check out existing style guides for reference: + +- [Deutsch](../../../de/i18n/explanation/style.md) +- [Russian](../../../ru/i18n/explanation/style.md) diff --git a/doc/src/content/docs/ko/i18n/explanation/style_all.md b/doc/src/content/docs/ko/i18n/explanation/style_all.md new file mode 100644 index 000000000000..f4e5de28f9f5 --- /dev/null +++ b/doc/src/content/docs/ko/i18n/explanation/style_all.md @@ -0,0 +1,37 @@ +--- +title: 영문 스타일 가이드 +--- + +게임 내 텍스트를 추가하거나 편집할 때는 이하의 규칙을 따라주세요: + +1. 미국식 영어 철자를 사용합니다. + +2. 마침표 뒤에 두 문장 띄어쓰기를 사용합니다. 즉, 문장을 끝내는 마침표 뒤에 두 개의 공백이 뒤에 두 + 개의 공백이 와야 합니다. 문장이 텍스트 블록의 마지막 문장인 경우 그 뒤에 공백이 없어야 합니다. + +3. 2인칭 시점을 사용합니다(예: "you"). + +4. 특성, 무술, 소형 생체공학 모듈(Compact Bionic Modules, CBM)의 이름은 제목에 대문자로 표기해야 + 합니다. 즉, 관사, 전치사 또는 접속사가 아닌 한 각 단어는 대문자로 표기해야 합니다. + +5. 고유명사 이름의 항목과 개체도 제목에 대소문자를 사용해야 합니다. + +6. 다른 모든 항목 및 개체 이름은 모두 소문자로 표기합니다. + +7. 3개 이상의 대상을 나열할 때는 + [연속 쉼표(옥스포드 쉼표)](https://en.wikipedia.org/wiki/Serial_comma)를 사용합니다. + +:::caution{title="연속 쉼표를 사용하지 않은 예"} + +A, B and C + +::: + +:::tip{title="연속 쉼표를 사용한 예"} + +A, B, and C + +::: + +8. 마침표 3개(...) 대신 줄임표 문자(…)를 사용합니다. 마침표가 세 개 있는 경우 줄임표 전용 유니코드 + 문자, 즉 U+2026으로 대체합니다. diff --git a/doc/src/content/docs/ko/i18n/guides/maintain.md b/doc/src/content/docs/ko/i18n/guides/maintain.md new file mode 100644 index 000000000000..5c89547c1889 --- /dev/null +++ b/doc/src/content/docs/ko/i18n/guides/maintain.md @@ -0,0 +1,33 @@ +--- +title: 관리자를 위한 번역 병합 및 관리하기 +--- + +번역 파일을 올바르게 병합하고 유지 관리하려면 몇 가지 단계를 올바른 순서로 수행해야 합니다. + +이를 위해 제공되는 스크립트가 있으므로 대체로 다음과 같은 과정을 거치게 됩니다: + +1. 번역을 '.po' 형식으로 다운로드합니다. +2. 번역 파일을 `lang/incoming/`에 넣고 `lang/po/`에 있는 파일과 이름이 일치하도록 합니다. +3. `lang/update_pot.sh`를 실행하여 `lang/po/cataclysm-BN.pot`을 업데이트합니다(`polib` 및 + `luaparser` 모듈이 설치된 파이썬이 필요함). +4. `lang/merge_po.sh`를 실행하여 `lang/po/*.po`를 업데이트합니다. (로컬에서 번역을 테스트할 때만 + 쓰입니다. 지금은 Transifex로 프로젝트를 번역하기 때문입니다.) 이렇게 하면 `lang/incoming/`의 + 번역도 병합됩니다. + +이 단계만 거치면 번역 파일을 최신 상태로 유지할 수 있습니다. + +.po 파일을 `.mo` 파일로 컴파일하여 사용하려면 `lang/compile_mo.sh`를 실행합니다. 이 명령은 발견된 각 +언어에 대해 `lang/mo/`에 디렉터리를 생성합니다. + +참고로 `lang/merge_po.sh`와 `lang/compile_mo.sh` 모두 병합 또는 컴파일할 언어를 지정하는 인수를 +사용할 수 있습니다. 예를 들어 중국어 번체(zh_TW)에 대한 번역만 컴파일하려면 +`lang/compile_mo.sh zh_TW`를 실행하면 됩니다. + +적절한 .mo 파일을 컴파일한 후, 게임 설정에서 해당 언어를 선택하면 카타클리즘을 실행할 때 해당 번역이 +자동으로 사용됩니다. + +설정에서 `System language`를 선택한 경우, 게임은 언어 정의 파일 `data/raw/languages.json`을 기반으로 +시스템 언어와 일치하는 언어를 사용하려고 시도합니다. + +새 언어에 대한 번역을 테스트 중이거나 설정에 해당 언어가 표시되지 않는 경우, 언어 정의 파일에 해당 +언어에 대한 항목이 있는지 확인하세요. diff --git a/doc/src/content/docs/ko/i18n/guides/mods.md b/doc/src/content/docs/ko/i18n/guides/mods.md new file mode 100644 index 000000000000..fab4bf4d603c --- /dev/null +++ b/doc/src/content/docs/ko/i18n/guides/mods.md @@ -0,0 +1,247 @@ +--- +title: 유저 제작 모드 번역하기 +--- + +> 역주: +> +> 타이틀 원문: Translate third-party mods + +## 들어가며 + +이 문서는 Cataclysm: Bright Night 의 모드 번역 워크플로우를 설정하고 운영하는 방법에 대해 간략하게 +설명하는 것을 목표로 합니다. + +모드 현지화를 위해 게임에서는 [GNU gettext](https://www.gnu.org/software/gettext/) 와 유사한 커스텀 +현지화 시스템을 사용하며, GNU gettext MO 파일과 호환됩니다. + +transifex 또는 gettext를 지원하는 다른 플랫폼이나 소프트웨어를 사용할 수 있지만, 이 문서에서는 +[Poedit](https://poedit.net/) 및 명령줄 +[GNU gettext 유틸리티](https://www.gnu.org/software/gettext/)로 작업하는 방법에 대한 예제만 +제공합니다. + +PO/POT/MO 파일에 대한 자세한 설명이나 GNU gettext 유틸리티를 사용하여 작업하는 방법에 대한 자세한 +설명은 [GNU gettext 매뉴얼](https://www.gnu.org/software/gettext/manual/gettext.html)을 참조하세요. + +대격변의 밝은 밤과 모드의 문자열 번역에 대한 일반적인 팁을 얻으려면 +[translation API](../reference/translation) 를 참조하세요. + +## 간단한 용어 해설 + +### POT 파일 + +Portable Object Template (`.pot`). + +이 파일은 모드의 JSON 및 Lua 소스 파일에서 추출한 원본(영어) 문자열이 포함된 텍스트 파일입니다. POT +파일은 모든 언어의 기존 PO 파일을 비워두거나 업데이트하는 데 사용되는 템플릿입니다. + +### PO 파일 + +Portable Object (`.po`). + +한 언어에 대한 번역된 문자열이 포함된 텍스트 파일입니다. PO 파일은 번역가가 작업하는 파일이며, MO +파일로 컴파일될 파일입니다. + +### MO 파일 + +Machine Object (`.mo`). + +한 언어에 대한 번역된 문자열이 포함된 바이너리 파일입니다. MO 파일은 게임을 로드하고 번역된 문자열을 +가져오는 곳입니다. + +## 워크플로우 개요 + +The first translation workflow is as follows: 첫 번째 번역 워크플로우는 다음과 같습니다: + +1. 모드 JSON 및 Lua 소스 파일에서 문자열을 POT 파일로 추출합니다. +2. 이 POT에서 대상 언어에 대한 PO 파일을 생성합니다. +3. 번역된 문자열로 PO 파일을 채웁니다. +4. PO를 MO로 컴파일합니다. +5. MO를 모드 파일에 넣습니다. + +시간이 지남에 따라 모드가 변경되면 문자열도 변경될 수 있습니다. 기존 번역을 업데이트하는 방법은 +다음과 같습니다: + +1. 모드 JSON 및 Lua 소스 파일에서 문자열을 새 POT 파일로 추출합니다. +2. 새 POT 파일에서 기존 PO 파일을 업데이트합니다. +3. PO 파일에서 새 문자열을 추가하거나 기존 번역된 문자열을 편집합니다. +4. PO를 MO로 컴파일합니다. +5. 모드 파일에서 이전 MO를 새 버전으로 교체합니다. + +두 워크플로우의 1단계 모두 문자열 추출을 위한 환경을 설정해야 합니다(아래 참조). + +2~4단계는 번역 소프트웨어를 사용하여 모드 작성자/관리자 또는 번역가가 수행할 수 있습니다. + +## 문자열 추출을 위한 환경 설정 + +`polib` 및 `luaparser` 모듈이 설치된 Python 3이 필요합니다(`pip`을 통해 제공). + +문자열 추출을 위한 스크립트는 리포지토리의 `lang` 하위 디렉터리에서 찾을 수 있습니다: + +- `extract_json_strings.py` - 기본 문자열 추출 루틴 +- `dedup_pot_file.py` - 첫 번째 스크립트에서 생성된 POT 파일의 오류 수정 +- `extract_mod_strings.bat` (Linux/MacOS의 경우 `extract_mod_strings.sh`) - 나머지 2개의 스크립트를 + 자동화합니다. + +## 문자열 추출 + +이 3개의 스크립트를 모드 폴더에 복사합니다: + +- Windows의 경우, `extract_mod_strings.bat`을 더블 클릭합니다. +- Linux/MacOS의 경우 터미널을 열고 `./extract_mod_strings.sh`를 실행합니다. + +프로세스가 오류 없이 완료되면 `extracted_strings.pot` 파일이 들어 있는 새 `lang` 폴더가 표시됩니다. + +## 새 PO 생성 + +PO 파일을 생성하기 전에 언어 ID를 선택해야 합니다. + +데이터/raw/languages.json`을 열어 게임에서 지원하는 언어 목록을 확인합니다. + +이 목록에서 각 항목은 `ln_LN` 형식의 고유한 ID를 가지며, 여기서 `ln`은 언어를, `LN`은 방언을 +나타냅니다. 언어+방언을 정확히 일치시키려면 전체 `ln_LN`을 사용하거나, 방언에 관계없이 게임에서 +자신의 MO를 사용하도록 하려면 `ln`을 사용하면 됩니다. + +### Poedit 으로 하기 + +1. Poedit으로 POT 파일을 엽니다. +2. "새 번역 만들기" 버튼을 누릅니다(하단 근처에 표시되어야 함). +3. 언어 선택 대화 상자에서 선택한 언어 ID를 입력합니다. +4. 파일을 '경로/to/mod/lang/LANG.po'로 저장합니다. 여기서 'LANG'은 동일한 언어 아이디입니다. + +### msginit 으로 하기 + +```bash +msginit -i lang/index.pot -o lang/LANG.po -l LANG.UTF-8 --no-translator +``` + +여기서 `LANG`은 선택한 언어 ID입니다. + +## 기존 PO 업데이트하기 + +### Poedit 으로 하기 + +1. Poedit으로 PO 파일 엽니다. +2. `Catalog->Update from POT file...`를 고르고 새 POT 파일을 선택합니다. +3. 파일을 저장합니다. + +### msgmerge 으로 하기 + +```bash +msgmerge lang/LANG.po lang/index.pot +``` + +## PO를 MO로 컴파일하기 + +### Poedit 으로 하기 + +1. Poedit으로 PO 파일을 엽니다. +2. MO 파일이 UTF-8을 사용하여 인코딩되었는지 확인합니다(기본적으로 인코딩되어 있어야 하며, + `Catalog->Properties->"Translation properties" 탭->Charset`에서 다시 확인할 수 있습니다). +3. 기본적으로 PO 파일을 저장할 때마다 Poedit은 자동으로 MO로 컴파일하지만, + `File->Compile to MO...`을 통해 명시적으로도 동일한 작업을 수행할 수 있습니다. + +### msgfmt 으로 하기 + +``` +msgfmt -o lang/LANG.mo lang/LANG.po +``` + +## 모드에 MO 파일 추가하기 + +모드 파일 디렉토리에 `lang` 디렉토리를 생성하고 거기에 MO를 넣습니다: + +``` +mods/ + YourMod/ + modinfo.json + lang/ + es.mo + pt_BR.mo + zh_CN.mo +``` + +**참고:** POT/PO 파일을 같은 `lang` 하위 디렉토리에 저장하면 파일을 추적하기가 더 쉬워질 수 +있습니다. 게임에서 이러한 파일은 무시되며, 모드 폴더 구조는 다음과 같이 표시됩니다: + +``` +mods/ + YourMod/ + modinfo.json + lang/ + extracted_strings.pot + es.po + es.mo + pt_BR.po + pt_BR.mo + zh_CN.po + zh_CN.mo +``` + +## 기타 참고 사항 + +### JSON과 같이 MO 파일의 위치나 이름을 임의로 지정할 수 있나요? + +아니오. 이 게임은 `modinfo.json` 에 지정된 모드의 `path` 경로의 `lang` 하위 디렉토리에 있는 특정 +이름의 MO 파일을 찾습니다(지정되지 않은 경우 `path`는 모드의 디렉토리와 일치합니다). + +그러나 모든 모드는 자동으로 문자열 번역에 다른 모드의 번역 파일을 사용하려고 시도합니다. 따라서 다른 +모드 (또는 모드 컬렉션)를 위해 순전히 "번역 팩"인 모드를 만들 수 있습니다. + +### 실행 중인 게임에서 번역 다시 로드하기 + +디버그 메뉴를 열고 `정보...->번역 다시 불러오기`를 선택하면 게임이 디스크에서 모든 MO 파일을 다시 +로드합니다. + +이렇게 하면 번역가가 MO 파일을 컴파일할 수 있는 경우 번역된 문자열이 게임에서 어떻게 보이는지 쉽게 +확인할 수 있습니다. + +Poedit을 사용한 워크플로우 예시: + +1. 문자열 번역하기 +2. Ctrl+S 누르기 +3. 게임에서 Alt+Tab을 누릅니다. +4. 디버그 메뉴를 통해 번역 파일을 다시 불러옵니다. +5. 이제 게임에 번역된 문자열이 표시됩니다. + +### MO 로드 순서 + +MO 로드 순서는 다음과 같습니다: + +1. UI, 하드코딩된 기능, 기본 "모드"( `data/json/`) 및 자체 제공 모드에 대한 번역 문자열이 포함된 + 기본 게임의 MO 파일이 항상 첫 번째로 로드됩니다. +2. 그런 다음 모드의 MO 파일이 모드 로드 순서와 동일한 순서로 로드됩니다. + +### 방언 + +MO 파일을 불러올 때 게임에서는 먼저 이름에 언어와 방언이 정확히 일치하는 파일을 찾습니다. 그런 +파일이 없으면 방언이 없는 파일을 찾습니다. + +예를 들어 '스페인어(에스파냐)`를 사용하는 경우 선택 순서는 다음과 같습니다. + +1. `es_ES.mo` +2. `es.mo` + +그리고 `Español (아르헨티나)`를 사용하는 경우 선택 순서는 다음과 같습니다. + +1. `es_AR.mo` +2. `es.mo` + +따라서 정확한 번역 파일이 없는 경우 스페인어 방언 중 하나에 대해 `es.mo`가 로드됩니다. + +### 두 개 이상의 모드가 동일한 문자열에 대해 서로 다른 번역을 제공하는 경우 어떻게 하나요? + +그러면 게임은 다음 규칙에 따라 어떤 것을 사용할지 선택합니다: + +1. 문자열 A의 번역에는 복수형이 있지만 문자열 B의 번역에는 복수형이 없는 경우, 단수형과 복수형 + 모두에 번역 A가 사용됩니다. +2. 번역 A와 B에 모두 복수형이 있거나 둘 다 복수형이 없는 경우 첫 번째로 로드된 번역이 사용됩니다(MO + 로드 순서 참조). + +기본 게임과 다른 번역을 원하거나 다른 모드의 문자열과 충돌하지 않게 하려면 해당 JSON 객체의 문자열에 +번역 컨텍스트를 추가하세요(번역 컨텍스트를 지원하는 필드는 [여기](../reference/translation) 참조). + +### 참고: 모드 번역을 구현하는 PR + +https://github.com/cataclysmbnteam/Cataclysm-BN/pull/505 + +### [모드 번역 예시](https://github.com/Kenan2000/Bright-Nights-Kenan-Mod-Pack/pull/36) diff --git a/doc/src/content/docs/ko/i18n/reference/edge_cases.md b/doc/src/content/docs/ko/i18n/reference/edge_cases.md new file mode 100644 index 000000000000..b3ca3c4451d5 --- /dev/null +++ b/doc/src/content/docs/ko/i18n/reference/edge_cases.md @@ -0,0 +1,28 @@ +--- +title: 주의사항 +--- + +번역가가 알고 있어야 하는 Cataclysm: BN 과 관련된 이슈가 있습니다. 예를 들어 + +## 특수 기호 + +일부 번역 텍스트에는 다음과 같은 특수 기호나 서식이 있습니다. + +- [`%s` 및 `%3$d`(그대로 두어야 함)](../explanation/file_format.md#format-strings-and-newlines) +- [`` (번역해서는 안 됨)](../explanation/file_format.md#special-tags-in-strings) + +자세한 내용은 [파일 형식 설명](../explanation/file_format.md)을 참조하세요. + +## 언어별 가이드라인 + +구체적인 가이드라인은 다음 파일을 확인하세요: + +- [모든 번역가를 위한 일반 참고 사항(대부분 영어)](../explanation/style_all.md) +- [언어별 참고 사항](../explanation/style.md) + +Cataclysm:BN 에는 47,000개 이상의 번역 가능한 문자열이 있고(마지막 업데이트: 2024-02-04 [^1] ), +한국어는 현재 97% 가 번역된 상태입니다. 번역되지 않은 문자열은 1600개 남짓입니다. 많은 참여 +바랍니다! + +[^1]: (transifex API는 공개 엔드포인트를 노출하지 않기 때문에(적어도 Bearer Token이 없으면), 저희는 +번호를 자동으로 업데이트할 수 없습니다.) diff --git a/doc/src/content/docs/ko/i18n/reference/gender.md b/doc/src/content/docs/ko/i18n/reference/gender.md new file mode 100644 index 000000000000..7eb8316c4389 --- /dev/null +++ b/doc/src/content/docs/ko/i18n/reference/gender.md @@ -0,0 +1,22 @@ +--- +title: 문법적 성별 +--- + +NPC 대화(및 기타 문자열)의 경우 일부 언어의 경우 대화 참가자의 성별에 따라 대체 번역이 필요할 수 +있습니다. 이 두 가지 초기 구성은 다음과 같습니다. + +1. 대화를 정의하는 json 파일에 관련 성별이 나열되어 있어야 합니다. 참고: + [NPC 문서](../../mod/json/reference/creatures/npcs). +2. 각 언어는 `data/raw/languages.json`에 있는 언어 항목의 `genders` 목록을 통해 사용하고자 하는 + 성별을 지정해야 합니다. 성별이 필요하다는 확신이 들 때까지는 성별을 추가하지 않는 것이 좋습니다. + 현재 선택 가능한 항목은 다음과 같습니다: `m`(남성), `f`(여성), `n`(중성). 현재 지원되는 성별과 + 다른 성별이 필요한 경우 `src/language.h`의 관련 참고 사항을 참조하세요. + +이렇게 하면 메시지 컨텍스트에 지정된 성별에 따라 관련 대화 행이 번역에 여러 번 표시됩니다. 예를 들어 +`npc:m`의 컨텍스트는 대화에 참여한 NPC가 남성이라는 것을 나타냅니다. + +기술적인 제한으로 인해 지원되는 모든 성별이 컨텍스트로 표시되지만, 해당 언어의 문법적 성별 목록에 +나열된 성별에 대한 번역만 제공하면 됩니다. + +게임의 다른 부분에는 문법적 성별에 대한 다양한 임시 해결책이 있으므로 다른 문자열에 대해 다른 +컨텍스트가 표시되어도 놀라지 마세요. diff --git a/doc/src/content/docs/ko/i18n/reference/translation.md b/doc/src/content/docs/ko/i18n/reference/translation.md new file mode 100644 index 000000000000..fa1e0053e6df --- /dev/null +++ b/doc/src/content/docs/ko/i18n/reference/translation.md @@ -0,0 +1,226 @@ +--- +title: 번역 API +--- + +Cataclysm: BN 은 번역된 텍스트를 표시하기 위해 [GNU gettext][gettext]와 유사하게 작동하는 커스텀 +런타임 라이브러리를 사용합니다. + +`gettext`를 사용하려면 두 가지 작업이 필요합니다: + +- 소스 코드에서 번역해야 하는 문자열을 표시하기. +- 런타임 중에 [번역 함수](#번역-함수) 불러오기. + +번역 가능한 문자열을 표시하면 해당 문자열을 자동으로 추출할 수 있습니다. 이 프로세스는 소스 코드에 +표시된 원본 문자열(보통 영어로 되어 있음)을 번역된 문자열에 매핑하는 파일을 생성합니다. 이러한 +매핑은 런타임 중에 번역 함수에 의해 사용됩니다. + +참고로 원본 문자열이 번역을 요청하는 데 사용되는 식별자 역할을 하므로 추출된 문자열만 번역할 수 +있습니다. 번역 함수가 번역을 찾을 수 없는 경우 원래 문자열을 반환합니다. + +## 번역 함수 + +번역할 문자열을 표시하고 런타임 중에 해당 번역을 얻으려면 다음 함수 및 클래스 중 하나를 사용해야 +합니다. + +이러한 함수 중 하나에 사용되는 _리터럴_ 문자열(따옴표로 감싼 문자열)은 자동으로 추출됩니다. 리터럴이 +아닌 문자열은 런타임 중에 여전히 번역되지만 추출되지는 않습니다. + +### `_()` + +이 함수는 간단한 문자열 등에 사용하기에 적합하며, 예를 들면 다음과 같습니다: + +```cpp +const char *translated = _( "text marked for translation" ) +``` + +직접 작동하기도 합니다: + +```cpp +add_msg( _( "You drop the %s." ), the_item_name ); +``` + +JSON 파일의 문자열은 `lang/extract_json_strings.py` 스크립트에 의해 추출되며, `_()`를 사용하여 +런타임 중에 번역할 수 있습니다. JSON 문자열에 대한 번역 컨텍스트가 필요한 경우, 아래에 설명된 +`class translation`을 대신 사용할 수 있습니다. + +### `pgettext()` + +이 함수는 원래 문자열의 의미만으로는 모호한 경우에 유용합니다. 예를 들어 "blue"라는 단어는 색상이나 +감정을 의미할 수 있습니다. + +또한 `pgettext`는 번역 가능한 문자열 외에도, 번역가에게 제공되지만 번역된 문자열 자체의 일부가 아닌 +컨텍스트를 받습니다. 이하 함수의 첫 번째 매개 변수는 컨텍스트이고 두 번째 매개 변수는 번역할 +문자열입니다: + +```cpp +const char *translated = pgettext( "The color", "blue" ); +``` + +### `vgettext()` + +일부 언어에는 복수형에 대한 복잡한 규칙이 있습니다. `vgettext`는 이러한 복수형을 올바르게 번역하는 +데 사용할 수 있습니다. 이하의 예시에서 첫 번째 매개변수는 번역되지 않은 단수형 문자열이고, 두 번째 +매개변수는 번역되지 않은 복수형 문자열이며, 세 번째 매개변수는 런타임에 처음 두 개 중 어느 것을 +사용할지 결정하는 데 사용됩니다: + +```cpp +const char *translated = vgettext( "%d zombie", "%d zombies", num_of_zombies ); +``` + +### `vpgettext()` + +`vgettext`와 동일하지만 번역 컨텍스트를 지정할 수 있습니다. + +```cpp +const char *translated = vpgettext( "water source, not time of year", "%d spring", "%d springs", num_of_springs ); +``` + +## `translation` + +번역 컨텍스트와 함께 번역을 위해 문자열을 저장하고 싶을 때가 있습니다; 때로는 번역이 필요 없거나 +복수형인 문자열을 저장하고 싶을 수도 있습니다. `translations.h|cpp`의 `class translation`은 이러한 +기능을 단일 래퍼에 제공합니다: + +```cpp +const translation text = to_translation( "Context", "Text" ); +``` + +```cpp +const translation text = to_translation( "Text without context" ); +``` + +```cpp +const translation text = pl_translation( "Singular", "Plural" ); +``` + +```cpp +const translation text = pl_translation( "Context", "Singular", "Plural" ); +``` + +```cpp +const translation text = no_translation( "This string will not be translated" ); +``` + +그런 다음 다음 코드를 사용하여 문자열을 번역/검색할 수 있습니다. + +```cpp +const std::string translated = text.translated(); +``` + +```cpp +// 숫자 2에 해당하는 텍스트의 복수형을 번역합니다. +const std::string translated = text.translated( 2 ); +``` + +`class translation`은 JSON에서 읽을 수도 있습니다. `translation::deserialize()` 메서드는 `JsonIn` +객체에서 역직렬화를 처리하므로 적절한 JSON 함수를 사용하여 JSON에서 번역을 읽을 수 있습니다.\ +JSON 구문은 다음과 같습니다: + +```json +"name": "bar" +``` + +```json +"name": { "ctxt": "foo", "str": "bar", "str_pl": "baz" } +``` + +또는 + +```json +"name": { "ctxt": "foo", "str_sp": "foo" } +``` + +위 코드에서 `"ctxt"`와 `"str_pl"`는 모두 선택 사항이지만, `"str_sp"`는 동일한 문자열로 `"str"`와 +`"str_pl"`을 지정하는 것과 같습니다. 또한 `"str_pl"` 및 `"str_sp"`는 번역 객체가 `plural_tag` 또는 +`pl_translation()`을 사용하여 생성되거나 `make_plural()`을 사용하여 변환된 경우에만 읽혀집니다. +다음은 예제입니다: + +```cpp +translation name{ translation::plural_tag() }; +jsobj.read( "name", name ); +``` + +"str_pl"`또는`"str_sp"`를 지정하지 않으면 기본적으로 복수형이 단수형 + "s"로 지정됩니다. + +아래와 같이 작성하여 번역가를 위한 코멘트를 추가할 수도 있습니다(입력 순서는 중요하지 않음): + +```json +"name": { + "//~": "as in 'foobar'", + "str": "bar" +} +``` + +현재 JSON 구문은 아래에 나열된 일부 JSON 값에 대해서만 지원된다는 점에 유의하세요. 다른 json +문자열에 이 형식을 사용하려면 `translations.h|cpp`를 참조하여 해당 코드를 마이그레이션하세요. 그런 +다음 `update_pot.sh`를 테스트하여 번역을 위해 문자열이 올바르게 추출되는지 확인하고 +[단위 테스트](https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%9B_%ED%85%8C%EC%8A%A4%ED%8A%B8)를 +실행하여 `translation` 클래스에서 보고된 텍스트 스타일 문제를 수정할 수도 있습니다. + +### Supported JSON values + +- Effect names +- Item action names +- Item category names +- Activity verbs +- Gate action messages +- Spell names and descriptions +- Terrain/furniture descriptions +- Monster melee attack messages +- Morale effect descriptions +- Mutation names/descriptions +- NPC class names/descriptions +- Tool quality names +- Score descriptions +- Skill names/descriptions +- Bionic names/descriptions +- Terrain bash sound descriptions +- Trap-vehicle collision sound descriptions +- Vehicle part names/descriptions +- Skill display type names +- NPC dialogue u_buy_monster unique names +- Spell messages and monster spell messages +- Martial art names and descriptions +- Mission names and descriptions +- Fault names and descriptions +- Plant names in item seed data +- Transform use action messages and menu text +- Template NPC names and name suffixes +- NPC talk response text +- Relic name overrides +- Relic recharge messages +- Speech text +- Tutorial messages +- Vitamin names +- Recipe blueprint names +- Recipe group recipe descriptions +- Item names (plural supported) and descriptions +- Recipe descriptions +- Inscribe use action verbs/gerunds +- Monster names (plural supported) and descriptions +- Snippets +- Bodypart names +- Keybinding action names +- Field level names + +### Lua + +[4가지 번역 함수가 Lua 코드에 공개되어 있습니다.](../../mod/lua/tutorial/modding.md#translation-functions). + +### 추천 + +Cataclysm: BN 에서 `itype` 및 `mtype`과 같은 일부 클래스는 `nname`이라는 번역 함수를 위한 +래퍼(wrapper)를 제공합니다. + +빈 문자열이 번역을 위해 표시되면 항상 빈 문자열이 아닌 디버그 정보로 번역됩니다. 대부분의 경우, +문자열은 절대 비어 있지 않으므로 번역용으로 표시해도 항상 안전합니다. 그러나 비어 있을 수 있고 번역 +후에도 비어 _있어야 하는_ 문자열을 처리할 때는, 문자열이 비어 있는지 검사하고 비어 있지 않은 +경우에만 번역 함수에 전달해야 합니다. + +오류 및 디버그 메시지는 번역을 위해 표시해서는 안 됩니다. 이러한 메시지가 나타나면 플레이어는 +게임에서 출력되는 그대로 _정확하게_ 보고해야 합니다. + +자세한 내용은 [gettext 매뉴얼][manual]을 참조하세요. + +[gettext]: https://www.gnu.org/software/gettext/ +[manual]: https://www.gnu.org/software/gettext/manual/index.html diff --git a/doc/src/content/docs/ko/i18n/tutorial/img/editor.png b/doc/src/content/docs/ko/i18n/tutorial/img/editor.png new file mode 100644 index 000000000000..7559d4f1bf30 Binary files /dev/null and b/doc/src/content/docs/ko/i18n/tutorial/img/editor.png differ diff --git a/doc/src/content/docs/ko/i18n/tutorial/img/join.png b/doc/src/content/docs/ko/i18n/tutorial/img/join.png new file mode 100644 index 000000000000..efc91e2ac3fb Binary files /dev/null and b/doc/src/content/docs/ko/i18n/tutorial/img/join.png differ diff --git a/doc/src/content/docs/ko/i18n/tutorial/img/resource.png b/doc/src/content/docs/ko/i18n/tutorial/img/resource.png new file mode 100644 index 000000000000..e7b1533750a4 Binary files /dev/null and b/doc/src/content/docs/ko/i18n/tutorial/img/resource.png differ diff --git a/doc/src/content/docs/ko/i18n/tutorial/img/start.png b/doc/src/content/docs/ko/i18n/tutorial/img/start.png new file mode 100644 index 000000000000..bccbca2ec42b Binary files /dev/null and b/doc/src/content/docs/ko/i18n/tutorial/img/start.png differ diff --git a/doc/src/content/docs/ko/i18n/tutorial/img/waiting.png b/doc/src/content/docs/ko/i18n/tutorial/img/waiting.png new file mode 100644 index 000000000000..c14baffab305 Binary files /dev/null and b/doc/src/content/docs/ko/i18n/tutorial/img/waiting.png differ diff --git a/doc/src/content/docs/ko/i18n/tutorial/transifex.md b/doc/src/content/docs/ko/i18n/tutorial/transifex.md new file mode 100644 index 000000000000..df9cf880987c --- /dev/null +++ b/doc/src/content/docs/ko/i18n/tutorial/transifex.md @@ -0,0 +1,73 @@ +--- +title: Transifex로 BN 번역하기 +--- + +## 지원하는 언어 + +Cataclysm: BN 을 번역하는 공식적인 사이트는 [Transifex translations project][project] 입니다. + +[게임 저장소에 포함되지 않은 모드를 번역하는 방법을 찾고 계신가요?](../guides/mods.md) + +현재 지원되는 언어는 다음과 같습니다: + +- 아랍어 +- 불가리아어 +- 중국어(간체) +- 중국어(번체) +- 네덜란드어 +- 에스페란토 +- 프랑스어 +- 독일어 +- 이탈리아어(이탈리아) +- 일본어 +- **한국어** +- 폴란드어 +- 포르투갈어(브라질) +- 러시아어 +- 세르비아어 +- 스페인어(아르헨티나) +- 스페인어(스페인) +- 터키어 + +위 목록에 찾는 언어가 없으신가요? Transifex에서 프로젝트에 추가할 수 있습니다! + +## BN 팀에 들어가기 + +번역을 시작하려면 [번역 프로젝트][project]로 이동해주세요. 우측 사이드바에 `JOIN THIS PROJECT` 를 +통해 로그인 / 회원가입을 하는 화면으로 갈 수 있습니다. Transifex에 무료 계정을 만들 수도 있지만 +GitHub, Google+ 또는 LinkedIn을 사용하여 로그인할 수도 있습니다. + +![번역 시작하기](./img/start.png) + +계정을 만든 후에는 [번역 프로젝트][project]로 돌아와서 `JOIN THIS PROJECT` 버튼을 클릭합니다. 그러면 +번역에 관심 있는 언어를 선택할 수 있는 창이 열립니다. 번역하고 싶은 언어를 선택하고 +`프로젝트에 참가` 버튼을 클릭합니다. + +![프로젝트 참가하기](./img/join.png) + +## 언어 선택하기 + +참가 요청이 받아들여지고 페이지를 새로고침하면 프로젝트 대시보드로 리다이렉트될 것입니다. 사이드바에 +있는 `Languages` 링크를 클릭하여 지원되는 언어 목록과 현재 번역 작업 진행 상황을 확인할 수 있습니다. +만약 번역하고 싶은 언어가 목록에 없다면 추가 요청도 할 수 있습니다. + +![자료 선택하기](./img/resource.png) + +목록에서 원하는 언어를 클릭한 후 "Translate" 버튼을 클릭하여 바로 시작할 수 있습니다. 다른 언어도 +번역하고 싶다면, 그 언어를 클릭한 후 "Join team" 버튼을 클릭할 수도 있습니다. + +"Translate" 버튼을 클릭하면 웹 편집기로 이동하는데, 번역을 시작하려면 번역할 자료를 선택해야 합니다. +거의 대부분의 게임 내 텍스트는 `cataclysm-bright-nights` 자료에 포함되어 있으므로 이 항목을 선택하면 +됩니다. + +## 편집기 사용하기 + +편집기에서는 번역해야할 문장 목록이 나옵니다. 번역하고 싶은 문장을 클릭한 후 오른쪽 입력란에 번역된 +문장을 입력하면 됩니다. 번역이 마치고 "Save" 버튼을 누르면 변경 내역이 저장됩니다. + +![웹 편집기](./img/editor.png) + +더 자세한 내용은 [Transifex 공식 문서][docs]를 참고해주세요. + +[project]: https://explore.transifex.com/bn-team/cataclysm-bright-nights/ +[docs]: https://docs.transifex.com/