void QWindowsFontEngineDirectWrite::initFontInfo(const QFontDef &request, int dpi, IDWriteFont *font) { fontDef = request; IDWriteFontFamily *fontFamily = NULL; HRESULT hr = font->GetFontFamily(&fontFamily); IDWriteLocalizedStrings *familyNames = NULL; if (SUCCEEDED(hr)) hr = fontFamily->GetFamilyNames(&familyNames); UINT32 index = 0; if (SUCCEEDED(hr)) { BOOL exists = false; wchar_t localeName[LOCALE_NAME_MAX_LENGTH]; int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH); if (defaultLocaleSuccess) hr = familyNames->FindLocaleName(localeName, &index, &exists); if (SUCCEEDED(hr) && !exists) hr = familyNames->FindLocaleName(L"en-us", &index, &exists); if (!exists) index = 0; } // Get the family name. if (SUCCEEDED(hr)) { UINT32 length = 0; hr = familyNames->GetStringLength(index, &length); if (SUCCEEDED(hr)) { QVarLengthArray<wchar_t, 128> name(length+1); hr = familyNames->GetString(index, name.data(), name.size()); if (SUCCEEDED(hr)) fontDef.family = QString::fromWCharArray(name.constData()); } } if (familyNames != NULL) familyNames->Release(); if (fontFamily) fontFamily->Release(); if (FAILED(hr)) qErrnoWarning(hr, "initFontInfo: Failed to get family name"); if (fontDef.pointSize < 0) fontDef.pointSize = fontDef.pixelSize * 72. / dpi; else if (fontDef.pixelSize == -1) fontDef.pixelSize = qRound(fontDef.pointSize * dpi / 72.); }
std::vector<std::wstring> LanguageTranslator::CurrentLocale() { wchar_t buf[LOCALE_NAME_MAX_LENGTH]; GetUserDefaultLocaleName(buf, LOCALE_NAME_MAX_LENGTH); CLOG(L"Locale: %s", buf); std::wstring locale(buf); /* Remove custom supplemental locales */ int custom = locale.find(L"-x-"); if (custom > 0) { locale.erase(custom, locale.size() - 1); } /* Split up parts of the locale string */ std::vector<std::wstring> parts; std::wstring sub; std::wistringstream ss(locale); while (std::getline(ss, sub, L'-')) { parts.push_back(sub); } std::vector<std::wstring> finalLocale; for (std::wstring sub : parts) { /* Remove sort orders */ int sort = sub.find(L"_"); if (sort > 0) { sub.erase(sort, sub.size() - 1); } finalLocale.push_back(sub); } return finalLocale; }
static void initFontInfo(QFontEngineDirectWrite *fe, const QFontDef &request, int dpi, IDWriteFont *font) { fe->fontDef = request; IDWriteFontFamily *fontFamily = NULL; HRESULT hr = font->GetFontFamily(&fontFamily); IDWriteLocalizedStrings *familyNames = NULL; if (SUCCEEDED(hr)) hr = fontFamily->GetFamilyNames(&familyNames); UINT32 index = 0; BOOL exists = false; wchar_t localeName[LOCALE_NAME_MAX_LENGTH]; if (SUCCEEDED(hr)) { int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH); if (defaultLocaleSuccess) hr = familyNames->FindLocaleName(localeName, &index, &exists); if (SUCCEEDED(hr) && !exists) hr = familyNames->FindLocaleName(L"en-us", &index, &exists); } if (!exists) index = 0; UINT32 length = 0; if (SUCCEEDED(hr)) hr = familyNames->GetStringLength(index, &length); wchar_t *name = new (std::nothrow) wchar_t[length+1]; if (name == NULL) hr = E_OUTOFMEMORY; // Get the family name. if (SUCCEEDED(hr)) hr = familyNames->GetString(index, name, length + 1); if (SUCCEEDED(hr)) fe->fontDef.family = QString::fromWCharArray(name); delete[] name; if (familyNames != NULL) familyNames->Release(); if (FAILED(hr)) qErrnoWarning(hr, "initFontInfo: Failed to get family name"); if (fe->fontDef.pointSize < 0) fe->fontDef.pointSize = fe->fontDef.pixelSize * 72. / dpi; else if (fe->fontDef.pixelSize == -1) fe->fontDef.pixelSize = qRound(fe->fontDef.pointSize * dpi / 72.); }
static PyObject * winutil_locale_name(PyObject *self) { wchar_t buf[LOCALE_NAME_MAX_LENGTH + 1] = {0}; if (!GetUserDefaultLocaleName(buf, sizeof(buf)/sizeof(buf[0]))) { PyErr_SetFromWindowsErr(0); return NULL; } return PyUnicode_FromWideChar(buf, wcslen(buf)); }
fontCollection *uiprivLoadFontCollection(void) { fontCollection *fc; HRESULT hr; fc = uiprivNew(fontCollection); // always get the latest available font information hr = dwfactory->GetSystemFontCollection(&(fc->fonts), TRUE); if (hr != S_OK) logHRESULT(L"error getting system font collection", hr); fc->userLocaleSuccess = GetUserDefaultLocaleName(fc->userLocale, LOCALE_NAME_MAX_LENGTH); return fc; }
const char * Application::getCurrentLanguageCode() { static std::string code = ""; wchar_t localeName[LOCALE_NAME_MAX_LENGTH] = {0}; if (GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH)) { wchar_t* primary = wcstok(localeName, L"-"); std::string code = CCUnicodeToUtf8(primary); } else { code = "en"; } return code.c_str(); }
/** * Generic function to retrieve the locale. I'm simplifying this to * ignore the "modifier" and return "language_territory.codeset" */ int get_locale(I18N_STRING locale) { int error = I18N_SUCCESS; WCHAR localeBuffer[I18N_STRING_LEN]; if (GetUserDefaultLocaleName(localeBuffer, I18N_STRING_LEN) == 0) { locale[0] = '\0'; error = I18N_FAIL; } else if (wcstombs(locale, localeBuffer, I18N_STRING_LEN) == (size_t)-1) { locale[0] = '\0'; error = I18N_FAIL; } return error; }
// get user prefered locale name: en-CA en-CA or en_CA.UTF-8 or empty "" string on error const string openm::getDefaultLocaleName(void) { // try user locale and on error system default locale string name; wchar_t wlcn[LOCALE_NAME_MAX_LENGTH + 1]; if (GetUserDefaultLocaleName(wlcn, LOCALE_NAME_MAX_LENGTH) <= 0) { if (GetSystemDefaultLocaleName(wlcn, LOCALE_NAME_MAX_LENGTH) <= 0) return name; // empty value on error } wlcn[LOCALE_NAME_MAX_LENGTH] = '\0'; // convert from Windows wchar to normal string char lcn[LOCALE_NAME_MAX_LENGTH + 1]; size_t nLcn = std::wcstombs(lcn, wlcn, LOCALE_NAME_MAX_LENGTH); if (nLcn >= LOCALE_NAME_MAX_LENGTH || nLcn == static_cast<size_t>(-1)) return name; // empty value on error lcn[LOCALE_NAME_MAX_LENGTH] = '\0'; name = lcn; return name; }
HRESULT DWriteContext::SetLOGFONT(const LOGFONTW &logFont, float fontSize) { // Most of this function is copy from: http://msdn.microsoft.com/en-us/library/windows/desktop/dd941783(v=vs.85).aspx HRESULT hr = S_OK; IDWriteFont *font = NULL; IDWriteFontFamily *fontFamily = NULL; IDWriteLocalizedStrings *localizedFamilyNames = NULL; if (SUCCEEDED(hr)) { hr = mGdiInterop->CreateFontFromLOGFONT(&logFont, &font); } // Get the font family to which this font belongs. if (SUCCEEDED(hr)) { hr = font->GetFontFamily(&fontFamily); } // Get the family names. This returns an object that encapsulates one or // more names with the same meaning but in different languages. if (SUCCEEDED(hr)) { hr = fontFamily->GetFamilyNames(&localizedFamilyNames); } // Get the family name at index zero. If we were going to display the name // we'd want to try to find one that matched the use locale, but for // purposes of creating a text format object any language will do. wchar_t familyName[100]; if (SUCCEEDED(hr)) { hr = localizedFamilyNames->GetString(0, familyName, ARRAYSIZE(familyName)); } if (SUCCEEDED(hr)) { // If no font size was passed in use the lfHeight of the LOGFONT. if (fontSize == 0) { // Convert from pixels to DIPs. fontSize = PixelsToDipsY(logFont.lfHeight); if (fontSize < 0) { // Negative lfHeight represents the size of the em unit. fontSize = -fontSize; } else { // Positive lfHeight represents the cell height (ascent + // descent). DWRITE_FONT_METRICS fontMetrics; font->GetMetrics(&fontMetrics); // Convert the cell height (ascent + descent) from design units // to ems. float cellHeight = static_cast<float>( fontMetrics.ascent + fontMetrics.descent) / fontMetrics.designUnitsPerEm; // Divide the font size by the cell height to get the font em // size. fontSize /= cellHeight; } } } // The text format includes a locale name. Ideally, this would be the // language of the text, which may or may not be the same as the primary // language of the user. However, for our purposes the user locale will do. wchar_t localeName[LOCALE_NAME_MAX_LENGTH]; if (SUCCEEDED(hr)) { if (GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH) == 0) hr = HRESULT_FROM_WIN32(GetLastError()); } if (SUCCEEDED(hr)) { // Create the text format object. hr = mDWriteFactory->CreateTextFormat( familyName, NULL, // no custom font collection font->GetWeight(), font->GetStyle(), font->GetStretch(), fontSize, localeName, &mTextFormat); } if (SUCCEEDED(hr)) { mFontWeight = static_cast<DWRITE_FONT_WEIGHT>(logFont.lfWeight); mFontStyle = logFont.lfItalic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL; } SafeRelease(&localizedFamilyNames); SafeRelease(&fontFamily); SafeRelease(&font); return hr; }
ccLanguageType CCApplication::getCurrentLanguage() { ccLanguageType ret = kLanguageEnglish; wchar_t localeName[LOCALE_NAME_MAX_LENGTH] = {0}; if (GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH)) { wchar_t* primary = NULL; wchar_t* sub = NULL; primary = wcstok(localeName, L"-"); sub = wcstok(NULL, L"-"); if (wcscmp(primary, L"zh") == 0) { ret = kLanguageChinese; } else if (wcscmp(primary, L"ja") == 0) { ret = kLanguageJapanese; } else if (wcscmp(primary, L"fr") == 0) { ret = kLanguageFrench; } else if (wcscmp(primary, L"it") == 0) { ret = kLanguageItalian; } else if (wcscmp(primary, L"de") == 0) { ret = kLanguageGerman; } else if (wcscmp(primary, L"es") == 0) { ret = kLanguageSpanish; } else if (wcscmp(primary, L"ru") == 0) { ret = kLanguageRussian; } else if (wcscmp(primary, L"hu") == 0) { ret = kLanguageHungarian; } else if (wcscmp(primary, L"pt") == 0) { ret = kLanguagePortuguese; } else if (wcscmp(primary, L"ko") == 0) { ret = kLanguageKorean; } else if (wcscmp(primary, L"ar") == 0) { ret = kLanguageArabic; } } return ret; }
void wmain() { IDWriteFactory* pDWriteFactory = NULL; HRESULT hr = DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&pDWriteFactory) ); IDWriteFontCollection* pFontCollection = NULL; // Get the system font collection. if (SUCCEEDED(hr)) { hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection); } UINT32 familyCount = 0; // Get the number of font families in the collection. if (SUCCEEDED(hr)) { familyCount = pFontCollection->GetFontFamilyCount(); } for (UINT32 i = 0; i < familyCount; ++i) { IDWriteFontFamily* pFontFamily = NULL; // Get the font family. if (SUCCEEDED(hr)) { hr = pFontCollection->GetFontFamily(i, &pFontFamily); } IDWriteLocalizedStrings* pFamilyNames = NULL; // Get a list of localized strings for the family name. if (SUCCEEDED(hr)) { hr = pFontFamily->GetFamilyNames(&pFamilyNames); } UINT32 index = 0; BOOL exists = false; wchar_t localeName[LOCALE_NAME_MAX_LENGTH]; if (SUCCEEDED(hr)) { // Get the default locale for this user. int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH); // If the default locale is returned, find that locale name, otherwise use "en-us". if (defaultLocaleSuccess) { hr = pFamilyNames->FindLocaleName(localeName, &index, &exists); } else { hr = pFamilyNames->FindLocaleName(L"en-us", &index, &exists); } } // If the specified locale doesn't exist, select the first on the list. if (!exists) index = 0; UINT32 length = 0; // Get the string length. if (SUCCEEDED(hr)) { hr = pFamilyNames->GetStringLength(index, &length); } // Allocate a string big enough to hold the name. wchar_t* name = new (std::nothrow) wchar_t[length+1]; if (name == NULL) { hr = E_OUTOFMEMORY; } // Get the family name. if (SUCCEEDED(hr)) { hr = pFamilyNames->GetString(index, name, length+1); } if (SUCCEEDED(hr)) { // Print out the family name. wprintf(L"%s\n", name); } SafeRelease(&pFontFamily); SafeRelease(&pFamilyNames); delete [] name; } SafeRelease(&pFontCollection); SafeRelease(&pDWriteFactory); }