Wix 安装部署教程(十六) -- 自动生成多语言文件

因为持续集成需要,所有项目编译完之后生成一个多语言的安装包。之前生成mst文件都是手动操作,而且mst文件必须每次重新和新的安装包“关联”,否则中文的安装包去调用英文的资源的时候就会报类似于“类型转换失败”的错误。基于这两点,有必要程序化这个流程,不然每次打包都得找我了。以下是程序的记录。比较简单。

其实就是用程序调用cmd,再次之前,请记得将wix的bin目录加入到系统变量中。否则命令不会被识别;然后将程序执行目录指向目标目录。

 static void Main(string[] args)
        {
            if (args.Length < 1)
            {
                return;
            }
            Console.WriteLine(args[0]);

            var path = args[0];
          //  var path =MsiPath;

            Console.WriteLine("正在执行:" + DateTime.Now);
            var p = new Process
            {
                StartInfo =
                {
                    FileName = "cmd.exe ",
                    UseShellExecute = false,
                    RedirectStandardInput = true,
                    RedirectStandardOutput = true,
                    RedirectStandardError = true,
                    CreateNoWindow = false,
                    WorkingDirectory = path
                }
            };
            try
            {
                p.Start();

                if (!Init(p, path))
                {
                    Console.WriteLine("初始化失败");
                    p.Close();
                    return;
                }
                //合并语言
                ExcComand(p, CommandLines.LanZh_TW);
                ExcComand(p, CommandLines.LanZh_CN);
                ExcComand(p, CommandLines.LanEN_US);

                //关联语言
                ExcComand(p, CommandLines.CombanLanZh_cn);
                //测试安装包
               // ExcComand(p, CommandLines.Testzh_Tw);

                //p.WaitForExit();
                p.Close();
                Console.WriteLine("Complete" + DateTime.Now);
            }
            catch (Exception e1)
            {
                Console.WriteLine("error" + e1.Message);
            }

        }

先初始化,确保安装文件、vbs文件和mst文件都存在。

  private static string[] lans = { "zh-cn", "en-us", "zh-tw" };
        private static bool Init(Process p, string path)
        {
            //多语言安装包是否存在
            foreach (var lan in lans)
            {
                var lanPath = Path.Combine(path, lan, SoftName);
                if (!File.Exists(lanPath))
                {
                    Console.WriteLine("{0}安装包不存在!",lan);
                    return false;
                }
            }
            //保证两个文件
            CopyFileIfNotExist(path,"WixSubStg.vbs");
            CopyFileIfNotExist(path, "WiLangId.vbs");

            //变形文件是否存在
            var twmst = Path.Combine(path, "transforms", "zh-tw.mst");
            if (!File.Exists(twmst))
            {
                GetTransforms(p);
            }

            //再检测一次
            return File.Exists(twmst);
        }

这两个vbs文件,在教程十三里面有提供。 最后在检查一次mst文件就是确保mst文件的存在。变形文件是我们多语言安装包的关键。

  /// <summary>
        /// 生成变形文件
        /// </summary>
        /// <param name="p"></param>
        private static void GetTransforms(Process p)
        {
            ExcComand(p, CommandLines.EnToZh);
            ExcComand(p, CommandLines.EnToTw);
            ExcComand(p, CommandLines.ZhToEn);
        }

        private static void ExcComand(Process p, string command)
        {
            p.StandardInput.WriteLine(command);
            Console.WriteLine("command:" + command);
            Thread.Sleep(1500);
        }

而commandLines 这个类里面就包含了这次所会用到的命令。

public  class CommandLines
  {
      //对应繁体
      public static string LanZh_TW = @"WixSubStg.vbs zh-cn\DIAViewSetup.msi  transforms\zh-tw.mst 1028";
      //对应中文
      public static string LanZh_CN = @"WixSubStg.vbs zh-cn\DIAViewSetup.msi transforms\zh-cn.mst 2052";
      //对应英文
      public static string LanEN_US = @"WixSubStg.vbs zh-cn\DIAViewSetup.msi transforms\en-us.mst 1033";

      //合成语言安装包 ,默认是中文
      public static string CombanLanZh_cn = @"WiLangId.vbs zh-cn\DIAViewSetup.msi Package 1028,2052,1033";
      //测试繁体安装包
      public static string Testzh_Tw = @"msiexec /i  zh-cn\DIAViewSetup.msi TRANSFORMS=transforms\zh-tw.mst";
      //测试中文安装包
      public static string Testzh_Cn = @"msiexec /i  zh-cn\DIAViewSetup.msi TRANSFORMS=transforms\zh-cn.mst";
      //测试英文安装包
      public static string Testen_US = @"msiexec /i  zh-cn\DIAViewSetup.msi TRANSFORMS=transforms\en-us.mst";

      //生成英文资源
      public static string EnToZh = @"torch.exe -t language en-us\DIAViewSetup.msi zh-cn\DIAViewSetup.msi -out transforms\zh-cn.mst";
      //生成中文资源
      public static string EnToTw = @"torch.exe -t language en-us\DIAViewSetup.msi zh-tw\DIAViewSetup.msi -out transforms\zh-tw.mst";
      //生成繁体资源
      public static string ZhToEn = @"torch.exe -t language zh-cn\DIAViewSetup.msi en-us\DIAViewSetup.msi -out transforms\en-us.mst";
  }

最后的执行结果如下。 这里是以zh-cn为基础。合成之后的安装包就可以根据系统环境自动切换语言,如果不是关联的语言之一就显示默认语言。

当然,主要的目的是可以让他可以根据用户的选择来显示不同的语言界面。

时间: 2024-10-20 07:41:34

Wix 安装部署教程(十六) -- 自动生成多语言文件的相关文章

Wix 安装部署教程(十二) -- 自动更新WXS文件

上一篇分享了一个QuickWIX,用来对比两个工程前后的差异,但是这样还是很繁琐,而且昨天发现有Bug,目录对比有问题.这次改变做法,完全让程序自动去更新WXS文件,然后再用CCNet去自动编译,这样的话,工程师更新文件,再也不用我去编译,发布了. 思路:在原来的基础上,传入工程路径和目标文件夹,用模板的方式,更新变动的部分生成新的WXS文件覆盖原来的文件,一开始我思路搞错了,想在比较的基础上去更新变动的部分,比如一个文件删除了,就把这个File移除掉,同理对于组件和目录,但是这样比较费事,容易

Wix 安装部署教程(十) --来,用WPF做个漂亮的安装界面

在上一篇中曾留下两个问题,.Net捆绑安装不触发以及路径选择的问题现在都已经解决,这段时间花的最多的地方还是WPF调样式上面,奈何WPF功力不够,暂时还是没有达到自己想要的效果.另外ViewModel做了些调整,状态更加分明.安装效果是仿照搜狗输入法做的.先上效果图.   以上这只是四个基本的页面,更细化一些可以分出卸载的进度页面,卸载的完成页面,对修复同理,还有安装失败,用户取消提示页面,再就是能检测新版本并覆盖安装,这些都可以根据状态去添加页面.下面简单的说下思路和新的问题点. 关键流程 安

Wix 安装部署教程(十五) --CustomAction的七种用法

在WIX中,CustomAction用来在安装过程中执行自定义行为.比如注册.修改文件.触发其他可执行文件等.这一节主要是介绍一下CustomAction的7种用法. 在此之前要了解InstallExecuteSequence,它是一个Action的执行序列. Installer会按照默认顺序来执行这些Action.通过字面意思也大概知道这些Action的目的.这些方法不是每次一都执行,分安装和卸载.如果CustomAction没有指定,很可能会安装卸载的时候都会执行一次. • AppSearc

Wix 安装部署教程(十四) -- 多语言安装包之用户许可协议

在上一篇中,留下了许可协议的问题,目前已经解决.感谢网友武全的指点! 问题 一般我们是用WixVariable 来设定许可协议.如下所示: <WixVariable Id="WixUILicenseRtf" Value="license.rtf" /> 但在多语言中我们写成下面这样是不识别的.它会被直接当成文件路径,而报错,找不到文件. <WixVariable Id="WixUILicenseRtf" Value="

WIX 安装部署教程(六) 为你收集的七个知识点

前段时间整理5篇WIX(Windows Installer XML)的安装教程,但还不够完善,这里继续整理了七个知识点分享给大家.WIX最新版本3.8,点击下载 WIX安装部署(一)同MSBuild自动生成打包文件 WIX安装部署(二)自定义安装界面和行为 WIX安装部署(三)自定义安装界面和行为 WIX安装部署(四)添加安装文件及快捷方式 WIX安装部署(五)Bootstrap 捆绑安装 1.设置路径变量 有的时候路径过长,文件又比较多,重复粘贴一个地址总是不舒服,而且要改起来也很麻烦,那这个

Wix 安装部署教程 自动生成XML小工具

这个功能类似于Heat.exe,指定文件夹,生成对应的WIX标签.Winform做的,代码简单,生成的标签需要粘贴到对应的目录才能使用,并不是一步到位. 需要设定两个参数,一个是文件夹路径,一个是文件夹对应的变量. 会根据文件夹的目录生成Directory目录.DirectoryRef目录(包含file和Component)以及ComponentRef目录.需要复制下来后粘贴到对应的部分.GUID都是自动生成,Id是根据文件或者文件夹的名称得来.id不能以数字开头,所以File带了file前缀,

Wix 安装部署教程(九) --用WPF做安装界面

经常安装PC端的应用,特别是重装系统之后,大致分为两类.一类像QQ,搜狗输入法这样的.分三步走的:第一个页面可以自定义安装路径和软件许可.第二个页面显示安装进度条,第三个页面推荐其他应用.先不管人家怎么实现的,我们先回顾一下. QQ:       再一个就是分六步或七步走的,如QQ影音:欢迎界面,用户许可,安装组件,安装目录,安装进度,安装完成,有七步的,一般会多一些软件推荐.当然还有其他的,比如是基于ClickOnce打包的,就一个界面,一个进度条.没有安装目录选择,这一般不是商业软件.先说第

Wix 安装部署教程(十三) -- 多语言安装包

这几天摸索WIX的多语言安装包(这里是Wix的setup 工程,不是Bundle),终于走通了,感谢网友uni的指点.WIX的多语言安装包能够根据系统环境自动切换界面语言,你也可以通过命令指定语言.下面我说一说步骤.共4步. 1.设置WixLocalization文件. Wxl文件就相当于应用程序的资源文件.让我们根据不同的语言来编写不同的文本内容. 例如我们新建一个WixUI_zh-cn.wxl ,来处理简体中文. <WixLocalization Culture="zh-cn"

Wix 安装部署教程(十一) ---QuickWix

这次发布的是这两天做的一个WIX工具QuickWIX,主要解决两个问题点1.对大文件快速生成wix标签(files,Directories,ComponentRef):2.比较前后两次工程的差异.大的WIX工程有好几千个文件,开发人员增加dll,或者资源文件都是不确定的,而且很多时候我们无法直接取代,所以需要一个对比的功能,来告诉打包人员哪里新增了,哪里删除了,这样加快打包速度. 一.介绍 工具是个简单的winform程序.下面做几点说明. 1.生成XML:会更具路径和变量信息,生成Fragme