带有2个变量和不同语言的快速文本

时间:2016-03-15 12:06:57

标签: ios swift

我想翻译一个字符串,里面有两个变量。 目前,我用它来翻译这段代码:

NSLocalizedString("Name_In_Langauge_String_File",comment:"")

但我怎样才能翻译以下字符串?

  

这是对100张图片和50位用户的测试

其中100和50是变量。

2 个答案:

答案 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