【问题标题】:localize VSTO addin according to the language of the office product根据办公产品的语言本地化 VSTO 插件
【发布时间】:2015-07-02 22:30:21
【问题描述】:

我正在开发一个 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 的实例以供以后使用。我可以把这个实例交给插件类,让它在上面调用IRibbonUI.Invalidate()。但这似乎有点奇怪 - 创建一个功能区只是为了在几微秒后使其无效。所以我想知道 - 并在这里询问 - 是否有更优雅的方式来根据办公产品的语言版本本地化 vsto 插件的功能区。

(我见过this similar question,但那里提供的方法by this answer 对我来说看起来更糟。)

【问题讨论】:

  • re:更糟糕的方法:你的意思是,当然是注册表查找,对吧?建议使用 CurrentUICulture 的答案对我来说很有意义。
  • @Ishmaeel 当然。另一个答案比我的问题更新。我刚刚编辑了那部分以使其清楚。我的第一次尝试(见问题)以及新答案和此处接受的答案都设置了 CurrentUICulture。它们的不同之处在于从哪里获取。

标签: .net localization vsto


【解决方案1】:

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

我之前覆盖了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 中。

【讨论】:

  • CreateRibbonExtensibilityObject 是从 ThisAddIn.Initialize 调用的(以及调用堆栈中的几个方法) - 它由 base.Initialize() 在设置 Application 的行之前触发。我看不出线程同步在这里有什么帮助。我在执行 ThisAddIn.Initialize 的同一个线程中。要到达设置 Application 的行(在生成的代码中,我不想触摸),我需要从 CreateRibbonExtensibilityObject 返回。
  • Fluent UI 中您使用的是 Ribbon Designer 还是 Ribbon XML?
  • 谢谢 - 也适用于我。您是否碰巧知道 GetHostItem() 上比 MSDN 页面更详细的任何文档?否则我会非常乐观地假设它的“Get”前缀是有希望的那样轻量级......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多