根据办公产品的语言本地化VSTO插件

时间:2011-12-15 17:00:53

标签: .net localization vsto

我正在开发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看起来更糟糕。)

1 个答案:

答案 0 :(得分:9)

您始终可以覆盖CreateRibbonExtensibilityObject方法,或者可能覆盖其他一些AddInBase方法( BeginInit,Initialize等)以挂钩到正确的位置AddIn加载生命周期。

我之前已覆盖CreateRibbonExtensibilityObject以确保在加载功能区之前运行初始化代码。我注意到CreateRibbonExtensibilityObjectStartup事件是随机触发的。有时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