【问题标题】:How to properly use VarArgs for localizing strings?如何正确使用 VarArgs 来本地化字符串?
【发布时间】:2017-02-25 14:47:49
【问题描述】:

我有一个字符串扩展,可以帮助我实现国际化。

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 访问权限”

我在这里错过了什么?

【问题讨论】:

标签: ios swift swift3


【解决方案1】:

你不能将变量参数列表传递给另一个函数,你 必须通过 CVaListPointer 代替(相当于 Swift 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";

【讨论】:

  • 您可以在不使用withVaList的情况下拨打String.init(format:locale:arguments:)
  • @OOPer:你说得对,这更简单,因为它需要一个 [CVarArg] 参数,我错过了!
  • @MartinR 我尝试了您的上述解决方案,但是,我遇到了这篇文章中提到的问题stackoverflow.com/questions/42428504/… 也不允许将 CVaListPointer 传递给参数我得到一个编译器错误。知道解决方法吗?
  • 我刚刚尝试了“更简单”的解决方案,但仍然得到相同的输出(即“请授予 (\n MyApp\n) 访问权限”)。 @Martin R 的初始解决方案是唯一适合我的解决方案。
猜你喜欢
  • 2013-03-17
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-07
  • 2014-10-12
  • 1970-01-01
  • 2013-04-25
相关资源
最近更新 更多