Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Вниз

Русский шрифт на Win 2K/XP eng = крякозябры   Найти похожие ветки 

 
T54   (2006-05-27 18:30) [0]

Програама расчитана на Win 2K/XP eng русский шрифт отображает всякими бяками. . . Чего сделать можно


 
Piter ©   (2006-05-27 18:47) [1]

Итак, рассказываю.

Сразу хочу сказать, что не связываюсь с win9x. Системы отживают свое и если у кого стоит английская ее версия - пусть сам себя спасает (меняет реестр или что-нибудь еще). Далее речь пойдет о системах, начиная с Win200.

Допустим, есть английская Windows с установками по умолчанию, прямо только что поставили. Локаль там английская, при преобразовании ANSI вызовов WinApi функций в Wide используется дефолтная кодовая страница (не русская естесственно).
В этой же windows можно выставить в региональных настройках русскую локаль.

Но не забывайте, что есть такая замечательная функция SetThreadLocale, которая может выставить любую локаль для конкретного потока. Немаловажный факт.
Проведем несколько экспериментов. Замечу, что ВО ВСЕХ ОПЫТАХ у всех контролов выставлен CHARSET_RUSSIAN

Вот результаты:

I. Локаль по умолчанию стоит английская:

1) программа использует стандартный VCL, не вызывает SetThreadLocale:

как и ожидалось - в программе нет ни одного русского слова. Все кракозябрами:

http://www.piter007.newmail.ru/other/locale_1.gif

то, что по русски на заднем фоне - это просто Internet Explorer демонстрирует свое умение работать корректно при любых настройках.

2) Программа использует стандартный VCL, но вызывет SetThreadLocale($419) - русская локаль:

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

http://www.piter007.newmail.ru/other/locale_2.gif

3) Программа использует переделанный мной VCL и вызывает SetThreadLocale (использование без ThreadLocale не дает эффекта):

все отображается по русски. Закладки, меню (я переделывал Menu и TTabControl).

http://www.piter007.newmail.ru/other/locale_3.gif

Заголовки форм по прежнему отображаются кракозябрами, потому что у меня не получается изменить модуль forms (об этом я писал в другой теме).

Делаем вывод: если в настройках windows стоит английская локаль - то приложение не будет выглядеть русским никогда. Если применить SetThreadLocale к главному потоку, то частично русифицируется меню (пункты без иконок), TEdit, TLabel, TBitBtn (если стоит CHARSET_RUSSIAN). Возможно, какие-то другие контролы.
Окна, TChekBox, TButton, TTabControl, TStatusBas по прежнему русский язык не воспринимают. Если переделывать VCL, то совместно с SetThreadLocale уверен можно сделать, чтобы все контролы отображали русский правильно. Я показал это на примере TTabControl и TMenu.

Переходим плавно к экмпериментам над английской виндой, но с установленной русской локалью.

II. в региональных настройках стоит русская локаль.

1) программа использует стандартный VCL, не вызывает SetThreadLocale:

Ситуация для меня прямо загадочкая. С одной стороны, установка в настройках windows русской локали, для основного потока тоже самое, что и SetThreadLocale. Но результаты прямо противоположные:

http://www.piter007.newmail.ru/other/locale_4.gif

Теперь пукты меню БЕЗ изображений отображаются нормально, заголовки окон у главной MDI формы и у MDIChild, TreeView, Hint"ы, TTabControl, Showmessage, MessageBox все нормально.
Зато заголовки меню без изображений, TChekBox, TPanel, TButton, заголовки окон у не MDI окон отображаются кракозябрами, вот: http://www.piter007.newmail.ru/other/locale_5.gif
Так что утверждения, что стоит поставить русскую локаль в настройках винды и любая русская программа заработает нормально не верны.

2) Программа использует стандартный VCL, но вызывет SetThreadLocale($419) - русская локаль:

все по русски. Абсолютно все, никаких намеков на кракозябры. Хинты, кнопки, панели в общем все нормально.

3) Программа использует переделанный мной VCL и вызывает SetThreadLocale

ну тут тоже все по русски, понятное дело.

Выводы по руссификации своих программ:

1) всегда где-нибудь в initialization какого-нибудь модуля делайте SetThreadLocale($419) - если ваша программа ориентирована на работу с русским языком. Эта процедура никогда не помешает, а в сочетании с установкой русской локали в региональных настройках любой windows, дает полную руссификацию вашей программы. При этом не забудьте у всех возможных контролов выставить в FONT свойство CHARSET на русский

2) руссификация VCL имеен смысл только для систем где в региональных настройках стоит НЕ русский язык. Тогда в сочетании с SetThreadLocale($419) можно добиться коректного отображения русских символов даже на такой системе, полностью, например, английской. Правда, придется изрядно помучиться, русифицировать надо не только используемые контролы, но и корректно использовать вызовы таких функций, как MessageBox и тому подобное (проще говоря использовать их wide аналоги, вроде MessageBoxW). При этом, чтобы сохранить совместимость с win9x надо проверять версию ОС и в случае необходимости вызывать ANSI аналоги функций (если обнаружена работа на win9x)

Выводы по контролам: (ну это я типа статистики делаю, далеко не все компоненты)

1) Ни один компонент по умолчанию не работает правильно в английской windows с английской локалью.

2) если в английской windows с английской локалью в программе сделать вызов SetThreadLocale($419), то следующие компоненты:

Корректно отображают русский язык: меню без иконок, TTreeView, TEdit, TLabel, TPanel

Не корректно отображают русский язык: TTabControl, меню с иконками, любые окна (заголовки кракозябрами), TStatusBar, TChekBoxm TButton, ANSI вызов MessageBox,  showessage, hint"ы

3) в английской windows с русской локалью по умолчанию:

коректно работают следующие компоненты: TTabControl, меню с иконками, главная MDI форма и MDIChild (заголовок отображается правильно), TStatusBar, TTreeView, TEdit, правильно отображаются всплывающие подсказки (hint), корректно работает ANSI вызов MessageBox, корректно работает showessage

Некорректно работают следующие компоненты: меню без иконок, TChekBox, TPanel, TButton, TLabel.

4) в английской windows с русской локалью с вызовом SetThreadLocale все компоненты отображают русский язык правильно


 
Piter ©   (2006-05-27 18:47) [2]

Ну и наконец по действиям: (рассматривается на английской windows)

Получается что:

вызов SetThreadLocale русифицирует меню без иконок, TLabel, TPanel.

Установка русской локали в региональных настройках русифицирует: TTabControl, меню с иконками, главная MDI форма и MDIChild (заголовок отображается правильно), TStatusBar, правильно отображаются всплывающие подсказки (hint), корректно работает ANSIвызов MessageBox, корректно работает showessage.

В результате, их совместное применение как бы дополняет друг друга и все русифицируется.

Таким компонентам как TEdit и TTreeView нужно чтобы было хоть одно из двух действий выполнено.

Таким компонентам как TButton и TCheckBox нужно чтобы ОБА действия были  выполнены.

Вот такой аналитический обзор. Это я еще не стал писать причины, почему так все происходит :)

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

P.S. Эксперименты проводились на вновь установленной Windows XP professional (корпоративной) без каких-либо апдейтов.


 
Desdechado ©   (2006-05-27 21:33) [3]

можно использовать TNT unicode controls
качать здесь http://tnt.ccci.org/delphi_unicode_controls/

Piter
да, помню твои исследования года 3 назад, когда ты по кусочкам этот материал нарабатывал



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
2-1150462041
novill
2006-06-16 16:47
2006.07.09
Как послать сообщение другой (чужой) программе?


15-1149509503
depo
2006-06-05 16:11
2006.07.09
строки


15-1150129025
Yanis
2006-06-12 20:17
2006.07.09
Как то неожиданно вспомнилось...


4-1143023514
Alex Kryuchkov
2006-03-22 13:31
2006.07.09
Серийный номер мат. платы


15-1149787637
Тот же самый
2006-06-08 21:27
2006.07.09
Linux must die





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский