如果在应用程序启动后更改了设备语言,如何获取当前的设备语言?

4

启动应用程序时,有很多方法可以获取当前设备语言:

  • CultureInfo.CurrentCulture (当前区域性)
  • CultureInfo.CurrentUICulture (当前用户界面区域性)
  • CultureInfo.DefaultThreadCurrentCulture (默认线程当前区域性)
  • CultureInfo.DefaultThreadCurrentUICulture (默认线程当前用户界面区域性)
  • Thread.CurrentThread.CurrentCulture (当前线程区域性)
  • Thread.CurrentThread.CurrentUICulture (当前线程用户界面区域性)

但如果我在应用程序运行时更改设备语言,则这些值将不会更新。

是否存在一种通用方法来获取当前设备语言,还是我需要为每个平台编写独立的代码?

  • 安卓:CultureInfo.GetCultureInfo(Locale.Default.ToString().Replace('_', '-'))
  • iOS:CultureInfo.GetCultureInfo(NSLocale.CurrentLocale.LocaleIdentifier.Replace('_', '-'));
  • UWP:CultureInfo.GetCultureInfo(GlobalizationPreferences.Languages[0].ToString())

如果我在应用程序运行时更改设备语言,您是在设备设置中更改它吗?但应用程序没有看到更改?听起来像是 Xamarin. Essentials 的一个错误(或可能是限制)。 值得创建一个 Github 问题以解决此问题。除非有人能够在此处为您提供答案。 - ToolmakerSteve
当我设置 CultureInfo.CurrentCulture 时,我不希望设备的语言发生改变。反之亦然。当应用程序启动时,CultureInfo.CurrentCulture 默认值被设置为设备文化,然后与其分离。它代表应用程序的文化,而不是设备的文化。您的意思是应该添加这个API吗?我同意并在XCT中创建了一个PR:https://github.com/xamarin/XamarinCommunityToolkit/pull/1200 - maxc137
我把设备信息和应用状态搞混了;你的PR很有道理。 - ToolmakerSteve
2个回答

1
每个平台都应在用户更改设备位置或语言时提供通知。例如,iOS会发送一个包含语言属性的NSCurrentLocaleDidChangeNotification(Objective-C版本)或currentLocaleDidChangeNotification(Swift版本)。
您需要使用Xamarin.Forms本地通知过程注册和观察平台通知,该过程指出(加粗和斜体):
每个平台都以不同的方式处理本地通知的创建、显示和消耗。本文解释了如何使用Xamarin.Forms创建跨平台抽象来发送、安排和接收本地通知。

有很多关于如何做到这一点的教程。搜索“xamarin forms本地通知消耗教程”以找到一些教程。注意术语“本地”。你不想要“推送”通知——那是另一回事。

为了更简单地执行此任务,您可以使用插件,例如edsnider/localnotificationsplugin on GitHub。在搜索中将术语“consume tutorial”替换为“plugin”,您可能会发现更多内容。
澄清: - 本地通知是在设备内部发生的,即设备或应用程序在内部发送通知以供设备上的应用程序消耗。 - 推送通知发生在向外部服务(例如Azure)发出请求时。该服务然后将相应的通知广播到适当的设备。

本地通知就是推送通知 =) 是的,我可以为每个平台编写代码,但我想知道 Xamarin 是否已经提供了跨平台 API。 自己编写此 API 存在问题。例如将平台特定的语言表示转换为 CultureInfo。每个平台都有略微不同的字符串语言表示,并非所有文化都受 CultureInfo 支持。 - maxc137
本地通知不是推送通知 =) 根据Xamarin的iOS 10通知框架入门(不仅适用于iOS),本地通知是来自设备而不是通知服务的通知... 正如Xamarin Forms中的推送通知所指出的那样,对于推送(或远程)通知:您将以特定格式向其基础架构发送消息,然后他们将其发送到移动设备。 - leanne
此外,日期为2/12/2021(2021年2月12日),示例代码位于:Xamarin.Forms - 本地通知演示 - leanne
抱歉,我的表述可能不够清晰。我的意思是,据我所知,本地通知是用于通知用户有关某些事情的(例如发出声音、在屏幕上显示等),而不是应用程序本身。语言更改应该是应用程序内部事件(可以使用“MessagingCenter”或自定义“event”),并且该事件不应广播给用户。或者本地通知是否可以像“MessagingCenter”一样使用? - maxc137
MessagingCenter 的工作方式类似,但使用的模式有所不同(MessagingCenter 为发布者-订阅者模式,本地通知为观察者模式)。这两种技术都允许您的应用程序决定是让用户知道某些事情还是仅在后台处理事件。 (这些用户通知通常称为“警报” - 词汇 - 哎呀!)请查看我提供的链接,特别是上面的演示链接,以了解本地通知的示例代码如何工作。 - leanne

0
请尝试。
Java.Util.Locale currentLanguage = this.Resources.Configuration.Locales.Get (0);

我在Xamarin Android中使用此调用,对我来说运行良好。 "this" 在类Android.App.Activity中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接