【问题标题】:Translating Delphi's MessageDlg buttons using gnugettext?使用 gnugettext 翻译 Delphi 的 MessageDlg 按钮?
【发布时间】:2014-02-04 17:15:12
【问题描述】:

我们的应用程序有大约 400 次 MessageDlg 调用。问题在于翻译按钮和标题。这些文本在 VCL pas 文件中被定义为资源字符串常量,但似乎没有通过 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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      使用这个 Fonction 它对我有用:

      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)
      

      【讨论】:

        【解决方案3】:

        扩展上面的 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;
        

        【讨论】:

          猜你喜欢
          • 2016-05-11
          • 2015-11-23
          • 1970-01-01
          • 1970-01-01
          • 2013-08-22
          • 2017-12-22
          • 1970-01-01
          • 2014-06-22
          • 2023-01-25
          相关资源
          最近更新 更多