Как записать исходную строку QObject :: tr и по-прежнему отображать в GUI перевод?

В моем проекте мы хотим перевести пользовательский интерфейс, но вести технические журналы на английском языке. Я согласен, что эти два вида сообщений должны оставаться разделенными, но иногда у нас есть некоторые сообщения об ошибках, которые мы хотим отображать и регистрировать одновременно.
С помощью QObject :: тр Вы получаете переведенную строку и не можете получить исходную строку.

Как я мог управлять журнал оригинальной версии + отображение переведенной версии без копирования / вставки?
Я открыт для любых предложений, включая ограничения дизайна.

2

Решение

Я решил эту проблему в одном из своих собственных проектов, введя специальный вспомогательный класс, содержащий как исходную, так и переведенную строку. Вот примерный набросок того, как это выглядит:

class LocalizedString
{
public:
LocalizedString(const char * str) :
m_originalString(str),
m_localizedString(tr(str))
{}

const char * originalString() const { return m_originalString; }
const QString & localizedString() const { return m_localizedString; }

private:
const char *     m_originalString;
QString          m_localizedString;
}

Тогда код, использующий этот класс, работает так:

// In one place within the code:
LocalizedString errorDescription = QT_TR_NOOP("Some message which should go both to the log and to the user");
qDebug() << errorDescription.originalString();
<...>
// In some other place within the code which gets errorDescription variable from somewhere and needs to show it to the user
showErrorMessage(errorDescription.localizedString());

Основной частью в рамках подхода является использование QT_TR_NOOP макро. Он помечает вложенный в него строковый литерал как тот, который требует извлечения во время qmake шаг для в дальнейшем перевод. В отличие от QObject::trэтот макрос не преобразует непереведенный текст в переведенный. Если вы хотите получить доступ к переведенному тексту, вам нужно позвонить tr позже вручную — как я делал в приведенном выше примере в конструкторе LocalizedString,

Обратите внимание, что QT_TR_NOOP предназначен для использования в классах, то есть контекст для перевода будет именем класса внутри некоторого метода, в котором присутствует макрос. Если у вас есть автономные функции или вы хотите сами указать контекст, используйте QT_TRANSLATE_NOOP макрос вместо этого — его вторым аргументом является контекст перевода.

Upd .: еще один совет: в моей реальной реализации LocalizedString она имеет operator<< который печатает оригинальную нелокализованную строку. Это удобно, потому что таким образом вы можете просто передать объект LocalizedString класс для QDebug не называя его originalString метод.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]