我想在我的APP中更改语言环境...我读了很多文章,现在我有了这段代码,它不起作用并且没有给我一个错误:
我的语言活动:
公共类LanguageActivity:BaseActivity{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.Language);
LanguageManager.ChangeLanguage(this, "fa");
Intent intent = new Intent(this, typeof(MainActivity));
intent.SetFlags(ActivityFlags.ClearTask | ActivityFlags.NewTask);
StartActivity(intent);
}
}
My BaseActivity:
公共类BaseActivity:活动{
protected override void AttachBaseContext(Context @base)
{
base.AttachBaseContext(LanguageManager.LoadLanguage(@base));
}
}
我的语言管理器:
公共类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
Locale 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;
}
}
为什么不起作用?我读了this和this。他们正在使用相同的方法!
PS1:我在那里有values-fa文件夹和Strings.xml。在手机设置中更改语言时,我看到了更改。因此,当我在电话上更改语言环境时,它就可以使用!
PS2:我简化了代码,这就是为什么我在LanguageActivity中删除了SharedPreference部分!
PS3:下载项目:Download
记录下来,我过去已经这样做过,并且在应用程序中更改语言是一个坏主意。它永远无法很好地工作,通常会带来很多错误。只让应用程序语言由手机语言设置来确定会更好。
如果您确实需要通过应用更改语言,尽管您需要在配置中设置语言环境:
Configuration config = BaseContext.Resources.Configuration;
config.Locale = myLocale;
BaseContext.Resources.UpdateConfiguration(config, BaseContext.Resources.DisplayMetrics);
其中MyLocale是要设置的语言,例如
var myLocale = new Locale("en");
编辑:更新为xamarin代码
对于Xamarin.Android,您可以这样操作:
像这样创建自己的上下文包装器:
public class MyContextWrapper : ContextWrapper
{
public MyContextWrapper(Context context) : base(context)
{
}
public static Locale getSystemLocaleLegacy(Configuration config)
{
return config.Locale;
}
public static Locale getSystemLocale(Configuration config)
{
return config.Locales.Get(0);
}
public static void setSystemLocaleLegacy(Configuration config, Locale locale)
{
config.SetLocale(locale);
config.SetLayoutDirection(locale);
}
public static void setSystemLocale(Configuration config, Locale locale)
{
config.SetLocale(locale);
config.SetLayoutDirection(locale);
}
public static ContextWrapper wrap(Context context, string language)
{
Configuration config = context.Resources.Configuration;
Locale sysLocale = null;
if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
{
sysLocale = getSystemLocale(config);
}
else
{
sysLocale = getSystemLocaleLegacy(config);
}
Locale locale;
if (language == "en")
{
locale = new Locale(language, "US");
}
else if (language == "zh")
{
locale = new Locale(language, "CN");
}
else
{
locale = new Locale("en", "US");
}
Locale.Default = (locale);
if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
{
setSystemLocale(config, locale);
}
else
{
setSystemLocaleLegacy(config, locale);
}
if (Build.VERSION.SdkInt >= BuildVersionCodes.JellyBeanMr1)
{
context = context.CreateConfigurationContext(config);
}
else
{
context.Resources.UpdateConfiguration(config, context.Resources.DisplayMetrics);
}
return new MyContextWrapper(context);
}
}
将以下代码添加到您的活动中:
protected override void AttachBaseContext(Context @base)
{
try
{
base.AttachBaseContext(MyContextWrapper.wrap(@base,"Your_language"));
}
catch{}
}
请确保每次您的语言更改时都重新启动当前活动。
另外,请根据您的语言要求尝试更新我的代码
祝你好运,
如有疑问,请随时回来
抱歉,稍后再回答,我周末不上班,我测试您的项目。问题是您没有让LoginActivity
扩展为BaseActivity
。您应该让所有活动都扩展为BaseActivity
。
更改
public class LoginActivity : Activity
到
public class LoginActivity : BaseActivity