【问题标题】:Localizing Core Data model properties for display本地化核心数据模型属性以供显示
【发布时间】: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


    【解决方案1】:

    没有直接的方法可以获取苹果提供的信息,但您可以自己实现。您只需将类别添加到 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

    【讨论】:

    • 噢。令人失望的是没有公开的 API,但我想手动操作并不难。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2010-11-19
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多