作者:馬寧
OpenXLive SDK 0.9.9下載地址:
http://developer.openxlive.net/sdk/download/
OpenXLIve從0.9.9.0版本開始,提供了對簡體中文(zh-CN)、繁體中文(zh-TW)的支持。本次主題將介紹如何使OpenXLive顯示簡體或繁體中文,以及如何通過自定義語言資源包使OpenXLive顯示Windows Phone支持的其他語言。
如何更改OpenXLive的顯示語言
OpenXLive目前支持3種語言的顯示,英語(en-US)、簡體中文(zh-CN)和繁體中文(zh-TW)。由於OpenXLive默認顯示的是英語(en-US),所有本次主題只介紹如何顯示簡體中文(zh-CN)和繁體中文(zh-TW)。在了解本主題之前,你應該了解一下Windows Phone全球化和本地化的相關知識,請參閱如下鏈接http://msdn.microsoft.com/en-us/library/ff637522(v=vs.92)
首先,您需要安裝最新版本的OpenXLive SDK,安裝前請先卸載舊的版本。您可以在下面的網址中獲得OpenXLive SDK的最新版本:http://developer.openxlive.com/
為新建程序設置OpenXLive的顯示語言
先介紹新建OpenXLive游戲的時候,如何通過向導選擇要顯示的語言,請先確保安裝最新版OpenXLive SDK。
打開Visual Studio 2010,在Visual Studio 2010的菜單中選擇”File” – “New” - “Project”,打開New Project的對話框,選擇任意一個OpenXLive游戲模板,本次以OpenXLive Game 為例,輸入游戲工程的名稱,點擊OK。
你將會看到如下對話框,
在下拉列表中選擇要顯示的語言,假設我們選擇第二項簡體中文,點擊OK,開始創建OpenXLive游戲工程,工程創建完成后在工程中填入Application Secret Key,然后編譯並運行。此時OpenXLive顯示的將會是中文簡體(zh-CN),效果如下:
至此,新建OpenXLive 游戲是通過向導選擇顯示提供的語言就完成了,非常簡單。下面將介紹如何更改已有OpenXLive游戲的顯示語言
如何更改已有OpenXLive游戲的顯示語言
打開一個已有的OpenXLive游戲工程,首先你需要移除舊版本的OpenXLive的引用。如果是XNA游戲,你需要移除對OpenXLive.dll和OpenXLive.Form.dll的引用。如果是Silverlight游戲,
你需要移除對OpenXLive.dll和OpenXLive.Silverlight.dll的引用。然后添加對新版本的引用。以一個OpenXLive的XNA游戲為例,在添加引用對話框中,選中.NET選項卡,找到並選中OpenXLive.dll、OpenXLive.Font.dll和OpenXLive.Form.dll。
如果在.NET選項卡中找不到以上三個dll文件,你可以通過瀏覽選項卡,在OpenXLiveSDK安裝目錄下的.\Bin\XNA文件夾下找到(默認應該在C:\Program Files (x86)\Fulcrum Mobile Networks Inc\OpenXLiveSDK\Bin\XNA)。然后點擊OK按鈕添加引用。
到目前為止添加新版本的OpenXLive引用已經完成,如果你現在編譯並運行程序,顯示的將還是英文(en-US)界面。我們的目的是讓OpenXLive顯示簡體中文(zh-CN)或者繁體中文(zh-TW),你還需要如下設置。
首先在“解決方案資源管理器”中,選擇游戲項目並右鍵,選擇Unload Project 。
然后再右鍵該項目,選擇Edit <Project File>。此時,項目的csproj文件將會被打開,找到<SupportedCultures>標記,
並添加程序需要支持的區域性(語言)的名稱,如果支持簡體中文,則按如下方式更新此標記:[MN2]
<SupportedCultures>zh-CN</SupportedCultures>。如果支持繁體中文,則如下:
<SupportedCultures>zh-TW</SupportedCultures>。如果支持多個語言應該用分號隔開,例如同時支持簡體中文和繁體中文,則如下:
<SupportedCultures>zh-CN;zh-TW</SupportedCultures>。
如Windows Phone 區域性和語言支持中所述,你必須要輸入正確的區域性/語言名稱。
修改完成之后保存並關閉該文件,然后右鍵項目點擊Reload Project重新加載項目。
到目前為止,游戲支持顯示的語言已經設置好了,我們還需要指定程序的CurrentUICulture屬性為剛才設置的<SupportedCultures>標記中的語言。
打開游戲Game類,在構造函數中添加如下代碼:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CN");
如果<SupportedCultures>標記中設置的是繁體中文即:
<SupportedCultures>zh-TW</SupportedCultures>
代碼應該如下:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-TW");
了解更多有關CultureInfo類的信息,請參閱
http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo(v=VS.95).aspx
現在,你可以編譯並運行程序了,你將會看到OpenXLive已經正確顯示出了你指定的語言
自定義語言包並正確顯示
本主題將介紹如何制作自己的語言包並讓OpenXLive正確顯示。為了使開發者更容易創建自己的語言包,我們提供了制作語言包的模板。
打開Visual Studio 2010,在Visual Studio 2010的菜單中選擇”File” – “New” - “Project”,打開New Project的對話框,選擇OpenXLive Game Language Pack或者OpenXLive Silverlight Game Language Pack模板,你也可以通過在搜索框中輸入OpenXLive 進行查找,本次以OpenXLive Game Language Pack為例創建一個OpenXLive XNA 游戲的語言包,輸入游戲工程的名稱,點擊OK。
你將會看到如下對話框:
在文本框中輸入該語言包對應的區域性代碼,注意:你必須輸入正確的區域性代碼,你可以點擊文本框上的鏈接查看Windows Phone支持的顯示語言對應的區域性代碼。我們此次創建一個捷克語(捷克共和國)的語言包,在文本框中輸入cs-CZ,點擊OK。
你會看到項目包含3個剛才輸入的cs-CZ區域性代碼的資源文件,其中AppResources.cs-CZ.resx和Strings.cs-CZ.resx為OpenXLive所有界面的的顯示文字的資源文件,Fonts.cs-CZ.resx為XNA字體資源文件,若果你創建的是OpenXLive Silverlight Game Language Pack項目,則不包含Fonts.cs-CZ.resx文件,你需要將所有AppResources.cs-CZ.resx和Strings.cs-CZ.resx中的Value值對應的英文翻譯為指定的語言,注意:請不要更改Name值中的任何字符串。
我們選擇的是捷克語,所以應翻譯為捷克語。翻譯部分不再本主題的范圍內,為了能夠看出最終的效果,我們只將AppResources.cs-CZ.resx中Name為LobbyAchievements對應的Value值Achievements改為úspěchy,點擊保存。LobbyAchievements對應游戲中心中成就按鈕的顯示文字。
接下來我們還需要添加對應的字體文件,以使XNA能夠顯示我們指定的語言。在XNA中,除了英語外,如果您想正確顯示其他語言,就需要首先創建一個SpriteFont對象,然后將需要支持的語言加入其中,編譯之后,SpriteFont會成為一個xnb文件,我們只需要將這個xnb文件作為資源文件加入我們的工程即可。
有關如何使XNA顯示其他字符[MN3] ,稍后將會詳細介紹。 加入字體文件的步驟如下:
打開Fonts.cs-CZ.resx文件將資源類型有Strings切換到Files
然后點擊Add Resource添加已經生成好的字體(.xnb)文件,為了使其與OpenXLive風格保持一致,建議字體格式如下:
<FontName>Microsoft YaHei</FontName>
<Size>28</Size>
<DefaultCharacter>□</DefaultCharacter>
注意:添加好字體文件(.xnb)后,您還需要將名稱改為MainFont
最后編譯我們的資源文件。在項目的輸出目錄里會看到有一個以該語言區域性代碼命名的文件夾,
我們將該文件夾拷貝到OpenXLiveSDK安裝目錄下的.\Bin\XNA文件夾下,(默認應該在C:\Program Files (x86)\Fulcrum Mobile Networks Inc\OpenXLiveSDK\Bin\XNA)若果你創建的是OpenXLive Silverlight Game Resource項目,則應該拷貝到.\Bin\Silverlight目錄下
注意,請不要拷貝OpenXLive.Font.dll,
到目前為止,我們的資源文件就創建好了,正如前面更改OpenXLive顯示語言中介紹的,你只需要在項目中添加對該捷克語言的支持,並將CurrentUICulture設置為cs-CZ即可:
<SupportedCultures>cs-CZ</SupportedCultures>
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("cs-CZ");
重新編譯並運行你的OpenXLive游戲,切換到游戲中心,你會看到成就按鈕顯示的文字已經是剛才修改過的了。
如何擴展Font Description Processor以支持附加字符
首先,我們在VS 2010的Solution Explorer中找到WindowsPhoneGame1Content項目,右鍵菜單點擊“Add”-“New Folder”,將新文件夾命名為Font,然后在Font上右鍵點擊,選擇“Add”-“New Item”,然后在對話框中選擇創建“Sprite Font”,將字體文件命名為StartFont。
在Solution Explorer中雙擊StartFont.spritefont文件,我們會打開一個XML文件,我們省去XML注釋部分:
<?xml version="1.0" encoding="utf-8"?> <XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics"> <Asset Type="Graphics:FontDescription"> <FontName>Segoe UI Mono</FontName> <Size>14</Size> <Spacing>0</Spacing> <UseKerning>true</UseKerning> <Style>Regular</Style> <DefaultCharacter>*</DefaultCharacter> <CharacterRegions> <CharacterRegion> <Start> </Start> <End>~</End> </CharacterRegion> </CharacterRegions> </Asset> </XnaContent>
按照XML的注釋,我們可以很容易的了解每一項的功能,只看高亮部分:FontName,字體的名稱;Size,字體的大小;Style,指定字體是否為粗體、斜體等;CharacterRegion,字體區間,目前的設置為只顯示ASCII字體。這一點也是非常適合游戲開發的,游戲沒有必要提供完整的字符集支持。
接下來就是繪制代碼了,首先在類中增加SpriteFont的變量:
public class Game1 : Microsoft.Xna.Framework. Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; SpriteFont StartFont; SpriteFont YaheiFont; static string Text = "";
我們還增加了一個Text,可以用這個變量從SIP軟鍵盤中獲取用戶輸入的字符串。然后是LoadContent函數:
/// </summary> protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); // TODO: use this.Content to load your game content here StartFont = Content.Load<SpriteFont>(@"Font\StartFont"); YaheiFont = Content.Load<SpriteFont>(@"Font\Yahei"); }
請大家注意字體文件的路徑:將Content資源放到另外一個DLL里可以方便游戲替換資源,而路徑方面,只需要將Folder指定對就可以了。這里順便把中文微軟雅黑字體也加了上了。因為要獲取SIP的輸入,所以還要修改 Update方法:
protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // TODO: Add your update logic here if (Text == "" && !Guide.IsVisible) Guide.BeginShowKeyboardInput(PlayerIndex.One, "Here's your Keyboard", "Type something...", "", new AsyncCallback(GetTypedChars), null); base.Update(gameTime); } private static void GetTypedChars(IAsyncResult asynchronousResult) { Text = Guide.EndShowKeyboardInput(asynchronousResult); Debug.WriteLine(Text); }
我們修改了update方法,只有Text為空時,SIP才會彈出,SIP部分的代碼上次已經說過了。最后一部分就是繪制Draw函數了:
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.White); // TODO: Add your drawing code here spriteBatch.Begin(); spriteBatch.DrawString(StartFont, Text, new Vector2(10, 10), Color.Black); //spriteBatch.DrawString(StartFont, "中國", new Vector2(10, 50), Color.Black); spriteBatch.End(); base.Draw(gameTime); }
運行程序,會首先實現一個輸入法對話框,輸入”Hello,xna”之后,會顯示下面的界面:
大家注意到,我將第二個繪制“中國”的DrawString注釋掉了,如果不注釋掉會怎么樣呢?產生一個Exception,因為我們Sprite Font的CharacterRegion只包含了ASCII字符,所以,中文字體顯然超過了字符范圍。
添加中文支持
MSDN上的另一篇文章描述了這個問題:
http://msdn.microsoft.com/en-us/library/bb447751.aspx
我們可以Font Description Processor來添加對於指定字符的支持,而不需要擴大CharacterRegions,讓很多無用的字符也被增加到字體文件中來。
首先,我們在Solution Explorer中找到游戲的Project,在本例中,就是WindowsPhoneGame1,右鍵菜單“Add”-“New Item”,選擇“Text File”,命名為messages.txt。雙擊打開messages.txt,在里邊添加游戲中要支持的所有中文字符。因為要使用File.ReadAllText,所以確保文本文件是以’\r’或’\n’結尾。
接下來要創建一個新的Content Processor Project,在Solution Explorer中選擇Solution,右鍵點擊”Add”-“New Project”,選擇”Content Pipeline Extension Library(4.0)”,命名為FontProcessor。下面是ContentProcessor1.cs中修改后的所有代碼:
using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Content.Pipeline; using Microsoft.Xna.Framework.Content.Pipeline.Graphics; using Microsoft.Xna.Framework.Content.Pipeline.Processors; using System.IO; using System.ComponentModel; namespace FontProcessor { /// <summary> /// This class will be instantiated by the XNA Framework Content Pipeline /// to apply custom processing to content data, converting an object of /// type TInput to TOutput. The input and output types may be the same if /// the processor wishes to alter data without changing its type. /// /// This should be part of a Content Pipeline Extension Library project. /// /// TODO: change the ContentProcessor attribute to specify the correct /// display name for this processor. /// </summary> [ContentProcessor(DisplayName = "FontProcessor.ContentProcessor1")] public class ContentProcessor1 : FontDescriptionProcessor { public override SpriteFontContent Process(FontDescription input, ContentProcessorContext context) { string fullPath = Path.GetFullPath(MessageFile); context.AddDependency(fullPath); string letters = File.ReadAllText(fullPath, System.Text.Encoding.UTF8); foreach (char c in letters) { input.Characters.Add(c); } return base.Process(input, context); } [DefaultValue("messages.txt")] [DisplayName("Message File")] [Description("The characters in this file will be automatically added to the font.")] public string MessageFile { get { return messageFile; } set { messageFile = value; } } private string messageFile = @"..\WindowsPhoneGame1\messages.txt"; } }
首先,增加兩個引用,用於讀取文件:
using System.IO; using System.ComponentModel;
然后增加MessageFile的屬性:
[DefaultValue("messages.txt")] [DisplayName("Message File")] [Description("The characters in this file will be automatically added to the font.")] public string MessageFile { get { return messageFile; } set { messageFile = value; } } private string messageFile = @"..\WindowsPhoneGame1\messages.txt";
請注意其中的文件路徑,因為文件包含在WindowsPhoneGame1的目錄中,而本工程位於FontProcessor目錄中,所以我們要修改其路徑,否則會出現文件無法找到的編譯錯誤。因為FontProcessor是在編譯時使用的,所以Excepiton都是以編譯錯誤展現出來的。
我們還需要將ContentProcessor1的基類ContentProcessor替換為FontDescriptionProcessor。為messages.txt注冊Content Pipeline,增加依賴關系,告訴Content Pipeline,如果messages.txt變化,則字體需要重新編譯。最后是讀取這個文件,為其中的每一個字符增加字體的支持。另外,確保你的messages.txt文件,采用了UTF-8的編碼方式。
完成這些之后,我們要首先編譯一下FontProcessor,然后在Solution Explorer中,右鍵點擊WindowsPhoneGame1Content的References目錄,選擇“Add references”,在Project Tab頁中,選擇FontProcessor。接下來,在Solution Explorer中,右鍵點擊Project Dependencies,將FontProcessor前的CheckBox選中。
然后,創建一個新的Sprite Font字體,叫做YaheiFont,字體名稱為“Microsoft Yahei”,選中yahei.spritefont,在屬性頁中的Content Processor項中,將“Sprite Font Description - XNA Framework”切換為“FontProcessor.ContentProcessor1”。
最后,在游戲中增加雅黑字體,將Game中的繪制函數改為:
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.White); // TODO: Add your drawing code here spriteBatch.Begin(); spriteBatch.DrawString(StartFont, Text, new Vector2(10, 10), Color.Black); spriteBatch.DrawString(YaheiFont, "中國", new Vector2(10, 50), Color.Black); spriteBatch.End(); base.Draw(gameTime); }
最后的效果就是:
多語言版本征集計划
OpenXLive為開發者提供了有限的多語言版本支持,但是我們無法滿足開發者對於全世界所有語言版本的需求。所以,我們准備啟動“OpenXLive多語言版本征集計划”,如果您通曉一門非英語的語言,並且願意為OpenXLive開發本地化版本,請將您翻譯的語言版本資源文件和SpriteFont文件發信給 support@openxlvie.com。如果您的語言版本通過審核,被OpenXLive采納,我們將采取下列方法感謝您的貢獻:
1. 在Readme文件中,會包含您的名字和您翻譯的語言版本;
2. 我們將為您准備一份精美的禮品,通過Amazon快遞給您。
最后感謝您對OpenXLive長期以來的支持,如果有任何問題和建議,可以發送郵件到:support@openxlive.com