2010-10-15 5 views
2

Sous Linux, est-il possible de changer la langue de l'interface utilisateur à la volée en utilisant GTK? J'ai une application qui a besoin de changer la langue de l'interface utilisateur à la volée.Dans GTK, comment modifier le texte de la langue localisée sur l'interface utilisateur pendant son exécution?

+0

Si vous posez des questions sur une boîte à outils graphique particulière, vous devez le mentionner dans le titre et la question. "Linux" est vague. –

+0

Cette question n'a aucun sens. Que voulez-vous dire par «langage de l'interface utilisateur»? – Omnifarious

+0

@Omnifarious: C'est comme au premier lancement de l'application, les chaînes qui apparaissent sur l'interface utilisateur seront en anglais, puis après si l'utilisateur veut changer de langue (par exemple en arabe) sans changer la langue du système. Ce type de fonctionnalité est pris en charge dans les fenêtres ainsi que l'application Mac. – boom

Répondre

1

Vous devrez soit détruire tous vos widgets et les reconstruire avec le nouveau paramètre de paramètres régionaux, soit modifier manuellement toutes les chaînes en leurs équivalents traduits. Il est préférable de le faire avec gettext.

De nombreuses applications choisissent de ne pas proposer de paramètre pour le langage d'interface utilisateur dans l'application. Au lieu de cela, ils suivent simplement le réglage de la langue du système.

+0

Merci pour cette suggestion. Cela signifie qu'il n'est pas possible de modifier les chaînes d'interface utilisateur à la volée. – boom

+0

Impossible de modifier les chaînes d'interface utilisateur à la volée est incorrect. Veuillez voir la réponse de ptomato et mon exemple ci-dessous pour montrer comment le faire. –

0

C'est certainement possible, il suffit d'y mettre un peu de travail. Par exemple, si vous utilisez C#, vous devez d'abord vous assurer que tous les éléments traduisibles sont inclus dans une fonction Mono.Unix.Catalog.GetString. Une étiquette typique, ressemblerait à ceci:

Gtk.Label label1 = new Gtk.Label(Mono.Unix.Catalog.GetString("Monkey Juice")); 
Gtk.Label label2 = new Gtk.Label(Mono.Unix.Catalog.GetString("Squirrel Love")); 

Lorsque vous faites cela, tant que vous avez le fichier de traduction appropriée (fichiers .po) vous aurez le démarrage de l'application dans les paramètres régionaux en cours. Maintenant, si vous voulez modifier les paramètres régionaux à partir de l'application, il vous suffit d'avoir une fonction qui fait cela:

void ChangeToJapanese() { 
    System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo(" ja_JP"); 
    System.Threading.Thread.CurrentThread.CurrentCulture = ci; 
    label1.Text = Mono.Unix.Catalog.GetString("Monkey Juice"); 
    label2.Text = Mono.Unix.Catalog.GetString("Squirrel Love"); 
} 

Maintenant, votre application doit changer afin que vos étiquettes montreraient 猿 ジ ュ ー ス et リ ス の 愛.

+0

C'est ce que je voulais dire par "changer manuellement toutes les chaînes de leurs équivalents traduits." – ptomato

+0

Oui, c'est ce que je soupçonnais. La personne qui a posé la question semblait toujours penser que vous ne pouviez pas le faire «à la volée», mais en fait, la méthode que vous avez suggérée et dont j'ai montré un exemple de code ferait exactement ce qu'il voulait. –

0

changer la langue à la volée, procédez comme suit:

1) Créer un fichier .po contenant des paires clé-valeur pour les traductions:

msgid "Yes" 
msgstr "Ja" 

2) Utilisez msgfmt pour obtenir un fichier .mo, qui doit être déplacé dans le dossier LC_MESSAGES correspongin des paramètres régionaux (par exemple/usr/share/locale/de/LC_MESSAGES):

msgfmt myapp.po - o myapp.mo 

3) Liez ce fichier à l'application:

#define ENABLE_NLS 

#ifdef ENABLE_NLS 


    #include <libintl.h> 
     #include <locale.h> 
     #define PACKAGE_LOCALE_DIR "/usr/share/locale" 
     #define GETTEXT_PACKAGE "myapp"    // mo file name in LOCALE 

     # undef _ 
     # define _(String) dgettext (GETTEXT_PACKAGE, String) 
     # ifdef gettext_noop 
     # define N_(String) gettext_noop (String) 
     # else 
     # define N_(String) (String) 
     # endif 

#else 
# define textdomain(String) (String) 
# define gettext(String) (String) 
# define dgettext(Domain,Message) (Message) 
# define dcgettext(Domain,Message,Type) (Message) 
# define bindtextdomain(Domain,Directory) (Domain) 
# define _(String) (String) 
# define N_(String) (String) 
#endif 

4) Chaque fois que la langue doit être modifié, appeler ces méthodes:

if(setlocale(LC_ALL, language)==NULL) 
{ 
    printf("--> changeLAnguage: ERROR !!!\r\n"); 
    return false; 
} 

setenv("LANGUAGE", language, true); 
setenv("LANG", language, true); 
setenv("LC_ALL", language, true); 
setenv("LC_MESSAGES", language, true); 
setlocale(LC_ALL, ""); 

5) Définissez le texte des étiquettes en utilisant les msgids dans le fichier po:

SetTextOfLabel("label1", _(MSG_ID_1)); 

-> par exemple gtk_label_set_text (GTK_LABEL (widget), str);

HTH

Questions connexes