如何使用gettext,po,mo制作多语言应用程序
language 或 lang
wordpress里有.po 和.mo文件,是用于对wordpress进行语言翻译的文件
至于编辑工具,由于 po 文件本身就是一个文本文件,所以任何文本编辑器都可以使用。除了专门编辑 po 文件的 poEdit ,还推荐使用 EditPlus、UltraEdit或者你喜欢的 vi 或 vim。
poEdit 从poEdit.net上下载
一般是通过一个汉化过(翻译过)的 mo 文件来实现( WordPress 仅可识别 mo 文件)。如果原作者提供了一个 po 文件或 mo 文件,那么我们就可以通过相关工具来自行汉化,或者翻译成其他语言版本。因为 mo 文件不能直接编辑,所以我们得编辑 po 文件,若仅有 mo 文件,那么就应该先把它转换成 po 文件后再进行编辑翻译。
如果你使用的是 poEdit ,按 Ctrl + s 保存就会自动生成相应的 po 文件和 mo 文件;
或者在命令提示符界面,使用 msgfmt demo.po 命令将po文件编译为可用的 demo.mo 文件,用 msgunfmt demo.mo 命令转回 demo.po 文件,这些命令在 poEdit 的安裝目录下有,可以拷贝msgunfmt.exe 、msgfmt.exe 及相关链接库文件 gettextlib.dll 、gettextsrc.dll 、iconv.dll 、intl.dll 到 c:/windows/system32 目录下,或者安装 .Net 2.0环境。
gettext – 将mo文件反编译成po文件,
poedit – 将po文件编译成mo文件,
反编译 mo 文件成 po 文件,使用 gettext 的 msgunfmt.exe 工具,命令如下
msgunfmt.exe d:test.mo -o d:test.po
编码 po 文件为 mo 文件,使用 poedit 的 msgfmt.exe 工具,命令如下
1、制作po档
(1)生成template文件
xgettext -k_ -o ui_pref.pot ui.c
pref.pot head.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION/n"
"Report-Msgid-Bugs-To: /n"
"POT-Creation-Date: 2008-02-18 10:01+0800/n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE/n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>/n"
"Language-Team: LANGUAGE <LL@li.org>/n"
"MIME-Version: 1.0/n"
"Content-Type: text/plain; charset=CHARSET/n"
"Content-Transfer-Encoding: 8bit/n"
(2)生成lang.po文件
假设编写简体中文的po档,
cp ui_pref.pot zh_CN.po
vi zh_CN.po
将头部的CHARSET 改为 “UTF-8”
头部其余部分按需要改写或让其保持原状。
msgstr中字符串改为msgid对应的翻译。
例如:
zh_CN.po 文件
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION/n"
"Report-Msgid-Bugs-To: /n"
"POT-Creation-Date: 2008-02-18 10:01+0800/n"
"PO-Revision-Date: 2008-02-18 10:01+0800/n"
"Last-Translator: joyzhao <joyzhao@linpus.com>/n"
"Language-Team: chinese/n"
"MIME-Version: 1.0/n"
"Content-Type: text/plain; charset=UTF-8/n"
"Content-Transfer-Encoding: 8bit/n"
#: ui.c:152
msgid "Select backdrop image or list file"
msgstr "选择背景图片"
#: ui.c:157
msgid "All Files"
msgstr "所有文件"
...
2 、生成lang.po 对应的PACKAGE.mo
msgfmt -o PACKAGE.mo lang.po
其中, PACKAGE为应用程序中bindtextdomain绑定的文件名。
3、copy mo文件到指定目录
cp PACKAGE.mo /usr/share/locale/zh_CN/LC_MASSAGES/
二、程序编写部分
(1)不引用glib、gtk的程序
关键代码:
#include <locale.h>
#include <libintl.h>
#define _(STRING) gettext(STRING)
#define PACKAGE "test"
main ()
{
setlocale(LC_MESSAGES, "");
textdomain(PACKAGE);
printf(_("This is English./n"));
}
再生成各locale目录下名为test.mo的翻译档即可。
(2)使用gtk的程序
方法一: 引用 <glib/gi18n.h>
关键代码:
#include <gtk/gtk.h>
#include <glib/gi18n.h>
{
gtk_set_locale();
//bindtextdomain (PACKAGE, LOCALEDIR);
//textdomain (PACKAGE);
bindtextdomain ("test", "/usr/share/locale");
textdomain ("test");
gtk_init (&argc, &argv);
...
gtk_window_set_title(GTK_WINDOW(dialog), _("hi"));
...
}
方法二:引用 <glib/gi18n-lib.h>
关键代码:
#include <gtk/gtk.h>
#define GETTEXT_PACKAGE "test"
#include <glib/gi18n-lib.h>
{
gtk_init (&argc, &argv);
...
gtk_window_set_title(GTK_WINDOW(dialog), _("hi"));
...
}
上述两种方法是一样的。
第一种中 gi18n.h将为我们引用#include <libintl.h>,同时定义
#define _(String) gettext (String)
而第二中方法中gi18n-lib.h必须在我们定义了 GETTEXT_PACKAGE 宏之后才为我们定义
#define _(String) dgettext (GETTEXT_PACKAGE, String)
由于
gtk_init(); -->gtk_init_check() -->gtk_parse_args() -->gettext_initialization ()
gettext_initialization的代码实现:
static void
gettext_initialization (void)
{
#ifdef ENABLE_NLS
bindtextdomain (GETTEXT_PACKAGE, GTK_LOCALEDIR);
bindtextdomain (GETTEXT_PACKAGE "-properties", GTK_LOCALEDIR);
# ifdef HAVE_BIND_TEXTDOMAIN_CODESET
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
bind_textdomain_codeset (GETTEXT_PACKAGE "-properties", "UTF-8");
# endif
#endif
}
因此方法二中可以省略方法一中红色高亮的两行代码。
(3)引用xfce libxfce4util库的代码
关键代码:
#include <gtk/gtk.h>
#define GETTEXT_PACKAGE "test"
#include <libxfce4util/libxfce4util.h>
{
gtk_init (&argc, &argv);
...
gtk_window_set_title(GTK_WINDOW(dialog), _("hi"));
...
}
其中, <libxfce4util/libxfce4util.h> 会进一步引用<libxfce4util/xfce-i18n.h>
这个头文件中在定义了 GETTEXT_PACKAGE 之后会引用<glib/gi18n-lib.h>头文件,否则将会使gettext失效。
libxfce4util/xfce-i18n.h内容:
#if defined(GETTEXT_PACKAGE)
#include <glib/gi18n-lib.h>
#else
#include <glib/gi18n.h>
#endif
#if !defined(GETTEXT_PACKAGE)
#ifdef gettext
#undef gettext
#endif
#ifdef dgettext
#undef dgettext
#endif
#ifdef dcgettext
#undef dcgettext
#endif
#ifdef ngettext
#undef ngettext
#endif
#ifdef dngettext
#undef dngettext
#endif
#ifdef dcngettext
#undef dcngettext
#endif
#define gettext(s) (s)
#define dgettext(domain,s) (s)
#define dcgettext(domain,s,type) (s)
#define ngettext(msgid, msgid_plural, n) (((n) > 0) ? (msgid) : (msgid_plural))
#define dngettext(domainname, msgid, msgid_plural, n) (((n) > 0) ? (msgid) : (msgid_plural))
#define dcngettext(domainname, msgid, msgid_plural, n, type) (((n) > 0) ? (msgid) : (msgid_plural))
#endif
转载
1、制作po档
(1)生成template文件
xgettext -k_ -o ui_pref.pot ui.c
pref.pot head.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION/n"
"Report-Msgid-Bugs-To: /n"
"POT-Creation-Date: 2008-02-18 10:01+0800/n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE/n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>/n"
"Language-Team: LANGUAGE <LL@li.org>/n"
"MIME-Version: 1.0/n"
"Content-Type: text/plain; charset=CHARSET/n"
"Content-Transfer-Encoding: 8bit/n"
(2)生成lang.po文件
假设编写简体中文的po档,
cp ui_pref.pot zh_CN.po
vi zh_CN.po
将头部的CHARSET 改为 “UTF-8”
头部其余部分按需要改写或让其保持原状。
msgstr中字符串改为msgid对应的翻译。
例如:
zh_CN.po 文件
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION/n"
"Report-Msgid-Bugs-To: /n"
"POT-Creation-Date: 2008-02-18 10:01+0800/n"
"PO-Revision-Date: 2008-02-18 10:01+0800/n"
"Last-Translator: joyzhao <joyzhao@linpus.com>/n"
"Language-Team: chinese/n"
"MIME-Version: 1.0/n"
"Content-Type: text/plain; charset=UTF-8/n"
"Content-Transfer-Encoding: 8bit/n"
#: ui.c:152
msgid "Select backdrop image or list file"
msgstr "选择背景图片"
#: ui.c:157
msgid "All Files"
msgstr "所有文件"
...
如何利用windows自带的矢量字库提取字模
hNewFont);\/\/将创建的字体选入内存设备描述表GetTextExtendPoint32W(hdcMem,Hanzi,1,&size); \/\/获取要显示的文本的大小cxBitmap =size.cx.;
IOCP客户端ConnectEx,GetQueuedCompletionStatus返回52错误
使用WSAGetOverlappedResult()函数,看一下具体的错误代码是什么!在GetQueuedCompletionStatus返回错误,用WSAGetLastError()得到的并不是真正的错误代码!估计是资源申请或释放方面的问题,如,资源不够!你每个连接上投递了多少个异步发送接收请求?
乐正荔抗肿: 1、制作po档(1)生成template文件 xgettext -k_ -o ui_pref.pot ui.c pref.pot head.#, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION/n" "Report-Msgid-Bugs-To: /n" "POT-Creation-Date: 2008-02-18 10:01+0800/n" ...
袁州区17646856108: 如何编辑WordPress的po和mo文件 - ?
乐正荔抗肿: 至于编辑工具,由于 po 文件本身就是一个文本文件,所以任何文本编辑器都可以使用.除了专门编辑 po 文件的 poEdit ,还推荐使用 EditPlus、UltraEdit或者你喜欢的 vi 或 vim.poEdit 从poEdit.net上下载 一般是通过一个汉化过(翻译过)的 ...
袁州区17646856108: 怎样打开mo文件 - ?
乐正荔抗肿: 你说的mo应该是语言文件包吧,mo:Machine Object,机器对象.po:Portable Object,可移植对象. 编辑mo文件需要的工具叫gettext,运行该包里面的命令: msgunfmt.exe mo文件名 -o po文件名 然后用poedit,对english.po进行编辑、翻译,完成后再运行: msgfmt.exe -o mo文件名 po文件名 可重新编译成mo.
袁州区17646856108: 什么是PO文件 - ?
乐正荔抗肿: 属于L10n方案.“po”是: Portable Object(可跨平台对象)的缩写.po与mo模式的转变过程PO是 Portable Object (可移植对象)的缩写形式;MO是 Machine Object (机器对象) 的缩写形式. PO 文件是面向翻译人员的、提取于源代码的...
袁州区17646856108: python模块i18n怎么导入 - ?
乐正荔抗肿: Python通过gettext模块支持国际化(i18n),可以实现程序的多语言界面的支持,下面是我的多语言支持实现:1. 在python安装目录下的./Tools/i18n/(windows下例 D:\Program Files\Python25\Tools\i18n)目录中找到pygettext.py运行之,生成翻译...
袁州区17646856108: VC++中GetText ()如何用 - ?
乐正荔抗肿: GetWindowText()获取任意窗体的text 函数原型:Int GetWindowText(HWND hWnd,LPTSTR lpString,Int nMaxCount);
袁州区17646856108: WordPress主题翻译找不到po和mo文件怎么翻译??
乐正荔抗肿: gettext - 将mo文件反编译成po文件, poedit - 将po文件编译成mo文件,
袁州区17646856108: gettext的用法(C语言) - ?
乐正荔抗肿: 括号里面是char *,就是你所输入的文本.返回值也是char *,就是转换为你本地语言的文本.
袁州区17646856108: java中getTEXT( string name)方法怎么用的 - ?
乐正荔抗肿: Java程序的“getText()”方法返回值的类型一定是String(字符串)类型的. 解释:“textName.getText()”方法实际上就是获取的文本框当前输入内容的方法.如果当前的输入框中的值是“aaa”或者“111”;那么getText(string name)得的结果也是此值(字符串类型),如果想变成其他类型,可以通过强制类型转换的方式实现" int newValue = (int )textName.getText()"的形式来进行转换.
袁州区17646856108: android里.getText().tostring()怎么用 - ?
乐正荔抗肿: 这个方法是获取一个视图View对象里的字符串的方法的,比如你要验证一个Edittext里输入的是不是纯数字,就用这个方法来获取输入的字符串,然后进行验证