Localized Strings Tips
This year I started using SwiftLint to improve the quality of my swift source code.
The most frequent warning I receive from this tool is the line_length one: 'Line Length Violation: Line should be 120 characters or less'
As many of those warnings where on lines using the NSLocalizedString macro, I had to think about how to improve my way of internationalizing applications.
I used to call the localization macro directly where it was needed, like
playButton.setTitle(NSLocalizedString("PLAY_BUTTON", comment: "Play button"), for: .normal)
which required 91 characters, not counting leading characters for indentation.
Now I create a LocalizedString class with static computed variables.
final class LocalizedString {
static var playButton: String {
return NSLocalizedString("PLAY_BUTTON", comment: "Play button")
}
}
It is used like that:
playButton.setTitle(LocalizedString.playButton, for: .normal)
The instruction in the controller is now 61 characters long, 30 characters less than before. A quick and easy win.
This is also very usefull when the localized string is used as a format:
static func finishedDialogMsg(level: String, duration: String) -> String {
let format = NSLocalizedString("FINISHED_DIALOG_MSG_FORMAT", comment: "You've finished this %@ grid in %@")
return String(format: format, level, duration)
}
Instead of having two lines in the controller, only one is required, which also works against the file_length rule of swiftlint, which states that a file should no be longer than 400 lines.
In the previous example you could even give the duration as a TimeInterval (floating number representing a number of elapsed seconds) and perform the conversion to a string representation of the duration directly into the finishedDialogMsg, same thing when you work with dates.
Other benefits of using a LocalizedString class:
- reduce code duplication when a localized string is used multiple times
- reduce risk of having mispelled a localized string key as all keys are only written once.
By the way, I found the article app-localization-tips-with-swift quite good, but does not help with formats and I think using an enum + a function uses more characters than a static var in a class.