我想翻译一个字符串,里面有两个变量。 目前,我用它来翻译这段代码:
NSLocalizedString("Name_In_Langauge_String_File",comment:"")
但我怎样才能翻译以下字符串?
这是对100张图片和50位用户的测试
其中100和50是变量。
答案 0 :(得分:2)
把它放在你Localizable.strings:
"Name_In_Langauge_String_File" = "This is a test with %d Pictures and %d Users";
并在您的代码中:
String.localizedStringWithFormat(
NSLocalizedString("Name_In_Langauge_String_File",
comment: ""),
pictures,
users)
答案 1 :(得分:0)
在我正在研究的项目中,我注意到我们不断重复代码来为本地化文件执行字符串格式化。这意味着您不能只使用该值,首先需要检查所需的参数。避免此问题的一种方法是使用Swift枚举。此方法对单元测试本地化也很有用。
假设您的字符串文件中有以下3个本地化:
"TestNoParams" = "This is a test message";
"TestOneParam" = "Hello %@";
"TestTwoParams" = "This is a test with %d Pictures and %d Users";
现在您可以使用以下枚举,协议和扩展来引用您的字符串:
protocol LocalizationProtocol {
var key: String { get }
var value: String { get }
}
extension LocalizationProtocol {
private func localizationValue() -> String {
return NSLocalizedString(key, comment:key)
}
private func localizationValueWithFormat(parameters: CVarArgType...) -> String {
return String(format: localizationValue(), arguments: parameters)
}
}
enum Localizations: LocalizationProtocol {
case TestNoParams
case TestOneParam(name: String)
case TestPicturesAndUsers(pictures: Int, users: Int)
var key: String {
switch self {
case .TestNoParams: return "TestNoParams"
case .TestOneParam: return "TestOneParam"
case .TestPicturesAndUsers: return "TestTwoParams"
}
}
var value: String {
switch self {
case .TestOneParam(let name):
return localizationValueWithFormat(name)
case .TestPicturesAndUsers(let pictures, let users):
return localizationValueWithFormat(pictures, users)
default:
return localizationValue()
}
}
}
现在使用它你只需要调用枚举值方法:
let testNoParam = Localizations.TestNoParams.value
let testOneParam = Localizations.TestOneParam(name: "users name").value
let testTwoParams = Localizations.TestPicturesAndUsers(pictures: 4, users: 500).value
我展示的示例已经过简化,但您也可以嵌套枚举,为本地化提供一个很好的分组。例如,您可以将您的枚举嵌套在ViewController中。这是欢迎消息的示例:Localizations.Main.WelcomeMessage.value