2009-09-28 7 views
3

Je travaille sur la traduction de notre Qt gui pour le moment.Qt tr ne semble pas fonctionner sur les membres constants statiques?

J'ai le code suivant:

Cela ne semble pas fonctionner bien. En d'autres termes, il n'y a aucune entrée dans le fichier .ts pour la constante ci-dessus.

Si je fais cela, alors cela fonctionne:

// another cpp file 
editMenu->addAction(tr("foo")); 

Cependant, cette constante est utilisée dans de nombreux endroits, et je ne veux pas avoir à mettre à jour manuellement chaque chaîne littérale. (Si cela devait changer à l'avenir)

Quelqu'un peut-il aider?

+0

Pourquoi ne pas utiliser une définition: #define Foo tr ("foo") –

+0

@Patrice: Parce que cela causerait plus de problèmes que de valeur. – rpg

+0

Je n'ai pas beaucoup utilisé, mais pourquoi ne pas faire: const QString FooConstants :: Foo = QObject :: tr ("foo"); – Bill

Répondre

8

Enveloppez votre littéral dans la QT_TR_NOOP macro:

// cpp file 
const QString FooConstants::Foo = QT_TR_NOOP("foo"); 
0
editMenu->addAction(tr(FooConstants::Foo)); 

Je pense que votre problème est que tr prend un argument char *, pas QString:

QString QObject::tr (const char * sourceText, const char * disambiguation = 0, int n = -1) 

Vous pouvez changer la type de FooConstants :: Foo, ou le convertir en un caractère * lorsque vous créez l'action de menu, par exemple:

const QByteArray byteArray = FooConstants::Foo.toLatin1(); 
char *data = byteArray.data(); 
editMenu->addAction(tr(data)); 
2

Comme Thomas l'a mentionné, vous devez utiliser une macro.

La raison en est que Qt ne sait pas quelles chaînes traduire par défaut, il analyse les fichiers et recherche un ensemble de modèles. L'un d'entre eux est tr("text"), mais si vous voulez utiliser une constante, vous devrez le marquer explicitement avec QT_TRANSLATE_NOOP ou QT_TR_NOOP lorsqu'il est défini.

Questions connexes