【问题标题】:How to display localized Program Files name (display name) during installation?安装过程中如何显示本地化的程序文件名(显示名)?
【发布时间】:2016-09-23 09:36:22
【问题描述】:

我目前正在创建一个安装程序,它的默认安装目录为 Program Files。为此,我使用了{pf}

这是一个德语程序,仅在德国使用,虽然安装程序在选择目标目录期间完全使用德语,但安装程序仍显示 C:\Program Files 而不是本地化名称 C:\Programme

是否可以改为显示C:\Programme?功能上一切正常,应用程序安装在C:\Programme。我只是担心基本用户可能会因为阅读 C:\Program Files 而感到困惑。

编辑:更多信息:我知道C:\ProgrammeProgram Files 的任何其他本地化名称只是一个显示名称,物理路径始终是Program Files。哪个 Windows 版本或 Windows 有什么语言都没有关系。但是我仍然希望设置在安装过程中显示C:\Programme

我的测试机器在 Windows 7 和 Windows 10 上。

【问题讨论】:

    标签: inno-setup


    【解决方案1】:

    Inno Setup 不支持。

    你必须伪造它。您可以根据需要将DirEdit 的内容动态转换为显示名称/从显示名称转换:

    • 在“选择目标位置”页面激活时转换为显示名称
    • 点击“浏览”按钮时转换为物理路径。
    • 在选择新路径时转换为显示名称。
    • 点击“下一步”按钮时转换为物理路径。
    function ToDisplayName(Path: string): string;
    begin
      Result := ???;
    end;
    
    function FromDisplayName(Path: string): string;
    begin
      Result := ???;
    end;
    
    var
      DirBrowseButtonClickOrig: TNotifyEvent;
      OnSelectDir: Boolean;
    
    procedure DirBrowseButtonClick(Sender: TObject);
    begin
      WizardForm.DirEdit.Text := FromDisplayName(WizardForm.DirEdit.Text);
      DirBrowseButtonClickOrig(Sender);
      WizardForm.DirEdit.Text := ToDisplayName(WizardForm.DirEdit.Text);
    end;
    
    procedure InitializeWizard();
    begin
      DirBrowseButtonClickOrig := WizardForm.DirBrowseButton.OnClick;
      WizardForm.DirBrowseButton.OnClick := @DirBrowseButtonClick;
      OnSelectDir := False;
    end;
    
    procedure CurPageChanged(CurPageID: Integer);
    begin
      if CurPageID = wpSelectDir then
      begin
        OnSelectDir := True;
        WizardForm.DirEdit.Text := ToDisplayName(WizardForm.DirEdit.Text);
      end
        else
      begin
        if OnSelectDir then
        begin
          OnSelectDir := False;
          WizardForm.DirEdit.Text := FromDisplayName(WizardForm.DirEdit.Text);
        end;
      end;
    end;
    

    一个棘手的部分当然是ToDisplayNameFromDisplayName 函数的实现。

    真正的本机实现将非常复杂,如果您可以使用 Pascal 脚本的有限功能(尤其是缺少指针)来实现它,甚至是值得怀疑的。

    但是对于您的特定需求,您可以使用一些微不足道的东西:

    [CustomMessages]
    ProgramFilesLocalized=Programme
    
    [Code]
    
    function ToDisplayName(Path: string): string;
    begin
      StringChange(Path, '\Program Files', '\' + CustomMessage('ProgramFilesLocalized'));
      Result := Path;
    end;
    
    function FromDisplayName(Path: string): string;
    begin
      StringChange(Path, '\' + CustomMessage('ProgramFilesLocalized'), '\Program Files');
      Result := Path;
    end;
    


    如果您需要真正实现与显示名称之间的转换,请考虑提出单独的问题。

    【讨论】:

    • 谢谢。相当大的解决方法。必须考虑是否值得。我对这个解决方案的主要问题是它是硬编码的,这意味着我必须根据使用的语言创建和维护多个安装例程。虽然它目前仅在德国使用,但该程序可能在其他国家/地区使用,因此我需要为每种语言使用不同的安装程序,这不是我想要的。不过,非常感谢您对这个问题的深入了解。
    • 正如我所写的,ToDisplayNameFromDisplayName 可以使用 WinAPI 实现通用并适用于任何语言。但这是一项值得提出新问题的艰巨任务 + 即使没有,您也不需要为每种语言使用不同的安装程序。您可以使用custom message,就像安装程序中的任何其他自定义消息一样(您可能已经有了一些)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多