локализуйте надстройку VSTO в соответствии с языком офисного продукта - PullRequest
5 голосов
/ 15 декабря 2011

Я разрабатываю надстройку VSTO и хочу, чтобы она была локализована в соответствии с языковой версией офисного продукта. По идее вот как это сделать:

int lcid = Application.LanguageSettings.get_LanguageID(Office.MsoAppLanguageID.msoLanguageIDUI);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lcid);

Чтобы это работало, мне нужно, конечно, инициализировать Application. Таким образом, самая ранняя точка, где я могу выполнить этот код, находится в обработчике события запуска. На данный момент, однако, CreateRibbonExtensibilityObject() уже был вызван, поэтому, по крайней мере, заголовок моей пользовательской вкладки ленты будет отображаться на языке Windows, который может отличаться. В классе ленты у меня есть обработчик для события onLoad, где я храню экземпляр IRibbonUI для дальнейшего использования. Я мог бы передать этот экземпляр классу надстройки и позволить ему вызывать IRibbonUI.Invalidate(). Но это кажется немного странным - создание ленты только для того, чтобы сделать ее недействительной пару микросекунд спустя. Поэтому я задаюсь вопросом - и спрашиваю здесь - существует ли более элегантный способ локализовать ленту надстройки vsto в соответствии с языковой версией офисного продукта.

(я видел этот похожий вопрос , но подход, предложенный там этим ответом , выглядит для меня еще хуже.)

1 Ответ

9 голосов
/ 15 декабря 2011

Вы всегда можете переопределить метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...