【问题标题】:Localization DisplayName Attribute本地化 DisplayName 属性
【发布时间】:2011-08-24 04:38:24
【问题描述】:

我想翻译财产。我有两个资源文件:DataResource.resxDataResource.en.resx。有NameString 字符串(两者)。 我的财产:

[DisplayName("NameString")]
public virtual string Name { get; set; }

我已经使用this 解决方案来本地化DataDisplay 属性。

public class LocalizedDisplayNameAttribute: DisplayNameAttribute
{
    public LocalizedDisplayNameAttribute(string resourceId) 
        : base(GetMessageFromResource(resourceId))
    { }

    private static string GetMessageFromResource(string resourceId)
    {
        // TODO: Return the string from the resource file
    }
}

但我不明白我必须在GetMessageFromResource 方法中写什么。
谢谢。

【问题讨论】:

    标签: c# winforms attributes


    【解决方案1】:

    对于您的自定义 DataAnnotations 属性,您需要在 GetMessageFromResource 方法中编写以下代码:

    private static string GetMessageFromResource(string resourceId)
    {
        var propertyInfo = typeof(DataResource).GetProperty(resourceId, BindingFlags.Static | BindingFlags.Public);
        return propertyInfo.GetValue(null, null);
    }
    

    假设您的问题有错误并且应该有 LocalizeDisplayNameAttribute,而不是 DisplayName ,则此代码应该可以完成工作:

    [DisplayName("NameString")]
    public virtual string Name { get; set; }
    

    无论如何,我建议使用 lambda 访问器从资源中获取本地化字符串,以便您可以使用重构工具重命名/导航它们。

    【讨论】:

    • 我想我有点急于建议使用 lambda,因为无论如何 DisplayName 属性本身不能将 lambda 作为构造函数的参数。算了。
    • 我正在使用这种方法,而不是资源文件,我正在从数据库中获取数据。当我硬编码时,它可以工作,但我需要用户选择语言。所以我有一个下拉菜单,当用户更改下拉菜单时我需要更改语言。即,从显示名称属性我需要传递语言环境,我该如何实现?
    • 还有如何在按钮中实现本地化。工具提示等?
    • 您可以只使用 statis 资源类的静态属性,其中包含要在应用程序中本地化的字符串文字
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 2023-03-30
    • 2015-06-02
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多