簡體   English   中英

使用.net緊湊框架進行本地化

[英]localization with .net compact framework

我正在使用.NET compact framework 3.5和MS Visual Studio 2008開發移動設備應用程序(Windows CE 5.0,.NET compact framwork 2.0預安裝)。

我正在使用內置選項來創建本地化表單。 只要我將Visual Studio的調試功能與連接到台式計算機的移動設備一起使用,這就完美無缺。 在這種情況下,Visual Studio將我的應用程序與.NET compact framework 3.5一起部署。 斷開移動設備並安裝我的應用程序后,它仍然按預期工作。

我的問題是:如果我使用Microsoft提供的CAB文件安裝.NET compact框架然后安裝我的應用程序(也使用Visual Studio創建的CAB文件)而沒有使用調試器,那么應​​用程序也能正常運行但沒有本地化。 所以我認為必須有一些.NET框架的部分只使用Visual Studio的部署功能安裝 - 並且正在使.net識別語言環境。 - 有誰知道哪些部分(圖書館......?)是這些? 由於應用程序將提供給不使用Visual Studio的用戶,我將為此找到解決方案。

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

答案很簡單。 它應該工作。 但事實並非如此。

微軟的工具CABWiz中顯然存在一個錯誤,它由Visual Studio用於生成CAB文件。 在不同的子文件夾中使用具有相同名稱的文件時會出現問題,例如使用本地化時。

經過幾個小時的嘗試修復后,我最終得到了一個解決方案, 解決方案受到Cornel在上一個答案中給出的CodeProject指南的啟發:你必須通過使用具有唯一名稱的資源文件來“破解”生成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 + ") !");
    }

我希望它有所幫助。

更多關於此的鏈接:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM