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