Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin使用Android资源更改语言_C#_Xamarin_Xamarin.forms_Xamarin.android_Locale - Fatal编程技术网

C# Xamarin使用Android资源更改语言

C# Xamarin使用Android资源更改语言,c#,xamarin,xamarin.forms,xamarin.android,locale,C#,Xamarin,Xamarin.forms,Xamarin.android,Locale,基于此线程中的答案 我在应用程序运行时使用此代码更改语言 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(loc

基于此线程中的答案 我在应用程序运行时使用此代码更改语言

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表单,您可以使用来实现它

比如说。我为英语和日语添加了
更改按钮
本地化

然后我在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>
这里正在运行GIF(我无法再现您的问题,如果您在运行时更改文本,请刷新视图)

这是我的演示

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

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

你想达到下面的效果吗

如果是这样,您可以创建
BaseActivity.cs
LanguageManager

   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
,并添加
公共静态MainActivity实例
main活动中

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

如果以上答案有帮助,请不要忘记将其作为答案接受(单击“✔” 在这个答案的左上角),它将帮助其他有类似眼睛的人,我这样做是为了标签和按钮等。这不是问题。我想更改区域设置,使键盘、日期选择器和时间选择器匹配应用程序的区域设置,而不是设备的区域设置。例如,我的设备语言是英语,我的应用程序语言是希腊语。因此我想要numeric键盘小数点是逗号而不是点,我希望日期选择器中的“确定”和“取消”按钮是希腊语…这是我的演示:是的,对不起,谢谢!!这是我想要的结果!由于时间不够,我还没有尝试,但我会这样做,我会发布结果!再次感谢!
[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);
        }
    }
}