第一:
爲svenfuchs寫道:I18n
是提供模塊許多翻譯和國際化的方法框架。
'gettext'只是衆多模塊中的一個。
所以真的沒有問題可以使用I18n
。
Rails應用程序的默認設置是使用I18n
與YAML後端,我理解你的問題的一部分,以比較與其他的後端。
恕我直言有是gettext
和YAML
基礎的方法之間有兩個主要區別:
gettext的
gettext
的一個想法是,翻譯應用程序不是一個單一的事件,而是一個生命週期過程。
它支持這個生命週期。
gettext
旨在使用純英文作爲翻譯的關鍵。所以這個想法是用英文編寫應用程序,並且標記所有要翻譯的文本,通常是用_()
包裝它。
因此,應用程序源代碼易於用英語閱讀。
然後,程序掃描所有源代碼並提取待翻譯的文本,並構建這些文本的存儲庫(.pot
文件)。
在接下來的步驟,和來這裏的現場循環,該倉庫是合併與現有的翻譯(的.po文件,每一個目標語言)和新的或變更的項目標記。
成熟的編輯通過關注新的和已更改的項目來支持譯員。此外,項目特定的字典可以支持部分自動翻譯。
gettext
是flat,這意味着每個關鍵短語在翻譯文件中只翻譯一次。沒有層次結構。但有上下文。在翻譯文件中,列出了關鍵短語的所有源代碼位置。可以訪問源代碼的編輯器可以顯示源代碼以及翻譯(還有一些)。
最後,.po
文件被翻譯成機器可讀的快速訪問形式(可的.mo,經典的標準,或數據庫或JSON或......)
YAML
YAML的一個另一方面是分層的,所以很容易在不同的上下文中有不同的翻譯。
I18n使用此結構來支持scopes
,並使用當前文件路徑作爲使用以點開頭的鍵的範圍。
沒有任何信息,在項目中使用密鑰的地方(除非自動作用域,但密鑰可以在其他地方明確使用)。
沒有信息,是否有任何更改。
除非您的IDE支持您,否則開發人員必須找到放置YAML密鑰的正確位置,並且搜索用法可能非常麻煩。 在其他答案中說了很多。
的I18n
我故意說:YAML而不是的I18n,因爲的I18n是國際化的一個框架(不僅是翻譯),和YAML只是一種可能的後端。
I18n中的複數支持與vanilla gettext的複數支持不同。我沒有經驗他們如何合作。
實例
gettext的與位置參數:
sprintf(
_('Do you really want to delete tour %1$s_%2$s? Only empty tours can be deleted!'),
tag, idx)
翻譯是文本文件,但PO-編輯提供的GUI:
#: js/addDelRow.js:15
msgid "" "Do you really want to delete tour %1$s_%2$s? Only empty tours can be deleted!"
msgstr "" "Wollen sie die Spalte %1$s_%2$s wirklich löschen? Nur leere Spalten können "
"gelöscht werden."
YAML與參數:
來源
<%= t('.checked_at', ts: l(checked_at), user: full_name) %>
翻譯
從
en:
hotels:
form:
checked_at: „set to checked by %{user} on %{ts}「
到
de:
hotels:
form:
checked_at: "geprüft gesetzt am %{ts} von %{user}「
結論
YAML更容易入門,特別是如果您有IDE支持。
Vanilla RAILS有它內置。
是沒有原生語言。第一個翻譯可以是任何語言。 隨着項目和多種語言的不斷髮展,我的YAML文件傾向於重複(分散在整個層次結構中的相同翻譯)以及跟蹤更改,因此新的翻譯非常麻煩。
gettext需要一個額外的工具鏈,因此一個更困難的設置。
它支持開發應用程序的連續翻譯的整個生命週期。
它基於英文源代碼。
我通常使用兩者的最佳部分,使用YAML進行國際化(數字和日期格式,可能是模型名稱?)和gettext進行翻譯。
你們真是太棒了,在這裏停下來回答。非常感謝。:-) –
這是維基材料斯文:) – oliverbarnes
@svenfuchs,計劃爲我所有的Rails應用程序實現你的寶石。您的視頻添加了缺失的部分。現在我們要使用po文件,因爲它將是在每個網站上使用多個人進行協作的最簡單方式。關於視頻和這篇文章的絕佳信息。 –