使用gnugettext翻译Delphi的MessageDlg按钮?

时间:2014-02-04 17:15:12

标签: delphi internationalization gettext

我们的应用程序有大约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按钮的想法?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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)

答案 2 :(得分: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;
相关问题