0

C# で記述された同じビジネス コードを持つアプリケーションは、Windows (WPF) および Linux (GTK#、Mono) で実行されます。
UI は、Windows の場合は WPF で、Linux の場合は GTK# で別々に行われます。
両方のアプリケーションのユーザー言語は、操作中に任意のダイアログで変更可能であり、コントロール内のすべての翻訳可能なテキストを更新する必要があります。
翻訳されたファイルは、両方の部分で使用できるものとします。WPF の i18n は独自のライブラリに実装され、現在のカルチャのシングルトンを提供します。そのプロパティにはテキストが含まれています。プロパティは、XAML のバインディングで使用されます。したがって、GTK# 側にも必要な PropertyChanged イベントが存在します。また、デバッグの目的でも、Windows 上の Monodevelop でアプリケーションを実行したいと考えています。言語が変更可能/変更されている場合、開いているダイアログは 1 つだけです。

テキスト ファイルは次の形式で記述されます:
<Namespace>.<Classname>.<Property> = 翻訳済みテキスト。
翻訳されたコントロール/UI アイテムごとにコードを拡張しすぎてはなりません。
可能性は何ですか?

Windows および Linux 用の GTK# を使用した i18n を説明する適切なリンクはありますか?

4

1 に答える 1

0

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=Ω
㗔㲀䃽䄈䄙䄜礽祉...祿福囍&lt;/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=㗔㲀䃽䄈䄙䄜礽祉...祿福囍&lt;/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 デザイナーで編集できます。(奇妙なことに、パイプ文字で区切られたノード コンテンツの前にコンテキスト ヒントが付けられます。)translatableyes

  • そのようなノードの親propertyは常にwidgetノードです
  • widgetノードの属性には、ウィジェットの名前とタイプが含まれています。
  • このようなノードの親は、ルート ノードの子でないことを除いてwidget、常にノードです。child
  • childノードの親は、やはり親widgetノードです。

したがって、この非常にシンプルでスマートな構造により、どの Widget インスタンスのどのプロパティが翻訳可能で、どこにあるのかを詳細に調べることができます。

この情報を使用して、ビルド前のスクリプトと XSL ファイルを作成しました。

  1. から派生したすべてのクラスのリストを取得しGtk.BinますGtk.Window(一時的な xml ファイル)

  2. そのリストからバッチ スクリプト ファイルを作成する

  3. リスト内の各クラスに対して実行される、作成されたバッチ スクリプト ファイルを実行します。

  4. XXXXXTranslation次のようなクラスの生成:

    namespace NameSpaceXy
    {
    
      public class EntryWidgetTranslation: TranslationTemplate
      {
        [Translation(@"default title")]
        public string TitleLabel_LabelProp { get; set; }
    //..
    
  5. 次のように、単一のメソッドを含む各 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);
           //..
       }
      }
    }
    
  6. Gtk.Bin最後に、生成されたこれら 2 つのコード ファイル ( / Gtk.Window/ ...から派生したクラスごとGtk.) をプロジェクト ファイルに挿入する必要があります。これは、追加の XSLT によって行われます。

これは機能します。

利点:

翻訳が自動的に抽出されるという利点があります。Gtk.Windowegまたはから派生した新しく設計された各 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 でも実行されるでしょう。

于 2013-02-27T20:04:44.047 に答える