I ended up solving this with a combination of storyboard and code, using this answer as a reference.
To start with, the attributed string I used on the storyboard just applied a 1.5 line spacing to the whole string, so it was easier to set the text on code preserving the storyboard's label formatting.
The storyboard contains a UILabel with the text property set as Attributed and a 1.5 line height multiple.
On my view controller code I have a setupUI method and a outlet for that UILabel.
@interface MyClass ()
@property (weak, nonatomic) IBOutlet UILabel *aLabel;
@end
@implementation MyClass
- (void)setupUI {
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.aLabel.attributedText];
[attributedString.mutableString setString:NSLocalizedString(@"This is the label text which should be localisable.", "")];
self.aLabel.attributedText = attributedString;
}
@end
With the above code, the variable attributedString stores all the formatting set on the storyboard, so when I change the attributedString text I don't have to set the formatting again. And, of, course, the label text appears on the Localizable.strings when I execute the "Export for Localizations" command.
This wouldn't work as well if the attributedString had different formatting for its internal substrings. In that case the formatting would have to be set up manually on code (or using rtf files as suggested by the answer posted on the comment by Jelly).