在LUA中使用GETTEXT實現多語言支援
在Lua中使用gettext實現多語言支援
GNU gettext 是一套優秀的國際化工具。在 linux 中被大量採用。wordpress 也使用 gettext 實現多語言支援。
本文介紹如何在 quick-cocos2d-x 中使用 gettext 做多語言支援。同時介紹多語言翻譯工具 poedit 對 Lua 語言的支援。
gettext 簡介
gettext 是一套工具集的名稱。這套工具集包含 xgettext/msginit/msgfmt 等一套建立模版(POT)、建立PO檔案和編譯MO檔案的工具。
gettext 包含的工具如下:
- xgettext 從原始碼中生成POT模版或直接生成PO檔案;
- msginit 基於POT檔案生成待翻譯的PO檔案;
- msgfmt 將PO檔案編譯成二進位制的MO檔案;
- msgunfmt 顧名思義,將MO檔案反編譯成PO檔案;
- msgmerge 將POT模版檔案與PO檔案合併。用於在原始碼更新之後將新的待翻譯內容更新到已經翻譯的PO檔案中;
- msgcat 將多個PO檔案合併在一起。
使用 gettext 需要涉及這樣幾個概念:
-
原始碼
程式的原始碼,本文中是 lua 檔案; -
POT 檔案
從原始碼中掃描得到的翻譯模版檔案,原始語言取決於原始碼字串中使用的自然語言,建議使用英文。純文字格式; -
PO 檔案
根據 POT 檔案建立的各種語言版本的待翻譯檔案,其中包含原始語言和被翻譯的目標語言。純文字格式; -
MO 檔案
供最終軟體實際使用的檔案,使用 PO 編譯而成。二進位制格式。
一般的工作流程是這樣的:
-
在原始碼中使用約定的語法來書寫字串,C語言預設是
gettext("my text")
。在本文中,將使用_("my text")
; - 使用 xgettext 從原始碼中掃描出需要翻譯的文字,建立 POT 檔案;
- 使用 msginit 命令根據 POT 檔案建立 PO 檔案。或者直接在上一步也可以直接建立 PO 檔案;
- 進行人工翻譯(當然也可以進行機器翻譯),翻譯的結果儲存在 PO 檔案中;
- 使用 msgfmt 命令將 PO 檔案編譯成 MO 檔案;
-
在程式中實現呼叫命令,本文中是
_
函式,這個函式將讀取並解析 MO 檔案,根據呼叫的原始語言文字返回翻譯之後的文字。
Poedit 簡介
gettext 提供的工具集都是基於命令列的,有些程式設計師並不習慣命令列。它也沒有提供用於翻譯工作者的對照翻譯工具。
Poedit 可以從原始碼中提取文字生成 PO 檔案,也提供了一個GUI介面用於對照翻譯。它還可以直接生成最終的 MO 檔案。
當然,在GUI之後,它依然是使用 gettext 來處理的,但這些具體的細節被隱藏了。
使用 Poedit 生成和翻譯 PO 檔案
軟體設定
1.開啟 Poedit,執行 File – Preferences 命令,填入自己的個人資訊。
2.切換到 Editor tab,選中 Automatically compile .mo file on save 和 Show summary after catalog update 兩項。
3.切換到 Parsers tab,這裡提供了幾種原始碼解析器,但預設沒有Lua。我們下面將加入Lua原始碼解析。
4.點選 New 新建一個原始碼解析器,進行如下圖的設定。
xgettext -C --force-po -o %o %C %K %F
-k%k
--from-code=%c
這些設定基本上與 C/C++ 的設定一致,只是修改了副檔名支援以及 Parser command 欄位。在 xgettext 命令的引數中,-C 就是 –language=C 的簡寫。
接下來將新建一個專案進行設定。
專案設定
1.執行 File – New catelog… 命令,在 Translation properties tab 中加入自己的資訊。這裡的 Language 選項只是個顯示選項而已,並不能決定你使用的是何種語言,也不和剛才的軟體設定中的 Parsers 相關。
2.設定原始碼路徑,這個非常重要。
我採用 quick 預設的目錄風格,所有的原始碼放在 scripts 中。同時我建立了一個新的 i18n 目錄,這個目錄與 scripts 目錄同級。生成的 PO 檔案將儲存在這個目錄中。
那麼對於當前正在編輯的 PO 檔案來說, Base path 就應該設定成..\scripts
, 下面的 Paths
就應該加入 . 這個路徑。注意在 Windows 下, Base path 的路徑分隔符必須採用 Windows 的格式(反斜槓 \ ),而不應該使用 / 。
3.設定原始碼關鍵詞
前面我們已經確定了自己的關鍵詞,那就是 _
。當然我們也可以使用 C 語言的預設關鍵詞 gettext
,但那樣未免長了一點。
4.設定完畢後,將專案儲存為 i18n/zh_CN.po
,請注意我上面強調過的第2步。
解析原始碼
一切設定成功之後,直接按下主介面上的 Update
按鈕即可解析原始碼。Poedit 會將原始碼中解析到的使用 _("my
text")
格式的關鍵詞,將其中的字串提取處理顯示在主介面中。
我們可以在主介面中對關鍵詞進行翻譯。
如果原始碼有更新,再次單擊 Update
按鈕重新解析原始碼。這是如果解析到新的字串,或者有字串不再使用,Poedit都會進行提示。
需要注意的一點是,在 Lua 的註釋中不要包含半形的單引號。
這是由於 Lua 的註釋使用 — 符號,而 C 語言使用 // ,所以 gettext 會認為 Lua 中的註釋是程式碼的一部分而不會忽略解析。在一般情況沒有什麼問題,但如果在註釋中包含了半形的單引號(這是在 C 語言中代表字面值),gettext 就會認為語法錯誤因此產生解析錯誤。
生成 MO 檔案
在軟體設定中,我們設定了在儲存專案的時候自動生成 MO 檔案,所以這點不用操心了。生成的 MO 檔案與 PO 檔案在相同的目錄。
在 Lua 中解析 MO 檔案
MO 是個二進位制格式的檔案,我們的程式在讀取它的時候,需要分析它的結構 ,將它解析成 原始文字
- 翻譯文字
的鍵值對形式,供我們使用。
許多語言中已經包含了 MO 檔案的解析庫,但是 Lua 沒有。所以我們需要自己寫一個。
由於要支援跨平臺的原因,讀取 MO 檔案採用的是 CCFileUtils ,如果要在其他環境中使用,可以改用 io 庫。我在Gettext._getFileData
中保留了使用
io 庫的程式碼,只是將其註釋了。
綜合範例
使用這種方法,MO 檔案會被解析成功一個 table 返回:
local mo_data=assert(require("utils.Gettext").loadMOFromFile("res/zh_CN.mo"))
print(mo_data["Hello World!"])
-- 你好,世界
print(mo_data["Foobar"])
-- nil
更通用的方法是這樣:
_ = assert(require("utils.Gettext").gettextFromFile("res/zh_CN.mo"))
print(_("Hello World!"))
在我的遊戲中,則是這樣使用的:
LANG = "res/zh_CN.mo"
function _(__text)
return __text
end
if CCFileUtils:sharedFileUtils():isFileExist(LANG) then
_ = assert(require("utils.Gettext").gettextFromFile(LANG))
end
- 本站文章除註明轉載外,均為本站原創或者翻譯。
- 本站文章歡迎各種形式的轉載,但請18歲以上的轉載者註明文章出處,尊重我的勞動,也尊重你的智商;
- 本站部分原創和翻譯文章提供markdown格式原始碼,歡迎使用文章原始碼進行轉載;
- 本文標題:在Lua中使用gettext實現多語言支援
相關推薦
在LUA中使用GETTEXT實現多語言支援
在Lua中使用gettext實現多語言支援 GNU gettext 是一套優秀的國際化工具。在 linux 中被大量採用。wordpress 也使用 gettext 實現多語言支援。 本文介紹如何在 quick-cocos2d-x 中使用 gettext 做多語言支
vue用i18n實現多語言支援(國際化)
vue-i18n是用於多語言適配的vue外掛,主要用於前端專案的國際化應用。 個簡單的例子: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title&
php i18n gettext 實現多語言
<?php header("Content-type: text/html; charset=utf-8"); $lng = $_GET['lng'] ? $_GET['lng'] :'zh_TW'; $domain = 'test'; putenv('LA
MessageBox中按鈕如何實現多語言
如何正確輸出Byte?瀏覽器程式碼中如何插入廣告過濾規則如何正確輸出Byte?瀏覽器程式碼中如何插入廣告過濾規則 C#呼叫C++DLL的難題C#字元常量的表示C#呼叫C++DLL的難題C#字元常量的表示 C#呼叫C++DLLC++DLL向C#發訊息。GridView出現重複的
關於 頁面多語言支援的純前端(JQuery外掛)實現及 .json 檔案讀取報404的問題
如著急尋求解決方案請跳過開頭,直接看正文。 ***************** 廢話 ***************** 最近公司搞一個專案,被安排做頁面的多語言支援,對 Hystrix Dashboard 介面實現漢化,和中英切換,剛開始真沒把
ACM入門------C語言中如何實現多組資料輸入輸出
在“百度知道”看到的,自己只做相應的筆記整理。 輸入格式:有多個case輸入,直到檔案結束 輸出格式:一行一個結果 Problem Description Your task is to Calculate a + b. Too easy?! Of c
在ASP.Net 2.0中實現多語言介面的方法
(轉載) 1. 跟以前一樣做介面,只是注意,把所有需要有多語言介面的文字都用label來做 2. 做完以後,在Solution Explorer裡選中這個檔案,選Tools->Generate Local Resource 3. 你會發現生成
ionic2 基於ngx-translate實現多語言切換,翻譯
click create -a fault template con 設置 切換 使用 介紹 ngx-translate 是Angular 2+的國際化(i18n)庫,在github的地址是箭頭 https://github.com/ngx-translate/core 將
11.2-全棧Java筆記:Java中如何實現多線程
java在JAVA中使用多線程非常簡單,我們先學習如何創建和使用線程,然後結合案例再深入剖析線程的特性。通過繼承Thread類實現多線程繼承Thread類實現多線程的步驟:1. 在Java中負責線程的這個功能的是java.lang.Thread 這個類2. 可以通過創建 Thread 的實例來創建新的線程。3
Eclipse中 如何實現 多行同時編輯
可編輯 多行 鼠標 編輯 再次 clip width 技術 shift 在編輯的時候按下 SHIFT + ALT +A 之後 鼠標變為 + 號 選擇要同時編輯幾行 即可編輯(現在eclipse好像只能是編輯一塊地方 不能像vs那樣 任何地方可以同時編輯 這
Qt跨平臺(window、linux)實現多語言
linx this delet set 就是 body http mes else 在項目中,實現多語言基本山是基本需求,雖然Qt支持跨平臺,但在linux和windows上實現多語言的方式還是細微區別的,廢話不多說,直接進入主題吧。 Qt實現多語言,是用過QTr
ef core中如何實現多對多的表映射關系
uil set ring one int 實現 log ons lB 文檔:https://docs.microsoft.com/en-us/ef/core/modeling/relationships class MyContext : DbContext {
[UWP]針對UWP程式多語言支援的總結,含RTL
原文: [UWP]針對UWP程式多語言支援的總結,含RTL UWP 對 Globalization and localization 的支援非常好,可以非常容易地實現應用程式本地化。 所謂本地化,表現最為直觀的就是UI上文字和佈局方式了,針對文字,提供不同的語言資原始檔即可,
利用vue-i18n實現多語言切換
在angular中有ngx-translate解決i18n的需求,vue也具備這樣的能力,利用vue-i18n,我們可以實現多語言的切換,可以輕鬆搞定大部分的需求,包括中英文切換,以及詞條的變更。詞條變更在基線版本真的是經常會遇到的,本人深有體會。不扯淡了,說一下vue-i18n基本的使
nuxt.js實戰之用vue-i18n實現多語言
一、實現步驟 1、安裝vue-i18n並且建立store.js(vuex狀態管理)檔案 2、建立一個(middleware)中介軟體,用來管理不同的語言 3、建立不同語言的json檔案作為語言包(例如: ~locales/en.json) 4、在pages資料夾下建立檔案,並進行翻譯 二、詳細步驟
vue專案中如何使用多語言(vue-i18n)
因專案需要,需要使用多語言,特此記錄使用方法。 第一步:安裝vue-i18n npm install vue-i18n 第二步:在生成的i18n資料夾中的index.js裡引入vue-i18n 第三步:依舊在i18n資料夾中的indx.js檔
Android中CountDownLatch實現多執行緒同步
簡介 CountDownLatch 通過它的名字也能猜出一二來,Countdown 顧名思義倒計時,Latch可以理解為觸發或者發射。也就是說當倒數到0時就可以發射火箭啦,線上程中就是一個等待的執行緒,當 countdown 到 0 就不用再等待了,可以向下執行
ThinkPHP 5 框架實現多語言 例項講解
ThinkPHP 5 框架實現多語言 今天給大家分享一篇tp5框架多語言的例項 第一步: 您需要在配置檔案中開啟網站多語言, 並新增語言允許列表: // 預設語言 'default_lang' => 'zh-cn',
jQuery中如何實現多庫並存?
多庫共存就是“$ ”符號的衝突。 方法一: 利用jQuery的實用函式$.noConflict();這個函式歸還$的名稱控制權給另一個庫,因此可以在頁面上使用其他庫。這時,我們可以用"jQuery "這個名稱呼叫jQuery的功能。 $.noConflict(); j
遊戲實現多語言版本(國際化)
公司從今天開始放假,希望抽年假的時間,把這在新專案中所做的,分模組做個整理。 此時我正在G1152次高鐵上,寫這篇部落格,回去也沒有網,要等年後來了才能發。 自從換了專案組之後一直都很忙,沒什麼時間寫blog了,目前這個專案是自己挑的,希望多花點時間,把它做好。 因為專案還