【iOS】#32 管理 Localizable 資料於 Google Sheet

在 Google Sheet 上管理 Localizable 資料,輸出對應格式

Leo Kuo
6 min readSep 5, 2021

在處理多國語系的時候,會發現當文本變多的時候,很難去管理這些資料。我們需要切換多個 Localizable.string 去變更不一樣的文本。有時還有可能漏改,導致文本沒有對應的值。

這時我們需要額外的工具來管理這些 Localizable 的資料。

網路上有些現成工具可以幫助我們管理,例如像 Phrase ,它可以幫助我們管理不同語言的文本,並且轉換成不同樣的檔案格式。

雖然 Phrase 功能很強大,但是並非免費的管理平台。若我們只是想管理 iOS 開發上會用到的 Localizable.string 格式,其實可以透過 Google Sheet 管理,並撰寫 Apps Script 輸出相對應的格式。

新增 Google Sheet 儲存文本

先開一個 google sheet,填入 key 以及對應的語言 value。上圖先以英文與繁體中文作為示範,若想要有更多的語言可以再新增多個欄位。

進入指令碼編輯器撰寫 Apps Script

點選工具 -> 指令碼編輯器,接著會開啟分頁顯示以下畫面:

在指令碼編輯器中,可以輸入指令對剛才新增的 Google Sheet 操作。Apps Script 是 based on JavaScript,語法與 JS 一致。

因為我們想將 Google Sheet 上的資料製作成 GET API,需要使用 doGet 這個 function。

首先先拿到對應的工作表:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('localizable') 
工作的名字在紅框處

getData function 則是取得資料並轉換格式的地方,其中第二個參數是語言版本所在的 index,修改 index 來讀不一樣的語言(以此範例來說,1是英文版、2是中文版)。

首先,得到想要的資料範圍,getRange 有四個參數,分別是起始的行、欄為以及最終的行、欄位。

var rows = 
sheet.getRange(2, 1, sheet.getLastRow()-1, sheet.getLastColumn()).getValues()

rows 會得到一個二維陣列:

[
[ 'Control_Save', 'Save', '儲存' ],
[ 'Control_Delete', 'Delete', '刪除' ],
[ 'Control_Next', 'Next', '下一步' ],
[ 'Control_Confirm', 'Confirm', '確認' ]
]

接著遍歷陣列,輸出 localizable.string 的格式(“key” = “value”;):

for(i=0; i<rows.length; i++) {  var dataRow = rows[i]  // 輸出 "key" = "value"; 的格式,並換行 
result += "\"" + dataRow[0] + "\"" + " = " + "\"" + dataRow[version] + "\";\n\n"
}

最後 return 文字型態

return ContentService.createTextOutput(result).setMimeType(ContentService.MimeType.TEXT)

部署

在部署之前可以使用 console.log 做檢查,點選上方的「執行」即可 run 指令碼。第一次執行時會確認是否授權,點選允許即可。

要部署時,點選頁面右上方藍色按鈕「部署」-> 「新增部署作業」,接著會看到以下視窗:

點選上方齒輪將網頁應用程式與 API 執行檔打勾。存取設定為所有人,意味著所有人透過這個網址都可以 Get 資料,不需經過身份驗證。

接著部署後即可拿到網址,輸入網址後即可看到輸出的文字格式,丟到 API 測試的網站中,可以看到有拿到其中的資料:

目前已經拿到英文版本的 API url,若要拿到中文本的 localizable.string ,將剛才的 getData 第二個參數改為 2,去索引中文的欄位。然後再進行一次部署,拿到另外一個中文文本的 API url。

應用

到這邊算是告一個段落,以後更新 Google Sheet,到部署的網址中即可拿到 localizable 的資料。使用 Google Sheet 可以清楚的知道 key 與對應的值,也比較不會漏掉該填的欄位。

不過目前只能進入網址中全選,然後回到 Xcode 中的 localizable.sting 自行貼上,之後再來寫一篇如何使用 Python 一鍵更新 localizable.string。

--

--

Leo Kuo

Indie Game Developer | Frontend Developer | iOS Developer | UIUX