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

2023-05-16

一、翻译档制作部分
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绑定的文件名。
3copy mo文件到指定目录
 cp PACKAGE.mo /usr/share/locale/zh_CN/LC_MASSAGES/
 
 
 
 
 
二、程序编写部分
1)不引用glibgtk的程序
关键代码:
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) */
 
***********************************************************************************
1.最近在最wget的源码,发现它一样支持国际化语言:如
[xiaodao@myfedora src]$ locale
LANG=zh_CN.UTF-8              //locale为中文
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
[xiaodao@myfedora src]$ wget --version
GNU Wget 1.10.2 (Red Hat modified)
Copyright (C) 2005 Free Software Foundation, Inc.
此程序发布的目的是希望它会有用,但它不作任何保证;
甚至没有可售性或适用于特定目的的保证。
详情请查看 GNU General Public License。
最初由 Hrvoje Niksic < hniksic@xemacs.org> 编写。//支持中文
[xiaodao@myfedora src]$ export LC_ALL=en.UTF-8 //将locale设为英文
[xiaodao@myfedora src]$ locale        //查看locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=zh_CN.UTF-8
LC_CTYPE="en.UTF-8"
LC_NUMERIC="en.UTF-8"
LC_TIME="en.UTF-8"
LC_COLLATE="en.UTF-8"
LC_MONETARY="en.UTF-8"
LC_MESSAGES="en.UTF-8"
LC_PAPER="en.UTF-8"
LC_NAME="en.UTF-8"
LC_ADDRESS="en.UTF-8"
LC_TELEPHONE="en.UTF-8"
LC_MEASUREMENT="en.UTF-8"
LC_IDENTIFICATION="en.UTF-8"
LC_ALL=en.UTF-8
[xiaodao@myfedora src]$ wget --version       
GNU Wget 1.10.2 (Red Hat modified)
Copyright (C) 2005 Free Software Foundation, Inc.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
Originally written by Hrvoje Niksic < hniksic@xemacs.org>. //语言已经是英文了.
2.查看wget目录
[xiaodao@myfedora wget-1.11.1]$ ls
AUTHORS           INSTALL       NEWS            config.log     configure.bat  mkinstalldirs  stamp-h.in
COPYING           MAILING-LIST  README          config.rpath   configure.in   msdos          tests
ChangeLog         Makefile      autogen.sh      config.status  doc            po             util
ChangeLog.README  Makefile.bak  autom4te.cache  config.sub     install-sh     src            windows
DISTFILES         Makefile.in   config.guess    configure      m4             stamp-h
其中po目录正是语言文件
[xiaodao@myfedora wget-1.11.1]$ ls po
Makefile        POTFILES.in  cs.po  en_GB.po  eu.po  gl.po  id.po  nl.po     ro.po  sr.po  vi.po
Makefile.in     be.po        da.po  eo.po     fi.po  he.po  it.po  pl.po     ru.po  sv.po  zh_CN.po
Makefile.in.in  bg.po        de.po  es.po     fr.po  hr.po  ja.po  pt.po     sk.po  tr.po  zh_TW.po
POTFILES        ca.po        el.po  et.po     ga.po  hu.po  nb.po  pt_BR.po  sl.po  uk.po
其中zh_CN.po就是中文语言文件,并且是文本文件,可以用vim查看
[xiaodao@myfedora po]$ export LC_ALL=zh_CN.UTF-8
[xiaodao@myfedora po]$ vi zh_CN.po
呵呵,是中国人翻译的.那如果我们自己要制作这些文件呢?
3.制作mo文件
[xiaodao@myfedora wget-1.11.1]$ xgettext -k_ -o zh_CN.pot src/*.c   //生成pot文件,复制它生成zh_CN.po并编辑它
[xiaodao@myfedora wget-1.11.1]$ cp zh_CN.pot zh_CN.po
将po文件打包成mo文件放在/usr/share/locale/zh_CN/LC_MASSAGES/下
[xiaodao@myfedora wget-1.11.1]$ msgfmt -o wget.mo zh_CN.po  //po文件是文本文件用于开发,而mo文件不是文本文件,它才是最终为用户使用
最后复制到/usr/share/locale/zh_CN/LC_MESSAGES/
[xiaodao@myfedora wget-1.11.1]$ cp wget.mo usr/share/locale/zh_CN/LC_MESSAGES/
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用gettext, po, mo制作多语言应用程序 (转) 的相关文章

  • Lottie - 轻松实现复杂的动画效果

    1 Lottie 介绍 Lottie 是 Airbnb 开源的一套跨平台的完整的动画效果解决方案 xff0c 设计师可以使用 Adobe After Effects 设计出漂亮的动画之后 xff0c 使用 Lottic 提供的 Bodymo
  • 【迁移】—Entity Framework实例详解

    好久没有在博客园更新博客了 xff0c 如今都换了新公司 前段时间写了关于EF迁移的文档 xff0c 今天拿出来作为这个系列的一篇吧 一 Entity Framework 迁移命令 xff08 get help EntityFramewor
  • 源码阅读技巧篇

    转载请注明原创出处 xff0c 谢谢 xff01 说在前面 本人水平有限 xff0c 下面的一些都是本人的思考与理解 xff0c 如果有那里不对 xff0c 希望各位大佬积极指出 xff0c 欢迎在留言区进行评论交流 探讨 主题 为什么要读
  • 文件服务器 之 VSFTPD的高手篇

    此文章细致的讲解了VSFTP的配置 环境 xff1a linux as 3 0 43 vsftpd 1 2 0 4的系统架构 xff0c 是在独立服务器下的哦 xff01 1 xff0e 配置本地组访问的FTP 首先创建用户组 test和F
  • [Windows Azure] Manage the Availability of Virtual Machines

    Manage the Availability of Virtual Machines You can ensure the availability of your application by using multiple Window
  • Myeclipse优化配置

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 作为企业级开发最流行的工具 xff0c 用Myeclipse开发java web程序无疑是最合适的 xff0c java web前端采用jsp来显示 xff0c myecl
  • AdjustTokenPrivileges(进程权限)

    AdjustTokenPrivileges 进程权限 原文地址 http hi baidu com xuqipi blog item 07f43363b3d690630d33fa90 html GetCurrentProcessID 得到当
  • Maven学习总结(八)——使用Maven构建多模块项目

    2019独角兽企业重金招聘Python工程师标准 gt gt gt Maven学习总结 八 使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护 xff0c 我们一般会进行分层开发 xff0c 最常见的就是分为d
  • Echache整合Spring缓存实例讲解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 摘要 xff1a 本文主要介绍了EhCache xff0c 并通过整合Spring给出了一个使用实例 一 EhCache 介绍 EhCache 是一个纯Java的进程内缓存
  • XML学习总结(1)——XML入门

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 XML语法学习 学习XML 语法的目的就是编写 XML 一个XML文件分为如下几部分内容 xff1a 文档声明 元素属性注释 CDATA区 特殊字符 处理指令 xff0
  • 多个jar包合并成一个jar包(ant)

    https blog csdn net gzl003csdn article details 53539133 多个jar包合并成一个jar 使用Apache的Ant是一个基于Java的生成工具 这个工具的全名是another neat t
  • 国家电网大数据中心成立

    国家电网大数据中心成立国家电网大数据中心成立 5 月 21 日 xff0c 国家电网有限公司举行国网大数据中心成立揭牌仪式暨大数据发布会 xff0c 同时启动中国电力大数据创新联盟筹备工作 公司董事长 党组书记寇伟为国网大数据中心成立揭牌
  • shell的进阶编程

    shell的进阶编程 关于for for 变量名字 in 列表 xff1b do 循环体 done 例如for for NAME in WORDS do COMMANDS don其中前面的name就是个变量名 xff0c 而且不需要加 xf
  • 多线程程序写日志时遇到加锁的问题

    前段时间在做项目时 xff0c 系统是个多线程程序 xff0c 几个线程都需要写日志 xff0c 主线程和通讯线程经常在写日志时打架 xff0c 为了解决这个问题 xff0c 考虑在写日志的方法中加锁 代码如下 xff1a lt summa
  • imba 为什么那么快?

    本专栏思考不周到 imba 文档 下面列出vue作者的关于虚拟dom的评论 xff1a 在比较性能的时候 xff0c 要分清楚初始渲染 小量数据更新 大量数据更新这些不同的场合 Virtual DOM 脏检查 MVVM 数据收集 MVVM
  • 学习记录-数组算法题:最大子数组

    内容摘自现代 JavaScript 教程 题干 输入是以数字组成的数组 xff0c 例如 arr 61 1 2 3 4 9 6 任务是 xff1a 找出连续的 arr 的子数组 xff0c 其里面所有项的和最大 写出函数 getMaxSub
  • 项目管理之代码合并

    由于现在项目发布比较频繁 xff0c 因而经常需要改变版本 xff0c 但是为了能够保有一个最新的CodeFix版本 xff0c 所以 我们也需要在修改主线版本的同时同步合并修改的内容到Fix版本 由于种种原因经常导致合并到CodeFix的
  • C#日写点滴(1)

    渐渐感觉 xff0c 学一种知识 xff0c 脚踏实地 xff0c 一步一步是多么重要 以前习惯一看几十页 xff0c 以为学了很多 xff0c 很有成就感 xff0c 在要用的时候 xff0c 会想起来看过 xff0c 可具体怎么用 xf
  • download excel file from datagrid for webpage

    lt summary gt Summary description for WebExcelUtil lt summary gt public sealed class WebExcelUtil public static void Gen
  • C#:装箱和拆箱

    C 允许 值类型 的任何值与 Object 类型的值相互转换 装箱是将值类型转换为引用类型 xff1b 拆箱是将引用类型转换为值类型 xff1b int i 61 100 object o 61 i 装箱 xff1a 将值类型i转化为了ob

随机推荐

  • 漂亮的登陆框

    转载于 https www cnblogs com aspphpvbs archive 2013 04 20 3033057 html
  • IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中 xff0c 分别介绍了简单工厂模式 和工厂方法模式 xff0c 我们知道简单工厂模式 的优点是去除了客户端与具体产品的依赖 xff0c 缺点是违反了 开放 关闭原则 xff1b 工厂方法模式 克服了简单工厂模式 的缺点
  • 软件工程小组第八次会议记录

    会议主题 xff1a 确定各个接口的命名及功能 与会时间 xff1a 6月17日 与会地点 xff1a 逸夫楼C202 与会成员 xff1a 尚卓燃 张世豪 傅宇豪 王昊钰 会议记录 xff1a 前端与后端讨论了接口的命名和功能 xff0c
  • Ant入门教程

    本内容包含了Ant的历史简要介绍 xff0c Ant的功能以及Ant框架的介绍 xff0c 并对下载安装使用Ant进行了示例介绍 xff0c 同时通过一个Java程序讲解了Ant的基本使用方法 1 Ant简介 xff1a 这里引用Ant帮助
  • Python 与系统管理

    作为一名系统管理员 xff0c 您可能碰到过各种各样的挑战和问题 管理用户 磁盘空间 进程 设备和备份 xff0c 可能让许多系统管理员绞尽脑汁 xff0c 从而变得心情郁闷 甚至精神错乱 Shell 脚本可以为此提供帮助 xff0c 但是
  • Nuget控制台 - 给你的快速添加缺少的包

    利用命令行安装包 转载于 https www cnblogs com davidgu p 3250663 html
  • Swift语言精要 - Operator(运算符重载)

    运算符重载 Swift的这一语言特性或许应该启发于C 43 43 class Vector2D var x Float 61 0 0 var y Float 61 0 0 init x Float y Float self x 61 x s
  • 关于研究性和工程性

    自己将要往哪个方向发展呢 xff1f 最近一段时间很认真的考虑了一下周围的人 xff0c 有做工程的 xff0c 有做研究的 xff0c 还有做商务的 做工程实际具体 xff0c 相对简单些 xff0c 但是可能薪水也相对低一些 xff1b
  • C#日写点滴(2)

    CTS Common Type System 公共类型系统 C 认可的基本预定义类型并没有内置于C 语言中 xff0c 而是内置于 NET Framework中 例如 xff0c 在C 中声明一个int类型的数据时 xff0c 声明实际上是
  • SQL-关联查询【转】

    T A A表 T B B标 xff0c id为表与表相关联的字段 96 创建相关表结构 span class hljs keyword CREATE span class hljs keyword TABLE Table B span cl
  • char, varchar, nchar, nvarchar (Transact-SQL)

    char 和 varchar Transact SQL 长度固定或可变的字符串数据类型 char n 固定长度 xff0c 非 Unicode 字符串数据 n 用于定义字符串长度 xff0c 并且它必须为 1 到 8 000 之间的值 存储
  • .net中类(class)与结构(struct)的不同

    Class可以被实例化 属于引用类 型 是分配在内存的堆上的 类是引用传递的 Struct属于值类型 是分配在内存的栈上的 结构体是复制传递的 Int32 Boolean等都属于结构体 转载于 https www cnblogs com b
  • Intro to asp.net MVC 简单的小程序(2)

    我们做的很简单 xff0c 就是一个电影的表单 xff0c 显示还有创建 强大的封装真的很好用 xff0c 当我们新建的视图的时候 xff0c 强类型下面都有封装好的 Create List Details 很多 xff0c 我们只要选择一
  • 利用网站上传漏洞使用一句话木马控制服务器

    一句话木马 常用于php asp aspx php lt php echo shell exec GET 39 cmd 39 gt asp lt execute request 34 value 34 gt aspx lt 64 Page
  • 用MotoMidMan给L7批量安装java程序

    在给手机装完驱动后 可以通过MotoMidMan给手机内存安装java程序 需要资源 数据线 MotoMidMan java程序 由一个 jar文件与一个 jad文件组成 操作步骤 1 下载完的是个压缩包 扩展名为 rar 解压完的文件清单
  • 28. Implement strStr()

    public class Solution public int strStr String haystack String needle int next 61 new int needle length generateNextArra
  • Oracle数据库删除了数据如何恢复

    再操作数据库时 xff0c 有时候误删了数据或者更新数据时忘记设置更新条件 xff0c 要是这时候没有提交事务 xff0c 还可以执行回滚操作 要是这时候不小心提交了 xff0c 数据也是可以恢复的 我们只需要执行下面这句sql selec
  • (译)ASP.NET MVC Routing 概述

    ASP NET MVC Routing 概述 在本篇教程中 xff0c 你将会了解到 ASP NET MVC 中一个重要的组件 这个组件叫做 ASP NET Routing xff0c 它负责将客户端请求的路径映射到特定的一个类 Contr
  • eclipse中mysql java驱动的安装

    1 下载mysql connector java x x x zip 2 将压缩包中的mysql connector java x x x bin解压到eclipse中需要导入驱动的工程的根目录下 3 在eclipse中右键该工程选择属性
  • 如何使用gettext, po, mo制作多语言应用程序 (转)

    一 翻译档制作部分 1 制作 po 档 1 生成template文件 xgettext k o ui pref pot ui c pref pot head fuzzy msgid 34 34 msgstr 34 34 34 Project