2025. 2. 25. 17:05ㆍunreal/UnrealCode
언리얼을 사용하다보면
한영 전환을 자주 해야할 때가 있습니다.
기본을 한글로쓰다(번역이 너무 잘되있어서)
내부 이름이나 변수명 등을 확인할때마다 언어를 바꿔서 사용하는데 뎊스가 깊어서 툴바에 버튼을 추가하기로 했습니다.
위 이미지의 에디터 언어 부분을 변경할 예정입니다.
일단 버튼을 추가합니다.
+ SHorizontalBox::Slot()
.HAlign(HAlign_Right)
.Padding(0.0f, 0.0f, 0.0f, 0.0f)
.AutoWidth()
[
SNew(SBorder)
.Padding(0)
.BorderImage(FAppStyle::Get().GetBrush("NoBorder"))
.IsEnabled(FSlateApplication::Get().GetNormalExecutionAttribute())
[
UToolMenus::Get()->GenerateWidget("LevelEditor.LevelEditorToolBar.Toggletool", MenuContext)
]
]
해당 버튼에 바인딩되는 함수에서 언어 변경 함수를 실행해 주면 되는거라 판단
에디터상에서 언어를 변경했을때 실행되는 함수를 찾습니다.
void UInternationalizationSettingsModel::SetEditorLanguage(const FString& InEditorLanguage)
{
GConfig->SetString( TEXT("Internationalization"), TEXT("Language"), *InEditorLanguage, GEditorSettingsIni );
GConfig->SetString( TEXT("Internationalization"), TEXT("Culture"), TEXT(""), GEditorSettingsIni ); // Clear legacy setting
GConfig->Flush(false, GEditorSettingsIni);
이름이 정직해서 어렵지 않게 찾았습니다.
일단 임의로 외부에서 접근할 수 있도록 콘솔 명령어 추가
static FAutoConsoleCommand CVarChangeLang(
TEXT("setlang"),
TEXT("Writes out a csv with all tags to Reports/TagList.csv"),
FConsoleCommandWithArgsDelegate::CreateLambda([](const TArray<FString>& Params)
{
if(Params.Contains("1"))
{
void UInternationalizationSettingsModel::SetEditorLanguage(const FString& InEditorLanguage)
}
}),
ECVF_Cheat);
구현되있는 함수를 사용하는것은 UInternationalizationSettingsModel 객체를 생성할 수 없어서 실패함수 자체를 새로 구현을 하기로 함
람다 함수 내부에 직접 구현
//pts change language console Start
static FAutoConsoleCommand CVarChangeLang(
TEXT("setlang"),
TEXT("changelang"),
FConsoleCommandWithArgsDelegate::CreateLambda([](const TArray<FString>& Params)
{
FInternationalization& I18N = FInternationalization::Get();
if (Params.Contains("1"))
{
const FString& TInEditorLanguage = "en";
GConfig->SetString(TEXT("Internationalization"), TEXT("Language"), *TInEditorLanguage, GEditorSettingsIni);
GConfig->SetString(TEXT("Internationalization"), TEXT("Culture"), TEXT(""), GEditorSettingsIni); // Clear legacy setting
GConfig->Flush(false, GEditorSettingsIni);
I18N.SetCurrentLanguage(*TInEditorLanguage);
}
else
{
const FString& TInEditorLanguage = "ko";
GConfig->SetString(TEXT("Internationalization"), TEXT("Language"), *TInEditorLanguage, GEditorSettingsIni);
GConfig->SetString(TEXT("Internationalization"), TEXT("Culture"), TEXT(""), GEditorSettingsIni); // Clear legacy setting
GConfig->Flush(false, GEditorSettingsIni);
I18N.SetCurrentLanguage(*TInEditorLanguage);
}
}),
ECVF_Cheat);
//pts change language console end
해당 콘솔을 버튼에 연결할 계획이었으나
콘솔명령어를 실행하는 getworld() 가 null 을 반환해 아예 콘솔을 제거하고 람다 함수를 ui함수에 직접 구현
FUIAction(
FExecuteAction::CreateLambda([]()
{
UE_LOG(LogTemp, Log, TEXT("Hello World!! TestIntVar"));
UWorld* World = GEditor->GetWorld();
World->Exec(World, TEXT("setlang 1"));
위 방식은 실패(world가 nullptr 임)
버튼의 함수를 구현해주는 부분에 실제 위에 콘솔명령어 에 구현한 함수를 옮겨주었습니다.
위 방식은 gconfig 등이 글로벌로 구현된 부분이라(추측) Geditor 가 포함된 모듈에서는 전부 접근이 가능해 직접 구현이 된것으로 생각이 듭니다.
'unreal > UnrealCode' 카테고리의 다른 글
[Unreal_Editor]5.44버전 머터리얼 커스텀 핀 추가하기 (0) | 2025.03.20 |
---|---|
[Unreal_Engine]모바일 디바이스에서 stat 글씨 크기 늘리기 (0) | 2024.04.05 |
Unreal_애님 블루프린트 최적화 관련 몇가지 코드 (0) | 2023.04.18 |
[Unreal_Editor]Unreal_커스텀 뷰포트 에디터 제작 (0) | 2023.04.13 |