В GTK, как я могу изменить текст локализованного языка в пользовательском интерфейсе во время его работы? - PullRequest
3 голосов
/ 15 октября 2010

В Linux возможно ли изменить язык интерфейса на лету, созданный с помощью GTK? У меня есть приложение, которое должно менять язык интерфейса на лету.

Ответы [ 4 ]

1 голос
/ 12 марта 2013

Это, конечно, возможно, вам просто нужно немного поработать.

Например, если вы используете c #, вам сначала нужно убедиться, что все переводимые элементы включены в функцию Mono.Unix.Catalog.GetString. Типичный ярлык будет выглядеть так:

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

Когда вы сделаете это, если у вас есть правильный файл перевода (.po файлы), у вас будет запуск приложения в текущей локали. Теперь, если вы хотите изменить локаль из приложения, вам просто нужна функция, которая делает это:

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");
}

Теперь ваше приложение должно измениться, чтобы на ваших ярлыках отображались 猿 ジ ュ ー ス и リ ス の 愛.

1 голос
/ 22 декабря 2014

Я изменил язык на лету, выполнив следующие действия:

  1. Создайте файл .po, содержащий пары ключ-значение для переводов:

    Msgstr "Да" msgstr "Ja"
  2. Используйте msgfmt для получения файла .mo, который необходимо переместить в соответствующую папку LC_MESSAGES локали (например, /usr/share/locale/de/LC_MESSAGES):

    msgfmt myapp.po - o myapp.mo

  3. Привязать этот файл к приложению:

    #define ENABLE_NLS
    
    #ifdef ENABLE_NLS
    
    
        #include <libintl.h>
                #include <locale.h>
                #define PACKAGE_LOCALE_DIR "/usr/share/locale"
    
                // "myapp" is the mo file name in LOCALE
                #define GETTEXT_PACKAGE    "myapp"
    
                #  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. Всякий раз, когда необходимо изменить язык, вызовите эти методы:

    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. Установите текст меток с помощью msgids в файле .po:

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

    Например,

    gtk_label_set_text(GTK_LABEL(widget),str);
    

НТН

1 голос
/ 15 октября 2010

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

Многие приложения предпочитают не предлагать настройки для языка пользовательского интерфейса внутри приложения.Вместо этого они просто следуют настройкам языка системы.

0 голосов
/ 16 марта 2019

Вы можете использовать NAppGUI, который поддерживает переводы во время выполнения в Windows (WinAPI), macOS (Какао) и Linux (Gtk).

http://nappgui.com/es/demo/products.html#h4.5

...