了解使用者設定檔語言和應用程式資訊清單語言

Windows 使用者可以使用設定>時間&>語言區域&語言來設定慣用顯示語言的已排序列表,或只設定單一慣用的顯示語言。 語言可以有區域變體。 例如,您可以選擇西班牙使用的西班牙語、墨西哥使用的西班牙語、美國使用的西班牙語等。

同樣在設定>時間&語言>區域語言&中,但與語言分開,使用者可以指定他們在世界上的位置 (稱為區域)。 請注意,顯示語言 (和區域變體) 設定不是區域設定的決定因素,反之亦然。 例如,使用者目前可能居住在法國,但選擇首選 Windows 顯示語言 Español (墨西哥)。

針對 Windows 應用程式,語言會以 BCP-47 語言標記表示。 例如,BCP-47 語言標籤「en-US」會對應至設定中的英文 (美國)。 適當的 Windows 執行階段 API 接受並傳回 BCP-47 語言標記的字串表示。

另請參閱 IANA 語言子標記登錄

下列三個區段會定義「使用者配置檔語言清單」、「應用程式指令清單語言清單」和「應用程式執行時間語言清單」等詞彙。 我們將在本主題和其他功能區域中使用這些詞彙,因此請務必瞭解它們的意義。

使用者配置文件語言清單

使用者設定檔語言清單是使用者在設定>時間&語言>區域&語言>語言中設定的清單的名稱。 在程式碼中,您可以使用 GlobalizationPreferences.Languages 屬性以唯讀字串列表的形式存取使用者設定檔語言列表,其中每個字串都是單一 BCP-47 語言標記,例如「en-US」或「ja- JP」。

    IReadOnlyList<string> userLanguages = Windows.System.UserProfile.GlobalizationPreferences.Languages;

應用程式指令清單語言清單

應用程式指令清單語言清單是應用程式宣告 (或將宣告) 支援的語言清單。 當您在開發生命週期中一路進行當地語系化時,此清單就會成長。

此清單是在編譯時期決定的,但您有兩個選項可以確切控制這種情況的發生方式。 其中一個選項是讓 Visual Studio 從專案中的檔案判斷清單。 為此,首先在應用程式套件清單來源檔案 (Package.appxmanifest) 的應用程式標籤上設定應用程式的預設語言。 然後,確認相同的檔案包含此組態 (預設會執行此設定)。

  <Resources>
    <Resource Language="x-generate" />
  </Resources>

每次 Visual Studio 產生建置的應用程式包清單檔案 (AppxManifest.xml) 時,它都會將原始檔案中的單一 Resource 元素擴展為它在專案中找到的所有語言限定符的聯合 (請參閱針對語言、規模、高對比和其他限定條件客製化您的資源)。 例如,如果您已開始當地語系化,而且您有字串、影像和/或檔案資源,其資料夾或檔名包括「en-US」、「ja-JP」和「fr-FR」,則您的建置 AppxManifest.xml 檔案會包含下列專案 (清單中的第一個專案是您設定的預設語言)。

  <Resources>
    <Resource Language="EN-US" />
    <Resource Language="JA-JP" />
    <Resource Language="FR-FR" />
  </Resources>

另一種選擇是用擴展的 <Resource> 元素清單取代應用程式套件清單來源檔案 (Package.appxmanifest) 中的單一「x-generate」<Resource> 元素 (請注意首先列出預設語言)。 該選項涉及更多的維護工作,但如果您使用自訂建置系統,它可能是合適的選項。

首先,您的應用程式清單語言清單將僅包含一種語言。 也許那是 en-US。 但最終,當您手動設定清單或將翻譯的資源新增至專案時,該清單將會成長。

當您的應用程式位於 Microsoft Store 時,應用程式指令清單語言清單中的語言就是向客戶顯示的語言。 如需 Microsoft Store 特別支援的 BCP-47 語言標記清單,請參閱支援的語言

在程式代碼中,您可以使用 ApplicationLanguages.ManifestLanguages 屬性來存取應用程式指令清單語言清單做為只讀字串清單,其中每個字串都是單一 BCP-47 語言標記。

    IReadOnlyList<string> userLanguages = Windows.Globalization.ApplicationLanguages.ManifestLanguages;

應用程式執行時間語言清單

感興趣的第三種語言列表是我們剛剛描述的兩個列表之間的交集。 在執行時,您的應用程式已聲明支援的語言清單 (應用程式清單語言清單) 將與使用者已聲明首選項的語言清單 (使用者設定檔語言清單) 進行比較。 應用程式執行時語言清單設定為此交集 (如果交集不為空),或僅設定為應用程式的預設語言 (如果交集為空)。

更具體地說,應用程式執行時語言清單由這些項目組成。

  1. (選擇性) 主要語言覆寫PrimaryLanguageOverride 是一個簡單的覆寫設定,可為使用者提供自己的獨立語言選擇,或有一些強烈理由覆寫默認語言選擇的應用程式。 若要深入瞭解,請參閱應用程式資源和當地語系化範例
  2. 應用程式所支援的用戶語言。 這是由應用程式清單語言清單篩選的使用者設定檔語言清單。 按應用程式支援的語言過濾使用者的語言可以保持軟體開發工具組 (SDK)、類別庫、依賴框架包和應用程式之間的一致性。
  3. 如果 1 和 2 為空,則為應用程式支援的預設或第一種語言。 如果使用者設定檔語言清單不包含應用程式支援的任何語言,則應用程式執行時間語言是應用程式支援的第一種語言。

在程式代碼中,您可以使用 ResourceContext.QualifierValues 屬性,以字串的形式存取應用程式執行時間語言清單,其中包含以分號分隔的 BCP-47 語言標記清單。

    string runtimeLanguages = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().QualifierValues["Language"];

您還可以將其作為唯讀字串列表進行存取,每個字串都包含一個 BCP-47 語言標籤。 您可以使用 ResourceContext.Languages 屬性或 ApplicationLanguages.Languages 屬性執行此操作。

    IReadOnlyList<string> runtimeLanguages = Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Languages;

    runtimeLanguages = Windows.Globalization.ApplicationLanguages.Languages;

應用執行時間語言清單可確定 Windows 為您的應用程式載入的資源以及用於格式化日期、時間、數字和其他元件的語言。 查閱全球化您的日期/時間/數字格式

注意如果使用者設定檔語言和應用程式清單語言是彼此的區域變體,則使用者的區域變體將用作應用程式執行語言。 例如,如果使用者偏好 en-GB 並且應用程式支援 en-US,則應用程式執行時語言為 en-GB。 這可確保日期、時間和數字的格式更接近使用者的期望 (en-GB),但在地化資源仍以應用程式支援的語言 (en-US) 載入 (由於語言相符)。

使用其語言限定資源檔

使用語言資源限定符命名您的資源檔案或其資料夾。 要了解有關資源限定符的更多資訊,請參閱針對語言、比例、高對比度和其他限定符自訂資源。 資源檔案可以是影像 (或其他資產),也可以是資源容器文件,例如包含文字字串的 .resw

注意即使是應用程式預設語言的資源也必須指定語言限定符。 例如,如果您的應用程式的預設語言是英文 (美國),則將您的資產限定為 \Assets\Images\en-US\logo.png

  • Windows 執行複雜的匹配,包括跨區域變體,例如 en-US 和 en-GB。 因此,請酌情包含區域子標籤。 查閱資源管理系統如何比對語言標記
  • 當沒有為語言定義 Suppress-Script 值時,在限定符中指定語言指令碼子標籤。 例如,使用 zh-Hant、zh-Hant-TW 或 zh-Hans 代替 zh-CN 或 zh-TW (有關更多詳細資訊,請參閱 IANA 語言子標籤註冊表)。
  • 對於具有單一標準方言的語言,無需包含區域限定符。 例如,使用 ja 而不是 ja-JP。
  • 某些工具和其他元件 (例如機器翻譯器) 可能會找到有助於理解資料的特定語言標籤 (例如地區方言資訊)。

並非所有資源都需要當地語系化

可能並非所有資源都需要當地語系化。

  • 請至少確定所有資源都以預設語言存在。
  • 某些資源的子集可能足以滿足密切相關的語言 (部分本地化)。 例如,如果您的應用程式具有全套西班牙語資源,則您可能不會將應用程式的所有 UI 本地化為加泰羅尼亞語。 對於泰羅尼亞語優先於西班牙文的使用者,加泰羅尼亞語中無法使用的資源會以西班牙文顯示。
  • 某些資源可能需要特定語言的例外,而大多數其他資源會對應到公共資源。 在這種情況下,請使用未確定的語言標籤 'und' 標記要用於所有語言的資源。 Windows 將 'und' 語言標記解釋為萬用字元 (類似於「*」),因為它與任何其他特定匹配之後的頂級應用程式語言相符。 例如,如果芬蘭語的少數資源不同,但其餘資源對於所有語言都相同,則芬蘭語資源應使用芬蘭語語言標籤進行標記,其餘資源應使用 'und' 進行標記。
  • 對於以語言文本為基礎的資源,例如字型或文字高度,請使用未決定的語言標記搭配指定的指令碼:'und-<script>'。 例如,針對拉丁字型使用 und-Latn\\fonts.css,而對於斯拉夫文字型則使用 und-Cryl\\fonts.css

設定 HTTP Accept-Language 請求標頭

考慮您呼叫的 Web 服務是否具有與您的應用程式相同的本地化程度。 Windows 應用程式在典型 Web 請求和 XMLHttpRequest (XHR) 中發出的 HTTP 請求使用標準 HTTP Accept-Language 請求標頭。 預設情況下,HTTP 標頭設定為使用者設定檔語言清單。 清單中的每種語言都進一步擴展為包括該語言的中性詞和權重 (q)。 例如,使用者的 fr-FR 和 en-US 語言清單會導致 HTTP Accept-Language 請求標頭為 fr-FR、fr、en-US、en ("fr-FR,fr;q=0.8,en-US;q=0.5,en;q=0.3")。 但是,如果您的天氣應用程式 (例如) 以法文 (法國) 顯示 UI,但用戶的首選項清單中的首選語言是德語,那麼您需要從服務中明確請求法文 (法國) 才能保留在您的應用程式中保持一致。

Windows.Globalization 命名空間中的 API

一般而言,Windows.Globalization 命名空間中的 API 會使用應用程式執行時間語言清單來判斷語言。 如果沒有任何語言具有相符的格式,則會使用用戶地區設定。 這是用於系統時鐘的相同地區設定。 使用者區域設定可從設定>時間&語言>區域&語言>其他日期、時間&>區域設定區域:變更日期、時間或數字格式Windows.Globalization API 也有覆寫來指定要使用的語言清單,而不是應用程式執行時間語言清單。

使用 Language 類別,您可以檢查特定語言的詳細資料,例如語言的指令碼、顯示名稱和原生名稱。

適當時使用地理區域

設定>時間&語言>區域&語言>國家或地區中,使用者可以指定自己在世界上的位置。 您可以使用此設定,而不是語言,選擇要向使用者顯示的內容。 例如,新聞應用程式可能會預設顯示來自此區域的內容。

在程序代碼中,您可以使用 GlobalizationPreferences.HomeGeographicRegion 屬性來存取此設定。

使用 GeographicRegion 類別,您可以檢查特定區域的詳細資料,例如其顯示名稱、原生名稱和使用中的貨幣。

範例

下表包含使用者在各種語言和區域設定下在應用程式 UI 中看到的範例。

應用程式指令清單語言清單 使用者配置文件語言清單 應用程式的主要語言覆寫 (選擇性) 應用程式執行時間語言清單 使用者在應用程式中看到的內容
英語 (GB) (預設);德語 (德國) 英語 (GB) none 英語 (GB) UI:英文 (GB)
日期/時間/數位:英文 (GB)
德文 (德國) (預設):法文 (法國):義大利文 (義大利) 法文 (奧地利) none 法文 (奧地利) UI:法國 (法國) (法國後援 (奧地利))
日期/時間/數位:法文 (奧地利)
英文 (美國) (預設):法文 (法國):英文 (GB) 英文 (加拿大):法文 (加拿大) none 英文 (加拿大):法文 (加拿大) UI:英文 (美國) (英文後援 (加拿大))
日期/時間/數位:英文 (加拿大)
西班牙文 (西班牙) (預設);西班牙文 (墨西哥);西班牙文 (拉丁美洲);葡萄牙文 (巴西) 英文 (美國) none 西班牙文 (西班牙) UI:西班牙文 (西班牙) (使用預設值,因為沒有英文後援)
日期/時間/數字西班牙文 (西班牙)
加泰羅尼亞文 (預設值):西班牙文 (西班牙):法文 (法國) 加泰隆語;法文 (法國) none 加泰隆語;法文 (法國) UI:大部分是加泰羅尼亞語和一些法文 (法國),因為並非所有字串都在加泰羅尼亞語
日期/時間/數位:加泰羅尼亞文
英文 (GB) (預設):法文 (法國):德文 (德國) 德文 (德國):英文 (GB) 英文 (GB) (由應用程式 UI 中的使用者選擇) 英語 (GB);德語 (德國) UI:英文 (GB) (語言覆寫)
日期/時間/數位:英文 (GB)

注意

如需 Microsoft 所使用的標準國家/地區代碼清單,請參閱官方國家/地區清單

重要 API

範例