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?
Répondre
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.
Merci pour cette suggestion. Cela signifie qu'il n'est pas possible de modifier les chaînes d'interface utilisateur à la volée. – boom
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. –
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 リ ス の 愛.
C'est ce que je voulais dire par "changer manuellement toutes les chaînes de leurs équivalents traduits." – ptomato
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. –
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
- 1. Java Format Date Texte Aide Localisée pour l'interface utilisateur
- 2. Comment faire pour modifier la langue de message d'exception Visual Studio en anglais pendant le débogage
- 3. Comment tester la chaîne localisée sur le simulateur?
- 4. personnalisé, manipuler la zone de texte (comment modifier son apparence)
- 5. Comment sauvegarder le moteur de base de données H2 intégré pendant son exécution?
- 6. Comment changer la langue de l'interface utilisateur sur Padre?
- 7. Comment charger la plume localisée?
- 8. Comment obtenir le STDOUT d'un appel système ruby () pendant son exécution?
- 9. Obtenir le nom de la langue localisée à partir du code de paramètres régionaux
- 10. Modifier la langue de la légende LaTeX
- 11. GTK + test d'interface utilisateur
- 12. iphone n'actualise pas l'icône localisée après avoir changé le réglage de la langue!
- 13. Obtention de limites de texte dans GTK +
- 14. Modifier la hauteur de l'audio pendant la lecture sur l'iPhone
- 15. Blocage de l'interface utilisateur pendant le téléchargement de l'image
- 16. Contrôle utilisateur dans .Net pendant le développement
- 17. Exécution d'AppEngine localement (pendant le débogage), comment effacer les données?
- 18. PHP GTK sur comment utiliser
- 19. GTK: Modifier la couleur bg d'un coches
- 20. iPhone Vibrate Pendant la lecture du son
- 21. Modifier la tête de page dans le contrôle utilisateur
- 22. Version localisée de MFMailComposeViewController
- 23. Modifier texte sur le bouton de retour dans l'iPhone SDK
- 24. Effet incandescent sur la zone de texte pendant l'activité
- 25. Modifier la langue du site Web
- 26. Modifier le texte sur un onglet Android
- 27. Modification de la langue de l'interface utilisateur à la volée
- 28. Comment empêcher un utilisateur de modifier d'autres profils que son propre contenu dans l'application Web MVC.NET?
- 29. Comment modifier l'élément sélectionné dans une liste déroulante basée sur la saisie d'un utilisateur dans une zone de texte?
- 30. Comment modifier le texte raphael?
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. –
Cette question n'a aucun sens. Que voulez-vous dire par «langage de l'interface utilisateur»? – Omnifarious
@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