首页 > 解决方案 > Xamarin Forms 在运行时本地化图像未在 iOS 中更新

问题描述

我有一个 Xamarin Forms 应用程序,其中包含将向客户公开的语言选择器。当我切换语言时,我调用一个 SetLocale() 方法来切换当前语言。

public static void SetLocale(CultureInfo culture)
{
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;
    AppResources.Culture = culture;  
}

所有文本都更新得很好(它们来自 resx 文件),但图像仍然来自我在 info.plist 中定义的默认应用程序语言(在应用程序设置中选择)。 在此处输入图像描述

我按照 xamarin 文档将图像放入 Resources/.lproj 的 iOS 项目中 在此处输入图像描述

我像往常一样将它们绑定在 xaml 文件中

<Image Source="{Binding Image}"></Image>

我怎样才能使翻译也适用于图像?

标签: xamarinxamarin.formsxamarin.ios

解决方案


经过大量研究,我找不到使用 iOS 原生捆绑包的方法。

我最终按照本教程进行了标记扩展,并对其进行了自定义,以在图像不存在时回退到默认语言环境。

using System;
using System.Globalization;
using System.Linq;
using System.Reflection;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
    
namespace XamarinTest.Custom
{
    [ContentProperty(nameof(Source))]
    public class ImageResourceExtension : IMarkupExtension
    {
        public string Source { get; set; }
    
        public object ProvideValue(IServiceProvider serviceProvider)
        {
           if (Source == null)
               return null;
           var resourceName = string.Format("XamarinTest.Images.{0}.{1}", CultureInfo.CurrentUICulture.Name.Replace('-', '_'), Source);
           if (ResourceExists(resourceName))
               return ImageSource.FromResource(resourceName, typeof(ImageResourceExtension).GetTypeInfo().Assembly);
           return ImageSource.FromResource(string.Format("XamarinTest.Images.default.{0}", Source), typeof(ImageResourceExtension).GetTypeInfo().Assembly);
        }
    
        private string[] resourceNames;
    
        private bool ResourceExists(string resourceName)
        {
            if (resourceNames == null)
            {
                resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames();
            }
            return resourceNames.Contains(resourceName);
        }
    }
}

我将每个图像的构建操作设置为 EmbeddedResource

项目结构

然后在一个视图中,我只是添加

xmlns:l="clr-namespace:XamarinTest.Custom"
...
<Image Source="{l:ImageResource qr.png}"
   HeightRequest="160"
   WidthRequest="160"></Image>

推荐阅读