Русификация кнопок в MessageBox
Модератор: Модераторы
Русификация кнопок в MessageBox
Что-то я туплю, но не могу сообразить, как проще всего русифицировать кнопки в Application.MessageBox? Сейчас они выводятся на английском: Yes, No, Cancel и т.д. Тексты для них, как я понял, прописаны в LCLStrConsts в виде ресурсных строк. Как можно с минимальными усилиями заменить их значения для текущего проекта?..
Смотрите в сторону .PO файлов и методов их подключения к проекту. На форуме вопрос поднимался и были предложены функции их загрузки и использования.
Спасибо, почитал.
Мда... ради локализации трёх кнопок городить такой огород... лучше уж написать вызов Windows.MessageBox
Мда... ради локализации трёх кнопок городить такой огород... лучше уж написать вызов Windows.MessageBox
Ваше дело. Но зато будут локализованы все сообщения. И чтоб не таскать .po с собой его можно в ресурс запихнуть.
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);
....
О! Вот это отличное решение, спасибо! 
Ребят, не дайте помереть дурой!
При компиляции почему-то Name вызывает отторжение?
Растолкуйте пож!
И вообще, поподробнее можно?
Спасиб!
При компиляции почему-то Name вызывает отторжение?
Растолкуйте пож!
И вообще, поподробнее можно?
Спасиб!
Все строковые константы из секции resoucestrings fpc заносит в ресурсы и при инициализации программы считывает их в специальную таблицу.
Для работы с данной таблицей строк существуют следующие функции находящиеся в модуле objpas:
Для того чтобы перевести значения строковых ресурсов достаточно:
з.ы. Думаю описал всё понятно и каждый сможет разобраться сам
Для работы с данной таблицей строк существуют следующие функции находящиеся в модуле 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
- Name - имя модуля в котором расположена секция resourcestring
- Value - значение строковой константы
- Hash - значение хешь функции для строковой константы (Hash(Value))
- arg - указатель передаваемый фукцией SetResourceStrings либо SetUnitResourceStrings
- функция должна вернуть новое значение константы (т.е. перевод) либо саму константу
Для того чтобы перевести значения строковых ресурсов достаточно:
- создать функцию итератора, которая занимается переводом строк
- запустить итератор функцией SetResourceStrings либо SetUnitResourceStrings
з.ы. Думаю описал всё понятно и каждый сможет разобраться сам
Mr.Smart
Спасибо, отличное описание! Вот по всем бы внутренним механизмам Лазаря было такое описание - жить было бы намного проще
А то иногда в ступор впадаешь, а найти ничего не получается...
Владимир
Если компилятор ругается на Name в названии функции, то это скорее всего потому, что эта функция была включена в состав класса - а класс обычно уже имеет поле Name и происходит конфликт. Если так, то самое простое решение - переименовать параметр Name в AName или ещё во что-нибудь.
Спасибо, отличное описание! Вот по всем бы внутренним механизмам Лазаря было такое описание - жить было бы намного проще
Владимир
Если компилятор ругается на Name в названии функции, то это скорее всего потому, что эта функция была включена в состав класса - а класс обычно уже имеет поле Name и происходит конфликт. Если так, то самое простое решение - переименовать параметр Name в AName или ещё во что-нибудь.
Flanter писал(а):Владимир
Если компилятор ругается на Name в названии функции, то это скорее всего потому, что эта функция была включена в состав класса - а класс обычно уже имеет поле Name и происходит конфликт. Если так, то самое простое решение - переименовать параметр Name в AName или ещё во что-нибудь.
Данную функцию НЕЛЬЗЯ включать в состав класса!
Flanter, я извиняюсь, но
ошибка не исчезает при переименовании Name...
Чисто ламерский вопрос. Есть вызов
var
mz:TModalResult;
begin
mz:=MessageDLG('бла-бла-бла',mtConfirmation,[mbYes,mbNo,mbCancel],0);
end;
и куда здесь вставлять ф-цию Translate ?
p.s. может, имеет значение, что пробую на 0.9.24 ?
ошибка не исчезает при переименовании Name...
Чисто ламерский вопрос. Есть вызов
var
mz:TModalResult;
begin
mz:=MessageDLG('бла-бла-бла',mtConfirmation,[mbYes,mbNo,mbCancel],0);
end;
и куда здесь вставлять ф-цию Translate ?
p.s. может, имеет значение, что пробую на 0.9.24 ?
Последний раз редактировалось Владимир 25.11.2009 21:54:32, всего редактировалось 1 раз.
Никуда её не надо вставлять.)) Функцию эту надо написать где нибудь, хоть в новом модуле, и где-нибудь (тоже хоть в новом хоть в конце текущего модуля )добавить в самом конце:
И всё - эта секция вызоветься автоматически при старте приложения, и все МессажБоксы переведуться автоматически..
Я уже добавил себе такую в модуль своего автоматического переводчика, спасибо Mr.Smart-у.
Код: Выделить всё
initialization
SetResourceStrings(@Translate,nil);
И всё - эта секция вызоветься автоматически при старте приложения, и все МессажБоксы переведуться автоматически..
Я уже добавил себе такую в модуль своего автоматического переводчика, спасибо Mr.Smart-у.
блин, с тэгами какая-то фигня...
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"
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"
- Alexx2000
- постоялец
- Сообщения: 490
- Зарегистрирован: 25.10.2006 00:22:07
- Откуда: Мытищи
- Контактная информация:
Владимир писал(а):function TForm1.Translate(AName,Value : AnsiString; Hash : Longint; arg:pointer) : AnsiString;
....
....
//здесь ругань на SetResourceStrings(@Translate,nil); -Identifier not found "Translate"
Читаем внимательнее, что писали выше:
Mr.Smart писал(а):Данную функцию НЕЛЬЗЯ включать в состав класса!
Я балда. Всем и особо Alexx2000 СПАСИБО. Разобрался.
