2

私のアプリは、次のように JSON でサーバーから 2 つの言語にローカライズされた動的コンテンツをプルします。

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

NSLocalizedString が静的コンテンツの正しい文字列を選択するのと同じ方法で、Getter が文字列のローカライズされたバージョンを返す、Headline プロパティを持つ Banner というオブジェクトを作成したいと考えています。

これに NSLocalizedString を使用することは可能ですか、それとも別の方法がありますか?

4

2 に答える 2

0

私の知る限り、NSLocalizedString()そのすべてのバリアントはアプリ バンドル内で動作します。理論的には、それらを使用できます (より正確には、オブジェクトのコンテンツをアプリ バンドル内のファイルNSLocalizedStringFromTable()にシリアル化することが可能であれば) 残念ながら、アプリ バンドルは書き込み可能ではないため、使用できると確信しています。これらの関数マクロを使用しないでください。.strings

できることは、現在のシステム言語識別子を取得し、それを逆シリアル化された辞書へのインデックスとして使用することです。

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

最終的に、両方の言語のデータを格納するディクショナリ プロパティを持つ NSLocalizedObject というクラスを作成しました。次に、アプリの現在の言語をチェックし、適切な言語でデータを返すゲッターとセッターを作成しました。ローカライズが必要なすべてのデータ モデル クラスは、このクラスから継承されます。

-(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];

}

OS が設定されている実際の言語を確認できることに注意してください。ただし、OS の現在の言語に関係なく、ユーザーがアプリの言語を変更できる必要があります。

于 2014-11-08T20:15:42.927 に答える