Показаны сообщения с ярлыком locale/cultures. Показать все сообщения
Показаны сообщения с ярлыком locale/cultures. Показать все сообщения

среда, 22 июня 2011 г.

Группировка разрядов с учётом локали

Это перевод Locale-sensitive number grouping. Автор: Реймонд Чен.

Большинство западных людей хорошо знакомо со способами форматирования чисел и их культурных различиях между, скажем, США и Европой.

Культура Формат
Соединённые Штаты 1,234,567.89
Франция 1 234 567,89
Германия 1.234.567,89
Швеция 1'234'567.89

Но люди часто не осознают, что группировка не всегда выполняется по тройкам цифр.

среда, 22 декабря 2010 г.

Как [то, что вызывают] общие элементы управления, конвертирует строки между ANSI и Unicode?

Это перевод How do[es what] the common controls [call ]convert between ANSI and Unicode? Автор: Майкл Каплан.

Ранее Реймонд Чен писал о том, Как общие элементы управления конвертируют строки между ANSI и Unicode?, отвечая на вопрос в его suggestion box:
В контексте ansi (не unicode) приложения: как общие элементы управления (к примеру, listview) решают, какую использовать кодовую страницу для перевода многобайтовых строк в widestring?

Мне пришлось отлаживать ansi приложение, которое показывало испорченные строки на системе с традиционным китайским, потому что шрифт диалога привёл к тому, что listview использовал иную кодовую страницу, нежели системную ACP, при переводи multibyte в widechar.
Хотя я редко, если вообще когда-нибудь, не соглашусь с чем-то, что исходит из лагеря команды Оболочки, конкретно в этом случае я знаю два конкретных исключения из правила CP_ACP, которое вы обычно видите, хотя эти отличия могут иметь мало общего с кодом Shell / comctl32, так что Реймонд может быть прав в своей области :-)

вторник, 21 декабря 2010 г.

Что это за волшебная настройка, которая синтезирует Unicode из не-Unicode?

Это перевод What is this magic setting that synthesizes Unicode from non-Unicode? Автор: Реймонд Чен.

Комментатор dan g. спросил как Windows может обращаться с не-Unicode приложениями как с Unicode приложениями через апплет Региональные и языковые настройки Панели управления (перевод поста), особенно в части, которая даёт вам выбрать язык для не-Unicode программ. "Я всегда считал, что единственным способом показывать, скажем, китайские символы будет компиляция программы в Unicode, но эта настройка, кажется, намного проще".

среда, 15 декабря 2010 г.

Ничто не пахнет хуже локали потока, чем кодовая страница потока

Это перевод Nothing stinks worse than the thread locale, other than the thread code page. Автор: Майкл Каплан.

Вот кусок из письма, которое я получил от Ken:
Привет, Майкл.

Я встретился с чем-то, что, как я считаю, является багом в MultibyteToWideChar и WideCharToMultibyte, когда параметр кодовой страницы устанавливается в CP_THREAD_ACP, 'язык по-умолчанию для не-Unicode приложений' - установленный в иврит. Это видно, когда используется вспомогательный макрос из atlconv.h вроде T2WC.

Я создал простое тестовое приложение, которое показывает неожиданные результаты на некоторых системах. Кодовая страница от CP_THREAD_ACP получается не той же самой, что GetACP. Я воспроизвёл это на двух системах с ивритом, но не на системах, где стоит традиционный китайский - одна из которым имеет полностью локализированный в традиционном китайском UI. Исходник является частью консольного проекта .NET 2003 по умолчанию.
#include "stdafx.h"
#include <ostream>
int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "default code page is " << GetACP() << std::endl;
    std::cout << "_AtlGetConversionACP code page is " << ATL::_AtlGetConversionACP() << std::endl;

    CPINFOEX cpinfo = {};
    GetCPInfoEx(ATL::_AtlGetConversionACP(), 0, &cpinfo);

    std::cout << "Thread code page is " << cpinfo.CodePage << std::endl;
    return 0;
}
Мои результаты:
default code page is 1255
_AtlGetConversionACP code page is 3
Thread code page is 1252
Когда моё приложение вызывает T2WC, оно получает неверный результаты, а кодовые точки расширяются до 16-ти бит, но не конвертируются в кодовые точки иврита. Мы обходим это использованием _CONVERSION_DONT_USE_THREAD_LOCALE, но мне любопытно, сталкивался ли кто-то ещё с этой проблемой ранее.

Спасибо за потраченное на меня время,
Ken
Постоянные читатели могут вспомнить, почему я не люблю локаль потока.

(Фактически, меня не так давно попросили помочь вычистить несколько плохих случаев использования локали потока в различных частях Windows в shell32.dll и shlwapi.dll - наверное, скоро я за это засяду!)

вторник, 14 декабря 2010 г.

Почему я считаю, что локаль потока действительно воняет

Это перевод Why I think the thread locale really stinks. Автор: Майкл Каплан.

Я не люблю локаль потока (thread locale).

Да, GetThreadLocale и SetThreadLocale являются двумя из многих NLS функций, которыми владеет команда GIFT.

И да, если вы посмотрите на функции, которыми мы владеем, как если бы они были нашими детьми, то нам следовало бы любить их всех.

В таком случае я думаю, что из меня никудышный родитель (если вы помните, я также считаю, что SetLocaleInfo - тоже отстой).

понедельник, 13 декабря 2010 г.

SetLocaleInfo действительно плохо пахнет

Это перевод SetLocaleInfo really stinks. Автор: Майкл Каплан.

Да, я действительно это сказал. Функция SetLocaleInfo, которая появилась в NT 3.1 просто воняет.

Почему я так пренебрежительно говорю о функции, которая существует столько времени?

Ну, давайте начнём снаружи и двинемся вглубь...

воскресенье, 12 декабря 2010 г.

Как убедиться, что разработчики уважают выбор пользователя

Это перевод It is all about making sure developers respect the user's preferences. Автор: Майкл Каплан.

Эта тема, про которую я уже говорил ранее, так что в этот раз я дам ей немного иной поворот.

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

Я могу бесконечно говорить на тему использования NLS API функций для того, чтобы эта настройка реально учитывалась, и насчёт того, какая это отличная идея.

Но разработчики часто так не думают.

вторник, 7 декабря 2010 г.

Львы, тигры и медведиЛОСИ - о, боже!

Это перевод Lions and tigers and bearsELKs, Oh my! Автор: Майкл Каплан.

Осенью 2004 Cathy Wissink и я были в San Jose на встрече технического комитета Unicode (проводимой в Apple) вместе с 20+ моих коллег, работающих с интернационализацией, из различных компаний. В один вечер у нас была речь на встрече IMUG (International Multilingual User's Group), которая была расширенным вариантом выступления до этого на предыдущих конференциях по интернационализации, Unicode и конференции Microsoft по глобализации. Всё стало ближе к выпуску, так что больше можно было сказать, а поскольку нам выделили больше времени, нам определённо можно было рассказать больше.

Название выступления? "Windows для остального мира - модификация Windows для новых рынков". Этот пост будет содержать несколько слайдов с этого выступления :-)

понедельник, 6 декабря 2010 г.

Ещё один налог для отсутствия поддержки Unicode?

Это перевод Yet another cost to not supporting Unicode? Автор: Майкл Каплан.

Очень трудно печатать, когда у тебя растяжение плеча. Слава богу, есть Dragon Dictate! Это я просто так...

Alex спросил меня в Suggestion Box:
Привет, Майкл.

Я погуглил по твоему блогу, но не нашёл ответа на такой вопрос. Этот вопрос довольно популярен (по крайней мере, в России), и я был удивлён, что ты его ещё не покрыл. Так что, быть может, ты расскажешь историю за этим вопросом. Это вопрос про буфер обмена, текст и не Unicode приложения.

Возьми старое не Unicode приложение (вроде блокнота из Win9x) и запусти его на новых Windows (вроде XP), которая имеет два установленных языка (скажем, английский и русский). Предположим, что "Язык для не Unicode приложений" установлен в "Русский".

В Win9x ты мог без проблем скопировать текст через буфер обмена из любого приложения в любое другое. Конечно, старые приложения не заботились об установке CF_LOCALE вместе с CF_TEXT, но всё работало довольно прилично, поскольку приложениями использовалась одна и та же кодовая страница (ладно: почти всеми).

Теперь, возьми современную, "юникодную" ОС, вроде XP. Ты берёшь своё старое приложение, которое верой и правдой служило тебе много лет, копируешь текст в буфер и вставляешь в другое приложение (скажем, блокнот из Windows XP) и... ух ты: ты получаешь вопросительные знаки или белиберду. Что не так? Чёрт, ты забыл переключить клавиатуру на "Русский". Как только ты это сделаешь - всё начнёт работать нормально.


Верхний ряд: слева - блокнот из Win98, справа - блокнот из XP. Нижний ряд: слева - блокнот из XP, справа - из Win98. Текущий язык стоит в "English (United states)" (ну, т.е. мы не переключили на русский). Красные линии указывают операцию копирования текста через буфер обмена (я специально взял два приложения от Microsoft, чтобы указать, что это не баг в каком-то конректном стороннем приложении).

Проблема (как я её вижу) заключается в получении Unicode-текста из ANSI-текста. Почему Windows использует для этого метод ввода, а не "Язык для не Unicode приложений"?

Это ужасное нарушение в опыте использования. Большинство людей считают, что это баг. Я очень часто слышу эту жалобу (чёрт, да я слышу проклятия Microsoft почти всегда в таких случаях). Особенно тяжело объяснить, что это не баг в твоём приложении, написанном много лет назад - оно не виновато.

Не мог бы ты пролить немного света на эту проблему? Почему Microsoft решила (ладно, не сломать, но) усложнить жизнь базилионам существующих приложений? Если Microsoft так заботится об обратной совместимости, то почему было сделано такое решение?
Это звучит очень знакомо.

пятница, 3 декабря 2010 г.

В Windows Vista некоторые клавиатуры не работают с ANSI приложениями

Это перевод Some Keyboards fail with ANSI applications on Windows Vista RTM. Автор: Shawn Steele.

В Windows Vista произошёл пренеприятнейший баг, который привёл к неработоспособности некоторых клавиатурных раскладок в ANSI приложениях. Это удивительно (в печальном смысле этого слова), потому что этот баг умудрился пройти через дюжину тестов, которые мы делаем, чтобы такие вещи не происходили.

четверг, 2 декабря 2010 г.

Это НЕ TFontSignature, чёрт возьми!

Это перевод It isn't a FONTSIGNATURE, darn it! Автор: Майкл Каплан.

Я храню старые варианты Platform SDK.

Это занимает некоторое место, но также позволяет мне заглянуть назад во времени в документацию, так что я могу увидеть, откуда пошла та или иная ошибка. А также это замедляет меня от осуждения людей, которые ошибаются :-)

среда, 1 декабря 2010 г.

Путаница в параметрах №2а

Это перевод Parameter confusion #2a. Автор: Майкл Каплан.

Ранее я говорил о путанице в параметрах к функции LCMapString, когда вы используете её для создания ключей сортировки, а также о путанице в параметрах к GetLocaleInfo, когда она возвращала числа.

Возможно, это просто так кажется.

вторник, 30 ноября 2010 г.

Путаница в параметрах №2

Это перевод Parameter confusion #2. Автор: Майкл Каплан.

Кажется, прошли годы с того момента, когда я говорил про путаницу в параметрах функции LCMapString при создании ключей сортировки.

Ох, постойте-ка, это было только вчера :-)

Существует и другое направление для возникновения путаницы - в этот раз не из-за отличий, а наоборот, из-за постоянности.

четверг, 18 ноября 2010 г.

Двойное тайное ANSI, часть 1 (где-то на полпути от ANSI к Unicode)

Это перевод Double Secret ANSI, part 1 (Somewhere between ANSI and Unicode). Автор: Майкл Каплан.

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

Но, очевидно, в мире есть приложения, которые не поддерживают Unicode. По крайней мере сегодня.

Некоторые из этих приложений существовали уже какое-то время и они работают с ANSI довольно хорошо.

И некоторые их них даже поддерживают ANSI великолепно - вплоть до уровня "двойное тайное ANSI".

вторник, 16 ноября 2010 г.

Что, чёрт возьми, не так с TranslateCharsetInfo?

Это перевод What the hell is wrong with TranslateCharsetInfo, anyway? Автор: Майкл Каплан.

Однажды у Колина появился клиент с вопросом о неожиданном поведении функции TranslateCharsetInfo:
У моего клиента есть проблемы с API TranslateCharsetInfo. Они указывают флаг TCI_SRCLOCALE для использования LCID как источника:
fResult := TranslateCharsetInfo(langid, csi, TCI_SRCLOCALE);
Они обнаружили, что результаты этого вызова не всегда соответствуют значениям, указанным в http://www.microsoft.com/globaldev/nlsweb/default.mspx

В частности:
LCID $0C04 – Chinese (Hong Kong S.A.R.) - возвращает кодовую страницу 936 вместо ожидаемой 950
LCID $0004 - Chinese (Simplified) – возвращает кодовую страницу 950 вместо ожидаемой 936

То, что я вижу - это ожидаемое поведение или нет? Если нет, то какой есть другой способ?

Мы также попробовали:
GetLocaleInfo(langid, LOCALE_IDEFAULTANSICODEPAGE, szLocaleData, SizeOf(szLocaleData)/SizeOf(Char));
Хотя этот способ возвращает 950 для LCID $0C04 (уже лучше), но LCID $0004 всё ещё возвращает 950 вместо 936.

Или я что-то упускаю?

Many thanks,
Colin
Результаты двух значений LCID на самом деле вызваны двумя совершенно различными причинами.

суббота, 13 ноября 2010 г.

Обратная совместимость является отцом NLS функций

Это перевод Backcompat is the father of the NLS APIs. Автор: Майкл Каплан.

Некоторое время назад у меня был разговор с бесстрашным директором нашей группы Джули Беннетт. Вообще-то, она могла быть тогда менеджером нашей группы. Я завёл с ней разговор, потому что один наш клиент жаловался на то, как LCMapString работает с ключами сортировки.

Эта функция API была спроектирована так, что если вы передавали ей строку и флаг LCMAP_SORTKEY, то она возвращала вам двоичное представление строки (подходящее для использования в качестве индекса).

воскресенье, 15 августа 2010 г.

Объяснение диалога Региональные и языковые настройки в Windows XP/2003

Это перевод Explaining the Windows XP/Server 2003 Regional and Language Options Dialog. Автор: Майкл Каплан.

Disclaimer: эта страница не санкционирована официально Microsoft. Если бы она была санкционирована, то, очевидно, она была бы более вежлива :-)

суббота, 14 августа 2010 г.

Объяснение диалога региональных настроек в Windows 2000

Это перевод Explaining the Windows 2000 Regional Options Dialog. Автор: Майкл Каплан.

Disclaimer: эта страница не одобрена официально Microsoft. С учетом сказанного, несколько сотрудников Microsoft признались, что получили дозу хорошего смеха из этого поста, и никто не нашел его техническим неточным. Поэтому, возможно, это просто немного грубее, чем они бы выбрали, вот и все! :-)

Теперь, я подумал, что этот диалог мог бы быть лёгок для понимания, но с ним связано много путаницы. Таким образом, этот пост - небольшой грубый FAQ, предназначенный для покрытия только того, что этот диалог делает для вас. Когда я буду описывать каждую часть, я буду ссылаться на эту картинку, чтобы вы точно знали, что я имею ввиду.

Я открою вам один секрет: люди, которые понимают этот диалог, будут иногда смеяться каждый раз, когда они думают о тех людях, которые просто не понимают его. Не над теми, кто задаёт вопросы и учится, а над теми, кто задаёт вопросы, получает ответы, а потом начинает путать простые вещи, типа кнопок, выпадающих списков и простых списков. Так что, пожалуйста, мы хотим, чтобы ВЫ были одним из нас, кто смеются, а не одним из тех, над кем смеются.

пятница, 13 августа 2010 г.

Буквы в языке...

Это перевод The letters in a language... Автор: Майкл Каплан.

Сегодня я получил вопрос от кого-то, кто читает блог Jeppe. Вопрос заключался в том, существует ли метод, API или ресурс, который позволял бы получить все буквы в языке?