Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight定位_Silverlight_Xaml_Localization_Silverlight 5.0 - Fatal编程技术网

Silverlight定位

Silverlight定位,silverlight,xaml,localization,silverlight-5.0,Silverlight,Xaml,Localization,Silverlight 5.0,翻译silverlight 5应用程序(Prism+MEF)的可用选项有哪些? 如果可能的话,我想: 没有resx文件(我不喜欢它们的管理方式) 而是提取xaml字符串,然后进行翻译(我认为微软有一个工具,它用自定义属性标记所有xaml节点并提取字符串) 在外部组件中进行转换(在Prism中,它们可以是模块),并在需要时加载它们 在运行时更改语言 我愿意接受关于这个话题的建议和最佳实践 编辑:LocBaml是我上面所说的,但它似乎不适用于Silverlight我知道这将得到许多传统的答案,但

翻译silverlight 5应用程序(Prism+MEF)的可用选项有哪些? 如果可能的话,我想:

  • 没有resx文件(我不喜欢它们的管理方式)
  • 而是提取xaml字符串,然后进行翻译(我认为微软有一个工具,它用自定义属性标记所有xaml节点并提取字符串)
  • 在外部组件中进行转换(在Prism中,它们可以是模块),并在需要时加载它们
  • 在运行时更改语言
我愿意接受关于这个话题的建议和最佳实践


编辑:LocBaml是我上面所说的,但它似乎不适用于Silverlight

我知道这将得到许多传统的答案,但我也想提出一些完全独创的东西,我们尝试(并成功)自己为Silverlight进行更有效的本地化:

它基本上使用附加属性在XAML中提供钩子,用于动态更改本地化字符串。当它们第一次被解析时,您的代码就有机会对相关元素进行更改,而语言交换只是意味着重新加载当前页面

本地化字符串通过一个简单的RIA服务调用从服务器数据库中下来。返回的条目是所选语言的简单键/值对

这种方法也没有您将看到的许多传统绑定方法的(相当大的)开销。当应用程序启动时,我们只下载所选的语言字符串。它还可能允许将编辑/更正发送回服务器(如果你可以承担应用程序中编辑器的开销…我们这样做了,但工作量很大)

另外,我们使用的是PRISM,但它在任何Silverlight应用程序中都能正常工作,因为它没有依赖性(例如Unity等)

PPS。今晚回家后,我会发布一些这个系统的代码片段


(Resx是如此“上个世纪”)

我当前的解决方案是对要本地化的属性(即
TextBox
Text
按钮
内容
,工具提示等)使用数据绑定到全局可用的字符串集合,换言之是单个字符串。在我的例子中,因为我使用的是MVVM Light,所以我的
LocalizedStringCollection
ViewModelLocator
公开

此集合从XLIFF文件(请参阅)加载到作为集合成员的
词典中

下面是集合中用于公开字符串的关键部分

/// <summary>
/// A Singleton bindeable collection of localized strings.
/// </summary>
public class LocalizedStringCollection : ObservableObject, INotifyCollectionChanged
{
    private Dictionary<string, string> _items;
    /// <summary>
    /// The content of the collection.
    /// </summary>
    public Dictionary<string, string> Items
    {
        get { return _items; }
        private set
        {
            _items = value;
            RaisePropertyChanged();
            if (CollectionChanged != null)
                CollectionChanged(this, new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }
    }

    /// <summary>
    /// Convenience accessor, most likely entry point.
    /// </summary>
    /// <param name="key">A localized string name</param>
    /// <returns>The localized version if found, an error string else (ErrorValue in DEBUG mode, the key in RELEASE)</returns>
    public string this[string key]
    {
        get
        {
            Contract.Requires(key != null);
            Contract.Ensures(Contract.Result<string>() != null);

            string value;
            if (Items.TryGetValue(key, out value))
                return value ?? String.Empty;

#if DEBUG
            return ErrorValue;
#else
            return key;
#endif
        }
    }
}
//
///本地化字符串的单例可绑定集合。
/// 
公共类LocalizedStringCollection:ObserveObject,INotifyCollectionChanged
{
私人词典(项目),;
/// 
///收藏的内容。
/// 
公共词典项
{
获取{return\u items;}
专用设备
{
_项目=价值;
RaisePropertyChanged();
如果(CollectionChanged!=null)
CollectionChanged(这是新的NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
/// 
///方便访问器,最有可能的入口点。
/// 
///本地化的字符串名
///本地化版本(如果找到),错误字符串else(调试模式下的ErrorValue,发布中的密钥)
公共字符串此[字符串键]
{
得到
{
Contract.Requires(key!=null);
Contract.sure(Contract.Result()!=null);
字符串值;
if(Items.TryGetValue(键,输出值))
返回值??字符串。为空;
#如果调试
返回错误值;
#否则
返回键;
#恩迪夫
}
}
}
使用内置的XML支持,XLIFF解析非常简单

下面是XAML使用示例(根据使用的语法,可能会有更多或更少的详细信息):


希望这有帮助:)


如果有人感兴趣,我可能会为此写一篇文章(提供完整的源代码)。

我目前正在使用XML文件()和数据绑定到单例本地化源类。如果您感兴趣,我可以进行扩展。@jv42当然我想了解更多关于Xliff与SL集成的信息,谢谢!好的,明天我会做一个简短和详细的描述。
<TextBlock Text="{Binding LocalizedStrings[login_label], Source={StaticResource Locator}}" />

<Button ToolTipService.ToolTip="{Binding LocalizedStrings[delete_content_button_tip], Source={StaticResource Locator}}" />