GacUI 支持運行時切換語言

先看效果:

使用方法很簡單。先把不同語言的字元串定義好:

<LocalizedStrings ref.Class="demo::StringResource" DefaultLocale="en-US"> <Strings Locales="en-US"> <String Name="ShortDate" Text="ShortDate: $(0:ShortDate)"/> <String Name="LongDate" Text="LongDate: $(0:LongDate)"/> <String Name="YearMonthDate" Text="YearMonthDate: $(0:YearMonthDate)"/> <String Name="ShortTime" Text="ShortTime: $(0:ShortTime)"/> <String Name="LongTime" Text="LongTime: $(0:LongTime)"/> <String Name="DateFormat" Text="DateFormat: $(0:Date:yyyy)"/> <String Name="TimeFormat" Text="TimeFormat: $(0:Time:HH)"/> <String Name="Number" Text="Number: $(0:Number)"/> <String Name="Currency" Text="Currency: $(0:Currency)"/> <String Name="Sentence" Text="$($)Good morning, $(0)!$($)"/> <String Name="Title" Text="Localization"/> <String Name="Label" Text="Selected Locale:"/> </Strings> <Strings Locales="zh-CN"> <String Name="ShortDate" Text="短日期:$(0:ShortDate)"/> <String Name="LongDate" Text="長日期:$(0:LongDate)"/> <String Name="YearMonthDate" Text="年月:$(0:YearMonthDate)"/> <String Name="ShortTime" Text="短時間:$(0:ShortTime)"/> <String Name="LongTime" Text="長時間:$(0:LongTime)"/> <String Name="DateFormat" Text="日期格式:$(0:Date:yyyy)"/> <String Name="TimeFormat" Text="時間格式: $(0:Time:HH)"/> <String Name="Number" Text="數字:$(0:Number)"/> <String Name="Currency" Text="貨幣:$(0:Currency)"/> <String Name="Sentence" Text="$($)$(0),早上好!$($)"/> <String Name="Title" Text="本地化"/> <String Name="Label" Text="語言設置:"/> </Strings></LocalizedStrings>

然後在窗口上聲明這個窗口需要引用這個字元串表格。你可以寫很多個,名字不一樣就可以:

<ref.LocalizedStrings Name="Strings" Uri="res://StringResource" Default="true"/><Window ref.Name="self" Text-str="Title()" ClientSize="x:640 y:480">

字元串表格會根據ref.Class生成一個這樣的類:

module <localized-strings>demo::StringResource;namespace demo{ class StringResource { interface IStrings { func Currency(<ls>0 : ::system::String) : (::system::String); func DateFormat(<ls>0 : ::system::DateTime) : (::system::String); func Label() : (::system::String); func LongDate(<ls>0 : ::system::DateTime) : (::system::String); func LongTime(<ls>0 : ::system::DateTime) : (::system::String); func Number(<ls>0 : ::system::String) : (::system::String); func Sentence(<ls>0 : ::system::String) : (::system::String); func ShortDate(<ls>0 : ::system::DateTime) : (::system::String); func ShortTime(<ls>0 : ::system::DateTime) : (::system::String); func TimeFormat(<ls>0 : ::system::DateTime) : (::system::String); func Title() : (::system::String); func YearMonthDate(<ls>0 : ::system::DateTime) : (::system::String); } static func Get(<ls>locale : ::system::Locale) : (IStrings^) { /* 略 */ } new () { } }}

<ref.LocalizedString>的意思,就是給窗口加上一個demo::StringResource::IString^類型的Strings屬性,作為一個預設的字元串表格(在-str綁定裡面就可以省略掉Strings這個名字)。這個屬性的內容會根據GetApplication()->GetLocale()的結果而自動變化,切換成不同語言的IStrings實現。

最後使用他就很簡單了:

<TextList HorizontalAlwaysVisible="false" VerticalAlwaysVisible="false"> <att.BoundsComposition-set AlignmentToParent="left:0 top:0 right:0 bottom:0"/> <att.Items> <_ Text-str="ShortDate(self.dateTime)"/> <_ Text-str="LongDate(self.dateTime)"/> <_ Text-str="YearMonthDate(self.dateTime)"/> <_ Text-str="ShortTime(self.dateTime)"/> <_ Text-str="LongTime(self.dateTime)"/> <_ Text-str="DateFormat(self.dateTime)"/> <_ Text-str="TimeFormat(self.dateTime)"/> <_ Text-str="Number(self.number)"/> <_ Text-str="Currency(self.currency)"/> <_ Text-str="Sentence(John Smith)"/> <_ Text-str="Strings.Sentence(John Smith)"/> <_ Text-bind="self.Strings.Sentence(John Smith) ?? "/> </att.Items></TextList>

歐耶!


推薦閱讀:

codeblocks寫代碼有時候會自動補全,有時候不補全?
c++中虛析構函數如何實現多態的、內存布局如何?
c++如何做設計?或者推薦一些比較簡單的開源項目,適合新手練手的。
如何勸說上級更新 GCC 和 VS 的版本,並把項目遷移至 C++11?
string和char數組的區別是什麼以及map可否設置key為char數組?

TAG:編程 | C | 圖形用戶界面 |