iOS 多國語系 – iOS Localization

Photo by Kevin Walker on Unsplash
Photo by Kevin Walker on Unsplash
大部分的 App 都會支援多國語系 (Localization)。在 iOS 上實現 Localization 很簡單。我們不需要自己做語系檔,因為 Xcode 會幫我們產生語系檔。填好翻譯字串後,匯入 Xcode 就可以了。本章就來介紹如何用 Xcode 實現 Localization。

大部分的 App 都會支援多國語系 (Localization)。在 iOS 上實現 Localization 很簡單。我們不需要自己做語系檔,因為 Xcode 會幫我們產生語系檔。填好翻譯的字串後,匯入 Xcode 就可以了。本章就來介紹如何用 Xcode 實現 Localization。

本章完整的程式碼可以在 下載。

建立專案

首先我們先建立一個簡單的 App。在這 App 中,點擊 Click Me 按鈕後,下面的 … 就會換成 Hello。接下來我們會讓 Click MeHello 支援中文。

iOS Localization Example
iOS Localization Example
class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
    
    @IBAction func onClick(_ sender: Any) {
        label.text = "Hello"
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

新增 Xcode 中文語系

一般專案建立後,預設是英文語系。我們來給它新增中文語系。

Add Chinese
Add Chinese

勾選要支援中文語系的檔案。請勾選 Main.storyboard,因為 Click Me 按鈕在裡面。

Select Chinese localization file
Select Chinese localization file

新增好後,專案中的 Localizations 下面多了 Chinese, Traditional。另外 Main.storyboard 下面有多出 Main.strings,而且旁邊有註明是中文語系。

這個 Main.strings 就是 Main.storyboard 的中文語系檔。不過我們不會直接去新增中文翻譯在這裡面,因為 Xcode 提供更便利的方法。我們將在下面介紹 .Xliff

Xcode Localizations
Xcode Localizations

NSLocalizedString

NSLocalizedString 會根據目前 App 的語系,傳回相對應語系的字串。所以在程式中的字串,都要透過 NSLocalizedString 來取得。我們將修改成以下的程式。

class ViewController: UIViewController {
    @IBOutlet weak var label: UILabel!
    
    @IBAction func onClick(_ sender: Any) {
        label.text = NSLocalizedString("Hello", comment: "Shown by click me")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

Xliff 檔案

接下來,我們要加上中文字串。首先匯出語系檔。匯出後,在匯出的資料夾裡面找 .xliff 檔案。我們現在有英文和中文語系,所以你會找到 en.xliffzh-Hant.xliff。因為我們是要加入中文,所以就看 zh-Hant.xliff

Export localizations
Export localizations

zh-Hant.xliff是 XML 格式的檔案。每個需要翻譯的字串都有一對 <trans-unit> 包起來。<source> 是英文語系的,而 <target> 就是相對應的中文語系。另外 NSLocalizedStringcomment 參數的值會填入 <note>

<trans-unit id="PeQ-rk-iei.normalTitle" xml:space="preserve">
    <source>Click Me</source>
    <target>Click Me</target>
    <note>Class = "UIButton"; normalTitle = "Click Me"; ObjectID = "PeQ-rk-iei";</note>
</trans-unit>

<trans-unit id="Hello" xml:space="preserve">
    <source>Hello</source>
    <target>Hello</target>
    <note>Shown by click me</note>
</trans-unit>

<target> 替換成中文。

<trans-unit id="PeQ-rk-iei.normalTitle" xml:space="preserve">
    <source>Click Me</source>
    <target>點我 </target>
    <note>Class = "UIButton"; normalTitle = "Click Me"; ObjectID = "PeQ-rk-iei";</note>
</trans-unit>

<trans-unit id="Hello" xml:space="preserve">
    <source>Hello</source>
    <target>哈囉</target>
    <note>Shown by click me</note>
</trans-unit>

存檔後,我們匯入 zh-Hant.xcloc 資料夾。匯入之後,專案下面會多一個 Localizable.strings 的檔案。NSLocalizedString 就是會透過這檔案找出翻譯字串。

Import localizations
Import localizations

當要翻譯的字串很多時,直接編輯 .xliff 檔會變得很混亂。有很多免費的線上 Xliff 編輯器可以用。Mac App 的話, Xliff Editor 是不錯的選擇。

預覽 Storyboard

當我們匯入中文語系檔後,我們可以直接在 Storyboard 上預覽中文語系。點擊右上角的 Adjust Editor Options -> Preview。

Enable Preview
Enable Preview

在預覽畫面的右下方,你可以切換語系。

Preview Storyboard
Preview Storyboard

執行 App

當程式在模擬器上執行的時候,預設是使用英文語系。我們可以讓 App 用中文語系執行,而不用去改模擬器的系統語系。

Click Edit Scheme
Click Edit Scheme
Switch App language
Switch App language

結語

在 Xcode 中我們可以將字串寫在任何的地方。匯出語系檔時,這些字串就會被包含在裡面。我們不需要自己做語系檔。有很多的開發工具並沒有支援這樣的方式,那時後你就必須要自己手動建立語系檔。雖然它不難,但是在維護上卻是很繁瑣。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like
Photo by Alex Alvarez on Unsplash
Read More

Dispatch Queue 教學

GCD 提供有效率的並行處理,讓我們不需要直接管理多執行緒。它的 Dispatch Queues 可以循序地(serially)或是並行地(concurrently)執行任務。我們只需要將要並行的程式當作任務提交到 dispatch queues 就可以了。
Read More
Photo by Florinel Gorgan on Unsplash
Read More

如何製作一個 XCFramework

XCFramework 讓你可以將 iPhone、iPhone 模擬器等多的不同平台的二進位碼打包到一個可發佈的 .xcframework 檔。你只需要為你的 Framework 產生出一個 .xcframework 檔,就可以支援多種平台。
Read More
Photo by Fabian Gieske on Unsplash
Read More

SwiftUI @State & @Binding 教學

SwiftUI 推出了兩個 Property Wrapper – @State and @Binding。利用它們可以達到變數的 Two-way Binding 功能。也就是當變數的值改變時,它會重新被顯示。本章藉由製作一個 Custom View 來展示如何使用 @State 和 @Binding。
Read More
Photo by Svitlana on Unsplash
Read More

iOS:禁止螢幕截圖

基於一些理由,我們可能會想要禁止使用者對我們的 app 做螢幕截圖。然而,iOS 並沒有提供這樣的功能。所幸,我們可以利用 UITextField 來達到此效果。
Read More