2010-04-15 3 views
1

.NET framework упрощает получение информации о различных локалях; API Win32 C++ немного сложнее понять.C++ Win32 API эквивалент CultureInfo.TwoLetterISOLanguageName

Есть ли эквивалентная функция в Win32 для получения двухбуквенного имени языка ISO с учетом целочисленного идентификатора локали?

В C# я хотел бы сделать:

System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(1034); 
string iso = ci.TwoLetterISOLanguageName; 
// iso == "es" now. 

Код должен работать на XP и выше.

ответ

3

Спасибо Тревору за то, что он направил меня на этот ответ в более раннем ответе.

Позвонить GetLocaleInfo с параметром LOCALE_SISO639LANGNAME.

+0

Ум, это не отвечает на вопрос, который был задан. Эта опция запрашивает трехбуквенные сокращения, а не двухбуквенные. Эта опция недоступна в Windows XP, только Vista и выше. –

+1

Адриан, вы ошиблись по всем пунктам. Если вы прочтете более внимательно, вы увидите, что LOCALE_SISO639LANGNAME поддерживается обратно в Windows NT 4 и Win98 и содержит аббревиатуры с двумя символами. Параметр LOCALE_SISO639LANGNAME2 (обратите внимание на конечный «2») - это только Vista и предоставляет 3-буквенные сокращения. Пожалуйста, отмените свое голосование, поскольку оно необоснованно. –

0

Это одна из областей, в которой Win API много развился с XP. Я не думаю, что вы найдете функцию, которая будет доступна, вплоть до XP. Я считаю, что материал .NET framework имеет свои собственные встроенные таблицы (по крайней мере для версий до Vista). GetUserDefaultLocaleName даже не доступен на XP, и это не делает именно то, что вы хотите, и даже если бы это было так, то, вероятно, это было бы не так полно, как в новых версиях.

Возможно, вам потребуется включить свой собственный стол.

+0

Этот ответ на самом деле не представляет собой решение, однако оно существует. См. Мой ответ ниже. –

1

См. Функцию GetLocaleInfo. Есть 2 LCType значения, которые могут вас заинтересовать: LOCALE_SABBREVCTRYNAME и LOCALE_SABBREVLANGNAME. Я сделал быстрый тест в Windows 7, и оба вернули 3 символьные строки, хотя ISO 3166 использует 2 символа. В документации LOCALE_SABBREVLANGNAME указано, что он начинается с 2-символьного кода ISO 3166 и добавляет третий символ для подъязыка.

+0

Тревор, спасибо за ваш ответ - он дал мне ключевые слова, чтобы найти правильное решение. Видимо, и это очень важно для некоторых языков LOCALE_SABBREVLANGNAME работает так, как вы описываете большую часть времени: http://blogs.msdn.com/michkap/archive/2005/02/17/375235.aspx Вызов GetLocaleInfo с параметром LOCALE_SISO639LANGNAME получает то, что я хочу. http://msdn.microsoft.com/en-us/library/dd373848(VS.85).aspx –

Смежные вопросы