【发布时间】:2011-04-09 06:22:59
【问题描述】:
我正在开发一个使用大型且相当复杂的数据模型的 iOS 项目。模型中的一些实体具有相应的详细视图控制器,其中包括应显示本地化名称和某些属性的相应值的表视图。
我查看了一些 Apple's documentation for creating a strings file for a managed object model,但其中大部分似乎是为了显示 SDK 生成的错误消息,而不是直接访问本地化的属性名称。
我为我的模型文件(“Model.xcdatamodel”)创建了一个字符串文件(“ModelModel.strings”),并通过查看我的 NSManagedObjectModel 实例上的 -localizationDictionary 来验证它是否正确加载。我的问题是:我应该如何在我的代码中访问本地化的实体和属性名称?有没有办法通过 NSEntityDescription、NSPropertyDescription 等找到它们,还是我每次都必须通过 NSManagedObjectModel?
我是本地化新手,所以答案可能很明显,但如果是这样,请随时给我一个正确的方向。
更新
按照@ughoavgfhw 的回答,我很快想出了两个类别来完成我需要的。要点:https://gist.github.com/910824
NSEntityDescription:
@interface NSEntityDescription (LocalizedName)
@property (nonatomic, readonly) NSString *localizedName;
@end
@implementation NSEntityDescription (LocalizedName)
@dynamic localizedName;
- (NSString *)localizedName {
static NSString *const localizedNameKeyFormat = @"Entity/%@";
NSString *localizedNameKey = [NSString stringWithFormat:localizedNameKeyFormat, [self name]];
NSString *localizedName = [[[self managedObjectModel] localizationDictionary] objectForKey:localizedNameKey];
if (localizedName) {
return localizedName;
}
return [self name];
}
@end
NSPropertyDescription:
@interface NSPropertyDescription (LocalizedName)
@property (nonatomic, readonly) NSString *localizedName;
@end
@implementation NSPropertyDescription (LocalizedName)
@dynamic localizedName;
- (NSString *)localizedName {
static NSArray *localizedNameKeyFormats = nil;
if (!localizedNameKeyFormats) {
localizedNameKeyFormats = [[NSArray alloc] initWithObjects:@"Property/%@/Entity/%@", @"Property/%@", nil];
}
for (NSString *localizedNameKeyFormat in localizedNameKeyFormats) {
NSString *localizedNameKey = [NSString stringWithFormat:localizedNameKeyFormat, [self name], [[self entity] name]];
NSString *localizedName = [[[[self entity] managedObjectModel] localizationDictionary] objectForKey:localizedNameKey];
if (localizedName) {
return localizedName;
}
}
return [self name];
}
@end
【问题讨论】:
标签: objective-c cocoa ios core-data