[Unreal_Editor]언리얼 에디터 언어변경 토글버튼 추가(한 / 영)

2025. 2. 25. 17:05unreal/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 임)

 

//pts change language -  Start
       
UToolMenu* Toggletool = UToolMenus::Get
()->RegisterMenu("LevelEditor.LevelEditorToolBar.Toggletool", NAME_None, EMultiBoxType::SlimHorizontalToolBar);
Toggletool->StyleName = "AssetEditorToolbar";

FToolMenuSection& Section = Toggletool->AddSection("File");
{
        {
       

        FToolMenuEntry changelangEntry = FToolMenuEntry::InitToolBarButton(
            "MyCustomButtonName",
            FUIAction(
                FExecuteAction::CreateLambda([]()
                    {
                       
                        FInternationalization& I18N = FInternationalization::Get();
                        FString& InEditorLanguage = GEditor->GetName();
                        GConfig->GetString(TEXT("Internationalization"), TEXT("Language"), InEditorLanguage, GEditorSettingsIni);
                       
                        if (InEditorLanguage == "en")
                        {
                            InEditorLanguage = "ko";
                        }
                        else
                        {
                            InEditorLanguage = "en";
                        }
                       

                        GConfig->SetString(TEXT("Internationalization"), TEXT("Language"), *InEditorLanguage, GEditorSettingsIni);
                        GConfig->SetString(TEXT("Internationalization"), TEXT("Culture"), TEXT(""), GEditorSettingsIni); // Clear legacy setting
                        GConfig->Flush(false, GEditorSettingsIni);
                        I18N.SetCurrentLanguage(*InEditorLanguage);

                    })),
            INVTEXT("My custom button"),
            INVTEXT("Tooltip for my custom button"),
            FSlateIcon(FAppStyle::Get().GetStyleSetName(), "Icons.Comment")
        );
        changelangEntry.StyleNameOverride = "AssetEditorToolbar";
        Section.AddEntry(changelangEntry);          
    }
}

//pts change language -  End

 

버튼의 함수를 구현해주는 부분에 실제 위에 콘솔명령어 에 구현한 함수를 옮겨주었습니다.

위 방식은 gconfig 등이 글로벌로 구현된 부분이라(추측) Geditor 가 포함된 모듈에서는 전부 접근이 가능해 직접 구현이 된것으로 생각이 듭니다.