【问题标题】:Xamarin Forms localization at runtime image not updated in iOSXamarin Forms 在运行时本地化图像未在 iOS 中更新
【发布时间】:2020-09-21 21:15:50
【问题描述】:

我有一个带有语言选择器的 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>

如何才能使图像的翻译也能正常工作?

【问题讨论】:

  • 默认文件夹名为Base.lproj。特定于语言的文件夹以语言或语言环境名称命名。确保您正确命名了区域和语言。
  • @LucasZhang-MSFT 是的,当我在 iOS 应用程序设置中更改语言或使用 NSUserDefaults.StandardUserDefaults.SetValueForKey(NSArray.FromStrings(iOSLocale), new NSString( “苹果语言”)); NSUserDefaults.StandardUserDefaults.Synchronize();但如果我更改设置,我需要重新启动应用程序以获得良好的图像。我的 2 种测试语言实际上是 fr-CH 和 de-CH。我只是看到在 CurrentCulture 和 CurrentUICulture 中设置新文化时 NSLocal 没有更新,我还尝试更改 DefaultThread 文化
  • 我还尝试在我的 iOS 项目中设置依赖项并更新 NsLocale.CurrentLocale 但我没有找到该怎么做。我认为图像包是在应用程序启动时加载的,并且在动态切换语言时不会更新。

标签: xamarin xamarin.forms xamarin.ios


【解决方案1】:

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

我最终在this tutorial 之后做了一个标记扩展,并对其进行了自定义,以便在图像不存在时回退到默认语言环境。

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-22
    • 2018-02-07
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多