【问题标题】:ResourceManager falls back to default resources instead of reading from satellite assemblyResourceManager 回退到默认资源,而不是从附属程序集中读取
【发布时间】:2013-04-03 14:37:09
【问题描述】:

三个项目的文件夹结构如下:

MyClassLibrary1
  Class1.cs
  Resources\
      en-GB\
          Strings.en-GB.txt
      Strings.resx
          Strings.designer.cs (auto-generated)
MyClassLibrary2 (references MyClassLibrary1)
    Class1.cs
MyAppExe (references MyClassLibrary1 and MyClassLibrary2)
    Program.cs

在 MyClassLibrary1 项目下:

In Strings.resx, I've string resources defined, let's say:
    <data name="SchoolString"><value>Preschool</value></data>
In Strings.en-GB.txt, I have:
    SchoolString=Playgroup

MyClassLibrary1 的项目属性 -> Pre-Build,我有以下内容:

CD $(ProjectDir)Resources
FOR /D %%1 IN (*) DO (
    CD "%%1"
    resgen.exe "Strings.%%1.txt"
    if %errorlevel% 0 al.exe /t:lib /culture:"%%1" /embed:"Strings.%%1.resources" /out:MyClassLibrary1.resources.dll
    if not exist "$(TargetDir)%%1" md "$(TargetDir)%%1"
    move /Y "MyClassLibrary1.resources.dll" "$(TargetDir)%%1"
    CD ..
)

在 MyAppExe 项目下,在 Program.cs 中:

static void Main() {
    Strings.Culture = new CultureInfo("en-GB");
    Trace.WriteLine(Strings.SchoolString);
}

问题在于,由于某种原因,ResourceManager 不断回退到默认资源文件(嵌入在 MyAppExe 中)。请帮助我理解我在这里做错了什么。

无论我尝试什么,我都会得到的输出是“Preschool”而不是“Playgroup”。就像卫星组件根本没有解决一样。

【问题讨论】:

  • 附属程序集必须存在于与区域性同名的 EXE 目录的子目录中。在您的情况下名为“en-GB”的目录。看起来您的构建事件无法解决这个问题。
  • 确实如此,它进入 bin\Debug\en-GB\ 文件夹
  • @hans-passant:刚刚看到这篇知识库文章 - KB839861 - 我想我必须更改为 resgen.exe "Strings.%%1.txt" "MyClassLibrary1.Resources.Strings.%%1.txt" 并更改为 al.exe /t:lib /embed:"MyClassLibrary1.Resources.Strings.%%1.resources" /out:"MyClassLibrary1.resources.dll" 以使 al.exe 生成正确的命名空间姓名。今晚我会试试看是否能解决问题。

标签: c# localization satellite-assembly resourcemanager


【解决方案1】:

按照http://support.microsoft.com/kb/839861 下提供的正确程序,应用程序现在按预期工作。

我所要做的就是将“预构建事件命令行”更改如下:

CD "$(ProjectDir)Resources"
FOR /D %%1 IN (*) DO (
    CD "%%1"
    resgen.exe "Strings.%%1.txt" "MyClassLibrary1.Resources.Strings.%%1.resources"     if %errorlevel% == 0 (
        al.exe /t:lib /embed:"MyClassLibrary1.Resources.Strings.%%1.resources" /culture:"%%1" /out:MyClassLibrary1.resources.dll
        if not exist "$(TargetDir)%%1" md "$(TargetDir)%%1"
        move /Y "MyClassLibrary1.resources.dll" "$(TargetDir)%%1"
    )
    CD ..
)

希望对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多