我正在开发VSTO插件,并希望根据Office产品的语言版本对其进行本地化。从理论上讲,这就是方法:
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中提供的方法对我来说似乎更糟。)
最佳答案
您始终可以覆盖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
中。