【发布时间】:2011-02-16 08:54:48
【问题描述】:
我正在使用 .NET 4.0 WPF 功能区并正在寻找一种方法来本地化功能区上下文菜单字符串。默认情况下,右键单击功能区会显示“最小化功能区”等项目。我想将这些字符串本地化,例如显示“Multifunktionsleiste verbergen”。
我该怎么做?这可能吗?
【问题讨论】:
标签: wpf visual-studio-2010 .net-4.0 ribbon
我正在使用 .NET 4.0 WPF 功能区并正在寻找一种方法来本地化功能区上下文菜单字符串。默认情况下,右键单击功能区会显示“最小化功能区”等项目。我想将这些字符串本地化,例如显示“Multifunktionsleiste verbergen”。
我该怎么做?这可能吗?
【问题讨论】:
标签: wpf visual-studio-2010 .net-4.0 ribbon
对 userxyz 解决方案的(希望)完整扩展:
FieldInfo pi;
pi = typeof(Microsoft.Windows.Controls.Ribbon.RibbonContextMenu).GetField("AddToQATText", (BindingFlags.NonPublic | BindingFlags.Static));
pi.SetValue(null, "RibbonContext_AddToQATText");
pi = typeof(Microsoft.Windows.Controls.Ribbon.RibbonContextMenu).GetField("RemoveFromQATText", (BindingFlags.NonPublic | BindingFlags.Static));
pi.SetValue(null, "RibbonContext_RemoveFromQATText");
pi = typeof(Microsoft.Windows.Controls.Ribbon.RibbonContextMenu).GetField("ShowQATAboveText", (BindingFlags.NonPublic | BindingFlags.Static));
pi.SetValue(null, "RibbonContext_ShowQATAboveText");
pi = typeof(Microsoft.Windows.Controls.Ribbon.RibbonContextMenu).GetField("ShowQATBelowText", (BindingFlags.NonPublic | BindingFlags.Static));
pi.SetValue(null, "RibbonContext_ShowQATBelowText");
pi = typeof(Microsoft.Windows.Controls.Ribbon.RibbonContextMenu).GetField("MaximizeTheRibbonText", (BindingFlags.NonPublic | BindingFlags.Static));
pi.SetValue(null, "RibbonContext_MaximizeTheRibbonText");
pi = typeof(Microsoft.Windows.Controls.Ribbon.RibbonContextMenu).GetField("MinimizeTheRibbonText", (BindingFlags.NonPublic | BindingFlags.Static));
pi.SetValue(null, "RibbonContext_MinimizeTheRibbonText");
【讨论】:
我不确定,但由于功能区库定义了 ResourcesManager,所以如果不从源代码重新编译库(如果我不正确,那么这里会很棒)是不可能的
new ResourceManager("ExceptionStringTable", typeof(SR).Assembly);
如果您要更改源,这些文本将存储在名为 ExceptionStringTable.txt 的资源文件中。
字符串的标识符是:
库的源代码可以从here 下载。在 RibbonControlsLibrary\Resources\ 中可以找到 Ribbon 资源的实现。
【讨论】:
另一种方法是通过反射替换值:
FieldInfo pi = typeof(Microsoft.Windows.Controls.Ribbon.RibbonContextMenu).GetField("AddToQATText", (BindingFlags.NonPublic | BindingFlags.Static));
pi.SetValue(null, "Localized text");
此代码必须在第一次使用功能区控件(通常是主窗口的 InitializeComponent)之前执行
【讨论】:
我想根据之前的讨论提出另一种解决方案:
var ribbonResourceManager = new RibbonResourceManager();
var translatorType = typeof(RibbonContextMenu)
.Assembly.GetType("Microsoft.Windows.Controls.SR");
var resourceManagerField = translatorType.GetField("_resourceManager",
BindingFlags.NonPublic | BindingFlags.Static);
resourceManagerField.SetValue(null, ribbonResourceManager);
其中RibbonReourceManager 是基本 ResourceManager 的继承者,具有重写的 GetString 方法。 RibbonResourceManager 应该返回下面列出的所有字符串:
【讨论】: