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 為每個裝置選擇正確的版本。 相同的機制可用來提供多種語言翻譯,方法是將資源目錄後綴為語言和文化特性識別碼。

Screenshot of Resources/drawable and Resources/values folders for multiple cultural identifiers

注意

指定最上層語言時,只需要 es 兩個字元;不過,指定完整地區設定時,目錄名稱格式需要虛線和小寫 r 來分隔這兩個部分,例如 pt-rBRzh-rCN。 將此值與程式代碼中傳回的值進行比較,其具有底線 (例如 )。 pt_BR 這兩者都與 .NET CultureInfo 類別所使用的值不同,其只有破折號(例如 )。 pt-BR 在跨 Xamarin 平臺工作時,請記住這些差異。

Strings.xml檔格式

本地化 目錄(例如 values-esvalues-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>

Screenshot of multiple values folders, each containing a Strings.xml file

設定字串檔案后,即可在版面配置和程式代碼中參考轉譯的值。

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 參數如下:

  • 一個
  • 2
  • 幾個
  • many
  • 其他

在Android檔中會更詳細地說明它們。如果指定的語言不需要「特殊」處理,則會忽略這些quantity字串(例如,英文只使用 oneother;指定zero字串不會有任何作用,將不會使用)。

影像

當地語系化影像會遵循與字串檔案相同的規則:應用程式中參考的所有影像都應該放在 繪製的目錄中,以便有後援。

然後,地區設定特定的影像應該放在合格的可繪製資料夾中,例如 drawable-esdrawable-ja (也可以新增 dpi 規範)。

在此螢幕快照中,四個影像會儲存在 繪製的目錄中,但只有一個 flag.png已在其他目錄中當地語系化複本。

Screenshot of multiple drawable folders, each containing one or more localized .png files

其他資源類型

您也可以提供其他類型的替代語言特定資源,包括版面配置、動畫和源檔。 這表示您可以為一或多個目標語言提供特定的螢幕配置,例如,您可以建立特別適用於德文的版面配置,以允許很長的文字標籤。

如果您設定應用程式設定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對齊值,而不是 leftright (例如 android:paddingStart)。end 也有新的 API,例如 LayoutDirectionTextDirectionTextAlignment ,可協助建置適合 RTL 讀取器的螢幕。

下列螢幕快照顯示 阿拉伯文中當地語系化 的 Tasky 範例

Screenshot of Tasky app in Arabic

下一個螢幕快照顯示 希伯來文中當地語系化 的 Tasky 範例

Screenshot of Tasky app in Hebrew

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。