2014-03-13 2 views
5

영어 문자열과 텍스트 문자열의 특정 부분에 등 대담한 색상의 요구가있는 가정 :현지화와 함께 속성이 지정된 문자열을 사용하는 방법이 있습니까?

는 "단어 1 word2 WORD3 word4"를 설정하여 수행 할 수 있습니다

적절한 범위의 속성

범위는 (13,5)로 하드 코드 될 수 있지만 물론 지역화 될 수는 없습니다.

이와 달리 범위는 굵은 글씨를 적용해야하는 세 번째 단어가 있음을 알면 동적으로 결정될 수 있습니다.

하지만 지역화 할 수 없습니다. 그 문장이 언어 N로 번역되면 그것은 단지 2 단어만을 포함하거나 5 단어를 언어 M으로 포함한다고 가정 해보십시오.

제 질문은 어떻게 하드 코딩하지 않고도 지역화와 함께 속성 문자열을 사용할 수 있습니까?

+0

해결책은 BBCode 태그와 비슷한 것일 수 있습니다. (저는 현재 그런 식으로 작업하고 있습니다. 그러나 아이디어를 얻습니다.) Markdown 태그 또는 이와 비슷한 것입니다. localizedString에 넣고 AttributedString으로 해석하는 표식입니다. – Larme

답변

2

일부 표기법을 사용하여 굵게 표시 할 단어를 표시 한 다음 굵은 글씨로 표시하고 적절한 특성을 추가하는 변환기를 사용할 수 있습니다.

word •word• word word

이 두 문장에서

מילה מילה •מילה• מילה מילה

, 나는 그 사이에 단어가 굵은해야한다는 의미하는 문자 를 사용합니다. 그런 다음 rangeOfString:options:range:을 사용하여 모든 범위를 굵게 표시하고 이에 따라 특성을 삽입 할 수 있습니다.

NSString *htmlString = NSLocalizedString(key, comment); 

[[NSAttributedString alloc] initWithData: 
    [htmlString dataUsingEncoding:NSUTF8StringEncoding] 
         options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, 
            NSCharacterEncodingDocumentAttribute: @(NSUTF8StringEncoding)} 
       documentAttributes:nil 
          error:nil]] 

(개인적인 취향, 나는이 랩 다음 NSAttributedString

7

내 최신 프로젝트에 데려 갈거야 접근 방식은 생성하기 위해이 같은 것을 사용 후 Localizable.strings 파일에 HTML을 사용하는 것입니다 모두 #define LocalizedHTMLForKey(key)에 올랐다. 잘하면이 답변에 어떤 오타도 추가하지 않았다. ...)

2

나는 Bigg 대답을 사용하여 Swift에서이 작업을 수행 할 수 있도록 확장 프로그램을 만들었습니다.

extension NSAttributedString { 

    convenience init?(withLocalizedHTMLString: String) { 

     guard let stringData = withLocalizedHTMLString.data(using: String.Encoding.utf8) else { 
      return nil 
     } 

     let options: [String : Any] = [ 
      NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType as AnyObject, 
      NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue 
     ] 

     try? self.init(data: stringData, options: options, documentAttributes: nil) 
    } 
} 

HTML 초기화 문자열과 함께이 초기화 코드를 사용하십시오. "By signing up, you agree to our <u><b>Terms & Privacy Policy</b></u>"; 그리고 모든 작업을 처리해야합니다!