2010-10-15 22 views
2

在Linux中,是否可以更改使用GTK創建的UI語言?我有一個應用程序需要在運行中更改UI語言。在GTK中,如何在UI運行時更改UI上的本地化語言文本?

+0

如果您在詢問特定的GUI工具包,您應該在標題和問題中提及。 「Linux」含糊不清。 – 2010-10-15 06:34:17

+0

這個問題沒有意義。 'UI語言'是什麼意思? – Omnifarious 2010-10-15 06:44:57

+0

@Omnifarious:這就像在第一次啓動應用程序時,出現在UI上的字符串將是英文的,然後如果用戶想在不改變系統語言的情況下更改爲其他語言(比如說阿拉伯語)。 Windows和Mac應用程序都支持這種功能。 – boom 2010-10-15 06:49:01

回答

1

您必須銷燬所有小部件,然後使用新的區域設置重新構建它們,或者手動將所有字符串更改爲其轉換的等效項。最好用gettext來做到這一點。

許多應用程序選擇不提供應用程序內的UI語言設置。相反,他們只是遵循系統語言設置。

+0

感謝您的建議。這意味着無法即時更改UI字符串。 – boom 2010-10-15 10:02:49

+0

不可能在飛行中更改UI字符串不正確。請參閱下面的ptomato回覆和我的示例,以顯示如何執行此操作。 – 2013-03-13 06:06:50

0

這當然是可能的,你只需要做一點工作就可以了。例如,如果您使用的是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"); 
} 

現在,您的應用程序應該改變這樣的標籤會顯示猿ジュース和リスの愛。

+0

這就是我所說的「手動將所有字符串更改爲它們的等價翻譯」。 – ptomato 2013-03-12 17:46:33

+0

是的,這是我懷疑的。問這個問題的人似乎仍然認爲你不能「即時」這樣做,但實際上你提出的方法和我已經展示的示例代碼將完全符合他的要求。 – 2013-03-13 06:06:02

0

我更改動態語言,執行以下步驟:

1)創建一個包含鍵值對的翻譯一個.po文件:

msgid "Yes" 
msgstr "Ja" 

2)爲了使用的msgfmt來得到的.mo文件,該文件必須被移動到correspongin LC_MESSAGES的區域設置(例如,/ usr /共享/區域/ 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" 
     #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)每當語言必須改變,調用這些方法:

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

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)在PO文件中使用msgids設置標籤的文本

- >例如gtk_label_set_text(GTK_LABEL(插件),STR);

HTH