UWP下Xamarin Forms应用始终获取en-US语言问题求助
看起来你遇到的问题挺常见的——明明已经切换了系统显示和输入语言,而且也有对应的RESX资源文件,但调用Windows.System.UserProfile.GlobalizationPreferences.Languages[0]却还是固定返回en-US。我来给你几个实用的解决思路:
1. 先检查应用的语言声明配置
首先得确认你的应用有没有正确声明支持目标语言。打开Package.appxmanifest,找到Resources节点,确保添加了你切换的语言资源声明,比如:
<Resources> <Resource Language="en-US" /> <Resource Language="zh-CN" /> <!-- 替换成你的目标语言代码 --> </Resources>
如果没添加对应语言的声明,系统可能会默认回退到en-US,哪怕你装了语言包也没用。
2. 改用ApplicationLanguages获取应用实际语言
GlobalizationPreferences拿到的是系统级的语言偏好,但应用实际使用的语言可能受自身的语言覆盖设置影响。试试用更贴近应用上下文的API:
public System.Globalization.CultureInfo GetCurrentCultureInfo() { var appCurrentLang = Windows.ApplicationModel.Resources.Core.ApplicationLanguages.Languages[0]; return new System.Globalization.CultureInfo(appCurrentLang); }
这个API会优先返回应用当前正在使用的语言,很多时候能解决GlobalizationPreferences不生效的问题。
3. 排查是否存在语言覆盖代码
检查你的应用代码里有没有设置过PrimaryLanguageOverride,如果有这个设置,不管系统语言怎么切换,应用都会强制使用覆盖的语言:
// 如果有类似这样的代码,会固定语言为en-US Windows.ApplicationModel.Resources.Core.ApplicationLanguages.PrimaryLanguageOverride = "en-US";
如果存在,把它改成动态获取系统语言的逻辑,或者直接移除,让应用跟随系统设置。
4. 确认系统语言设置并重启应用
有时候系统语言切换后,需要重启应用才能让新设置生效。另外要确保你是在设置-时间和语言-语言里把目标语言拖到了列表最顶部,设为了首选语言,而不仅仅是安装了语言包。
5. 尝试用.NET内置的CultureInfo属性
如果上面的方法都没效果,可以试试直接用.NET的内置属性:
public System.Globalization.CultureInfo GetCurrentCultureInfo() { // CurrentUICulture对应界面显示语言,CurrentCulture对应区域格式(比如日期、数字) return System.Globalization.CultureInfo.CurrentUICulture; }
不过要注意,在UWP这类Windows应用中,这个属性的行为可能受应用配置影响,建议结合前面的步骤一起排查。
内容的提问来源于stack exchange,提问作者John

