本地化與全球化雖常被混淆,實則分工明確:全球化 是架構層面的準備(支援 Unicode、文化特定格式化、不硬編碼字串),本地化 則是針對特定語言/地區進行資源翻譯與 UI 調整。Windows 8 提供完整的資源管理系統(.resw、ResourceLoader、ResourceManager)與全球化 API(Windows.Globalization),協助開發者打造真正的世界級應用。
Resources.resw:預設/後援資源Resources.lang-en.resw:英文資源Resources.lang-zh-Hans-CN.resw:簡體中文資源logo.lang-en.scale-100.png 命名慣例<TextBlock x:Uid="HelloTextBlock" />
<!-- 對應資源鍵:HelloTextBlock.Text, HelloTextBlock.FontSize -->
ResourceLoader loader = new ResourceLoader(); // 預設 Resources.resw
string hello = loader.GetString("Hello");
// 指定資源檔
ResourceLoader loader2 = new ResourceLoader("MyResources"); // MyResources.resw
// 類別庫資源
ResourceLoader loader3 = new ResourceLoader("ClassLibrary/MyResources");
Package.appxmanifest、Tile/Toast 範本均支援 ms-resource:Hello 或 ms-resource:///Resources/Hello 參考資源。
// 目前語言
string current;
ResourceManager.Current.DefaultContext.QualifierValues.TryGetValue("Language", out current);
// 設定偏好語言(立即生效,觸發 MapChanged 事件)
ApplicationLanguages.PrimaryLanguageOverride = "zh-Hans-CN";
// 列舉清單支援語言
foreach (string tag in ApplicationLanguages.ManifestLanguages) {
var lang = new Windows.Globalization.Language(tag);
// lang.DisplayName, lang.NativeName, lang.Script
}
ResourceContext ctx = new ResourceContext { Languages = new[] { "en" } };
ResourceMap map = ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
string englishHello = map.GetValue("Hello", ctx).ValueAsString;
ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += async (s, e) => {
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => {
// 更新 UI
});
};
GlobalizationPreferences.Languages; // 偏好語言清單
GlobalizationPreferences.Calendars; // 偏好行曆(GregorianCalendar 等)
GlobalizationPreferences.Clocks; // 時制(24HourClock 等)
GlobalizationPreferences.HomeGeographicRegion; // 家鄉區域("TW", "US" 等)
GlobalizationPreferences.WeekStartsOn; // 週起始日(DayOfWeek.Monday 等)
var lang = new Windows.Globalization.Language("zh-Hans-CN");
lang.DisplayName; // "中文 (中華人民共和國)"
lang.NativeName; // "中文 (中国)"
lang.LanguageTag; // "zh-Hans-CN"
lang.Script; // "Hans"
Language.CurrentInputMethodLanguageTag; // 目前 IME 語言
var region = new GeographicRegion(); // 目前使用者區域
region.DisplayName; // "台灣"
region.NativeName; // "台灣"
region.CurrenciesInUse; // ["TWD"]
region.CodeTwoLetter; // "TW"
region.CodeThreeLetter; // "TWN"
region.CodeThreeDigit; // "158"
var gregorian = new Calendar(); // 預設公曆
var hebrew = new Calendar(new[] { "zh-CN" }, CalendarIdentifiers.Hebrew, ClockIdentifiers.TwentyFourHour);
string day1 = gregorian.DayAsString(); // "15"
string day2 = hebrew.DayAsString(); // 希伯來曆對應日期
// 百分比
new PercentFormatter().Format(3.1415926); // "314.16%"
new PercentFormatter(new[]{"zh-Hans-CN"}, "CN").Format(3.1415926); // "314.16%"
// 千分比
new PermilleFormatter().Format(3.1415926); // "3,141.59‰"
// 一般數字
new DecimalFormatter().Format(3.1415926); // "3.1415926"
// 貨幣
new CurrencyFormatter("TWD").Format(3.1415926); // "NT$3.14"
new CurrencyFormatter("CNY", new[]{"zh-Hans-CN"}, "CN").Format(3.1415926); // "¥3.14"
所有格式化類別均支援建構式指定語言清單與區域,確保輸出符合使用者預期。
善用 ResourceLoader 與 x:Uid 實現聲明式本地化,配合 ApplicationLanguages.PrimaryLanguageOverride 提供應用程式內語言切換;全球化層面則透過 Windows.Globalization 命名空間處理日期、數字、貨幣、行曆等文化差異。記住:全球化是架構,本地化是內容,兩者缺一不可。