在我开发的应用程序中,同一个软件包服务于许多行业,而这些行业对本质上相同的东西有不同的词汇。该应用程序是一个C#服务器,WPF桌面应用程序向它发出基于套接字的XML请求。
例如,有些客户可能将某个东西称为"Item",有些客户称之为"Part",或者有些客户称其为"SKU"。
目标是让应用程序能够根据我们为用户创建的"词汇"设置重新标记自己。通常,给定客户的词汇表在整个应用程序中可能只相差5-25个单词/短语。这些自定义词汇表是特定于客户/由客户创建的,不会与主要的应用程序分发一起保留。
我最初的想法是使用自定义CultureInfo(例如,"Acme"公司的"en-AC")来实现这一点,在该资源文件中只提供与基本en-US不同的值。
en-AC.resx资源可以保存在服务器上,由服务器加载,也可以传输以加载到WPF客户端应用程序中。
到目前为止,问题似乎是ResourceManager没有正确地为自定义区域性选择字符串,就像这个线程一样,我还没能解决这个问题。此外,由于应用程序是ClickOnce部署的,我们可能没有注册新文化的权限。
由于要修改的短语数量很少,我的下一个想法是在运行时替换资源值,但四处搜索似乎也有点"不"。
因此,我想向社区征求他们对如何处理这一问题的建议。
对建议和想法持开放态度。。。
因为这只是几个单词,我想我会通过命名约定来完成。假设您定义了字符串关键字"MyCompany"。您通常通过以下方式访问:
string myString1 = Properties.Resource.MyCompany;
但也可以通过这种方式访问:
string myString2 = Properties.Resource.ResourceManager.GetString ("MyCompany")
它完全相同(但将字符串作为标识符处理——这在一定程度上容易出错)。你现在可以做的是首先检查一个特殊的名称,你合成为"MyCompany_AC"。缺点是每个字符串都需要自己的包装器:
string MyCompany
{
get
{
string myString = Properties.Resource.ResourceManager.GetString ("MyCompany_" + theCompanyPostfix);
if (myString == null)
{
myString = Properties.Resource.ResourceManager.GetString ("MyCompany");
}
return myString;
}
}