iOS 关于 NSLocale 的命名习惯

Name order habit in iOS about NSLocale

据我们所知,在英语国家,人们总是以"FirstName MiddleName LastName"的格式写下他们的名字,例如"Steven Paul Jobs"。但是在其他一些语言中,它是不同的,例如在中国,人们通常将名字写成 "LastName FirstName" 格式。我想在 "NSLocale Class Reference" 中找到一些东西,但它对我没有太大帮助。 我知道我可以通过 NSLocaleCountryCode 做 "switch case",但我不知道每个国家的习惯。 那么,有没有更好的方法来解决名称顺序问题呢?感谢您的帮助。

是的,有一个由开发 Afnetworking 的 Mattt 编写的工具包:

TTTNameFormatter

TTTNameFormatter formats names according to the internationalization standards of the AddressBook framework, which determine, for example, the display order of names and whether or not to delimit components with whitespace.

TTTNameFormatter is not available on OS X.

用法示例

TTTNameFormatter *nameFormatter = [[TTTNameFormatter alloc] init];
NSString *frenchName = [nameFormatter stringFromPrefix:nil firstName:@"Guillaume" middleName:@"François" lastName:@"Antoine" suffix:@"Marquis de l'Hôpital"];
NSLog(@"%@", frenchName);
// "Guillaume François Antoine Marquis de l'Hôpital"

NSString *japaneseName = [nameFormatter stringFromFirstName:@"孝和" lastName:@"関"];
NSLog(@"%@", japaneseName);
// "関孝和"

在这里获取:

https://github.com/mattt/FormatterKit

您可以使用AddressBook 框架来获取姓名顺序。只需将其添加到项目中并执行#import "AddressBookUI/AddressBookUI.h",然后就可以使用此方法,例如:

- (NSString*)localNameFormatterWithFirstName:(NSString*)firstName middleName:(NSString*)middleName andLastName:(NSString*)lastName {
    ABRecordRef record = ABPersonCreate();
    ABRecordSetValue(record, kABPersonFirstNameProperty, (__bridge CFStringRef)firstName, NULL);
    ABRecordSetValue(record, kABPersonMiddleNameProperty, (__bridge CFStringRef)middleName, NULL);
    ABRecordSetValue(record, kABPersonLastNameProperty, (__bridge CFStringRef)lastName, NULL);
    NSString *displayName = (__bridge_transfer NSString*)ABRecordCopyCompositeName(record);
    CFRelease(record);
    return displayName;
}

任何为 nil 的参数都将被忽略。

此功能已添加到 Foundation.framework。与 iOS9+ 兼容。

我还没有在文档中看到它,但它在头文件中,您可以在 Swift 游乐场中使用它。

WWDC 2015 Session 227(大约 22 分钟)中介绍了此问题的详细信息。在此 session 他们讨论了 NSPersonNameComponents 和 NSPersonNameComponentsFormatter。

示例:

let components = NSPersonNameComponents()
components.namePrefix = "Mrs."
components.givenName = "Grace"
components.middleName = "Murray"
components.familyName = "Hopper"

NSPersonNameComponentsFormatter.localizedStringFromPersonNameComponents(
    components, style: .Default, options: [])