Локализация: как сопоставить информацию о культуре с именем скрипта или диапазоном символов Юникода?

Мне нужна информация о локализации. Я использую .net 2.0 с C # 2.0, который решает большинство проблем, связанных с локализацией. Однако мне нужно вручную нарисовать алфавиты, соответствующие текущей культуре, на экране на одном конкретном экране.

Это было бы похоже на экран «Контакты» в Microsoft Outlook (представление «Адресные карты» или «Просмотр подробных адресных карт» в разделе «Контакты»), поэтому ему нужен столбец кнопок в правом конце, по одной для каждого алфавита.

Я пытаюсь имитировать это, но я не хочу просить пользователя выбрать сценарий. Если нынешняя культура, скажем, китайская, я хочу рисовать китайские алфавиты. Когда пользователь меняет информацию о культуре на английский (и когда он перезапускает приложение), я хочу вместо этого рисовать английские алфавиты. Надеюсь, вы понимаете, к чему я клоню с этим запросом.

Я могу определить культуру текущего пользователя (Application.CurrentCulture или System.Globalization.CultureInfo.CurrentCulture предоставит информацию, связанную с культурой). Еще у меня есть все скрипты для рендеринга алфавитов. Однако проблема в том, что я не знаю, как сопоставить информацию о культуре с именем скрипта.

Другими словами, есть ли способ определить имя сценария, соответствующее культуре? Или можно определить диапазон значений символов Юникода, соответствующих культуре? Любой из них позволил бы мне правильно отобразить алфавиты на кнопке.

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

PS: Я знаю, что самое простое решение - либо настроить имя сценария как часть пользовательских предпочтений, либо отобразить список языков для выбора пользователем (а-ля Контакт в Outlook 2007). Но я просто пытаюсь понять, смогу ли я отобразить алфавиты, соответствующие культуре, без каких-либо действий пользователя.


person Proto    schedule 31.10.2008    source источник


Ответы (5)


В собственном коде есть LOCALE_SSCRIPTS для GetLocaleInfoEx () (Vista и выше), который показывает, какие сценарии ожидаются для локали. В настоящее время нет аналогичной концепции для .Net.

person Community    schedule 03.11.2008
comment
Пожалуйста, проверьте мой ответ ниже (от 14 ноября 2008 г.) - person Proto; 14.11.2008

В китайском языке тысячи символов, поэтому может оказаться невозможным отобразить все символы в их наборе символов. В китайском языке нет родного понятия «алфавит», и я не думаю, что в китайском есть слоговое письмо, как в японском.

Пиньинь (китайский язык, написанный латинским алфавитом) может использоваться для обозначения китайских иероглифов, и это может помочь вам их проиндексировать. Я знаю, что это не ответ на ваш вопрос, но надеюсь, что это поможет.

person Mike Sickler    schedule 31.10.2008

Я полностью согласен с mikiemacman. Кроме того, в данном языке не обязательно используются все буквы сценария.

В любом случае, самое близкое, что я могу придумать, это CultureInfo.TextInfo.ANSICodePage -> Есть только несколько кодовые страницы ANSI. Вы могли бы создать таблицу (или инструкцию switch (), что угодно), в которой перечислены сценарии для каждой кодовой страницы ANSI.

person Serge Wautier    schedule 31.10.2008

Прото, подожди! Есть гораздо более точное решение. Это неуправляемый объект, возможно, вам придется выполнить P / Invoke.

GetLocaleInfoW(MAKELCID(wLangId, SORT_DEFAULT), LOCALE_FONTSIGNATURE, wcBuf, MAXWCBUF);

Это дает вам структуру LOCALESIGNATURE. Ответ находится в поле lsUsb: битовое поле подмножеств Unicode. Крысы! страница MS для этой структуры пуста. Но поищите его в своей копии MSDN. Там это полностью задокументировано: целый набор флагов, описывающих, какие сценарии поддерживаются. И да, тамильский флаг есть ;-)

HTH.

РЕДАКТИРОВАТЬ: Ой! Не видел ответа Шоуна. Вау! Ответ от штатного специалиста! ;-) В любом случае, вас все еще может заинтересовать ответ, совместимый с Pre-Vista.

person Serge Wautier    schedule 05.11.2008

Увлекательная тема. Хотя он может не дать ответа на ваш вопрос, Omniglot является хорошим ресурсом.

Правильный ответ, скорее всего, будет сложным и будет зависеть от конкретной проблемы, которую вы решаете. Предполагая, что ваша цель показывает только буквы, используемые на определенном языке, для разделения разделов телефонной книги (как в Outlook), некоторые из проблем:

  • Люди, у которых есть контактные имена, охватывающие несколько алфавитов / языков.
  • 2-значные буквы (например, "Lj" на сербском языке). Это одна фонема, всегда рассматриваемая как одна буква, хотя в ней есть 2 символа Unicode. 'У него будет свой собственный раздел в телефонной книге (отдельный от' L ').
  • Слишком много глифов для перечисления (например, китайский)
  • Неортодоксальный порядок (например, тайский - телефонная книга будет разделена только согласными, игнорируя гласные).
  • Различие в верхнем и нижнем регистре (по-видимому, вам нужен только один регистр для языков, которые его поддерживают, что в незначительной степени расщепляется на турецкое «i»).
person Community    schedule 24.11.2008
comment
Спасибо за комментарии и несколько примеров, которые заставят меня задуматься над проблемой, dbkk. Да, возможно, мне придется потратить на это больше времени, чем я изначально ожидал. - person Proto; 26.11.2008