Skip to content

Instantly share code, notes, and snippets.

@DJm00n
Created November 29, 2023 15:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save DJm00n/f8ce90296c4937b3c63ce895ffe7f984 to your computer and use it in GitHub Desktop.
Save DJm00n/f8ce90296c4937b3c63ce895ffe7f984 to your computer and use it in GitHub Desktop.
#include "pch.h"
#include "framework.h"
#include "utils_winrt.h"
#include "utils.h"
#include <windows.globalization.h>
#include <objidlbase.h>
#include <roapi.h>
std::string GetLanguageNameWinRT(const std::string& languageTag)
{
HSTRING_HEADER namespaceStringHeader;
HSTRING namespaceString = nullptr;
HRESULT hr = S_OK;
hr = RoInitialize(RO_INIT_MULTITHREADED);
if (FAILED(hr))
return {};
const std::wstring languageClassName = RuntimeClass_Windows_Globalization_Language;
hr = WindowsCreateStringReference(languageClassName.c_str(),
(UINT32)languageClassName.length(),
&namespaceStringHeader,
&namespaceString);
if (FAILED(hr) || !namespaceString)
return {};
ABI::Windows::Globalization::ILanguageFactory* languageFactory = nullptr; // __x_ABI_CWindows_CGlobalization_CILanguageFactory
const IID& languageFactoryIID = ABI::Windows::Globalization::IID_ILanguageFactory; // IID___x_ABI_CWindows_CGlobalization_CILanguageFactory
hr = RoGetActivationFactory(namespaceString, languageFactoryIID, (void**)&languageFactory);
if (FAILED(hr))
return {};
std::wstring languageTagWide(utf8::widen(languageTag));
HSTRING_HEADER languageTagStringHeader;
HSTRING languageTagString;
hr = WindowsCreateStringReference(languageTagWide.c_str(),
(UINT32)languageTagWide.size(),
&languageTagStringHeader,
&languageTagString);
if (FAILED(hr))
{
languageFactory->Release();
return {};
}
ABI::Windows::Globalization::ILanguage* language = nullptr; // __x_ABI_CWindows_CGlobalization_CILanguage
hr = languageFactory->CreateLanguage(languageTagString, &language);
if (FAILED(hr))
{
languageFactory->Release();
return {};
}
HSTRING languageDisplayNameString = nullptr;
hr = language->get_DisplayName(&languageDisplayNameString);
if (FAILED(hr))
{
language->Release();
languageFactory->Release();
return {};
}
std::wstring returnString = WindowsGetStringRawBuffer(languageDisplayNameString, NULL);
hr = WindowsDeleteString(languageDisplayNameString);
language->Release();
languageFactory->Release();
return utf8::narrow(returnString);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment