Русификация кнопок в MessageBox

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Русификация кнопок в MessageBox

Сообщение Flanter » 15.10.2009 09:56:23

Что-то я туплю, но не могу сообразить, как проще всего русифицировать кнопки в Application.MessageBox? Сейчас они выводятся на английском: Yes, No, Cancel и т.д. Тексты для них, как я понял, прописаны в LCLStrConsts в виде ресурсных строк. Как можно с минимальными усилиями заменить их значения для текущего проекта?..
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Русификация кнопок в MessageBox

Сообщение Mr.Smart » 15.10.2009 10:11:48

Смотрите в сторону .PO файлов и методов их подключения к проекту. На форуме вопрос поднимался и были предложены функции их загрузки и использования.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Русификация кнопок в MessageBox

Сообщение Flanter » 15.10.2009 10:20:48

Спасибо, почитал.

Мда... ради локализации трёх кнопок городить такой огород... лучше уж написать вызов Windows.MessageBox :(
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Русификация кнопок в MessageBox

Сообщение Mr.Smart » 15.10.2009 10:22:42

Ваше дело. Но зато будут локализованы все сообщения. И чтоб не таскать .po с собой его можно в ресурс запихнуть.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Русификация кнопок в MessageBox

Сообщение Mr.Smart » 19.11.2009 12:42:07

Flanter
Вот тоже сейчас столкнулся с данной ситуацией.
Чтобы не городит огород решил ниже представленным способом:
Код: Выделить всё
...
uses LCLProc;
....
function Translate(Name,Value : AnsiString; Hash : Longint; arg:pointer) : AnsiString;
begin
  case StringCase(Value,['&Yes','&No','Cancel']) of
   0: Result:='&Да';
   1: Result:='&Нет';
   2: Result:='Отмена';
   else Result:=Value;
  end;
end;
...
initialization
  SetResourceStrings(@Translate,nil);
....
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Русификация кнопок в MessageBox

Сообщение Flanter » 19.11.2009 12:51:47

О! Вот это отличное решение, спасибо! :)
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Русификация кнопок в MessageBox

Сообщение Владимир » 21.11.2009 21:55:51

Ребят, не дайте помереть дурой!
При компиляции почему-то Name вызывает отторжение?
Растолкуйте пож!
И вообще, поподробнее можно?
Спасиб!
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Русификация кнопок в MessageBox

Сообщение Mr.Smart » 21.11.2009 23:13:31

Все строковые константы из секции resoucestrings fpc заносит в ресурсы и при инициализации программы считывает их в специальную таблицу.
Для работы с данной таблицей строк существуют следующие функции находящиеся в модуле objpas:
  • Function Hash(S : AnsiString) : LongWord; - расчёт хешь значения строки
  • Procedure ResetResourceTables; - сбрасывает значения таблици строк в значения по умолчанию
  • Procedure SetResourceStrings (SetFunction : TResourceIterator;arg:pointer); - производит итерации по элементам таблици и вызывает функцию SetFunction для всех модулей
  • Procedure SetUnitResourceStrings (const UnitName:string;SetFunction : TResourceIterator;arg:pointer); - производит итерации по элементам таблици и вызывает функцию SetFunction для модуля UnitName
Функция итератор описана следующим образом: TResourceIterator = Function (Name,Value : AnsiString; Hash : Longint; arg:pointer) : AnsiString;
  • Name - имя модуля в котором расположена секция resourcestring
  • Value - значение строковой константы
  • Hash - значение хешь функции для строковой константы (Hash(Value))
  • arg - указатель передаваемый фукцией SetResourceStrings либо SetUnitResourceStrings
  • функция должна вернуть новое значение константы (т.е. перевод) либо саму константу

Для того чтобы перевести значения строковых ресурсов достаточно:
  • создать функцию итератора, которая занимается переводом строк
  • запустить итератор функцией SetResourceStrings либо SetUnitResourceStrings

з.ы. Думаю описал всё понятно и каждый сможет разобраться сам :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Русификация кнопок в MessageBox

Сообщение Flanter » 22.11.2009 06:39:57

Mr.Smart
Спасибо, отличное описание! Вот по всем бы внутренним механизмам Лазаря было такое описание - жить было бы намного проще :) А то иногда в ступор впадаешь, а найти ничего не получается...

Владимир
Если компилятор ругается на Name в названии функции, то это скорее всего потому, что эта функция была включена в состав класса - а класс обычно уже имеет поле Name и происходит конфликт. Если так, то самое простое решение - переименовать параметр Name в AName или ещё во что-нибудь.
Flanter
новенький
 
Сообщения: 42
Зарегистрирован: 03.11.2007 22:15:54

Re: Русификация кнопок в MessageBox

Сообщение Mr.Smart » 22.11.2009 13:21:34

Flanter писал(а):Владимир
Если компилятор ругается на Name в названии функции, то это скорее всего потому, что эта функция была включена в состав класса - а класс обычно уже имеет поле Name и происходит конфликт. Если так, то самое простое решение - переименовать параметр Name в AName или ещё во что-нибудь.

Данную функцию НЕЛЬЗЯ включать в состав класса!
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Русификация кнопок в MessageBox

Сообщение Владимир » 25.11.2009 22:44:46

Flanter, я извиняюсь, но
ошибка не исчезает при переименовании Name...

Чисто ламерский вопрос. Есть вызов
var
mz:TModalResult;
begin
mz:=MessageDLG('бла-бла-бла',mtConfirmation,[mbYes,mbNo,mbCancel],0);

end;
и куда здесь вставлять ф-цию Translate ?

p.s. может, имеет значение, что пробую на 0.9.24 ?
Последний раз редактировалось Владимир 25.11.2009 22:54:32, всего редактировалось 1 раз.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Русификация кнопок в MessageBox

Сообщение FedeX » 25.11.2009 22:50:02

Никуда её не надо вставлять.)) Функцию эту надо написать где нибудь, хоть в новом модуле, и где-нибудь (тоже хоть в новом хоть в конце текущего модуля )добавить в самом конце:
Код: Выделить всё
initialization
  SetResourceStrings(@Translate,nil);

И всё - эта секция вызоветься автоматически при старте приложения, и все МессажБоксы переведуться автоматически..
Я уже добавил себе такую в модуль своего автоматического переводчика, спасибо Mr.Smart-у.
Аватара пользователя
FedeX
постоялец
 
Сообщения: 422
Зарегистрирован: 27.03.2006 09:25:34
Откуда: украина, житомир

Re: Русификация кнопок в MessageBox

Сообщение Владимир » 25.11.2009 23:15:45

блин, с тэгами какая-то фигня...
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,LCLProc,
StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
function Translate(AName,Value : AnsiString; Hash : Longint; arg:pointer) : AnsiString;
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{ TForm1 }
function TForm1.Translate(AName,Value : AnsiString; Hash : Longint; arg:pointer) : AnsiString;
begin
case StringCase(Value,['&Yes','&No','Cancel']) of
0: Result:='&Да';
1: Result:='&Нет';
2: Result:='Отмена';
else Result:=Value;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
mz:TModalResult;
begin
mz:=MessageDLG('не знаю',mtConfirmation,[mbYes,mbNo,mbCancel],0);
end;

initialization
SetResourceStrings(@Translate,nil);
{$I unit1.lrs}
end.

//здесь ругань на SetResourceStrings(@Translate,nil); -Identifier not found "Translate"
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Русификация кнопок в MessageBox

Сообщение Alexx2000 » 25.11.2009 23:54:15

Владимир писал(а):function TForm1.Translate(AName,Value : AnsiString; Hash : Longint; arg:pointer) : AnsiString;
....
....
//здесь ругань на SetResourceStrings(@Translate,nil); -Identifier not found "Translate"

Читаем внимательнее, что писали выше:
Mr.Smart писал(а):Данную функцию НЕЛЬЗЯ включать в состав класса!
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 487
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Русификация кнопок в MessageBox

Сообщение Владимир » 26.11.2009 11:43:54

Я балда. Всем и особо Alexx2000 СПАСИБО. Разобрался.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53

Рейтинг@Mail.ru