From 99ce8b738c59f85b973f3f3b7541c9c6c091ef09 Mon Sep 17 00:00:00 2001
From: lDMDiamondl <100426562+lDMDiamondl@users.noreply.github.com>
Date: Fri, 8 Sep 2023 11:33:03 +0900
Subject: [PATCH 1/4] Update Korean.txt
Updated KR translation.
---
Celeste.Mod.mm/Content/Dialog/Korean.txt | 76 +++++++++++++++++++-----
1 file changed, 61 insertions(+), 15 deletions(-)
diff --git a/Celeste.Mod.mm/Content/Dialog/Korean.txt b/Celeste.Mod.mm/Content/Dialog/Korean.txt
index b7ffc2a54..7b2045da2 100644
--- a/Celeste.Mod.mm/Content/Dialog/Korean.txt
+++ b/Celeste.Mod.mm/Content/Dialog/Korean.txt
@@ -22,6 +22,12 @@
POSTCARD_LEVELGONE= {big}고마워요, ((player))!{/big}{n}하지만 {#ff1144}((sid)){#}은(는) 다른 산에 있어요/
POSTCARD_LEVELLOADFAILED= {big}죄송합니다!{/big}{n}{#ff1144}((sid)){#}로딩에 실패했습니다.{n}맵 제작자한테 {#44adf7}log.txt{#}를 보내주세요.
POSTCARD_LEVELNOSPAWN= {big}이런!{/big}{n}누군가가 {#44adf7}시작 지점{#}을 잘못 배치했네요!{n}맵에 {#44adf7}플레이어{#} 엔티티가 포함되어 있는지 확인해보세요.
+ POSTCARD_BADTILEID= {big}이런!{/big}{n}룸 {#ff1144}((room)){#}의 {#ff1144}(((x)), ((y))){#}에{n}정의되지 않은 ((type))타일 ID {#ff1144}((id)){#}가 있습니다.{n}더 자세한 정보는 {#44adf7}log.txt{#}를 확인해주세요.
+ POSTCARD_DECALREGERROR= {big}이런!{/big}{n}{#ff1144}((property)){#} property를 {#ff1144}((decal)){#}에{n}적용하는 과정에서 오류가 발생했습니다.{n}{#44adf7}Decal Registry{#}에 누락되거나 부적절한 attribute가 있는 것 같습니다.
+ POSTCARD_MISSINGTUTORIAL= {big}이런!{/big}{n}플레이백 튜토리얼 {#ff1144}((tutorial)){#}을(를) 찾을 수 없습니다.{n}더 자세한 정보는 {#44adf7}log.txt{#}를 확인해주세요.
+ POSTCARD_TILEXMLERROR= {big}이런!{/big}{n}{#ff1144}((path)){#}의 타일셋을 파싱하는 과정에서 에러가 발생했습니다.{n}더 자세한 정보는 {#44adf7}log.txt{#}를 확인해주세요.
+ POSTCARD_XMLERROR= {big}이런!{/big}{n}{#ff1144}((path)){#}에 구문 오류가 있습니다.{n}더 자세한 정보는 {#44adf7}log.txt{#}를 확인해주세요.
+ POSTCARD_BOSSLASTNODEHIT= {big}이런!{/big}{n}{#ff1144}보스 배들린이{#} 마지막 노드에서 피격되었습니다. 해당 룸에서 보스 배들린이 피격될 수 없는 위치에 노드를 추가해주세요.
# Main Menu
MENU_TITLETOUCH= TOUCH
@@ -29,6 +35,7 @@
MENU_MODOPTIONS= 모드 옵션
MENU_PAUSE_MODOPTIONS= 모드 옵션
+ MENU_MODOPTIONS_UPDATE_FAILED= 에베레스트 업데이트에 실패했습니다.
MENU_MODOPTIONS_ONE_MOD_FAILEDTOLOAD= 모드 1개를 로드하지 못했습니다.
MENU_MODOPTIONS_MULTIPLE_MODS_FAILEDTOLOAD= 모드 {0}개를 로드하지 못했습니다.
MENU_MODOPTIONS_EVEREST_YAML_ERRORS= everest.yaml 로드 에러가 발생했습니다.
@@ -57,31 +64,53 @@
MODOPTIONS_COREMODULE_LAUNCHWITHOUTINTRO= 인트로 없이 실행하기
MODOPTIONS_COREMODULE_SHOWMODOPTIONSINGAME= 일시정지 화면에서 모드 옵션 보여주기
MODOPTIONS_COREMODULE_SHOWEVERESTTITLESCREEN= 에버레스트 타이틀 화면 보여주기
- MODOPTIONS_COREMODULE_INPUTGUI= 입력 방식
+ MODOPTIONS_COREMODULE_INPUTGUI= 입력 방법
MODOPTIONS_COREMODULE_INPUTGUI_= AUTO
MODOPTIONS_COREMODULE_INPUTGUI_KEYBOARD= 키보드
- MODOPTIONS_COREMODULE_INPUTGUI_NS= SWITCH
- MODOPTIONS_COREMODULE_INPUTGUI_NS_LEFTJOYCON= SWITCH L
- MODOPTIONS_COREMODULE_INPUTGUI_NS_RIGHTJOYCON= SWITCH R
+ MODOPTIONS_COREMODULE_INPUTGUI_NS= 닌텐도 스위치
+ MODOPTIONS_COREMODULE_INPUTGUI_NS_LEFTJOYCON= 닌텐도 스위치 왼쪽 조이콘
+ MODOPTIONS_COREMODULE_INPUTGUI_NS_RIGHTJOYCON= 닌텐도 스위치 오른쪽 조이콘
MODOPTIONS_COREMODULE_INPUTGUI_PS4= PS4
- MODOPTIONS_COREMODULE_INPUTGUI_XB1= XBONE
+ MODOPTIONS_COREMODULE_INPUTGUI_XB1= XBOX ONE
MODOPTIONS_COREMODULE_INPUTGUI_TOUCH= TOUCH
MODOPTIONS_COREMODULE_MAINMENUMODE= 메인 메뉴 표기 방식
MODOPTIONS_COREMODULE_MAINMENUMODE_= 세로
MODOPTIONS_COREMODULE_MAINMENUMODE_ROWS= 가로
MODOPTIONS_COREMODULE_MAINMENUMODE_TOUCH= TOUCH
- MODOPTIONS_COREMODULE_AUTOUPDATEMODSONSTARTUP= 시작할 때 자동으로 모드를 업데이트하기
+ MODOPTIONS_COREMODULE_AUTOUPDATEMODSONSTARTUP= 시작할 때 모드를 자동으로 업데이트하기
MODOPTIONS_COREMODULE_MODUPDATES= 모드 업데이트 확인하기
MODOPTIONS_COREMODULE_USEKEYBOARDFORTEXTINPUT= 키보드로 텍스트 입력하기
MODOPTIONS_COREMODULE_WARNONEVERESTYAMLERRORS= everest.yaml 에러를 표시
MODOPTIONS_COREMODULE_WARNONEVERESTYAMLERRORS_DESC= 모드 제작자한테 유용한 옵션
- MODOPTIONS_COREMODULE_DISCORDRICHPRESENCE= 디스코드 Rich Presence 기능 활성화
- MODOPTIONS_COREMODULE_MENUPAGEUP= Page Up in Menus
- MODOPTIONS_COREMODULE_MENUPAGEDOWN= Page Down in Menus
-
+ MODOPTIONS_COREMODULE_MENUNAV_SUBHEADER= 메뉴 이동
+ MODOPTIONS_COREMODULE_MENUPAGEUP= 메뉴 위로 올리기
+ MODOPTIONS_COREMODULE_MENUPAGEDOWN= 메뉴 아래로 내리기
+ MODOPTIONS_COREMODULE_DEBUGMODE_SUBHEADER= 디버그 모드
+ MODOPTIONS_COREMODULE_DEBUGCONSOLE= 디버그 콘솔
+ MODOPTIONS_COREMODULE_DEBUGMAP= 디버그 맵
+ MODOPTIONS_COREMODULE_MOUNTAINCAM_SUBHEADER= 메인 화면 산 카메라
+ MODOPTIONS_COREMODULE_CAMERAFORWARD= 카메라 앞으로 이동
+ MODOPTIONS_COREMODULE_CAMERABACKWARD= 카메라 뒤로 이동
+ MODOPTIONS_COREMODULE_CAMERARIGHT= 카메라 오른쪽으로 이동
+ MODOPTIONS_COREMODULE_CAMERALEFT= 카메라 왼쪽으로 이동
+ MODOPTIONS_COREMODULE_CAMERAUP= 카메라 위로 이동
+ MODOPTIONS_COREMODULE_CAMERADOWN= 카메라 아래로 이동
+ MODOPTIONS_COREMODULE_CAMERASLOW= 카메라 천천히 이동하기
+ MODOPTIONS_COREMODULE_CAMERAPRINT= 카메라 위치 이동하기
+ MODOPTIONS_COREMODULE_TOGGLEMOUNTAINFREECAM= 자유 시점 카메라 활성화
MODOPTIONS_COREMODULE_SOUNDTEST= 사운드 테스트
- MODOPTIONS_COREMODULE_OOBE= 초기 설정 화면 표시
+ MODOPTIONS_COREMODULE_OOBE= 처음 설정으로 되돌리기
MODOPTIONS_COREMODULE_TOGGLEMODS= 모드 활성화/비활성화
+
+ MODOPTIONS_COREMODULE_DISCORDRICHPRESENCE= 디스코드 Rich Presence
+ MODOPTIONS_COREMODULE_DISCORDRICHPRESENCEOPTIONS= Rich Presence 설정
+ MODOPTIONS_COREMODULE_DISCORDSHOWICON= 아이콘 보여주기
+ MODOPTIONS_COREMODULE_DISCORDSHOWMAP= 챕터 이름 보여주기
+ MODOPTIONS_COREMODULE_DISCORDSHOWSIDE= 챕터 사이드 보여주기 (A, B...)
+ MODOPTIONS_COREMODULE_DISCORDSHOWROOM= 룸 이름 보여주기
+ MODOPTIONS_COREMODULE_DISCORDSHOWBERRIES= 모은 딸기 개수 보여주기
+ MODOPTIONS_COREMODULE_DISCORDSHOWDEATHS= 죽은 횟수 보여주기
+ MODOPTIONS_COREMODULE_DISCORDFAILED= 디스코드에 연결할 수 없습니다. 설정을 껐다 켜 다시 시도해보세요.
MODOPTIONS_COREMODULE_NOTLOADED_A= 모드 로드에 실패했습니다.
MODOPTIONS_COREMODULE_NOTLOADED_B= 자세한 사항은 log.txt를 확인해주세요.
@@ -89,7 +118,7 @@
MODOPTIONS_COREMODULE_YAMLERRORS= everest.yaml 파일 로드에 실패했습니다.
MODOPTIONS_VANILLATRISTATE_NEVER= OFF
- MODOPTIONS_VANILLATRISTATE_EVEREST= 에버레스트
+ MODOPTIONS_VANILLATRISTATE_EVEREST= 에베레스트
MODOPTIONS_VANILLATRISTATE_ALWAYS= 항상
# Sound Test
@@ -123,9 +152,20 @@
UPDATER_VERSIONS_ERR_DOWNLOAD= 버전 리스트 다운로드에 실패했습니다.
UPDATER_VERSIONS_ERR_FORMAT= 포맷을 읽을 수 없습니다.
+
+ UPDATER_CURRENT_BRANCH= 현재 브랜치
+
+ UPDATER_SRC_STABLE= STABLE
+ UPDATER_SRC_BETA= BETA
+ UPDATER_SRC_DEV= DEV
+ UPDATER_SRC_CORE= CORE
+
+ UPDATER_SRC_RELEASE_GITHUB= Tagged releases (GitHub)
+ UPDATER_SRC_BUILDBOT_AZURE= 자동 빌드 (Azure)
+# currently unused
UPDATER_SRC_BUILDBOT= 자동 빌드
-
+
# Everest Updater
EVERESTUPDATER_NOTSUPPORTED= 이 플랫폼에서 업데이트가 지원되지 않습니다. - 업데이트 취소
EVERESTUPDATER_NOUPDATE= 업데이트가 없습니다. - 업데이트 취소
@@ -141,6 +181,8 @@
EVERESTUPDATER_RESTARTING= 다시 실행
EVERESTUPDATER_RESTARTINGIN= {0}초 후 다시 실행
EVERESTUPDATER_STARTINGFAILED= 인스톨러 실행 실패!
+ EVERESTUPDATER_MISSINGRUNTIME_A= .NET Core Everest를 설치하려면 .NET 7.0 런타임을 먼저 설치해야 합니다.
+ EVERESTUPDATER_MISSINGRUNTIME_B= .NET 7.0 런타임은 이 곳에서 설치할 수 있습니다: {0}
EVERESTUPDATER_ERRORHINT1= GitHub @ https://github.com/EverestAPI/Everest 에서 새로운 이슈를 작성하거나
EVERESTUPDATER_ERRORHINT2= 셀레스트 공식 디스코드의 #modding_help 채널에 방문해주세요(위의 리포지토리에서 참여 가능).
EVERESTUPDATER_ERRORHINT3= log.txt를 잊지 말고 꼭 업로드해주세요.
@@ -161,7 +203,10 @@
MODUPDATECHECKER_UPDATE_ALL= 모든 모드 업데이트
MODUPDATECHECKER_UPDATE_ALL_INPROGRESS= 모든 모드 업데이트 중...
MODUPDATECHECKER_UPDATE_ALL_DONE= 모든 모드 업데이트 완료.
- MODUPDATECHECKER_SHUTDOWN= 종료
+ MODUPDATECHECKER_RESTARTNEEDED= 모드를 적용하려면 셀레스트를 다시 시작해야 합니다.
+ MODUPDATECHECKER_MENU_HEADER_RESTART= 선택
+ MODUPDATECHECKER_SHUTDOWN= 셀레스트 종료
+ MODUPDATECHECKER_RESTART= 다시 실행
# Auto Mod Updater
AUTOUPDATECHECKER_CHECKING= 모드 업데이트 확인 중...
@@ -182,6 +227,7 @@
DEPENDENCYDOWNLOADER_DONE= 완료.
DEPENDENCYDOWNLOADER_DOWNLOAD_DATABASE_FAILED= 에러: 데이터베이스 다운로드에 실패했습니다. 자세한 사항은 log.txt를 확인해주세요.
DEPENDENCYDOWNLOADER_MUST_UPDATE_EVEREST= 경고: 일부 모드를 구동하기 위해선 에버레스트를 업데이트해야 합니다. 에버레스트 버전 변경하기 메뉴에서 최신 버전을 설치해주세요.
+ DEPENDENCYDOWNLOADER_NEEDS_CORE_EVEREST= WARNING: A (currently WIP) .NET Core build of Everest is required for some mods to load. Install it from the Change Everest Version menu.
DEPENDENCYDOWNLOADER_EVEREST_UPDATE= 일부 모드를 구동하기 위해 에버레스트는 {0}으로 업데이트 됩니다. 확인 버튼을 눌러 진행해주세요.
DEPENDENCYDOWNLOADER_MOD_NOT_FOUND= 에러: 데이터베이스에서 {0}을(를) 찾을 수 없습니다. 해당 모드는 수동으로 설치해주세요.
DEPENDENCYDOWNLOADER_UPDATE_CELESTE= 에러: 일부 모드를 구동하기 위해선 최신 버전의 셀레스트가 필요합니다. 셀레스트를 업데이트해주세요.
@@ -246,4 +292,4 @@
ASSETRELOADHELPER_RELOADINGTEXTURES= Reloading textures:
ASSETRELOADHELPER_LOADINGNEWMOD= Loading new mod:
ASSETRELOADHELPER_RELOADINGMODASSEMBLY= Reloading mod assembly:
- ASSETRELOADHELPER_RELOADINGMOUNTAIN= Reloading mountain
\ No newline at end of file
+ ASSETRELOADHELPER_RELOADINGMOUNTAIN= Reloading mountain
From 0c959a624ade83f7c4dd2c4355e19aa3db8a5b5f Mon Sep 17 00:00:00 2001
From: GarretShadow <141551771+GarretShadow152@users.noreply.github.com>
Date: Thu, 14 Sep 2023 15:24:10 +0500
Subject: [PATCH 2/4] Update Russian.txt
Update Russian.txt to the latest version
---
Celeste.Mod.mm/Content/Dialog/Russian.txt | 321 +++++++++++++---------
1 file changed, 195 insertions(+), 126 deletions(-)
diff --git a/Celeste.Mod.mm/Content/Dialog/Russian.txt b/Celeste.Mod.mm/Content/Dialog/Russian.txt
index 895d01664..e615bb45c 100644
--- a/Celeste.Mod.mm/Content/Dialog/Russian.txt
+++ b/Celeste.Mod.mm/Content/Dialog/Russian.txt
@@ -19,208 +19,277 @@
# {anchor} controls the visual position of the textbox in-game
# Helper Postcards
- POSTCARD_LEVELGONE= {big}Спасибо, ((player))!{/big}{n}Но {#ff1144}((sid)){#} на другой горе.
- POSTCARD_LEVELLOADFAILED= {big}Простите!{/big}{n}Нам не удалось загрузить{#ff1144}((sid)){#}{n}Пожайлуста, отправте ваш {#44adf7}log.txt{#}{n} создателю карты.
- POSTCARD_LEVELNOSPAWN= {big}Упс!{/big}{n}Кто-то (или что-то) поставил ваше{n}{#44adf7}место начала{#} не на то место!{n}Проверьте, есть ли в вашей карте{n}объект {#44adf7}Player{#}.
+ POSTCARD_LEVELGONE= {big}Спасибо, ((player))!{/big}{n}Но {#ff1144}((sid)){#} находится на другой горе.
+ POSTCARD_LEVELLOADFAILED= {big}Извините!{/big}{n}Но {#ff1144}((sid)){#} загрузить не удалось.{n}Пожайлуста, отправте ваш {#44adf7}log.txt{#}{n} создателю карты.
+ POSTCARD_LEVELNOSPAWN= {big}Упс!{/big}{n}Кто-то переместил вашу {#44adf7}стартовую позицию!{#}{n}Пожайлуста, проверьте вашу карту{n}на наличие объекта {#44adf7}Player{#}.
+ POSTCARD_BADTILEID= {big}Упс!{/big}{n}Неопределенный ((type))tile id {#ff1144}((id)){#} на{n}{#ff1144}(((x)), ((y))){#} в комнате {#ff1144}((room)){#}{n}Проверьте свой {#44adf7}log.txt{#} для большей информации.
+ POSTCARD_DECALREGERROR= {big}Упс!{/big}{n}Ошибка при применении свойства{n}{#ff1144}((property)){#} к {#ff1144}((decal)){#}{n}Пропущенный или некорректный {#44adf7}Decal Registry{#}.
+ POSTCARD_MISSINGTUTORIAL= {big}Упс!{/big}{n}Воспроизведение туториала {#ff1144}((tutorial)){#} не было найдено.{n}Проверьте свой {#44adf7}log.txt{#} для большей информации.
+ POSTCARD_TILEXMLERROR= {big}Упс!{/big}{n}Ошибка соответствия набора текстур в {#ff1144}((path)){#}{n}Проверьте свой {#44adf7}log.txt{#} для большей информации.
+ POSTCARD_XMLERROR= {big}Упс!{/big}{n}{#ff1144}((path)){#} содержит синтаксическую ошибку.{n}Проверьте свой {#44adf7}log.txt{#} для большей информации.
+ POSTCARD_BOSSLASTNODEHIT= {big}Упс!{/big}{n}Сущность {#ff1144}Badeline Boss{#} была побеждена на последнем узле.{n}Пожайлуста, добавьте дополнительный узел за пределами карты, чтобы игрок не мог поразить его.
# Main Menu
- MENU_TITLETOUCH= НАЖМИТЕ
- MENU_MAPLIST= Список Карт
- MENU_MODOPTIONS= Настройки Модов
- MENU_PAUSE_MODOPTIONS= Настройки Модов
+ MENU_TITLETOUCH= НАЖАТИЕ
+ MENU_MAPLIST= Список Карт
+ MENU_MODOPTIONS= Настройки Модов
+ MENU_PAUSE_MODOPTIONS= Настройки Модов
- MENU_MODOPTIONS_EVEREST_YAML_ERRORS= Произошла ошибка загрузки everest.yaml!
+ MENU_MODOPTIONS_UPDATE_FAILED= Не Удалось Загрузить Обновление Everest
MENU_MODOPTIONS_ONE_MOD_FAILEDTOLOAD= Не удалось загрузить 1 мод
- MENU_MODOPTIONS_MULTIPLE_MODS_FAILEDTOLOAD= Не удалось загрузить {0} модов
- MENU_MODOPTIONS_UPDATE_AVAILABLE= Есть новое обновление для Everest!
- MENU_MODOPTIONS_MOD_UPDATE_AVAILABLE= Доступно новое обновление для 1 мода!
- MENU_MODOPTIONS_MOD_UPDATES_AVAILABLE= Доступно обновление для {0} модов.
+ MENU_MODOPTIONS_MULTIPLE_MODS_FAILEDTOLOAD= Не удалось загрузить модов: {0}
+ MENU_MODOPTIONS_EVEREST_YAML_ERRORS= При загрузке everest.yaml произошла ошибка
+ MENU_MODOPTIONS_UPDATE_AVAILABLE= Доступно новое обновление для Everest
+ MENU_MODOPTIONS_MOD_UPDATE_AVAILABLE= Доступно новое обновление для 1 мода
+ MENU_MODOPTIONS_MOD_UPDATES_AVAILABLE= Доступно обновление для {0} модов
# Title Screen
- MENU_TITLESCREEN_RESTART_VANILLA= Перезагружаюсь в orig/Celeste.exe
+ MENU_TITLESCREEN_RESTART_VANILLA= Перезагрузить как orig/Celeste.exe
# Extra Key Mapping
KEY_CONFIG_ADDING= НАЖМИТЕ ДОПОЛНИТЕЛЬНУЮ КЛАВИШУ ДЛЯ
- KEY_CONFIG_ADDITION_HINT= Нажмите SHIFT + CONFIRM чтобы добавить дополнительную клавишу
+ KEY_CONFIG_ADDITION_HINT= Нажмите SHIFT + CONFIRM чтобы добавить или убрать дополнительную клавишу
-# Mod Options
+# Mod OptionsChange Everest Version
MODOPTIONS_TITLE= EVEREST
- MODOPTIONS_NEEDSRELAUNCH= Необходима перезагрузка чтобы иметь эффект
+ MODOPTIONS_NEEDSRELAUNCH= Для применения необходима перезагрузка
# Core Module Options
MODOPTIONS_COREMODULE_UPDATE= Обновить Everest до ((version))
- MODOPTIONS_COREMODULE_DOWNLOADDEPS= Скачать недостающие зависимости
+ MODOPTIONS_COREMODULE_DOWNLOADDEPS= Установить Недостающие Зависимости
MODOPTIONS_COREMODULE_VERSIONLIST= Изменить Версию Everest
MODOPTIONS_COREMODULE_TITLE= Ядро Everest
MODOPTIONS_COREMODULE_DEBUGMODE= Режим Отладки
- # better to keep this in english
- MODOPTIONS_COREMODULE_LAUNCHWITHFMODLIVEUPDATE= Загружаться с FMOD Live Update
- MODOPTIONS_COREMODULE_LAUNCHWITHOUTINTRO= Загружаться без введения
- MODOPTIONS_COREMODULE_SHOWMODOPTIONSINGAME= Показывать настройки модов в игре
- MODOPTIONS_COREMODULE_SHOWEVERESTTITLESCREEN= Показывать меню Everest
+ MODOPTIONS_COREMODULE_LAUNCHWITHFMODLIVEUPDATE= Запускать с FMOD Live Update
+ MODOPTIONS_COREMODULE_LAUNCHWITHOUTINTRO= Запускать без Интро
+ MODOPTIONS_COREMODULE_SHOWMODOPTIONSINGAME= Показывать Настройки Модов в Игре
+ MODOPTIONS_COREMODULE_SHOWEVERESTTITLESCREEN= Показывать Загрузочный Экран Everest
MODOPTIONS_COREMODULE_INPUTGUI= Ввод
MODOPTIONS_COREMODULE_INPUTGUI_= АВТО
MODOPTIONS_COREMODULE_INPUTGUI_KEYBOARD= КЛАВИАТУРА
MODOPTIONS_COREMODULE_INPUTGUI_NS= SWITCH
- MODOPTIONS_COREMODULE_INPUTGUI_NS_LEFTJOYCON= ПРАВЫЙ JOYCON
- MODOPTIONS_COREMODULE_INPUTGUI_NS_RIGHTJOYCON= ЛЕВЫЙ JOYCON
+ MODOPTIONS_COREMODULE_INPUTGUI_NS_LEFTJOYCON= SWITCH L
+ MODOPTIONS_COREMODULE_INPUTGUI_NS_RIGHTJOYCON= SWITCH R
MODOPTIONS_COREMODULE_INPUTGUI_PS4= PS4
MODOPTIONS_COREMODULE_INPUTGUI_XB1= XBONE
MODOPTIONS_COREMODULE_INPUTGUI_TOUCH= НАЖАТИЕ
- MODOPTIONS_COREMODULE_MAINMENUMODE= Режим главного меню
- MODOPTIONS_COREMODULE_MAINMENUMODE_= ОБЫЧНЫЙ
+ MODOPTIONS_COREMODULE_MAINMENUMODE= Режим Главного Меню
+ MODOPTIONS_COREMODULE_MAINMENUMODE_= ВАНИЛЬНЫЙ
MODOPTIONS_COREMODULE_MAINMENUMODE_ROWS= РЯДЫ
MODOPTIONS_COREMODULE_MAINMENUMODE_TOUCH= НАЖАТИЕ
- MODOPTIONS_COREMODULE_AUTOUPDATEMODSONSTARTUP= Автоматически обновлять моды при загрузке
- MODOPTIONS_COREMODULE_MODUPDATES= Проверить обновления модов
- MODOPTIONS_COREMODULE_USEKEYBOARDFORTEXTINPUT= Использовать клавиатуру для ввода
- MODOPTIONS_COREMODULE_WARNONEVERESTYAMLERRORS= Предупреждать об ошибках everest.yaml
+ MODOPTIONS_COREMODULE_AUTOUPDATEMODSONSTARTUP= Автоматически Обновлять Моды при Запуске
+ MODOPTIONS_COREMODULE_MODUPDATES= Проверить Обновления Модов
+ MODOPTIONS_COREMODULE_USEKEYBOARDFORTEXTINPUT= Использовать Клавиатуру для Ввода
+ MODOPTIONS_COREMODULE_WARNONEVERESTYAMLERRORS= Предупреждать об Ошибках everest.yaml
MODOPTIONS_COREMODULE_WARNONEVERESTYAMLERRORS_DESC= Полезно для создателей модов
- MODOPTIONS_COREMODULE_DISCORDRICHPRESENCE= Discord Rich Presence
- MODOPTIONS_COREMODULE_MENUPAGEUP= Page Up в Меню
- MODOPTIONS_COREMODULE_MENUPAGEDOWN= Page Down в Меню
-
- MODOPTIONS_COREMODULE_SOUNDTEST= Тест Звука
-
- MODOPTIONS_COREMODULE_OOBE= Сменить начальную загрузку
+ MODOPTIONS_COREMODULE_MENUNAV_SUBHEADER= НАВИГАЦИЯ В МЕНЮ
+ MODOPTIONS_COREMODULE_MENUPAGEUP= Меню Вверх
+ MODOPTIONS_COREMODULE_MENUPAGEDOWN= Меню Вниз
+ MODOPTIONS_COREMODULE_DEBUGMODE_SUBHEADER= РЕЖИМ ОТЛАДКИ
+ MODOPTIONS_COREMODULE_DEBUGCONSOLE= Консоль Отладки
+ MODOPTIONS_COREMODULE_DEBUGMAP= Карта Отладки
+ MODOPTIONS_COREMODULE_MOUNTAINCAM_SUBHEADER= КАМЕРА ДЛЯ 3D ГОРЫ
+ MODOPTIONS_COREMODULE_CAMERAFORWARD= Камера Вперёд
+ MODOPTIONS_COREMODULE_CAMERABACKWARD= Камера Назад
+ MODOPTIONS_COREMODULE_CAMERARIGHT= Камера Вправо
+ MODOPTIONS_COREMODULE_CAMERALEFT= Камера Влево
+ MODOPTIONS_COREMODULE_CAMERAUP= Камера Вверх
+ MODOPTIONS_COREMODULE_CAMERADOWN= Камера Вниз
+ MODOPTIONS_COREMODULE_CAMERASLOW= Камера Медленно
+ MODOPTIONS_COREMODULE_CAMERAPRINT= Записать Позицию Камеры
+ MODOPTIONS_COREMODULE_TOGGLEMOUNTAINFREECAM= Включить Свободную Камеру
+ MODOPTIONS_COREMODULE_SOUNDTEST= Проверка Звука
+ MODOPTIONS_COREMODULE_OOBE= Повторить Первоначальную Настройку
+ MODOPTIONS_COREMODULE_TOGGLEMODS= Включить или Выключить Моды
- MODOPTIONS_COREMODULE_TOGGLEMODS= Включить или Выключить моды
+ MODOPTIONS_COREMODULE_DISCORDRICHPRESENCE= Discord Rich Presence
+ MODOPTIONS_COREMODULE_DISCORDRICHPRESENCEOPTIONS= Настройки Rich Presence
+ MODOPTIONS_COREMODULE_DISCORDSHOWICON= Показывать Иконку
+ MODOPTIONS_COREMODULE_DISCORDSHOWMAP= Показывать Карту
+ MODOPTIONS_COREMODULE_DISCORDSHOWSIDE= Показывать Сторону (A, B...)
+ MODOPTIONS_COREMODULE_DISCORDSHOWROOM= Показывать Имя Комнаты
+ MODOPTIONS_COREMODULE_DISCORDSHOWBERRIES= Показывать Количество Ягод
+ MODOPTIONS_COREMODULE_DISCORDSHOWDEATHS= Показывать Количество Смертей
+ MODOPTIONS_COREMODULE_DISCORDFAILED= Ошибка соединения с Discord. Выключите и попробуйте ещё раз.
- MODOPTIONS_COREMODULE_NOTLOADED_A= Не удалось загрузить некоторые моды.
- MODOPTIONS_COREMODULE_NOTLOADED_B= Проверьте ваш log.txt.
- MODOPTIONS_COREMODULE_NOTLOADED_NOTFOUND= {0} не найдено
- MODOPTIONS_COREMODULE_YAMLERRORS= Некоторые everest.yaml файлы не могут быть загружены.
+ MODOPTIONS_COREMODULE_NOTLOADED_A= Некоторые моды не были загружены.
+ MODOPTIONS_COREMODULE_NOTLOADED_B= Проверьте свой log.txt для большей информации.
+ MODOPTIONS_COREMODULE_NOTLOADED_NOTFOUND= {0} не были найдены
+ MODOPTIONS_COREMODULE_YAMLERRORS= Некоторые файлы everest.yaml не были загружены.
- MODOPTIONS_VANILLATRISTATE_NEVER= НИКОГДА
+ MODOPTIONS_VANILLATRISTATE_NEVER= ВЫКЛ.
MODOPTIONS_VANILLATRISTATE_EVEREST= EVEREST
MODOPTIONS_VANILLATRISTATE_ALWAYS= ВСЕГДА
# Sound Test
- SOUNDTEST_TITLE= ТЕСТ ЗВУКА
+ SOUNDTEST_TITLE= ПРОВЕРКА ЗВУКА
SOUNDTEST_AUDIOPARAMS_OPEN_1= Нажмите
- SOUNDTEST_AUDIOPARAMS_OPEN_2= чтобы изменить настройки Аудио
- SOUNDTEST_AUDIOPARAMS= Настройки Аудио
+ SOUNDTEST_AUDIOPARAMS_OPEN_2= чтобы менять Параметры Аудио
+ SOUNDTEST_AUDIOPARAMS= Параметры Аудио
# Maplist
MAPLIST_TITLE= СПИСОК КАРТ
- MAPLIST_FILTERS= Фильтры
+ MAPLIST_FILTERS= Фильры
MAPLIST_TYPE= От
MAPLIST_TYPE_ALLMODS= Все Моды
- MAPLIST_SIDE= Сторона
+ MAPLIST_SIDE= Стороны
MAPLIST_LIST= Карты
- MAPLIST_UNCATEGORIZED= Некатегоризированные
+ MAPLIST_UNCATEGORIZED= Без Категории
MAPLIST_SEARCH= Поиск
- MAPLIST_SEARCH_MATCH= Quick Match
- MAPLIST_TYPE_EVERYTHING= Все
- MAPLIST_RESULTS_SINGULAR= {0} результат найден
+ MAPLIST_SEARCH_MATCH= Быстрый Поиск
+ MAPLIST_TYPE_EVERYTHING= Любой
+ MAPLIST_RESULTS_SINGULAR= {0} результатов найдено
MAPLIST_RESULTS_PLURAL= {0} результатов найдено
LEVELSET_CELESTE= Celeste
- LEVELSET_= Некатегоризированные
+ LEVELSET_= Без Категории
# Updater
- UPDATER_TITLE= ОБНОВЛЕНИЯ
+ UPDATER_TITLE= УСТАНОВЩИК
UPDATER_VERSIONS_TITLE= ИЗМЕНИТЬ ВЕРСИЮ EVEREST
UPDATER_VERSIONS_CURRENT= Установлено: ((version))
UPDATER_VERSIONS_REQUESTING= Обновляю...
UPDATER_VERSIONS_ERR_DOWNLOAD= Не удалось загрузить список версий.
- UPDATER_VERSIONS_ERR_FORMAT= Непонятный формат.
+ UPDATER_VERSIONS_ERR_FORMAT= Неизвестный формат.
+
+ UPDATER_CURRENT_BRANCH= Текущая сборка
+
+ UPDATER_SRC_STABLE= STABLE
+ UPDATER_SRC_BETA= BETA
+ UPDATER_SRC_DEV= DEV
+ UPDATER_SRC_CORE= CORE
+
+ UPDATER_SRC_RELEASE_GITHUB= Tagged releases (GitHub)
+ UPDATER_SRC_BUILDBOT_AZURE= Automatic builds (Azure)
+# currently unused
UPDATER_SRC_BUILDBOT= Автоматические сборки
-
+
# Everest Updater
- EVERESTUPDATER_NOTSUPPORTED= Обновление не поддерживается на этом устройстве - отмена.
- EVERESTUPDATER_NOUPDATE= Обновления отсутствуют - отмена.
- EVERESTUPDATER_UPDATING= Обновляю до {0} (ветвь: {1}) @ {2}
+ EVERESTUPDATER_NOTSUPPORTED= Обновление не поддерживается данной платформой - отменяю.
+ EVERESTUPDATER_NOUPDATE= Нет обновлений - отменяю.
+ EVERESTUPDATER_UPDATING= Обновление на {0} (branch: {1}) @ {2}
EVERESTUPDATER_DOWNLOADING= Загрузка
- EVERESTUPDATER_DOWNLOADING_PROGRESS= Загрузка:
- EVERESTUPDATER_DOWNLOADFAILED= Ошибка загрузки!
+ EVERESTUPDATER_DOWNLOADING_PROGRESS= Загрузка:
+ EVERESTUPDATER_DOWNLOADFAILED= Не удалось загрузить!
EVERESTUPDATER_DOWNLOADFINISHED= Загрузка завершена.
- EVERESTUPDATER_EXTRACTING= Распаковываем обновление .zip
- EVERESTUPDATER_ZIPENTRIES= записи
- EVERESTUPDATER_EXTRACTIONFAILED= Ошибка распаковки!
+ EVERESTUPDATER_EXTRACTING= Распаковка обновления .zip
+ EVERESTUPDATER_ZIPENTRIES= entries
+ EVERESTUPDATER_EXTRACTIONFAILED= Не удалось распаковать!
EVERESTUPDATER_EXTRACTIONFINISHED= Распаковка завершена.
- EVERESTUPDATER_RESTARTING= Перезагружаю
- EVERESTUPDATER_RESTARTINGIN= Перезагрузка через {0}
- EVERESTUPDATER_STARTINGFAILED= Ошибка запуска установщика!
- # not sure about "проблема" - issue, because in Russian issue and problem has the same translation and meaning, so it will be good maybe if will stay in English
- EVERESTUPDATER_ERRORHINT1= Пожалуйста, создайте новую проблему на GitHub @ https://github.com/EverestAPI/Everest
- EVERESTUPDATER_ERRORHINT2= или сообщите в #modding_help канал в Дискорде (приглашение в репозитории).
- EVERESTUPDATER_ERRORHINT3= Не забудьте прикрепить log.txt
+ EVERESTUPDATER_RESTARTING= Перезапуск
+ EVERESTUPDATER_RESTARTINGIN= Перезапуск через {0}
+ EVERESTUPDATER_MISSINGRUNTIME_A= Установка .NET Core Everest требует среду .NET 7.0
+ EVERESTUPDATER_MISSINGRUNTIME_B= Вы можете установить его по следующей ссылке: {0}
+ EVERESTUPDATER_STARTINGFAILED= Не удалось запустить установщик!
+ EVERESTUPDATER_ERRORHINT1= Пожалуйста, создайте новый отчёт на GitHub @ https://github.com/EverestAPI/Everest
+ EVERESTUPDATER_ERRORHINT2= или посетите канал #modding_help в Discord (приглашение в репозитории).
+ EVERESTUPDATER_ERRORHINT3= Не забудьте загрузить ваш log.txt
# Mod Updater
MODUPDATECHECKER_MENU_TITLE= ОБНОВЛЕНИЯ МОДОВ
- MODUPDATECHECKER_NOUPDATE= Обновления отсутствуют
- MODUPDATECHECKER_MENU_HEADER= Доступные Обновления
- MODUPDATECHECKER_FETCHING= Проверяю обновления...
+ MODUPDATECHECKER_NOUPDATE= Нет доступных обновлений
+ MODUPDATECHECKER_MENU_HEADER= Доступные обновления
+ MODUPDATECHECKER_FETCHING= Проверка обновлений...
MODUPDATECHECKER_ERROR= Не удалось проверить обновления.
- MODUPDATECHECKER_UPDATED= Обновлено!
- MODUPDATECHECKER_DOWNLOADING= Загружаю...
- MODUPDATECHECKER_INSTALLING= Устанавливаю...
- MODUPDATECHECKER_FAILED= Произошла ошибка в обновлении!
- MODUPDATECHECKER_CANCELLING= отменяю обновление...
+ MODUPDATECHECKER_UPDATED= обновлено
+ MODUPDATECHECKER_DOWNLOADING= загрузка...
+ MODUPDATECHECKER_INSTALLING= установка...
+ MODUPDATECHECKER_FAILED= не удалось обновить!
+ MODUPDATECHECKER_CANCELLING= отмена обновления...
MODUPDATECHECKER_CANCELLED= обновление отменено
- MODUPDATECHECKER_WILLRESTART= Нажмите Назад чтобы перезагрузить Celeste
+ MODUPDATECHECKER_WILLRESTART= нажмите Назад чтобы перезапустить Celeste
MODUPDATECHECKER_UPDATE_ALL= Обновить все моды
- MODUPDATECHECKER_UPDATE_ALL_INPROGRESS= Обновляю все моды...
- MODUPDATECHECKER_UPDATE_ALL_DONE= Все моды были обновлены.
- MODUPDATECHECKER_SHUTDOWN= Выход
+ MODUPDATECHECKER_UPDATE_ALL_INPROGRESS= Обновление всех модов...
+ MODUPDATECHECKER_UPDATE_ALL_DONE= Все моды были обновлены.
+ MODUPDATECHECKER_RESTARTNEEDED= для продолжения необходимо перезапустить Celeste
+ MODUPDATECHECKER_MENU_HEADER_RESTART= Выберите действие
+ MODUPDATECHECKER_SHUTDOWN= Выход
+ MODUPDATECHECKER_RESTART= Перезапуск
# Auto Mod Updater
- AUTOUPDATECHECKER_CHECKING= Проверяю обновления модов...
- AUTOUPDATECHECKER_UPDATING= Авто-обновляю
- AUTOUPDATECHECKER_DOWNLOADING= Загружаю
- AUTOUPDATECHECKER_VERIFYING= Проверяю
- AUTOUPDATECHECKER_INSTALLING= Устанавливаю
- AUTOUPDATECHECKER_FAILED= Не удалось установить некоторые обновления. Проверьте ваш log.txt.
- AUTOUPDATECHECKER_CONTINUE= Нажмите Подтвердить чтобы продолжить
- AUTOUPDATECHECKER_REBOOT= Нажмите Подтвердить чтобы перезагрузить Celeste
+ AUTOUPDATECHECKER_CHECKING= Проверка обновлений...
+ AUTOUPDATECHECKER_UPDATING= Авто-обновление
+ AUTOUPDATECHECKER_DOWNLOADING= Загрузка
+ AUTOUPDATECHECKER_VERIFYING= Проверка
+ AUTOUPDATECHECKER_INSTALLING= Установка
+ AUTOUPDATECHECKER_FAILED= Не удалось обновить. Проверьте свой log.txt для большей информации.
+ AUTOUPDATECHECKER_CONTINUE= Для продолжения нажмите Принять
+ AUTOUPDATECHECKER_REBOOT= Нажмите Принять чтобы перезапустить Celeste
AUTOUPDATECHECKER_SKIP= Пропустить
- AUTOUPDATECHECKER_SKIPPING= Пропускаю обновление...
+ AUTOUPDATECHECKER_SKIPPING= Пропуск обновления...
# Dependency downloader
DEPENDENCYDOWNLOADER_TITLE= УСТАНОВКА ЗАВИСИМОСТЕЙ
- DEPENDENCYDOWNLOADER_DOWNLOADING_DATABASE= Загружаем датабазу модов...
- DEPENDENCYDOWNLOADER_LOADING_INSTALLED_MODS= Загружаю информацию об установленных модах...
- DEPENDENCYDOWNLOADER_DONE= завершено.
- DEPENDENCYDOWNLOADER_DOWNLOAD_DATABASE_FAILED= ОШИБКА: Не удалось загрузить датабазу. Проверьте ваш log.txt.
- # You need to highlight the "Change Everest version". I did it by adding inverted commas, but you can add color
- DEPENDENCYDOWNLOADER_MUST_UPDATE_EVEREST= ВНИМАНИЕ: Для некоторых модов необходима новая версия Everest. Установите её в меню "Изменить Версию Everest".
- DEPENDENCYDOWNLOADER_EVEREST_UPDATE= Everest будет обновлен до {0} для работы некоторых модов. Нажмите Подтвердить для продолжения.
- DEPENDENCYDOWNLOADER_MOD_NOT_FOUND= ОШИБКА: В датабазе не найден {0}. Установите этот мод самостоятельно.
- DEPENDENCYDOWNLOADER_UPDATE_CELESTE= ОШИБКА: Некоторые из ваших модов требуют более новую версию Celeste для работы. Пожалуйста, обновите игру.
- DEPENDENCYDOWNLOADER_MOD_NOT_AUTO_INSTALLABLE= ОШИБКА: {0} доступен в нескольких версиях и не может быть установлен автоматически. Установите этот мод самостоятельно.
- DEPENDENCYDOWNLOADER_MOD_BLACKLISTED= ВНИМАНИЕ: {0}.zip находится в вашем чёрном списке. Уберите его оттуда, чтобы пользоваться им как зависимостью.
- DEPENDENCYDOWNLOADER_MOD_WRONG_VERSION= ОШИБКА: Требуется версия {1} для {0}, но есть только {2}. Установите этот мод самостоятельно.
- DEPENDENCYDOWNLOADER_RESTARTING= Перезагружаюсь
- DEPENDENCYDOWNLOADER_RESTARTING_IN= Перезагружаюсь через {0}
- DEPENDENCYDOWNLOADER_PRESS_BACK_TO_RESTART= Нажмите Назад чтобы перезагрузить Celeste.
- DEPENDENCYDOWNLOADER_PRESS_BACK_TO_GO_BACK= Нажмите Назад чтобы вернуться к Меню Модов.
- DEPENDENCYDOWNLOADER_DOWNLOADING= Загружаю {0} от {1}...
- DEPENDENCYDOWNLOADER_DOWNLOADING_MIRROR= Ошибка загрузки, загружаю с зеркала {0}...
+ DEPENDENCYDOWNLOADER_DOWNLOADING_DATABASE= Загрузка базы данных модов...
+ DEPENDENCYDOWNLOADER_LOADING_INSTALLED_MODS= Загрузка информации об установленных модах...
+ DEPENDENCYDOWNLOADER_DONE= выполнено.
+ DEPENDENCYDOWNLOADER_DOWNLOAD_DATABASE_FAILED= ОШИБКА: Загрузка базы данных модов прервана. Проверьте свой log.txt для большей информации.
+ DEPENDENCYDOWNLOADER_MUST_UPDATE_EVEREST= ПРЕДУПРЕЖДЕНИЕ: Для загрузки некоторых модов необходима более поздня версия Everest. Установите её в меню Изменить Версию Everest.
+ DEPENDENCYDOWNLOADER_NEEDS_CORE_EVEREST= ПРЕДУПРЕЖДЕНИЕ: Для загрузки некоторых модов необходима (последняя WIP) сборка .NET Core Everest. Установите её в меню Изменить Версию Everest.
+ DEPENDENCYDOWNLOADER_EVEREST_UPDATE= Everest будет обновлён до {0} для работы некоторых модов. Для продолжения нажмите Принять.
+ DEPENDENCYDOWNLOADER_MOD_NOT_FOUND= ОШИБКА: {0} не был найден в базе данных. Пожалуйста, установите этот мод вручную.
+ DEPENDENCYDOWNLOADER_UPDATE_CELESTE= ОШИБКА: Для работы некоторых модов необходима более поздня версия Celeste. Пожалуйста, обновите вашу игру.
+ DEPENDENCYDOWNLOADER_MOD_NOT_AUTO_INSTALLABLE= ОШИБКА: У {0} доступно несколько версий, поэтому он не может быть установлен автоматически. Пожалуйста, установите этот мод вручную.
+ DEPENDENCYDOWNLOADER_MOD_WRONG_VERSION= ОШИБКА: Необходима версия {1} мода {0}, но доступна только {2}. Пожалуйста, установите этот мод вручную.
+ DEPENDENCYDOWNLOADER_RESTARTING= Перезапуск
+ DEPENDENCYDOWNLOADER_RESTARTING_IN= Перезапуск через {0}
+ DEPENDENCYDOWNLOADER_PRESS_BACK_TO_RESTART= Нажмите Назад чтобы перезапустить Celeste.
+ DEPENDENCYDOWNLOADER_PRESS_BACK_TO_GO_BACK= Нажмите Назад чтобы вернуться к Настройкам Модов.
+ DEPENDENCYDOWNLOADER_DOWNLOADING= Загрузка {0} из {1}...
+ DEPENDENCYDOWNLOADER_DOWNLOADING_MIRROR= Загрузка прервана, пробуем зеркало {0}...
DEPENDENCYDOWNLOADER_DOWNLOAD_FINISHED= Загрузка завершена.
- # not sure what checksum means, but this is correct too
- DEPENDENCYDOWNLOADER_VERIFYING_CHECKSUM= Проверяю...
- DEPENDENCYDOWNLOADER_UPDATING= Устанавливаю обновление {0} ({1} -> {2}) к {3}...
- DEPENDENCYDOWNLOADER_INSTALLING= Устанавливаю мод {0} v.{1} к {2}...
- DEPENDENCYDOWNLOADER_INSTALL_FAILED= ОШИБКА: Не удалось установить {0}. Проверьте ваш log.txt.
- DEPENDENCYDOWNLOADER_MOD_UNBLACKLIST= Убираю {0} из чёрного списка...
- DEPENDENCYDOWNLOADER_UNBLACKLIST_FAILED= Ошибка в автоматическом удалении некоторых модов из чёрного списка. Проверьте log.txt для большей информации.
+ DEPENDENCYDOWNLOADER_VERIFYING_CHECKSUM= Финальная проверка...
+ DEPENDENCYDOWNLOADER_UPDATING= Установка мода с {0} ({1} -> {2}) до {3}...
+ DEPENDENCYDOWNLOADER_INSTALLING= Установка мода {0} v.{1} до {2}...
+ DEPENDENCYDOWNLOADER_INSTALL_FAILED= ОШИБКА: Установка {0} прервана. Проверьте свой log.txt для большей информации.
+ DEPENDENCYDOWNLOADER_MOD_UNBLACKLIST= Убираем мод {0} из чёрного списка...
+ DEPENDENCYDOWNLOADER_UNBLACKLIST_FAILED= Не удалось автоматически убрать мод из чёрного списка. Проверьте свой log.txt для большей информации.
DEPENDENCYDOWNLOADER_LOADING_MOD= Загрузка {0} из {1}...
DEPENDENCYDOWNLOADER_LOADING_MOD_NOMETA= Загрузка мода из {0}...
# OOBE (Out Of Box Experience) - first launch stuff
OOBE_WELCOME_HEADER= Добро пожаловать в Everest!
- OOBE_WELCOME_SUBHEADER= Что вы хотите сделать?
- OOBE_WELCOME_PLAY= Я хочу ИГРАТЬ с модами.
- OOBE_WELCOME_SPEEDRUN= Я хочу играть НА СКОРОСТЬ.
+ OOBE_WELCOME_SUBHEADER= Что вы хотите делать?
+ OOBE_WELCOME_PLAY= Я хочу ИГРАТЬ в моды.
+ OOBE_WELCOME_SPEEDRUN= Я хочу СПИДРАНИТЬ.
OOBE_WELCOME_CREATE= Я хочу СОЗДАВАТЬ моды.
OOBE_WELCOME_SKIP= Мне не нужна помощь.
- OOBE_SETTINGS_PLAY= Вы можете находить моды на GameBanana.{n}Установленные карты можно найти на карте мира.{n}Ваш прогресс можно увидеть в вашем статусе в Discord, если включен Rich Presence.{n}Нажмите F6 в режиме отладки чтобы открыть новый режим откладки карт.
- OOBE_SETTINGS_SPEEDRUN= Держите кнопку вправо на главном меню чтобы перезагрузить в обычную игру.{n}Вы можете находить и устанавливать моды на GameBanana.{n}Установленные карты можно найти на карте мира.{n}Нажмите F6 в режиме отладки чтобы открыть новый режим отладки карт.
- OOBE_SETTINGS_CREATE= Вы можете публиковать и искать моды на GameBanana.{n}Карты можно найти на карте мира.{n}Нажмите F6 в режиме отладки чтобы открыть новый режим отладки карт.{n}Нажмите F5 чтобы перезагрузить карту, в которой вы играете, или CTRL+F5 чтобы перезагрузить всю игру.{n}Если у вас нестандартная клавиатура . - открывает консоль, а q - закрывает.
- OOBE_SETTINGS_SUBHEADER= Вот настройки, которые могут вам помочь.
- OOBE_SETTINGS_MORE= Вы можете изменить это и не только в "Настройках Модов".
- OOBE_SETTINGS_OK= ОК
+ OOBE_SETTINGS_PLAY= Вы можете находить и устанавливать моды на сайте GameBanana.{n}Вы сможете найти установленные карты на карте мира.{n}Ваш прогресс можно увидеть в игровом статусе Discord.{n}Используйте F6 в режиме отладки, чтобы включить карту уровня.
+ OOBE_SETTINGS_SPEEDRUN= Зажмите вправо на экране названия, чтобы перезапуститься в ванильной версии.{n}Вы можете находить и устанавливать моды на сайте GameBanana.{n}Вы сможете найти установленные карты на карте мира.{n}Используйте F6 в режиме отладки, чтобы включить карту уровня.
+ OOBE_SETTINGS_CREATE= Вы можете находить и делиться модами на сайте GameBanana.{n}Вы сможете найти установленные карты на карте мира.{n}Используйте F6 в режиме отладки, чтобы включить карту уровня.{n}Нажмите F5 чтобы перезагрузить текущую карту, или CTRL+F5 чтобы перезапустить игру.{n}Если у вас не-QWERTY клавиатура:{n}. (клавиша "ю", но английская раскладка) открывает консоль, а команда q закроет её.
+ OOBE_SETTINGS_SUBHEADER= Вот некоторые настройки, которые могут вам понадобиться.
+ OOBE_SETTINGS_MORE= Вы сможете изменить это и многое другое в Настройках Модов.
+ OOBE_SETTINGS_OK= Хорошо
+
+# Mod Toggle Menu
+ MODOPTIONS_MODTOGGLE= ВКЛЮЧЕНИЕ МОДОВ
+ MODOPTIONS_MODTOGGLE_LOADING= Загрузка информации о модах...
+ MODOPTIONS_MODTOGGLE_TOGGLEDEPS= Автоматически включать зависимости
+ MODOPTIONS_MODTOGGLE_TOGGLEDEPS_MESSAGE1= Когда вы включаете мод, все зависимости тоже будут включены.
+ MODOPTIONS_MODTOGGLE_TOGGLEDEPS_MESSAGE2= Когда вы выключаете мод, все моды, которым он был необходим, будут выключены.
+ MODOPTIONS_MODTOGGLE_MESSAGE_1= Когда вы вкючаете или выключаете моды, ваш файл blacklist.txt будет изменён,
+ MODOPTIONS_MODTOGGLE_MESSAGE_2= и будет необходимо перезапустить Celeste для принятия изменений.
+ MODOPTIONS_MODTOGGLE_MESSAGE_3= Подсвеченные моды (зависимости) используются другими включенными модами.
+ MODOPTIONS_MODTOGGLE_WHITELISTWARN= Отключите свой белый список, чтобы эти настройки были применены должным образом.
+ MODOPTIONS_MODTOGGLE_ENABLEALL= Включить Всё
+ MODOPTIONS_MODTOGGLE_DISABLEALL= Выключить Всё
+ MODOPTIONS_MODTOGGLE_CANCEL= Отмена
+ MODOPTIONS_MODTOGGLE_ZIPS= Zip Файлы
+ MODOPTIONS_MODTOGGLE_DIRECTORIES= Папки
+ MODOPTIONS_MODTOGGLE_BINS= Bin Файлы Карты
+
+# Asset Reload Helper
+ ASSETRELOADHELPER_RELOADINGMAP= Перезагрузка карты
+ ASSETRELOADHELPER_RELOADINGLEVEL= Перезагрузка уровня
+ ASSETRELOADHELPER_UNLOADINGTEXTURE= Выгрузка текстуры:
+ ASSETRELOADHELPER_RELOADINGMAPNAME= Перезагрузка карты:
+ ASSETRELOADHELPER_RELOADINGALLMAPS= Перезагрузить все карты
+ ASSETRELOADHELPER_RELOADINGDIALOG= Перезагрузка диалога:
+ ASSETRELOADHELPER_RELOADINGTEXTURE= Перезагрузка текстуры:
+ ASSETRELOADHELPER_RELOADINGTEXTURES= Перезагрузка текстур:
+ ASSETRELOADHELPER_LOADINGNEWMOD= Загрузка нового мода:
+ ASSETRELOADHELPER_RELOADINGMODASSEMBLY= Перезагрузка сборки мода:
+ ASSETRELOADHELPER_RELOADINGMOUNTAIN= Перезагрузка горы
From 275405c16fec4575eeec6fe3013321a9871779b2 Mon Sep 17 00:00:00 2001
From: horizon-wings <127271516+horizon-wings@users.noreply.github.com>
Date: Mon, 9 Oct 2023 11:11:35 -0700
Subject: [PATCH 3/4] Fix non-even decal rendering (#624)
Fix decal rendering when decal dimensions are non-even
---
Celeste.Mod.mm/Patches/Decal.cs | 227 +++++++++++++++++++++++++++++---
1 file changed, 210 insertions(+), 17 deletions(-)
diff --git a/Celeste.Mod.mm/Patches/Decal.cs b/Celeste.Mod.mm/Patches/Decal.cs
index 818b28c9a..b2c19a4a6 100644
--- a/Celeste.Mod.mm/Patches/Decal.cs
+++ b/Celeste.Mod.mm/Patches/Decal.cs
@@ -84,7 +84,6 @@ public patch_CoreSwapImage(MTexture hot, MTexture cold) : base(active: false, vi
}
[MonoModIgnore]
- [PatchDecalImageRender]
public extern override void Render();
}
@@ -110,8 +109,11 @@ public override void Update() {
}
public override void Render() {
- if (activeTextures.Count > 0)
- activeTextures[(int) frame % activeTextures.Count].DrawCentered(Decal.Position, Decal.Color, Decal.scale, Decal.Rotation);
+ if (activeTextures.Count > 0) {
+ MTexture texture = activeTextures[(int) frame % activeTextures.Count];
+ Vector2 offset = new Vector2(texture.Center.X * Decal.scale.X % 1, texture.Center.Y * Decal.scale.X % 1);
+ texture.DrawCentered(Decal.Position + offset, Decal.Color, Decal.scale, Decal.Rotation);
+ }
}
}
@@ -152,15 +154,15 @@ public void ctor(string texture, Vector2 position, Vector2 scale, int depth, flo
[MonoModIgnore]
[MonoModPublic]
- [PatchMirrorMaskRotation]
+ [PatchMirrorMaskRender]
public extern void MakeMirror(string path, bool keepOffsetsClose);
[MonoModIgnore]
- [PatchMirrorMaskRotation]
+ [PatchMirrorMaskRender]
private extern void MakeMirror(string path, Vector2 offset);
[MonoModIgnore]
- [PatchMirrorMaskRotation]
+ [PatchMirrorMaskRender]
private extern void MakeMirrorSpecialCase(string path, Vector2 offset);
[MonoModIgnore]
@@ -348,16 +350,16 @@ namespace MonoMod {
class PatchDecalUpdateAttribute : Attribute { }
///
- /// Allow decal images to be rotated.
+ /// Allow decal images to be rotated and correct rendering of images with non-even dimensions.
///
[MonoModCustomMethodAttribute(nameof(MonoModRules.PatchDecalImageRender))]
class PatchDecalImageRenderAttribute : Attribute { }
///
- /// Allow mirror masks to be rotated.
+ /// Allow mirror masks to be rotated and correct rendering of masks with non-even dimensions.
///
- [MonoModCustomMethodAttribute(nameof(MonoModRules.PatchMirrorMaskRotation))]
- class PatchMirrorMaskRotationAttribute : Attribute { }
+ [MonoModCustomMethodAttribute(nameof(MonoModRules.PatchMirrorMaskRender))]
+ class PatchMirrorMaskRenderAttribute : Attribute { }
static partial class MonoModRules {
@@ -380,21 +382,120 @@ public static void PatchDecalUpdate(ILContext context, CustomAttribute attrib) {
public static void PatchDecalImageRender(ILContext context, CustomAttribute attrib) {
TypeDefinition t_Decal = MonoModRule.Modder.FindType("Celeste.Decal").Resolve();
TypeDefinition t_MTexture = MonoModRule.Modder.FindType("Monocle.MTexture").Resolve();
+ TypeDefinition t_Vector2 = MonoModRule.Modder.FindType("Microsoft.Xna.Framework.Vector2").Resolve();
+ TypeDefinition t_Matrix = MonoModRule.Modder.FindType("Microsoft.Xna.Framework.Matrix").Resolve();
+ // This is not allowed to be a TypeDefinition for ?? reasons
+ TypeReference t_float = MonoModRule.Modder.Module.ImportReference(MonoModRule.Modder.FindType("System.Single").Resolve());
+
FieldReference f_Decal_Rotation = t_Decal.FindField("Rotation");
FieldReference f_Decal_Color = t_Decal.FindField("Color");
-
+ FieldReference f_Decal_scale = t_Decal.FindField("scale");
+
+ MethodReference m_get_Center = t_MTexture.FindProperty("Center").GetMethod;
+
+ MethodReference m_Vector2_ctor = MonoModRule.Modder.Module.ImportReference(t_Vector2.FindMethod("System.Void .ctor(System.Single,System.Single)"));
+ MethodReference m_Vector2_Transform = MonoModRule.Modder.Module.ImportReference(t_Vector2.FindMethod("Microsoft.Xna.Framework.Vector2 Transform(Microsoft.Xna.Framework.Vector2,Microsoft.Xna.Framework.Matrix)"));
+ FieldReference f_Vector2_X = MonoModRule.Modder.Module.ImportReference(t_Vector2.FindField("X"));
+ FieldReference f_Vector2_Y = MonoModRule.Modder.Module.ImportReference(t_Vector2.FindField("Y"));
+
+ MethodReference m_Matrix_CreateRotationZ = MonoModRule.Modder.Module.ImportReference(t_Matrix.FindMethod("Microsoft.Xna.Framework.Matrix CreateRotationZ(System.Single)"));
+
+ // These methods vary based on what class we're patching
MethodReference m_get_Decal = null;
MethodReference m_Draw_old = null;
+ // Create some extra locals to make the math easier
+ VariableDefinition v_vector = new VariableDefinition(MonoModRule.Modder.Module.ImportReference(t_Vector2));
+ VariableDefinition v_X = new VariableDefinition(t_float);
+ VariableDefinition v_Y = new VariableDefinition(t_float);
+ context.Body.Variables.Add(v_vector);
+ context.Body.Variables.Add(v_X);
+ context.Body.Variables.Add(v_Y);
+
ILCursor cursor = new ILCursor(context);
+ // Part one: fix rendering for decals with non-integer centers (i.e. non-even dimensions)
+
+ // Jump to just after the decal texture is put on the stack.
+ // Because the various decal components have different methods of finding their texture,
+ // it's not possible to match the instruction that loads the texture itself.
+ // Instead, we can just look for the instructions that put the decal position on the stack,
+ // and put our cursor just before that, since the decal texture immediately precedes position
+ // in the arguments being made to MTexture.Draw().
+ // Also, we collect the MethodReference for the Decal getter for this component type.
+ cursor.GotoNext(MoveType.Before,
+ instr => instr.MatchLdarg(0),
+ instr => instr.MatchCallvirt(out m_get_Decal),
+ instr => instr.MatchLdfld("Monocle.Entity", "Position")
+ );
+
+ // Duplicate the texture reference on the stack so we leave a copy to be used as an argument to Draw().
+ // Then get MTexture.Center, multiply it by a rotation matrix based on decal rotation, and store it in our Vector2 local.
+ cursor.Emit(OpCodes.Dup);
+ cursor.Emit(OpCodes.Call, m_get_Center);
+ cursor.Emit(OpCodes.Ldarg_0);
+ cursor.Emit(OpCodes.Callvirt, m_get_Decal);
+ cursor.Emit(OpCodes.Ldfld, f_Decal_Rotation);
+ cursor.Emit(OpCodes.Ldc_R4, (float) Math.PI / 180);
+ cursor.Emit(OpCodes.Mul);
+ cursor.Emit(OpCodes.Call, m_Matrix_CreateRotationZ);
+ cursor.Emit(OpCodes.Call, m_Vector2_Transform);
+ cursor.Emit(OpCodes.Stloc_S, v_vector);
+
+ // Get our stored Vector2 back, then get the X component as a float, and store the non-integer component
+ // of that float in our first float local. This will be used to offset the "real" position when the decal
+ // renders if the decal's Center is a non-integer. (If the Center is an integer, the offset will be 0.)
+ cursor.Emit(OpCodes.Ldloc_S, v_vector);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_X);
+ cursor.Emit(OpCodes.Ldarg_0);
+ cursor.Emit(OpCodes.Callvirt, m_get_Decal);
+ cursor.Emit(OpCodes.Ldfld, f_Decal_scale);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_X);
+ cursor.Emit(OpCodes.Mul);
+ cursor.Emit(OpCodes.Ldc_R4, 1f);
+ cursor.Emit(OpCodes.Rem);
+ cursor.Emit(OpCodes.Stloc_S, v_X);
+
+ // Same thing but for the Y.
+ cursor.Emit(OpCodes.Ldloc_S, v_vector);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_Y);
+ cursor.Emit(OpCodes.Ldarg_0);
+ cursor.Emit(OpCodes.Callvirt, m_get_Decal);
+ cursor.Emit(OpCodes.Ldfld, f_Decal_scale);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_Y);
+ cursor.Emit(OpCodes.Mul);
+ cursor.Emit(OpCodes.Ldc_R4, 1f);
+ cursor.Emit(OpCodes.Rem);
+ cursor.Emit(OpCodes.Stloc_S, v_Y);
+
+ // Now jump after the position has been put on the stack, so we can store and then modify it.
+ cursor.GotoNext(MoveType.After,
+ instr => instr.MatchLdfld("Monocle.Entity", "Position"));
+ cursor.Emit(OpCodes.Stloc_S, v_vector);
+
+ // Get our stored position back, get the position's X component, and add it to our calculated offset.
+ cursor.Emit(OpCodes.Ldloc_S, v_vector);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_X);
+ cursor.Emit(OpCodes.Ldloc_S, v_X);
+ cursor.Emit(OpCodes.Add);
+
+ // And again for Y.
+ cursor.Emit(OpCodes.Ldloc_S, v_vector);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_Y);
+ cursor.Emit(OpCodes.Ldloc_S, v_Y);
+ cursor.Emit(OpCodes.Add);
+
+ // Use our offsetted position values to create a new "adjusted" position, which will be used instead.
+ cursor.Emit(OpCodes.Newobj, m_Vector2_ctor);
+
+ // Part two: inject decal rotation
+
// move to just after the decal's scale is obtained, but just before the draw call.
- // also get references to the Decal getter and to the draw call itself
+ // also get a reference to the draw call itself
cursor.GotoNext(MoveType.After,
- instr => instr.MatchCallvirt(out m_get_Decal),
- instr => instr.MatchLdfld("Celeste.Decal", "scale"),
- instr => instr.MatchCallvirt(out m_Draw_old));
+ instr => instr.MatchLdfld("Celeste.Decal", "scale"),
+ instr => instr.MatchCallvirt(out m_Draw_old));
cursor.Index--;
// find an appropriate draw method; it should have the same signature, but also take a float for the rotation as its last argument
@@ -420,10 +521,28 @@ public static void PatchDecalImageRender(ILContext context, CustomAttribute attr
cursor.Remove();
}
- public static void PatchMirrorMaskRotation(ILContext context, CustomAttribute attrib) {
+ public static void PatchMirrorMaskRender(ILContext context, CustomAttribute attrib) {
+ TypeDefinition t_Decal = MonoModRule.Modder.FindType("Celeste.Decal").Resolve();
TypeDefinition t_MTexture = MonoModRule.Modder.FindType("Monocle.MTexture").Resolve();
- FieldDefinition f_Decal_Rotation = context.Method.DeclaringType.FindField("Rotation");
+ TypeDefinition t_Vector2 = MonoModRule.Modder.FindType("Microsoft.Xna.Framework.Vector2").Resolve();
+ TypeDefinition t_Entity = MonoModRule.Modder.FindType("Monocle.Entity").Resolve();
+ TypeDefinition t_Matrix = MonoModRule.Modder.FindType("Microsoft.Xna.Framework.Matrix").Resolve();
+
+ FieldReference f_Decal_Rotation = t_Decal.FindField("Rotation");
+ FieldReference f_Decal_scale = t_Decal.FindField("scale");
+
+ FieldReference f_Entity_Position = t_Entity.FindField("Position");
+
+ MethodReference m_get_Center = t_MTexture.FindProperty("Center").GetMethod;
MethodDefinition m_DrawCentered = t_MTexture.FindMethod("System.Void DrawCentered(Microsoft.Xna.Framework.Vector2,Microsoft.Xna.Framework.Color,Microsoft.Xna.Framework.Vector2,System.Single)");
+
+ MethodReference m_Vector2_ctor = MonoModRule.Modder.Module.ImportReference(t_Vector2.FindMethod("System.Void .ctor(System.Single,System.Single)"));
+ MethodReference m_Vector2_Transform = MonoModRule.Modder.Module.ImportReference(t_Vector2.FindMethod("Microsoft.Xna.Framework.Vector2 Transform(Microsoft.Xna.Framework.Vector2,Microsoft.Xna.Framework.Matrix)"));
+ FieldReference f_Vector2_X = MonoModRule.Modder.Module.ImportReference(t_Vector2.FindField("X"));
+ FieldReference f_Vector2_Y = MonoModRule.Modder.Module.ImportReference(t_Vector2.FindField("Y"));
+
+ MethodReference m_Matrix_CreateRotationZ = MonoModRule.Modder.Module.ImportReference(t_Matrix.FindMethod("Microsoft.Xna.Framework.Matrix CreateRotationZ(System.Single)"));
+
MethodReference r_OnRender = null;
ILCursor cursor = new ILCursor(context);
@@ -436,8 +555,82 @@ public static void PatchMirrorMaskRotation(ILContext context, CustomAttribute at
// Some of the patched methods use closure locals so search for those
FieldDefinition f_locals = m_OnRender.DeclaringType.FindField("CS$<>8__locals1");
FieldReference f_this = null;
+ FieldReference f_mask = null;
ILCursor cursor = new ILCursor(il);
+
+ // Copies the IL strategy from PatchDecalImageRotationAndCentering, modified to avoid adding locals
+
+ cursor.GotoNext(MoveType.After,
+ instr => instr.MatchLdfld(out f_mask),
+ instr => instr.MatchLdarg(0)
+ );
+
+ cursor.GotoNext(MoveType.After,
+ instr => instr.MatchLdfld(out f_this),
+ instr => instr.MatchLdfld("Monocle.Entity", "Position")
+ );
+
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_X);
+ cursor.Emit(OpCodes.Ldarg_0);
+ if (f_locals != null)
+ cursor.Emit(OpCodes.Ldfld, f_locals);
+ cursor.Emit(OpCodes.Ldfld, f_mask);
+ cursor.Emit(OpCodes.Call, m_get_Center);
+ cursor.Emit(OpCodes.Ldarg_0);
+ if (f_locals != null)
+ cursor.Emit(OpCodes.Ldfld, f_locals);
+ cursor.Emit(OpCodes.Ldfld, f_this);
+ cursor.Emit(OpCodes.Ldfld, f_Decal_Rotation);
+ cursor.Emit(OpCodes.Ldc_R4, (float) Math.PI / 180);
+ cursor.Emit(OpCodes.Mul);
+ cursor.Emit(OpCodes.Call, m_Matrix_CreateRotationZ);
+ cursor.Emit(OpCodes.Call, m_Vector2_Transform);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_X);
+ cursor.Emit(OpCodes.Ldarg_0);
+ if (f_locals != null)
+ cursor.Emit(OpCodes.Ldfld, f_locals);
+ cursor.Emit(OpCodes.Ldfld, f_this);
+ cursor.Emit(OpCodes.Ldfld, f_Decal_scale);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_X);
+ cursor.Emit(OpCodes.Mul);
+ cursor.Emit(OpCodes.Ldc_R4, 1f);
+ cursor.Emit(OpCodes.Rem);
+ cursor.Emit(OpCodes.Add);
+
+ cursor.Emit(OpCodes.Ldarg_0);
+ if (f_locals != null)
+ cursor.Emit(OpCodes.Ldfld, f_locals);
+ cursor.Emit(OpCodes.Ldfld, f_this);
+ cursor.Emit(OpCodes.Ldfld, f_Entity_Position);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_Y);
+ cursor.Emit(OpCodes.Ldarg_0);
+ if (f_locals != null)
+ cursor.Emit(OpCodes.Ldfld, f_locals);
+ cursor.Emit(OpCodes.Ldfld, f_mask);
+ cursor.Emit(OpCodes.Call, m_get_Center);
+ cursor.Emit(OpCodes.Ldarg_0);
+ if (f_locals != null)
+ cursor.Emit(OpCodes.Ldfld, f_locals);
+ cursor.Emit(OpCodes.Ldfld, f_this);
+ cursor.Emit(OpCodes.Ldfld, f_Decal_Rotation);
+ cursor.Emit(OpCodes.Ldc_R4, (float) Math.PI / 180);
+ cursor.Emit(OpCodes.Mul);
+ cursor.Emit(OpCodes.Call, m_Matrix_CreateRotationZ);
+ cursor.Emit(OpCodes.Call, m_Vector2_Transform);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_Y);
+ cursor.Emit(OpCodes.Ldarg_0);
+ if (f_locals != null)
+ cursor.Emit(OpCodes.Ldfld, f_locals);
+ cursor.Emit(OpCodes.Ldfld, f_this);
+ cursor.Emit(OpCodes.Ldfld, f_Decal_scale);
+ cursor.Emit(OpCodes.Ldfld, f_Vector2_X);
+ cursor.Emit(OpCodes.Mul);
+ cursor.Emit(OpCodes.Ldc_R4, 1f);
+ cursor.Emit(OpCodes.Rem);
+ cursor.Emit(OpCodes.Add);
+
+ cursor.Emit(OpCodes.Newobj, m_Vector2_ctor);
// Grab the function's decal reference and move to just before the draw call
cursor.GotoNext(MoveType.After,
From 327abd288e2ae0da398e73e553f59168cf3884f6 Mon Sep 17 00:00:00 2001
From: maddie480 <52103563+maddie480@users.noreply.github.com>
Date: Wed, 11 Oct 2023 17:49:30 +0200
Subject: [PATCH 4/4] Update Korean font extra characters
---
.../Content/Dialog/Fonts/korean.fnt | 56 +++++++++---------
.../Content/Dialog/Fonts/korean_everest_0.png | Bin 6828 -> 9569 bytes
2 files changed, 29 insertions(+), 27 deletions(-)
diff --git a/Celeste.Mod.mm/Content/Dialog/Fonts/korean.fnt b/Celeste.Mod.mm/Content/Dialog/Fonts/korean.fnt
index d964d8811..df381af8f 100644
--- a/Celeste.Mod.mm/Content/Dialog/Fonts/korean.fnt
+++ b/Celeste.Mod.mm/Content/Dialog/Fonts/korean.fnt
@@ -1,28 +1,30 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Celeste.Mod.mm/Content/Dialog/Fonts/korean_everest_0.png b/Celeste.Mod.mm/Content/Dialog/Fonts/korean_everest_0.png
index 8c1b039a29beeb589afa53014e79159f89a59ec7..0d2bb583b48939bb93932cd0c25f48bd55c11e01 100644
GIT binary patch
literal 9569
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