在 Qt 中,字符串拼接与国际化(即字符串的翻译)是有一些复杂的关系的。尤其当你想把拼接的字符串进行翻译时,通常的 `tr()` 方法可能无法直接奏效,因为 `lupdate` 工具(用于提取可翻译字符串)可能不会正确解析动态拼接的字符串。这就需要一些特定的方法来处理这种情况。
我们需要尽量避免在可翻译字符串中使用运行时字符串拼接。应当尽可能在翻译文件中拼接完整的句子,以便翻译者能够看到整个上下文。例如下面的例子
// 不推荐:这是我们常用的运行时拼接字符串的习惯
QString result = m_strDay + tr("Day") + m_strMonth + tr("Month") + m_strYear + tr("Year");
// 推荐:使用参数化的翻译字符串
QString result = tr("%1Day%2Month%3Year").arg(m_strDay).arg(m_strMonth).arg(m_strYear);
当确实需要动态拼接字符串时,最好使用 `QString::arg()` 方法。这样做的好处是,可以保持原始字符串的完整性,而不是将其分割成多个部分,这对翻译工具友好很多。例如:
在例子中,`%1`、`%2` 和 `%3` 是占位符,将在运行时被 `arg()` 方法替换。这种格式的字符串更容易被 `lupdate` 正确识别和提取。
需要确保使用 `tr()` 方法的类继承自 `QObject`,且正确使用 `Q_OBJECT` 宏,以便 `lupdate` 工具可以提取出需要翻译的字符串。