Asp.net C#中的自定义区域性导致编译错误

Asp.net C#中的自定义区域性导致编译错误,asp.net,Asp.net,我有一个系统,在这个系统中,本地化可以很容易地在每个客户级别上发生变化。我们使用像这样的文化 fr-MYCLIENT 这些区域性使用以下代码注册: private List<MyBaseCulture> supportedCultures = new List<MyBaseCulture> { { new MyBaseCulture("pt-PT") }, { new MyBaseCulture("en-US")

我有一个系统,在这个系统中,本地化可以很容易地在每个客户级别上发生变化。我们使用像这样的文化

fr-MYCLIENT
这些区域性使用以下代码注册:

private List<MyBaseCulture> supportedCultures = new List<MyBaseCulture>
{
    { new MyBaseCulture("pt-PT") },
    { new MyBaseCulture("en-US") },
    { new MyBaseCulture("fr-FR") },
    { new MyBaseCulture("nl-NL") },
    { new MyBaseCulture("es-ES") },
    { new MyBaseCulture("ca-ES") },
    { new MyBaseCulture("cs-CZ") },
};
public string RegisterCulture(string parentCulture, string newCultureName)
{
    MyBaseCulturemyParent = supportedCultures.Where(x => x.Equals(new MyBaseCulture(parentCulture))).FirstOrDefault();

    if(myParent==null)
    {
       throw new Exception($"Unsupported culture requested during culture registration: '{parentCulture}'");
        }

    CultureInfo ci = new CultureInfo(myParent.Culture);
    RegionInfo ri = new RegionInfo(myParent.Region)
    CultureAndRegionInfoBuilder myBuilder = new CultureAndRegionInfoBuilder(newCultureName, CultureAndRegionModifiers.None);
    myBuilder.LoadDataFromCultureInfo(ci);
    myBuilder.LoadDataFromRegionInfo(ri);

    bool cultureAlreadyExists = DoesCultureExist(parentCulture);

    try
    { 
        if(cultureAlreadyExists)
            CultureAndRegionInfoBuilder.Unregister(newCultureName);
        myBuilder.Register();
    }
    catch(Exception e)
    {
        return "Exception during culture registration. Details: " + e.Message;
    }
    return cultureAlreadyExists ? 
          "Successfully registered culture " + parentCulture
          : "Culture failed to register...";
}
我正在使用RESX文件来跟踪这一点。这些文件使用自定义工具GlobalResourceProxyGenerator,负责为所有资源条目创建设计器类,以便快速访问类

问题是,当我试图在没有注册自定义区域性的机器上构建项目时

只要我用来编译代码的机器缺少至少一个自定义区域性,我就会得到如下编译错误:

这最终会非常麻烦,因为我们需要一个外部工具来注册区域性,以便在每次需要移动到新机器或团队成员之一添加新区域性时能够编译代码

有没有办法:

  • a) 在此编译步骤之前运行代码(类似于Application_Start in global.asax,但在抛出此错误的步骤之前执行
  • b) 除非调用相关区域性,否则跳过此验证
我们使用自定义区域性的原因是存储字段值(例如下拉选项)。显然,我们的安装数量远远大于文化(即,比单一的英国客户多得多)。更改每个部署的值是次优的,因为升级原始客户会带来巨大的痛苦(即,如果我们将en UK下拉列表_1修改为“示例公司1”,则另一个客户会请求“示例公司2”在同一下拉列表中,如果我们要升级第一个客户机的版本,我们必须恢复原始值。使用自定义区域,我们只需为每个客户机设置一个不同的区域,以明确该组资源是特定于他们的

编辑:添加了一个我们使用的文化名称示例


Edit2:澄清我们为什么使用自定义区域性。

该错误与自定义区域性无关。它抱怨
ChartResources
定义了两次。至于创建自定义区域性,为什么首先要这样做?资源会更改,但区域设置和区域性不会更改。除非您需要不同的日期、月份名称或长/短日期同一国家/地区的不同客户的字符串?错误看起来无关,但加载我的web应用程序时会显示此错误。如果我在其他网站注册缺少的区域性(请阅读:完全不更改代码中的任何内容,但通过完全独立的应用程序注册预期的区域性),该编译错误消失,所有内容正常加载。虽然我不确定为什么会显示该错误,但我确信这是因为我缺少所需的自定义区域性。该错误与资源类有关,而不是区域性。
GlobalResourceProxyGenerator
为资源文件生成代码,而不是区域性。区域性e
CultureInfo
代表什么。在非常罕见的情况下,您需要自定义区域性,而不是使用resx文件来构建它。创建自定义区域性不会生成资源文件或类。您是否使用
culture
来引用资源文件?一次又一次,为什么要使用自定义区域性?人们正在使用本地化的资源事实上,创建自定义区域性的能力来得很晚,能够处理操作系统不提供的区域性。本地化从来都不需要它们。甚至加拿大也不需要(我自己也忍不住)
new CultureRegistration().RegisterCulture("es-ES", "es-CLIENT01");
Compiler Error Message: CS0101: The namespace 'Resources' already contains a definition for 'ChartResources'
Source File: c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\vs\fc87251a\66d5efac\App_GlobalResources.zetsmdoe.4.cs    Line: 26