<

}

这 里我们看到,同样的, 把 input 中我们输入的 string 扔给 string. 下面就用到了 QTextCodec 了.我们可以把

QTextCodec *codec=QTextCodec::codecForName("big5"); 写成两行,这样比较方便看:

代码:

QTextCodec *codec;

codec=QTextCodec::codecForName("big5");

第一行是通过 QTextCodec 建立 codec 第二行呢,告诉 QT 我们的 codec 是用 big5 编码的. (简体中文就要用 gb2312)

最 后,我们通过 codec->formUnicode(string) 把 Unicode 转换成我们需要用的 big5 码. ( QT

default 全部是用 Unicode,这也就是为什么开始的时侯,如果我们没有通过 QTextCodec 转码,看到的中文都是 ?? 了.因为

Unicode 的标准就是不认得的 code 一律用 ?? 来表示)最后我们定义一个 QCString chinese_string,

代码:

QCString chinese_string=codec->fromUnicode(string);

而 chinese_string就是已经被 codec 转码过的 big5 code 的了. codec->fromUnicode(string) 这里是做转码的动作.

现在重新 make 所 build 出来的 chinese 就已经具备了最基本的中文程序的要求了.现在在输入中文到程序中,您就可以在 X 终端模拟中看到中文了.

那么这个程序已经具备了中文处理能力,为什么还被叫做最基本的呢中文处理呢?因为我们的程序目前并不会判断 locale, 而自动设定相应的编码.现在我们把这个 chinese 的程序作成一个相对完整的中文程序.

QTextCodec 中还给我们提供了一个读取当然于言环境的 function 叫做 locale. QTextCodec::locale() 就会返回当前使用者的 locale. 现在让我们来看看一个相对完整的中文程序:

Tips: 这个程序中对 locale 名称的定义 是按照 RedHat 7.3 中对中文 locale 的定义为标准的,也就是说: 繁体中文 : zh_TW.Big5 简体中文 : zh_CN.GB2312

代码:

/* chinese.h */

#include

#include

#include

#include

#include

class Chinese: public QWidget

{

Q_OBJECT

public:

Chinese();

private:

QLabel *label;

QLineEdit *input;

QString locale;

private slots:

void display();

};

我们这里加入了一个新的 QString locale, 用来做 locale 的判断.

代码:

/* chinese.cpp */

#include "chinese.moc"

#include

#include

Chinese::Chinese()

{

resize(200,100);

QTranslator translator(this);

locale=QTextCodec::locale();

translator.load("chinese."+locale, ".");

qApp->installTranslator(&translator);

label=new QLabel(tr( "Input Line:"), this);

label->setGeometry(10,10,90,30);

input=new QLineEdit(this);

input->setGeometry(10, 40, 180, 30);

input->setFocus();

connect(input, SIGNAL(returnPressed()), this, SLOT(display()));

}

void Chinese::display()

{

QString string;

string=input->text();

QTextCodec *codec;

if (locale == "zh_TW.Big5")

codec=QTextCodec::codecForName("big5");

if (locale == "zh_CN.GB2312")

codec=QTextCodec::codecForName("gb2312");

QCString encoded_string=codec->fromUnicode(string);

cout<<

}

在 chinese.cpp 里面, Chinese::Chinese 我们加入 locale 的判断. 从而自动加载相应的 .qm 文件.

locale=QTextCodec::locale() 就把 QTextCodec 返回的值,也就是当前使用的 locale 传给了

locale. (locale 是一个 QString)然后我们用 translator.load("chinese."+locale,

"."); 实际上就是说 chinese.+当然 locale (zh_TW.Big5 或者 zh_CN.GB2312)也就是说,最后我们加载的

locale 是 chinese.zh_TW.Big5 或者是 chinese.zh_CN.GB2312. 这样只要对应不同的 locale

环境翻译不同的 .po 然后制作成基于 locale 名称的 qm, QT 就可以帮我们自动判断在哪个locale 要加载那个文件了.

(chinese.zh_TW.Big5.qm 或者 chinese.zh_CN.GB2312.qm)

Tips: QT 在载入 .qm 文件的时侯,如果该文件不存在.那么 就会用程序中的语言来显示.所以不需要为了程序是否 可以找到该 .qm 文件而担心.(不用去写 这方面的 error handle)

而 在 void Chinese::display() 中,我们也做一个自动的判断,用来判断使用者是在哪个中文环境中输入中文的. 如果是

zh_TW.Big5 我们就把转码设定为 big5, 如果是 GB2312 就设定为 gb2312. 而如果是其它的,就忽略不管了.

同时在修改一下我们的 Makefile

代码:

INCL= -I$(QTDIR)/include -I/usr/include/kde

CFLAGS= -pipe -O2 -fno-strength-reduce

LFLAGS= -L$(QTDIR)/lib -L$(KDEDIR)/lib -L/usr/X11R6/lib

LIBS= -lkdecore -lkdeui -lqt -lX11 -lXext -ldl

CC=g++

MOC=moc

chinese: chinese.moc chinese.o main.o

$(CC) $(LFLAGS) -o chinese chinese.o main.o $(LIBS)

chinese.moc: chinese.h

$(MOC) chinese.h -o chinese.moc

main.o: main.cpp

chinese.o: chinese.cpp

po:

findtr3 chinese.cpp > chinese.zh_TW.Big5.po

findtr3 chinese.cpp > chinese.zh_CN.GB2312.po

qm:

msg2qm2 chinese.zh_TW.Big5.po chinese.zh_TW.Big5.qm

msg2qm2 chinese.zh_CN.GB2312.po chinese.zh_CN.GB2312.qm

clean:

rm -f *.o

rm -f *.bak

rm -f *.moc

rm -f chinese

.SUFFIXES: .cpp .h

.cpp.o:

$(CC) -c $(CFLAGS) $(INCL) -o $@ $<

在 Makefile 中加入 po 和 qm. 这样我们用 make po 就会产生 chinese.zh_TW.Big5.po 和

chinese.zh_CN.GB2312.po 了.把这两个 po 翻译好以后.用 make qm 就会做出

chinese.zh_TW.Big5.qm 和 chinese.zh_CN.GB2312.qm 这两个 qm 文件.现在试试看.在简体或者繁体的

X 终端模拟环境下.我们的程序会自动的显示相应的翻译信息.也会自动接受相应 locale 下面的中文输入法了.

GTK+

在 Linux 下面,还有一个常用的 GUI 环境开发语言.就是GTK+ 了. 大家都知道, gnome 这套桌面环境就是由 GTK+ 开发出来的. 现在我们来看看 GTK+ 如何处理中文.

Tips: 这里我们以 GTK 1.x 为例. (因为 GTK 2.x 目前 还不算是非常的稳定)

Tips: 如果您希望在自己的计算机中编译本文中的范例, 您需要安装 gcc, gtk+, gtk+-devel, make , gettext, 这些套件.

首先我们先来用 GTK 写一个跟前面 QT 中的那个程序功能完全一样的程序.

代码:

/* chinese.c */

#include

#include

void display (GtkWidget *widget, GtkWidget * entry)

{

const gchar *entry_text;

entry_text=gtk_entry_get_text( GTK_ENTRY (entry));

printf ("%s\n", entry_text);

}

void destroy(GtkWidget *widget, gpointer *data)

{

gtk_main_quit();

}

int main(int argc, char *argv[])

{

GtkWidget *window;

GtkWidget *vbox;

GtkWidget *entry;

GtkWidget *label;

gtk_init(&argc, &argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy),NULL);

gtk_container_border_width(GTK_CONTAINER(window),10);

vbox = gtk_vbox_new (FALSE, 0);

gtk_container_add (GTK_CONTAINER (window), vbox);

gtk_widget_show(vbox);

label= gtk_label_new("Input Line");

gtk_box_pack_start(GTK_BOX (vbox), label, TRUE, TRUE, 0);

gtk_widget_show(label);

entry= gtk_entry_new();

gtk_signal_connect(GTK_OBJECT(entry), "activate",

GTK_SIGNAL_FUNC(display), entry);

gtk_box_pack_start(GTK_BOX (vbox), entry, TRUE, TRUE, 0);

gtk_widget_show(entry);

gtk_widget_show(window);

gtk_main();

return 0;

}

里 面的 void display() 就相当于前面 QT 中的 void Chinese::display()

是用来把我们输入的东西显示在您的 X 终端模拟上面的. 我们首先通过 gchar 来定义一个 entry_text, 然后用

gtk_entry_get_text(GTK_ENTRY())来把我们输入的东西抓出来,放到 entry_text 中去.再用 C 语言中的

printf 把它显示在我们的 X 终端模拟上面.

void destory() 告诉程序,如果收到程序结束的信号,(例如你按了窗口中的那个小 X )那么就代表程序结束. 退出 gtk 的 main loop.

我 们的 main 程序中. 定先义了 window, vbox, entry, label 这己个物件.这里面, window,

就是我们看到的主窗口. vbox 是 gtk+ 中一种用来排列对象的东西. entry 是给我们输入用的(QT 中的

QLineEdit)lable 是作为显示一个信息而用的. (QT 中的 QLabel)

gtk_init() 帮我们初始化 gtk.

window=gtk_window_new 就通过 gtk_window_new 把 window 定一为一个新的窗口.也就是我们的主窗口了.

GTK_WINDOW_TOPLEVEL 则告诉程序,我们的这个主窗口显示的时侯,是在最上面的. ( TOPLEVEL)

gtk_signal_connect(GTK_OBJECT(window), "destroy",

GTK_SIGNAL_FUNC(destroy),NULL); 这一行,首先我们连接一个 gtk 的信号, 对象是在 window 上面.

信号的内容为 destroy, 当收到这个信号以后,用 GTK_SIGNAL_FUNC() 去呼叫 destroy() 这个 function .

传给 function 的值为 NULL. 也就是说,当我们的主窗口 window 接收到遗个 destroy 的信号的时侯, 去呼叫

destroy() 结束 gtk 程序. 这里的 destroy 信号就是代表你关闭主窗口的意思. 在 gtk 中,当你关闭了一个窗口, gtk

就会帮你送出一个 destroy 的信号.

gtk_container_border_width(GTK_CONTAINER(window),10); 定义了我们的主窗口的 border(边缘)宽度为 10.

vbox = gtk_vbox_new (FALSE, 0); 定义了一个新的 gtk_vbox 出来.用来排列我们放在主窗口中的对象.

gtk_container_add (GTK_CONTAINER (window), vbox); 就把 vbox 通过 gtk_container_add 加入到我们的主窗口 window 中.

gtk_widget_show(vbox); 通过呼叫 gtk_widget_show 在主窗口中显示我们的 vbox

label= gtk_label_new("Input Line"); 通过 gtk_label_new 定义一个 label,而这个 label 显示的内容为 "Input Line"

gtk_box_pack_start(GTK_BOX (vbox), label, TRUE, TRUE, 0); 是通过 gtk_box_pack_start 把 label 放到我们前面生成的 vbox 中.

gtk_widget_show(label); 再次利用 gtk_widget_show, 这次是在 vbox 中显示我们新加入的 label.

entry = gtk_entry_new(); 用 gtk_entry_new 定义了一个 entry. 这里就是指产生一个可以接受文字输入的对象,就好像 QT 中的 LineEdit 一样.

gtk_signal_connect(GTK_OBJECT(entry), "activate",

GTK_SIGNAL_FUNC(display), entry); 这里,我们连接一个 gtk 信号,信号作用于

entry,也就是我们前面产生的那个文字输入对象.当我程序接收到 "activate" 这个信号的时侯,就去呼叫 display() 这个

function, 同时把 entry 传给 display(). 这里的 activate 信号,就是当我们按下键盘的 enter

键时所产生的. gtk 当适用者按下 enter 键的时侯,就会送初一个 activate 的信号.所以当我们输入一些文字以后,按下 enter

键,这些文字就会被送到 display() 去处理了.

gtk_box_pack_start(GTK_BOX (vbox), entry, TRUE, TRUE, 0); 再次用 gtk_box_pack_start 把对象 entry 加入到 vbox 中.

gtk_widget_show(entry); 显示 vbox 中的对象 entry

gtk_widget_show(window);

gtk_main();

最后我们显示我们的主窗口.并且进入 gtk 的 main loop.

Tips: 这里我们利用 gtk_widget_show() 先显示了 window 中的 vbox, label, entry,

最后才去显示主窗口 window 是因为这样的话,当主窗口 window 显示出来的时侯. vbox, label, entry 已经比

window 先显示好了.这样我们看到的 就是一个整体的 window. 有主窗口,有 label 和 entry. vbox, label,

entry 都是在主窗口显示以前就已经画好的了. 所以主窗口一出来,不用等待 label, entry 的出现. 如果先去显示 window,

再去显示 vbox, label, entry, 那么在比较慢的计算机上面(或者你的程序比较复杂的情况下)

你将会先看到一个空白的主窗口出现,然后再慢慢的画出 label 和 entry 来.

现在来看一下我们的 Makefile

代码:

INCL= -I/usr/lib/glib/include/ -I/usr/include/gtk-1.2/gdk/ -I/usr/include/gtk-1.2/ \

-I/usr/include/glib-1.2/

LIBS= -L/usr/X11R6/lib

LFLAGS= -lglib -lgdk -lgtk -lX11 -lXext -lm

CC=gcc

chinese: chinese.c

$(CC) $(INCL) -o chinese chinese.c $(LIBS) $(LFLAGS)

clean:

rm -f chinese

rm -f *.bak

.SUFFIXES: .c

.c.o:

$(CC) -c $(CFLAGS) $(INCL) -o $@ $<

写 好 Makefile 以后. make 一下,就可以编译出 GTK+ 版的 chinese 了.执行以后,

我们可以发现,在可以输入文字的地方,直接输入中文,就可以在 X 终端模拟中正确的显示出来中文. 所以我们需要的,就只有把接口中文化一下就好了.

中文化 gtk+ 程序的时侯,会比 QT 稍稍麻烦些.

代码:

#include

#include

#include

#include

#define PACKAGE "chinese"

#define LOCALEDIR "/home/goldencat/program/gtk/chinese/final"

#define _(STRING) gettext(STRING)

void display(GtkWidget *widget, GtkWidget * entry)

{

const gchar *entry_text;

entry_text=gtk_entry_get_text( GTK_ENTRY (entry));

printf ("%s\n", entry_text);

}

void destroy(GtkWidget *widget, gpointer *data)

{

gtk_main_quit();

}

int main(int argc, char *argv[])

{

GtkWidget *window;

GtkWidget *vbox;

GtkWidget *entry;

GtkWidget *label;

gtk_set_locale();

bindtextdomain (PACKAGE, LOCALEDIR);

textdomain (PACKAGE);

gtk_init(&argc, &argv);

window=gtk_window_new(GTK_WINDOW_TOPLEVEL);

gtk_signal_connect(GTK_OBJECT(window), "destroy", GTK_SIGNAL_FUNC(destroy),NULL);

gtk_container_border_width(GTK_CONTAINER(window),10);

vbox = gtk_vbox_new (FALSE, 0);

gtk_container_add (GTK_CONTAINER (window), vbox);

gtk_widget_show(vbox);

label= gtk_label_new(_("Input Line"));

gtk_box_pack_start(GTK_BOX (vbox), label, TRUE, TRUE, 0);

gtk_widget_show(label);

entry= gtk_entry_new();

gtk_signal_connect(GTK_OBJECT(entry), "activate",

GTK_SIGNAL_FUNC(display), entry);

gtk_box_pack_start(GTK_BOX (vbox), entry, TRUE, TRUE, 0);

gtk_widget_show(entry);

gtk_widget_show(window);

gtk_main();

return 0;

}

首 先我们需要 locale.h 和 libintl.h 然后还要定义 PACKAGE, LOCALEDIR 这里的 PACKAGE

就是我们翻译后的 mo 文件的名称. 这里把它定义为 chinese 因为我们的程序就叫做 chinese, GTK+ 会在固定的地方寻找 mo

文件.在 RedHat 7.3 中,会在 /usr/share/locale/你的locale/LC_MESSAGES 下面寻找 mo 文件.

对于中文来说,也就是 /usr/share/locale/ 下面的 zh_TW zh_TW.Big5 zh_CN zh_CN.GB2312

这几个目录中的 LC_MESSAGES 下面.去寻找 mo 文件.

这里我们去定义 LOCALEDIR 就是告诉 gtk+ 我们希望 gtk+ 到哪里去寻找 mo 文件.

/home/goldencat/program/gtk/chinese/final 就是 chinese.c

的位置.也就是我们的当前工作目录.这样 gtk+ 就不会再去 /usr/share/locale/ 下面找相应语言环境中的

LC_MESSAGES 中寻找 mo 文件了. 而是在您 LOCALEDIR 中定义的位置.(配合 bindtextdomain 使用)

而 后面的 #define _(STRING) gettext(STRING) 只是说把 gettext(STRING)换成 _(STRING)

gettext 就好像前面 QT 中的那个 tr 一样.在产生 po 文件的时侯,就是根据 gettext

来决定哪些信息是需要翻译的.只不过每个需要翻译的信息都把 ("English String") 改成 (gettext("English

String")) 未免有些麻烦.所以 GTK+ 中,大家都把 gettext(STRING) 换成 _(STRING), 这样我们就只需要

(_("English String") 就可以了.

Tips: 如果您在您的计算机中编译这些东西,请记得把 #define LOCALEDIR "/home/goldencat/program/gtk/chinese/final" 改换成您自己的工作目录

在 gtk_init() 之前,我们需要告诉 gtk 我们有翻译的信息.所以要有下面三个动作:

gtk_set_locale();

bindtextdomain (PACKAGE, LOCALEDIR);

textdomain (PACKAGE);

get_set_locale() 告诉 gtk 去找我们现在用的 locale (QT 中的 TextCodec::locale())这样 gtk+ 就会自动判断出当前 locale 的环境,然后去相应的环境下面找 mo 文件.

bindtextdomain() 则是告诉 gtk 去哪里找 mo 文件. 这里我们要它去我们定义的 LOCALEDIR 下面找 PACKAGE (chinese)

textdomain() 就是载入翻译的信息啦.

最后就是把 label= gtk_label_new("Input Line"); 改成 label= gtk_label_new(_("Input Line")); 这样 xgettext 就可以找到需要翻译的信息了.

现在我们就算是完成了程序这边对中文化的支持了. gtk+ 需要用 xgettext 来产生 po 文件的.所以我们用:

xgettext -k_ chinese.c -o chinese.po

这里的 -k_ 就是说 keywork 是 _ ,也就是说 xgettext 会去找程序中的 _(STRING) 出来. 现在打开 chinese.po 看看:

代码:

# SOME DESCRIPTIVE TITLE.

# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER

# This file is distributed under the same license as the PACKAGE package.

# FIRST AUTHOR , YEAR.

#

#, fuzzy

msgid ""

msgstr ""

"Project-Id-Version: PACKAGE VERSION\n"

"POT-Creation-Date: 2002-06-23 17:44-0400\n"

"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"

"Last-Translator: FULL NAME \n"

"Language-Team: LANGUAGE \n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=CHARSET\n"

"Content-Transfer-Encoding: 8bit\n"

#: chinese.c:38

msgid "Input Line"

msgstr ""

跟翻译 QT 的 po 一样,我们真正需要动到的只有 charset 和 msgstr "

" 而已.当然,您也可以加入相应的翻译信息,

PO-Revision-Date: 翻译时间

"Last-Translator: 翻译人 翻译人_E-Mail地址

Language-Team: 翻译团队 翻译团队_E-Mail_地址

下面是翻译好的 po

代码:

# SOME DESCRIPTIVE TITLE.

# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER

# This file is distributed under the same license as the PACKAGE package.

# FIRST AUTHOR , YEAR.

#

#, fuzzy

msgid ""

msgstr ""

"Project-Id-Version: PACKAGE VERSION\n"

"POT-Creation-Date: 2002-06-23 17:44-0400\n"

"PO-Revision-Date: 2002-06-23 14:45-0400\n"

"Last-Translator: Goldencat &l;ruili@worldnet.att.net>\n"

"Language-Team: LANGUAGE &l;ruili@worldnet.att.net>\n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=Big5\n"

"Content-Transfer-Encoding: 8bit\n"

#: chinese.c:38

msgid "Input Line"

msgstr "中文输入"

存档以后.我们用:

msgfmt -o chinese.mo chinese.po

生成 mo 文件.

跟 QT 不同的是, GTK+ 不是通过判断 mo 名子来载入不同的的 mo 的. 在 GTK+ 下面.任何 locale (语言环境)的 mo

名子都叫做 chinese.mo 那么 GTK+ 是如何分辨不同的 locale 需要加载相对语言的 mo 呢? GTK+ 是通过把不同的

mo 放在不同的目录下,然后通过判断目录名称来找到相应的 mo 文件的. 所以存放 GTK+ mo 文件的目录名,需要跟相应的 locale

一致. GTK+ 就会在这个目录下的 LC_MESSAGES 中找到所需要的 mo 文件了. 所以我们首先需要在当前目录下做出相应的存放 mo

文件的目录.

$mkdir zh_TW

$mkdir zh_TW/LC_MESSAGES

$cp -r zh_TW zh_TW.Big5

$cp -r zh_TW zh_CN

$cp -r zh_TW zh_CN.GB2312

这样我们就有了中文所需要的四个最基本的目录了. 现在我们把 chinese.mo 放到相应的目录下面

$cp chinese.mo zh_TW/LC_MESSAGES

$cp chinese.mo zh_TW.Big5/LC_MESSAGES

然后在做一份 GB2312 的 mo 放在 zh_CN 和 zh_CN.GB2312

实 际上,在 RedHat7.3 中, export LANG=zh_TW.Big5

情况下(LC_MESSAGES=zh_TW.Big5)GTK+ 会在 zh_TW/LC_MESSAGES 下面寻找 mo 文件. 而

export LANG=zh_CN.GB2312 的情况下(LC_MESSAGES=zh_CN.GB2312)GTK+ 则是在

zh_CN.GB2312/ LC_MESSAGES 下面寻找 mo 文件.

现在试试在不同的 locale 运行一下 ./chinese 您会看到, 程序已经被中文化了.那个 Input Line 已经换成中文的 "中文输入" 了.

最后,我们再来改一下我们的 Makefile, 帮助我们产生 po, mo 并且放到相应的语言目录下.

代码:

INCL= -I/usr/lib/glib/include/ -I/usr/include/gtk-1.2/gdk/ -I/usr/include/gtk-1.2/ \

-I/usr/include/glib-1.2/

LIBS= -L/usr/X11R6/lib

LFLAGS= -lglib -lgdk -lgtk -lX11 -lXext -lm

CC=gcc

chinese: chinese.c

$(CC) $(INCL) -o chinese chinese.c $(LIBS) $(LFLAGS)

clean:

rm -f chinese

rm -f *.bak

po:

xgettext -k_ chinese.c -o chinese_big5.po

xgettext -k_ chinese.c -o chinese_gb2312.po

mo:

msgfmt -o chinese_big5.mo chinese_big5.po

msgfmt -o chinese_gb2312.mo chinese_gb2312.po

mo_install:

cp chinese_big5.mo zh_TW/LC_MESSAGES

cp chinese_big5.mo zh_TW.Big5/LC_MESSAGES

cp chinese_gb2312.mo zh_CN/LC_MESSAGES

cp chinese_gb2312.mo zh_CN.GB2312/LC_MESSAGES

.SUFFIXES: .c

.c.o:

$(CC) -c $(CFLAGS) $(INCL) -o $@ $<

C/C++

其是在 C/C++ 的一般程序中,也是可以中文化的. 在 C/C++ 程序中.中文化的步骤跟 GTK+ 己乎是一样的. 这里简单介绍一下:

代码:

/* chinese.c */

#include

main ()

{

printf(_("This is a test.\n"));

}

现在我们来中文化这只程序:

首先我们需要 libintl.h 和 locale.h 再就是

#define PACKAGE "chinese" #define _(STRING) gettext(STRING)

然后用 setlocale() 和 textdomain() 来完成中文化

代码:

#include

#include

#include

#define _(STRING) gettext(STRING)

#define PACKAGE "chinese"

main ()

{

setlocale(LC_MESSAGES, "");

textdomain(PACKAGE);

printf(_("This is English.\n"));

}

然后跟 GTK+ 中的制作 mo 的方法一样.用 xgettext 制作出 po 文件.

翻译好以后,用 msgfmt 制作成 mo 文件. 把这个 mo 文件

copy 到 /usr/locale/你的_locale/LC_MESSAGES下面.

textdoamin 会去那里找 mo 文件.现在再重新跑您的程序.

"This is English" 就变成您改的中文了.

linux什么意思中文翻译,linux中文相关推荐

  1. birt中文翻译_BIRT中文指南

    From SixSun - Date:2006-4-27 BIRT 中文指南 BIRT - 简介 BIRT 是一个 Eclipse-based 开放源代码报表系统.它主要是用在基于 Java 与 J2 ...

  2. java中 toast的意思,toast什么意思中文翻译(中文解释toast含义及应用)

    Cheers.Bottom up, toast都是干杯,但你知道吗?它们用法不一样.怎么在不同社交场合说出得体又道地的英文,让你更自在,更自信,又更受欢迎! 1.举杯祝贺/干杯 Cheers! / M ...

  3. Linux下优秀的翻译工具

    概述 完美解决 Linux 环境下,屏幕取词定位不准确,有很多软件界面甚至无法取词的问题.并可以进行整段即时翻译,翻译结果优秀. 在 Windows 环境下,有很多可用的即时翻译翻译软件,屏幕取词功能 ...

  4. Linux内核配置选项的说明,Linux内核配置选项翻译

    Linux内核配置选项翻译 Linux内核配置选项翻译2.6.19.1(转) 内容目录 1. Code maturity level options 2 2. General setup 常规安装选项 ...

  5. Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)

    # 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) - 原文 <https://githu ...

  6. linux 编译报错 not a directory,Linux常见英文报错中文翻译

    Linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permission ...

  7. Linux常见英文报错中文翻译(菜鸟必知)

    Linux常见英文报错中文翻译(菜鸟必知) 1.command not found 命令没有找到 2.No such file or directory 没有这个文件或目录 3.Permission ...

  8. linux运维常见英文报错中文翻译(菜鸟必知)

    linux常见英文报错中文翻译(菜鸟必知) 1.command not found  命令没有找到 2.No such file or directory  没有这个文件或目录 3.Permissio ...

  9. 论文中文翻译——Double-Fetch情况如何演变为Double-Fetch漏洞:Linux内核中的双重获取研究

    本论文相关内容 论文下载地址--Web Of Science 论文中文翻译--How Double-Fetch Situations turn into Double-Fetch Vulnerabil ...

最新文章

  1. HDU-4738-Caocao's Bridges(tarjan)
  2. 解决kubernetes中ingress-nginx配置问题
  3. 多线程一定比单线程快吗
  4. Android开发学习之路--Camera之初体验
  5. 判断一个字符串是否全部不相同
  6. java weblogic 配置_java----weblogic部署应用
  7. linux cifs windows 慢,windows上使用dockerIO特别慢有没有更优的解决方案?
  8. 绿盟科技鸿蒙系统,华为 X 绿盟科技,打造“云原生安全新生态”
  9. 个人pkm软件 pim软件_个人申请软件著作权需要走哪些流程
  10. python template languages_Python template.TemplateSyntaxError方法代碼示例
  11. 域用用户怎么允许共享_w7如何共享打印机 w7共享打印机步骤【详细介绍】
  12. Win11连不上网怎么办 win11连不上网的设置方法
  13. Sentaurus TCAD学习
  14. Python学习笔记——python基础 3. 字符串
  15. 手机Web开发框架集
  16. Python-玩转数据-Scrapy中Spiders
  17. stm32写字机器人资料 主控stm32f103c8t6 包含程序
  18. Excel打开时提示“因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配。”最快的解决办法
  19. 强大免费的在线格式转换工具,三步轻松完成。
  20. Unity Timeline运行时脚本控制Mute和UnMute(Mute/UnMute a timeline track via scripting)

热门文章

  1. R语言使用多个数据类型不同的向量数据创建一个dataframe数据对象
  2. LindedList相关介绍
  3. 在手机上学习编程?这4个软件让你轻松搞定!
  4. 魅族再次助推陌陌商业化,不遗余力为其洗白
  5. Windows下安装CMake教程
  6. 对投影值进行线性插值之后再进行滤波反投影的Python实现
  7. Android版:验证手机号码的正则表达式
  8. 手推卷积神经网络参数(卷积核)求导
  9. 手推车轮 trolley wheel
  10. ioctrl原形 linux_Linux常见的几种用户态与内核态交互方式优缺点