按钮工具提示未本地化

本文关键字:本地化 工具提示 按钮 | 更新日期: 2023-09-27 17:56:57

我有一个扩展的按钮类,如下所示;

class ExtendedButton : Button
{
    private ToolTip _tooltip = new ToolTip();
    public ExtendedButton()
    {
        _tooltip.SetToolTip(this, StringResources.MyLocalizedTooltipString);
    }
}

在上面的代码中,'StringResources.MyLocalizedTooltipString' 包含各种语言的字符串。但是当我更改线程区域性时,工具提示文本不会更改。如何实现?任何帮助将不胜感激。

按钮工具提示未本地化

很正常。 SetToolTip方法接受字符串,它将在调用SetToolTip时显示基于当前区域性从资源中提取的文本,并且在运行时更改区域性不会对其产生任何影响。因此,由于设置工具提示是在按钮的构造函数中执行的,因此将使用当时的线程区域性。

如果希望工具提示自动动态使用当前区域性,则可以将虚拟文本设置为工具提示(以启用工具提示),然后处理工具提示Popup事件,请将本地化值分配给工具提示:

class ExtendedButton : Button
{
    private ToolTip _tooltip = new ToolTip();
    public ExtendedButton()
    {
        _tooltip.Popup += new PopupEventHandler(_tooltip_Popup);
        _tooltip.SetToolTip(this, "DUMMYTEXT");
    }
    void _tooltip_Popup(object sender, PopupEventArgs e)
    {
        if (_tooltip.GetToolTip(this) != StringResources.MyLocalizedTooltipString)
            _tooltip.SetToolTip(this, StringResources.MyLocalizedTooltipString);
    }
}

注意:如果您的目标不是使工具提示动态本地化,并且您只需要可本地化的工具提示,FormLocalizable属性的工作方式,请转到ExtendedButton组件的设计器Localizable将属性设置为true,然后对不同的 clture 使用不同的工具提示文本。

但请记住,在创建组件后,不能在运行时以双重方式更改该值。

下面是一个示例:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fa-IR");
var f = new Form();
f.Controls.Add(new ExtendedButton());
f.Show();

若要全面设置区域性,需要设置当前线程的CurrentCultureCurrentUICulture,如果要在应用程序中创建任何新线程,则DefaultThreadCurrentCultureDefaultThreadCurrentUICulture

例如:

var frenchCulture = new CultureInfo("fr-FR");
Thread.CurrentThread.CurrentCulture = frenchCulture;
Thread.CurrentThread.CurrentUICulture = frenchCulture;
CultureInfo.DefaultThreadCurrentCulture = frenchCulture;
CultureInfo.DefaultThreadCurrentUICulture = frenchCulture;

这应该在程序的 Main 方法中完成,在加载任何窗体之前和调用Application.Run之前。

从 MSDN,关于设置默认线程 UI 区域性:

除非显式设置,否则 DefaultThreadCurrentUICulture 属性的值为 null,并且应用程序域中尚未分配显式区域性的所有线程的当前区域性由默认的 Windows 系统区域性定义。