Xamarin.Forms开发iOS应用默认语言回退加载异常问题
结论
这个现象完全符合iOS系统的原生语言匹配逻辑,不属于配置错误。
原因
iOS选择应用显示语言的默认规则是:按照用户在系统「语言与地区」设置里的偏好语言列表从上到下顺序遍历,加载第一个命中的、应用声明支持的语言,不会因为最高优先级语言不支持就直接跳转到你预设的默认语言。
从你的测试场景来看,设备上的偏好语言排序应该是:
- 第一位是你的应用不支持的语言(不在英语、意大利语支持范围内)
- 第二位是意大利语
- 第三位是英语
系统遍历到第一位不支持的语言后,下一个命中的支持项是意大利语,就会直接加载意大利语资源,根本不会触发你配置的默认英语回退逻辑。
你当前配置的几个参数作用和生效前提如下:
Info.plist里的CFBundleLocalizations数组:仅用于声明应用支持的所有本地化语言,供系统做匹配遍历使用,本身不控制默认回退顺序- .NET侧的
[assembly: NeutralResourcesLanguage("en")]:属于.NET资源体系的回退规则,只有iOS原生语言匹配流程走完、找不到对应文化的资源文件时才会触发,优先级远低于系统原生的语言选择逻辑 Info.plist里的CFBundleDevelopmentRegion = en:只有当用户偏好列表里所有语言都不在你声明的支持列表中时,才会回退到这个配置对应的语言,只要列表里有任意一个支持的语言排在英语前面,就不会触发。
实现预期效果的方案
如果你要实现「只要用户最高优先级的首选语言不在应用支持范围内,就直接用英语,不继续往下匹配次优先级的支持语言」,需要在iOS项目启动阶段手动接管语言选择逻辑,不要走系统默认的遍历规则:
在iOS项目的AppDelegate.cs中重写FinishedLaunching方法,在初始化Xamarin.Forms之前加入语言判断逻辑,参考代码如下:
public override bool FinishedLaunching(UIApplication app, NSDictionary options) { // 取用户设置的最高优先级首选语言 var topPreferLang = NSLocale.PreferredLanguages[0]; string appLang = "en"; // 仅当最高优先级语言是意大利语时才用意大利语,其他情况全用英语 if (topPreferLang.StartsWith("it")) { appLang = "it"; } // 强制应用使用选定的语言 NSUserDefaults.StandardUserDefaults.SetValueForKey( NSArray.FromStrings(appLang), new NSString("AppleLanguages") ); NSUserDefaults.StandardUserDefaults.Synchronize(); global::Xamarin.Forms.Forms.Init(); LoadApplication(new App()); return base.FinishedLaunching(app, options); }
内容的提问来源于stack exchange,提问作者zappasan
相关产品推荐
相关产品推荐

