2013年7月3日 星期三

Globalization 一定要搭配的 FormatMessage

在製作多語系的軟體時,可能會碰到各種語言之間因為詞性的關係而造成子句順序不同的情況,這種情況下單純的 String.Formate 函式就顯得使不上力

舉例來說我們在 String Table 裡面建一筆資料 ID 為 STRING_ID_SEASON_AND_TEMPERATURE 而中文及英文的值各是以下的格式

繁中:%s的%s平均 %d 度
英文:It's %d degrees in %s in %s

如果我們是用 CString 的 Formate 來填上三個值,會發現中、英文的 %d 位置不一樣,如果沒有針對這點做處理,會導致將 String 配對到 %d 的位置時發生 Crash 例如

CString strDesc;
strDesc.Format(STRING_ID_SEASON_AND_TEMPERATURE, strCountry, strSeason, nTemperature);
// 繁中輸出:台灣的夏天平均 30 度
// 英文環境下因為把 strCountry 指給 %d 而 Crash

而 CString 的 FormatMessage 就是用來讓我們自訂順序的一個函式,指定順序的簡單範例如下

繁中:%1!s!的%2!s!平均 %3!d! 度
英文:It's %3!d! degrees in %1!s! in %2!s

接著比照使用 Format 時一樣的方式將參數排上去就可以了,FormatMessage 會幫我們解決哪個位置該對應哪一個順序的參數問題,例如

CString strDesc;
strDesc.Format(STRING_ID_SEASON_AND_TEMPERATURE, strCountry, strSeason, nTemperature);
// 繁中輸出:台灣的夏天平均 30 度
// 英文輸出:It's 30 degrees in taiwan in summer

參考 MSDN 的資料:CString::FormatMessage

此外可以看到上面的範例中有 %s 及 %d,這在某些情況下可能也會碰到一些問題,假設某些資料在中文習慣用名詞來表達,在其他語系國家習慣用數字表達,所以通常輸出的訊息建議一律是吃字串參數,也就是字串表中只會有 %s 存在,這樣子就不會碰到形別的問題了。

沒有留言:

張貼留言