翻译 silverlight 5 应用程序 (Prism + MEF) 的可用选项是什么?如果可能的话,我想:
- 没有 resx 文件(我不喜欢它们的管理方式)
- 而是提取xaml字符串然后翻译(我认为微软有一个工具,用自定义属性标记所有XAML节点并提取字符串)
- 在外部程序集中进行翻译(在 Prism 中它们可以是模块)并在需要时加载它们
- 在运行时更改语言
我愿意接受有关此主题的建议和最佳实践。
编辑: LocBaml 是我上面所说的,但看起来它不适用于 Silverlight
翻译 silverlight 5 应用程序 (Prism + MEF) 的可用选项是什么?如果可能的话,我想:
我愿意接受有关此主题的建议和最佳实践。
编辑: LocBaml 是我上面所说的,但看起来它不适用于 Silverlight
我知道这会得到一些传统的答案,但我也想提出一些完全原创的东西,我们尝试(并成功)为更有效的 Silverlight 本地化做自己:
它基本上使用附加属性在 XAML 中为本地化字符串的动态更改提供挂钩。当它们第一次被解析时,您的代码有机会对相关元素进行更改,而语言交换仅意味着重新加载当前页面。
本地化字符串来自使用简单 RIA 服务调用的服务器数据库。返回的条目是所选语言的简单键/值对。
这种方法也没有你会看到很多的传统绑定方法的(相当大的)开销。当应用程序启动时,我们只下载选择的语言字符串。它还可能允许将编辑/更正发送回服务器(如果您可以承担应用程序中编辑器的开销……我们这样做了,但工作量很大)。
PS 我们使用的是 PRISM,但它在任何 Silverlight 应用程序中都可以正常工作,因为没有依赖项(例如在 Unity 上等)。
聚苯乙烯。今晚回家后,我将发布该系统的一些代码片段。
(Resx 是如此“上个世纪”)
My current solution is using DataBinding on properties you want to localize (ie TextBox
's Text
, Button
's Content
, ToolTips, etc...) to a globally available string collection, in other words a Singleton. In my case, since I'm using MVVM Light, I have my LocalizedStringCollection
exposed by the ViewModelLocator
.
This collection is loaded from a XLIFF file (see https://en.wikipedia.org/wiki/Xliff) into a Dictionary<string, string>
that is a member of my collection.
Here is the key parts of the collection to expose the strings.
/// <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
}
}
}
The XLIFF parsing is trivial using built-in XML support.
And here are XAML usage examples (can be more or less verbose depending on the syntax used):
<TextBlock Text="{Binding LocalizedStrings[login_label], Source={StaticResource Locator}}" />
<Button ToolTipService.ToolTip="{Binding LocalizedStrings[delete_content_button_tip], Source={StaticResource Locator}}" />
Hope this helps :)
I might make an article of this (with full source) if people are interested.