首页 文章

uwp:不使用资源文件的自定义本地化

提问于
浏览
0

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

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

编辑:

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

  • 为所有控件创建基类,其对象具有索引器以获取翻译 - 因为x不起作用:Bind不支持基于字符串的索引器

  • 试图使用自定义动态对象 - 因为x:Bind不支持动态对象而无法正常工作

  • 试图将一些自己的类作为资源并从中访问属性 - 再次无效

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

EDIT_2:

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

1 回答

  • 0

    好吧,看起来我找到了一个解决方案,使用如下所述的 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>
    

    它有效 .

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

相关问题