if trGettext() gets called with a *text that resides
in the stack, the QHash will return incorrect values after
the second call of trGettext() with that *text.
Example (assuming nothing has been translated):
void func(const char *text) {
char *translated = trGettext(text);
doSomethingWith(translated);
}
func("foo"); (1)
func("bar"); (2)
(1) *translated is "foo"
(2) *translated should be "bar" but is "foo" because
the key (const char*) points to the value "foo"
which has been set in the previous call (1).
Signed-off-by: Maximilian Güntner <maximilian.guentner@gmail.com>
28 lines
548 B
C++
28 lines
548 B
C++
#include <QCoreApplication>
|
|
#include <QString>
|
|
#include <gettextfromc.h>
|
|
|
|
const char *gettextFromC::trGettext(const char *text)
|
|
{
|
|
QByteArray &result = translationCache[QByteArray(text)];
|
|
if (result.isEmpty())
|
|
result = tr(text).toUtf8();
|
|
return result.constData();
|
|
}
|
|
|
|
void gettextFromC::reset(void)
|
|
{
|
|
translationCache.clear();
|
|
}
|
|
|
|
gettextFromC* gettextFromC::instance()
|
|
{
|
|
static gettextFromC *self = new gettextFromC();
|
|
return self;
|
|
}
|
|
|
|
extern "C" const char *trGettext(const char *text)
|
|
{
|
|
return gettextFromC::instance()->trGettext(text);
|
|
}
|