【问题标题】:Load Resources ".resx" from folder in Silverlight从 Silverlight 中的文件夹加载资源“.resx”
【发布时间】:2011-04-09 14:41:45
【问题描述】:

我有一个多语言应用程序,客户想按照自己的意愿编辑 Resources.resx 文件。 我创建了 silverlight 项目并添加了一些文件:

  1. Resources.resx
  2. Resources.en-US.resx1.
  3. Resources.uk-UA.resx2.

他们都有构建动作“嵌入式资源”

一切正常,但这些文件已嵌入到 XAP 文件中。客户无法编辑它们。

我的资源管理器是这样的:

   private static ResourceManager manager;
        public static ResourceManager Manager
        {
            get
            {
                if (manager == null)
                    manager =  new ResourceManager("Project.Resources", Assembly.GetExecutingAssembly());
                return manager;
            }
        }

我怎样才能从某个文件夹中获取这些资源而不是将它们构建到 .xap 文件中???

【问题讨论】:

  • 或许,将资源类型改为 Resource 而不是 Embedded Resource?
  • 然后我有错误:找不到任何适合指定文化或中性文化的资源。确保“Infopulse.MSEA.BPSurvey.TypesEditor.Resources.TypesEditorResources.resources”在编译时正确嵌入或链接到程序集“TypesEditor”中,或者所有所需的附属程序集都是可加载和完全签名的
  • 这些资源仅用于本地化字符串,还是其中也包含其他资源类型?
  • 只有字符串!字幕、标签等

标签: c# .net wpf silverlight resources


【解决方案1】:

由于这只是一个字符串本地化问题,并且您只想灵活地选择一整套本地化内容,因此有几种方法可以将您的字符串绑定到资源管理器。 其中大多数都过于复杂,无法达到预期的效果:

鉴于以下情况:

  • 我见过的大多数解决方案都需要一个大约 80 个字符长的绑定语句每个条目。这包括无止境的巧妙使用转换器。
  • 我见过的大多数解决方案都将每个字符串都实现为通知属性(这对于几乎不会更改的字符串来说似乎是一个巨大的开销)。
  • 本地化通常不需要即时更新(您可以随时刷新当前页面)。

更简单的方法是将字符串作为名称值对简单地放置在全局 App 字典中,并通过短/简单的 StaticResource 绑定来引用它们,例如

Text={StaticResource L_MenuHome}

剩下的问题就是如何将另一组语言字符串放入 App 字典中(这实际上很容易):

  • 将默认语言字符串直接放入 App.xaml(这有助于开发,因为缺少键会导致异常)。
  • 通过任何方便的方式(XML 文件、XAML 文件、CSV 或通过 Web 服务从数据库中)从您的服务器中提取任何新选择的语言
  • 用新加载的数据替换字典条目。您唯一需要做的就是确保密钥已经存在,或者您必须添加一个条目或设置一个条目。
  • 重新加载当前页面(更改语言后将它们带回主页?)

我不知道为什么每个人似乎都喜欢真正复杂的解决方案,而 StaticResources 做得很好,而且工作量少得多。我们还倾向于使用 Web 服务从数据库中获取一组语言字符串,因为它通常小于 200K,并且数据库在更新方面更加灵活。

无论如何,只是试图将一些常识重新用于本地化。它对我们有用。随意使用、忽略、提出改进建议等。

希望这会有所帮助。

【讨论】:

  • @Hi Tech:感谢您的想法。我目前将所有字符串存储在本地隔离存储数据库中(从服务器下载)。我的老板想要做的一件事是记下所有未翻译的语言字符串 - 因此,当我正常处理 UI 时,如果找不到它,它会调用翻译它它需要本地化。我目前使用转换器执行此操作 - 在每个字符串上它调用一个方法,如果它不存在,它会标记它。你能想到如何使用静态资源并标记尚未翻译的字符串吗?谢谢
  • 实际上 - 您能否详细说明如何将语言字符串加载到 App.xaml 中?我目前使用一个转换器,它调用一个在我的字典对象中查找字符串的方法 - 问题是我无法判断它是否已经被转换。
  • @Rodney:我们仅在启动时加载本地化(进入全局应用字典)。为了准备我们的数据库,我们采用相反的方法:为了确定存在哪些要本地化的字符串,我们分别扫描项目中的所有 XAML 文件,并将任何缺失的条目添加到我们的“开发英语”语言表中。我们所说的“开发英语”是我们的起点(编码人员在 XAML 中放入的内容)。我们假设真正的英语将由商业人士从“开发英语”翻译出来......不能相信编码人员知道营销需求:)
  • 有趣 - 你如何进行扫描是最重要的部分 - 这是自动的还是手动的?我还没有找到一个好的 XAML 扫描工具来提取字符串(这会让我的生活变得更轻松!)
  • @Rodney:它是自动化的(手动扫描我们的 100 多个 XAML 文件不是我喜欢的任务:))。 XAML 毕竟只是 XML,所以我们编写了一个 XML 解析器(使用 XmlDocument 和 XpathNavigators)对文档进行递归扫描并查找所有字符串文字。
【解决方案2】:

您可以尝试下载适当的文件并将其存储在您的隔离存储中,然后尝试从那里读取它。您可以在应用程序启动时执行此操作

由于您的 resx 中只有字符串,我建议您将资源项复制为具有某种预定义格式的简单文本并从那里读取。如果您需要有关任何具体实施细节的帮助,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2013-03-22
    • 2014-12-27
    相关资源
    最近更新 更多