繁体   English   中英

Xamarin 表单使用 Android 资源更改语言

[英]Xamarin forms Change language using Android resources

根据此线程中的答案, 使用资源更改Xamarin Android 应用程序的语言我使用此代码在我的应用程序运行时更改语言。

using Java.Util.Locale locale = new Java.Util.Locale(cultureInfo.TwoLetterISOLanguageName);
Java.Util.Locale.SetDefault(Java.Util.Locale.Category.Format, locale);
var config = Resources.Configuration;
config.SetLocale(locale);
BaseContext.CreateConfigurationContext(config);

它可以正常工作。 除非出于某种原因,我还没有发现,它没有! 在我的应用程序运行时,语言环境会更改回原始语言环境。 我还没有能够重现它......有什么想法吗?

提前致谢。

如果您使用过 xamarin 表单,则可以使用Xamarin.Forms 字符串和图像本地化来实现它。

例如。 我为英语和日语添加了Change Button本地化。

在此处输入图片说明

在此处输入图片说明

然后我在xaml中使用。

 <StackLayout>
       
        <Label Text="{x:Static resources:AppResources.NotesLabel}"
               WidthRequest="300"
               HorizontalOptions="CenterAndExpand"
               VerticalOptions="Start"/>
        <Entry Placeholder="{x:Static resources:AppResources.NotesPlaceholder}"
               WidthRequest="300"
               HorizontalOptions="CenterAndExpand"
               VerticalOptions="Start"/>
        <Button Text="{x:Static resources:AppResources.AddButton}"
                WidthRequest="300"
                HorizontalOptions="CenterAndExpand"
                VerticalOptions="Start"/>
        <Button Text="{x:Static resources:AppResources.ChangeButton}" Clicked="Button_Clicked"></Button>
    </StackLayout>

当我单击按钮时,我将更改语言并刷新此页面。

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

        private void Button_Clicked(object sender, System.EventArgs e)
        {
        
            CultureInfo.CurrentUICulture = new CultureInfo("ja-JP", false);
            App.Current.MainPage =new NavigationPage( new LocalizedXamlPage());
           
        }
    }

这里正在运行 GIF(我无法重现您的问题,如果您在运行时更改文本,请刷新视图)。

在此处输入图片说明

这是我的演示。

https://github.com/851265601/LocalizationDemo

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

. 我想更改区域设置,以便键盘和日期选择器以及时间选择器与应用程序的区域设置相匹配,而不是设备的区域设置。 例如,我的设备语言是英语,我的应用程序语言是希腊语。 所以我希望数字键盘的小数点是逗号而不是点,我希望日期选择器中的确定和取消按钮是希腊语。

你想达到像下面GIF那样的结果吗?

在此处输入图片说明

如果是这样,您可以创建一个BaseActivity.csLanguageManager

   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;
        }
    }

然后使用您的 MainActivity 扩展BaseActivity ,并添加public static MainActivity instance; MainActivity

    [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());
        }
    }

在您的 depdenceService 中,使用以下代码更改它并重新启动您的应用程序。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM