【问题标题】:Localize Office add-in based on Office language pack in use rather than Windows' current language根据正在使用的 Office 语言包而不是 Windows 的当前语言本地化 Office 加载项
【发布时间】:2011-11-04 17:48:04
【问题描述】:
我正在尝试本地化我的 office 插件,我已经阅读了许多有关如何执行此操作的文档和教程,但它们都教如何根据当前的 Windows 语言进行本地化,而不一定是什么办公语言界面包正在使用中。
所以我的 Windows 语言是法语,我没有任何 Office 语言界面包,因此我在 Office 中的所有菜单都是英语的,除了我的加载项是法语的。它看起来有点奇怪,所以我想知道是否有一种方法可以根据当前使用的办公语言界面包进行本地化。
【问题讨论】:
标签:
c#
localization
outlook
ms-office
office-addins
【解决方案1】:
我发现Thread.CurrentThread.CurrentCulture的值对应我的系统文化,Thread.CurrentThread.CurrentUICulture的值对应Office UI。
所以我只是在加载项启动时将一个分配给另一个。似乎有效。
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
【解决方案2】:
这是我解决此问题的方法。我基本上阅读了 Ron 建议的注册表项,并将文化强制转换为已安装的语言文化。我只支持 Office 2007 和 Office 2010。很糟糕,我们必须查看每个 office 版本的 CU 和 LM 注册表项,并且没有单个内部变量将我们指向正确的注册表路径。解决方法如下:
int languageCode = 1033; //Default to english
const string keyEntry = "UILanguage";
if (IsOutlook2010)
{
const string reg = @"Software\Microsoft\Office\14.0\Common\LanguageResources";
try
{
RegistryKey k = Registry.CurrentUser.OpenSubKey(reg);
if (k != null && k.GetValue(keyEntry) != null) languageCode = (int)k.GetValue(keyEntry);
} catch { }
try
{
RegistryKey k = Registry.LocalMachine.OpenSubKey(reg);
if (k != null && k.GetValue(keyEntry) != null) languageCode = (int)k.GetValue(keyEntry);
} catch { }
}
else
{
const string reg = @"Software\Microsoft\Office\12.0\Common\LanguageResources";
try
{
RegistryKey k = Registry.CurrentUser.OpenSubKey(reg);
if (k != null && k.GetValue(keyEntry) != null) languageCode = (int)k.GetValue(keyEntry);
} catch { }
try
{
RegistryKey k = Registry.LocalMachine.OpenSubKey(reg);
if (k != null && k.GetValue(keyEntry) != null) languageCode = (int)k.GetValue(keyEntry);
} catch { }
}
Resource1.Culture = new CultureInfo(languageCode);
Resource1 是我的资源字典,culture 参数强制所有字符串在使用时都被该文化覆盖。