2009-06-25 26 views
1

我遇到了一個似乎沒有我感到滿意的明智/易處理的解決方案的問題。 Silverlight和國際化 - 製作中的泥潭。Silverlight - 國際化的參數化資源值

我有一組包含翻譯字符串的資源文件。

在簡單的情況下,我可以聲明語言資源等,並綁定強類型資源中的值的內容/文本。這很好 - 大量的例子發佈周圍。

一個不那麼簡單的情況是字符串可以有一個參數,所以我需要在字符串中插入一個值來顯示它,它本身可以是一個數據綁定。

更復雜的情況是具有多個參數的字符串。

你可以爭辯說虛擬機應該提供這種能力,但我不高興,因爲它打破了UX Designer和Developer之間的鴻溝,要求開發人員在VM上實現一個屬性/方法來支持每一個字符串UI需要。

例如:設計師決定在用戶​​反饋之後添加一個自定義工具提示並提供更多信息。工具提示是通過聲明完成的,並將更好的解釋與datacontext中的值結合在一起。解釋存儲在資源中,使用的值來自現有數據上下文或元素綁定。

如果我必須通過虛擬機運行每個字符串,那麼添加這樣的東西需要虛擬機的更改。同樣,如果參數的來源將來自其他元素,則VM不一定能夠提供格式化的字符串。

人們是如何圍繞/接近這個問題的?

A.

回答

0

這個問題是比較複雜的,比我完全可以回答,但如果你想綁定考慮你應該設置你的UI容器(也許你的頂級控件類)的語言特性的具體定位。之後,所有綁定應該使用您的請求的本地化。看看這篇關於WPF的文章,但使用的技術似乎適用於Silverlight:http://www.west-wind.com/weblog/posts/796725.aspx

0

我不知道你想要做什麼,但你有幾個解決方案。

  • 在你的虛擬機創建一個新的字符串,使其INotifyPropertyChanged的,能夠

    public string MyTranslatedString 
    { 
        get 
        { 
         return string.Format("{0} Someone", LocalizedResource.Hello; 
        } 
    }; 
    

再聽聽本地化變化事件(從應用程序)

  • 創建幾個文本塊並綁定本地化的項目:

    <TextBlock HorizontalAlignment="Stretch" Foreground="Black" Text="{Binding Path=Resource.CurrentlyLoggedInAs, Source={StaticResource LocalizedStrings }}" VerticalAlignment="Center" Margin="0,0,5,0" /> 
    <TextBlock HorizontalAlignment="Stretch" Foreground="Black" Text="{Binding Path=Username}" VerticalAlignment="Center" Margin="0,0,5,0" /> 
    <Button Commands:Click.Command="{Binding Path=LogOutCommand}" Commands:Click.CommandParameter="" Content="{Binding Path=Resource.LogOut, Source={StaticResource LocalizedStrings }}" /> 
    

您需要添加,在主應用程序:

<Application.Resources> 
    <local:LocalizedStrings 
     xmlns:local="clr-namespace:Localization.Silverlight;assembly=Localization.Silverlight" 
     x:Key="LocalizedStrings" /> 
</Application.Resources> 

這是我想出的最簡單的方法,但我很高興有爲我提供了一些更簡單的東西。

+0

該解決方案將其全部放回到原始問題的虛擬機中,以及我希望避免的問題。如果虛擬機應該意識到它將被視圖所佔用,使每個視圖中消耗虛擬機的每個字符串都來自虛擬機將不可行,並且任何不是來自虛擬機的元素綁定的元素都不會能夠被使用。 例如表示「當前值爲{0}」的文本塊以及來自視圖上的滑塊的佔位符。虛擬機可能不知道滑塊,因爲它是一個純粹的UX片段,並沒有持久化(比方說當前的縮放級別)。 – Andrew 2009-06-30 10:05:29