【问题标题】:Create custom culture in ASP.NET在 ASP.NET 中创建自定义文化
【发布时间】:2010-11-21 05:29:54
【问题描述】:

我想在 App_GlobalResources 文件夹中创建一个名为“shopping.en-sg.resx”的新加坡英语 (en-sg) 资源文件。

编译时出错。

错误 1 ​​命名空间“资源” 已经包含一个定义 '购物' c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET 文件\web\2cd6afe9\737b0a13\App_GlobalResources.vomuzavz.1.cs 26

在谷歌搜索后,我发现“en-sg”不是默认文化,我必须为其创建自定义文化。我不知道这个的详细步骤。

我应该怎么做才能创建文化并消除编译错误?

我按照 MSDN 中的示例,创建一个名为“shopping.x-en-US-sample.resx”的文件,并将以下代码放入 BasePage 的函数中(protected override void InitializeCulture()):

CultureAndRegionInfoBuilder cib = null;

cib = new CultureAndRegionInfoBuilder(
  "x-en-US-sample", CultureAndRegionModifiers.None);

CultureInfo ci = new CultureInfo("en-US");
cib.LoadDataFromCultureInfo(ci);
RegionInfo ri = new RegionInfo("US");
cib.LoadDataFromRegionInfo(ri);

cib.Register();

ci = new CultureInfo("x-en-US-sample");

但是,编译错误仍然存​​在。

更新:

您可以通过在 app_globalresources 文件夹中创建一个空网站和两个文件“shopping.en-sg.resx”和“shopping.resx”来轻松重现该问题。

【问题讨论】:

    标签: asp.net internationalization


    【解决方案1】:

    【讨论】:

    • 这是一个仅链接的答案。请在您的回答中包含链接网站中最重要的部分。
    【解决方案2】:

    您可以在现有文化的基础上创建新文化:

    string culture = "en-sg";
    string name = "Singaporean English";
    
    CultureInfo cultureInfo = new CultureInfo("en-GB");
    RegionInfo regionInfo = new RegionInfo(cultureInfo.Name);
    
    CultureAndRegionInfoBuilder cultureAndRegionInfoBuilder = new CultureAndRegionInfoBuilder(culture, CultureAndRegionModifiers.None);
    
    cultureAndRegionInfoBuilder.LoadDataFromCultureInfo(cultureInfo);
    cultureAndRegionInfoBuilder.LoadDataFromRegionInfo(regionInfo);
    
    // Custom Changes
    cultureAndRegionInfoBuilder.CultureEnglishName = name;
    cultureAndRegionInfoBuilder.CultureNativeName = name;
    
    cultureAndRegionInfoBuilder.Register();
    

    添加: 刚刚检查了参考资料: 我有:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Globalization;
    using System.IO;
    using System.Reflection;
    using System.Runtime.CompilerServices;
    

    添加(更新,基于 cmets):

    关于错误信息:

    您看到的错误是某些资源命名冲突的结果。检查资源名称,这些会被编译成 dll,您需要检查命名空间名称是否冲突。您可以使用反射器工具检查这一点:http://www.red-gate.com/products/reflector/

    【讨论】:

    • 此代码只需要在需要额外文化的机器上运行一次。也许您收到错误是因为它已经存在?
    • 把代码放到global.asax中?如果我将“en-sg”更改为“en-us”,那很好。我只想要一段代码,我可以简单地把它放在某个地方,然后我可以使用 shopping.en-sg.resx
    • 刚刚用错误消息的一些附加信息更新了答案。
    • "en-SG" 不是 ASP.NET 中默认的有效区域性。
    • 我觉得应该提一下,上面的代码需要系统管理员权限才能运行。来自 MSDN 文章:“自定义文化只能由对该计算机具有管理权限的用户在计算机上注册。因此,应用程序通常不会创建和安装自定义文化。相反,您可以使用 CultureAndRegionInfoBuilder 类来创建一个管理员可以用来创建、安装和注册自定义文化的专用工具。”
    【解决方案3】:

    以下是创建 en-sg 文化所需的步骤和代码。

    1. 创建控制台应用程序。
    2. 添加对 sysglobl 的引用 (C:\Windows\Microsoft.NET\Framework\v2.0.50727\sysglobl.dll)
    3. 添加下面的代码。
    4. 以管理员身份在 Web 服务器和开发计算机上运行它。

    它将根据我发现的最接近的匹配创建一种文化 (en-au)。然后我覆盖了名称等以使其独一无二。

    您应该只需要运行一次。它会在创建它之前删除任何现有的,以防您希望在运行后进行任何修改。

    public static void Main()
        {
            CultureAndRegionInfoBuilder cib = null;
    
            try
            {
                Console.Clear();
                Console.WriteLine("Unregister the \"en-SG\" " + "custom culture if it already exists...");
                CultureAndRegionInfoBuilder.Unregister("en-SG");
                Console.WriteLine("The custom culture was unregistered successfully.");
            }
            catch (Exception e)
            {
                Console.WriteLine("Error while unregistering...");
                Console.WriteLine(e);
            }
    
            try
            {
                cib = new CultureAndRegionInfoBuilder("en-SG", CultureAndRegionModifiers.None);
    
                // Populate the new CultureAndRegionInfoBuilder object with culture information.
                CultureInfo ci = new CultureInfo("en-AU");
                cib.LoadDataFromCultureInfo(ci);
    
                // Populate the new CultureAndRegionInfoBuilder object with region information.
                RegionInfo ri = new RegionInfo("SG");
                cib.LoadDataFromRegionInfo(ri);
    
                cib.CultureEnglishName = "English (Singapore)";
                cib.CultureNativeName = "English (Singapore)";
                cib.IsMetric = true;
    
                // Display some of the properties of the CultureAndRegionInfoBuilder object.
                Console.WriteLine("CultureName:. . . . . . . . . . {0}", cib.CultureName);
                Console.WriteLine("CultureEnglishName: . . . . . . {0}", cib.CultureEnglishName);
                Console.WriteLine("CultureNativeName:. . . . . . . {0}", cib.CultureNativeName);
                Console.WriteLine("GeoId:. . . . . . . . . . . . . {0}", cib.GeoId);
                Console.WriteLine("IsMetric: . . . . . . . . . . . {0}", cib.IsMetric);
                Console.WriteLine("ISOCurrencySymbol:. . . . . . . {0}", cib.ISOCurrencySymbol);
                Console.WriteLine("RegionEnglishName:. . . . . . . {0}", cib.RegionEnglishName);
                Console.WriteLine("RegionName: . . . . . . . . . . {0}", cib.RegionName);
                Console.WriteLine("RegionNativeName: . . . . . . . {0}", cib.RegionNativeName);
                Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", cib.ThreeLetterISOLanguageName);
                Console.WriteLine("ThreeLetterISORegionName: . . . {0}", cib.ThreeLetterISORegionName);
                Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", cib.ThreeLetterWindowsLanguageName);
                Console.WriteLine("ThreeLetterWindowsRegionName: . {0}", cib.ThreeLetterWindowsRegionName);
                Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", cib.TwoLetterISOLanguageName);
                Console.WriteLine("TwoLetterISORegionName: . . . . {0}", cib.TwoLetterISORegionName);
                Console.WriteLine();
    
                // Register the custom culture.
                Console.WriteLine("Register the custom culture...");
                cib.Register();
    
                // Display some of the properties of the custom culture.
                ci = new CultureInfo("en-SG");
    
                Console.WriteLine("Name: . . . . . . . . . . . . . {0}", ci.Name);
                Console.WriteLine("EnglishName:. . . . . . . . . . {0}", ci.EnglishName);
                Console.WriteLine("NativeName: . . . . . . . . . . {0}", ci.NativeName);
                Console.WriteLine("TwoLetterISOLanguageName: . . . {0}", ci.TwoLetterISOLanguageName);
                Console.WriteLine("ThreeLetterISOLanguageName: . . {0}", ci.ThreeLetterISOLanguageName);
                Console.WriteLine("ThreeLetterWindowsLanguageName: {0}", ci.ThreeLetterWindowsLanguageName);
    
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            Console.ReadKey();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-21
      • 2016-06-19
      • 2015-10-06
      相关资源
      最近更新 更多