11

मेरे पास एक जिम्मेदार स्ट्रिंग वाला UILabel है।जिम्मेदार स्ट्रिंग का अनुवाद

enter image description here

अब, मैं इस अंग्रेजी और इतालवी के लिए स्ट्रिंग जिम्मेदार ठहराया अनुवाद करने के लिए है: यहाँ इसके बारे में एक printscreen है। मैं ऐसा करने का एक तरीका खोज रहा हूं। क्या मैं इस भागित स्ट्रिंग को भाग भाग में भाग भाग में बना सकता हूं? मुझे केवल एक समाधान मिला है जहां पूरी स्ट्रिंग सेट की गई है और फिर गुण श्रेणी के अनुसार सेट किए गए हैं। लेकिन जब मैं स्ट्रिंग का अनुवाद करता हूं, तो मुझे अब सीमा नहीं पता है, क्योंकि शब्द लंबे या छोटे होते हैं।

+0

NSAttributedString विधि का उपयोग करने का प्रयास करें 'enumerateAttributesInRange: विकल्प: ब्लैक का उपयोग: '। यह प्रत्येक विशेषता को इसकी सीमा के साथ देता है। आप उस श्रेणी भाग से स्ट्रिंग को भाग से निकाल सकते हैं और इसका अनुवाद कर सकते हैं। – ZeMoon

उत्तर

6

एक अन्य विकल्प है जहाँ से NSAttributedStrings बनाने के लिए .rtf स्थानीय फ़ाइलों को बनाने के लिए है:

NSAttributedString *attributedStr = [[NSAttributedString alloc] initWithData:data options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil error:nil]; 

गतिशील स्वरूपण का उपयोग करने के (जैसे सेट रंग, कुछ एप्लिकेशन सेटिंग के लिए विशिष्ट फोंट), मैं उपयोग कर रहा हूँ कुछ एचटीएमएल जैसी स्वरूपण, 1-चार टैग के साथ जिसके बाद मैं ऐप के अंदर से प्रारूप को लागू करता हूं।

// NSMutableAttributedString category method 
/** 
* Updates the attributes of xml elements (where the xml tags are formed of 1 single char) with the passed attributes from param `tagsAttributes` 
* Current version doesn't support recursive tags (tags in tags) 
* All tags of form '<char>' or '</char>' will be used as formatting (the resulting string should not be expected to have any tags of this form) 
* @param tagsAttributes - list of attribute dictionaries, where the key is the tag name */ 
-(void)formatCharXMLTagsUsingAttributes:(NSDictionary *)tagsAttributes { 
    int strippedLength = 0; 

    NSString *str = [[self string] copy]; 
    NSScanner *scanner = [NSScanner scannerWithString:str]; 
    while (![scanner isAtEnd]) { 
     NSString *tag = nil; 
     do { 
      [scanner scanUpToString:@"<" intoString:nil]; 
      [scanner scanString:@"<" intoString:nil]; 
      if (scanner.scanLocation + 2 < [str length] && [str characterAtIndex:scanner.scanLocation + 1] == '>') { 
       [scanner scanUpToString:@">" intoString:&tag]; 
       [scanner scanString:@">" intoString:nil]; 
      } 
     } while (!tag && ![scanner isAtEnd]); 

     if ([scanner isAtEnd]) { 
      break; 
     } 

     NSString *endTag = [NSString stringWithFormat:@"</%@>", tag]; 
     NSString *tmpString; 
     [scanner scanUpToString:endTag intoString:&tmpString]; 
     [scanner scanString:endTag intoString:nil]; 
     NSRange range; 
     strippedLength += 7; // start tag + end tag length 
     range.location = scanner.scanLocation - [tmpString length] - strippedLength; 
     range.length = [tmpString length] + 7; 
     [self replaceCharactersInRange:range withString:tmpString]; 
     range.length -= 7; 
     [self addAttributes:tagsAttributes[tag] range:range]; 
    } 
} 

विधि बाद में इस तरह इस्तेमाल किया जा सकता:

NSDictionary* highlightAttributes = @{NSForegroundColorAttributeName: [UIColor blueColor], 
           NSFontAttributeName: [UIFont boldSystemFontOfSize:16]}; 
NSDictionary *xmlTagsAttributes = @{@"b": highlightAttributes}; 
[attrStr formatCharXMLTagsUsingAttributes:xmlTagsAttributes]; 

attrStr कहाँ @"Press <b>Next</b> button to ..." हो सकता है।

0

मैं स्ट्रिंग के अलग-अलग हिस्सों का अनुवाद करके इसे हल कर दूंगा। यह इस मामले में काम करेगा क्योंकि आपकी जिम्मेदार स्ट्रिंग वास्तव में चार तारों का एक समेकित संस्करण है।

लेकिन सुनिश्चित करें कि आप उस प्रारूप को सहेजते हैं जहां आप संख्याओं का उपयोग करते हैं। कुछ भाषा में पाठ "3   Erweiterung" हो सकता है। आप NSLocalizedStringWithDefaultValue का उपयोग कर ऐसा कर सकते हैं।

NSString *stepFormat = NSLocalizedStringWithDefaultValue(@"AttributedStringStepFormat", @"main", [NSBundle mainBundle], @"Step %ld", @"'Step 4' in 'Step 4 - Erweiterung 3 - erhalten\ndauerhaft'"); 
NSString *step = [NSString stringWithFormat:stepFormat, (long)4]; 

NSString *erweiterungFormat = NSLocalizedStringWithDefaultValue(@"AttributedStringErweiterungFormat", @"main", [NSBundle mainBundle], @"Erweiterung %ld", @"'Erweiterung 3' in 'Step 4 - Erweiterung 3 - erhalten\ndauerhaft'"); 
NSString *erweiterung = [NSString stringWithFormat:erweiterungFormat, (long)3]; 

NSString *erhalten = NSLocalizedStringWithDefaultValue(@"AttributedStringErhalten", @"main", [NSBundle mainBundle], @"erhalten", @"'erhalten' in 'Step 4 - Erweiterung 3 - erhalten\ndauerhaft'"); 
NSString *dauerhaft = NSLocalizedStringWithDefaultValue(@"AttributedStringDauerhaft", @"main", [NSBundle mainBundle], @"dauerhaft", @"'dauerhaft' in 'Step 4 - Erweiterung 3 - erhalten\ndauerhaft'"); 

NSString *result = [NSString stringWithFormat:@"%@ - %@ - %@\n%@", step, erweiterung, erhalten, dauerhaft]; 

NSRange stepRange = [result rangeOfString:step]; 
NSRange erweiterungRange = [result rangeOfString:erweiterung]; 
NSRange erhaltenRange = [result rangeOfString:erhalten]; 
NSRange dauerhaftRange = [result rangeOfString:dauerhaft]; 

// Create attributed string 

इस तरह आप एक अच्छा तार मिल फ़ाइल का अनुवाद करने में उपयोग कर सकते हैं:

/* 'dauerhaft' in 'Step 4 - Erweiterung 3 - erhalten\ndauerhaft' */ 
"AttributedStringDauerhaft" = "dauerhaft"; 

/* 'erhalten' in 'Step 4 - Erweiterung 3 - erhalten\ndauerhaft' */ 
"AttributedStringErhalten" = "erhalten"; 

/* 'Erweiterung 3' in 'Step 4 - Erweiterung 3 - erhalten\ndauerhaft' */ 
"AttributedStringErweiterungFormat" = "Erweiterung %ld"; 

/* 'Step 4' in 'Step 4 - Erweiterung 3 - erhalten\ndauerhaft' */ 
"AttributedStringStepFormat" = "Step %ld"; 
+0

मुझे नहीं लगता कि यह अरबी के लिए काम करता है, हालांकि। – OlivaresF

+1

जब स्थानीयकरण की बात आती है तो अरबी के लिए क्या काम करता है? :) – Lope

+1

@ लोप सब कुछ स्थानीयकरण के साथ काम करता है, अगर आपको पता है कि यह कैसे करना है। :) स्टार्टर के लिए: https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/SupportingRight-To-LeftLanguages/SupportingRight-To-LeftLanguages.html – Manuel

2

कुछ इस पद्धति की तरह काम कर सकता था। यह एक NSAttributedString लेता है, उनके गुणों के आधार पर भागों को निष्कर्ष निकालता है, प्रत्येक भाग का अनुवाद करता है, वही गुण लागू करता है और अंततः पूर्ण अनुवादित विशेषता स्ट्रिंग देता है।

-(NSAttributedString*)translateAttribString:(NSAttributedString*)attribString toLanguage:(NSString*)language 
{ 
    NSMutableAttributedString *returnString = [[NSMutableAttributedString alloc]init]; 

    NSRange totalRange = NSMakeRange (0, attribString.length); 

    [attribString enumerateAttributesInRange: totalRange options: 0 usingBlock: ^(NSDictionary *attributes, NSRange range, BOOL *stop) 
    { 
     NSLog (@"range: %@ attributes: %@", NSStringFromRange(range), attributes); 

     NSString *string = [[attribString string] substringWithRange:range]; 

     NSLog(@"string at range %@", string); 

     //Translate 'string' based on 'language' here. 

     NSString *trans; //This will hold the translated string. 

     NSAttributedString *translatedString = [[NSAttributedString alloc]initWithString:trans attributes:attributes]; 

     [returnString appendAttributedString:translatedString]; 

    }]; 

    return returnString; 
} 
0

मैं आमतौर पर हाइलाइट किए गए हिस्सों को अलग से अनुवाद करता हूं और मूल टेक्स्ट में अद्वितीय प्लेसहोल्डर्स जोड़ता हूं जो ढूंढना और प्रतिस्थापित करना आसान है। के लिए

उदाहरण: "यह शब्द बोल्ड है"

localized.strings में यह हो जाएगा
"BaseText" = "यह -Word- बोल्ड है";
"हाइलाइट किया गया टेक्स्ट" = "शब्द";

अब हम "BaseText" कुंजी के साथ मूल स्ट्रिंग ले जा सकते हैं और:
1. "-Word-" सबस्ट्रिंग
2. की सीमा का पता लगाएं "HighlightedText" कुंजी के साथ स्थानीय तार के साथ यह बदलें।
3. मूल प्लेसहोल्डर की सीमा का उपयोग करके, मूल प्लेसहोल्डर की लंबाई और अनुवाद की लंबाई आप आसानी से नई सीमा की गणना कर सकते हैं और इसमें विशिष्ट विशेषताओं को लागू कर सकते हैं।

यह दृष्टिकोण concatenation से अधिक लचीला है और अनुवाद में शब्दों के क्रम पर निर्भर नहीं है।

यह इसके लिए एक विस्तार है:

extension NSMutableAttributedString { 
    func replacePlaceholder(_ placeholder: String, with translation: String, attributes: [String: Any]) { 

     // find the placeholder 
     var range = (string as NSString).range(of: placeholder) 

     // nothing to replace 
     if range.location == NSNotFound { 
      return 
     } 

     // replace it with the translation 
     mutableString.replaceCharacters(in: range, with: translation) 

     // adjust range according to changes 
     range.length = range.length + translation.length - placeholder.length 

     // apply attributes 
     self.setAttributes(attributes, range: range) 
    } 
} 

आप कई प्लेसहोल्डर एक के बाद एक जगह ले सकता है अगर जरूरत है।

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