当前位置: 首页 > 知识库问答 >
问题:

Xamarin形式的Android图像本地化

时宾实
2023-03-14

我有一个Xamarin Form应用程序,它有一个语言下拉列表,所以用户可以选择应用程序语言。当用户选择我调用的语言:

            CultureInfo culture = CultureInfo.CreateSpecificCulture(language);
            System.Globalization.CultureInfo.CurrentUICulture = culture;
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = culture;
            AppResources.Culture = culture;

应用程序运行良好,并从AppResources中拾取字符串。{语言}。resx我的问题是定位图像时。根据微软的建议,我已经将我的图像添加到android项目中的资源/可绘制文件夹中。在我的情况下,我补充说谢谢。jpg到Resources/drawable和Resources/drawable-fr。但即使我选择fr-fr作为语言,它也只显示Resources/drawable文件夹上的图像,但是我发现如果我没有更改应用程序语言(区域性),而是更改了设备语言,设备会显示正确的图像(Resources/drawable-fr中的图像)。我想知道是否有办法解决这个问题。

共有1个答案

范志勇
2023-03-14

您可以创建一个依赖性服务来修复它。

首先,创建一个接口。

    public interface IChangeService
    {
        void ChangeIanguage(string lang);
    }

我们在xamarin表单的这个格式代码中使用了它。

  <StackLayout>
        <TimePicker></TimePicker>
        <Image WidthRequest="100">
            <Image.Source>
                <OnPlatform x:TypeArguments="ImageSource">
                    <On Platform="iOS, Android" Value="flag.png" />
                    <On Platform="UWP" Value="Assets/Images/flag.png" />
                </OnPlatform>
            </Image.Source>
            </Image>
            <Button Text="Change" Clicked="Button_Clicked"></Button>
    </StackLayout>

这是背景代码。

 public partial class LocalizedXamlPage : ContentPage
    {
        public LocalizedXamlPage()
        {
            InitializeComponent();
        }

        private void Button_Clicked(object sender, System.EventArgs e)
        {
            DependencyService.Get<IChangeService>().ChangeIanguage("en");
        }
    }

然后在android平台上实现界面。如果我们更改本地化,我们需要它在运行时工作,我们应该重新启动应用程序。

[assembly: Dependency(typeof(ChangeLanguageService))]
namespace UsingResxLocalization.Droid
{
    public class ChangeLanguageService : IChangeService
    {
        public void ChangeIanguage(string lang = "in")
        {
           
            LanguageManager.ChangeLanguage(MainActivity.instance, lang);
            //restart your application.
            Intent intent = new Intent(MainActivity.instance, typeof(MainActivity));
            intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);
            MainActivity.instance.StartActivity(intent);
        }
    }
}

然后我们需要创建一个BaseActive(因为我们在android中更改了Locale,所以我们应该使用相同的Context。)和Language ageManager(在运行时更改本地化)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Support.V7.App;
using Android.Views;
using Android.Widget;
using Java.Util;
using Xamarin.Forms.Platform.Android;

namespace UsingResxLocalization.Droid
{
    public class BaseActivity : FormsAppCompatActivity
    {
        protected override void AttachBaseContext(Context @base)
        {
            base.AttachBaseContext(LanguageManager.LoadLanguage(@base));
        }

    }

    public class LanguageManager
    {
        private const string MYLANGUAGE = "myLanguage";
        private const string MYPREF = "myPreference";

        public static Context LoadLanguage(Context context)
        {
            var loadedLanguage = GetLanguage(context, Locale.Default.Language);
            return ChangeLanguage(context, loadedLanguage);
        }

        public static Context ChangeLanguage(Context context, string language)
        {
            SaveLanguage(context, language);
            if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
            {
                return ChangeForAPI24(context, language);
            }
            return ChangeForLegacy(context, language);
        }

        private static string GetLanguage(Context context, string Language)
        {
            var privatePreference = context.GetSharedPreferences(MYPREF, FileCreationMode.Private);
            return privatePreference.GetString(MYLANGUAGE, Language);
        }

        private static void SaveLanguage(Context context, string language)
        {
            var privatePreference = context.GetSharedPreferences(MYPREF, FileCreationMode.Private);
            var editor = privatePreference.Edit();
            editor.PutString(MYLANGUAGE, language);
            editor.Apply();
        }

        private static Context ChangeForAPI24(Context context, string language)
        {
            // for api >= 24
            var locale = new Locale(language);
            Locale.Default = locale;
            var configuration = context.Resources.Configuration;
            configuration.SetLocale(locale);
            configuration.SetLayoutDirection(locale);

            return context.CreateConfigurationContext(configuration);
        }

        private static Context ChangeForLegacy(Context context, string language)
        {
            var locale = new Locale(language);
            Locale.Default = locale;
            var resources = context.Resources;
            var configuration = resources.Configuration;
            configuration.Locale = locale;
            resources.UpdateConfiguration(configuration, resources.DisplayMetrics);
            return context;
        }
    }
}

要使主活动扩展BaseActivity.cs。并公开公共静态Main Active实例;

 [Activity(Label = "UsingResxLocalization", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : BaseActivity
    {
        public static MainActivity instance;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;
            instance = this;
            base.OnCreate(savedInstanceState);

            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
    }

这里是运行GIF。

========更新=========

当设备语言是英语时,我用法国国旗进行测试。

上传我的演示给你,你可以测试它。

https://github.com/851265601/LocalzationDemo/blob/master/LocalzationDemoWithFlag.zip

如果您想更改按钮或其他标签的文本,当您单击按钮时,请添加文化信息。MONTUICulture=new CultureInfo(fr,false);以及单击事件。你可以看到这个GIF。

 类似资料:
  • 我有一个Xamarin。表单应用程序,但这个问题只涉及Android。 我有一个闪屏,有一个标志和背景颜色,我想更新。我使用了一个spash主题样式,它指的是包含图像的xml。 主题: XML 然后我使用一个飞溅活动来使它工作,它完美地工作。 现在我想用一个图像作为背景,而不是颜色,所以我所做的是创建这个背景图像,上面有徽标,保存为一个图像,并将其用作启动屏幕。这造成了一些问题。 该图像在屏幕上显

  • 我是xamarin的新手,我需要在应用程序中放置谷歌地图。 我已经从xamarin下载了示例: https://github.com/xamarin/monodroid-samples/tree/master/MapsAndLocationDemo_v2 经过一些改变,它工作了,这个项目显示地图。 以下是工作的项目的代码: /MainActivity.cs/ /BasicDemo.axml/ /A

  • 本文向大家介绍android打开本地图像的方法,包括了android打开本地图像的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了android打开本地图像的方法。分享给大家供大家参考。具体如下: 方法一,调用手机安装的图像浏览工具浏览: 方法二,调用手机自身图像浏览工具浏览: 将上述代码写入onClick事件中即可! 希望本文所述对大家的Android程序设计有所帮助。

  • 我已经成功地使用Parse将声音片段上传到设备或从设备下载。我也在尝试类似的事情,但有图像。我有一个imageView,它包含用户选择的图像。我想将此图像作为嵌套在parseObject(称为“profileParseObject”)中的parseFile发送 我看到了这篇文章:将图库中的图像放入 ParseFile android 但是,使用: 导致“当前上下文中不存在名称”位图“”(我不知道需

  • 本文向大家介绍Android实现本地上传图片并设置为圆形头像,包括了Android实现本地上传图片并设置为圆形头像的使用技巧和注意事项,需要的朋友参考一下 先从本地把图片上传到服务器,然后根据URL把头像处理成圆形头像。 因为上传图片用到bmob的平台,所以要到bmob(http://www.bmob.cn)申请密钥。 效果图: 核心代码: 以上所述就是本文的全部内容了,希望大家能喜欢。

  • 当我捕获照片时,在某些设备中,它会以景观模式存储在某些设备中,它会存储肖像。我想让图像在肖像模式无论如何。为此,我尝试获取图像的数据,并相应地将其旋转到肖像模式。但在一些设备,如三星,VIVO的方向值得到“0”。我不知道该怎么处理那个值。如果我90,那么一些设备将解决此问题,而另一些设备将向上保存照片。 我从Xamarin那里得到这个主意。Andoid图像旋转。但不知怎的,我不能再继续下去了。会有