| Tak WPFToolkit Extended ve verzi 1.5.0.0 má fungující použitelnou logiku na lokalizaci v propertygridu. Podle příkladu, který jste poskytl to funguje. aby to nemusely jiní hledat: PropertyDescriptor: 
Public Class clsGlobaizedPropertyDescriptor
    Inherits PropertyDescriptor
    Private basePropertyDescriptor As PropertyDescriptor
    Private localizedName As String = ""
    Private localizedDescription As String = ""
    ''' <summary>
    ''' Initializes a new instance of the <see cref="clsGlobaizedPropertyDescriptor" /> class.
    ''' </summary>
    ''' <param name="basePropertyDescriptor">The base property descriptor.</param>
    Public Sub New(ByVal basePropertyDescriptor As PropertyDescriptor)
        MyBase.New(basePropertyDescriptor)
        Me.basePropertyDescriptor = basePropertyDescriptor
    End Sub
    ''' <summary>
    ''' Gets the name of the member.
    ''' </summary>
    ''' <returns>The name of the member.</returns>
    Public Overrides ReadOnly Property Name As String
        Get
            Return Me.basePropertyDescriptor.Name
        End Get
    End Property
    ''' <summary>
    ''' Gets the name that can be displayed in a window, such as a Properties window.
    ''' </summary>
    ''' <returns>The name to display for the member.</returns>
    Public Overrides ReadOnly Property DisplayName As String
        Get
            Dim _tableName As String = ""
            Dim _displayName As String = ""
            For Each oAttrib In Me.basePropertyDescriptor.Attributes
                If (oAttrib.GetType().Equals(GetType(clsGlobalizedPropertyAttribute))) Then
                    _displayName = DirectCast(oAttrib, clsGlobalizedPropertyAttribute).Name
                    _tableName = DirectCast(oAttrib, clsGlobalizedPropertyAttribute).Table
                End If
            Next
            'Pokud neexistuje tabulka s resource uvedená v attributu, pak sestaví vlastní název tanulky jako namecpace a class name
            If _tableName.Length = 0 Then _
                _tableName = Me.basePropertyDescriptor.ComponentType.Namespace & "." & Me.basePropertyDescriptor.ComponentType.Name
            'Pokud neexistuje zápis displaname v tabulce resources, pak se použije defaultní
            If _displayName.Length = 0 Then _
                _displayName = Me.basePropertyDescriptor.DisplayName
            'nyní použijeme název tabulky a displayName k přístupu do resources
            Dim rm As ResourceManager = New ResourceManager(_tableName, Me.basePropertyDescriptor.ComponentType.Assembly)
            'vrátí string
            Dim s As String = rm.GetString(_displayName)
            'Pokud není string v tabulce použije se název z basepropertydescriptor
            Return DirectCast(IIf((s Is Nothing), Me.basePropertyDescriptor.Name, s), String)
        End Get
    End Property
    ''' <summary>
    ''' Gets the description of the member, as specified in the <see cref="T:System.ComponentModel.DescriptionAttribute" />.
    ''' </summary>
    ''' <returns>The description of the member. If there is no <see cref="T:System.ComponentModel.DescriptionAttribute" />, the property value is set to the default, which is an empty string ("").</returns>
    Public Overrides ReadOnly Property Description As String
        Get
            Dim _tableName As String = ""
            Dim _descriptionName As String = ""
            For Each oAttrib In Me.basePropertyDescriptor.Attributes
                If (oAttrib.GetType().Equals(GetType(clsGlobalizedPropertyAttribute))) Then
                    _descriptionName = DirectCast(oAttrib, clsGlobalizedPropertyAttribute).Description
                    _tableName = DirectCast(oAttrib, clsGlobalizedPropertyAttribute).Table
                End If
            Next
            'Pokud neexistuje tabulka s resource uvedená v attributu, pak sestaví vlastní název tanulky jako namecpace a class name
            If _tableName.Length = 0 Then _
                _tableName = Me.basePropertyDescriptor.ComponentType.Namespace & "." & Me.basePropertyDescriptor.ComponentType.Name
            'Pokud neexistuje zápis displaname v tabulce resources, pak se použije defaultní
            If _descriptionName.Length = 0 Then _
                _descriptionName = Me.basePropertyDescriptor.DisplayName
            'nyní použijeme název tabulky a displayName k přístupu do resources
            Dim rm As ResourceManager = New ResourceManager(_tableName, Me.basePropertyDescriptor.ComponentType.Assembly)
            'vrátí string
            Dim s As String = rm.GetString(_descriptionName)
            'Pokud není string v tabulce použije se název z basepropertydescriptor
            Return DirectCast(IIf((s Is Nothing), Me.basePropertyDescriptor.DisplayName, s), String)
        End Get
    End Property
    ''' <summary>
    ''' When overridden in a derived class, returns whether resetting an object changes its value.
    ''' </summary>
    ''' <param name="component">The component to test for reset capability.</param><returns>
    ''' true if resetting the component changes its value; otherwise, false.
    ''' </returns>
    Public Overrides Function CanResetValue(ByVal component As Object) As Boolean
        Return Me.basePropertyDescriptor.CanResetValue(component)
    End Function
    ''' <summary>
    ''' When overridden in a derived class, gets the type of the component this property is bound to.
    ''' </summary>
    ''' <returns>A <see cref="T:System.Type" /> that represents the type of component this property is bound to. When the <see cref="M:System.ComponentModel.PropertyDescriptor.GetValue(System.Object)" /> or <see cref="M:System.ComponentModel.PropertyDescriptor.SetValue(System.Object,System.Object)" /> methods are invoked, the object specified might be an instance of this type.</returns>
    Public Overrides ReadOnly Property ComponentType As System.Type
        Get
            Return Me.basePropertyDescriptor.ComponentType
        End Get
    End Property
    ''' <summary>
    ''' When overridden in a derived class, gets the current value of the property on a component.
    ''' </summary>
    ''' <param name="component">The component with the property for which to retrieve the value.</param><returns>
    ''' The value of a property for a given component.
    ''' </returns>
    Public Overrides Function GetValue(ByVal component As Object) As Object
        Return Me.basePropertyDescriptor.GetValue(component)
    End Function
    ''' <summary>
    ''' When overridden in a derived class, gets a value indicating whether this property is read-only.
    ''' </summary>
    ''' <returns>true if the property is read-only; otherwise, false.</returns>
    Public Overrides ReadOnly Property IsReadOnly As Boolean
        Get
            Return Me.basePropertyDescriptor.IsReadOnly
        End Get
    End Property
    ''' <summary>
    ''' When overridden in a derived class, gets the type of the property.
    ''' </summary>
    ''' <returns>A <see cref="T:System.Type" /> that represents the type of the property.</returns>
    Public Overrides ReadOnly Property PropertyType As System.Type
        Get
            Return Me.basePropertyDescriptor.PropertyType
        End Get
    End Property
    ''' <summary>
    ''' When overridden in a derived class, resets the value for this property of the component to the default value.
    ''' </summary>
    ''' <param name="component">The component with the property value that is to be reset to the default value.</param>
    Public Overrides Sub ResetValue(ByVal component As Object)
        Me.basePropertyDescriptor.ResetValue(component)
    End Sub
    ''' <summary>
    ''' When overridden in a derived class, sets the value of the component to a different value.
    ''' </summary>
    ''' <param name="component">The component with the property value that is to be set.</param>
    ''' <param name="value">The new value.</param>
    Public Overrides Sub SetValue(ByVal component As Object, ByVal value As Object)
        Me.basePropertyDescriptor.SetValue(component, value)
    End Sub
    ''' <summary>
    ''' When overridden in a derived class, determines a value indicating whether the value of this property needs to be persisted.
    ''' </summary>
    ''' <param name="component">The component with the property to be examined for persistence.</param><returns>
    ''' true if the property should be persisted; otherwise, false.
    ''' </returns>
    Public Overrides Function ShouldSerializeValue(ByVal component As Object) As Boolean
        Return Me.basePropertyDescriptor.ShouldSerializeValue(component)
    End Function
End Class
Localized Object BaseClass 
Public Class clsGlobalizedObject
    Implements ICustomTypeDescriptor
    Private globalizedProps As PropertyDescriptorCollection
    ''' <summary>
    ''' Returns a collection of custom attributes for this instance of a component.
    ''' </summary><returns>
    ''' An <see cref="T:System.ComponentModel.AttributeCollection" /> containing the attributes for this object.
    ''' </returns>
    Public Function GetAttributes() As System.ComponentModel.AttributeCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetAttributes
        Return TypeDescriptor.GetAttributes(Me, True)
    End Function
    ''' <summary>
    ''' Returns the class name of this instance of a component.
    ''' </summary><returns>
    ''' The class name of the object, or null if the class does not have a name.
    ''' </returns>
    Public Function GetClassName() As String Implements System.ComponentModel.ICustomTypeDescriptor.GetClassName
        Return TypeDescriptor.GetClassName(Me, True)
    End Function
    ''' <summary>
    ''' Returns the name of this instance of a component.
    ''' </summary><returns>
    ''' The name of the object, or null if the object does not have a name.
    ''' </returns>
    Public Function GetComponentName() As String Implements System.ComponentModel.ICustomTypeDescriptor.GetComponentName
        Return TypeDescriptor.GetComponentName(Me, True)
    End Function
    ''' <summary>
    ''' Returns a type converter for this instance of a component.
    ''' </summary><returns>
    ''' A <see cref="T:System.ComponentModel.TypeConverter" /> that is the converter for this object, or null if there is no <see cref="T:System.ComponentModel.TypeConverter" /> for this object.
    ''' </returns>
    Public Function GetConverter() As System.ComponentModel.TypeConverter Implements System.ComponentModel.ICustomTypeDescriptor.GetConverter
        Return TypeDescriptor.GetConverter(Me, True)
    End Function
    ''' <summary>
    ''' Returns the default event for this instance of a component.
    ''' </summary><returns>
    ''' An <see cref="T:System.ComponentModel.EventDescriptor" /> that represents the default event for this object, or null if this object does not have events.
    ''' </returns>
    Public Function GetDefaultEvent() As System.ComponentModel.EventDescriptor Implements System.ComponentModel.ICustomTypeDescriptor.GetDefaultEvent
        Return TypeDescriptor.GetDefaultEvent(Me, True)
    End Function
    ''' <summary>
    ''' Returns the default property for this instance of a component.
    ''' </summary><returns>
    ''' A <see cref="T:System.ComponentModel.PropertyDescriptor" /> that represents the default property for this object, or null if this object does not have properties.
    ''' </returns>
    Public Function GetDefaultProperty() As System.ComponentModel.PropertyDescriptor Implements System.ComponentModel.ICustomTypeDescriptor.GetDefaultProperty
        Return TypeDescriptor.GetDefaultProperty(Me, True)
    End Function
    ''' <summary>
    ''' Returns an editor of the specified type for this instance of a component.
    ''' </summary>
    ''' <param name="editorBaseType">A <see cref="T:System.Type" /> that represents the editor for this object.</param><returns>
    ''' An <see cref="T:System.Object" /> of the specified type that is the editor for this object, or null if the editor cannot be found.
    ''' </returns>
    Public Function GetEditor(ByVal editorBaseType As System.Type) As Object Implements System.ComponentModel.ICustomTypeDescriptor.GetEditor
        Return TypeDescriptor.GetEditor(Me, editorBaseType, True)
    End Function
    ''' <summary>
    ''' Returns the events for this instance of a component.
    ''' </summary><returns>
    ''' An <see cref="T:System.ComponentModel.EventDescriptorCollection" /> that represents the events for this component instance.
    ''' </returns>
    Public Function GetEvents() As System.ComponentModel.EventDescriptorCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetEvents
        Return TypeDescriptor.GetEvents(Me, True)
    End Function
    ''' <summary>
    ''' Returns the events for this instance of a component using the specified attribute array as a filter.
    ''' </summary>
    ''' <param name="attributes">An array of type <see cref="T:System.Attribute" /> that is used as a filter.</param><returns>
    ''' An <see cref="T:System.ComponentModel.EventDescriptorCollection" /> that represents the filtered events for this component instance.
    ''' </returns>
    Public Function GetEvents(ByVal attributes() As System.Attribute) As System.ComponentModel.EventDescriptorCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetEvents
        Return TypeDescriptor.GetEvents(Me, attributes, True)
    End Function
    ''' <summary>
    ''' Returns the properties for this instance of a component.
    ''' </summary><returns>
    ''' A <see cref="T:System.ComponentModel.PropertyDescriptorCollection" /> that represents the properties for this component instance.
    ''' </returns>
    Public Function GetProperties() As System.ComponentModel.PropertyDescriptorCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetProperties
        If Me.globalizedProps Is Nothing Then
            Dim baseProps As PropertyDescriptorCollection = TypeDescriptor.GetProperties(Me, True)
            Me.globalizedProps = New PropertyDescriptorCollection(Nothing)
            For Each oProp As PropertyDescriptor In baseProps
                Me.globalizedProps.Add(New clsGlobaizedPropertyDescriptor(oProp))
            Next
        End If
        Return Me.globalizedProps
    End Function
    ''' <summary>
    ''' Returns the properties for this instance of a component using the attribute array as a filter.
    ''' </summary>
    ''' <param name="attributes">An array of type <see cref="T:System.Attribute" /> that is used as a filter.</param><returns>
    ''' A <see cref="T:System.ComponentModel.PropertyDescriptorCollection" /> that represents the filtered properties for this component instance.
    ''' </returns>
    Public Function GetProperties(ByVal attributes() As System.Attribute) As System.ComponentModel.PropertyDescriptorCollection Implements System.ComponentModel.ICustomTypeDescriptor.GetProperties
        If (globalizedProps Is Nothing) Then
            'Získá kolekci všech properties
            Dim baseProps As PropertyDescriptorCollection = TypeDescriptor.GetProperties(Me, attributes, True)
            'vytvoření instance kolekce vlastností
            Me.globalizedProps = New PropertyDescriptorCollection(Nothing)
            'vytvoření kolekce globalizovaných propertydescriptors z původmních vlastností
            For Each oProp As PropertyDescriptor In baseProps
                Me.globalizedProps.Add(New clsGlobaizedPropertyDescriptor(oProp))
            Next
        End If
        Return Me.globalizedProps
    End Function
    ''' <summary>
    ''' Returns an object that contains the property described by the specified property descriptor.
    ''' </summary>
    ''' <param name="pd">A <see cref="T:System.ComponentModel.PropertyDescriptor" /> that represents the property whose owner is to be found.</param><returns>
    ''' An <see cref="T:System.Object" /> that represents the owner of the specified property.
    ''' </returns>
    Public Function GetPropertyOwner(ByVal pd As System.ComponentModel.PropertyDescriptor) As Object Implements System.ComponentModel.ICustomTypeDescriptor.GetPropertyOwner
        Return Me
    End Function
End Class
Attribut 
<AttributeUsage(AttributeTargets.Property, AllowMultiple:=False, Inherited:=True)> _
Public Class clsGlobalizedPropertyAttribute
    Inherits Attribute
    Private _resourceName As String = ""
    Private _resourceDescription As String = ""
    Private _resourceTable As String = ""
    ''' <summary>
    ''' Initializes a new instance of the <see cref="clsGlobalizedPropertyAttribute" /> class.
    ''' </summary>
    ''' <param name="name">The name.</param>
    Public Sub New(ByVal name As String)
        Me._resourceName = name
    End Sub
    ''' <summary>
    ''' Initializes a new instance of the <see cref="clsGlobalizedPropertyAttribute" /> class.
    ''' </summary>
    ''' <param name="name">The name.</param>
    ''' <param name="desc">The desc.</param>
    Public Sub New(ByVal name As String, ByVal desc As String)
        Me.New(name)
        Me._resourceDescription = desc
    End Sub
    ''' <summary>
    ''' Gets or sets the name.
    ''' </summary>
    ''' <value>
    ''' The name.
    ''' </value>
    Public Property Name As String
        Get
            Return Me._resourceName
        End Get
        Set(ByVal value As String)
            Me._resourceName = value
        End Set
    End Property
    ''' <summary>
    ''' Gets or sets the description.
    ''' </summary>
    ''' <value>
    ''' The description.
    ''' </value>
    Public Property Description As String
        Get
            Return Me._resourceDescription
        End Get
        Set(ByVal value As String)
            Me._resourceDescription = value
        End Set
    End Property
    ''' <summary>
    ''' Gets or sets the table.
    ''' </summary>
    ''' <value>
    ''' The table.
    ''' </value>
    Public Property Table As String
        Get
            Return Me._resourceTable
        End Get
        Set(ByVal value As String)
            Me._resourceTable = value
        End Set
    End Property
End Class
V projektu resx soubory: jeden s názvem třída.resx a dva lokalizované třída.en.resx třída.de.resx a ve vlasntnosti objektu pak odkaz na názvy v resx 
<clsGlobalizedProperty("Name", "NameDesc")> _
public property Name as string
 |