问题标签 [resourcemanager]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 城堡单轨电车魔术
我正在从事的项目支持多种语言环境。该解决方案基于使用一些 Castle Monorail 机制。相应的控制器类标记如下:
[资源(“pageResx”,“...Controllers.Static”)]
其中 StaticTemplate 是 Controller 名称前缀,资源文件放置在 '..\Resources\Controllers\StaticTemplate*' 中。
另一方面,StatiController 继承自 BaseController 类,其标记如下:
[LocalizationFilter(RequestStore.Session, "locale")]
因此,用户的语言环境存储在会话中。就是这样。最后一步是 NVelocity vm-file,其中适当的资源如下所示:
$pageResx.Buttons_Download
这样,对于 locale='de' 的用户,ID = 'Buttons_Download' 的资源字符串取自文件 '..\Resources\Controllers\Static.de.resx'。
但是,项目中还有另一个地方进行本地化 - 构建电子邮件。在那里实现了以下逻辑:
给定参数的值,resourceString 被正确评估。但...
魔术师来了。有一个巴西语言环境的资源文件。它有后缀“pt-BR”。还有葡萄牙语区域设置,但没有适当的资源文件 - 没有“pt”文件。在查看页面方面,Monorail 从 pt-BR 文件为 pt-user 获取本地化资源。但是实现电子邮件构造的逻辑却没有做同样的事情。取而代之的是从“en”过去的基本资源中获取本地化字符串。
我阅读了有关映射资源的 .NET 机制(http://msdn.microsoft.com/en-us/library/sb6a8618.aspx)。但未能找到单轨铁路的描述。
问题是单轨列车(或任何人)如何将“pt”映射到“pt-BR”?我应该怎么做才能在外面实现相同的逻辑?
提前致谢
c# - 如何在不以编程方式引用的情况下读取附属程序集的全部内容?
当卫星组件的位置连同其文化信息一起给出时,我需要能够读取它的内容。所以,我不能在编译时添加对这个程序集的引用,我不会知道这个程序集的确切内容(我必须阅读整个内容)。有没有办法做到这一点?喜欢反射。我已经尝试过使用资源管理器,但我认为我无法使用它读取整个卫星程序集内容。
像下面这样的可能吗?
编辑:
我的要求就像“在给出位置和文化信息时向任何卫星程序集替换/添加新字符串”
谢谢,
.net - .NET WinForms 本地化 - 替换 ComponentResourceManager
在我当前的项目(.NET Windows 窗体应用程序)中,我要求 .NET Windows 窗体应该本地化,但本地化元素(只是翻译,而不是图像或控制位置)应该来自数据库,以便启用最终用户可以根据需要修改控件的可本地化属性(只是标题/文本)。为了让开发人员摆脱本地化问题的负担,对我来说最好的解决方案是在 VS 设计器中简单地将表单标记为可本地化。这会将所有可本地化的属性值放在表单 .resx 文件中。
现在我的问题是如何从数据库中提供翻译。表单被标记为可本地化的那一刻,VS 表单设计器将放置所有可以本地化的表单 .resx 文件。设计器还将修改标准的 Designer.cs InitializeComponent 方法,以便实例化 ComponentResourceManager,然后使用该资源管理器加载对象(控件和组件)的可本地化属性。
我已经看到人们建立了自己的方法来将本地化属性应用于 Form 及其控件的解决方案。我见过的所有解决方案通常归结为递归地遍历 Form 及其控件的 Controls 集合并应用翻译。不幸的是,.NET Forms 本地化并不是那么简单,这并不能涵盖所有场景,尤其是如果您有一些 3rd 方控件。例如:
我见过的所有解决方案都无法进行上述组件所需的翻译。
由于 VS 已经生成了在需要的地方提供翻译的代码,我理想的解决方案是以某种方式用我自己的派生类替换 ComponentResourceManager。如果我可以在 InitializeComponent 中替换以下行:
和
然后我可以毫无问题地解决其他所有问题。
不幸的是,我没有找到如何做这样的事情,所以我在这里问一个关于如何做的问题。
PS 我也会接受任何其他符合要求的本地化解决方案: 1. 无需重新部署应用程序就可以更改翻译 2. 开发人员在创建表单/用户控件时不应该关心翻译
谢谢你。
编辑:拉里提供了一本很好的参考书,其中的代码部分解决了我的问题。借助该帮助,我能够创建自己的组件,该组件替换 InitializeComponent 方法中的默认 ComponentResourceManager。这是一个名为 Localizer 的组件的代码,它用自定义的 MyResourceManager 替换了 ComponentResourceManager,以便其他人也可以从中受益:
.net - 在运行时添加附属程序集
我创建了一个可以在运行时切换文化的应用程序。但是现在我想在应用程序继续运行时向我的应用程序添加一个新的卫星程序集。我将特定的文化文件夹(例如af
,其中包含Localisation.resources.dll
文件的文件夹)复制到应用程序文件夹,然后运行以下代码:
但随后什么也没有发生,我一直看到旧文化,但没有显示添加的文化。只有当我停止并启动应用程序时,新的文化才会添加到组合框中。
是否可以在运行时添加卫星程序集?还是我总是必须重新启动应用程序?
c# - ResourceManager 回退到默认资源,而不是从附属程序集读取
我有以下三个项目的文件夹结构:
在 MyClassLibrary1 项目下:
MyClassLibrary1 的项目属性-> Pre-Build,我有以下内容:
在 MyAppExe 项目下的 Program.cs 中:
问题是,由于某种原因,ResourceManager 不断回退到默认资源文件(嵌入在 MyAppExe 中)。请帮助我理解我在这里做错了什么。
无论我尝试什么,我都会得到的输出是“Preschool”而不是“Playgroup”。就好像卫星组件根本没有得到解决。
asp.net - ASP.NET 读取资源值
我有两个.resx
文件:en.resx
和he.resx
,在文件夹中App_LocalResources
。我的网页中已经有两个按钮,单击每个按钮都应该“切换”到另一种语言的资源文件。
我想简单地获取位于其中一个.resx
文件中的字符串值。
Assembly
我尝试了一些我在 google 上找到的示例,我问自己,当我只想string
在自己的项目中请求一个值时,为什么我需要提供一个类型和一个命名空间?
为什么没有类似的东西:string val = Resources["en.resx"]["SomeProperty"].Value
?
也许我的整个方法是错误的,我想看看你的意见。
谢了,兄弟们
c# - 图片资源内存不足
我们注意到 Visual Studio c# 中的图像资源有一个奇怪的行为。
如果您将图像添加到项目资源并多次加载图像,您很快就会遇到内存不足的异常。
它只发生在某些系统上(在我测试的每一台 PC 上)。
复制:
- 创建 Windows 窗体项目
- 将图像添加到项目资源 (32x32 PNG)
- 创建一个包含 2000 个循环的 for 循环
在循环中将图像从资源填充到私有列表
/li>
每次运行循环时都会分配一些内存。在健康的系统上,您可以这样做,直到达到 2GB(32 位应用程序)。
但是在一个生病的系统上。该应用程序已经挂起 200MB。
非常值得注意的是,sik 系统分配的内存与健康系统不同。sik 系统在单次执行循环时只分配大约一半的内存。sik 系统为每个循环分配 50MB。健康系统分配 120MB。
这些系统都完全相同。Core I7、Windows7、12GB RAM、Visual Studio 2012。在 Windows8 上,每个测试系统都会出现内存泄漏。
有没有人注意到同样的奇怪行为?
visual-studio-2010 - C# 单程序集多语言应用程序 - 资源未正确加载
我正在开发一个简单的 C# .NET 4.0 应用程序,并希望将其本地化为多种语言。但是,为本地化创建的附属程序集(即 de/MyApp.resources.dll)会因为必须在这些 dll 及其文件夹周围拖动而破坏其简单性。
这就是为什么我寻找一种方法将这些 dll 包含到主(也是唯一的)程序集中,因此只需要将可执行文件发送给最终用户。我遇到了这个非常有希望的问题并试了一下。
在建议的解决方案中采用该类后,我在预构建命令中使用FART将 .Designer.cs 文件中的所有 ResourceManager 替换为 SingleAssemblyResourceManager:
然后我创建了一个批处理文件,如下所示:
并从构建后命令中调用它:
注意:在这种情况下,TargetName 和 ProjectName 相同。
成功构建它,但它没有按预期工作......表单应该以 InstalledUICulture 语言(如果可用)显示。为此,我在 InitializeComponent() 之前添加了这一行:
这在程序的“标准”版本中起到了作用。不再。然而!我还添加了一个小控件,通过 ComboBox 在运行时更改语言。代码如下:
这确实改变了表单语言。所以dll实际上包含在exe中。那么,为什么 InitializeComponent 不加载适当的资源呢?我检查了 Designer 代码,ResourceManager 已被 SingleAssemblyResourceManager 取代。
此外,除了表单按钮的文本之外,我还有每个语言的 strings.resx 文件,用于 MessageBoxes 和诸如此类的东西,而且这两种方式似乎都不起作用。但这可能是另一个问题。
我知道最初的解决方案是为 NET 2.0 环境设计的,并且 ResourceSets 已经过时,但我的理解是它应该可以工作,即使它不推荐。
任何关于我应该研究的地方的指针都会很棒。
c# - 我收到一个奇怪的 MissingManifestResourceException
我有几个项目的解决方案,一个主项目,一个全球化项目和一个测试项目。
当主项目中的代码从全球化项目的 Messages.de.resx 文件中检索消息时,一切正常。
但是当我将相同的代码复制到测试项目时,我得到一个 MissingManifestResourceException 告诉我没有找到指定或中性文化的资源:
System.Resources.MissingManifestResourceException ist aufgetreten。
消息=Für die angegebene Kultur oder die Neutele Kultur konnten keine Ressourcen gefunden werden。Stellen Sie sicher, dass EGR_IQone_Globalization.Messages.resources beim Kompilieren richtig in die Assembly EGR_IQone_Globalization eingebettet wurde, oder dass die erforderlichen Satellitenassembly geladen werden können und vollständig signiert sind。Source=mscorlib StackTrace:bei System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName) bei System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfoculture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) bei System.Resources.ResourceManager。 InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists,
通常,代码仅使用 .resx 文件即可工作,甚至使用 resgen 将其编译为 .resources 文件也不会改变任何内容。
我认为这可能与 ResourceManager 或指定的程序集有关,但我看不出来自主项目的调用和来自测试项目的调用之间有任何区别。
这是代码:
谢谢!
c# - 无法在 C# 应用程序中使用非本地化资源
如上一个问题所述,我有一组字符串资源,它们在程序的生命周期内不会改变,但只能通过对字符串列表的昂贵操作来获得:
为了提高性能,我使用 T4 生成了所需的字符串,它从文件中读取列表并输出资源文件Regex.restext
:
然后将此文件编译复制到构建后的目标目录:
但是当我尝试在静态构造函数中加载这些值时Patterns
:
我收到以下错误:
但这是一个文化中立的项目——资源仅用于存储。那么为什么我需要指定一种文化呢?我将如何/在哪里这样做?
如果我在加载资源时采用了错误的方法,那么更好的方法是什么?