在Linux中,是否可以动态更改使用GTK创建的UI语言?我有一个需要动态更改UI语言的应用程序。
答案 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)中的运行时转换。