uranusjr / Qelly

Beautiful cross-platform BBS client.
61 stars 14 forks source link

改善 OS X 與 Linux 上的翻譯檔 lookup path #57

Closed uranusjr closed 11 years ago

uranusjr commented 11 years ago

目前翻譯檔是在 Qelly 本身所在目錄下搜尋。這在 Windows 上合理, 可是在 Linux 和 OS X 上就很奇怪。OS X 應該是放在 app bundle 的 resources,不知道 Linux 都放在哪裡? 可能要寫一個 wrapper function 根據平台來改搜尋路徑

#if defined Q_OS_LINUX
    // Handle Linux
#elif defined Q_OS_MAC
    // Handle OS X
#else
    // Default behavior (Windows goes here), search under application directory
#endif
lantw44 commented 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"
uranusjr commented 11 years ago

這樣測會比較快

#include <QDebug>
// … 中略
qDebug() << QLocale::system().uiLanguages();

因為 QTranslator::load 是看這個值。QLocale::name 是視你使用的度量衡和時間格式而定, 那個不準 (以 Linux 來講就是 LANGLC_ 開頭環境變數的差別)。

lantw44 commented 11 years ago

出現 ("zh_TW.UTF-8") ,不論是 LANG / LC_ALL 是設定成 zh_TW.UTF-8 還是 zh_TW.utf8,即使我改 zh_TW.big5 也是一樣。

uranusjr commented 11 years ago

我想我知道問題了。根據源碼, zhTW.UTF-8 的比對是 (Filename = "Qelly", prefix = "", suffix 預設 ".qm", case insensitive)

  1. Qelly_zh_TW.UTF-8.qm
  2. Qelly_zh.qm
  3. Qelly_zh
  4. Qelly.qm
  5. Qelly_
  6. Qelly

當然找不到。Arch 的 locale 應該 (和 Windows/OS X 一樣) 是 zh_TW 所以沒問題。

根據這個搜尋規則, 最佳解應該是直接加一個翻譯檔 orz。我想 1. 應該是最合理的, 如果確實沒問題的話麻煩回報一下, 我明天在 build script 裡面多加一段自動產生 UTF-8 版的 .qm 檔。

lantw44 commented 11 years ago
  1. 似乎沒有效果,但是 2. 就可以變中文了。
uranusjr commented 11 years ago

啊, 我發現 1. 是錯的, 因為 QTranslator 會把 - 全部取代成 _ 再來比較。Try Qelly_zh_TW.UTF_8.qm.

lantw44 commented 11 years ago

我大概知道問題了,這是因為 LANGUAGE 環境變數被錯誤的設定成 zh_TW.UTF_8 導致的。這不是 Qelly 的問題也不是 Fedora 的問題,而是 LilyTerm 的問題。

LilyTerm 啟動讀取設定檔 ~/.config/lilyterm/default.conf 的時候,讀到了 default_locale = zh_TW.UTF-8 這行,就把 LANGLANGUAGELC_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 去的......)

uranusjr commented 11 years ago

順便備忘一下, 我發現 OS X 的中文繁體是叫 zh-Hant (或許 FreeBSD 也是, 不過應該不會有人無聊到在那上面用 GUI telnet client),所以還要加一個 Qelly_zh_hant.qm。這東西實在是太搞人了啊啊啊啊啊啊啊啊。

不過我發現其實 soft link 就可以了, 不用自我複製, 所以其實應該是還好。大不了我改成從一個 translations subdirectory 讀, 裡面隨便 link 幾十個也沒差…

既然知道要產生哪些檔案, 剩下的就簡單了。

lantw44 commented 11 years ago

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] 應該都還是找的到。

uranusjr commented 11 years ago

我想到了一個更好的方法, 直接把翻譯丟到 resource system, 用 aliasing 來處理名稱問題。這個版本應該可以解決這篇所有的問題。zh-Hant 嚴格講起來和 zh_TW 不一樣 (香港人表示:), 所以我還是決定分開來翻譯。目前兩個內容是一模一樣就是了。