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

Вниз

Эксперименты с русским языком в английской windows   Найти похожие ветки 

 
Piter ©   (2004-07-21 17:10) [0]

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

Сразу хочу сказать, что не связываюсь с 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 ©   (2004-07-21 17:11) [1]

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

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

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

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

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

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

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

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

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

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


 
Суслик ©   (2004-07-21 17:19) [2]


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

А вот если вы это сделаете - без шуток это на хорошую статью потянет.


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

Там много чего непонятного. Не только это.


 
Sandman25 ©   (2004-07-21 17:19) [3]

Интересный обзор, спасибо.


 
Суслик ©   (2004-07-21 17:31) [4]


> Piter ©   (21.07.04 17:10)  

Ты где-то мне в обиду сказал вешь, что я типа спорли с ИШ, типа он меня ламером назвал, ну и типа проводил некие аналогии со своим спором о is.

Хочу сказать, что моя тогда главная мысль была: "NLS для НЕ unicode реализована плохо в смысле нелогично и не понятно" и это я связывал с тем, что это МС сделала специально - тем самым она тянет всех на unicode. Ты еще не мучался с функциями - там никакие setthreadlocale не фига не помогают - только локаль в control panel и все. Например, тебе не удасться именить поведение oemtochar никаким setthreadlocale.

Поэтому можешь написать статью типа "НЕ unicode приложения на дельфи с русскими символами (и русским воведением) на английской винде".

КСТАТИ ПРОВЕРЬ - как у тебя работает ansiuppercase. Скорее всего неверно.


 
Суслик ©   (2004-07-21 17:32) [5]


> КСТАТИ ПРОВЕРЬ - как у тебя работает ansiuppercase. Скорее
> всего неверно.

в случае нерусской локали


 
Плохиш ©   (2004-07-21 17:46) [6]

http://tnt.ccci.org/delphi_unicode_controls/


 
Piter ©   (2004-07-21 17:53) [7]

Суслик ©   (21.07.04 17:31) [4]

так ты и Тимохов одно лицо... а что же ты в моей ветке писал как будто вы разные ники? Ты от кого прячешься... :)


 
Sandman25 ©   (2004-07-21 17:55) [8]

>так ты и Тимохов одно лицо

Предупреждать надо :)


 
Суслик ©   (2004-07-21 17:55) [9]


> Piter ©   (21.07.04 17:53) [7]

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

Все же попробуй ansiuppercase - не будет она на английаской локали работать ни при каких setthreadlocale.

хотя я могу и ошибать - давно дело было и с тех пор ни разу не пригождалосю


 
Суслик ©   (2004-07-21 17:57) [10]


> Sandman25 ©   (21.07.04 17:55) [8]

анкета же есть...
нельзя ник что ли сменить. :)))))


 
Sandman25 ©   (2004-07-21 17:59) [11]

[10] Суслик ©   (21.07.04 17:57)

Я просто удивился, насколько по-разному я воспринимал Тимохова и Суслика. Суслик у меня ассоциировался с маленьким шустрым программистом, сующим свой нос повсюду. Непонятно, с чего такая ассоциация :)


 
Суслик ©   (2004-07-21 18:29) [12]

Piter.
Ты кстати напиши о результатах запуска ansiuppercase.
Будет она у тебя работать в английской локали или нет?


 
Anatoly Podgoretsky ©   (2004-07-21 19:47) [13]

Sandman25 ©   (21.07.04 17:59) [11]
Интересно с чем же тогда у тебя ассциировался Тимохов


 
Суслик ©   (2004-07-21 19:54) [14]

:)))))))


 
Суслик ©   (2004-07-21 19:55) [15]


> Anatoly Podgoretsky ©   (21.07.04 19:47) [13]

Будет работать ansiuppercase в английской локали?


 
Nous Mellon ©   (2004-07-21 21:24) [16]

2суслик
Тимохов воспринимался как-то более серьезно и умно нежели какой-то Фуфлик...  Ну это так: мое субъективное мнение


 
VMcL ©   (2004-07-21 21:36) [17]

>>Суслик ©  (21.07.04 19:55) [15]

С английскими буквами, естественно, будет. С русскими, думаю, что-то нехорошее случится.


 
Anatoly Podgoretsky ©   (2004-07-21 21:52) [18]

Народ требует - Тимохов вернись


 
Marser ©   (2004-07-22 00:25) [19]

Суслик как-то примитивно. Хорёк хотя бы... Да и по фамилии подходит(хорёк Тимоха)... Или же суслик, но на каком-то другом языке :-)


 
Piter ©   (2004-07-22 01:21) [20]

Суслик ©   (21.07.04 17:31) [4]
КСТАТИ ПРОВЕРЬ - как у тебя работает ansiuppercase. Скорее всего неверно


В английской локали по дефолту работает неверно. После вызова SetThreadLocale($419) работает как часы, то есть верно.


 
Суслик ©   (2004-07-22 10:57) [21]


> Piter ©   (22.07.04 01:21) [20]

не верю.
я вчера дома на win2000 server проверял. Она у меня русская. Если ставишь умолчательный язык английский (естно с перезагрузкой), никакие setthreadloacale не помогают.

У тебя windows какой?


 
Суслик ©   (2004-07-22 11:03) [22]

О! Piter!
Что ты называешь английской локалью? У меня ввобще такого теримана нет - есть толоко умолчательный язык, и все.


 
Суслик ©   (2004-07-22 11:05) [23]

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


 
Sandman25 ©   (2004-07-22 11:27) [24]

У меня win2000 server, русская. По умолчанию английский язык. Региональные настройки - русские. Установлены русский и румынский языки. Проблем с отображением русских и румынских символов нет. Конечно, при правильно установленном Font.CharSet.


 
Суслик ©   (2004-07-22 11:30) [25]


> Sandman25 ©   (22.07.04 11:27) [24]

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


 
Piter ©   (2004-07-22 13:13) [26]

Суслик ©   (22.07.04 11:03) [22]
О! Piter!
Что ты называешь английской локалью?


тоже, что и все называют. В win2000 это находится по адресу "Панель управления->Язык и стандарты" кнопка "Задать умолчание". Вот там ставь какой хочешь язык. В WinXP это называется что-то типа языка для преобразования ANSI строк...
Характерным признаком смены локалки является требование винды на перезагрузку.

Суслик ©   (22.07.04 10:57) [21]
Если ставишь умолчательный язык английский (естно с перезагрузкой), никакие setthreadloacale не помогают


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

procedure TForm1.Button1Click(Sender: TObject);
var
 size: integer;
 wideS: PWideChar;
 s: string;
begin
s := AnsiUpperCase(edit1.Text);

size := MultiByteToWideChar(3, 0, PChar(s), -1, nil, 0);
getmem(wideS, size*2);
MultiByteToWideChar(3, 0, PChar(s), -1, wideS, size);
MessageBoxW(handle, wideS, nil, 0);
FreeMem(wideS);
end;


Соответственно, на форме лежит edit1, куда ты и вводишь текст для проверки. Желательно тому эдиту поставить CHARSET русский...


 
Суслик ©   (2004-07-22 13:44) [27]


> Ты, по ходу, так ничего и не догнал.

добрый гонщик :)))
----------------

Ладно я еще дома посмотрю, когда время будет. Честно говоря подзабыл я эту тему за ненадобностью. :)


 
wnew ©   (2004-07-22 14:31) [28]

Какое-то странное обсуждение, непонятно чего.

Если в WindowsXP, вот здесь: http://www.wnew.de/ImgTemp/RegionsUndSprache.png или здесь:
http://www.wnew.de/ImgTemp/RegionsUndSprache.jpg выбераю русский - то все шрифты в программах, не работающих с UNICODE, отображаются нормально и для этого вовсе не нужно лезть в Delphi. В этом случае корректно отображаются все шрифты даже в программах созданных без мысли использования на некализованных для русского региона системах. К сожалению, после каждого, нового выбора нужно делать рестарт. Для Windows 9x и ME существует программа Chameleon, котороая позволяет делять тоже самое, что и XP и даже удобнее, так как всегда под рукой - это там где часики:), но всё-равно нужно производить рестарт.
Однако, если будет выбран, к примеру, немецкий - то хоть заездий Delphi - ничего путёвого не получится: в программах не работающих с UNICODE, вместо русских букв или кракозябры, или знаки вопроса, или квадратики.


 
Piter ©   (2004-07-22 17:02) [29]

wnew ©   (22.07.04 14:31) [28]

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

Ты вообще слышал, что я упоминал такую функцию как SetThredLocale? Ты не мог бы сделать любезность и почитать ее описание? Может, ты поймешь, что эта функция МОЖЕТ изменить настройки локали для КОНКРЕТНОГО ПОТОКА. Никаких перезагрузок. Правда, действует она не очень понятно. Но кое что руссифициует - в общем, неплохо было бы почитать мой пост.

Хотя я понимаю, что пост большой и занятому человеку читать его неохота, вкратце расскажу:

я экспериментировал на натуральной Windows XP professional ENGLISH. При установке SetThreadLocale некоторые элементы руссифицируются. И даже злополучный AnsiUpperCase работает отлично!

За подробностями отправляю опять же в свой первый пост


 
Piter ©   (2004-07-22 17:04) [30]

wnew ©   (22.07.04 14:31) [28]

да ты правильно настраиваешь, именно там. У тебя WindowsXP  с классическим интерфейсом :)


 
Суслик ©   (2004-07-22 17:45) [31]

злой ты, Миша...


> Правда, действует она не очень понятно

с тебя статья - может ты во всем разберешься.

скажу честно, меня эта NLS такое омерзение вызвала когда изучал, что с тех пор, как оказалось, сильно все забыл. Так что буду с нетерпением ждать твоей статьи. Сообщи когда напишешь. Цены ей не будет, т.к. имхо глубоко в области national language support вообще мало кто разбирается (или все молчат и не колются :))


 
Piter ©   (2004-07-22 19:59) [32]

Суслик ©   (22.07.04 17:45) [31]
злой ты, Миша...


Да нормальный я. Просто несколько раздражает, когда пишут "а нафига вы такую фигню обсуждаете" когда даже не прочитали о чем вообще речь идет.

wnew, только не прими за оскорбления. Если чем обидел - прости. В самом деле, я не хотел. Знаю тебя по форуму давно и никакой неприязни к тебе нету. Просто твой пост я воспринял несколько раздраженно - ощущение, что ты просто не читал, что я писал. Или я не понял что ты хочешь сказать (хотя вроде все прозрачно).

Суслик ©   (22.07.04 17:45) [31]
с тебя статья - может ты во всем разберешься


мал я еще статью писать по этому вопросу

скажу честно, меня эта NLS такое омерзение вызвала когда изучал

ну а я ее вообше не изучал...

Суслик ©   (22.07.04 17:45) [31]
т.к. имхо глубоко в области national language support вообще мало кто разбирается


правильно, ибо мало кому это интересно. Если программа русская - то она юзается  на русских виндах в большинстве случаев, на 1% которые сидят на английской проще забить


 
Суслик ©   (2004-07-22 20:08) [33]

Piter.

Если для тебя вообще эта тема не являтеся жизненно важной, очень советую забить.

Мое ощущение, что она гиблая. МС нас палкой загонит на unicode уже через несколько лет...

Когда я читал, у меня сложилось такое ощещение, что эмуляция через dbcs поддержки многоязыковости является некой заплаткой. Все равно mbcs круче! (*)

Многие другие темы в msdn освещены существенно лучше и выглядят логичнее. Т.е. свою нелюбовь к NLS я связываю не только с L (и это конечно есть в некторой мере), но еще и с высказывание из пред. абзаца.

ЗЫ. Хорошо, что ИШ не слышит :)


 
nikkie ©   (2004-07-22 20:18) [34]

>Суслик
а почему ты протипоставил dbcs и mbcs?


 
Суслик ©   (2004-07-22 20:21) [35]


> nikkie ©   (22.07.04 20:18) [34]

перепутал :)))))

sbcs ...


 
nikkie ©   (2004-07-22 20:23) [36]

все равно... sbcs и dbcs - частные случаи mbcs. unicode - не есть mbcs.


 
Суслик ©   (2004-07-22 20:28) [37]


> все равно... sbcs и dbcs - частные случаи mbcs. unicode
> - не есть mbcs.

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


 
vidiv ©   (2004-07-22 22:42) [38]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_52lh.asp

The SetThreadLocale function affects the selection of resources that are defined with a LANGUAGE statement. This affects such functions as CreateDialog, DialogBox, LoadMenu, LoadString, and FindResource, and sets the code page implied by CP_THREAD_ACP, but does not affect FindResourceEx.

Windows 2000/XP: Do not use SetThreadLocale to select a UI language. To select the proper resource that is defined with a LANGUAGE statement, use FindResourceEx.


да уж



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

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

Наверх





Память: 0.58 MB
Время: 0.041 c
14-1090242201
pasha_golub
2004-07-19 17:03
2004.08.08
Шахматы: извращения, байки, приколы и т.д.


14-1090355017
blackweber
2004-07-21 00:23
2004.08.08
Motherboard Asus A7N8X ...Some Troubles...


14-1089947765
Думкин
2004-07-16 07:16
2004.08.08
Пятничные задачки (прошу не судить строго)


14-1090260768
ИМХО
2004-07-19 22:12
2004.08.08
You know: Мазуту, Алексу и всем-всем-всем...


4-1086328608
atruhin
2004-06-04 09:56
2004.08.08
Работа с GUI из сервиса





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский