Gtk.stock被弃用了,还有什么选择?

lf_*_*ujo 7 gtk vala genie

我一直在学习开发Gtk,大多数在线示例都建议使用Gtk.stock图标.但是,它的使用产生警告,它已被弃用,我找不到这些图标的替代品.

代码示例如下:

    open_button:Gtk.ToolButton = new ToolButton.from_stock(Stock.OPEN)
    open_button.clicked.connect (openfile)

    new_button:Gtk.ToolButton = new ToolButton.from_stock(Stock.NEW)
    new_button.clicked.connect (createNew)

    save_button:Gtk.ToolButton = new ToolButton.from_stock(Stock.SAVE)
    save_button.clicked.connect (saveFile)
Run Code Online (Sandbox Code Playgroud)

这会产生错误:

   /tmp/text_editor-exercise_7_1.vala.c:258:2: warning: 'GtkStock' is deprecated [-Wdeprecated-declarations]
     _tmp1_ = (GtkToolButton*) gtk_tool_button_new_from_stock (GTK_STOCK_OPEN);
Run Code Online (Sandbox Code Playgroud)

哪个是替代方案以及它在上面的代码中的外观?

AlT*_*mas 8

GTK + 3已经转移到freedesktop.org 图标命名规范和国际化标签.以Gtk.Stock.OPEN为例.GTK_STOCK_OPENGNOME Developer文档提供了两个替换:

GTK_STOCK_OPEN自版本3.10起已被弃用,不应在新编写的代码中使用.使用命名图标"document-open"或标签"_Open".

命名图标方法

命名的图标方法类似于:

var open_icon = new Gtk.Image.from_icon_name( "document-open",
                                              IconSize.SMALL_TOOLBAR
                                              )
var open_button = new Gtk.ToolButton( open_icon, null )
Run Code Online (Sandbox Code Playgroud)

标签方法

label方法gettext用于将标签转换为程序的当前运行时语言.这由标签前面的下划线表示.程序中的行将是:

var open_button = new Gtk.ToolButton( null, dgettext( "gtk30", "_Open") )
Run Code Online (Sandbox Code Playgroud)

gettext使用域,这是包含翻译的文件.Gtk + 3域名是gtk30.您还需要在程序开头添加一行,以将C语言的默认语言环境(美国英语ASCII)更改为运行时环境的语言环境:

init
    Intl.setlocale()
Run Code Online (Sandbox Code Playgroud)

要编译Genie程序,您需要设置默认域gettext.通常设置为空:

valac -X -DGETTEXT_PACKAGE --pkg gtk+-3.0 my_program.gs
Run Code Online (Sandbox Code Playgroud)

当您运行程序时,您将获得翻译为您的语言环境的"_Open".您还可以更改区域设置.如果您安装了法语区域设置,则运行该程序:

LC_ALL=fr ./my_program
Run Code Online (Sandbox Code Playgroud)

将"_Open"标签显示为法语.

您可以在示例中看到_( "_OPEN" ).这_()是一个函数,dgettext但使用默认域.您可能希望将默认域保留为自己程序的转换文件.使用_( "_translate me" )是少一点打字dgettext( "mydomain", "_translate me" ).要在Genie中设置默认域,请在之前添加一行init:

const GETTEXT_PACKAGE:string = "mydomain"

init
    Intl.setlocale()
Run Code Online (Sandbox Code Playgroud)