мое приложение delphi 2009 имеет базовую систему перевода, которая использует GNUGetText. Я использовал некоторые вызовы API API для подготовки шрифтов. я думал, что он работает правильно до недавнего времени, когда у кого-то из Мальты возникла проблема с моим приложением, который не срабатывал именно в этой области. мое приложение используется во всем мире. некоторые из этого кода, возможно, устарели, поскольку d2009 использует unicode.определение набора символов для использования
все это действительно необходимо для того, чтобы мое приложение работало во всех локациях?
TForm.Font.Charset
это было мое понимание я должен установить Font.Charset экземпляра TFORM в соответствии с локали пользователя. это верно?
TranslateCharsetInfo() выиграть функции API
Windows.pas Delphi 2009 говорит:
function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo;
dwFlags: DWORD): BOOL;
Delphi 5 по Windows.pas говорит:
function TranslateCharsetInfo(var lpSrc: DWORD; var lpCs: TCharsetInfo;
dwFlags: DWORD): BOOL; stdcall;
из MSDN Microsoft:
BOOL TranslateCharsetInfo(
__inout DWORD FAR *lpSrc,
__out LPCHARSETINFO lpCs,
__in DWORD dwFlags
);
назад, когда этот код был написан (назад в Дельфи 5 дней), слово было InPort функции неверен и правильный путь был:
function TranslateCharsetInfo(lpSrc: Pointer; var lpCs: TCharsetInfo;
dwFlags: DWORD): BOOL; stdcall; external gdi32;
уведомление о том, что D2009 Windows.pas файл копия не stdcall. какую декларацию TranslateCharsetInfo я должен использовать?
Код
, что в стороне, по существу, я делаю следующие:
var
Buffer : PChar;
iSize, iCodePage : integer;
rCharsetInfo: TCharsetInfo;
begin
// SysLocale.DefaultLCID = 1802
iSize := GetLocaleInfo(SysLocale.DefaultLCID, LOCALE_IDefaultAnsiCodePage,
nil, 0);
// size=14
GetMem(Buffer, iSize);
try
if GetLocaleInfo(SysLocale.DefaultLCID, LOCALE_IDefaultAnsiCodePage, Buffer,
iSize)=0 then
RaiseLastOSError;
// Buffer contains 0 so codepage = 0
iCodePage:=Result := StrToInt(string(Buffer));
finally
FreeMem(Buffer);
end;
// this function is not called according to MSDN's directions for
// TCI_SRCCODEPAGE and the call fails.
if not TranslateCharsetInfo(Pointer(iCodePage), rCharsetInfo,
TCI_SRCCODEPAGE) then
RaiseLastOSError;
// acts upon the form
Font.Charset:= rCharsetInfo.ciCharset;
end;
я просто не знаю достаточно об этом ... как ни странно, несколько лет назад, когда я написал это, я был убежден, что он работает правильно. результаты ... неспособности проверить код возврата кода API ...
нет ли более умного способа сделать все это? не делает ли RTL/VCL большинство/все это автоматически? мои инстинкты говорят мне, что я слишком много работаю над этим ...
Благодарим вас за помощь!
спасибо за ваш комментарий Lars D! я попрошу, чтобы кто-то попробовал мое приложение в такой локали. –