1. 程式人生 > >在LUA中使用GETTEXT實現多語言支援

在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 編譯而成。二進位制格式。

一般的工作流程是這樣的:

  1. 在原始碼中使用約定的語法來書寫字串,C語言預設是gettext("my text")。在本文中,將使用 _("my text") ;
  2. 使用 xgettext 從原始碼中掃描出需要翻譯的文字,建立 POT 檔案;
  3. 使用 msginit 命令根據 POT 檔案建立 PO 檔案。或者直接在上一步也可以直接建立 PO 檔案;
  4. 進行人工翻譯(當然也可以進行機器翻譯),翻譯的結果儲存在 PO 檔案中;
  5. 使用 msgfmt 命令將 PO 檔案編譯成 MO 檔案;
  6. 在程式中實現呼叫命令,本文中是 _ 函式,這個函式將讀取並解析 MO 檔案,根據呼叫的原始語言文字返回翻譯之後的文字。

Poedit 簡介

gettext 提供的工具集都是基於命令列的,有些程式設計師並不習慣命令列。它也沒有提供用於翻譯工作者的對照翻譯工具。

Poedit 可以從原始碼中提取文字生成 PO 檔案,也提供了一個GUI介面用於對照翻譯。它還可以直接生成最終的 MO 檔案。

當然,在GUI之後,它依然是使用 gettext 來處理的,但這些具體的細節被隱藏了。

使用 Poedit 生成和翻譯 PO 檔案

軟體設定

1.開啟 Poedit,執行 File – Preferences 命令,填入自己的個人資訊。

Preferences

2.切換到 Editor tab,選中 Automatically compile .mo file on save 和 Show summary after catalog update 兩項。

Editor

3.切換到 Parsers tab,這裡提供了幾種原始碼解析器,但預設沒有Lua。我們下面將加入Lua原始碼解析。

Parses

4.點選 New 新建一個原始碼解析器,進行如下圖的設定。

xgettext -C --force-po -o %o %C %K %F

-k%k

--from-code=%c

Parse setup

這些設定基本上與 C/C++ 的設定一致,只是修改了副檔名支援以及 Parser command 欄位。在 xgettext 命令的引數中,-C 就是 –language=C 的簡寫。

接下來將新建一個專案進行設定。

專案設定

1.執行 File – New catelog… 命令,在 Translation properties tab 中加入自己的資訊。這裡的 Language 選項只是個顯示選項而已,並不能決定你使用的是何種語言,也不和剛才的軟體設定中的 Parsers 相關。

Translation properties

2.設定原始碼路徑,這個非常重要。

我採用 quick 預設的目錄風格,所有的原始碼放在 scripts 中。同時我建立了一個新的 i18n 目錄,這個目錄與 scripts 目錄同級。生成的 PO 檔案將儲存在這個目錄中。

那麼對於當前正在編輯的 PO 檔案來說, Base path 就應該設定成..\scripts , 下面的 Paths 就應該加入 . 這個路徑。注意在 Windows 下, Base path 的路徑分隔符必須採用 Windows 的格式(反斜槓 \ ),而不應該使用 / 。

Sources paths

3.設定原始碼關鍵詞

前面我們已經確定了自己的關鍵詞,那就是 _ 。當然我們也可以使用 C 語言的預設關鍵詞 gettext ,但那樣未免長了一點。

Sources paths

4.設定完畢後,將專案儲存為 i18n/zh_CN.po ,請注意我上面強調過的第2步。

解析原始碼

一切設定成功之後,直接按下主介面上的 Update 按鈕即可解析原始碼。Poedit 會將原始碼中解析到的使用 _("my text") 格式的關鍵詞,將其中的字串提取處理顯示在主介面中。

我們可以在主介面中對關鍵詞進行翻譯。

main scene

如果原始碼有更新,再次單擊 Update 按鈕重新解析原始碼。這是如果解析到新的字串,或者有字串不再使用,Poedit都會進行提示。

New string
Obsolete string

需要注意的一點是,在 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檔

AndroidCountDownLatch實現執行緒同步

簡介 CountDownLatch 通過它的名字也能猜出一二來,Countdown 顧名思義倒計時,Latch可以理解為觸發或者發射。也就是說當倒數到0時就可以發射火箭啦,線上程中就是一個等待的執行緒,當 countdown 到 0 就不用再等待了,可以向下執行

ThinkPHP 5 框架實現語言 例項講解

ThinkPHP 5 框架實現多語言 今天給大家分享一篇tp5框架多語言的例項 第一步: 您需要在配置檔案中開啟網站多語言, 並新增語言允許列表: // 預設語言 'default_lang' => 'zh-cn',

jQuery如何實現庫並存?

多庫共存就是“$ ”符號的衝突。  方法一: 利用jQuery的實用函式$.noConflict();這個函式歸還$的名稱控制權給另一個庫,因此可以在頁面上使用其他庫。這時,我們可以用"jQuery "這個名稱呼叫jQuery的功能。 $.noConflict();  j

遊戲實現語言版本(國際化)

公司從今天開始放假,希望抽年假的時間,把這在新專案中所做的,分模組做個整理。 此時我正在G1152次高鐵上,寫這篇部落格,回去也沒有網,要等年後來了才能發。 自從換了專案組之後一直都很忙,沒什麼時間寫blog了,目前這個專案是自己挑的,希望多花點時間,把它做好。 因為專案還