使用gnugettext翻译Delphi的MessageDlg按钮?

问题描述 投票:1回答:3

我们的应用程序有大约400次调用MessageDlg。问题是翻译按钮和标题。文本被定义为VCL pas文件中的resourcestring常量,但似乎没有通过GnuGetText(我已经使用调试器和gnugettext.log文件检查过)。 GnuGetText.pas是DPR文件的uses子句中的第一个单元。但是,所有非VCL资源字符串以及对_()的调用都会正确转换。

英文原始版本按钮文本及其翻译确实存在于.po和.mo文件中。

将我自己的consts.pas副本添加到项目中没有改变任何东西,但是下面的代码显示了一个窗口说'S''两次(一个来自GnuGetText,另一个来自Windows),正如预期的那样:

  UseLanguage('es');
  MessageBox(0, PChar(SYesButton), '', MB_ICONWARNING or MB_OK);

由于组件兼容性,我必须使用Delphi5进行编译。如果我将VCL50.DE放入EXE目录,则按钮文本为德语。该应用程序应翻译为西班牙语,我不知道西班牙语VCL50.xx文件。

一个非常相似的项目共享90%的源代码,使用Delphi 2010和GnuGetText编译确实使用翻译的按钮文本,但是两个编译器之间的窗口光学和字符串处理是不同的。

您对如何翻译MessageDlg按钮的想法?

delphi internationalization gettext
3个回答
0
投票

解决方案是使用VCL的dialogs.pas作为非常相似的自定义单元TranslatableDialogs的基础,定义具有相同签名的函数。

此外,我们编写了一个PHP脚本,检查是否所有单位都使用了dialogs.pas'函数uses TranslatableDialogs,因为我们的测试人员经常注意不小心使用错误的单位,因为MessageDlg在很多特殊情况下被调用,其中很多都不是我们的标准测试协议。重要提示:TranslatableDialogs需要单独使用uses子句,或者稍后使用原始dialogs.pas。 PHP脚本作为我们的预发布测试套件的一部分运行。


0
投票

使用此功能它对我来说很好:

function MensagemDlg(Msg: String; Title: String; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; Cod_Ajuda: Integer) : TModalResult;
var i   : Integer;
begin
  With CreateMessageDialog(Msg, DlgType, Buttons) Do
     Try
       Caption := Title;
       HelpContext := Cod_Ajuda;

       for i:= 0 To ComponentCount - 1 Do
         If Components[i] Is TButton
         Then
           Case (Components[i] As TButton).ModalResult Of
             mrNone     : (Components[i] As TButton).Caption := '&Help';         
             mrAbort    : (Components[i] As TButton).Caption := 'Abort';
             mrAll      : (Components[i] As TButton).Caption := '&All';
             mrCancel   : (Components[i] As TButton).Caption := '&Cancel';
             mrIgnore   : (Components[i] As TButton).Caption := '&Ignore';
             mrNo       : (Components[i] As TButton).Caption := '&No';
             mrNoToAll  : (Components[i] As TButton).Caption := 'No to All';
             mrOk       : (Components[i] As TButton).Caption := '&Ok';
             mrRetry    : (Components[i] As TButton).Caption := '&Retry';
             mrYes      : (Components[i] As TButton).Caption := '&Yes';
             mrYesToAll : (Components[i] As TButton).Caption := 'Yes to All';
           End;

       RESULT := ShowModal;
     Finally
       Free;
     End;
end;

更改每个标题以匹配您的首选语言。

像这样使用它:

MensagemDlg('Are you sure ?','Warning',mtWarning,[mbyes,mbno],0)

0
投票

扩展上面的MensajemDlg,我使用此函数和cxLocalizer资源自动传递本地化参数。

执行上述功能后,执行以下操作。

    MainFrm

interface

uses
StdCtrls // needed for TButton used in the function, added automatically by the IDE when saving project.


Private

Public
Hlp, Abrt, All, Cncel, Ignr, No, NotoAll,
Ok, Rtry, Yes, Warning, Information,
Confirmation,  YestoAll : string;
 function MensagemDlg(Msg: string; Title: string; DlgType: TMsgDlgType;
 procedure TranslationChanged;


function MainFrm.MensagemDlg(Msg: String; Title: String; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; Cod_Ajuda: Integer) : TModalResult;
var i   : Integer;
begin
  With CreateMessageDialog(Msg, DlgType, Buttons) Do
     Try
       Caption := Title;
       HelpContext := Cod_Ajuda;

       for i:= 0 To ComponentCount - 1 Do
         If Components[i] Is TButton
         Then
           Case (Components[i] As TButton).ModalResult Of
          mrNone:
            (Components[i] as TButton).Caption := Hlp; // '&Help';
          mrAbort:
            (Components[i] as TButton).Caption := Abrt; // 'Abort';
          mrAll:
            (Components[i] as TButton).Caption := All; // '&All';
          mrCancel:
            (Components[i] as TButton).Caption := Cncel; //'&Cancel';
          mrIgnore:
            (Components[i] as TButton).Caption := Ignr; //'&Ignore';
          mrNo:
            (Components[i] as TButton).Caption := No; //'&No';
          mrNoToAll:
            (Components[i] as TButton).Caption := NotoAll; // 'No to All';
          mrOk:
            (Components[i] as TButton).Caption := Ok; //'&Ok';
          mrRetry:
            (Components[i] as TButton).Caption := Rtry; //'&Retry';
          mrYes:
            (Components[i] as TButton).Caption := Yes; //'&Yes';
          mrYesToAll:
            (Components[i] as TButton).Caption := YestoAll; //'Yes to All';
           End;

       RESULT := ShowModal;
     Finally
       Free;
     End;
end;

procedure TMainFrm.FormCreate(Sender: TObject);
begin
  Hlp:= '&Help';
  Abrt := 'Abort';
  All := '&All';
  Cncel := '&Cancel';
  Ignr := '&Ignore';
  No := '&No';
  NotoAll := 'No to All';
  Ok := '&Ok';
  Rtry := '&Retry';
  Yes := '&Yes';
  YestoAll := 'Yes to All';
  Warning := 'Warning';
  Information := 'Information';
  Confirmation:= 'Confirmation';
end;

procedure TMainFrm.TranslationChanged;
begin
  //********* MessageDlg Buttons
  Hlp := cxGetResourceString(sHlp);
  Abrt := cxGetResourceString(sAbrt);
  All := cxGetResourceString(sAll);
  Cncel := cxGetResourceString(sCancel);
  Ignr := cxGetResourceString(sIgnr);
  No := cxGetResourceString(sNo);
  NotoAll := cxGetResourceString(sNoToAll);
  Ok := cxGetResourceString(sOK);
  Rtry := cxGetResourceString(sRtry);
  Yes := cxGetResourceString(sYes);
  YestoAll := cxGetResourceString(sYesToAll);
  //****************************

  //**************** MessageDlg Type
  Warning := cxGetResourceString(sWarning);
  Information := cxGetResourceString(sInformation);
  Confirmation := cxGetResourceString(sConfirmation);
  //************************************************
  end;

  procedure TMainFrm.Button1Click(Sender: TObject);
    begin

      if MessageLDlg(cxGetResourceString(sSomeStringResource),
       Confirmation, mtConfirmation, [mbYes, mbNo], 0) = mrYes then
        begin
            //Do something
        end;
    end;
© www.soinside.com 2019 - 2024. All rights reserved.