objective-c - 本地化核心数据模型属性以供显示

标签 objective-c cocoa ios core-data

我正在处理一个使用大型且相当复杂的数据模型的 iOS 项目。模型中的一些实体具有相应的详细 View Controller ,其中包括应显示本地化名称和某些属性的相应值的 TableView 。

我看过一些 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

最佳答案

没有直接的方法来获取 apple 提供的信息,但您可以自己实现。您只需要将类别添加到 NSEntityDescription 等创建标识符并从模型中请求本地化值,然后将其视为内置。

这里是一个 NSEntityDescription 实现的例子。对于属性,你会做类似的事情,但你应该同时使用实体和属性名称,以防多个实体具有相同名称的属性(你可能还需要使用实体和属性名称作为本地化文件中的键。我不知道模型是否会自动创建它们)。

@implementation NSEntityDescription (Localization)
- (NSString *)localizedName {
    NSString *key = [NSString stringWithFormat:@"Entity/%@", [self name]];
    NSDictionary *dictionary = [[self managedObjectModel] localizationDictionary];
    NSString *localizedName = [dictionary objectForKey:key];
    return (localizedName ? localizedName : [self name]);
}
@end

这是一个reference for the keys used in the localizations .

关于objective-c - 本地化核心数据模型属性以供显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5600558/

相关文章:

iphone - NSNumberFormatter 显示 10^n (10000 -> 10k) 的自定义标签

ios - 如何在 iOS 上同步多个音频文件?

iOS - 下载大数据集,检测属性值的实体(NSManagedObject)是否已经存在

iPhone - 尝试将 sqlite 数据库复制到文档目录 - 复制空白版本

objective-c - 如何使 NSView 透明,但保持属于它的对象不变?

objective-c - Mac 编程的 Objective-C 替代品有哪些?

ios - 无法在 KVO 观察者方法中获取新值

ios - UINavigationController 弹出一个 View

ios - MPMoviePlayer setCurrentPlaybackTime iOS

objective-c - Xcode方案menu/popupButton是如何实现的?