iOS:如何获取当前的应用程序语言

gpo*_*pov 20 iphone locale localization ios

我正在开发的应用程序支持3种语言:英语,法语和德语.

我如何获得当前的应用程序语言(不是设备语言)?

问题是我必须获取应用程序的当前语言,以便向服务器发送请求,并且响应应该使用正确的语言.设备语言没用,因为如果用户将os语言切换为意大利语,则应用程序以英语运行,我需要将英语发送到服务器.

谢谢

Jon*_*lli 38

我一直在做什么:

将字符串条目添加到Localizable.strings文件中.我总是使用密钥"lang"="de";(或"lang"="en"等).

然后,您可以通过添加语言在NSURLRequest中使用它 NSLocalizedString(@"lang", @"")

使用该方法,您可以绝对控制将要发送给您的后端.

  • 愚蠢的黑客 - 请参阅@mgcm 的答案以了解使用 iOS 系统 API 的正确方法 (2认同)

小智 36

接受的答案是一种解决方法.

关于设备本身的语言偏好,你有

[NSLocale preferredLanguages]
Run Code Online (Sandbox Code Playgroud)

它将为您提供系统常规设置中定义的首选语言的有序数组.

Cocoa Touch框架将在加载应用程序的本地化资源时将此首选语言列表考虑在内,并根据您在捆绑中提供的翻译对其进行过滤.

可以使用此过滤和有序的本地化语言列表

[[NSBundle mainBundle] preferredLocalizations]
Run Code Online (Sandbox Code Playgroud)

您的服务器请求应与此数组中的第一个值匹配,否则应用程序和服务器数据之间的语言将不匹配.

  • 这绝对是正确的做法..应该是接受的答案! (5认同)
  • 干得好@mgcm无疑是正确的方法 (2认同)

小智 14

您可以使用NSBundle类的preferredLocalizations方法:

NSString *currentLocalization = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

  • 这真的有用吗?我有一个支持英语(en)和瑞典语(sv)的应用程序,如果我将模拟器设置为使用德语,则上面的值变为"de". (4认同)

Lam*_*mma 6

从 iOS 13 开始,可以单独为每个应用程序设置语言。

在 WWDC19 的“使用 Xcode 11 创建出色的本地化体验”会议中,他们展示了两个用于确定应用程序用户设置的选项。

获取当前运行的应用程序语言:

Bundle.main.preferredLocalizations.first
Run Code Online (Sandbox Code Playgroud)

获取最佳语言,给定外部语言代码列表:

let availableLanguages = Server.requestLanguages()
Bundle.preferredLocalizations(from: availableLanguages).first
Run Code Online (Sandbox Code Playgroud)