2011-04-09 29 views
9

如果我們在tr()中包裝字符串,我們可以使用語言學家翻譯qt應用程序。下面的例子是動態加載語言的一種方式:動態Qt字符串轉換

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 

    QTranslator translator; 
    translator.load("hellotr_la"); 
    app.installTranslator(&translator); 

    QPushButton hello(QPushButton::tr("Hello world!")); 
    hello.resize(100, 30); 
    hello.show(); 

    return app.exec(); 
} 

我想要做的是根據用戶偏好來轉換不同的語言。原因是我有一臺服務器需要處理具有不同語言的客戶端請求。讓整個服務器/進程通過每個請求事件改變語言並不合適。因此,我對dynamic translation對的反應不感興趣。我感興趣從而

有一件事是QCoreApplication::installTranslator()

多個翻譯文件,可以安裝下列文件。翻譯按照與其安裝順序相反的順序進行搜索,因此最近安裝的翻譯文件將首先被搜索,並且最後搜索安裝的第一個翻譯文件。只要找到包含匹配字符串的翻譯,搜索就會停止。

因此,似乎可以裝載多國語言,但後來我擔心的是,如果我有多個語言,我不能指定哪一個會是首選的語言。如果我有代碼來表達我想是這樣的:

QString MyApplicationServer::OnHandleRequest(MyRequest &r) 
{ 
    //Get the language for this specific request 
    //For example language can be 「hellotr_la」 or 「hellotr_fr」 
    // Or another way: "lat", "fra", "enu", "esn" ... 
    QString language = getLanguageForRequest(r); 

    //How do I dynamically use language or translate to language? 
    // This would be the preferred solution. 
    return tr("Not Implemented", language); 
} 

如果我必須使用一些自定義宏的,那麼它微塵是!

編輯:基本上我想從翻譯者那裏得到一個特定的翻譯字符串。

+0

處理語言更改事件有什麼問題? – 2011-04-09 15:31:53

+0

這是處理多個請求的服務器進程。如果我真的想強迫一個藉口,我可以說我正在使用多個線程;)。從技術上講,當只需要翻譯一段字符串時,通過所有對象傳播一個QEvent似乎是一種矯枉過正的行爲。想象一下,如果我想在'OnHandleRequest'中將兩個字符串翻譯成兩種不同的語言 – 2011-04-09 15:40:41

回答

7

您不必使用提供的tr便利功能,也不必安裝翻譯器。只要看看QTranslator的API,你就會發現你可以直接撥打translate。如果你走這條路線,你可以簡單地有一個可用的翻譯地圖,並根據需要查找文本。

如果您必須使用tr那麼您必須構建自定義翻譯器。然後,您的自定義翻譯器可以維護翻譯器的映射並使用請求變量來確定使用哪一個。 如果你的服務器一次只處理一個請求,那麼表示當前語言的一個簡單的全局變量就可以。

現在,如果你的服務器在線程中處理多個請求,你有更多的工作要做,但不是太多。在這種情況下,您會將語言首選項存儲在本地線程中,並且安裝的轉換程序將使用本地線程來確定要執行的後備轉換程序。