Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 本地化核心数据模型属性以进行显示_Objective C_Cocoa_Ios_Core Data - Fatal编程技术网

Objective c 本地化核心数据模型属性以进行显示

Objective c 本地化核心数据模型属性以进行显示,objective-c,cocoa,ios,core-data,Objective C,Cocoa,Ios,Core Data,我正在从事一个iOS项目,该项目使用一个大型且相当复杂的数据模型。模型中的某些图元具有相应的详图视图控制器,其中包括应显示本地化名称和某些特性的相应值的表视图 我已经看过了其中的一些,但大部分似乎都是为了显示SDK生成的错误消息,而不是直接访问本地化的属性名 我为我的模型文件(“model.xcdatamodel”)创建了一个字符串文件(“ModelModel.strings”),并通过查看NSManagedObjectModel实例上的-localizationDictionary验证它是否正

我正在从事一个iOS项目,该项目使用一个大型且相当复杂的数据模型。模型中的某些图元具有相应的详图视图控制器,其中包括应显示本地化名称和某些特性的相应值的表视图

我已经看过了其中的一些,但大部分似乎都是为了显示SDK生成的错误消息,而不是直接访问本地化的属性名

我为我的模型文件(“model.xcdatamodel”)创建了一个字符串文件(“ModelModel.strings”),并通过查看NSManagedObjectModel实例上的
-localizationDictionary
验证它是否正确加载。我的问题是:如何访问代码中的本地化实体和属性名称?是否有办法通过NSEntityDescription、NSPropertyDescription等访问它们?还是每次都必须通过NSManagedObjectModel

我是本地化新手,所以也许答案很明显,但如果是的话,请随意给我一个正确方向的提示

更新

按照@ughoavgfhw的回答,我很快想出了两个类别来完成我所需要的。要点:

N实体说明:

@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
@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
NSProperty说明:

@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
@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

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

下面是一个NSEntityDescription实现示例。对于属性,您可以执行类似的操作,但如果多个实体具有同名属性,则应同时使用实体和属性名称(您可能还需要在本地化文件中同时使用实体和属性名称作为键。我不知道模型是否会自动创建它们)


这是一个。

Aw。这是令人失望的,没有一个公共的API,但我想这并不难手动完成。谢谢