【问题标题】:Silverlight localizationSilverlight 本地化
【发布时间】:2012-06-07 07:57:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我目前正在使用 XML 文件 (en.wikipedia.org/wiki/Xliff) 和数据绑定到单例本地化源类。如果您有兴趣,我可以展开。
  • @jv42 确定我想了解更多关于您的 Xliff 与 SL 集成的信息,谢谢!
  • 好的,明天我会做一个简短的描述。

标签: silverlight xaml localization silverlight-5.0


【解决方案1】:

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

Localisation of Silverlight projects after completion

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

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

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

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

PPS。今晚回家后我会为这个系统发布一些代码sn-ps。

(Resx 太“上个世纪”了)

【讨论】:

    【解决方案2】:

    我当前的解决方案是对要本地化的属性(即TextBox's TextButton's Content、ToolTips 等)使用 DataBinding 到全局可用的字符串集合,在换句话说,一个单身人士。就我而言,由于我使用的是 MVVM Light,我的 LocalizedStringCollectionViewModelLocator 暴露。

    此集合从 XLIFF 文件(请参阅 https://en.wikipedia.org/wiki/Xliff)加载到我的集合成员 Dictionary<string, string> 中。

    这里是公开字符串的集合的关键部分。

    /// <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
            }
        }
    }
    

    使用内置 XML 支持,XLIFF 解析很简单。

    这里是 XAML 使用示例(根据所使用的语法可能或多或少冗长):

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

    希望这会有所帮助:)

    如果人们有兴趣,我可能会写一篇关于此的文章(带有完整来源)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-16
      相关资源
      最近更新 更多