我正在寻找有关本地化的一些建议。我有一个以通常的方式本地化的应用程序(即.resx文件),它处理大约95%的字符串。但是,我仍然需要为存储在数据库中的类别名称本地化一些字符串。
我想避免添加15个名为categoryname_ES,categoryname_FR等的新列,然后动态拉出右列。如果有某种方法来提取数据,然后在代码中进行替换,我认为这样会有点麻烦。也许是这样的:
任何人都知道如何做到这一点?或者为每种语言添加很多categoryname列(ewww)。
答案 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)
我使用您描述的资源文件方法。
Resources.CategoryName.ResourceManager.GetString(categoryName, new CultureInfo("fr"));
如果您要绑定到自定义类,只需创建另一个属性并绑定到该属性。 如果要绑定到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)
类别表的名称将为英文。语言表将具有应用程序支持的语言。然后,关联表将能够基于所选语言(如果存在)提供翻译的类别名称。如果它不存在,则只需将英文版本显示为默认版本。