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