Локализация: Как сопоставить информацию о культуре с именем скрипта или диапазоном символов Unicode? - PullRequest
2 голосов
/ 31 октября 2008

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

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

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

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

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

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

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

Ответы [ 5 ]

1 голос
/ 03 ноября 2008

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

0 голосов
/ 24 ноября 2008

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

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

  • Люди с именами контактов, охватывающими несколько скриптов / языков.
  • Буквы с двумя глифами (например, «Lj» на сербском языке). Это одна фонема, всегда рассматриваемая как одна буква, хотя она имеет 2 символа Юникод. «У него будет свой собственный раздел в телефонной книге (отдельно от« L »).
  • Слишком много глифов в списке (например, китайский)
  • Неортодоксальный порядок (например, тайский - телефонная книга будет разделяться только согласными, игнорируя гласные).
  • Различия в верхнем и нижнем регистре (по-видимому, вы хотели бы использовать только один регистр для языков, которые его поддерживают - что в некоторых отношениях разбивается на турецкое «i»).
0 голосов
/ 05 ноября 2008

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

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

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

НТН.

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

0 голосов
/ 31 октября 2008

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

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

0 голосов
/ 31 октября 2008

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

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

...