2

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

  • 没有 resx 文件(我不喜欢它们的管理方式)
  • 而是提取xaml字符串然后翻译(我认为微软有一个工具,用自定义属性标记所有XAML节点并提取字符串)
  • 在外部程序集中进行翻译(在 Prism 中它们可以是模块)并在需要时加载它们
  • 在运行时更改语言

我愿意接受有关此主题的建议和最佳实践。

编辑: LocBaml 是我上面所说的,但看起来它不适用于 Silverlight

4

2 回答 2

2

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

Silverlight项目完成后的本地化

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

本地化字符串来自使用简单 RIA 服务调用的服务器数据库。返回的条目是所选语言的简单键/值对。

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

PS 我们使用的是 PRISM,但它在任何 Silverlight 应用程序中都可以正常工作,因为没有依赖项(例如在 Unity 上等)。

聚苯乙烯。今晚回家后,我将发布该系统的一些代码片段。

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

于 2012-06-07T10:43:58.260 回答
1

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.

于 2012-06-08T13:19:26.687 回答