在软件开发日益全球化的今天,Avalonia 的国际化实现策略成为了众多开发者关注的焦点。继上一篇 Avalonia 国际化之路:Resx 资源文件的深度应用与探索 之后,本文将引领大家深入探究如何运用自定义 XML 文件来达成 Avalonia 国际化的目标,开启一段全新的技术探索之旅。
1. Avalonia UIの国際化におけるXMLの利点
1.1.メンテナンスの限界を突破し、ユーザーカスタマイズを受け入れる
Resxリソースファイルはメンテナンス権限を開発側に限定する傾向がありますが、カスタムXML言語ファイルは独自の柔軟性で際立っています。実行可能プログラムとともに出力できるため、ユーザ側で言語ファイルを変更する余地が広がります。ユーザーは、既存の言語コンテンツを自分のニーズに合わせて調整できるだけでなく、より多くの言語を簡単に拡張できるため、ソフトウェアの国際適応性が大幅に向上し、開発主導からユーザー参加への移行を真に実現します。
1.2.名前空間と明確な構造。
カスタムXMLファイルは、言語コンテンツを整理するために名前空間を使用しており、この設計哲学はクラス構造と正確に対応しています。このようにして、翻訳された文書全体の構造が明確で、管理と保守が容易になります。大規模プロジェクトでの共同開発でも、コードのメンテナンスやアップグレードの後の段階でも、生産性を大幅に向上させ、構造の混乱に起因するエラーやトラブルを減らすことができます。
1.3. AI翻訳が簡単で言語変換を支援
人工知能が盛んな今日、XML文書はAI翻訳においてユニークな利点を提供しています。特定のツールやプラットフォームを使用すると、AI技術を使用してXML翻訳ファイルを簡単に処理できます。例えば、簡単なキューを提供するだけで、多言語版の翻訳結果をすばやく取得でき、多言語コミュニケーションやソフトウェアのグローバル化を強力にサポートします。
次の図は、出力されたXML言語ファイルです。

2. XMLドキュメントの作成とスキーマ設計
2.1.言語フォルダの慎重な計画
まず、“i 18 n”などの言語ファイル専用のフォルダを作成する必要があります。このプロセスでは、同じ出力パスで異なるモジュールのXMLファイル名が一意である必要があることに特に注意する必要があります。プログラムのコンパイル時に、同じ名前のXMLファイルが存在すると、ファイルの置き換えにつながり、言語情報の損失につながり、国際化プロセスに深刻な障害をもたらすことは間違いありません。
ファイル接頭辞は工程名の命名が可能であり(便利に区別できる)、接尾辞は言語文化名である
次に、言語フォルダを作成した後のエンジニアリング構造の例図を示します。

コンパイル出力後ファイルのリストは次のとおりです。
AIModule.en-US.xml
AIModule.ja-JP.xml
AIModule.zh-CN.xml
AIModule.zh-Hant.xml
ConverterModule.en-US.xml
ConverterModule.ja-JP.xml
ConverterModule.zh-CN.xml
ConverterModule.zh-Hant.xml
DevelopmentModule.en-US.xml
DevelopmentModule.ja-JP.xml
DevelopmentModule.zh-CN.xml
DevelopmentModule.zh-Hant.xml
MainModule.en-US.xml
MainModule.ja-JP.xml
MainModule.zh-CN.xml
MainModule.zh-Hant.xml
XmlTranslatorManagerModule.en-US.xml
XmlTranslatorManagerModule.ja-JP.xml
XmlTranslatorManagerModule.zh-CN.xml
XmlTranslatorManagerModule.zh-Hant.xml
2.2. XML文書の厳格な作成
以下是上面一个 XML 文件内容(AIModule.zh-CN.xml):
<?xml version="1.0" encoding="utf-8"?>
<Localization language="Chinese (Simplified)" description="中文简体" cultureName="zh-CN">
<AIModule>
<Title>AI</Title>
</AIModule>
<AskBotView>
<Title>智能问答助手</Title>
<Description>一键提问,即刻获取答案,智能问答助手为您解惑。</Description>
</AskBotView>
<PolyTranslateView>
<Title>AI一键多语种翻译神器</Title>
<Description>轻松实现一键翻译,支持多种语言互译,让沟通无界限!</Description>
</PolyTranslateView>
<Title2SlugView>
<Title>AI一键转URL Slug</Title>
<Description>轻松将中文、英文等文章标题一键转换成英文URL Slug。</Description>
</Title2SlugView>
<ChoiceLanguagesView>
<LanguageKey>语言</LanguageKey>
<Selectable>可选择的</Selectable>
<Selected>已选择</Selected>
</ChoiceLanguagesView>
</Localization>
XMLファイルのコンテンツ構造は、特定の仕様と階層に従います。情報を整理するための3層構造が推奨されます。
2.2.1.第1階層Localizationノード
このノードには、次の3つの重要なサブ属性があります。
- language 言語を明示的に指定するための名前。簡体字中国語の場合は“Chinese Simplified”などです。
- description:開発者とユーザーが言語の基本的な機能をすばやく理解できるように、“簡体字中国語”などの言語の簡単な説明。
- cultureName:言語の文化名。これは国際化において重要な識別子です。例えば、簡体字中国語の文化地域を表す“zh-CN”のように。文化名がよくわからない場合は、Baidu検索などで正確な情報を得ることができます。
以下は、基本的なXMLファイルフレームの例です。
<?xml version="1.0" encoding="utf-8"?>
<Localization language="Chinese (Simplified)" description="中文简体" cultureName="zh-CN">
<!-- 此处将填充具体的模块和语言键值对 -->
</Localization>
2.2.2.階層2機能名またはクラス名ノード
このレイヤーは、翻訳ファイルの効率的な機能分類を行うために、機能名またはクラス名でノードに名前を付けます。例えば、AIモジュール、変換モジュールなどを含むプロジェクトでは、“AIModule”、“ConverterModule”などのノードを別々に作成し、各モジュールに関連する翻訳コンテンツを対応するノードの下に配置することで、ファイル全体の構造をより明確にし、管理や検索が容易になります。
以下は、複数のモジュールノードを含むXMLファイルの例です。
<?xml version="1.0" encoding="utf-8"?>
<Localization language="Chinese (Simplified)" description="中文简体" cultureName="zh-CN">
<AIModule>
<!-- AI 模块相关的翻译内容 -->
</AIModule>
<ConverterModule>
<!-- 转换模块相关的翻译内容 -->
</ConverterModule>
</Localization>
2.2.3.レベル3:言語キーノード
最後のレイヤーは言語キーノードで、翻訳されたテキストの具体的なコンテンツを直接格納します。例えば:
<?xml version="1.0" encoding="utf-8"?>
<Localization language="Chinese (Simplified)" description="中文简体" cultureName="zh-CN">
<AIModule>
<Title>AI</Title>
</AIModule>
<AskBotView>
<Title>智能问答助手</Title>
<Description>一键提问,即刻获取答案,智能问答助手为您解惑。</Description>
</AskBotView>
</Localization>
実際のアプリケーションでは、3層構造が推奨されますが、XMLノードのネストのレベルに厳密な制限はなく、開発者はプロジェクトの実際のニーズと複雑さに応じて柔軟に調整できます。例えば:
<?xml version="1.0" encoding="utf-8"?>
<Localization language="Chinese (Simplified)" description="中文简体" cultureName="zh-CN">
<AIModule>
<Title>AI</Title>
</AIModule>
<AI>
<AskBotView>
<Title>智能问答助手</Title>
<Description>一键提问,即刻获取答案,智能问答助手为您解惑。</Description>
</AskBotView>
</AI>
<Translate>
<Baidu>
<PolyTranslateView>
<Title>AI一键多语种翻译神器</Title>
<Description>轻松实现一键翻译,支持多种语言互译,让沟通无界限!</Description>
</PolyTranslateView>
</Baidu>
<Google>
<PolyTranslateView>
<Title>AI一键多语种翻译神器</Title>
<Description>轻松实现一键翻译,支持多种语言互译,让沟通无界限!</Description>
</PolyTranslateView>
</Google>
</Translate>
</Localization>
3. 言語ファイルの強型付け戦略
XML翻訳ファイルをコード内でより便利かつ効率的に使用するために、T 4ファイルを使用してXMLをC#に変換します。具体的な操作は以下の通り
“i 18 n”ディレクトリの下にT 4ファイルを作成し、例えば“Language.tt”という名前を付け、以下のコードを入力します。
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ assembly name="System.Xml" #>
<#@ assembly name="System.Xml.Linq" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Xml.Linq" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".cs" #>
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
<#
string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
string xmlFilePath = Directory.GetFiles(templateDirectory, "*.xml").FirstOrDefault();
if (xmlFilePath!= null)
{
XDocument xdoc = XDocument.Load(xmlFilePath);
var classNodes = xdoc.Nodes().OfType<XElement>().DescendantsAndSelf().Where(e => e.Descendants().Count() == 0).Select(e => e.Parent).Distinct().ToList();
foreach (var classNode in classNodes)
{
var namespaceSegments = classNode.Ancestors().Reverse().Select(node => node.Name.LocalName);
string namespaceName = string.Join(".", namespaceSegments);
GenerateClasses(classNode, namespaceName);
}
}
else
{
Write("XML file not found, please ensure that there is an XML file in the current directory");
}
void GenerateClasses(XElement element, string namespaceName)
{
string className = element.Name.LocalName;
StringBuilder classBuilder = new StringBuilder();
classBuilder.AppendLine($"namespace {namespaceName}");
classBuilder.AppendLine("{");
classBuilder.AppendLine($" public static class {className}");
classBuilder.AppendLine(" {");
var fieldNodes = element.Elements();
foreach (var fieldNode in fieldNodes)
{
var propertyName = fieldNode.Name.LocalName;
var languageKey = $"{namespaceName}.{className}.{propertyName}";
classBuilder.AppendLine($" public static readonly string {propertyName} = \"{languageKey}\";");
}
classBuilder.AppendLine(" }");
classBuilder.AppendLine("}");
Write(classBuilder.ToString());
}
#>
XMLファイルに変更が加えられるたびに、T 4ファイルを開いて保存操作を実行するだけで、対応するC#クラスが自動的に生成または更新されます。例えば:
//...
namespace Localization
{
public static class AIModule
{
public static readonly string Title = "Localization.AIModule.Title";
}
}
namespace Localization
{
public static class AskBotView
{
public static readonly string Title = "Localization.AskBotView.Title";
public static readonly string Description = "Localization.AskBotView.Description";
}
}
//...
これらの強力な型付きクラスは、その後のコード作成に大きな利便性をもたらし、翻訳されたテキストをより正確かつ簡単に取得して使用できるようにします。
4. AvaloniaでのXMLファイルの具体的な応用
4.1.必要なNuGetパッケージのインストール
Install-Package AvaloniaXmlTranslator
このステップは、プロジェクトに必要な機能コンポーネントを導入し、その後の国際化活動の基盤を築きます。
4.2.言語リストを動的に取得
Avaloniaアプリケーションでは、プログラム設定の言語リストを動的に取得することは、インターフェースの国際化を実現するための重要なステップの1つです。以下のコードを使用すると、言語のリストを簡単に取得できます。
List<LocalizationLanguage> languages = I18nManager.Instance.Resources.Select(kvp => kvp.Value).ToList();
ここで、LocalizationLanguageクラスは次のように定義されます。
public class LocalizationLanguage
{
public string Language { get; set; } = (string) null;
public string Description { get; set; } = (string) null;
public string CultureName { get; set; } = (string) null;
//...
}
言語のリストを取得したら、ユーザーが選択できる言語オプションをドロップダウンメニューに表示したり、言語情報を表示する必要がある他のインターフェイス要素にデータバインドしたりするなど、インターフェイスバインディングに使用できます。
4.3.動的な言語切り替え
ユーザーがインターフェイス内で異なる言語を選択した後、コード内で動的に言語を切り替える必要があります。言語切り替えを実装するコード例を以下に示します。
var culture = new CultureInfo(language);
I18nManager.Instance.Culture = culture;
ここでの“language”パラメータは“LocalizationLanguage”クラスの“CultureName”プロパティ値であり、現在のスレッドの文化情報を設定することで、インターフェイス言語を瞬時に切り替え、ユーザーにシームレスな国際化体験を提供することができます。
4.4.コードでの翻訳文字列の使用
コード内では、強型キーに基づいて現在の言語文化の翻訳文字列を簡単に取得できます。例えば:
var title = I18nManager.GetString(Localization.AskBotView.Title); // 获取当前语言
var titleZhCN = I18nManager.Instance.GetResource(Localization.Main.MainView.Title, "zh-CN"); // 获取中文简体
var titleEnUS = I18nManager.Instance.GetResource(Localization.Main.MainView.Title, "en-US"); // 获取英文
これにより、コード内のどこでも翻訳テキストを柔軟に使用でき、インターフェイスに表示されるコンテンツがユーザーが選択した言語に一致するようにします。
以下はコード内のバインディングの使用です。
//...
var header = item is UserControl { DataContext: ITabItemBase tabItem }
? tabItem.TitleKey
: item?.GetType().ToString();
var newTabItem = new TabItem { Content = item };
newTabItem.Bind(TabItem.HeaderProperty, new I18nBinding(header));
regionTarget.Items.Add(newTabItem);
//...
4.5. Axamlインターフェイスでの適用
AxamlインターフェイスでXMLを使用してファイルを翻訳するのも簡単です。まず、適切な名前空間を導入する必要があります:
xmlns:language="clr-namespace:Localization"
xmlns:markup="https://codewf.com"
その中で、“markup”は以前にインストールした補助ライブラリ名前空間で、インターフェイスで翻訳テキストをバインドするための“I 18 n”マークアップ拡張ヘルプクラスを提供します。“language”は、XML言語ファイルの言語キーに関連付けることができるT 4ファイル用のC#強型付き言語キー関連クラス名前空間を生成します。
コントロールで翻訳テキストを使用する例を次に示します。
<Button
Grid.Row="3"
Grid.Column="1"
Margin="10,0,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Command="{Binding RaiseChoiceLanguagesCommand}"
Content="{markup:I18n {x:Static language:ChoiceLanguagesView.LanguageKey}}" />
上の例では、ButtonコントロールのContentプロパティは、“I 18 n”タグ拡張により、“ChoiceLanguagesView.LanguageKey”に対応する翻訳テキストにバインドされています。これにより、インタフェースの言語が変更されると、ボタンの表示テキストも自動的に対応する言語の翻訳コンテンツに更新されます。
言語指定もサポートします。
<SelectableTextBlock u:FormItem.Label="Current Thread" Text="{markup:I18n {x:Static developModuleLanguage:Title2SlugView.Title}}" />
<SelectableTextBlock u:FormItem.Label="en-US" Text="{markup:I18n {x:Static developModuleLanguage:Title2SlugView.Title}, CultureName=en-US}" />
<SelectableTextBlock u:FormItem.Label="ja-JP" Text="{markup:I18n {x:Static developModuleLanguage:Title2SlugView.Title}, CultureName=ja-JP}" />
<SelectableTextBlock u:FormItem.Label="zh-CN" Text="{markup:I18n {x:Static developModuleLanguage:Title2SlugView.Title}, CultureName=zh-CN}" />
<SelectableTextBlock u:FormItem.Label="zh-Hant" Text="{markup:I18n {x:Static developModuleLanguage:Title2SlugView.Title}, CultureName=zh-Hant}" />
さらに、Axamlインターフェイスは、次のような動的キーのバインディングをサポートしています。
<u:Banner
Classes.Bordered="{Binding Bordered}"
Content="{markup:I18n {Binding SelectedMenuItem.Description}}"
Header="{markup:I18n {Binding SelectedMenuItem.Name}}"
Type="{Binding SelectedType}" />
この例では、バナーコントロールのContentプロパティとHeaderプロパティは、それぞれ動的なSelectedMenuItem.DescriptionプロパティとSelectedMenuItem.Nameプロパティにバインドされており、“I 18 n”タグ拡張により動的に翻訳されたテキストの表示が可能になります。
5. 言語管理機能の詳細解析
为了更好地管理 XML 语言文件,站长开发了部分管理功能,包括多模块 XML 文件合并与 XML 文件编辑,可点击下载 管理工具或自行编译 工具源码,工具程序结构如下:

5.1.マルチモジュールXMLファイル結合
ツールボックスを実行したら、“XML化管理”の下の“XMLマルチモジュールファイルマージ”ノードを选択します。デフォルトでは、ツールボックス独自の“I 18 n”ディレクトリが開きます(別の言語ディレクトリを選択するには“A”をクリックします)。インターフェイスの左側にXMLファイルのリストが表示され、ファイルをクリックすると詳細が表示されます。

結合されたXMLファイルの接頭辞を“B”に入力します。デフォルトは“Localization”です。次に、“C”ボタンをクリックしてファイルマージ操作を実行します。以下は、結合後の効果例の図です。

マルチモジュールXMLファイルのマージを行う場合は、次の点に特に注意が必要です。
- マージ操作のミスによるデータの損失や破損を防ぐために、マージ前に必ずデータのバックアップを作成してください。
- マージする前に、各XMLルートノードが同じであることを確認することをお勧めします。例えば、“Localization”という名前で、マージ後のファイル構造がより標準化され、統一されたものになります。
- 異なるモジュールのXMLノードは重複を避ける必要があります。重複しないと、マージ中にデータの競合や上書きが発生する可能性があります。
マルチモジュールXMLファイルマージの原理は、実際には非常に簡単です。つまり、同じ言語サフィックスの下のXMLファイルをルートノードの下にマージし、言語データの統合と集中管理を実現します。
5.2. XMLファイルの編集
現在、XMLファイル編集機能は比較的基本的であり、既存の言語の変更のみをサポートしています。

今後の開発計画では、ウェブマスターはXMLファイル編集機能をさらに改善し、以下の機能をサポートする予定です。
- 変更可能なキー:ユーザーは既存の言語キーを変更して、プロジェクト要件の変更や誤ったキー名を修正できます。
- キーの追加、キーの削除:柔軟なキー管理機能を提供し、ユーザーは実際のニーズに応じて新しい言語キーを追加したり、使用しなくなったキーを削除したりでき、XMLファイルの内容をより正確かつ効率的にします。
- 言語の追加、言語の削除:キーの管理に加えて、新しい言語カテゴリの追加や不要な言語の削除をサポートし、XMLドキュメントの国際化サポートをさらに拡大します。
- ワンタッチ翻訳:先進的なAI翻訳技術を借りて、ワンタッチでXMLファイル中の内容を多言語に翻訳することを実現し、翻訳効率を大幅に向上させ、人間翻訳の作業量とコストを削減する。
5.3. AI翻訳の巧妙な活用
XMLファイルの翻訳プロセスでは、AI翻訳技術を巧みに活用して効率を向上させることができます。例えば、次のようなヒントを書くと:
帮我将以下的中文简体 XML 翻译文件再翻译成中文繁体、英文、日语 3 个版本,不用回复其他文字,谢谢:
```xml
<?xml version="1.0" encoding="utf-8"?>
<Localization language="Chinese (Simplified)" description="中文简体" cultureName="zh-CN">
<MainModule>
<Title>ヤード·ツールボックス</Title>
<SearchToolTip>考えてみてください</SearchToolTip>
<WeChat>タグ:codewf</WeChat>
<WeChatPublic>タグ:Dotnet9</WeChatPublic>
<DesiredAvailabilityNotification>欲しいものは何でも、教えてください。</DesiredAvailabilityNotification>
<AccessToolbox>Online Toolboxへのアクセス</AccessToolbox>
<AboutView>
<Title>Aboutについて</Title>
<Description>このプロジェクトは学習用です。</Description>
</AboutView>
</Localization>
```
上記のXMLコンテンツをAIに提供することで、対応する中国語繁体字、英語、日本語翻訳バージョンを取得でき、国際化作業に迅速かつ便利な翻訳ルートを提供し、効果が顕著で、以下の例図のように:

6. まとめと展望
ResxリソースファイルとカスタムXMLファイルは、Avaloniaの国際化の旅において、開発者が特定のニーズに基づいて選択する必要がある2つの重要な実装方法です。
6.1. Resxリソースファイルの適用可能なシーン
- プロジェクトにユーザー側の変更要件がない場合、Resxリソースファイルは、開発環境での便利な管理により、Resx Managerなどのツールを使用して効率的に操作することができ、理想的な選択です。
- 開発プロセスにおけるリソースファイル管理の効率性を重視し、ユーザーが言語内容の調整に参加する必要がないプロジェクトに対して、Resxリソースファイルは要件を満たし、プロジェクトの国際化プロセスを円滑に進めることができます。
6.2.カスタマイズXMLファイルのメリット分野
- プロジェクトにユーザー側の変更が必要な場合、カスタムXMLファイルは輝きを放ちます。ユーザーは、自分の使用シナリオや言語習慣に応じてソフトウェアの言語コンテンツを柔軟に調整することができ、ユーザーエクスペリエンスとソフトウェアの適応性を大幅に向上させます。
- 言語処理のためにAI編集が必要な場合、XMLファイルのフォーマットはAIツールとのインタラクションが容易であり、AI技術の利点を最大限に活用して効率的な翻訳と言語管理を可能にします。
- カスタムXMLファイルの名前空間編成と柔軟なノード構造は、チームコラボレーション、コード保守、プロジェクト拡張のための明確で秩序ある言語構造管理を求めるプロジェクトに強力なサポートを提供します。
この記事では、XMLファイルの作成、強い型付け、Avaloniaでの具体的なアプリケーション、言語管理機能など、カスタムXMLファイルを使用したAvaloniaの国際化の全プロセスについて詳しく説明します。同時に、豊富なコード例、詳細な手順、関連するイラストを開発者に提供し、開発者がこの国際的なソリューションを迅速に習得し、熟練して使用できるようにします。関連するリソースは以下の通りです。
- XML 语言管理包:AvaloniaXmlTranslator
- 案例 Demo 及语言管理工具:CodeWF.Toolbox
- Resx 资源管理扩展:Resx Manager
将来を見据えて、技術の継続的な発展とアプリケーションシナリオの豊かさに伴い、Avaloniaの国際化の実現方法も進化し、改善し続けます。国際開発プロセスをさらに簡素化し、ソフトウェアのグローバル品質を向上させ、ユーザーにより優れたクロス言語体験を提供する、より便利で効率的なツールやテクノロジーが登場することを期待しています。ResxリソースファイルとカスタムXMLファイルの両方が、Avaloniaの国際化プロセスを推進するために、それぞれの適用分野で重要な役割を果たし続けます。