如何使用 Objective C 更改 NSLocalizedString 中部分文本的颜色?

How can I change color of part of the text in a NSLocalizedString with Objective C?

这是我的问题。 我有一个 ViewController,其中有一个带有文本的标签,我想更改该句子中某些单词的颜色。 该字符串是一个 NSLocalizedString ,它是用不同的语言编写的,并根据用户系统语言而变化。

    self.welcomeMessageLabel.text = NSLocalizedString(@"welcome_message", nil);

这就是我想要达到的结果。

如何为部分文本着色?

NSLocalizedString(@"welcome_message", nil) returns一个NSString.

澄清一下,它只是一组“字符”,没有bold/colors、斜体、偏移量等概念

并且要显示具有不同渲染(颜色、粗体等)的不同字符,您需要使用 NSAttributedString

因为只是一组字符,你需要找到哪些元素需要有不同的渲染。为此,您可以使用标签,例如 HTML、Markdown、BBCode 标签。

部分示例,我将仅以粗体显示简化聚焦:

//Initial text
...un link all'indirizzo...
// With BBCode tag
...un [b]link[/b] all'indirizzo...
// With HTML tag
...un <b>link</b> all'indirizzo...
// With Markdown tag
...un **link** all'indirizzo...
// With custom tag
...un {link} all'indirizzo...

将该新值放入您的字符串文件中。

如果您使用 HTML,则有一个内置的初始化方法。
参见相关问题:Convert HTML to NSAttributedString in iOS

其他的可以使用第三方库解析器,也可以自己解析。您可以使用 NSRegularExpressionNSScanner 等...,然后将目标效果应用到正确的范围。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _welcomeMessageLabel.attributedText = [self attributedString1];
}


- (NSAttributedString *)attributedString1 {
    NSString *string = @"Ti abbiamo inviato un link all'inndirizzo email che";
    NSString *substring1 = @"link";
    NSString *substring2 = @"email";
    
//    NSString *string = NSLocalizedString(@"welcome_message", nil);
//    NSString *substring1 = NSLocalizedString(@"welcome_message_substring1", nil);
//    NSString *substring2 = NSLocalizedString(@"welcome_message_substring2", nil);


    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString: string];
    NSDictionary *attributes = @{NSForegroundColorAttributeName: [UIColor orangeColor]};
    
    [attributedString
     replaceCharactersInRange:[string rangeOfString:substring1]
     withAttributedString:[[NSAttributedString alloc] initWithString: substring1 attributes:attributes]
     ];
    
    [attributedString
     replaceCharactersInRange:[string rangeOfString:substring2]
     withAttributedString:[[NSAttributedString alloc] initWithString: substring2 attributes:attributes]
     ];
    
    return  attributedString;
}

@end