【问题标题】:localization with .net compact framework使用 .net 紧凑框架进行本地化
【发布时间】:2013-08-23 22:39:37
【问题描述】:

我正在使用 .NET compact framework 3.5 和 MS Visual Studio 2008 为移动设备开发一个应用程序(Windows CE 5.0、.NET compact framework 2.0 预装)。

我正在使用内置选项来创建本地化表单。只要我在连接到台式计算机的移动设备上使用 Visual Studio 的调试功能,它就可以完美运行。在这种情况下,Visual Studio 将我的应用程序与 .NET compact framework 3.5 一起部署。断开移动设备并安装我的应用程序后,它仍然可以正常工作。

我的问题是:如果我使用 Microsoft 提供的 CAB 文件安装 .NET 紧凑型框架,然后在不使用调试器的情况下安装我的应用程序(也使用 Visual Studio 创建的 CAB 文件),则应用程序也可以正常工作,但是没有本地化。所以我认为 .NET 框架的某些部分必须仅使用 Visual Studio 的部署功能安装 - 并且使 .net 识别语言环境。 - 有谁知道这些是哪些部分(库......?)?由于该应用程序将提供给不会使用 Visual Studio 的用户,因此我必须为此找到解决方案。

【问题讨论】:

  • 您是否验证了 CAB 文件确实安装了您的本地化资源程序集?
  • CF 没有“本地化”部分。您可能没有使用 CAB 部署本地化资源,或者您将它们部署到错误的位置。

标签: c# .net windows localization windows-ce


【解决方案1】:

我使用了教程 - 使用 Compact Framework 进行资源本地化的指南:http://www.codeproject.com/Articles/28234/Survival-guide-to-do-resource-localization-using-C

【讨论】:

    【解决方案2】:

    答案很简单。它应该工作。但事实并非如此。

    Visual Studio 用于生成 CAB 文件的 Microsoft 工具 CABWiz 中显然存在错误。在不同的子文件夹中使用同名文件时会出现问题,例如使用本地化时。

    经过数小时的尝试修复它,我最终得到了一个受 the CodeProject guide 启发的解决方案,正如 Cornel 在上一个答案中给出的那样:您必须通过使用资源文件来“破解”生成 CAB 的 Visual Studio 过程唯一名称,然后修改 INF 文件以指定在设备上部署的原始名称。

    为了更加自动化,我制作了一个作为项目后期构建启动的小 EXE:

            FileInfo CurrentExeInfo = new FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
    
            // Current Folder + bin\Debug
            DirectoryInfo BinDebug = new DirectoryInfo( Path.Combine( CurrentExeInfo.Directory.FullName,  @"bin\Debug") );
    
            // Subfolders in \bin\Debug
            Console.WriteLine(BinDebug.FullName);
            string[] Dirs = Directory.GetDirectories(BinDebug.FullName, "*", SearchOption.TopDirectoryOnly);
    
            // In each localization folder ...
            foreach (string Dir in Dirs)
            {
                DirectoryInfo DirInfo = new DirectoryInfo(Dir);
    
                // ... Resource files
                string[] RFiles = Directory.GetFiles(Dir, "*.resources.dll");
    
                foreach (string RFile in RFiles)
                {
                    FileInfo RFileInfo = new FileInfo(RFile);
                    bool DoCopy = false;
    
                    // No underscore in resource name
                    if (!RFileInfo.Name.Contains("_") || RFileInfo.Name.IndexOf("_") == 0)
                    {
                        DoCopy = true;
                    }
                    // underscore in resource name
                    // --> Have to check if already a copy 
                    else
                    { 
                        // prefix removal
                        int PrefixIndex = RFileInfo.Name.IndexOf("_");
                        string TestFilename = RFileInfo.Name.Substring(PrefixIndex + 1);
    
                        if (!File.Exists(Path.Combine(Dir, TestFilename)))
                        {
                            // File without underscore does not exist, so must copy
                            DoCopy = true;
                        }
                    }
    
                    if (DoCopy)
                    {
                        // Copy file
                        string NewFileName = Path.Combine(Dir, DirInfo.Name.ToUpper() + "_" + RFileInfo.Name);
                        Console.WriteLine("Copying " + RFile + " -> " + NewFileName);
                        File.Copy(RFile, NewFileName, true);
                    }
                }
            }
    

    然后是正常 CAB 生成后的这个 CAB 修补程序:

        const string cabwizpath = @"C:\Program Files (x86)\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe";
    
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.WriteLine("Aborted: You must enter the inf file information");
                Console.ReadLine();
                return;
            }
            if (!File.Exists(args[0]))
            {
                Console.WriteLine("Aborted: I can not found the INF file!");
                Console.ReadLine();
                return;
            }
    
            // string to search
            Regex R = new Regex("\"[A-Z]{2,3}_(.+)\\.resources\\.dll\",\"([A-Z]{2,3})_(.+)\\.resources\\.dll\"");
    
            // File reading
            string inffile = File.ReadAllText(args[0]);
    
            // Format replace from
            // "FR_ProjectName.resources.dll","FR_ProjectName.resources.dll"
            // To
            // "ProjectName.resources.dll","FR_ProjectName.resources.dll"
            inffile = R.Replace(inffile, "\"$1.resources.dll\",\"$2_$3.resources.dll\"");
    
            // Rewriting file
            File.WriteAllText(args[0], inffile);
            Console.WriteLine("INF file patched ...");
    
            // Génération du CAB ...
            Console.WriteLine("Generating correct CAB ... ");
            System.Diagnostics.ProcessStartInfo proc = new System.Diagnostics.ProcessStartInfo("\"" + cabwizpath + "\"", "\"" + args[0] + "\"");
            proc.ErrorDialog = true;
            proc.UseShellExecute = false;
            proc.RedirectStandardOutput = true;
            Process CabWiz =  Process.Start(proc);
            Console.WriteLine("\""+cabwizpath + "\" \""+ args[0]+"\"");
            CabWiz.WaitForExit();
            Console.WriteLine("CAB file generated (" + CabWiz.ExitCode + ") !");
        }
    

    我希望它有所帮助。

    更多链接:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 2010-10-17
      • 1970-01-01
      • 2010-11-04
      • 2011-03-15
      相关资源
      最近更新 更多