【问题标题】:Gtk.stock is deprecated, what's the alternative?Gtk.stock 已弃用,有什么替代方案?
【发布时间】:2016-08-16 18:34:43
【问题描述】:

我一直在学习开发 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)

生成错误为:

   /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);

哪个是替代方案以及在上面的代码中看起来如何?

【问题讨论】:

  • @andlabs,你为什么不发布答案?
  • @andlabs 这应该是一个答案,而不是评论。
  • 我在回答之前先发表评论,以确保我首先得到正确的答案,而不是将答案浪费在不起作用的东西上。一旦我得到提问者的确认,我就会把它作为一个答案,可能会更加充实。 (也就是说,除非我完全确定答案。)话虽如此,如果这不是这里的做法,我会改变我的方法。

标签: gtk vala genie


【解决方案1】:

GTK+3 已移至 freedesktop.org Icon Naming Specification 和国际化标签。以 Gtk.Stock.OPEN 为例。 GNOME Developer documentation for GTK_STOCK_OPEN 提供了两个替换:

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 )

标签方法

label 方法利用gettext 将标签翻译成程序的当前运行时语言。这由标签前的下划线表示。您的程序中的行将是:

var open_button = new Gtk.ToolButton( null, dgettext( "gtk30", "_Open") )

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

init
    Intl.setlocale()

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

valac -X -DGETTEXT_PACKAGE --pkg gtk+-3.0 my_program.gs

当你运行你的程序时,你会得到翻译成你的语言环境的“_Open”。您还可以更改语言环境。如果您安装了法语语言环境,则使用以下命令运行程序:

LC_ALL=fr ./my_program

“_Open”标签将以法语显示。

您可能会在示例中看到_( "_OPEN" )_() 是类似 dgettext 的函数,但使用默认域。您可能希望为您自己的程序的翻译文件保留默认域。使用_( "_translate me" )dgettext( "mydomain", "_translate me" ) 打字少一些。要在 Genie 中设置默认域,请在 init 之前添加一行:

const GETTEXT_PACKAGE:string = "mydomain"

init
    Intl.setlocale()

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 2022-10-05
    • 2022-06-10
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2013-09-26
    相关资源
    最近更新 更多