我正在开发VSTO插件,并希望根据办公产品的语言版本对其进行本地化。从理论上讲,这是怎么做的:
int lcid = Application.LanguageSettings.get_LanguageID(Office.MsoAppLanguageID.msoLanguageIDUI);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lcid);
为了实现这个目的,我当然需要初始化Application
。因此,我可以执行此代码的最早点是在Startup事件处理程序中。但是,此时已经调用了CreateRibbonExtensibilityObject()
,因此至少我的自定义功能区选项卡的标题将以Windows语言显示,这可能会有所不同。
在功能区类中,我有一个onLoad事件的处理程序,我在其中存储IRibbonUI
的实例供以后使用。我可以将此实例移交给addin类,并让它在其上调用IRibbonUI.Invalidate()
。但这似乎有点奇怪 - 创建一个功能区只是为了让它在几微秒后失效。所以我想知道 - 并在这里询问 - 是否有一种更优雅的方式来根据办公产品的语言版本本地化vsto插件的功能区。
(我见过this similar question,但那里提供的方法by this answer看起来更糟糕。)
答案 0 :(得分:9)
您始终可以覆盖CreateRibbonExtensibilityObject
方法,或者可能覆盖其他一些AddInBase
方法( BeginInit,Initialize等)以挂钩到正确的位置AddIn加载生命周期。
我之前已覆盖CreateRibbonExtensibilityObject
以确保在加载功能区之前运行初始化代码。我注意到CreateRibbonExtensibilityObject
和Startup
事件是随机触发的。有时Startup
首先发生 - 有时CreateRibbonExtensibilityObject
首先发生。我不得不手动同步这两个事件,以确保在创建功能区之前执行任何初始化代码。如果CreateRibbonExtensibilityObject
首先触发 - 尚未创建Application对象。
CreateRibbonExtensibility
: Outlook.Application app = this.GetHostItem<Outlook.Application>(typeof(Outlook.Application), "Application");
int lcid = app.LanguageSettings.get_LanguageID(Office.MsoAppLanguageID.msoLanguageIDUI);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lcid);
这将为您检索对Application
实例的引用 - 无论它是否已加载到Initialize
。