2

我的应用程序从 JSON 格式的服务器中提取一些以两种语言本地化的动态内容,如下所示:

Banners: [
{
    BannerId: 1,
    Headline: {
        en: "English String",
        fr: "French String"
    }
}]

我想创建一个名为 Banner 的对象,它有一个 Headline 属性,它的 getter 返回字符串的本地化版本,就像 NSLocalizedString 为静态内容选择正确的字符串一样。

是否可以为此使用 NSLocalizedString 或有其他方法?

4

2 回答 2

0

据我所知,NSLocalizedString()它的所有变体都可以在您的应用程序包中使用。从理论上讲,您可以使用它们(更准确地说,NSLocalizedStringFromTable()如果可以将对象的内容序列化到应用程序包内的.strings文件中。不幸的是,应用程序包不可写,所以我很有信心您可以' t 使用这些函数宏。

您可以做的是获取当前系统语言标识符,然后将其用作反序列化字典的索引:

NSString *curSysLang = [NSLocale preferredLanguages][0];
NSString *headline = jsonObject[0][@"Headline"][curSysLang];
于 2013-08-11T17:46:13.353 回答
0

我最终创建了一个名为 NSLocalizedObject 的类,它有一个字典属性,用于存储两种语言的数据。然后我创建了 getter 和 setter,它们检查应用程序的当前语言并以适当的语言返回数据。我所有需要本地化的数据模型类都继承自这个类。

-(NSObject *)getLocalizedObjectForProperty:(NSString *)property {
    NSDictionary *objs = [_propertyDictionary objectForKey:property];
    NSString *lang = [[NSUserDefaults standardUserDefaults] objectForKey:@"currentLanguage"];


    return [objs objectForKey:lang];


}

-(NSObject *)getLocalizedObjectForProperty:(NSString *)property forLanguage:(NSString *)lang {
    NSDictionary *objs = [_propertyDictionary objectForKey:property];

    return [objs objectForKey:lang];


}
//takes a whole localized json style object - like {@"en":bleh, @"fr:bleh}
-(void)setLocalizedObject:(NSDictionary *)obj forProperty:(NSString *) property {
    [_propertyDictionary setObject:obj forKey:property];
}

//allows you to set an object for a specific language
-(void)setObject:(NSObject *)obj forProperty:(NSString *) property forLang:(NSString *)lang {

    //if a language isn't handed in then it means it should be set for the current language
    //applicable in the case where I want to save an image that is downloaded to the current language for that image.
    if (!lang) lang = DEFAULTS(@"currentLanguage");

    //get a mutable version of the dictionary for the property you want to set
    NSMutableDictionary *mutObjs = (NSMutableDictionary *)[_propertyDictionary objectForKey:property];

    //if the above call returns nil because the dictionary doesn't have that property yet then initialize the dictionary
    if (!mutObjs) {
        mutObjs = [NSMutableDictionary dictionary];
    }

    //set the obj for the correct language
    [mutObjs setObject:obj forKey:lang];

    //store the property back into the propertyDictionary
    [_propertyDictionary setObject:(NSDictionary *)mutObjs forKey:property];

}

请注意,您可以检查操作系统设置的实际语言,但我要求用户可以更改应用程序的语言,尽管操作系统的当前语言。

于 2014-11-08T20:15:42.927 回答