共用方式為


Xamarin.iOS 中的當地語系化

本文件涵蓋 iOS SDK 的當地語系化功能,以及如何使用 Xamarin 存取它們。

如需在必須處理非 Unicode 資料的應用程式中包含字元集/代碼頁的指示,請參閱國際化編碼

iOS 平臺功能

本節說明 iOS 中的一些當地語系化功能。 跳到 下一節 ,以查看特定的程式代碼和範例。

語言

使用者在 設定 應用程式中選擇其語言。 這個設定會影響作業系統和應用程式中顯示的語言字串和影像。

若要判斷應用程式中使用的語言,請取得 的第一個專案 NSBundle.MainBundle.PreferredLocalizations

var lang = NSBundle.MainBundle.PreferredLocalizations[0];

此值將是語言代碼,例如 en 英文、 es 西班牙文、 ja 日文等。傳回的值僅限於應用程式支援的其中一個當地語系化(使用後援規則來判斷最佳相符專案)。

應用程式程式代碼不一定需要檢查此值 – Xamarin 和 iOS 都提供功能,可協助自動提供使用者語言的正確字串或資源。 本檔其餘部分會說明這些功能。

注意

使用 NSLocale.PreferredLanguages 來判斷使用者的語言喜好設定,不論應用程式所支援的當地語系化為何。 此方法傳回的值在iOS 9中已變更;如需詳細資訊,請參閱 技術附註 TN2418

地區設定

使用者在 設定 應用程式中選擇其地區設定。 此設定會影響日期、時間、數位和貨幣格式化的方式。

這可讓使用者選擇他們是否看到 12 小時或 24 小時的時間格式、小數分隔符是逗號或點,以及日期中顯示的日、月和年順序。

透過 Xamarin,您可以存取 Apple 的 iOS 類別 (NSNumberFormatter) 以及 System.Globalization 中的 .NET 類別。 開發人員應該評估哪一個更適合其需求,因為每個功能都有不同的可用功能。 特別是,如果您要使用 StoreKit 擷取和顯示應用程式內購買價格,則應該使用 Apple 的格式類別來取得傳回的價格資訊。

目前的地區設定可以透過下列兩種方式之一來查詢:

  • NSLocale.CurrentLocale.LocaleIdentifier
  • NSLocale.AutoUpdatingCurrentLocale.LocaleIdentifier

第一個值可由操作系統快取,因此不一定會反映使用者目前選取的地區設定。 使用第二個值來取得目前選取的地區設定。

注意

Mono(Xamarin.iOS 所依據的 .NET 運行時間)和 Apple 的 iOS API 不支援相同的語言/區域組合集。 因此,可以在 iOS 設定 應用程式中選取未對應至 Mono 中有效值的語言/區域組合。 例如,將 i 電話 的語言設定為英文,並將其區域設定為西班牙,會導致下列 API 產生不同的值:

  • CurrentThead.CurrentCulture:en-US (Mono API)
  • CurrentThread.CurrentUICulture:en-US (Mono API)
  • NSLocale.CurrentLocale.LocaleIdentifier:en_ES (Apple API)

由於Mono會使用 CurrentThread.CurrentUICulture 來選取資源及 CurrentThread.CurrentCulture 格式化日期和貨幣,因此Mono型當地語系化(例如,使用 .resx 檔案)可能不會產生這些語言/區域組合的預期結果。 在這些情況下,依賴 Apple 的 API 視需要當地語系化。

NSCurrentLocaleDidChangeNotification

當使用者更新其地區設定時,iOS 會產生 NSCurrentLocaleDidChangeNotification 。 應用程式在執行時可以接聽此通知,並可對UI進行適當的變更。

iOS 中的當地語系化基本概念

iOS 的下列功能可在 Xamarin 中輕鬆運用,以提供本地化的資源向用戶顯示。 請參閱 TaskyL10n 範例,以瞭解如何實作這些想法。

在 Info.plist 中指定預設和支持的語言

技術問答 QA1828:iOS 如何決定應用程式的語言中,Apple 說明 iOS 如何選取應用程式中使用的語言。 下列因素會影響顯示的語言:

  • 使用者慣用的語言(可在 設定 應用程式中找到)
  • 與應用程式配套的當地語系化 (.lproj 資料夾)
  • CFBundleDevelopmentRegion指定應用程式預設語言的 Info.plist 值)
  • CFBundleLocalizations指定所有支援本地化的 Info.plist 陣列)

如技術問答中所述, CFBundleDevelopmentRegion 代表應用程式的預設區域和語言。 如果應用程式未明確支援任何使用者慣用的語言,則會使用此欄位所指定的語言。

重要

iOS 11 比舊版作業系統更嚴格地套用此語言選擇機制。 因此,任何未明確宣告其支援本地化的iOS 11應用程式,無論是藉由包含 .lproj 資料夾或設定 值 CFBundleLocalizations ,在iOS 11 中可能會顯示與iOS 10不同的語言。

如果 CFBundleDevelopmentRegion Info.plist 檔案中尚未指定,則 Xamarin.iOS 建置工具目前會使用 預設值 。en_US 雖然這可能會在未來版本中變更,但表示預設語言為英文。

若要確保您的應用程式選取預期的語言,請執行下列步驟:

  • 指定預設語言。 開啟 Info.plist 並使用 Source 檢視來設定索引鍵的值 CFBundleDevelopmentRegion ;在 XML 中,它看起來應該如下所示:
<key>CFBundleDevelopmentRegion</key>
<string>es</string>

此範例會使用 「es」 來指定當不支援任何使用者慣用語言時,預設為西班牙文。

  • 宣告所有支援的當地語系化。 在 Info.plist,使用 Source 檢視來設定索引鍵的 CFBundleLocalizations 陣列;在 XML 中,它看起來應該如下所示:
<key>CFBundleLocalizations</key>
<array>
    <string>en</string>
    <string>es</string>
    ...
</array>

已使用 .NET 機制本地化的 Xamarin.iOS 應用程式,例如 .resx 檔案也必須提供這些 Info.plist 值。

如需這些 Info.plist 金鑰的詳細資訊,請參閱 Apple 的資訊 屬性清單金鑰參考

GetLocalizedString 方法

方法 NSBundle.MainBundle.GetLocalizedString 會查閱已儲存在 專案中 .strings 檔案中的本地化文字。 這些檔案是以語言組織,在具有 .lproj 後綴的特別命名目錄中(請注意,擴展名的第一個字母是小寫 “L”。

.strings 檔案位置

  • Base.lproj 是包含預設語言資源的目錄。 它通常位於專案根目錄中(但也可以放在 Resources 資料夾中)。
  • <language.lproj> 目錄會針對每個支持的語言建立,通常是在 Resources 資料夾中。

每個語言目錄中可以有多個不同的 .strings 檔案:

  • Localizable.strings – 本地化文字的主要列表。
  • InfoPlist.strings – 此檔案中允許特定密鑰轉譯應用程式名稱等專案。
  • <storyboard-name.strings> – 選擇性檔案,其中包含分鏡腳本中使用者介面元素的翻譯。

這些檔案的建置動作應該是套件組合資源

.strings 檔格式

本地化字串值的語法如下:

/* comment */
"key"="localized-value";

您應該逸出字串中的下列字元:

  • \" 引言
  • \\ 反斜杠
  • \n 換行符

這是 es/Localizable.strings 範例 (ie.來自範例的西班牙文檔案:

"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";

影像

若要在 iOS 中本地化映射:

  1. 請參閱程式代碼中的影像,例如:

    UIImage.FromBundle("flag");
    
  2. 將預設圖像檔 flag.png 放在 Base.lproj (原生開發語言目錄) 中。

  3. 選擇性地將映像的當地語系化版本放在每個語言的 .lproj 資料夾中(例如 es.lproj,ja.lproj)。 在每個語言目錄中使用相同的檔名 flag.png

如果特定語言沒有影像,iOS 會回復為預設原生語言資料夾,並從該處載入映像。

啟動映像

將映像放在每個語言的 .lproj 目錄中時,請使用啟動映射的標準命名慣例(以及 i 電話 6 個模型的 XIB 或分鏡腳本。

Default.png
Default@2x.png
Default-568h@2x.png
LaunchScreen.xib

應用程式名稱

將 InfoPlist.strings 檔案放在 .lproj 目錄中,可讓您覆寫來自應用程式 Info.plist 的某些值,包括應用程式名稱:

"CFBundleDisplayName" = "LeónTodo";

其他可用來 本地化應用程式特定字串的 索引鍵如下:

  • CFBundleName
  • CFBundleShortVersionString
  • NSHumanReadableCopyright

日期和時間

雖然可以使用內建的 .NET 日期和時間函式(以及目前的 CultureInfo)來格式化地區設定的日期和時間,但這會忽略地區設定特定的用戶設定(可以個別設定語言)。

使用 iOS NSDateFormatter 產生符合用戶地區設定喜好設定的輸出。 下列範例程式代碼示範基本日期和時間格式設定選項:

var date = NSDate.Now;
var df = new NSDateFormatter ();
df.DateStyle = NSDateFormatterStyle.Full;
df.TimeStyle = NSDateFormatterStyle.Long;
Debug.WriteLine ("Full,Long: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Short;
df.TimeStyle = NSDateFormatterStyle.Short;
Debug.WriteLine ("Short,Short: " + df.StringFor(date));
df.DateStyle = NSDateFormatterStyle.Medium;
df.TimeStyle = NSDateFormatterStyle.None;
Debug.WriteLine ("Medium,None: " + df.StringFor(date));

美國 中英文的結果:

Full,Long: Friday, August 7, 2015 at 10:29:32 AM PDT
Short,Short: 8/7/15, 10:29 AM
Medium,None: Aug 7, 2015

西班牙西班牙文的結果:

Full,Long: viernes, 7 de agosto de 2015, 10:26:58 GMT-7
Short,Short: 7/8/15 10:26
Medium,None: 7/8/2015

如需詳細資訊,請參閱Apple Date Formatters 檔。 測試區分地區設定的日期和時間格式時,請檢查 i 電話 [語言] 和 [區域] 設定。

從右至左 (RTL) 版面配置

iOS 提供許多功能來協助建置 RTL 感知應用程式:

  • 使用自動版面配置 leadingtrailing 屬性進行控件對齊(對應至英文的左右,但 RTL 語言會反轉)。 控件 UIStackView 特別適合用來配置要讓 RTL 感知的控制件。
  • 用於 TextAlignment = UITextAlignment.Natural 文字對齊方式(大部分語言都會保留,但針對 RTL 使用右方)。
  • UINavigationController 會自動翻轉返回按鈕並反轉撥動方向。

下列螢幕快照顯示 阿拉伯文和希伯來文的當地語系化 Tasky 範例 (雖然已在欄位中輸入英文):

Localization in Arabic

Localization in Hebrew

iOS 會自動反轉 UINavigationController,而其他控件則放置在自動版面配置內 UIStackView 或對齊。 RTL 文字是以與 LTR 文字相同的方式,使用 .strings 檔案進行當地語系化。

在程式代碼中當地語系化 UI

Tasky (程式代碼本地化)範例示範如何將使用者介面內建的程式代碼(而非 XIB 或分鏡腳本)當地語系化。

專案結構

Screenshot shows the resources tree for a sample including the location of localizable strings.

Localizable.strings 檔案

如上所述, Localizable.strings 檔格式是由索引鍵/值組所組成。 索引鍵描述字串的意圖,而值是要用於應用程式中的翻譯文字。

範例的西班牙文 (es) 當地語系化如下所示:

"<new task>" = "<new task>";
"Task Details" = "Detalles de la tarea";
"Name" = "Nombre";
"task name" = "nombre de la tarea";
"Notes" = "Notas";
"other task info"= "otra información de tarea";
"Done" = "Completo";
"Save" = "Guardar";
"Delete" = "Eliminar";

執行當地語系化

在應用程式程式代碼中,無論使用者介面的顯示文字設定在何處(無論是標籤的文字,還是輸入的佔位元等等),程式代碼都會使用iOS GetLocalizedString 函式來擷取正確的翻譯來顯示:

var localizedString = NSBundle.MainBundle.GetLocalizedString ("key", "optional");
someControl.Text = localizedString;

當地語系化分鏡腳本 UI

範例 Tasky (本地化分鏡腳本) 示範如何在分鏡腳本中的控件上當地語系化文字。

專案結構

Base.lproj 目錄包含分鏡腳本,而且也應該包含應用程式中使用的任何影像。

其他語言目錄包含 程式代碼中所參考之任何字串資源的Localizable.strings 檔案,以及 包含分鏡腳本中文字翻譯的MainStoryboard.strings 檔案。

Screenshot shows the resources tree for a sample including the location of MainStoryboard strings.

語言目錄應該包含任何已本地化的影像複本,以覆寫Base.lproj中的影像。

物件標識碼/本地化標識碼

在分鏡文本中建立和編輯控件時,請選取每個控件,並檢查要用於本地化的識別碼:

  • 在 Visual Studio for Mac 中,它位於 Properties Pad 中,稱為當地語系化標識碼
  • 在 Xcode 中,它稱為 物件標識符

此字串值的格式通常如 “NF3-h8-xmR”,如下列螢幕快照所示:

Xcode view of Storyboard localization

這個值用於 .strings 檔案中,自動將翻譯的文字指派給每個控件。

MainStoryboard.strings

分鏡腳本翻譯檔案的格式類似於 Localizable.strings 檔案,不同之處在於索引鍵(左邊的值)無法使用者定義的,但必須具有非常特定的格式: ObjectID.property

在下列 Mainstoryboard.strings 範例中,您可以看到 UITextField具有placeholder可本地化的 text 屬性; UILabels 具有 text 屬性;而UIButton預設文字是使用 normalTitle來設定:

"SXg-TT-IwM.placeholder" = "nombre de la tarea";
"Pqa-aa-ury.placeholder"= "otra información de tarea";
"zwR-D9-hM1.text" = "Detalles de la tarea";
"bAM-2j-Rzw.text" = "Notas";           /* Notes */
"NF3-h8-xmR.text" = "Completo";        /* Done */
"MWt-Ya-pMf.normalTitle" = "Guardar";  /* Save */
"IGr-pR-05L.normalTitle" = "Eliminar"; /* Delete */

重要

使用具有大小類別的分鏡腳本可能會導致不會出現在應用程式中的翻譯。 Apple 的 Xcode 版本資訊 指出,如果有三件事成立,腳本或 XIB 將無法正確當地語系化:它會使用大小類別、基底當地語系化和組建目標設定為通用,以及組建目標 iOS 7.0。 修正方式是將您的分鏡腳本字串檔案複製到兩個相同的檔案: MainStoryboard~iphone.stringsMainStoryboard~ipad.strings,如下列螢幕快照所示:

Strings files

App Store 清單

遵循 Apple App Store 當地語系化常見問題,為您的應用程式銷售的每個國家/地區輸入翻譯。 請注意,只有當您的應用程式也包含語言的 當地語系化 .lproj 目錄時,才會顯示翻譯的警告。

摘要

本文涵蓋使用內建資源處理和分鏡腳本功能來當地語系化 iOS 應用程式的基本概念。

您可以在此跨平臺指南深入瞭解 i18n 和 L10n for iOS、Android 和跨平台應用程式(包括 Xamarin.Forms)。