首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类似于GTK#的情况下,使用i18N的可能性是什么?

在类似于GTK#的情况下,使用i18N的可能性是什么?
EN

Stack Overflow用户
提问于 2012-09-11 14:12:25
回答 1查看 300关注 0票数 0

使用C#编写的具有相同业务代码的应用程序应在Windows (WPF)和Linux (GTK#,Mono)下运行。

UI将分别与Windows的WPF和Linux的GTK#一起完成。

两个应用程序的用户语言在任何对话框中的操作过程中都应该是可更改的,并更新控件中的所有可翻译文本。

翻译后的文件应可用于两个部分。WPF的i18n是在自己的库中实现的,它为当前区域性提供一个单例,其属性包含文本。这些属性在XAML的绑定中使用。因此,我们希望在GTK#端也有一个PropertyChanged事件。我们还希望在Windows上的Monodevelop中运行该应用程序,以便进行调试。如果语言是可更改/更改的,则只有一个对话框打开。

文本文件的编写方式为:

。。=翻译的文本。

代码不应对每个翻译的控件/UI项进行过多扩展。

可能性是什么?

有没有一个很好的链接来描述i18n和GTK# for Windows和Linux?

EN

回答 1

Stack Overflow用户

发布于 2013-02-28 04:04:44

从UI定义文件gui.stetic通过XSLT生成代码(XAML的选项)

我们实现了一个想法,效果很好。

GTK#中的图形用户界面定义在XML文件gtk-gui/gui.stetic中(WPF有XAML文件)。这个想法是通过XSLT生成额外的代码文件。

额外生成的代码通过我们的Translator类支持i18n。来自Translator的派生类提供属性,如果区域性发生更改,这些属性会更改其值。

XML文件gtk-gui/gui.stetic中每个可以翻译的文本都很容易提取出来:

代码语言:javascript
复制
<?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 designer中,所有可以转换的属性都将在XML文件中显示为一个名为property的XML节点,该节点有一个名为translatable的属性,值为yes。节点的内容是可以翻译的字符串。此外,每个这样的元素都可以用注释和上下文提示来修饰翻译器-这两个字段可以通过属性窗口在UI设计器中进行编辑。(奇怪的是,上下文提示是节点内容的前缀,由竖线字符分隔。)

  • 此类property节点的父节点始终是widget节点
  • 每个widget节点都包含其节点中的child的名称和类型此类widget节点的父节点始终是child节点-除非它不是根节点的子节点。<代码>H217<代码>H118每个<代码>D19节点的父节点也是父节点。<代码>H221<代码>F222

因此,这个非常简单和智能的结构让我们可以找到哪个Widget实例的哪个属性是可翻译的,以及在哪里可以找到它的详细信息。

使用这些信息,我构建了预编译脚本和XSL文件,它们:

  1. 获取从Gtk.BinGtk.Window (临时xml文件)

派生的所有类的列表

  1. 根据

列表创建批处理脚本文件

  1. 执行创建批处理脚本文件,该文件针对列表中的每个类执行:

  1. 生成的XXXXXTranslation类,如下所示:

命名空间NameSpaceXy {公共类EntryWidgetTranslation: TranslationTemplate {翻译(@“默认标题”)公共字符串TitleLabel_LabelProp { get;set;} //..

  1. 为每个Gtk Widget类生成分部类,其中包含单个方法,如下所示:

命名空间转换{公共分部类EntryWidget: ITranslateMethod { public void NameSpaceXy (){ GtkUtility.SetLabel(TitleLabel,Translator.Translation().TitleLabel_LabelProp);GtkUtility.SetImage(KeyboardImage,KeyboardImage //..}

  1. 最后这两个生成的代码文件(每个类,都是从Gtk.Bin/Gtk.Window/Gtk....)派生的必须插入到项目文件中-这是由另一个XSLT完成的。

这是可行的。

优势:

它的优点是,翻译是自动提取的。在每次构建时,自动处理从例如Gtk.WindowGtk.Bin派生的每个新设计的UI类。这种类型的i18n可以通过改编的XSL文件来改编成WPF。

缺点:

在适当的情况下,必须在Gtk#中调用生成的方法Translate(),如果元素可见,则至少在元素显示的位置调用,并在更改语言/区域性时调用。(由于其绑定功能,WPF/XAML将不需要Translate方法)。

翻译器

Translator类是自己的公司内部实现,它为当前设置的区域性提供正确的字符串-在这里内部读取该区域性的XML文件。由于Unicode的优势和添加换行符/多行字符串的优势,我们将语言文件更改为XML文件。它现在是一个序列化的Dictionary实例。

图片

我们还添加了依赖于文化的图片,可以使用这个部分XPath expression property[@name='Pixbuf'][../@class='Gtk.Image']轻松地从名为XML的gui.stetic文件中提取图片。

环境

我在Windows中运行MonoDevelop,并在批处理脚本中使用MsXsl.exe,它可能也可以在使用其他XSLT处理器的Linux中运行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12363723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档