Closed uranusjr closed 11 years ago
Arch Linux 上好像已經可以正確顯示中文了,直接在 source tree 裡面執行,或是我把他放到
/usr/bin/Qelly -> ../lib/Qelly/Qelly
/usr/lib/Qelly/Qelly
/usr/lib/Qelly/Qelly_zh_tw.qm
都可以正常顯示。
可是我在 Fedora 上測試仍然不行,locale 是 zh_TW.UTF-8 或是 zh_TW.utf8(我想這兩種應該相同)。我用 qDebug() 在 src/main.cpp 簡單的測試了一下:
trans.load() = false
QLocale::system() = QVariant(QLocale, )
QLocale::system().name() = "zh_TW"
這樣測會比較快
#include <QDebug>
// … 中略
qDebug() << QLocale::system().uiLanguages();
因為 QTranslator::load
是看這個值。QLocale::name
是視你使用的度量衡和時間格式而定, 那個不準 (以 Linux 來講就是 LANG
和 LC_
開頭環境變數的差別)。
出現 ("zh_TW.UTF-8") ,不論是 LANG / LC_ALL 是設定成 zh_TW.UTF-8 還是 zh_TW.utf8,即使我改 zh_TW.big5 也是一樣。
我想我知道問題了。根據源碼, zhTW.UTF-8 的比對是 (Filename = "Qelly", prefix = "", suffix 預設 ".qm", case insensitive)
當然找不到。Arch 的 locale 應該 (和 Windows/OS X 一樣) 是 zh_TW 所以沒問題。
根據這個搜尋規則, 最佳解應該是直接加一個翻譯檔 orz。我想 1. 應該是最合理的, 如果確實沒問題的話麻煩回報一下, 我明天在 build script 裡面多加一段自動產生 UTF-8 版的 .qm 檔。
啊, 我發現 1. 是錯的, 因為 QTranslator 會把 -
全部取代成 _
再來比較。Try Qelly_zh_TW.UTF_8.qm
.
我大概知道問題了,這是因為 LANGUAGE 環境變數被錯誤的設定成 zh_TW.UTF_8 導致的。這不是 Qelly 的問題也不是 Fedora 的問題,而是 LilyTerm 的問題。
LilyTerm 啟動讀取設定檔 ~/.config/lilyterm/default.conf
的時候,讀到了 default_locale = zh_TW.UTF-8
這行,就把 LANG
、LANGUAGE
、LC_ALL
都設定成了 zh_TW.UTF-8
。相關的原始碼在這裡 https://github.com/Tetralet/LilyTerm/blob/v0.9.9.4/src/notebook.c#L122
改用其他終端機模擬器,像是 gnome-terminal 或是 xfce-terminal,或是直接從 gnome-shell 啟動 Qelly 都可以正常顯示中文。(當然 LilyTerm 的話就只能 unset LANGUAGE 了,看來這個 bug 應該是要回報到 LilyTerm 去的......)
順便備忘一下, 我發現 OS X 的中文繁體是叫 zh-Hant (或許 FreeBSD 也是, 不過應該不會有人無聊到在那上面用 GUI telnet client),所以還要加一個 Qelly_zh_hant.qm。這東西實在是太搞人了啊啊啊啊啊啊啊啊。
不過我發現其實 soft link 就可以了, 不用自我複製, 所以其實應該是還好。大不了我改成從一個 translations
subdirectory 讀, 裡面隨便 link 幾十個也沒差…
既然知道要產生哪些檔案, 剩下的就簡單了。
FreeBSD 的中文 locale 是 zh_TW.UTF-8(而不是 zh_TW.utf8),我有嘗試在 FreeBSD 編譯 Qelly,會因為 FreeBSD 下的 lrelease 名字叫做 lrelease-qt4 而失敗,需要手動調整 src/translations.pri。中文是正常的,不過因為 Qt 沒有為 FreeBSD 寫對應的 QCoreApplication::applicationFilePath(),會 fallback 成用 argv[0] 猜路徑,如果要完整支援 FreeBSD 可能要用 sysctl() 特別為 FreeBSD 寫一份能真正知道可執行檔所在位置的 code。
不過說起來如果不亂改 argv[0] 應該都還是找的到。
我想到了一個更好的方法, 直接把翻譯丟到 resource system, 用 aliasing 來處理名稱問題。這個版本應該可以解決這篇所有的問題。zh-Hant
嚴格講起來和 zh_TW
不一樣 (香港人表示:), 所以我還是決定分開來翻譯。目前兩個內容是一模一樣就是了。
目前翻譯檔是在 Qelly 本身所在目錄下搜尋。這在 Windows 上合理, 可是在 Linux 和 OS X 上就很奇怪。OS X 應該是放在 app bundle 的 resources,不知道 Linux 都放在哪裡? 可能要寫一個 wrapper function 根據平台來改搜尋路徑