如何使用gettext, po, mo制作多语言应用程序[转]

引用自:

http://blog.csdn.net/hwizhao/archive/2008/02/19/2106815.aspx

 

一、翻译档制作部分

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 /* !defined(GETTEXT_PACKAGE) */


引用自:

http://blog.csdn.net/hwizhao/archive/2008/02/19/2106815.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gettext是一个用于国际化Python程序的标准库。它允许您将程序的用户界面翻译成多种语言,以便于不同国家和地区的用户使用。 以下是使用gettext进行国际化的基本步骤: 1. 在程序中使用gettext库导入函数: ```python import gettext ``` 2. 使用gettext库中的函数创建翻译对象: ```python #gettext.translation(domain, localedir=None, languages=None, fallback=False) translation = gettext.translation('my_program', localedir='/path/to/locale', languages=['fr']) ``` 其中,domain是程序名称或标识符,localedir是包含翻译文件的目录,languages是一个列表,包含要翻译的语言(例如,'fr'表示法语)。 3. 使用翻译对象中的gettext函数翻译文本: ```python #translation.gettext(message) print(translation.gettext('Hello, world!')) ``` 在程序运行时,gettext函数将根据当前语言环境返回正确的翻译文本。 4. 使用gettext库中的pygettext工具从源代码中提取待翻译文本并生成翻译文件: ```bash $ pygettext my_program.py -o locales/my_program.pot ``` 其中,my_program.py是要翻译的源代码文件,locales/my_program.pot是生成的消息目录模板。 5. 使用gettext库中的msgfmt工具将PO文件换为MO文件: ```bash $ msgfmt locales/fr/LC_MESSAGES/my_program.po -o locales/fr/LC_MESSAGES/my_program.mo ``` 其中,locales/fr/LC_MESSAGES是包含法语翻译文件的目录。 6. 将MO文件复制到相应的语言目录中: ```bash $ cp locales/fr/LC_MESSAGES/my_program.mo locales/fr/LC_MESSAGES/my_program.mo ``` 7. 运行程序,并设置语言环境: ```bash $ export LANG=fr_FR.UTF-8 $ python3 my_program.py ``` 以上是使用gettext进行Python程序国际化的基本步骤。您可以按照这些步骤为您的程序添加多种语言支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值