Qt的網站推薦將本地化字符串就在這樣的代碼中間:存儲可本地化字符串的習慣Qt方式?
fileMenu = menuBar()->addMenu(tr("&File"));
不過,我應該如何存儲出現在項目中多次串?把它們放在一個單獨的作品,但tr()
呼叫意味着我必須單獨對它們進行初始化:
struct MyLocalizableStrings
{
QString mErrorMessageFileNotFound;
QString mErrorMessageNoCanDoThis;
MyLocalizableStrings() :
mErrorMessageFileNotFound(QObject::tr("File not found.")),
mErrorMessageNoCanDoThis(QObject::tr("Operation is not possible at the moment."))
{}
};
很笨拙,容易陷入困境;我寧願保持聲明和初始化。當然可以將一系列const char*
保存在專用的命名空間中,但是在呼叫站點存在遺漏tr()
的風險 - 整個方法嚴重不標準。
有什麼更好的點子?
只要使用tr(「foo」),只要你需要它。儘管它看起來像代碼重複,但它是最好的方法。在字符串中存儲本地化並不是一個好主意。您的MyLocalizableStrings可防止例如動態語言的變化,除非你添加一個重新翻譯功能...而這裏又變得越來越複雜。所以,只要使用tr(「foo」)就可以了。拼寫錯誤很容易通過語言學家發現。 – Lorenz
http://doc.qt.io/qt-5/i18n-source-translation.html#using-qt-tr-noop-and-qt-translate-noop-in-c – Evgeny
@洛倫茲它比代碼重複更糟糕,這是數據重複。我會在另一個函數中寫一個函數「Operation not possible」,在另一個函數中寫作「此刻不可能的操作」,並且在一年之內,我將無法記住這裏是否存在任何語義差異。更糟糕的是,它可能不是我,而是一個完全不同的人,沒有能力/時間來檢查代碼,將代碼翻譯成語言這樣的語言。最佳實踐存在的原因是:不會複製硬編碼的用戶可讀消息。 – sigil