【问题标题】:uwp: custom localization without using resource filesuwp:不使用资源文件的自定义本地化
【发布时间】:2016-12-18 09:30:08
【问题描述】:

我正在开发一个 UWP 应用程序,该应用程序将被侧面加载并从 WebAPI 获取其大部分配置。 我希望能够在 XAML 和代码中使用翻译后的标签,因为我看到“UWP 方式”是使用资源文件,但我不想将字符串存储在项目本身中,我希望它们从WebAPI,然后使用缓存的键值字典。

在代码中获取字符串显然没有问题,问题在于 XAML - 在 WPF 中,使用自定义 MarkupExtension 非常简单,但是因为我们在 UWP 中没有 MakrupExtensions,有没有一种干净的方法可以做到这一点?

编辑:

到目前为止我尝试了什么:

  • 使用具有索引器的对象为所有控件创建基类以获取翻译 - 不起作用,因为 x:Bind 不支持基于字符串的索引器
  • 尝试使用自定义动态对象 - 不起作用,因为 x:Bind 不支持动态对象
  • 尝试将某个自己的类作为资源并从中访问属性 - 再次无法正常工作

目前看来,唯一的方法似乎是创建一个巨大的类,其中每个翻译/标签都必须拥有自己的属性,或者使用标准 Binding(或从它派生的某个类)。

EDIT_2:

忘了,另一个用例是在带有模板的 xaml 资源中使用它,而不仅仅是控件和页面。

【问题讨论】:

    标签: xaml winrt-xaml uwp uwp-xaml


    【解决方案1】:

    好的,看起来我找到了解决方案,通过使用此处所述的CustomResource 功能:

    https://msdn.microsoft.com/en-us/windows/uwp/xaml-platform/customresource-markup-extension

    如果我实现这样的类:

    public class MyResourceLoader : CustomXamlResourceLoader
    {
        protected override object GetResource(string resourceId, string objectType, string propertyName, string propertyType)
        {
            return "Translation for key:" + resourceId;
        }
    }
    

    并在App.xaml.cs构造函数中初始化:

    public App()
    {
        CustomXamlResourceLoader.Current = new MyResourceLoader();
        this.InitializeComponent();
        this.Suspending += OnSuspending;
    }
    

    然后我可以通过以下方式从 XAML 访问它:

    <TextBlock Text="{CustomResource myTranslationKey}"></TextBlock>
    

    它有效。

    但是... VisualStudio 中的 XAML 设计器不理解 CustomResource 标记扩展,并通过 Cannot resolve symbol 'CustomResource' 消息将其作为错误下划线。但它可以编译和工作,所以现在必须足够好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-01
      • 1970-01-01
      • 2012-09-20
      • 2023-04-06
      • 2019-04-18
      • 1970-01-01
      • 2012-06-10
      相关资源
      最近更新 更多