将解决方案转换为多语言

时间:2010-09-06 06:49:56

标签: c# winforms multilingual

将非常大的Windows解决方案转换为多语言的最佳做法是什么。

有数百个窗口有很多标签,组合等。

我们正在使用devxpress组件(而不是布局)。

3 个答案:

答案 0 :(得分:1)

本地化总是需要大量工作,特别是如果您需要本地化已创建的应用程序。

对于表单的静态标签,有一个优雅的解决方案,可以让您轻松快速地完成75%的工作。只需将标签移动到资源,而不是触及现有的英文标签。然后,根据您当前线程的文化,更改表单上的标签,从本地化资源中读取它们。

例如,YourForm类的法语资源:

YourForm.fr-CA.resx:

"name" -> "value"
labelCaption\ --> "Légende"
labelInputLabel\ --> "Champ de saisie"

“Name”是表单控件对象的名称,“value”是控件的标签。

1)。为所有表单创建一个基类,例如LocalizationBaseForm 2)。处理此类中的OnLoad()事件并读取资源。取决于当前选择的文化,您将阅读相应的本地化资源。加拿大法语将位于/ fr-Ca /目录,西班牙语/ es-Es /等。

ResourceManager manager = new ResourceManager(your_ form_type);
ResourceSet set = manager.GetResourceSet(manager, ...);

3)。遍历标签列表并根据资源列表更改表单上的标签。

//*pseudocode:*
foreach (DictionaryEntry entry in set)
{
    SetControlLabel(entry.Key, entry.Value)
}

SetControlLabel(...)方法查找具有给定名称的控件,并使用给定的新阳离子更改其标题。

您可以制作更复杂的内容,例如在网格中本地化列,使资源中的值更复杂,例如:

“name” - > “值”     gridTable(ColumnKey1)\ - > “СolonneUne”     gridTable(ColumnKey2)\ - > “СolonneDeux”

树木,工具栏等也是如此。你甚至可以自动生成资源,这完全取决于你。

这种方法无法解决您的所有问题,但如果您需要快速本地化现有的应用程序,它将对您有所帮助。您仍然需要本地化字符串解析器,日期等。

祝你好运!

答案 1 :(得分:0)

答案 2 :(得分:0)

如果您想使用DB进行本地化,那么可以提供建议:

创建4个表  1.ProjectKeyWords(KW_ID,LNGID,Value);  2.Pages(PageID,PageName);  3.Labels(LabelID,LabelName,KW_ID);  4.Application_Labels(PageID,LabelID);  5.Langs(身份证,姓名);

样品:    ProjectKeyWords 1,1,FirstName(英文)                    2,1,姓氏(英文)                    1,2,Имя(俄文)                    2,2,Фамилия(俄文)                    1,1,Adı(在阿塞拜疆)                    2,1,Soyadı(在阿塞拜疆)    页面 - > 1,Form1               2,Form2

标签 - > 1,lblFirstName,1               1,lblLastName,2

Application_Labels - > 1,1                           1,2                           2,1                           2,2

Langs - > 1,Eng              2,罗斯              3,Az

在Form_Load()事件中,您可以将SQLQuery创建为“

SELECT L.LabelName,PKW.Value FROM Labels L,Pages P,Application_Labels A_L,ProjectKeyWords PKW 在哪里P.NAME =        AND PKW.LNG_ID =
       AND A_L.PageID = P.ID        AND A_L.LabelID = L.LabelID

使用FindControl方法创建迭代并使用L.LabelName查找所有控件,并将PKW.Value设置为此标签文本属性