【问题标题】:Generated XML via C# Winforms to be Multilingual. What is the best practice?通过 C# Winforms 生成的 XML 是多语言的。最佳做法是什么?
【发布时间】:2016-06-09 15:47:42
【问题描述】:

我有一个 WinForms 应用程序,用户可以使用它来输入值。然后将其序列化为 XML。

这里有一些代码(XML 和 C#),希望能给你们一个想法。

设计视图

The WinForm Zone Tab

右上角的 Combobox 是我在绘画中编辑的。 这个想法是用户可以在英语、法语和俄语之间切换。 静态数据将转换为语言更改为。 对于用户输入的数据,可以选择、编辑和保存新语言下的数据。

例如,如果只输入了英文数据并选择了法文,则静态字段将更改为它们的法文名称。

由于没有法语输入数据(查看区域名称),英语数据将填充网格,但用户必须将值编辑为法语,因此浴室 > Salle de Bains 和 Salle de Bains 将保存在法语下。 如果用户随后切换到英语,浴室将再次显示。


C# 代码视图 [FCMZone 类]

public class FCMZone
{
    public string id { get; set; }
    public string name { get; set; }
    public int icon { get; set; }
    public string group { get; set; }
    public string listIndex { get; set; }
    public string excludedSources { get; set; }
    public CheckState avEnable { get; set; }
    public CheckState audioOnly { get; set; }
    public MyCheckBoxItem chkBoxAVEnable;
    public MyCheckBoxItem chkBoxAudioOnly;
    public List<FCMOption> fusionZoneOptions;
    public List<FCMSource> sourceExclusion;
    public List<FCMLightingFixture> lightingFixtures;
    public List<FCMWindowFixture> windowFixtures;
    public List<FCMLightingScene> lightingScenes;
    public List<FALutronKeypad> lightingKeypadIDs;
    public List<FALutronKeypad> windowKeypadIDs;

    public FCMZone(string zId, string nm, Icon icn, string grp, CheckBox avEn, CheckBox aOnly, string lstIndx)
    {
        id = zId;
        name = nm;
        icon = icn.IconId;
        group = grp;
        avEnable = avEn.CheckState;
        audioOnly = aOnly.CheckState;
        chkBoxAVEnable = new MyCheckBoxItem(false);
        chkBoxAudioOnly = new MyCheckBoxItem(false);
        fusionZoneOptions = new List<FCMOption>();
        sourceExclusion = new List<FCMSource>();
        listIndex = lstIndx;
        excludedSources = "All Available";
        updateCheckbox();
    }


    public FCMZone(FCMZone fZone)
    {
        id = fZone.id;
        name = fZone.name;
        icon = fZone.icon;
        group = fZone.group;
        avEnable = fZone.avEnable;
        audioOnly = fZone.audioOnly;
        listIndex = fZone.listIndex;
        chkBoxAVEnable = new MyCheckBoxItem(false);
        chkBoxAudioOnly = new MyCheckBoxItem(false);
        fusionZoneOptions = new List<FCMOption>();
        sourceExclusion = new List<FCMSource>();
        updateCheckbox();
    }

    public FCMZone(FusionZone zn, ZoneProps znProps)
    {
        id = zn.Id;
        name = zn.Name;
        icon = zn.IconID;
        var myValue = zn.Group;
        int parsedValue;

        if (Int32.TryParse(myValue, out parsedValue))
        {
            // zn.Group is a ID number
            var fcmZoneGroup = znProps.systemZoneGroupList.Find(zg => zg.id == parsedValue.ToString());
            group = fcmZoneGroup.name;
        }
        else
        {
            // zn.Group is a word.
            group = myValue;
        }
        listIndex = zn.ListIndex;
        excludedSources = zn.ExcludedSources;
        if (zn.AVEnable == "1")
            avEnable = CheckState.Checked;
        else
            avEnable = CheckState.Unchecked;
        if (zn.AudioOnly == "1")
            audioOnly = CheckState.Checked;
        else
            audioOnly = CheckState.Unchecked;
        chkBoxAVEnable = new MyCheckBoxItem(false);
        chkBoxAudioOnly = new MyCheckBoxItem(false);
        fusionZoneOptions = new List<FCMOption>();
        sourceExclusion = new List<FCMSource>();
        updateCheckbox();
    }
}

如何从 FCMZone 构建到 XML [包含所有列表的 FusionSystem]

public class FusionSystem
{
    // All list items that will be serialised to the fusion system.
    public List<FusionOption> optionList = new List<FusionOption>();
    public List<FusionSource> sourceList = new List<FusionSource>();
    public List<FusionZoneGroup> zoneGroupList = new List<FusionZoneGroup>();
    public List<FusionZone> zoneList = new List<FusionZone>();
    public List<FusionUser> userList = new List<FusionUser>();
    public List<FusionSipGroup> sipGroupList;
    public List<FusionSip> sipList;
    public List<FusionCamGroup> camGroupList;
    public List<FusionCam> camList;
    public FusionLightingProperties lightingProperties;
    public FusionWindowProperties windowProperties;
}

XML Snippet [XML,我已经离开了浴室区,为了方便起见,删除了其他的]

<?xml version="1.0" encoding="utf-8"?>
<FusionSystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <optionList>
  <sourceList>
  </sourceList>
  <zoneGroupList>
    <FusionZoneGroup>
      <Id>1</Id>
      <Name>Fusion</Name>
      <Icon>24</Icon>
      <Ident />
      <ListIndex>0</ListIndex>
    </FusionZoneGroup>
    <FusionZoneGroup>
      <Id>2</Id>
      <Name>Demo</Name>
      <Icon>23</Icon>
      <Ident>Demo</Ident>
      <ListIndex>1</ListIndex>
    </FusionZoneGroup>
  </zoneGroupList>
  <zoneList>
    <FusionZone>
    </FusionZone>
    <FusionZone>
    </FusionZone>
    <FusionZone>
    </FusionZone>
    <FusionZone>
    </FusionZone>
    <FusionZone>
      <ZoneOptionList>
        <FusionZoneOption>
          <Id>1</Id>
          <Name>Lighting</Name>
          <Icon>1</Icon>
          <Enabled>0</Enabled>
          <ListIndex>0</ListIndex>
        </FusionZoneOption>
        <FusionZoneOption>
          <Id>2</Id>
          <Name>Window Treatments</Name>
          <Icon>2</Icon>
          <Enabled>0</Enabled>
          <ListIndex>0</ListIndex>
        </FusionZoneOption>
        <FusionZoneOption>
          <Id>3</Id>
          <Name>Climate</Name>
          <Icon>3</Icon>
          <Enabled>0</Enabled>
          <ListIndex>0</ListIndex>
        </FusionZoneOption>
        <FusionZoneOption>
          <Id>4</Id>
          <Name>Display</Name>
          <Icon>4</Icon>
          <Enabled>0</Enabled>
          <ListIndex>0</ListIndex>
        </FusionZoneOption>
      </ZoneOptionList>
      <LightingFixtureList />
      <LightingSceneList />
      <WindowFixtureList />
      <LightingKeypadIDs />
      <WindowKeypadIDs />
      <Id>5</Id>
      <Name>Bathroom</Name>
      <IconName>Bathroom(M)</IconName>
      <IconID>8</IconID>
      <ListIndex>2</ListIndex>
      <Group>1</Group>
      <AVEnable>0</AVEnable>
      <AudioOnly>1</AudioOnly>
      <ExcludedSources>All Available</ExcludedSources>
    </FusionZone>

我的猜测是使用全球化和资源,但我以前从未使用过,如果我能被引导到相关指南,我将不胜感激。

对不起,如果我添加了太多信息。

XmlSerializer

private void OpenFile(string filePath)
    {
        projProps.fileName = filePath;
        try
        {
            bool proceed = CheckLegacyTypes();
            if (!proceed)
            {
                return;
            }

            XmlSerializer xmlData = new XmlSerializer(typeof(FusionSystem));

            using (StreamReader streamRead = new StreamReader(projProps.fileName))
            {
                fusionSystem = (FusionSystem) xmlData.Deserialize(streamRead);
            }

            openFusionSystem();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

.

【问题讨论】:

    标签: c# xml winforms


    【解决方案1】:

    我的猜测是使用全球化和资源,但我以前从未使用过,如果我能找到相关指南,我将不胜感激。

    嗯……是的,不是的。如果您尝试在运行时动态更改 UI,this answer 提供了几个解决方案;这是您使用全球化(用于 UI 线程的文化)和资源(用于存储 UI 字符串)的地方。

    但是,您不能在运行时写入 RESX 文件,因此您唯一真正的解决方案是在语言下拉列表更改值时加载和卸载 XML 文件。为此,您可能只想使用Serialization

    【讨论】:

    • 好点,所以当用户点击法语时。它必须重新加载 XML 的 fr 版本,并且必须重新输入所有值?
    • 否;我在想您会将更改保存到 XML 文件中,并且它们会在语言更改之间持续存在。
    • 所以使用序列化是否有我必须为语言设置的设置,或者我必须为英语和法语分别创建自己的标签,例如
    • 没有这样的设置,没有。你的解决方案不错。其他选项可能包括这样的内容:&lt;ZoneNames&gt;&lt;ZoneName culture="neutral" value="Bathroom" /&gt;&lt;ZoneName culture="en-US" value="Bathroom" /&gt;&lt;ZoneName culture="fr-FR" value="Salle de Bains" /&gt;&lt;/ZoneNames&gt; 或每种文化有一个 XML 文件,并将语言名称放在文件名中。
    • 在您展示的示例中执行此操作。序列化类时如何显示文化标签? xml属性?也非常感谢卡特到目前为止的所有帮助。老实说。
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 2015-02-25
    • 2011-01-28
    • 2011-06-09
    相关资源
    最近更新 更多