Если невозможна установка языкового пакета в систему, а ругаться надо на родном языке для пользователя, то можно воспользоваться специальными диалоговыми окнами.

Диалоговые окна с приставкой «W» работают с юникодом. Например MessageBoxW

Если язык не установлен, то специальные символы можно передать в виде кода.

MessageBoxW(Handle, PWChar('Copyright'+ #0169 ), PWChar('Copyright' + #0169), MB_ICONERROR);

Для удобства написал модуль замены из текста кодов вида #0000; в юникод-строку. Используется библиотека RegExp

function addSplash(t: string): string;
var
	mess: string;
	i: integer;
begin
	mess := '';
	for i := 1 to length(t) do
		if (t[i]<>#13) and (t[i]<>#10) then
		mess := mess + '\'+t[i]
		else
		mess := mess + t[i];
	Result := t;
end;

function replaceSpecChar(inp: widestring): widestring;
var
	i, cnt: integer;
	r: TRegExpr;
	chars : TStringList;
	mess, mess2 : WideString;
	ch: WideChar;
code: string;
begin
	r:= TRegExpr.Create;
	chars := TStringList.Create;
	r.Expression := '(\#.*?\;)';
	if r.Exec(inp) then
	begin
		chars.Add(r.Match[0]);
		if r.ExecNext then
		begin
			chars.Add(r.Match[0]);
		end;
	end;
	mess := inp;
	for i := 0 to chars.Count - 1 do
	begin
		code := copy(chars[i
		], 2, length(chars[i])-2);
		mess := ReplaceRegExpr(addSplash(chars[i]), mess, '|', true);
	end;
	mess2 := '';
	cnt := 0;
	for i := 1 to length(mess) do
	begin
		if mess[i] <> '|' then
		mess2 := mess2 + mess[i]
		else
		begin
			code := copy(chars[cnt], 2, length(chars[cnt])-2);
			mess2 := mess2 + widechar(strtoint(code));
			cnt := cnt + 1;
		end;
	end;
	Result:=mess2;
end;

Пример использования:

MessageBoxW(Handle, replaceSpecChar('Copyright#0169;' ), replaceSpecChar('Copyright#0169;'), MB_ICONERROR);

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Навигация по записям