共用方式為


如何載入字串資源 (HTML)

[ 本文的目標對象是撰寫 Windows 執行階段 App 的 Windows 8.x 和 Windows Phone 8.x 開發人員。如果您正在開發適用於 Windows 10 的 App,請參閱 最新文件 ]

您可以從資源檔、程式庫、控制項及應用程式套件和資訊清單等物件載入字串資源。

從資源檔載入字串

字串資源是在資源檔中撰寫的,並使用資源識別碼參照。如需載入字串資源的基本介紹,請參閱快速入門:使用字串資源

大部分的應用程式的每種語言 (<language>/Resources.resjson) 只需要一個預設資源檔,而且可以使用該檔案內之機碼的相對路徑參照它們的資源 (例如 /String1)。但是在某些應用程式中,可以將資源分別置於多個資源檔中,以便分隔元件。

例如:

檔案名稱:

Strings/en-US/Errors.resjson

標記中的參考:

<span data-win-res="{textContent: '/Errors/AlreadyRegistered'}"></span>

程式碼中的參考:

WinJS.Resources.getString('/Errors/AlreadyRegistered');

資源識別碼的格式為 **/ResourceFileName/**StringName。請注意,資源檔案名稱不包含資料夾路徑的延伸。因此,所有資源檔案名稱在元件或專案中都必須是唯一的。

從程式庫和控制項載入字串

應用程式通常包含多個元件或相依於程式庫,例如 .NET 可攜式類別庫、其他相容的類別庫及控制項程式庫。

可能的話,控制項和類別庫應嘗試減少資源數目,讓應用程式為它們提供資源。如果程式庫需要提供資源,應該允許應用程式以輸入方式取代這些資源。如果程式庫和使用它的應用程式沒有相同的當地語系化延伸,可能就需要這樣做。

例如:

var rating = new WinJS.UI.RatingsControl(el, {label: 'Please Rate', image: 'images/star.png'});

控制項顯示傳遞給它之自訂字串的方式,應和給予字串時的顯示方式一樣,可能的話請讓應用程式處理當地語系化。

var control = new Control(el, {commands: [
    {label: R.getString('Reply')}, 
    {label: R.getString('ReplyAll')
    ]});

元件或程式庫檔案通常會新增到套件的子資料夾中,建置程序期間會包含這些套件,與它們的字串資源類似。它們的資源識別碼通常採用下列格式:

ClassLibraryOrAssemblyName**/ResourceFileName/**StringName

透過程式設計的方式,程式庫也可以為它們的資源取得自己的 ResourceLoader。例如,以下的程式碼說明程式庫如何為自己的資源檔取得 ResourceLoader


var resources = Windows.ApplicationModel.Resources;
var RL = new resources.ResourceLoader('ContosoControl/Resources');
RL.getString('loadingStr'); // which came from ContosoControl's Resources

從其他套件載入字串

每個應用程式套件的資源都是分別管理,透過可從目前的 ResourceManager 存取的個別最上層 ResourceMap 物件存取。在每個套件內,各種元件都可以有自己的 ResourceMap Subtree 值。

架構套件可以使用更絕對的資源識別碼 URI 存取它們自己的資源:

如需 ms-resource URI 的詳細資訊,請參閱 URI 配置

從 JavaScript 控制項載入字串

提供預設字串的 JavaScript 控制項應該利用 WinJS.Resources.getString 擷取它們自己的字串。

載入到網路內容 (使用 ms-app-web:) 的 HTML 文件不能存取 Windows 執行階段 API。因此,在 JavaScript 程式碼中,請包含已經撰寫為使用 WinJS.Resources.getString 的 JavaScript 控制項。在網路內容中,WinJS.Resources.getString 會回來尋找指定的識別碼,做為全域字串物件的屬性。

var strings = { 'String1' : 'Hello' };
WinJS.Resources.getString('String1');

您也可以覆寫 WinJS.Resources.getString,從不同的位置擷取資源。

WinJS.Resources.getString = function(id){
    return getStringFromOtherService(id);
}

從應用程式資訊清單載入字串

資訊清單中所有可以顯示的字串和標誌都可以當地語系化。您也可以針對比例和高對比模式量身打造標誌。您可在硬式編碼字串中新增字串參考,方法是將 ms-resource: 配置指定的 URI 放到資訊清單資料 (這通常是在 Visual Studio 編輯 appxmanifest 的索引標籤式 UI 中完成)。例如,ms-resource:String1 是指 Resources.resw 資源檔案中名為 String1 的字串,ms-resource:/ManifestStrings/Shortname 是指 ManifestStrings.resw 資源檔案中名為 Shortname 的字串。

載入特定語言或內容的字串

預設 ResourceContext 是從 ResourceManager 取得的物件,代表資源符合的目前狀態。ResourceContext 包含目前使用者和電腦的所有不同限定詞值。雖然每個限定詞都可以覆寫,但是不建議您予以覆寫。大部分的限定詞都有系統資料提供者,在某些情況下,最好是透過另一個 API (也就是 PrimaryLanguageOverride) 進行修改,或最好是不要變更。

請參閱如何使用限定詞命名資源,了解各種限定詞的詳細資料。

ResourceManager 會針對執行的資源查詢來維護預設內容物件。在某些情況下,應用程式載入資源時明確宣告語言、比例或其他內容限定詞會有幫助。例如,應用程式可能允許使用者為工具提示或錯誤訊息選取其他語言。查詢可以指定它們自己的明確覆寫內容物件,以便影響要選擇的資源。若要指定明確的內容,並刻意覆寫 Languages 屬性:

var rcns = Windows.ApplicationModel.Resources.Core;

var context = new rcns.ResourceContext(); // deliberately not using getForCurrentView()
context.languages = new Array('fr-fr');
var resourceMap = rcns.ResourceManager.current.mainResourceMap.getSubtree('Resources');
var str = resourceMap.getValue('string1', context).ValueAsString;

您可使用的另一項技術,是在呼叫 ResourceContext.GetForCurrentView 之前先呼叫 ResourceContext.SetGlobalQualifierContext。若是語言案例,則將 language 限定詞設為新值。執行這個動作的差異,是限定詞與內容變更現在會套用到所有資源對應,而不只是您為供單一 GetValue 呼叫使用而建立的特定 ResourceContext。另請參閱 ApplicationLanguages.PrimaryLanguageOverride

事件和內容變更

當系統變更時,應用程式可能仍在執行。這樣會導致使用不同的限定詞組合。這類變更的其中一例,就是使用者開啟高對比時。各種系統變更會在 ResourceContext 物件上叫用事件。

在 JavaScript 中,接聽這些事件最簡單的方式是透過 addEventListener 方法:

WinJS.Resources.addEventListener('contextchanged', refresh, false);

偵測事件之後,應用程式可以重新處理文件,這樣就可以載入正確的資源。

function refresh(){
    WinJS.Resources.processAll(); // Refetch string resources.
}

重新處理資源可能會在新資源直接套用到元素內容時,重設資源內的資料繫結值。如果資源包含資料繫結方塊,請務必在重新處理時予以重新繫結。

相關主題

Windows.ApplicationModel.Resources.ResourceLoader

Windows.ApplicationModel.Resources.Core.ResourceContext

Windows.ApplicationModel.Resources.Core.ResourceManager

Windows.ApplicationModel.Resources.Core.ResourceMap

Windows.Globalization.ApplicationPreferences.PrimaryLanguageOverride

WinJS.Resources.getString

受內容影響的功能和限制

如何使用限定詞命名資源

應用程式資源與當地語系化