2010-05-15 3 views
7

मेरे पास एक स्थानीय स्ट्रिंग है जिसे कुछ चर लेने की आवश्यकता है। हालांकि, स्थानीयकरण में यह महत्वपूर्ण है कि चर का क्रम भाषा से भाषा में बदल सकता है।स्वरूपित स्थानीयकृत स्ट्रिंग कैसे बनाएं?

NSString *text = NSLocalizedString(@"My birthday is at %@ %@ in %@", nil); 

कुछ भाषाओं कुछ शब्द दूसरों से पहले आते हैं, जबकि अन्य लोगों में यह रिवर्स है में:

तो यह एक अच्छा विचार नहीं है। इस समय मुझे एक अच्छा उदाहरण की कमी है।

मैं स्वरूपित स्ट्रिंग में NAMED चर कैसे प्रदान करूं? क्या कुछ भारी स्व-निर्मित स्ट्रिंग प्रतिस्थापन के बिना ऐसा करने का कोई तरीका है? यहां तक ​​कि कुछ क्रमांकित चर जैसे {% @ 1}, {% @ 2}, और इसी तरह पर्याप्त होंगे ... क्या कोई समाधान है?

उत्तर

12

यही कारण है कि NSLocalizedString दो पैरामीटर लेता है बिना काम करता है। चर के मूल भाषा अर्थ का वर्णन करने वाली टिप्पणी शामिल करने के लिए दूसरे पैरामीटर का उपयोग करें। फिर, अनुवादक उन्हें $ + संख्या निर्माण का उपयोग करके पुन: व्यवस्थित कर सकते हैं। ऐप्पल के Notes for Localizers देखें।

हालांकि आप एक भाषा में पैरामीटर को छोड़ नहीं सकते हैं। उदाहरण के लिए, यदि आपके पास अंग्रेजी में 3 पैरामीटर हैं और फ्रेंच में 4 हैं और आपको अंग्रेजी में तीसरे की आवश्यकता नहीं है, तो आप %[email protected] %[email protected] and %[email protected] जैसे प्रारूपित नहीं कर सकते हैं। आप केवल अंतिम को छोड़ सकते हैं।

3

मैंने इसे कुछ हफ्ते पहले एक परियोजना में NSScanner के साथ अपना स्वयं का सरल टेम्पलेट सिस्टम बनाकर हल किया। विधि एक टेम्पलेट सिस्टम का उपयोग करती है जो वाक्यविन्यास ${name} के साथ चर पाती है। NSDictionary के माध्यम से विधि को चर के लिए आपूर्ति की जाती है।

"born message" = "I was born in ${birthYear} on a ${birthWeekDay}. ${byebye}"; 
"byebye"  = "Cheers!"; 

हम निम्नलिखित परिणाम हासिल कर सकते हैं ...

NSDictionary *variables = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:1986], @"birthYear", @"monday", @"birthWeekDay", nil]; 
NSString *finalString [self localizedStringFromTemplateString:@"born message" variables:variables]; 
NSLog(@"%@", finalString); // "I was born in 1986 on a monday. Cheers!" 

आप देख सकते हैं, मैं कुछ अतिरिक्त कार्यक्षमता जोड़ दिया है:

- (NSString *)localizedStringFromTemplateString:(NSString *)string variables:(NSDictionary *)variables { 
    NSMutableString *result = [NSMutableString string]; 
    // Create scanner with the localized string 
    NSScanner *scanner = [[NSScanner alloc] initWithString:NSLocalizedString(string, nil)]; 
    [scanner setCharactersToBeSkipped:nil]; 

    NSString *output; 

    while (![scanner isAtEnd]) { 
     output = NULL; 
     // Find ${variable} templates 
     if ([scanner scanUpToString:@"${" intoString:&output]) { 
      [result appendString:output]; 

      // Skip syntax 
      [scanner scanString:@"${" intoString:NULL]; 

      output = NULL; 

      if ([scanner scanUpToString:@"}" intoString:&output]) { 
       id variable = nil; 
       // Check for the variable 
       if ((variable = [variables objectForKey:output])) { 
        if ([variable isKindOfClass:[NSString class]]) { 
         // NSString, append 
         [result appendString:variable]; 
        } else if ([variable respondsToSelector:@selector(description)]) { 
         // Not a NSString, but can handle description, append 
         [result appendString:[variable description]]; 
        } 
       } else { 
        // Not found, localize the template key and append 
        [result appendString:NSLocalizedString(output, nil)]; 
       } 
       // Skip syntax 
       [scanner scanString:@"}" intoString:NULL]; 
      } 
     } 
    } 

    [scanner release]; 

    return result; 
} 
एक स्थानीयकरण फ़ाइल इस तरह लग रही के साथ

भी। सबसे पहले, कोई भी वेरिएबल नहीं मिला है (${byebye} मेरे उदाहरण में) को स्थानीयकृत किया जाएगा और परिणामों में जोड़ा जाएगा। मैंने ऐसा इसलिए किया क्योंकि मैं अपने एप्लिकेशन बंडल से HTML-files में लोड करता हूं और उन्हें स्थानीयकरण विधि के माध्यम से चलाता हूं (ऐसा करने पर, हालांकि स्कैनर बनाते समय मैं इनपुट स्ट्रिंग को स्थानीयकृत नहीं करता)। इसके अलावा, मैंने कुछ अतिरिक्त लचीलापन के लिए NSString ऑब्जेक्ट्स की तुलना में अन्य चीजों में भेजने की क्षमता भी जोड़ा।

इस कोड को शायद सबसे अच्छा प्रदर्शन नहीं है या लिखित सुंदर है, लेकिन यह किसी भी ध्यान देने प्रदर्शन प्रभावों :)

10

प्रारूपित स्थानीय स्ट्रिंग उदाहरण:

NSString *today = [MyHandWatch today]; 
NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"Today is %@", @""), today]; 

genstrings अपने Localizable.strings फ़ाइल में इस लाइन उत्पन्न करेगा:

"Today is %@" = "Today is %@"; 
+0

यह बस काम नहीं करता है, यह returnes एक ही स्ट्रिंग – user2159978

+0

@ user2159978 किया आप वास्तव में सिर्फ अंतिम पंक्ति की प्रतिलिपि बनाते हैं? कोर्स का यह एक ही स्ट्रिंग वापस कर देगा ... –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^