First version that actully working.

This commit is contained in:
MADxingjin 2024-01-04 17:26:29 +08:00
commit 5c6aab9fe2
18 changed files with 606 additions and 0 deletions

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
*/bin
.vs
.idea
*/obj

View File

@ -0,0 +1,9 @@
<Application xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="AvaloniaApplication2.App">
<Application.Styles>
<FluentTheme Mode="Light"/>
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
</Application.Styles>
</Application>

View File

@ -0,0 +1,25 @@
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using AvaloniaApplication2.ViewModels;
using AvaloniaApplication2.Views;
namespace AvaloniaApplication2;
public partial class App : Application
{
public override void Initialize()
{
AvaloniaXamlLoader.Load(this);
}
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow();
}
base.OnFrameworkInitializationCompleted();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 172 KiB

View File

@ -0,0 +1,47 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
<ApplicationManifest>app.manifest</ApplicationManifest>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup>
<ItemGroup>
<Folder Include="Models\"/>
<AvaloniaResource Include="Assets\**"/>
</ItemGroup>
<ItemGroup>
<ProjectCapability Include="Avalonia"/>
<TrimmerRootAssembly Include="Avalonia.Themes.Fluent"/>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" Version="0.10.19"/>
<PackageReference Include="Avalonia.Controls.DataGrid" Version="0.10.19" />
<PackageReference Include="Avalonia.Desktop" Version="0.10.19"/>
<!--Condition below is needed to remove Avalonia.Diagnostics package from build output in Release configuration.-->
<PackageReference Condition="'$(Configuration)' == 'Debug'" Include="Avalonia.Diagnostics" Version="0.10.19"/>
<PackageReference Include="Avalonia.ReactiveUI" Version="0.10.19"/>
<PackageReference Include="XamlNameReferenceGenerator" Version="1.6.1"/>
</ItemGroup>
<ItemGroup>
<Compile Update="Views\MainWindow.axaml.cs">
<DependentUpon>MainWindow.axaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TransTool\TransTool.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="test.xml">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -0,0 +1,22 @@
using Avalonia;
using Avalonia.ReactiveUI;
using System;
namespace AvaloniaApplication2;
class Program
{
// Initialization code. Don't use any Avalonia, third-party APIs or any
// SynchronizationContext-reliant code before AppMain is called: things aren't initialized
// yet and stuff might break.
[STAThread]
public static void Main(string[] args) => BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
// Avalonia configuration, don't remove; also used by visual designer.
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.LogToTrace()
.UseReactiveUI();
}

View File

@ -0,0 +1,51 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Xml;
using ReactiveUI;
using TransTool;
namespace AvaloniaApplication2.ViewModels;
public class MainWindowViewModel : ViewModelBase
{
private List<TKey> _Keys;
public ObservableCollection<TKey> Keys
{
get { return new ObservableCollection<TKey>(_Keys); }
}
public MainWindowViewModel()
{
_Keys = new();
var testxmlpath = @".\\test.xml";
XmlDocument doc = new();
doc.Load(testxmlpath);
_Greeting += "\n XML Loaded";
var xer = doc.DocumentElement;
var xnlist = xer.ChildNodes;
var orig = string.Empty;
var target = string.Empty;
foreach (XmlNode node in xnlist)
{
if (node.NodeType is XmlNodeType.Comment)
{
orig = node.Value;
}
else
{
target = node.InnerText;
_Keys.Add(new TKey(orig, target,node.Name));
orig = target = string.Empty;
}
}
_Greeting += "\n DATA LOADED";
}
private string _Greeting = "Avalonia Testing";
public string Greeting
{
get { return _Greeting; }
}
}

View File

@ -0,0 +1,7 @@
using ReactiveUI;
namespace AvaloniaApplication2.ViewModels;
public class ViewModelBase : ReactiveObject
{
}

View File

@ -0,0 +1,20 @@
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="using:AvaloniaApplication2.ViewModels"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="AvaloniaApplication2.Views.MainWindow"
x:DataType="vm:MainWindowViewModel"
Icon="/Assets/avalonia-logo.ico"
Title="AvaloniaApplication2">
<Design.DataContext>
<!-- This only sets the DataContext for the previewer in an IDE,
to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
<vm:MainWindowViewModel />
</Design.DataContext>
<Grid ColumnDefinitions="*,*">
<TextBlock Grid.Column="0" Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center" />
<DataGrid Grid.Column="1" Background="Aqua" Items="{Binding Path=Keys}" AutoGenerateColumns="True" Name="dgrid1" />
</Grid>
</Window>

View File

@ -0,0 +1,14 @@
using Avalonia.Controls;
using AvaloniaApplication2.ViewModels;
namespace AvaloniaApplication2.Views;
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var viewModel = new MainWindowViewModel();
DataContext = viewModel;
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<!-- This manifest is used on Windows only.
Don't remove it as it might cause problems with window transparency and embeded controls.
For more details visit https://learn.microsoft.com/en-us/windows/win32/sbscs/application-manifests -->
<assemblyIdentity version="1.0.0.0" name="AvaloniaTest.Desktop"/>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- A list of the Windows versions that this application has been tested on
and is designed to work with. Uncomment the appropriate elements
and Windows will automatically select the most compatible environment. -->
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
</application>
</compatibility>
</assembly>

View File

@ -0,0 +1,195 @@
<?xml version="1.0" encoding="UTF-8"?>
<LanguageData>
<!-- EN: assault rifle bullet -->
<Bullet_AssaultRifle.label>突击步枪子弹</Bullet_AssaultRifle.label>
<!-- EN: autopistol bullet -->
<Bullet_Autopistol.label>自动手枪子弹</Bullet_Autopistol.label>
<!-- EN: bolt-action rifle bullet -->
<Bullet_BoltActionRifle.label>栓动步枪子弹</Bullet_BoltActionRifle.label>
<!-- EN: EMP launcher shell -->
<Bullet_EMPLauncher.label>EMP弹</Bullet_EMPLauncher.label>
<!-- EN: heavy SMG bullet -->
<Bullet_HeavySMG.label>重型冲锋枪子弹</Bullet_HeavySMG.label>
<!-- EN: incendiary bolt -->
<Bullet_IncendiaryLauncher.label>燃烧弹</Bullet_IncendiaryLauncher.label>
<!-- EN: LMG bullet -->
<Bullet_LMG.label>轻机枪子弹</Bullet_LMG.label>
<!-- EN: machine pistol bullet -->
<Bullet_MachinePistol.label>冲锋手枪子弹</Bullet_MachinePistol.label>
<!-- EN: minigun bullet -->
<Bullet_Minigun.label>速射机枪子弹</Bullet_Minigun.label>
<!-- EN: revolver bullet -->
<Bullet_Revolver.label>左轮手枪子弹</Bullet_Revolver.label>
<!-- EN: shotgun blast -->
<Bullet_Shotgun.label>霰弹枪子弹</Bullet_Shotgun.label>
<!-- EN: smoke launcher shell -->
<Bullet_SmokeLauncher.label>烟雾弹</Bullet_SmokeLauncher.label>
<!-- EN: sniper rifle bullet -->
<Bullet_SniperRifle.label>狙击步枪子弹</Bullet_SniperRifle.label>
<!-- EN: assault rifle -->
<Gun_AssaultRifle.label>突击步枪</Gun_AssaultRifle.label>
<!-- EN: A general-purpose gas-operated assault rifle for field or urban combat. It has good range, decent power, and good accuracy. -->
<Gun_AssaultRifle.description>古老的制式军用武器,用于野外或城市作战。拥有良好的射程、火力和精度。</Gun_AssaultRifle.description>
<!-- EN: stock -->
<Gun_AssaultRifle.tools.stock.label>枪托</Gun_AssaultRifle.tools.stock.label>
<!-- EN: barrel -->
<Gun_AssaultRifle.tools.barrel.label>枪管</Gun_AssaultRifle.tools.barrel.label>
<!-- EN: assault rifle -->
<Gun_AssaultRifle.verbs.Verb_Shoot.label>突击步枪</Gun_AssaultRifle.verbs.Verb_Shoot.label>
<!-- EN: autopistol -->
<Gun_Autopistol.label>自动手枪</Gun_Autopistol.label>
<!-- EN: An ancient pattern blowback-operated self-loading pistol. It lacks stopping power and range, but is quick to fire. -->
<Gun_Autopistol.description>古老构造的自动手枪。缺乏火力和射程,但开火迅速。</Gun_Autopistol.description>
<!-- EN: grip -->
<Gun_Autopistol.tools.grip.label>握把</Gun_Autopistol.tools.grip.label>
<!-- EN: barrel -->
<Gun_Autopistol.tools.barrel.label>枪管</Gun_Autopistol.tools.barrel.label>
<!-- EN: autopistol -->
<Gun_Autopistol.verbs.Verb_Shoot.label>自动手枪</Gun_Autopistol.verbs.Verb_Shoot.label>
<!-- EN: bolt-action rifle -->
<Gun_BoltActionRifle.label>栓动步枪</Gun_BoltActionRifle.label>
<!-- EN: An ancient pattern bolt-action rifle. With its long range, and low fire rate, it is unlikely to drive animals to revenge, which makes it a favorite weapon for hunting. -->
<Gun_BoltActionRifle.description>古老的栓动式步枪。拥有良好的射程但射速低。</Gun_BoltActionRifle.description>
<!-- EN: stock -->
<Gun_BoltActionRifle.tools.stock.label>枪托</Gun_BoltActionRifle.tools.stock.label>
<!-- EN: barrel -->
<Gun_BoltActionRifle.tools.barrel.label>枪管</Gun_BoltActionRifle.tools.barrel.label>
<!-- EN: bolt-action rifle -->
<Gun_BoltActionRifle.verbs.Verb_Shoot.label>栓动步枪</Gun_BoltActionRifle.verbs.Verb_Shoot.label>
<!-- EN: chain shotgun -->
<Gun_ChainShotgun.label>链式霰弹枪</Gun_ChainShotgun.label>
<!-- EN: A magazine-fed fully automatic shotgun. It is even shorter-ranged than a typical shotgun, but is extraordinarily dangerous due to burst fire. -->
<Gun_ChainShotgun.description>古老的弹匣供弹全自动霰弹枪。射程短,精度低,但由于火力强大而极具威胁性。</Gun_ChainShotgun.description>
<!-- EN: stock -->
<Gun_ChainShotgun.tools.stock.label>枪托</Gun_ChainShotgun.tools.stock.label>
<!-- EN: barrel -->
<Gun_ChainShotgun.tools.barrel.label>枪管</Gun_ChainShotgun.tools.barrel.label>
<!-- EN: chain shotgun -->
<Gun_ChainShotgun.verbs.Verb_Shoot.label>链式霰弹枪</Gun_ChainShotgun.verbs.Verb_Shoot.label>
<!-- EN: EMP launcher -->
<Gun_EmpLauncher.label>EMP发射器</Gun_EmpLauncher.label>
<!-- EN: A wide-barreled EMP shell launcher. The shell will upon impact release a burst of electromagnetic energy, stunning mechanical targets (mechanoids, turrets, mortars) and depleting shields in the area of effect. -->
<Gun_EmpLauncher.description>一种宽口径EMP炮弹发射器。炮弹在撞击时会释放出一股电磁能量、瘫痪机械目标机械体、炮塔、迫击炮以及耗尽范围内护盾的能量。</Gun_EmpLauncher.description>
<!-- EN: stock -->
<Gun_EmpLauncher.tools.stock.label>枪托</Gun_EmpLauncher.tools.stock.label>
<!-- EN: barrel -->
<Gun_EmpLauncher.tools.barrel.label>枪管</Gun_EmpLauncher.tools.barrel.label>
<!-- EN: EMP launcher -->
<Gun_EmpLauncher.verbs.Verb_Shoot.label>EMP发射器</Gun_EmpLauncher.verbs.Verb_Shoot.label>
<!-- EN: heavy SMG -->
<Gun_HeavySMG.label>重型冲锋枪</Gun_HeavySMG.label>
<!-- EN: A compact, wide-caliber slug-thrower. It's got a very short range, but it packs a punch and handles quite well. -->
<Gun_HeavySMG.description>古老的通用口径的紧凑型枪械。射程短,但着弹点集中、操控性好。</Gun_HeavySMG.description>
<!-- EN: grip -->
<Gun_HeavySMG.tools.grip.label>握把</Gun_HeavySMG.tools.grip.label>
<!-- EN: barrel -->
<Gun_HeavySMG.tools.barrel.label>枪管</Gun_HeavySMG.tools.barrel.label>
<!-- EN: heavy SMG -->
<Gun_HeavySMG.verbs.Verb_Shoot.label>重型冲锋枪</Gun_HeavySMG.verbs.Verb_Shoot.label>
<!-- EN: incendiary launcher -->
<Gun_IncendiaryLauncher.label>燃烧弹发射器</Gun_IncendiaryLauncher.label>
<!-- EN: A wide-barreled incendiary bolt launcher. The bolts create small incendiary explosions on impact, starting fires. -->
<Gun_IncendiaryLauncher.description>古老的大口径燃烧弹发射器。能够点燃目标区域,可以用来放火。</Gun_IncendiaryLauncher.description>
<!-- EN: stock -->
<Gun_IncendiaryLauncher.tools.stock.label>枪托</Gun_IncendiaryLauncher.tools.stock.label>
<!-- EN: barrel -->
<Gun_IncendiaryLauncher.tools.barrel.label>枪管</Gun_IncendiaryLauncher.tools.barrel.label>
<!-- EN: incendiary launcher -->
<Gun_IncendiaryLauncher.verbs.Verb_Shoot.label>燃烧弹发射器</Gun_IncendiaryLauncher.verbs.Verb_Shoot.label>
<!-- EN: LMG -->
<Gun_LMG.label>轻机枪</Gun_LMG.label>
<!-- EN: A gas-operated light machine gun. While it is somewhat unwieldy and inaccurate, its long bursts of fire are effective against groups of enemies. -->
<Gun_LMG.description>古老的轻机枪。较强的压制火力弥补了其他方面的不足。</Gun_LMG.description>
<!-- EN: stock -->
<Gun_LMG.tools.stock.label>枪托</Gun_LMG.tools.stock.label>
<!-- EN: barrel -->
<Gun_LMG.tools.barrel.label>枪管</Gun_LMG.tools.barrel.label>
<!-- EN: LMG -->
<Gun_LMG.verbs.Verb_Shoot.label>轻机枪</Gun_LMG.verbs.Verb_Shoot.label>
<!-- EN: machine pistol -->
<Gun_MachinePistol.label>冲锋手枪</Gun_MachinePistol.label>
<!-- EN: A micro-submachine gun. It is short-ranged, but very light in the hands. Its rate of fire tends to make up for its weakness. -->
<Gun_MachinePistol.description>古老的微型冲锋枪。射程短,威力低,但射速很高。瞄准和开火都非常迅速敏捷。</Gun_MachinePistol.description>
<!-- EN: grip -->
<Gun_MachinePistol.tools.grip.label>握把</Gun_MachinePistol.tools.grip.label>
<!-- EN: barrel -->
<Gun_MachinePistol.tools.barrel.label>枪管</Gun_MachinePistol.tools.barrel.label>
<!-- EN: machine pistol -->
<Gun_MachinePistol.verbs.Verb_Shoot.label>冲锋手枪</Gun_MachinePistol.verbs.Verb_Shoot.label>
<!-- EN: minigun -->
<Gun_Minigun.label>速射机枪</Gun_Minigun.label>
<!-- EN: A multi-barrel machine gun. It's unwieldy, but once it starts firing it fires very fast. Where most self-loading guns are powered by the energy from the gunpowder, the minigun uses an electric motor to rapidly cycle cartridges through the weapon. -->
<Gun_Minigun.description>古老的多管机枪,拥有极高的射速。虽然笨重但火力强大。在大多数自动武器使用火药提供动力的情况下,这种武器使用一种电动机使子弹能够快速替换。</Gun_Minigun.description>
<!-- EN: barrels -->
<Gun_Minigun.tools.barrels.label>枪管</Gun_Minigun.tools.barrels.label>
<!-- EN: minigun -->
<Gun_Minigun.verbs.Verb_Shoot.label>速射机枪</Gun_Minigun.verbs.Verb_Shoot.label>
<!-- EN: pump shotgun -->
<Gun_PumpShotgun.label>泵动霰弹枪</Gun_PumpShotgun.label>
<!-- EN: An ancient design of shotgun that emits a tight-packed spray of pellets. Deadly, but short range. -->
<Gun_PumpShotgun.description>古老的霰弹枪,拥有致命的火力,但射程较短。</Gun_PumpShotgun.description>
<!-- EN: stock -->
<Gun_PumpShotgun.tools.stock.label>枪托</Gun_PumpShotgun.tools.stock.label>
<!-- EN: barrel -->
<Gun_PumpShotgun.tools.barrel.label>枪管</Gun_PumpShotgun.tools.barrel.label>
<!-- EN: pump shotgun -->
<Gun_PumpShotgun.verbs.Verb_Shoot.label>泵动霰弹枪</Gun_PumpShotgun.verbs.Verb_Shoot.label>
<!-- EN: revolver -->
<Gun_Revolver.label>左轮手枪</Gun_Revolver.label>
<!-- EN: An ancient pattern double-action revolver. It's not very powerful, but has a decent range for a pistol and is quick on the draw. -->
<Gun_Revolver.description>古老构造的复动式左轮手枪。威力和射程一般,但射击迅速。</Gun_Revolver.description>
<!-- EN: grip -->
<Gun_Revolver.tools.grip.label>握把</Gun_Revolver.tools.grip.label>
<!-- EN: barrel -->
<Gun_Revolver.tools.barrel.label>枪管</Gun_Revolver.tools.barrel.label>
<!-- EN: revolver -->
<Gun_Revolver.verbs.Verb_Shoot.label>左轮手枪</Gun_Revolver.verbs.Verb_Shoot.label>
<!-- EN: smoke launcher -->
<Gun_SmokeLauncher.label>烟雾弹发射器</Gun_SmokeLauncher.label>
<!-- EN: A wide-barreled smoke shell launcher. The shell will upon impact release a cloud of smoke, obscuring incoming shots and preventing turrets from locking on. -->
<Gun_SmokeLauncher.description>一种大口径烟雾弹发射器。炮弹在撞击时会释放出一团烟雾,遮蔽瞄准的视线,也能够防止炮塔锁定。</Gun_SmokeLauncher.description>
<!-- EN: stock -->
<Gun_SmokeLauncher.tools.stock.label>枪托</Gun_SmokeLauncher.tools.stock.label>
<!-- EN: barrel -->
<Gun_SmokeLauncher.tools.barrel.label>枪管</Gun_SmokeLauncher.tools.barrel.label>
<!-- EN: smoke launcher -->
<Gun_SmokeLauncher.verbs.Verb_Shoot.label>烟雾弹发射器</Gun_SmokeLauncher.verbs.Verb_Shoot.label>
<!-- EN: sniper rifle -->
<Gun_SniperRifle.label>狙击步枪</Gun_SniperRifle.label>
<!-- EN: An ancient design of precision sniper rifle. Bolt action. It has an exceptionally long range, great accuracy and good power. Because it's so unwieldy, other weapons outclass it at close range. -->
<Gun_SniperRifle.description>样式古老的军用狙击步枪。栓动式。拥有极高的射程,很高的精度和良好的威力。但由于十分笨重,近距离的性能远不及其他武器。</Gun_SniperRifle.description>
<!-- EN: stock -->
<Gun_SniperRifle.tools.stock.label>枪托</Gun_SniperRifle.tools.stock.label>
<!-- EN: barrel -->
<Gun_SniperRifle.tools.barrel.label>枪管</Gun_SniperRifle.tools.barrel.label>
<!-- EN: sniper rifle -->
<Gun_SniperRifle.verbs.Verb_Shoot.label>狙击步枪</Gun_SniperRifle.verbs.Verb_Shoot.label>
</LanguageData>

40
TransTool/TFile.cs Normal file
View File

@ -0,0 +1,40 @@
// ${File.SolutionName} / ${File.ProjectName} / ${File.FileName}
// CREATED AT ${File.CreatedYear} / ${File.CreatedMonth} / ${File.CreatedDay}
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace TransTool;
public class TFile: INotifyPropertyChanged
{
private string FileName;
private string FileNameShort;
private DateTime LastModified;
private DateTime Created;
public ObservableCollection<TKey> Keys;
public TFile(string fileName, string fileNameShort)
{
FileName = fileName;
FileNameShort = fileNameShort;
Keys = new();
}
public event PropertyChangedEventHandler? PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetField<T>(ref T field, T value, [CallerMemberName] string? propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
}

16
TransTool/TKey.cs Normal file
View File

@ -0,0 +1,16 @@
// ${File.SolutionName} / ${File.ProjectName} / ${File.FileName}
// CREATED AT ${File.CreatedYear} / ${File.CreatedMonth} / ${File.CreatedDay}
namespace TransTool;
public class TKey
{
public string orig { get; set; }
public string target { get; set; }
public string ident { get; set; }
public TKey(string Orig,string Target,string Ident)
{
orig = Orig;
target = Target;
ident = Ident;
}
}

View File

@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
</Project>

47
XMLTransTool/Program.cs Normal file
View File

@ -0,0 +1,47 @@
// See https://aka.ms/new-console-template for more information
using System.Text;
using System.Xml;
using XMLTransTool;
Console.WriteLine("Hello, World!");
string testxmlpath = @".\\test.xml";
if (!File.Exists(testxmlpath))
return -1;
XmlDocument doc = new();
doc.Load(testxmlpath);
XmlElement xer = doc.DocumentElement;
XmlNodeList xnlist = xer.ChildNodes;
PrintNodeInfo(xnlist);
TransData td= AnalysisFile(xnlist);
td.PrintContent();
return 0;
void PrintNodeInfo(XmlNodeList nodeList)
{
foreach (XmlNode node in nodeList)
{
Console.WriteLine("Node {0}, Type == {1}, Content == {2}",node.Name,node.NodeType,node.NodeType is XmlNodeType.Element? node.InnerText : node.Value);
//if(node.HasChildNodes)
//PrintNodeInfo(node.ChildNodes);
}
}
TransData AnalysisFile(XmlNodeList nodeList)
{
TransData td = new("Not a real name");
string orig = String.Empty;
string target = String.Empty;
foreach (XmlNode node in nodeList)
{
if (node.NodeType is XmlNodeType.Comment)
orig = node.Value;
else
{
target = node.InnerText;
td.AddText(node.Name,orig,target);
orig = target = String.Empty;
}
}
return td;
}

72
XMLTransTool/TransData.cs Normal file
View File

@ -0,0 +1,72 @@
// XMLTransTool / XMLTransTool / TransData.cs
// CREATED AT 2023 / 12 / 25
namespace XMLTransTool;
/// <summary>
/// Obviously a primitive solution, improvements will be needed.
/// Todo: Directly Create Content From iterating FileSystem.
/// </summary>
public class TransData
{
/// <summary>
/// Todo: Implement Short FileName.
/// </summary>
public string FileName;
public string FileNameFull;
/// <summary>
/// Key,Original,Target
/// </summary>
private Dictionary<string, KeyValuePair<string,string>> Content;
public TransData(string fileNameFull)
{
FileNameFull = fileNameFull;
FileName = "!!!Not Implemented Short Name!!!";
Content = new();
}
public void AddText(string key,string eng, string target)
{
if (Content.ContainsKey(key))
{
throw new ArgumentException("Given Key has been defined Multiple times.",eng);
}
if (!Content.TryAdd(key,new KeyValuePair<string, string>(eng,target)))
throw new ArgumentException("Failed to add given Key to internal Content Dict");
}
public void PrintContent()
{
Console.WriteLine("Now Printing Content of File [{0}]",FileNameFull);
foreach (KeyValuePair<string,KeyValuePair<string,string>> pair in Content)
{
Console.WriteLine("{0} == {1}",pair.Key,pair.Value);
}
}
public List<string> AllKeys()
{
return Content.Keys.ToList();
}
public List<string> AllSrcs()
{
List<string> r = new List<string>();
foreach (KeyValuePair<string, KeyValuePair<string, string>> pair in Content)
{
r.Add(pair.Value.Key);
}
return r;
}
public List<string> AllTargets()
{
List<string> r = new List<string>();
foreach (KeyValuePair<string, KeyValuePair<string, string>> pair in Content)
{
r.Add(pair.Value.Value);
}
return r;
}
}

View File

@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>