2009-06-25 23 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