在GTK中,如何在UI运行时更改UI上的本地化语言文本?

时间:2010-10-15 06:28:02

标签: linux internationalization gtk

在Linux中,是否可以动态更改使用GTK创建的UI语言?我有一个需要动态更改UI语言的应用程序。

4 个答案:

答案 0 :(得分:1)

您必须销毁所有窗口小部件并使用新的区域设置重建它们,或者手动将所有字符串更改为其已翻译的等效项。最好用gettext执行此操作。

许多应用程序选择不在应用程序内提供UI语言的设置。相反,他们只是遵循系统语言设置。

答案 1 :(得分:0)

当然可以,你只需要做一些工作。

例如,如果您使用的是c#,则首先需要确保所有可翻译的项都包含在Mono.Unix.Catalog.GetString函数中。一个典型的标签,看起来像这样:

Gtk.Label label1 = new Gtk.Label(Mono.Unix.Catalog.GetString("Monkey Juice"));
Gtk.Label label2 = new Gtk.Label(Mono.Unix.Catalog.GetString("Squirrel Love"));

执行此操作时,只要您拥有正确的翻译文件(.po文件),您就可以在当前语言环境中启动应用程序。现在,如果要从应用程序中更改语言环境,只需要有一个执行此操作的函数:

void ChangeToJapanese() {
     System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(" ja_JP");
     System.Threading.Thread.CurrentThread.CurrentCulture = ci;
     label1.Text = Mono.Unix.Catalog.GetString("Monkey Juice");
     label2.Text = Mono.Unix.Catalog.GetString("Squirrel Love");
}

现在,您的应用程序应该更改,以便您的标签显示猿ジュース和リスの爱。

答案 2 :(得分:0)

我按照以下步骤动态更改语言:

1)创建一个包含翻译键值对的.po文件:

msgid "Yes"
msgstr "Ja"

2)使用msgfmt获取.mo文件,该文件必须移动到语言环境的correspongin LC_MESSAGES文件夹中(例如/ usr / share / locale / de / LC_MESSAGES):

msgfmt myapp.po - o myapp.mo

3)将此文件绑定到应用程序:

    #define ENABLE_NLS

#ifdef ENABLE_NLS


    #include <libintl.h>
        #include <locale.h>
        #define PACKAGE_LOCALE_DIR "/usr/share/locale" 
        #define GETTEXT_PACKAGE    "myapp"              // mo file name in LOCALE

        #  undef _
        #  define _(String) dgettext (GETTEXT_PACKAGE, String)
        #  ifdef gettext_noop
        #    define N_(String) gettext_noop (String)
        #  else
        #    define N_(String) (String)
        #  endif

#else
#  define textdomain(String) (String)
#  define gettext(String) (String)
#  define dgettext(Domain,Message) (Message)
#  define dcgettext(Domain,Message,Type) (Message)
#  define bindtextdomain(Domain,Directory) (Domain)
#  define _(String) (String)
#  define N_(String) (String)
#endif

4)每当必须更改语言时,请调用以下方法:

if(setlocale(LC_ALL, language)==NULL)
{
  printf("--> changeLAnguage: ERROR !!!\r\n");
    return false;
}

setenv("LANGUAGE", language, true);
setenv("LANG", language, true);
setenv("LC_ALL", language, true);
setenv("LC_MESSAGES", language, true);
setlocale(LC_ALL, "");

5)使用po文件中的msgids设置标签文本:

SetTextOfLabel("label1", _(MSG_ID_1));

- &GT;例如gtk_label_set_text(GTK_LABEL(插件),STR);

HTH

答案 3 :(得分:0)

您可以使用NAppGUI,它支持Windows(WinAPI),macOS(Cocoa)和Linux(Gtk)中的运行时转换。

http://nappgui.com/es/demo/products.html#h4.5