Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Перевод MessageDLG   Найти похожие ветки 

 
andrew_p   (2004-01-22 13:58) [0]

Здравствуйте.
Можно ли перевести оглавление и кнопки функции MessageDLG на русский язык или на какой-нибудь другой? Если можно, то как это сделать?
Заранее благодарен.


 
YuRock ©   (2004-01-22 13:59) [1]

Использовать MessageBox


 
andrew_p   (2004-01-22 14:33) [2]

А как кнопки перевести на украинский язык?


 
pasha_golub ©   (2004-01-22 14:33) [3]

Можно, но через задницу. :-)
например


function ShowDialog(Msg:string; DlgType: TMsgDlgType; Buttons:TMsgDlgButtons):integer;
var
i:integer;
begin
with CreateMessageDialog(Msg, DlgType, Buttons) do
try
for i:=0 to ComponentCount-1 do
if Components[i] is TButton then
if TButton(Components[i]).Caption = "&Yes" then
TButton(Components[i]).Caption := "Да"
else
if TButton(Components[i]).Caption = "&No" then
TButton(Components[i]).Caption := "Нет";

Position := poMainFormCenter;
BorderStyle := bsNone;
Result := ShowModal;
finally
Free;
end;
end;


 
andrew_p   (2004-01-22 14:48) [4]

Спасибо всем, особенно pasha_golub - все получилось и совсем не через задницу. Просто нужно в главную форму поместить эту функцию (в раздел Public) и все.


 
alex_*** ©   (2004-01-22 14:57) [5]

:))
Задницу в раздел public ?!


 
Amoeba ©   (2004-01-22 15:18) [6]

Если перевод на русский - по выручат переведенные на русский модули строковых констант от Polaris:
http://polesoft.narod.ru


 
andrew_p   (2004-01-27 11:56) [7]

alex_*** >>> Нет, задница пусть остается там, где должна быть. Здесь о заднице никто речь не вел.


 
alex_*** ©   (2004-01-27 12:05) [8]

Все равно изврат какой-то... бегать по компонентам, менять Caption"s... Проще через MessageBox


 
Erik ©   (2004-01-27 12:15) [9]

А как интересно через MessageBox переопределить Yes в Да?


 
YuRock ©   (2004-01-27 12:17) [10]

> Erik © (27.01.04 12:15) [9]

Лучше всего поменять английскую версию Windows на русскую


 
alex_*** ©   (2004-01-27 12:21) [11]

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


 
Юрий Зотов ©   (2004-01-27 12:22) [12]

> Erik © (27.01.04 12:15) [9]

Если юзер ставит себе английскую (русскую, французскую, немецкую, испанскую, китайскую и т .д.) версию Windows - то на каком языке он хочет видеть ее сообщения, как Вы полагаете?

MessageBox полагает, что на своем родном. И не без оснований, не так ли?


 
Mystic ©   (2004-01-27 12:56) [13]

It is not difficult to create internationalized applications. You need to complete the following steps:

1 You must enable your code to handle strings from international character sets.
2 You need to design your user interface so that it can accommodate the changes that result from localization.
3 You need to isolate all resources that need to be localized.

Копай в сторону Resource DLL


 
andrew_p   (2004-01-27 13:07) [14]

Абсолютно согласен с Mystic. Я сделал так, что независимо от языка ОС сообщения показываются такими как пользователь хочет (сделал локализацию программы).


function ShowMessageDialog(Msg: string; DlgType: TMsgDlgType;
Buttons: TMsgDlgButtons;HelpCtx: Longint): integer;
var
i:integer;
begin
with CreateMessageDialog(Msg, DlgType,Buttons) do
try
for i:=0 to ComponentCount-1 do
if Components[i] is TButton then
begin
if TButton(Components[i]).Caption = "&Yes" then TButton(Components[i]).Caption := GetStr(103); // взять строку из файла локализации по номеру
if TButton(Components[i]).Caption = "&No" then TButton(Components[i]).Caption := GetStr(104);// взять строку из файла локализации по номеру
if TButton(Components[i]).Caption = "Cancel" then TButton(Components[i]).Caption := GetStr(105);// взять строку из файла локализации по номеру и т.д.
// дальше - переводим нужные кнопки по усмотрению
end;
if DlgType = mtError then caption:=GetStr(106);
if DlgType = mtConfirmation then caption:=GetStr(107);
if DlgType = mtInformation then caption:=GetStr(108);
if DlgType = mtWarning then caption:=GetStr(109);
if DlgType = mtCustom then caption:=GetStr(110);

Position := poMainFormCenter;
BorderStyle := bsDialog;
Result:=ShowModal;
finally
Free;
end;
end;


Вот и вся проблема.


 
andrew_p   (2004-01-27 13:12) [15]

alex_*** >>> "Бегание" по компонентам Вы считаете извращением? Я считаю это очень нужным методом. Например, локализация програмы извне ее - это сплошное "бегание" по компонентам, иначе если менять заголовки и подсказки напрямую (по имени) - не это ли извращение? Это уже не напиание програмного кода, а "тупая" его генерация (я это называю "генерация случайного кода").


 
alex_*** ©   (2004-01-27 13:34) [16]

ну само по себе локализация извне - не есть правильно. Прога (Форма, юнит и т.д.) должна сама сразу из ресурсов свои тексты/рисунки подгружать. Ну а если такого нет, то конечно придется по компонентам бегать.


 
andrew_p   (2004-01-27 14:14) [17]

alex_*** >>> А Вы с абсолютной точностью уверены, что программой будут пользоваться только на двух(трех и т.д.) языках? А если (к примеру)в Индии будут пользоваться Вашей программой, и надо будет перевести ее, то Вам надо будет менять строки в ресурсах и копилировать программу, и это без Вас никто не сделает. Чтобы избежать этого и делают локализацию извне.


 
alex_*** ©   (2004-01-27 14:20) [18]

в смысле извне?
А если есть ресурсная dll из которой берутся ресурсы это извне или нет? Я про ресурсную dll и говорю.


 
Некто   (2004-01-27 14:48) [19]

\Delphi\Source\Vcl\Consts.pas


 
alex_*** ©   (2004-01-27 14:57) [20]

и кстати насчет компилляции. Использование GetStr(NUM) говорит о том, что при использовании другого языка все равно придется скомпилиться с другими ресурсами.


 
Erik ©   (2004-01-27 15:37) [21]

Юрий Зотов
У нас пользователям поставлена Английская версия, потому, что Эстонской версии 98 несуществует. Есть только возможность выбрать кодировку в MessageBoxEx, но кнопочки непереведутся. :(


 
andrew_p   (2004-01-27 15:54) [22]

alex_*** >>> Я имел виду текстовый файл с локализацией. Этот файл загружается на этапе выполнения программы в класс TStringList, и из него получают строку ( Values) по имени ( Names) который является номером, заблаговременно записанным в свойство Tag каждого визуального компонента. Вот здесь и не обойдешься без "бегания" по компонентам. Воть.


 
alex_*** ©   (2004-01-27 15:59) [23]

ОК. понял.


 
andrew_p   (2004-01-27 16:10) [24]

alex_*** >>> Вы согласны со мной, что это эффективно? А функция GetStr(NUM) написана как раз для того, чтобы получить строку от TStringList по ее номеру.

var language_mes : TStringList;
.....
function GetStr (const num:integer):string;
begin
Result:=language_mes.Values[IntToStr(num)];
end;


Например, надо локализовать все Лейбелы

with mainform.fm_main do
for i:=0 to ComponentCount-1 do
begin
//------------ перевод TLabel ----------------------
if Components[i] is TLabel then
if (Components[i] as TLabel).Tag <> 0
then (Components[i] as TLabel).Caption:=language_mes.Values[FloatToStr((Components[i] as TLabel).Tag)];
end;


Воть.


 
alex_*** ©   (2004-01-27 16:19) [25]

Согласен.
я перепутал GetStr c LoadStr. Думал ты из ресурсов приложения тянешь строки.



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

Текущий архив: 2004.02.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
14-16718
Igorek
2004-01-16 17:55
2004.02.06
Гибридные мобильные телефоны


14-16588
Домарощинер
2004-01-15 18:58
2004.02.06
Глюки с сетевухой


3-16078
BorisUK
2004-01-12 09:46
2004.02.06
порты по которым работает DCOM


1-16484
Oleg
2004-01-27 16:13
2004.02.06
Сохранение рисунков в dll


1-16294
evgeniy55
2004-01-26 06:59
2004.02.06
Проблемка с директориями, прошу совета