UI 定義ファイル gui.stetic からの XSLT によるコード生成 (XAML のオプション)
私たちは非常にうまく機能するアイデアを実装しました。
GTK# の GUI 定義は XML ファイルにありますgtk-gui/gui.stetic
(WPF には XAML ファイルがあります)。アイデアは、XSLT によって追加のコード ファイルを生成することでした。
追加で生成されたコードは、Translator クラスで i18n をサポートします。Translator から派生したクラスは、カルチャが変更された場合に値を変更するプロパティを提供します。
XML ファイル内の翻訳可能な各テキストは、gtk-gui/gui.stetic
簡単に抽出できます。
<?xml version="1.0" encoding="utf-8"?>
<stetic-interface>
<!-- ... -->
<widget class="Gtk.Bin" id="NameSpaceXy.MenuWidget" design-size="800 480">
<!-- ... -->
<child>
<widget class="Gtk.VBox" id="MainVBox">
<!-- ... -->
<child>
<widget class="Gtk.Button" id="CJKButton">
<!-- ... -->
<property name="Label" translatable="yes" context="yes" comments="commented">context hint|happiness=Ω
㗔㲀䃽䄈䄙䄜礽祉...祿福囍</property>
<!-- ... -->
</widget>
<!-- ... -->
</child>
<!-- ... -->
</widget>
<!-- ... -->
</widget>
<widget class="Gtk.Button" id="ExitButton">
<!-- ... -->
<property name="Label" translatable="yes">Exit</property>
<!-- ... -->
</widget>
<!-- ... -->
<widget class="Gtk.Button" id="CJKButton">
<!-- ... -->
<property name="Label" translatable="yes" context="yes" comments="comment for translator">context hint for translator|happiness=㗔㲀䃽䄈䄙䄜礽祉...祿福囍</property>
<!-- ... -->
</widget>
<!-- ... -->
<widget class="Gtk.Image" id="KeyboardImage">
<!-- ... -->
<property name="Pixbuf">file:en-us-640x232.png</property>
<!-- ... -->
</widget>
<!-- ... -->
</stetic-interface>
GUI デザイナでは、変換可能なすべてのプロパティが XML ファイルに XML ノードとして表示され、 nameにはvalue でproperty
呼び出される属性があります。ノードのコンテンツは、翻訳可能な文字列です。さらに、このような各要素は、翻訳者向けのコメントとコンテキスト ヒントで装飾できます。これら 2 つのフィールドは、プロパティ ウィンドウを介して UI デザイナーで編集できます。(奇妙なことに、パイプ文字で区切られたノード コンテンツの前にコンテキスト ヒントが付けられます。)translatable
yes
- そのようなノードの親
property
は常にwidget
ノードです
- 各
widget
ノードの属性には、ウィジェットの名前とタイプが含まれています。
- このようなノードの親は、ルート ノードの子でないことを除いて
widget
、常にノードです。child
- 各
child
ノードの親は、やはり親widget
ノードです。
したがって、この非常にシンプルでスマートな構造により、どの Widget インスタンスのどのプロパティが翻訳可能で、どこにあるのかを詳細に調べることができます。
この情報を使用して、ビルド前のスクリプトと XSL ファイルを作成しました。
から派生したすべてのクラスのリストを取得しGtk.Bin
ますGtk.Window
(一時的な xml ファイル)
そのリストからバッチ スクリプト ファイルを作成する
リスト内の各クラスに対して実行される、作成されたバッチ スクリプト ファイルを実行します。
XXXXXTranslation
次のようなクラスの生成:
namespace NameSpaceXy
{
public class EntryWidgetTranslation: TranslationTemplate
{
[Translation(@"default title")]
public string TitleLabel_LabelProp { get; set; }
//..
次のように、単一のメソッドを含む各 Gtk Widget クラスの部分クラスの生成:
namespace NameSpaceXy
{
public partial class EntryWidget: ITranslateMethod
{
public void Translate()
{
GtkUtility.SetLabel(TitleLabel, Translator.Translation<EntryWidgetTranslation>().TitleLabel_LabelProp);
GtkUtility.SetImage(KeyboardImage, Translator.Translation<EntryWidgetTranslation>().KeyboardImage_Pixbuf);
//..
}
}
}
Gtk.Bin
最後に、生成されたこれら 2 つのコード ファイル ( / Gtk.Window
/ ...から派生したクラスごとGtk.
) をプロジェクト ファイルに挿入する必要があります。これは、追加の XSLT によって行われます。
これは機能します。
利点:
翻訳が自動的に抽出されるという利点があります。Gtk.Window
egまたはから派生した新しく設計された各 UI クラスGtk.Bin
は、各ビルドで自動的に処理されます。このタイプの i18n は、適合された XSL ファイルを使用して WPF に適合させることができます。
不利益:
生成されたメソッドTranslate()
は、必要に応じて Gtk# で呼び出す必要があります。少なくとも要素が表示されている場所と、要素が表示されている場合は言語/カルチャを変更する場所です。(WPF/XAML はTranslate
バインディング機能があるため、メソッドは必要ありません)。
翻訳者
Translator クラスは自社の内部実装であり、現在のセット カルチャに適した文字列を提供します。ここでは、そのカルチャの XML ファイルを内部的に読み取ります。Unicode の利点と改行/複数行文字列の追加により、言語ファイルを XML ファイルに変更しました。これは、シリアライズされた Dictionary インスタンスになりました。
ピクチャー
gui.stetic
カルチャに依存する画像も追加しました。これは、この部分的な XPath 式を使用して、呼び出された XML ファイルから簡単に抽出できますproperty[@name='Pixbuf'][../@class='Gtk.Image']
。
環境
Windows で MonoDevelop を実行MsXsl.exe
し、バッチ スクリプトで使用します。おそらく、他の XSLT プロセッサを使用する Linux でも実行されるでしょう。