2017-02-25 1 views
1

국제화에 도움이되는 String 확장자가 있습니다.문자열 지역화에 VarArg를 올바르게 사용하는 방법은 무엇입니까?

public extension String { 
    var localized: String { 
     return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") 
    } 

    func localized(args:CVarArg...) -> String{ 
     return NSString.localizedStringWithFormat(self.localized as NSString, args) as String 
    } 
} 

"hello_world".localized를 어디서나 쉽게 사용할 수 있으며 잘 작동합니다.

이제 동일한 기능을 원하지만 인수를 전달할 수 있기를 원합니다. 그러나 'CVarArg ...'전달하면 예상대로 작동하지 않는 것 같습니다.

"grant_gps_access".localized("MyApp")

예상 결과 :

실제 결과 "MyApp를 GPS에 대한 액세스 권한을 부여하십시오""부여하십시오 (\ n MyApp를 \ n)를 GPS 접근"

을 나는 무엇이다 여기 없습니까?

+0

http://stackoverflow.com/a/27914308/2303865 –

답변

4

당신은 당신 대신 CVaListPointer을 통과해야, 다른 함수에 변수 인수 목록을 전달할 수 없습니다 (C에서 va_list의 동등한 스위프트) : NSString.localizedStringWithFormat 이후

public extension String { 
    var localized: String { 
     return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") 
    } 

    func localized(args: CVarArg...) -> String { 
     return withVaList(args) { 
      NSString(format: self.localized, locale: Locale.current, arguments: $0) as String 
     } 
    } 
} 

어떤 변종은 VAListPointer을 복용하지 않았다 현재 로캘을 사용하는 NSString(format:, locale:, arguments:) 등가가 사용됩니다.

(속성이 @OOPer로 이동)도 간단을 : 예상대로 문자열 파일에 포함 된 가정,

func localized(args: CVarArg...) -> String { 
     return String(format: self.localized, locale: Locale.current, arguments: args) 
    } 

이제

"grant_gps_access".localized(args: "MyApp") 

작동합니다하십시오 [CVarArg] 인자를 String.init(format:locale:arguments:) 사용 항목

"grant_gps_access" = "Please grant %@ GPS access"; 
+0

'withVaList'를 사용하지 않고'String.init (format : locale : arguments :)'를 호출 할 수 있습니다. – OOPer

+0

@OOPer : 맞습니다.'[CVarArg]'인수가 필요하기 때문에 더 간단합니다. 나는 그것을 놓쳤습니다! –

관련 문제