是否有关于如何组织非字符串资源以进行 .net 应用程序本地化的指南?
假设
My.dll
- Resources
- MyResources.resx
embeds MyFile.ext with key MyFile
- MyResources.de.resx
should embed MyFile.de.ext with key MyFile
我尝试过使用搜索引擎但无济于事。
我发现除非两个 resx 文件位于同一文件夹中,否则整个文化切换机制由于某种原因无法工作。因此,我的想法是建立一个名为 de
的子文件夹,其中包含 resX 和所有链接的资源。
My.dll
- Resources
- MyResources.resx
- MyResources.de.resx
- en-US
- all en-US non-string resources
- de
- all de non-string resources
对于 de
版本,我复制粘贴中性 (en-US
) 版本。然后,我必须手动删除 en-US
[Res],添加 de
[Res],然后为每个非字符串资源(例如图像、csv 或其他文件)重命名)
这是应该这样做的吗?
Assume
My.dll
- Resources
- MyResources.resx
embeds MyFile.ext with key MyFile
- MyResources.de.resx
should embed MyFile.de.ext with key MyFile
I've tried using search engines but to no avail.
I find that unless both resx files are in the same folder, the whole culture switching mechanism doesn't work for some reason. So that killed my idea to have a subfolder called de
containing the resX and all linked resources.
My.dll
- Resources
- MyResources.resx
- MyResources.de.resx
- en-US
- all en-US non-string resources
- de
- all de non-string resources
For the de
version, I copy-paste the neutral (en-US
) version. I then have to manually delete the en-US
[Res], add de
[Res] and then rename for each non-string resource (e.g. images,csv or other files)
Is this how it is supposed to be done ?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是正确的。这是因为当您将 .RESX 文件移动到其他文件夹时,VS 自动生成 .resx 生成的类的命名空间名称作为 .RESX 文件的完整路径。即,如果 LocResources.resx 位于 $PROJECT$\MyResources\de\ 文件夹中,则自动生成的类完整类型名称将为 $PROJECT_BASE_NAMESPACE$.MyResources.de.LocResources。
关键 1 是每个 .RESX 的嵌入资源名称将等于其代码隐藏类型全名 + '.resources'。
关键 2 是,使用基于附属程序集(默认)的本地化,ResourceManager 通过其(静态)全名加载资源,但针对每种语言从不同的附属程序集加载资源。
因此,如果将 xxx.de.resx 移出存储所有 .RESX 的文件夹,则该资源的命名空间(和嵌入资源名称)将被更改,并且 ResourceManager 将无法在附属程序集中找到它。
That's correct. That's because when you move the .RESX file into other folder VS auto-generates namespace name for .resx`s generated class as full path to the .RESX file. I.e. if LocResources.resx is in $PROJECT$\MyResources\de\ folder then the auto-generated class full type name would be $PROJECT_BASE_NAMESPACE$.MyResources.de.LocResources.
The key 1 here is that embedded resource name for every .RESX will be equal its code-behind type full name + '.resources'.
The key 2 here is that using localization based on satellite assemblies (default), ResourceManager loads resources by its (static) full name but from different satellite assemblies for every language.
So if you move xxx.de.resx out of folder where all .RESX are stored, namespace (and embedded resource name) for this resource will be changed and ResourceManager won`t find it in the satellite assembly.