需要有关ASP.NET本地化的建议 - 存储在数据库中的字符串&在gridview中显示

时间:2010-01-08 22:00:12

标签: asp.net vb.net localization

我正在寻找有关本地化的一些建议。我有一个以通常的方式本地化的应用程序(即.resx文件),它处理大约95%的字符串。但是,我仍然需要为存储在数据库中的类别名称本地化一些字符串。

我想避免添加15个名为categoryname_ES,categoryname_FR等的新列,然后动态拉出右列。如果有某种方法来提取数据,然后在代码中进行替换,我认为这样会有点麻烦。也许是这样的:

  • 逐行浏览gridview
  • 如果选择的语言不是英语,请在全局资源文件中查找此文本值并替换它。

任何人都知道如何做到这一点?或者为每种语言添加很多categoryname列(ewww)。

3 个答案:

答案 0 :(得分:3)

您可以使用四个数据库列来执行此操作:

ID  (unique primary key)
CultureCode
ProductID
ProductName

我认为您是从数据库中选择产品。作为存储过程的一部分传递UI文化,然后当您从产品表中选择加入产品ID和UICulture上的Culture表时。你会用这样的短语来表达:

SELECT ProductID
        ,another field
        ,IsNull(Culture.ProductName, Product.ProductName)
        ,etc
FROM    Product
    LEFT JOIN Culture 
        ON Product.ProductID = Culture.ProductID
        AND Culture.CultureCode = @UICulture

你明白了。您甚至可以检查UICulture中的连字符(例如:fr-CA),将其拆分为另一个变量,然后对Culture表进行两次连接 - 一个用于确切的文化,一个用于后备文化,因此在此示例中第一次加入将是fr-CA,第二次加入将回退到fr。如果您的所有文化联接失败(例如,因为您在文化表中没有Zulu),那么IsNull仅使用普通的ProductName(可能是英文)。

答案 1 :(得分:3)

我使用您描述的资源文件方法。

  1. 为每个类别添加一行CategoryName.resx文件。确保“名称”与您的数据库值完全匹配。将翻译放在“价值”中。
  2. 通过resx生成的代码文件获取代码中的字符串。 (对不起C#) Resources.CategoryName.ResourceManager.GetString(categoryName, new CultureInfo("fr"));
  3. 如果您要绑定到自定义类,只需创建另一个属性并绑定到该属性。 如果要绑定到DataSet,则可能需要使用RowDataBound事件来进行替换。

答案 2 :(得分:1)

您可以创建三个表:

Category
    Category_ID (identity)
    Category_Name (string)

Language
    Language_ID (identity)
    Language_Name (string)

CategoryLanguage
    Category_ID (FK)
    Language_ID (FK)
    Translation (string)

类别表的名称将为英文。语言表将具有应用程序支持的语言。然后,关联表将能够基于所选语言(如果存在)提供翻译的类别名称。如果它不存在,则只需将英文版本显示为默认版本。