如何使用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()得到的并不是真正的错误代码!估计是资源申请或释放方面的问题,如,资源不够!你每个连接上投递了多少个异步发送接收请求?

袁州区17646856108: 如何使用gettext,po,mo制作多语言应用程序
乐正荔抗肿: 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里输入的是不是纯数字,就用这个方法来获取输入的字符串,然后进行验证

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网