"翻译"属性名称为可读名称

时间:2014-12-22 22:08:28

标签: c# jquery asp.net .net entity-framework

目前我正在开发一个项目,我们有一个查询构建器 - 用户选择他想要的数据,最终报告中显示的内容以及一些过滤器。我们也在使用Entity Framework(Code First),我们需要一些类的每个字符串属性的名称。 E.g:

  1. 模型类

    public class User {
         public int Id { get; set; }
         public string FullName { get; set; }
         public string FullAddress { get; set; }
    }
    
  2. 截至目前,我正在获取所有属性名称:

    1. 属性过滤器

      var propertyList = type.GetProperties()
              .Where(prop => prop.PropertyType == typeof(string))
              .Select(prop => prop.Name).ToList();
      
    2. 它适用于我们对数据库所做的任何更改,但是对于用户来说并不容易阅读(特别是如果您认为我们需要将所有代码保留为英语,即使很难,我们也会将其发布给那些大多只会说葡萄牙语。)

      我需要的是将“FullName”显示为“Nome Completo”,将“FullAddress”显示为“EndereçoCompleto”等,并且仍能以某种方式获取原始名称。

      我想到的一个解决方案是创建一个静态字典并根据需要更新它;使用jQuery(使用简单对象制作的双向字典)很容易处理,但由于数据库变得非常大,因此维护起来会很麻烦。

      有没有比静态词典更好的选择?

2 个答案:

答案 0 :(得分:1)

您可以将DisplayAttribute应用于属性,并将其链接到具有英语和/或葡萄牙语友好名称的资源文件。这与MVC的工作方式相同。当您需要获取友好名称时,您只需要在属性上调用GetName()方法,即可在当前的线程文化中获取相应的名称。

模型类

// add reference to System.ComponentModel.DataAnnotations to your project
public class User
{
    public int UserId { get; set; }

    // pass the "key" of the resource entry and the name of the resource file
    [Display(Name = "FullName", ResourceType = typeof(UserResources))]
    public string FullName { get; set; }

    [Display(Name = "FullAddress", ResourceType = typeof(UserResources))]
    public string FullAddress { get; set; }

    public string OtherProp { get; set; }
}

<强> UserResources.resx

默认英文版(如果网站本身不是真正的“多语言”,你可以把葡萄牙语放在这里)

FullName       Full Name
FullAddress    Full Address

<强> UserResources.pt-pt.resx

葡萄牙语翻译

FullName       Nome Completo
FullAddress    Endereço Completo

帮助方法

如果存在[DisplayAttribute],这将检索已翻译的显示名称。如果没有,只需要财产的名称。

private static string GetPropertyName(PropertyInfo prop)
{
    var displayAttribute = prop.GetCustomAttribute<DisplayAttribute>();
    if (displayAttribute != null)
    {
        // GetName() fetches from the resource file of the current Thread Culture
        return displayAttribute.GetName();
    }
    else
    {
        return prop.Name;
    }
}

示例用法获取属性名称列表

public static void Main(string[] args)
{
    // Uncomment to get the names in Portuguese
    //Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-PT");

    Type type = typeof(User);
    var propertyList = type.GetProperties()
        .Where(prop => prop.PropertyType == typeof(string))
        .Select(prop => GetPropertyName(prop)).ToList();

    foreach (string propertyName in propertyList)
    {
        Console.WriteLine(propertyName);
    }
}

唯一需要注意的是,默认情况下,资源文件类是作为internal类生成的,您可能需要将其公开。您可以通过将Visual Studio的“属性”窗口中的“自定义工具”设置为PublicResXFileCodeGenerator来完成此操作。否则,您可能会收到错误消息“在资源文件中找不到公共属性FirstName”。

答案 1 :(得分:0)

如果右键单击SQL Server Management Studio中的表或列,并选择属性,您将看到有一个扩展属性选项。您可以为每列添加一个名为Friendly Name的扩展属性,然后有一个单独的查询来在应用程序启动时加载您的字典。

这是一个查询,可以帮助您为数据库中的列提取扩展属性。

SELECT major_id, minor_id, t.name AS [Table Name], c.name AS [Column Name], value AS [Extended Property], ep.name as [Property Name]
FROM sys.extended_properties AS ep
INNER JOIN sys.tables AS t ON ep.major_id = t.object_id 
INNER JOIN sys.columns AS c ON ep.major_id = c.object_id AND ep.minor_id = c.column_id
WHERE class = 1;

从以下网址肆无忌惮地偷走的例子(我不假装记住这些东西): http://technet.microsoft.com/en-us/library/ms186989(v=SQL.105).aspx