1. 程式人生 > >如何使用gettext, po, mo製作多語言應用程式 (轉)

如何使用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"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE/n"
"Last-Translator: FULL NAME <
[email protected]
>/n"
"Language-Team: LANGUAGE <[email protected]>/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 <[email protected]>/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的原始碼,發現它一樣支援國際化語言:如 [[email protected] 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=
[[email protected] src]$ wget --version
GNU Wget 1.10.2 (Red Hat modified) Copyright (C) 2005 Free Software Foundation, Inc.
此程式釋出的目的是希望它會有用,但它不作任何保證;
甚至沒有可售性或適用於特定目的的保證。
詳情請檢視 GNU General Public License。 最初由 Hrvoje Niksic <[email protected]> 編寫。//支援中文
[[email protected] src]$ export LC_ALL=en.UTF-8 //將locale設為英文
[[email protected] 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
[[email protected] 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 <[email protected]>. //語言已經是英文了.
2.檢視wget目錄 [[email protected] 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目錄正是語言檔案 [[email protected] 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檢視 [[email protected] po]$ export LC_ALL=zh_CN.UTF-8 [[email protected] po]$ vi zh_CN.po 呵呵,是中國人翻譯的.那如果我們自己要製作這些檔案呢? 3.製作mo檔案 [[email protected] wget-1.11.1]$ xgettext -k_ -o zh_CN.pot src/*.c   //生成pot檔案,複製它生成zh_CN.po並編輯它 [[email protected] wget-1.11.1]$ cp zh_CN.pot zh_CN.po 將po檔案打包成mo檔案放在/usr/share/locale/zh_CN/LC_MASSAGES/下 [[email protected] wget-1.11.1]$ msgfmt -o wget.mo zh_CN.po  //po檔案是文字檔案用於開發,而mo檔案不是文字檔案,它才是最終為使用者使用 最後複製到/usr/share/locale/zh_CN/LC_MESSAGES/ [[email protected] wget-1.11.1]$ cp wget.mo usr/share/locale/zh_CN/LC_MESSAGES/

相關推薦

如何使用gettext po mo製作語言應用程式 ()

一、翻譯檔製作部分 1、製作po檔 (1)生成template檔案 xgettext -k_ -o ui_pref.pot ui.c pref.pot head. #, fuzzy msgid "" msgstr "" "Project-Id-Versio

BERT 現已開源:最先進的 NLP 預訓練技術支援中文和更語言

文 / Jacob Devlin 和 Ming-Wei Chang, Research Scientists, Google AI Language 缺少訓練資料是自然語言處理(Natural Language Processing, NLP)面臨的最大挑戰之一。由

案例 | 致力做全球“屏王”九山電子建立語言企業站

關鍵詞:網站建設,企業官網定製,多語言站點 企業介紹 上海九山電子科技有限公司成立於2007年,專注於特種顯示方案及產品的研發、生產和銷售,擁有多項自主研發專利技術,主要產品有長條形液晶屏、透明液晶屏、曲面液晶屏、透明OLED顯示屏等。 十二年的發展歷程,九山電子始終堅持創新發展理念,堅持做出高品質產品

ASP.NET MVC5+EF6+EasyUI 後臺管理系統(89)-國際化本地化語言應用

開篇 早年寫過一篇多語言的應用 :   本地化(多語言)   講述瞭如何建立多語言的資原始檔,並利用資原始檔來獲得頁面和請求的語言屬性 本次補充這篇文章,的原因是在實際專案中,有多種需要多語言的情況 比如:日誌要根據當前語言顯示 而有些情景比較複雜,我們可能的key是

瞭解JAVA中的POJOEntityPOVODTODM包括程式碼舉例展示

首先是從概念上來說 POJO,全稱Plain Ordinary Java Object,我理解為極其單純的Java物件 一般只有屬性欄位,無參構造以及get和set方法,也是指那些沒有從任何類繼承、也沒有實現任何介面,更沒有被其它框架侵入的java物件。 因此它

php gettext方式實現UTF-8國際化語言(i18n)

近來隨著i18n(國際化)的逐漸標準化,我也來講一講在PHP中如何實現國際化支援。跟其他程式語言一樣,在 PHP 也可以利用 gettext 套件寫作 i18n 程式,實現 NLS(Native Language Support) 國際化支援,具體請參考官方文件(http:/

UE4製作語言遊戲(本地化功能詳解)

          本文參考:           http://blog.csdn.net/lzt20007/article/details/51308702             https://www.indienova.com/u/trombe/blogread

IIS 在MVC網站下建立個子應用程式根目錄問題

 在iis中單獨釋出網站 在之前的網站下,部署子網站即應用程式    遇到的問題是:在單獨釋出的網站用ajax請求後臺是正常的,但作為應用程式釋出,發現請求後臺無反應,按F12,錯誤提示404,後來通過日誌輸出的方式,看請求有沒有進後臺,結果是連後臺方法的沒進去。比

如何安裝和使用Wine以便在Linux上執行Windows應用程式

如何安裝和使用Wine,以便在Linux上執行Windows應用程式  我來答 分享 舉報 瀏覽 2150 次 1個回答 #不想上班# 今天上班,你最想說點啥? 最佳答案 cincoutvc 來自電腦網路類芝麻團 2017-10-19 在Linux上執行Windows程式需要安裝Wine,

HAproxy的負載均衡以及基於TCP和HTTP的應用程式代理

HAProxy是一個使用C語言編寫的自由及開放原始碼軟體[1],其提供高可用性、負載均衡,以及基於TCP和HTTP的應用程式代理。 HAProxy特別適用於那些負載特大的web站點,這些站點通常又需要會話保持或七層處理。HAProxy執行在當前的硬體上,完全可以支援數以萬計的

啟動虛擬機器會有錯誤報告:二進位制轉換與此平臺上的長模式不相容。此虛擬環境中的長模式將被禁用因此需要使用長模式的應用程式將無法正常執行

1.先安裝VMware2.常建立虛擬機器3.啟動虛擬機器,啟動會有:二進位制轉換與此平臺上的長模式不相容。此虛擬環境中的長模式將被禁用,因此需要使用長模式的應用程式將無法正常執行  解決辦法:需要開啟BIOS系統把  Intel  Virtual Technology 改為e

Java語言程式設計-程式國際化

引言 本篇闡述的是Java中的國際化,國際化在開發框架和頁面中有著更為便捷的使用方式,如Spring mvc,struts,jsp; 程式多語言原理:在不同地區根據主機不同的設定去匹配與之對應的語言環境。一個程式可以同時適應多種語言。 國際化(Int

“adb不是內部或外部命令也不是可執行的應用程式”錯誤原因及解決方法

用SQLite時,可能會出現這樣的錯誤。 原因可能是環境變數PATH沒有配置或配置不正確。應該把adb.exe 所在目錄加入到PATH環境變數。例如:C:\Program Files\android-sdk-windows\tools   開啟cmd,進入adb.exe 所

使用 .NET WinForm 開發所見即所得的 IDE 開發環境實現不寫程式碼直接生成應用程式

直接切入正題,這是我09年到11年左右業餘時間編寫的專案,最初的想法很簡單,做一個能拖拖拽拽就直接生成應用程式的工具,不用寫程式碼,把能想到的業務操作全部封裝起來,通過配置的方式把這些業務操作組織起來執行。 專案的核心功能已經基本實現,但12年之後我基本停止了這方面的

Win7部署SharePoint後管理中心不能新建Web應用程式

        在Win7上安裝了SharePiont,但是不能建立Web應用程式,因為新建按鈕是不可用的。         但是我是登陸的本地伺服器管理員和場管理員賬戶。站點也在可信任站點中。  

批處理一鍵開啟應用程式

 正經學徒,佛系記錄,不搞事情 上班第一件事:開啟電腦,開啟idea,開啟有道,開啟navicat,開啟釘釘,開啟mongochef,開啟...... 使用批處理後:開啟電腦,雙擊批處理檔案 新建

使用bat檔案順序執行應用程式

假如你要實現以下功能: 執行一個檔案,可以順序執行多個應用程式,可以使用一下方法來實現 假如有a.exe、b.exe和c.exe三個檔案 步驟: 1.新建文字文件,講字尾名改成.bat 2.編輯該檔案,新增以下資訊 start /wait a.exe start /wait

7、跨應用程式的 UI 測試

跨多個應用程式的UI測試 涉及跨多個應用程式互動的使用者介面(UI)測試使您可以驗證您的應用程式在使用者流程跨越其他應用程式或進入系統UI時的行為。這種使用者流程的一個例子就是訊息應用。他可以使使用者輸入文字資訊,然後啟動 Android 聯絡人選擇器,以便使

Azure AD(五)使用租戶應用程式模式讓任何 Azure Active Directory 使用者登入

一,引言 距離上次分享關於 “Azure AD" 的知識過去差不多2個多月了, 今天最近剛好也是學習,分享一下關於Azure AD 使用多租戶應用程式模式讓任何 Azure Active Directory 使用者登入,之前僅僅都是在當初租戶的使用者或者受邀來賓來訪問和使用我們的api資

國際外貿網站定製英文網站建設貿易網站開發語言網站製作

      本公司專業承接外貿英文網站定製,國外英文網站建設,多語言貿易網站開發,多語言網站製作等服務,支援電腦版,手機版等,並且個性化定製。 網站顯示語言支援:簡體,繁體,英文,韓文,日文,法文等提供一站式服務:聯絡QQ:2 3 6 0 2 4 8666(私聊),微信: