Android 當地語系化
本文件介紹 Android SDK 的當地語系化功能,以及如何使用 Xamarin 存取它們。
Android 平台功能
本節說明 Android 的主要當地語系化功能。 跳到 下一節 ,以查看特定的程式代碼和範例。
地區設定
使用者在 [設定>語言和輸入] 中選擇其語言。 此選取範圍會控制所使用的語言和區域設定(例如日期和數位格式設定)。
目前的地區設定可以透過目前內容的 Resources
查詢:
var lang = Resources.Configuration.Locale; // eg. "es_ES"
此值將是地區設定識別碼,其中包含語言代碼和地區設定程式碼,並以底線分隔。 如需參考,以下是透過 StackOverflow 的 Java 地區設定和 Android 支援的地區設定清單。
常見的範例包括:
en_US
英文 (美國)es_ES
西班牙文(西班牙)ja_JP
日文(日本)zh_CN
中文(中國)zh_TW
中文(臺灣)pt_PT
葡萄牙文(葡萄牙)pt_BR
葡萄牙文(巴西)
LOCALE_CHANGED
Android 會在 android.intent.action.LOCALE_CHANGED
用戶變更其語言選取專案時產生。
活動可以選擇在活動上設定 android:configChanges
屬性來處理此動作,如下所示:
[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
ConfigurationChanges = ConfigChanges.Locale | ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
Android 中的國際化基本概念
Android 的當地語系化策略具有下列主要部分:
包含本地化字串、影像和其他資源的資源資料夾。
GetText
方法,用來擷取程式代碼中的當地語系化字串@string/id
在 AXML 檔案中,自動將當地語系化字串放在版面配置中。
資源資料夾
Android 應用程式會管理資源資料夾中的大部分內容,例如:
- layout - 包含 AXML 版面配置檔案。
- 可 繪製 - 包含影像和其他可繪製的資源。
- values - 包含字串。
- raw - 包含數據檔。
大部分的開發人員已經熟悉在可繪製目錄上使用 dpi 後綴來提供影像的多個版本,讓 Android 為每個裝置選擇正確的版本。 相同的機制可用來提供多種語言翻譯,方法是將資源目錄後綴為語言和文化特性識別碼。
注意
指定最上層語言時,只需要 es
兩個字元;不過,指定完整地區設定時,目錄名稱格式需要虛線和小寫 r 來分隔這兩個部分,例如 pt-rBR 或 zh-rCN。 將此值與程式代碼中傳回的值進行比較,其具有底線 (例如 )。 pt_BR
這兩者都與 .NET CultureInfo
類別所使用的值不同,其只有破折號(例如 )。 pt-BR
在跨 Xamarin 平臺工作時,請記住這些差異。
Strings.xml檔格式
本地化 值 目錄(例如 values-es 或 values-pt-rBR) 應該包含名為 Strings.xml 的檔案,其中包含該地區設定的翻譯文字。
每個可翻譯的字串都是一個 XML 元素,其資源識別元指定為 name
屬性,並將翻譯的字串指定為值:
<string name="app_name">TaskyL10n</string>
您必須根據一般 XML 規則逸出,而且 name
必須是有效的 Android 資源識別碼(沒有空格或破折號)。 以下是範例的預設 (英文) 字串檔案範例:
values/Strings.xml
<resources>
<string name="app_name">TaskyL10n</string>
<string name="taskadd">Add Task</string>
<string name="taskname">Name</string>
<string name="tasknotes">Notes</string>
<string name="taskdone">Done</string>
<string name="taskcancel">Cancel</string>
</resources>
西班牙文目錄 值 es 包含具有相同名稱的檔案(Strings.xml),其中包含翻譯:
values-es/Strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">TaskyLeon</string>
<string name="taskadd">agregar tarea</string>
<string name="taskname">Nombre</string>
<string name="tasknotes">Notas</string>
<string name="taskdone">Completo</string>
<string name="taskcancel">Cancelar</string>
</resources>
設定字串檔案后,即可在版面配置和程式代碼中參考轉譯的值。
AXML 版面配置檔案
若要參考版面配置檔案中的當地語語串,請使用 @string/id
語法。 此範例中的 XML 代碼段會顯示 text
使用本地化資源識別碼設定的屬性(已省略一些其他屬性):
<TextView
android:id="@+id/NameLabel"
android:text="@string/taskname"
... />
<CheckBox
android:id="@+id/chkDone"
android:text="@string/taskdone"
... />
GetText 方法
若要在程式代碼中擷取翻譯的字串,請使用 GetText
方法並傳遞資源識別碼:
var cancelText = Resources.GetText (Resource.String.taskcancel);
數量字串
Android 字串資源也可讓您建立 數量字串 ,讓翻譯人員為不同的數量提供不同的翻譯,例如:
- “還有1個任務。
- “還有 2 個工作要做。
(而不是泛型“有 n 個任務(s) 左”)。
在 Strings.xml
<plurals name="numberOfTasks">
<!--
As a developer, you should always supply "one" and "other"
strings. Your translators will know which strings are actually
needed for their language.
-->
<item quantity="one">There is %d task left.</item>
<item quantity="other">There are %d tasks still to do.</item>
</plurals>
若要轉譯完整的字串,請使用 GetQuantityString
方法,傳遞要顯示的資源標識碼和值(傳遞兩次)。 Android 會使用第二個參數來判斷quantity
要使用的字串,第三個參數是實際替換成字串的值(兩者都是必要專案)。
var translated = Resources.GetQuantityString (
Resource.Plurals.numberOfTasks, taskcount, taskcount);`
有效的 quantity
參數如下:
- 零
- 一個
- two
- few
- many
- 其他
在Android檔中會更詳細地說明它們。如果指定的語言不需要「特殊」處理,則會忽略這些quantity
字串(例如,英文只使用 one
和 other
;指定zero
字串不會有任何作用,將不會使用)。
影像
當地語系化影像會遵循與字串檔案相同的規則:應用程式中參考的所有影像都應該放在 可 繪製的目錄中,以便有後援。
然後,地區設定特定的影像應該放在合格的可繪製資料夾中,例如 drawable-es 或 drawable-ja (也可以新增 dpi 規範)。
在此螢幕快照中,四個影像會儲存在 可 繪製的目錄中,但只有一個 flag.png已在其他目錄中當地語系化複本。
其他資源類型
您也可以提供其他類型的替代語言特定資源,包括版面配置、動畫和源檔。 這表示您可以為一或多個目標語言提供特定的螢幕配置,例如,您可以建立特別適用於德文的版面配置,以允許很長的文字標籤。
如果您設定應用程式設定android:supportsRtl="true"
,Android 4.2 引進了由右至左 (RTL) 語言的支援。 資源限定元 "ldrtl"
可以包含在目錄名稱中,以包含專為 RTL 顯示設計的自訂版面配置。
如需資源目錄命名和後援的詳細資訊,請參閱 Android 檔來 提供替代資源。
應用程式名稱
應用程式名稱很容易透過在 中針對MainLauncher
活動使用 @string/id
來當地語系化:
[Activity (Label = "@string/app_name", MainLauncher = true, Icon="@drawable/launcher",
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Locale)]
由右至左 (RTL) 語言
Android 4.2 和更新版本提供 RTL 配置的完整支援,如原生 RTL 支援部落格中所述。
使用 Android 4.2 (API 層級 17) 和更新版本時,可以使用 和 來指定start
對齊值,而不是 left
和 right
(例如 android:paddingStart
)。end
也有新的 API,例如 LayoutDirection
、 TextDirection
和 TextAlignment
,可協助建置適合 RTL 讀取器的螢幕。
下列螢幕快照顯示 阿拉伯文中當地語系化 的 Tasky 範例 :
下一個螢幕快照顯示 希伯來文中當地語系化 的 Tasky 範例 :
RTL 文字會使用與 LTR 文字相同的方式,使用 Strings.xml 檔案進行當地語系化。
測試
請務必徹底測試預設的地區設定。 如果因為某些原因而無法載入預設資源,您的應用程式將會當機(亦即遺失這些資源)。
模擬器測試
如需如何使用ADB殼層將模擬器設定為特定地區設定的指示,請參閱Android模擬器上的Google測試一節。
adb shell setprop persist.sys.locale fr-CA;stop;sleep 5;start
裝置測試
若要在裝置上進行測試,請變更 [設定] 應用程式中的語言。
提示
記下功能表項的圖示和位置,以便您將語言還原為原始設定。
摘要
本文涵蓋使用內建資源處理來當地語系化 Android 應用程式的基本概念。 您可以在此跨平臺指南中深入瞭解 iOS、Android 和跨平臺 (包括 Xamarin.Forms) 應用程式的 i18n 和 L10n。