2012-09-21 53 views
1

我有一個使用國際化的網站登錄串PHP的內置的Gettext/PO支持針對PHP的gettext沒有發現任何翻譯

echo _("string to be translated");

該網站處於測試之中,當然也有一些字符串那不會被翻譯。爲了幫助調試,有沒有辦法記錄gettext錯誤,即PO在PO文件中沒有找到任何匹配條目的日誌字符串?

+1

您應該*自動*使用適當的工具將所有i18n'ed字符串提取到.po文件中,然後使用本地化工具(如POedit)查看這些文件。這將顯示哪些字符串仍然需要翻譯,並且所有字符串應該位於文件中,因爲提取已經自動化。 – deceze

+0

因此無法記錄gettext錯誤?隨着代碼庫的不斷變化,錯誤可能會隨着時間而出現 – David

+0

據我所知(但我不是gettext的專家)。在gettext中找不到任何本地化特別不被視爲錯誤。我也不會考慮使用日誌查找非翻譯字符串的好方法,因爲這意味着您必須運行翻譯發生的所有代碼路徑才能找到未翻譯的字符串。與提供良好的提取工作流程相比,這樣做更容易管理。 – deceze

回答

7

你想要做什麼的問題是,你只能在運行時發現未轉換的字符串,並且只能爲實際執行的代碼路徑。您可能需要幾年才能找到所有字符串,同時您必須定期查看您的日誌文件,並將更新後的翻譯與日誌文件中發生的事情同步。這不是一種確定性的翻譯方法。

如果您使用的是gettext,則需要建立適合它的工作流程。 gettext工作流程和工具鏈經過深思熟慮和時間考驗。

  1. 通過在gettext函數中包裝字符串來準備源代碼。
  2. 將準備好的字符串提取到POT文件中,通常爲using xgettext,但可能使用自定義分析器/提取器和類似Kunststube\POTools(無恥自我推銷)的庫。
  3. 從提取的模板文件using msginit中創建PO文件。
  4. 翻譯PO文件。
  5. 保持更新源/ POT文件與PO文件using msgmerge同步。
  6. 將PO文件編譯爲MO文件using msgfmt
  7. 沖洗,重複。

這是適當的gettext工作流程,簡而言之,它解釋了翻譯過程中的大多數問題。特別是如果你有分佈式翻譯器,你通常會在源代碼更新和翻譯之間產生時間延遲和重疊。如果沒有自動字符串抽取和實用工具,這個過程很容易陷入混亂,這就是爲什麼你應該堅持以上步驟。

如果你這樣做,你的問題變得無關緊要,因爲你可以使用gettext實用工具或工具一樣Poedit,看看哪些字符串翻譯隨時檢查您的PO文件。

0

可能更重要的是,您的測試版本將使用像podebug這樣的工具來執行一些僞本地化。因此,一旦您提取了PO字符串,您可以對其進行本地化,以便您可以查看是否在UI中提取了所有字符串。