2017-02-25 122 views
1

我有一个字符串扩展,可以帮助我国际化。如何正确使用VarArgs进行字符串本地化?

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代替(雨燕相当于va_list 在C):

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 
     } 
    } 
} 

由于NSString.localizedStringWithFormat已经无变量采取 VAListPointer ,则使用与当前语言环境等效的NSString(format:, locale:, arguments:)

更简单(归属去@OOPer):使用 String.init(format:locale:arguments:),这需要 [CVarArg]说法:

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

现在

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

应按预期,假设字符串文件包含 该条目

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

你可以在不使用'withVaList'的情况下调用'String.init(format:locale:arguments:)'。 – OOPer

+0

@OOPer:你说得对,这很简单,因为它需要一个'[CVarArg]'参数,我错过了! –

相关问题